#pragma once #include #include #include #include #include namespace llarp { struct AbstractRouter; namespace rpc { using LMQ_ptr = std::shared_ptr; /// The LokidRpcClient uses loki-mq to talk to make API requests to lokid. struct LokidRpcClient : public std::enable_shared_from_this { explicit LokidRpcClient(LMQ_ptr lmq, AbstractRouter* r); /// Connect to lokid async void ConnectAsync(lokimq::address url); /// blocking request identity key from lokid /// throws on failure SecretKey ObtainIdentityKey(); private: /// called when we have connected to lokid via lokimq void Connected(); /// do a lmq command on the current connection void Command(std::string_view cmd); void UpdateServiceNodeList(); template void Request(std::string_view cmd, HandlerFunc_t func, const Args_t& args) { m_lokiMQ->request(*m_Connection, std::move(cmd), std::move(func), args); } template void Request(std::string_view cmd, HandlerFunc_t func) { m_lokiMQ->request(*m_Connection, std::move(cmd), std::move(func)); } void HandleGotServiceNodeList(std::string json); std::optional m_Connection; LMQ_ptr m_lokiMQ; std::string m_CurrentBlockHash; AbstractRouter* const m_Router; }; } // namespace rpc } // namespace llarp