49 static constexpr uint16_t frameMagic = 0x5348;
50 static constexpr uint8_t currentVersion = 1;
59 uint16_t magic = frameMagic;
60 uint8_t version = currentVersion;
62 uint16_t reserved = 0;
63 uint16_t frameSize = 0;
64 uint32_t messageId = 0;
66 uint32_t totalPayloadSize = 0;
70 static_assert(
sizeof(
Header) % 4 == 0);
75 std::span<uint8_t const> payload;
77 std::array<iovec, 2> toIovec()
const noexcept;
81 struct ReassemblyBuffer
83 std::vector<uint8_t> data;
84 uint32_t totalPayloadSize;
85 uint32_t payloadSizeReceived;
86 timespec lastUpdatedAt;
90 static std::vector<Frame> frameAll(uint32_t payloadId,
91 std::span<uint8_t const> payload,
94 static Frame frameNext(uint32_t payloadId,
95 std::span<uint8_t const> fullPayload,
99 static constexpr std::size_t maxFrameSize() noexcept {
return std::numeric_limits<
decltype(Header::frameSize)>::max(); }
102 std::optional<std::vector<uint8_t>> push(std::span<uint8_t const> frame, timespec
const & time);
103 void gc(std::chrono::milliseconds maxAge);
105 bool hasPendingData() const noexcept {
return !_pending.empty(); }
109 std::unordered_map<uint32_t, ReassemblyBuffer> _pending;