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