JSON-RPC 2.0
JSON-RPC 2.0 Modern C++ Library
Loading...
Searching...
No Matches
pipe_transport.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <array>
4#include <atomic>
5#include <deque>
6#include <expected>
7#include <string>
8
9#include <asio.hpp>
10#include <asio/local/stream_protocol.hpp>
11
14
15namespace jsonrpc::transport {
16
17class PipeTransport : public Transport {
18 public:
19 explicit PipeTransport(
20 asio::any_io_executor executor, std::string socket_path,
21 bool is_server = false, std::shared_ptr<spdlog::logger> logger = nullptr);
22
23 ~PipeTransport() override;
24
25 PipeTransport(const PipeTransport&) = delete;
26 auto operator=(const PipeTransport&) -> PipeTransport& = delete;
27
30
31 auto Start()
32 -> asio::awaitable<std::expected<void, error::RpcError>> override;
33
34 auto Close()
35 -> asio::awaitable<std::expected<void, error::RpcError>> override;
36
37 void CloseNow() override;
38
39 auto SendMessage(std::string message)
40 -> asio::awaitable<std::expected<void, error::RpcError>> override;
41
42 auto Flush() -> asio::awaitable<std::expected<void, error::RpcError>>;
43
44 auto ReceiveMessage()
45 -> asio::awaitable<std::expected<std::string, error::RpcError>> override;
46
47 protected:
48 auto GetSocket() -> asio::local::stream_protocol::socket&;
49
50 auto RemoveExistingSocketFile() -> std::expected<void, error::RpcError>;
51
52 auto Connect() -> asio::awaitable<std::expected<void, error::RpcError>>;
53
54 auto BindAndListen() -> asio::awaitable<std::expected<void, error::RpcError>>;
55
56 private:
57 // Sends messages from the queue in sequence
58 auto SendMessageLoop() -> asio::awaitable<void>;
59
60 asio::local::stream_protocol::socket socket_;
61 std::unique_ptr<asio::local::stream_protocol::acceptor> acceptor_;
62 std::string socket_path_;
63 bool is_server_;
64 std::atomic<bool> is_closed_{false};
65 std::atomic<bool> is_started_{false};
66 std::atomic<bool> is_connected_{false};
67
68 // Message sending queue and state
69 std::deque<std::string> send_queue_;
70 std::atomic<bool> sending_{false};
71
72 // Buffer for reading data
73 std::array<char, 1024> read_buffer_;
74 std::string message_buffer_;
75};
76
77} // namespace jsonrpc::transport
auto Start() -> asio::awaitable< std::expected< void, error::RpcError > > override
auto RemoveExistingSocketFile() -> std::expected< void, error::RpcError >
PipeTransport(asio::any_io_executor executor, std::string socket_path, bool is_server=false, std::shared_ptr< spdlog::logger > logger=nullptr)
PipeTransport(PipeTransport &&)=delete
auto Connect() -> asio::awaitable< std::expected< void, error::RpcError > >
auto BindAndListen() -> asio::awaitable< std::expected< void, error::RpcError > >
auto GetSocket() -> asio::local::stream_protocol::socket &
auto Close() -> asio::awaitable< std::expected< void, error::RpcError > > override
auto operator=(PipeTransport &&) -> PipeTransport &=delete
auto operator=(const PipeTransport &) -> PipeTransport &=delete
auto SendMessage(std::string message) -> asio::awaitable< std::expected< void, error::RpcError > > override
auto Flush() -> asio::awaitable< std::expected< void, error::RpcError > >
PipeTransport(const PipeTransport &)=delete
auto ReceiveMessage() -> asio::awaitable< std::expected< std::string, error::RpcError > > override