conduit 0.6.0
Modern C++23 header-only event-dispatching / event-transport library
Loading...
Searching...
No Matches
transport.hpp
Go to the documentation of this file.
1#pragma once
2
6
8#include <conduit/glob.hpp>
10
11#include <functional>
12#include <memory>
13#include <mutex>
14#include <string>
15#include <string_view>
16#include <utility>
17#include <vector>
18
19namespace conduit::relay {
20
22public:
23 using Callback = std::function<void(const EventEnvelopeView&)>;
24
25 explicit Transport(Callback cb) {
26 add_route_impl("**", std::move(cb));
27 }
28
29 Transport(const std::string_view pattern, Callback cb) {
30 add_route_impl(std::string{pattern}, std::move(cb));
31 }
32
33 [[nodiscard]] TransportScope scope() const noexcept override {
35 }
36
37 void dispatch(const EventEnvelopeView& v) override {
38 std::vector<Route> snapshot;
39 {
40 std::scoped_lock lock(mu_);
41 snapshot = routes_;
42 }
43 const std::string_view name = v.name();
44 for (const auto& r : snapshot) {
45 if (Glob::match(r.pattern, name)) {
46 try {
47 r.cb(v);
48 } catch (...) {
49 // Callback errors are the user's problem; swallow here so the
50 // bus's fire-and-forget contract holds.
51 }
52 }
53 }
54 }
55
59 [[nodiscard]] std::size_t add_route(const std::string_view pattern, Callback cb) {
60 return add_route_impl(std::string{pattern}, std::move(cb));
61 }
62
63 void remove_route(const std::size_t id) noexcept {
64 std::scoped_lock lock(mu_);
65 for (auto it = routes_.begin(); it != routes_.end(); ++it) {
66 if (it->id == id) {
67 routes_.erase(it);
68 return;
69 }
70 }
71 }
72
73 [[nodiscard]] std::size_t route_count() const noexcept {
74 std::scoped_lock lock(mu_);
75 return routes_.size();
76 }
77
78private:
79 struct Route {
80 std::size_t id;
81 std::string pattern;
82 Callback cb;
83 };
84
85 std::size_t add_route_impl(std::string pattern, Callback cb) {
86 std::scoped_lock lock(mu_);
87 const auto id = ++next_id_;
88 routes_.push_back(Route{id, std::move(pattern), std::move(cb)});
89 return id;
90 }
91
92 mutable std::mutex mu_;
93 std::vector<Route> routes_;
94 std::size_t next_id_ = 0;
95};
96
97} // namespace conduit::relay
Polymorphic envelope cell.
Definition envelope.hpp:62
std::string_view name() const noexcept
Definition envelope.hpp:91
static constexpr bool match(const std::string_view pattern, const std::string_view name) noexcept
Free function helper for one-shot matching.
Definition glob.hpp:103
Definition transport.hpp:30
Definition transport.hpp:21
Transport(Callback cb)
Definition transport.hpp:25
void dispatch(const EventEnvelopeView &v) override
Definition transport.hpp:37
std::size_t add_route(const std::string_view pattern, Callback cb)
Add a new route at runtime.
Definition transport.hpp:59
Transport(const std::string_view pattern, Callback cb)
Definition transport.hpp:29
std::function< void(const EventEnvelopeView &)> Callback
Definition transport.hpp:23
std::size_t route_count() const noexcept
Definition transport.hpp:73
TransportScope scope() const noexcept override
Definition transport.hpp:33
void remove_route(const std::size_t id) noexcept
Definition transport.hpp:63
EventEnvelope — a parcel cell carrying conduit's envelope metadata plus a polymorphic payload cell.
Event-name glob matcher.
Transport interface and the local/remote scope enum used for flag-based filtering.
Definition transport.hpp:19
TransportScope
Distinguishes in-process transports from off-machine ones.
Definition transport.hpp:21