JSON-RPC 2.0
JSON-RPC 2.0 Modern C++ Library
Loading...
Searching...
No Matches
framed_pipe_transport.cpp
Go to the documentation of this file.
2
3#include <spdlog/spdlog.h>
4
5namespace jsonrpc::transport {
6
7using error::RpcError;
9
11 asio::any_io_executor executor, const std::string& socket_path,
12 bool is_server, std::shared_ptr<spdlog::logger> logger)
13 : PipeTransport(std::move(executor), socket_path, is_server, logger) {
14}
15
16auto FramedPipeTransport::SendMessage(std::string message)
17 -> asio::awaitable<std::expected<void, error::RpcError>> {
18 auto framed_message = MessageFramer::Frame(message);
19 co_return co_await PipeTransport::SendMessage(std::move(framed_message));
20}
21
23 -> asio::awaitable<std::expected<std::string, error::RpcError>> {
24 while (true) {
25 // Try to deframe from existing buffer
26 auto result = framer_.TryDeframe(read_buffer_);
27 if (result.complete) {
28 read_buffer_.erase(0, result.consumed_bytes);
29 co_return result.message;
30 }
31
32 if (!result.error.empty()) {
33 Logger()->error("Framing error: {}", result.error);
35 RpcErrorCode::kTransportError, "Framing error: " + result.error);
36 }
37
38 // Get more data using base class receive
39 auto chunk_result = co_await PipeTransport::ReceiveMessage();
40 if (!chunk_result) {
41 co_return chunk_result;
42 }
43
44 read_buffer_ += *chunk_result; // append new data
45 }
46}
47
48} // namespace jsonrpc::transport
static auto UnexpectedFromCode(RpcErrorCode code, std::string message="") -> std::unexpected< RpcError >
Definition error.hpp:101
auto ReceiveMessage() -> asio::awaitable< std::expected< std::string, error::RpcError > > override
auto SendMessage(std::string message) -> asio::awaitable< std::expected< void, error::RpcError > > override
FramedPipeTransport(asio::any_io_executor executor, const std::string &socket_path, bool is_server, std::shared_ptr< spdlog::logger > logger=nullptr)
static auto Frame(const std::string &message, const std::string &content_type="application/vscode-jsonrpc; charset=utf-8") -> std::string
auto SendMessage(std::string message) -> asio::awaitable< std::expected< void, error::RpcError > > override
auto ReceiveMessage() -> asio::awaitable< std::expected< std::string, error::RpcError > > override