WebSocket messages
NodalMerge uses typed JSON envelopes over WebSocket. This page is a message catalog. For flow semantics, see:protocol/synchronizationprotocol/blob-flow
Envelope basics
Each message includes atype discriminator and type-specific fields.
At a high level:
- Client sends intent/requests/updates
- Server replies or broadcasts room events
- Invalid payloads are rejected with explicit error behavior
Session and sync messages
Client → Server
hello: start session, provide identity/capabilities/subscription hintspack: submit newly produced node historyrequest: ask for missing nodes by known-set differencemst-request: request MST segments during refined reconciliationmst-done: request final missing nodes after MST descentsubscribe: update subscription scope for relay filtering
Server → Client
welcome: handshake response with negotiated sync contextpack: relayed accepted node deltas — also sent unsolicited as a full-state catch-up immediately afterwelcomewhen a peer joinspack-ack: acknowledges a submittedpackwith accepted/rejected/incoming countssubscribe-ack: confirms runtime subscription updatemst-response: MST segment response for client descentpeer-joined: room membership event; includespeer_idandpeer_typepeer-left: room membership event; includespeer_idandpeer_type
peer_id (stable logical identity, falls back to pubkey) and peer_type
(free-form classification, falls back to "ui") are supplied by the client at
hello and let the server target broadcasts at a logical peer across reconnects.
See api-reference/websocket-commands#hello-client-server for the full field
reference.
Blob messages
Client → Server
blob-upload: upload blob bytes over WebSocketblob-request: request blob payloads by hashrequest-upload: ask for direct-upload URL (if negotiated)blob-uploaded: report direct upload completion for verification
Server → Client
blob-pack: bytes-over-WebSocket blob responseblob-available: broadcast hint that blobs can be fetchedblob-redirect: direct-download URLs for requested hashesupload-granted: direct-upload URL grantedupload-denied: direct-upload not available for this requestupload-rejected: direct-upload verification failed
Presence and collaboration signaling
Client → Server
presence: ephemeral presence payload update
Server → Client
presence: relayed peer presence state
Control-plane and admin surfaces
Depending on policy/capabilities, sessions may use additional command messages for runtime governance and operator workflows. Examples include:- Room key and policy control commands
- Server info and tick-control commands
- Archive/query/projection/replay control commands
Error and close semantics
Common failure surfaces:- Protocol format errors (
send_errorstyle responses) - Auth/token failures at handshake or mid-session
- Rate limiting and backpressure disconnects
- Upload verification failures on direct blob I/O
Message handling guidance
- Route by
typefirst, then validate fields - Treat unknown/unsupported types conservatively
- Keep retry/idempotency logic at operation level, not socket-frame level
- Separate sync-path handling from control-plane command handling