roo_transport
API Documentation for roo_transport
Loading...
Searching...
No Matches
messaging.h
Go to the documentation of this file.
1#pragma once
2
3#include <stdint.h>
4
5#include <functional>
6#include <memory>
7
8#include "roo_backport.h"
9#include "roo_backport/byte.h"
10
11namespace roo_transport {
12
13/// Abstract interface for message exchange over a reliable channel.
14///
15/// Messages are arbitrary-length byte arrays with in-order, integrity-checked
16/// delivery. Messages may be lost across channel reset/reconnect boundaries.
17class Messaging {
18 public:
19 using ConnectionId = uint32_t;
20
21 class Receiver;
22 class SimpleReceiver;
23
24 virtual ~Messaging() = default;
25
26 /// Registers message receiver. Call before channel initialization.
27 void setReceiver(Receiver& receiver) { receiver_ = &receiver; }
28
29 /// Unregisters receiver.
30 void unsetReceiver() { receiver_ = nullptr; }
31
32 /// Sends message with optional header and payload.
33 ///
34 /// @param connection_id Optional out parameter receiving sender-side
35 /// connection id used for this send.
36 /// @return true if accepted for send.
37 virtual bool send(const roo::byte* header, size_t header_size,
38 const roo::byte* payload, size_t payload_size,
39 ConnectionId* connection_id) = 0;
40
41 /// Sends continuation payload on an existing sender-side connection.
42 ///
43 /// Intended for connection-affine responses (e.g. RPC) and atomic message
44 /// streams.
45 virtual bool sendContinuation(ConnectionId connection_id,
46 const roo::byte* header, size_t header_size,
47 const roo::byte* payload,
48 size_t payload_size) = 0;
49
50 /// Convenience overload for header-less messages.
51 virtual bool send(const roo::byte* payload, size_t payload_size,
52 ConnectionId* connection_id) {
53 return send(nullptr, 0, payload, payload_size, connection_id);
54 }
55
56 /// Convenience overload for header-less stateless messages.
57 bool send(const roo::byte* payload, size_t payload_size) {
58 return send(payload, payload_size, nullptr);
59 }
60
61 /// Convenience overload for header-less continuation messages.
62 virtual bool sendContinuation(ConnectionId connection_id,
63 const roo::byte* payload, size_t payload_size) {
64 return sendContinuation(connection_id, nullptr, 0, payload, payload_size);
65 }
66
67 protected:
68 Messaging() = default;
69
70 /// Dispatches received message to registered receiver.
71 void received(ConnectionId connection_id, const roo::byte* data, size_t len);
72
73 /// Dispatches reset notification to registered receiver.
74 void reset(ConnectionId connection_id);
75
76 private:
77 Receiver* receiver_ = nullptr;
78};
79
81 public:
82 virtual ~Receiver() = default;
83
84 /// Called when message is received.
85 ///
86 /// `connection_id` identifies receiver-side channel context and can be used
87 /// for connection-affine responses via `sendContinuation()`.
88 virtual void received(ConnectionId connection_id, const roo::byte* data,
89 size_t len) = 0;
90
91 /// Notifies that underlying connection was closed/reset.
92 ///
93 /// Receiver should clear connection-associated state.
94 virtual void reset(ConnectionId connection_id) {}
95};
96
98 public:
99 using Fn = std::function<void(ConnectionId connection_id,
100 const roo::byte* data, size_t len)>;
101 explicit SimpleReceiver(Fn fn) : fn_(std::move(fn)) {}
102 void received(ConnectionId connection_id, const roo::byte* data,
103 size_t len) override {
104 fn_(connection_id, data, len);
105 }
106
107 private:
108 Fn fn_;
109};
110
111} // namespace roo_transport
virtual void received(ConnectionId connection_id, const roo::byte *data, size_t len)=0
Called when message is received.
virtual void reset(ConnectionId connection_id)
Notifies that underlying connection was closed/reset.
Definition messaging.h:94
void received(ConnectionId connection_id, const roo::byte *data, size_t len) override
Called when message is received.
Definition messaging.h:102
std::function< void(ConnectionId connection_id, const roo::byte *data, size_t len)> Fn
Definition messaging.h:100
Abstract interface for message exchange over a reliable channel.
Definition messaging.h:17
virtual bool sendContinuation(ConnectionId connection_id, const roo::byte *header, size_t header_size, const roo::byte *payload, size_t payload_size)=0
Sends continuation payload on an existing sender-side connection.
virtual bool send(const roo::byte *payload, size_t payload_size, ConnectionId *connection_id)
Convenience overload for header-less messages.
Definition messaging.h:51
void unsetReceiver()
Unregisters receiver.
Definition messaging.h:30
virtual bool send(const roo::byte *header, size_t header_size, const roo::byte *payload, size_t payload_size, ConnectionId *connection_id)=0
Sends message with optional header and payload.
virtual bool sendContinuation(ConnectionId connection_id, const roo::byte *payload, size_t payload_size)
Convenience overload for header-less continuation messages.
Definition messaging.h:62
void received(ConnectionId connection_id, const roo::byte *data, size_t len)
Dispatches received message to registered receiver.
Definition messaging.cpp:5
bool send(const roo::byte *payload, size_t payload_size)
Convenience overload for header-less stateless messages.
Definition messaging.h:57
void setReceiver(Receiver &receiver)
Registers message receiver. Call before channel initialization.
Definition messaging.h:27
virtual ~Messaging()=default
void reset(ConnectionId connection_id)
Dispatches reset notification to registered receiver.
Definition messaging.cpp:12