JSON-RPC 2.0
JSON-RPC 2.0 Modern C++ Library
Loading...
Searching...
No Matches
jsonrpc::transport::FramedPipeTransport Class Reference

#include <framed_pipe_transport.hpp>

Inheritance diagram for jsonrpc::transport::FramedPipeTransport:
Collaboration diagram for jsonrpc::transport::FramedPipeTransport:

Public Member Functions

 FramedPipeTransport (asio::any_io_executor executor, const std::string &socket_path, bool is_server, std::shared_ptr< spdlog::logger > logger=nullptr)
 
auto SendMessage (std::string message) -> asio::awaitable< std::expected< void, error::RpcError > > override
 
auto ReceiveMessage () -> asio::awaitable< std::expected< std::string, error::RpcError > > override
 
- Public Member Functions inherited from jsonrpc::transport::PipeTransport
 PipeTransport (asio::any_io_executor executor, std::string socket_path, bool is_server=false, std::shared_ptr< spdlog::logger > logger=nullptr)
 
 ~PipeTransport () override
 
 PipeTransport (const PipeTransport &)=delete
 
auto operator= (const PipeTransport &) -> PipeTransport &=delete
 
 PipeTransport (PipeTransport &&)=delete
 
auto operator= (PipeTransport &&) -> PipeTransport &=delete
 
auto Start () -> asio::awaitable< std::expected< void, error::RpcError > > override
 
auto Close () -> asio::awaitable< std::expected< void, error::RpcError > > override
 
void CloseNow () override
 
auto SendMessage (std::string message) -> asio::awaitable< std::expected< void, error::RpcError > > override
 
auto Flush () -> asio::awaitable< std::expected< void, error::RpcError > >
 
auto ReceiveMessage () -> asio::awaitable< std::expected< std::string, error::RpcError > > override
 
- Public Member Functions inherited from jsonrpc::transport::Transport
 Transport (asio::any_io_executor executor, std::shared_ptr< spdlog::logger > logger=nullptr)
 
 Transport (const Transport &)=delete
 
 Transport (Transport &&)=delete
 
auto operator= (const Transport &) -> Transport &=delete
 
auto operator= (Transport &&) -> Transport &=delete
 
virtual ~Transport ()=default
 
auto GetExecutor () const -> asio::any_io_executor
 
auto GetStrand () -> asio::strand< asio::any_io_executor > &
 

Additional Inherited Members

- Protected Member Functions inherited from jsonrpc::transport::PipeTransport
auto GetSocket () -> asio::local::stream_protocol::socket &
 
auto RemoveExistingSocketFile () -> std::expected< void, error::RpcError >
 
auto Connect () -> asio::awaitable< std::expected< void, error::RpcError > >
 
auto BindAndListen () -> asio::awaitable< std::expected< void, error::RpcError > >
 
- Protected Member Functions inherited from jsonrpc::transport::Transport
auto Logger () -> std::shared_ptr< spdlog::logger >
 

Detailed Description

Definition at line 12 of file framed_pipe_transport.hpp.

Constructor & Destructor Documentation

◆ FramedPipeTransport()

jsonrpc::transport::FramedPipeTransport::FramedPipeTransport ( asio::any_io_executor executor,
const std::string & socket_path,
bool is_server,
std::shared_ptr< spdlog::logger > logger = nullptr )

Definition at line 10 of file framed_pipe_transport.cpp.

13 : PipeTransport(std::move(executor), socket_path, is_server, logger) {
14}
PipeTransport(asio::any_io_executor executor, std::string socket_path, bool is_server=false, std::shared_ptr< spdlog::logger > logger=nullptr)

Member Function Documentation

◆ ReceiveMessage()

auto jsonrpc::transport::FramedPipeTransport::ReceiveMessage ( ) -> asio::awaitable<std::expected<std::string, error::RpcError>>
overridevirtual

Implements jsonrpc::transport::Transport.

Definition at line 22 of file framed_pipe_transport.cpp.

23 {
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}
static auto UnexpectedFromCode(RpcErrorCode code, std::string message="") -> std::unexpected< RpcError >
Definition error.hpp:101
auto TryDeframe(const std::string &buffer) -> DeframeResult
auto ReceiveMessage() -> asio::awaitable< std::expected< std::string, error::RpcError > > override
auto Logger() -> std::shared_ptr< spdlog::logger >
Definition transport.hpp:54

References jsonrpc::transport::PipeTransport::ReceiveMessage(), and jsonrpc::error::RpcError::UnexpectedFromCode().

Here is the call graph for this function:

◆ SendMessage()

auto jsonrpc::transport::FramedPipeTransport::SendMessage ( std::string message) -> asio::awaitable<std::expected<void, error::RpcError>>
overridevirtual

Implements jsonrpc::transport::Transport.

Definition at line 16 of file framed_pipe_transport.cpp.

17 {
18 auto framed_message = MessageFramer::Frame(message);
19 co_return co_await PipeTransport::SendMessage(std::move(framed_message));
20}
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

References jsonrpc::transport::MessageFramer::Frame(), and jsonrpc::transport::PipeTransport::SendMessage().

Here is the call graph for this function:

The documentation for this class was generated from the following files: