OpenCBDC Transaction Processor
Loading...
Searching...
No Matches
async_server.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_ASYNC_SERVER_H_
7#define OPENCBDC_TX_SRC_RPC_ASYNC_SERVER_H_
8
9#include "server.hpp"
10
11namespace cbdc::rpc {
23 template<typename Request,
24 typename Response,
25 typename InBuffer = buffer,
26 typename OutBuffer = buffer>
28 : public server<Request, Response, InBuffer, OutBuffer> {
29 public:
30 async_server() = default;
31 async_server(async_server&&) noexcept = default;
32 auto operator=(async_server&&) noexcept -> async_server& = default;
33 async_server(const async_server&) = default;
34 auto operator=(const async_server&) -> async_server& = default;
35
36 ~async_server() override = default;
37
39
44 = std::function<void(std::optional<Response>)>;
45
51 using callback_type
52 = std::function<bool(Request, response_callback_type)>;
53
60 m_callback = std::move(callback);
61 }
62
63 protected:
76 auto async_call(InBuffer request_buf,
77 std::function<void(cbdc::buffer)> response_callback)
78 -> std::optional<OutBuffer> {
79 if constexpr(!raw_mode) {
80 auto req = server_type::deserialize_request(request_buf);
81 if(!req.has_value()) {
82 return std::nullopt;
83 }
84 auto success = m_callback(
85 std::move(req.value().m_payload),
86 [&,
87 resp_cb = std::move(response_callback),
88 hdr
89 = req.value().m_header](std::optional<Response> resp) {
90 auto resp_buf
91 = server_type::serialize_response(std::move(hdr),
92 std::move(resp));
93 resp_cb(std::move(resp_buf));
94 });
95 if(!success) {
96 return server_type::template serialize_response<Response>(
97 std::move(req.value().m_header),
98 std::nullopt);
99 }
100 } else {
101 auto maybe_failure
103 if(!maybe_failure.has_value()) {
104 return std::nullopt;
105 }
106 auto success
107 = m_callback(std::move(request_buf),
108 [&,
109 resp_cb = std::move(response_callback),
110 fail_buf = maybe_failure.value()](
111 std::optional<Response> resp) {
112 if(resp.has_value()) {
113 resp_cb(std::move(resp.value()));
114 } else {
115 resp_cb(std::move(fail_buf));
116 }
117 });
118 if(!success) {
119 return maybe_failure;
120 }
121 }
122 return std::nullopt;
123 }
124
125 private:
126 callback_type m_callback;
127
128 using server_type = server<Request, Response, InBuffer, OutBuffer>;
129
130 static constexpr auto raw_mode
131 = std::is_same_v<Request,
132 buffer> && std::is_same_v<Response, buffer>;
133 };
134
140}
141
142#endif
Buffer to store and retrieve byte data.
Definition buffer.hpp:15
Generic asynchronous RPC server.
static constexpr handler_type handler
std::function< bool(Request, response_callback_type)> callback_type
Request handler callback function.
auto async_call(InBuffer request_buf, std::function< void(cbdc::buffer)> response_callback) -> std::optional< OutBuffer >
Deserializes an RPC request, then calls the registered request handler function.
std::function< void(std::optional< Response >)> response_callback_type
Response callback function type.
void register_handler_callback(callback_type callback)
Register a request handler callback function for processing requests, generating responses,...
async_server(async_server &&) noexcept=default
Generic RPC server.
auto make_failure_response(cbdc::buffer &request_buf) -> std::optional< cbdc::buffer >
Serialize a failure response buffer from the given request buffer.
auto serialize_response(header request_header, std::optional< R > response_payload) -> buffer
auto deserialize_request(BufType &request_buf) -> std::optional< request_type >
Deserializes a request from a buffer.
std::function< void(result_type &r, nuraft::ptr< std::exception > &err)> callback_type
Function type for raft state machine execution result callbacks.
Definition node.hpp:21
handler_type
Type to distinguish between servers that implement synchronous versus asynchronous request handling.
@ buffer
A singular RLP value (byte array)