mirror of https://github.com/oxen-io/lokinet
WIP: LokidRpcClient
parent
11951510bf
commit
91725a8530
@ -0,0 +1,113 @@
|
||||
#include <rpc/lokid_rpc_client.hpp>
|
||||
|
||||
#include <util/logging/logger.h>
|
||||
#include <util/logging/logger.hpp>
|
||||
|
||||
#include <future>
|
||||
|
||||
namespace llarp
|
||||
{
|
||||
namespace rpc
|
||||
{
|
||||
static ::LogLevel
|
||||
fromLokiMQLogLevel(lokimq::LogLevel level)
|
||||
{
|
||||
switch (level)
|
||||
{
|
||||
case lokimq::LogLevel::fatal:
|
||||
case lokimq::LogLevel::error:
|
||||
return eLogError;
|
||||
case lokimq::LogLevel::warn:
|
||||
return eLogWarn;
|
||||
case lokimq::LogLevel::info:
|
||||
return eLogInfo;
|
||||
case lokimq::LogLevel::debug:
|
||||
case lokimq::LogLevel::trace:
|
||||
return eLogDebug;
|
||||
default:
|
||||
return eLogNone;
|
||||
}
|
||||
}
|
||||
|
||||
static lokimq::LogLevel
|
||||
toLokiMQLogLevel(::LogLevel level)
|
||||
{
|
||||
switch (level)
|
||||
{
|
||||
case eLogError:
|
||||
return lokimq::LogLevel::error;
|
||||
case eLogWarn:
|
||||
return lokimq::LogLevel::warn;
|
||||
case eLogInfo:
|
||||
return lokimq::LogLevel::info;
|
||||
case eLogDebug:
|
||||
return lokimq::LogLevel::debug;
|
||||
case eLogNone:
|
||||
default:
|
||||
return lokimq::LogLevel::trace;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
lokimqLogger(lokimq::LogLevel level, const char* file, std::string msg)
|
||||
{
|
||||
switch (level)
|
||||
{
|
||||
case lokimq::LogLevel::fatal:
|
||||
case lokimq::LogLevel::error:
|
||||
LogError(msg);
|
||||
break;
|
||||
case lokimq::LogLevel::warn:
|
||||
LogWarn(msg);
|
||||
break;
|
||||
case lokimq::LogLevel::info:
|
||||
LogInfo(msg);
|
||||
break;
|
||||
case lokimq::LogLevel::debug:
|
||||
case lokimq::LogLevel::trace:
|
||||
LogDebug(msg);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
LokidRpcClient::LokidRpcClient(std::string lokidPubkey)
|
||||
: m_lokiMQ(lokimqLogger, lokimq::LogLevel::debug), m_lokidPubkey(std::move(lokidPubkey))
|
||||
{
|
||||
m_lokiMQ.log_level(toLokiMQLogLevel(LogLevel::Instance().curLevel));
|
||||
}
|
||||
|
||||
void
|
||||
LokidRpcClient::connect()
|
||||
{
|
||||
m_lokidConnectionId = m_lokiMQ.connect_sn(m_lokidPubkey); // not a blocking call
|
||||
}
|
||||
|
||||
std::future<void>
|
||||
LokidRpcClient::ping()
|
||||
{
|
||||
throw std::runtime_error("TODO: LokidRpcClient::ping()");
|
||||
}
|
||||
|
||||
std::future<std::string>
|
||||
LokidRpcClient::requestNextBlockHash()
|
||||
{
|
||||
throw std::runtime_error("TODO: LokidRpcClient::requestNextBlockHash()");
|
||||
}
|
||||
|
||||
std::future<std::vector<RouterID>>
|
||||
LokidRpcClient::requestServiceNodeList()
|
||||
{
|
||||
throw std::runtime_error("TODO: LokidRpcClient::requestServiceNodeList()");
|
||||
}
|
||||
|
||||
void
|
||||
LokidRpcClient::request()
|
||||
{
|
||||
// TODO: ensure we are connected
|
||||
// m_lokiMQ.request(m_lokidConnectionId, ...);
|
||||
|
||||
throw std::runtime_error("TODO: LokidRpcClient::request()");
|
||||
}
|
||||
|
||||
} // namespace rpc
|
||||
} // namespace llarp
|
@ -0,0 +1,62 @@
|
||||
#pragma once
|
||||
|
||||
#include <router_id.hpp>
|
||||
|
||||
#include <lokimq/lokimq.h>
|
||||
|
||||
#include <future>
|
||||
|
||||
namespace llarp
|
||||
{
|
||||
namespace rpc
|
||||
{
|
||||
/// The LokidRpcClient uses loki-mq to talk to make API requests to lokid.
|
||||
struct LokidRpcClient
|
||||
{
|
||||
/// Not copyable or movable (because lokimq::LokiMQ is not copyable or movable).
|
||||
/// Consider wrapping in a std::unique_ptr or std::shared_ptr if you need to pass this around.
|
||||
LokidRpcClient(const LokidRpcClient&) = delete;
|
||||
LokidRpcClient&
|
||||
operator=(const LokidRpcClient&) = delete;
|
||||
LokidRpcClient(LokidRpcClient&&) = delete;
|
||||
LokidRpcClient&
|
||||
operator=(LokidRpcClient&&) = delete;
|
||||
|
||||
/// Constructor
|
||||
/// TODO: take lokid pubkey and other auth parameters
|
||||
LokidRpcClient(std::string lokidPubkey);
|
||||
|
||||
/// Connect to lokid
|
||||
void
|
||||
connect();
|
||||
|
||||
/// Initiates a ping request to lokid, currently used to let lokid know that lokinet is still
|
||||
/// running (required to prevent a Service Node from being deregistered).
|
||||
///
|
||||
/// This uses the "lokinet_ping" API endpoint.
|
||||
std::future<void>
|
||||
ping();
|
||||
|
||||
/// Requests the most recent known block hash from lokid
|
||||
///
|
||||
/// This uses the "poll_block_hash" API endpoint.
|
||||
std::future<std::string>
|
||||
requestNextBlockHash();
|
||||
|
||||
/// Requests a full list of known service nodes from lokid
|
||||
///
|
||||
/// This uses the "get_n_service_nodes" API endpoint.
|
||||
std::future<std::vector<RouterID>>
|
||||
requestServiceNodeList();
|
||||
|
||||
private:
|
||||
std::string m_lokidPubkey;
|
||||
lokimq::ConnectionID m_lokidConnectionId;
|
||||
lokimq::LokiMQ m_lokiMQ;
|
||||
|
||||
void
|
||||
request();
|
||||
};
|
||||
|
||||
} // namespace rpc
|
||||
} // namespace llarp
|
Loading…
Reference in New Issue