Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
stream_parser.hpp
Go to the documentation of this file.
1#pragma once
2
5#include "msgpack/v3/object_fwd_decl.hpp"
6#include <cstdint>
7#include <functional>
8#include <iostream>
9#include <utility>
10#include <vector>
11
12namespace bb::messaging {
13template <typename OutputStream> class StreamDispatcher {
14 private:
15 OutputStream& outputStream;
16 std::unordered_map<uint32_t, std::function<bool(msgpack::object&)>> messageHandlers;
17 void sendPong(uint32_t pingId);
18 bool handleSystemMessage(msgpack::object& obj);
19
20 public:
21 StreamDispatcher(OutputStream& out)
22 : outputStream(out)
23 {}
24 bool onNewData(msgpack::object& obj);
25 void registerTarget(uint32_t msgType, std::function<bool(msgpack::object&)>& handler);
26};
27
28template <typename OutputStream> bool StreamDispatcher<OutputStream>::onNewData(msgpack::object& obj)
29{
31 obj.convert(header);
32
33 if (header.msgType < FIRST_APP_MSG_TYPE) {
34 return handleSystemMessage(obj);
35 }
36 auto iter = messageHandlers.find(header.msgType);
37 if (iter == messageHandlers.end()) {
38 std::cerr << "No registered handler for message of type " << header.msgType << std::endl;
39 return true;
40 }
41 return (iter->second)(obj);
42}
43
44template <typename OutputStream>
45void StreamDispatcher<OutputStream>::registerTarget(uint32_t msgType, std::function<bool(msgpack::object&)>& handler)
46{
47 messageHandlers.insert({ msgType, handler });
48}
49
50template <typename OutputStream> bool StreamDispatcher<OutputStream>::handleSystemMessage(msgpack::object& obj)
51{
53 obj.convert(header);
54 if (header.msgType == SystemMsgTypes::TERMINATE) {
55 return false;
56 }
57 if (header.msgType == SystemMsgTypes::PING) {
58 sendPong(header.header.messageId);
59 }
60 return true;
61}
62
63template <typename OutputStream> void StreamDispatcher<OutputStream>::sendPong(uint32_t pingId)
64{
65 MsgHeader header(pingId);
66 HeaderOnlyMessage packedHeader(SystemMsgTypes::PONG, header);
67 outputStream.send(packedHeader);
68}
69} // namespace bb::messaging
void registerTarget(uint32_t msgType, std::function< bool(msgpack::object &)> &handler)
StreamDispatcher(OutputStream &out)
void sendPong(uint32_t pingId)
std::unordered_map< uint32_t, std::function< bool(msgpack::object &)> > messageHandlers
bool onNewData(msgpack::object &obj)
bool handleSystemMessage(msgpack::object &obj)
const uint32_t FIRST_APP_MSG_TYPE
Definition header.hpp:10
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13