Radix Relay
Hybrid mesh communications with Signal Protocol encryption
Loading...
Searching...
No Matches
standard_processor.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <boost/asio/awaitable.hpp>
4#include <boost/asio/cancellation_signal.hpp>
5#include <boost/asio/experimental/channel_error.hpp>
6#include <boost/asio/io_context.hpp>
7#include <boost/system/system_error.hpp>
8#include <memory>
9#include <spdlog/spdlog.h>
10#include <utility>
11
12namespace radix_relay::core {
13
25template<typename Handler> class standard_processor
26{
27public:
28 using in_queue_t = typename Handler::in_queue_t;
29 using out_queues_t = typename Handler::out_queues_t;
30
43 template<typename... HandlerArgs>
44 standard_processor(const std::shared_ptr<boost::asio::io_context> &io_context,
45 const std::shared_ptr<in_queue_t> &in_queue,
46 const out_queues_t &out_queues,
47 HandlerArgs &&...handler_args)
48 : io_context_(io_context), in_queue_(in_queue),
49 handler_(std::make_shared<Handler>(std::forward<HandlerArgs>(handler_args)..., out_queues))
50 {}
51
61 auto run_once(std::shared_ptr<boost::asio::cancellation_slot> cancel_slot = nullptr) -> boost::asio::awaitable<void>
62 {
63 auto evt = co_await in_queue_->pop(cancel_slot);
64 handler_->handle(evt);
65 co_return;
66 }
67
78 auto run(std::shared_ptr<boost::asio::cancellation_slot> cancel_slot = nullptr) -> boost::asio::awaitable<void>
79 {
80 try {
81 while (true) { co_await run_once(cancel_slot); }
82 } catch (const boost::system::system_error &e) {
83 if (e.code() == boost::asio::error::operation_aborted
84 or e.code() == boost::asio::experimental::error::channel_cancelled
85 or e.code() == boost::asio::experimental::error::channel_closed) {
86 spdlog::debug("[standard_processor] Cancelled, exiting run loop");
87 co_return;
88 } else {
89 spdlog::error("[standard_processor] Unexpected error in run loop: {}", e.what());
90 throw;
91 }
92 }
93 }
94
95private:
96 std::shared_ptr<boost::asio::io_context> io_context_;
97 std::shared_ptr<in_queue_t> in_queue_;
98 std::shared_ptr<Handler> handler_;
99};
100
101}// namespace radix_relay::core
Generic queue-processing loop that HasA handler (no virtual inheritance).
typename Handler::out_queues_t out_queues_t
auto run(std::shared_ptr< boost::asio::cancellation_slot > cancel_slot=nullptr) -> boost::asio::awaitable< void >
Continuously processes events from the input queue until cancelled or closed.
auto run_once(std::shared_ptr< boost::asio::cancellation_slot > cancel_slot=nullptr) -> boost::asio::awaitable< void >
Processes a single event from the input queue.
typename Handler::in_queue_t in_queue_t
standard_processor(const std::shared_ptr< boost::asio::io_context > &io_context, const std::shared_ptr< in_queue_t > &in_queue, const out_queues_t &out_queues, HandlerArgs &&...handler_args)
Constructs a standard processor with handler-specific arguments.