31#include <unordered_map>
75 std::string_view header_json,
76 uint16_t total_chunks,
77 uint16_t chunk_number,
78 const uint8_t* payload,
79 std::size_t payload_size);
86 std::string_view header_json,
87 uint16_t total_chunks,
88 uint16_t chunk_number,
89 const std::vector<uint8_t>& payload) {
91 request_id, header_json, total_chunks,
92 chunk_number, payload.data(), payload.size());
108std::vector<std::vector<uint8_t>>
114 std::string_view header_json,
115 const uint8_t* payload,
116 std::size_t payload_size,
117 std::size_t max_payload_bytes);
146 uint16_t received = 0;
147 std::string header_json;
148 std::vector<std::vector<uint8_t>> chunks;
149 std::vector<bool> seen;
151 std::unordered_map<uint8_t, Slot> slots_;
165std::optional<std::vector<uint8_t>>
pe_compress(
const uint8_t* data, std::size_t size);
167inline std::optional<std::vector<uint8_t>>
pe_compress(
const std::vector<uint8_t>& payload) {
168 return pe_compress(payload.data(), payload.size());
172std::optional<std::vector<uint8_t>>
pe_decompress(
const uint8_t* data, std::size_t size);
174inline std::optional<std::vector<uint8_t>>
pe_decompress(
const std::vector<uint8_t>& blob) {
188 std::string_view command = {},
198 std::string* resource,
199 std::string* command,
243 const std::vector<PeSubscription>&
all()
const {
return subs_; }
246 std::vector<PeSubscription> subs_;
247 uint64_t next_id_ = 1;
Reassemble a stream of incoming PeChunks for the same request_id.
Definition midi_ci_pe.hpp:128
std::size_t pending_transfers() const
RT-safe.
Definition midi_ci_pe.hpp:141
void cancel(uint8_t request_id)
NOT RT-safe — unordered_map::erase may rehash and frees the per-slot vectors.
std::optional< PeChunk > push(PeChunk chunk)
NOT RT-safe — inserts/erases on unordered_map, resizes per-slot vector<bool> and vector<vector<uint8_...
Authoritative subscription registry on the responder side.
Definition midi_ci_pe.hpp:224
std::string subscribe(std::string_view resource, MUID subscriber)
NOT RT-safe — allocates a new PeSubscription (two std::strings), pushes onto subs_,...
bool unsubscribe(std::string_view subscription_id)
NOT RT-safe — linear scan + std::vector::erase.
std::vector< PeSubscription > subscribers_of(std::string_view resource) const
NOT RT-safe — allocates the result std::vector<PeSubscription>, even when the call ends up empty (the...
const std::vector< PeSubscription > & all() const
Non-owning live view of the registry.
Definition midi_ci_pe.hpp:243
Definition custom_node_events.hpp:26
PeMessageType
PE sub-IDs (MIDI-CI sub-ID #2 byte). Mirrors CiMessageType for PE.
Definition midi_ci_pe.hpp:39
@ SubscribeReply
Definition midi_ci_pe.hpp:45
@ SetInquiry
Definition midi_ci_pe.hpp:42
@ SetReply
Definition midi_ci_pe.hpp:43
@ Notify
Definition midi_ci_pe.hpp:46
@ SubscribeInquiry
Definition midi_ci_pe.hpp:44
@ GetInquiry
Definition midi_ci_pe.hpp:40
@ GetReply
Definition midi_ci_pe.hpp:41
std::string pe_header_make(std::string_view resource, std::string_view command={}, int status=200)
Builds a minimal PE JSON header.
std::optional< PeChunk > pe_parse_message(const uint8_t *data, std::size_t size)
Parse a single PE SysEx envelope into a PeChunk.
bool pe_header_parse(std::string_view json, std::string *resource, std::string *command, int *status)
Parse a PE JSON header.
std::vector< std::vector< uint8_t > > pe_split_into_chunks(PeMessageType pe_type, uint8_t ci_version, MUID source, MUID destination, uint8_t request_id, std::string_view header_json, const uint8_t *payload, std::size_t payload_size, std::size_t max_payload_bytes)
Split a logical PE Get/Set into wire-ready chunks bounded by max_payload_bytes of decoded resource pe...
std::vector< uint8_t > pe_build_message(PeMessageType pe_type, uint8_t ci_version, MUID source, MUID destination, uint8_t request_id, std::string_view header_json, uint16_t total_chunks, uint16_t chunk_number, const uint8_t *payload, std::size_t payload_size)
Builder for PE message wire bytes.
std::optional< std::vector< uint8_t > > pe_decompress(const uint8_t *data, std::size_t size)
Decompress a zlib-wrapped PE payload. Returns nullopt on failure.
std::optional< std::vector< uint8_t > > pe_compress(const uint8_t *data, std::size_t size)
Compress a PE payload using zlib (RFC 1950). Returns nullopt on failure.
MIDI-CI MUID (Message Unique Identifier) — 28-bit random ID.
Definition midi_ci.hpp:52
A single PE chunk, after Mcoded7 decode of header + payload.
Definition midi_ci_pe.hpp:52
uint16_t chunk_number
1-indexed
Definition midi_ci_pe.hpp:55
std::vector< uint8_t > payload
Decoded resource bytes.
Definition midi_ci_pe.hpp:57
std::string header_json
Decoded JSON UTF-8.
Definition midi_ci_pe.hpp:56
uint16_t total_chunks
Definition midi_ci_pe.hpp:54
uint8_t request_id
Definition midi_ci_pe.hpp:53
One active subscription state — owned by PeSubscriptionManager.
Definition midi_ci_pe.hpp:205
MUID subscriber
Definition midi_ci_pe.hpp:208
std::string resource
Definition midi_ci_pe.hpp:207
std::string subscription_id
Server-allocated, opaque to client.
Definition midi_ci_pe.hpp:206