29 asio::any_io_executor executor,
30 std::unique_ptr<transport::Transport> transport,
31 std::shared_ptr<spdlog::logger> logger =
nullptr);
34 asio::any_io_executor executor,
35 std::unique_ptr<transport::Transport> transport)
36 -> asio::awaitable<std::expected<std::unique_ptr<RpcEndpoint>,
RpcError>>;
45 auto Start() -> asio::awaitable<std::expected<void, RpcError>>;
47 auto WaitForShutdown() -> asio::awaitable<std::expected<void, RpcError>>;
49 auto Shutdown() -> asio::awaitable<std::expected<void, RpcError>>;
52 return is_running_.load();
55 auto Logger() -> std::shared_ptr<spdlog::logger> {
60 std::string method, std::optional<nlohmann::json> params = std::nullopt)
61 -> asio::awaitable<std::expected<nlohmann::json, RpcError>>;
63 template <
typename ParamsType,
typename ResultType>
65 -> asio::awaitable<std::expected<ResultType, RpcError>>
70 std::string method, std::optional<nlohmann::json> params = std::nullopt)
71 -> asio::awaitable<std::expected<void, RpcError>>;
73 template <
typename ParamsType>
75 -> asio::awaitable<std::expected<void, RpcError>>
81 template <
typename ParamsType,
typename ResultType>
84 std::function<asio::awaitable<ResultType>(ParamsType)> handler)
87 template <
typename ParamsType,
typename ResultType,
typename ErrorType>
91 asio::awaitable<std::expected<ResultType, ErrorType>>(ParamsType)>
98 template <
typename ParamsType,
typename ErrorType>
101 std::function<asio::awaitable<std::expected<void, ErrorType>>(ParamsType)>
108 void StartMessageProcessing();
110 auto ProcessMessagesLoop(asio::cancellation_slot slot)
111 -> asio::awaitable<
void>;
113 auto HandleMessage(std::
string message)
114 -> asio::awaitable<std::expected<
void,
RpcError>>;
116 auto HandleResponse(
Response response)
117 -> asio::awaitable<std::expected<
void,
RpcError>>;
119 auto GetNextRequestId() -> int64_t {
120 return next_request_id_++;
123 std::shared_ptr<spdlog::logger> logger_;
125 asio::any_io_executor executor_;
127 std::unique_ptr<transport::Transport> transport_;
129 Dispatcher dispatcher_;
131 std::unordered_map<int64_t, std::shared_ptr<PendingRequest>>
134 std::atomic<bool> is_running_{
false};
136 asio::strand<asio::any_io_executor> endpoint_strand_;
138 std::atomic<int64_t> next_request_id_{0};
140 asio::cancellation_signal cancel_signal_;
142 asio::awaitable<void> message_loop_;
147 -> asio::awaitable<std::expected<ResultType, RpcError>>
151 spdlog::debug(
"RpcEndpoint sending typed method call: {}", method);
152 nlohmann::json json_params;
154 json_params = params;
155 }
catch (
const nlohmann::json::exception &ex) {
157 "RpcEndpoint failed to convert parameters to JSON: {}", ex.what());
159 RpcErrorCode::kClientSerializationError,
160 "RpcEndpoint failed to convert parameters to JSON: " +
161 std::string(ex.what()));
170 co_return result->template get<ResultType>();
171 }
catch (
const nlohmann::json::exception &ex) {
172 spdlog::error(
"RpcEndpoint failed to convert result: {}", ex.what());
174 RpcErrorCode::kClientDeserializationError,
175 "RpcEndpoint failed to convert result: " + std::string(ex.what()));
181 -> asio::awaitable<std::expected<void, RpcError>>
184 spdlog::debug(
"RpcEndpoint sending typed notification: {}", method);
185 nlohmann::json json_params;
187 json_params = params;
188 }
catch (
const nlohmann::json::exception &ex) {
190 "RpcEndpoint failed to convert notification parameters: {}", ex.what());
192 RpcErrorCode::kClientSerializationError,
193 "RpcEndpoint failed to convert notification parameters: " +
194 std::string(ex.what()));