OpenCBDC Transaction Processor
Loading...
Searching...
No Matches
util/rpc/client.hpp
Go to the documentation of this file.
1// Copyright (c) 2021 MIT Digital Currency Initiative,
2// Federal Reserve Bank of Boston
3// Distributed under the MIT software license, see the accompanying
4// file COPYING or http://www.opensource.org/licenses/mit-license.php.
5
6#ifndef OPENCBDC_TX_SRC_RPC_CLIENT_H_
7#define OPENCBDC_TX_SRC_RPC_CLIENT_H_
8
9#include "format.hpp"
10#include "messages.hpp"
12
13#include <atomic>
14#include <cassert>
15#include <chrono>
16#include <functional>
17#include <optional>
18
19namespace cbdc::rpc {
25 template<typename Request, typename Response>
26 class client {
27 public:
28 client() = default;
29 client(client&&) noexcept = default;
30 auto operator=(client&&) noexcept -> client& = default;
31 client(const client&) = delete;
32 auto operator=(const client&) -> client& = delete;
33
34 virtual ~client() = default;
35
36 using request_type = request<Request>;
37 using response_type = response<Response>;
38
42 = std::function<void(std::optional<Response>)>;
43
53 [[nodiscard]] auto call(Request request_payload,
54 std::chrono::milliseconds timeout
55 = std::chrono::milliseconds::zero())
56 -> std::optional<Response> {
57 auto [request_buf, request_id]
58 = make_request(std::move(request_payload));
59 auto resp = call_raw(std::move(request_buf), request_id, timeout);
60 if(!resp.has_value()) {
61 return std::nullopt;
62 }
63 assert(resp.value().m_header.m_request_id == request_id);
64 return resp.value().m_payload;
65 }
66
74 auto call(Request request_payload,
75 response_callback_type response_callback) -> bool {
76 auto [request_buf, request_id]
77 = make_request(std::move(request_payload));
78 auto ret = call_raw(std::move(request_buf),
79 request_id,
80 [resp_cb = std::move(response_callback)](
81 std::optional<response_type> resp) {
82 if(!resp.has_value()) {
83 return;
84 }
85 resp_cb(std::move(resp.value().m_payload));
86 });
87 return ret;
88 }
89
90 protected:
94 auto deserialize_response(cbdc::buffer& response_buf)
95 -> std::optional<response_type> {
96 return from_buffer<response_type>(response_buf);
97 }
98
101 = std::function<void(std::optional<response_type>)>;
102
103 private:
104 std::atomic<uint64_t> m_current_request_id{};
105
115 virtual auto call_raw(cbdc::buffer request_buf,
116 request_id_type request_id,
117 std::chrono::milliseconds timeout)
118 -> std::optional<response_type> = 0;
119
120 virtual auto call_raw(cbdc::buffer request_buf,
121 request_id_type request_id,
122 raw_callback_type response_callback) -> bool
123 = 0;
124
125 auto make_request(Request request_payload)
126 -> std::pair<cbdc::buffer, request_id_type> {
127 auto request_id = m_current_request_id++;
128 auto req = request_type{{request_id}, std::move(request_payload)};
129 return {make_buffer(req), request_id};
130 }
131 };
132}
133
134#endif
Buffer to store and retrieve byte data.
Definition buffer.hpp:15
Generic RPC client.
std::function< void(std::optional< Response >)> response_callback_type
User-provided response callback function type for asynchronous requests.
client(client &&) noexcept=default
auto call(Request request_payload, std::chrono::milliseconds timeout=std::chrono::milliseconds::zero()) -> std::optional< Response >
Issues the given request with an optional timeout, then waits for and returns the response.
auto deserialize_response(cbdc::buffer &response_buf) -> std::optional< response_type >
Deserializes a response object from the given buffer.
std::function< void(std::optional< response_type >)> raw_callback_type
Response callback function type for handling an RPC response.
request< Request > request_type
uint64_t request_id_type
Definition header.hpp:12
auto from_buffer(nuraft::buffer &buf) -> std::optional< T >
Deserialize object of given type from a nuraft::buffer.
auto make_buffer(const T &obj) -> std::enable_if_t< std::is_same_v< B, nuraft::ptr< nuraft::buffer > >, nuraft::ptr< nuraft::buffer > >
Serialize object into nuraft::buffer using a cbdc::nuraft_serializer.
RPC request message.
RPC response message.