You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
CEP-22 defines a bounded reassembly profile for JSON-RPC payloads too large for a single relay event (~64 KB). Large messages are split into ordered frames carried inside MCP notifications/progress notifications, transmitted as ordinary kind 25910 events, and reassembled after SHA-256 + size validation before being surfaced to the MCP layer.
No new Nostr kinds. Depends on CEP-6 (done). The rmcp fork (progress-aware-request-timeouts) enables opt-in per-chunk idle timeout reset for the S→C response direction - not automatic, requires send_cancellable_request with explicit options (PR 4).
Client send -- threshold check, oversized branch, accept handshake, register end-frame event id in correlation store
Client inbound -- intercept cvm frames before 1 MB cap, feed receiver, guard pending cleanup, tx.send on end, use validate_and_parse_oversized
Server send_response -- threshold check, split into start/chunk/end frames (no accept wait server-side); serialize-for-digest must run after original request id is restored (server/mod.rs:517-522) or SHA-256 check fails on client
Server inbound -- intercept cvm frames, reassemble, emit accept on unknown-support start, dispatch synthetic IncomingRequest on end
One OversizedTransferReceiver per transport, .clear() on close()
Summary
CEP-22 defines a bounded reassembly profile for JSON-RPC payloads too large for a single relay event (~64 KB). Large messages are split into ordered frames carried inside MCP
notifications/progressnotifications, transmitted as ordinary kind 25910 events, and reassembled after SHA-256 + size validation before being surfaced to the MCP layer.No new Nostr kinds. Depends on CEP-6 (done). The rmcp fork (
progress-aware-request-timeouts) enables opt-in per-chunk idle timeout reset for the S→C response direction - not automatic, requiressend_cancellable_requestwith explicit options (PR 4).Spec:
contextvm-docs/src/content/docs/spec/ceps/cep-22.mdTS SDK reference:
sdk/src/transport/oversized-transfer/PR 1: Core framing engine (transport-agnostic) (#88 )
sha2 = "0.10"andhex = "0.4"toCargo.tomlframe.rs-OversizedFrameenum (Start/Accept/Chunk/End/Abort) + serdeconstants.rs- chunk size, threshold, max bytes, timeouts, progress slotserrors.rs-OversizedTransferErrorvariants (Abort/Policy/Digest/Reassembly/Sequence)codec.rs-build_oversized_frames(), SHA-256 digest, UTF-8 char-aware byte splitreceiver.rs- statefulOversizedTransferReceiver(admission control, out-of-order buffering, triple validation at end)validate_and_parse_oversized()- bypass 1 MB cap for reassembled payloads, bound tomaxTransferBytes(100 MiB default)OversizedTransferErrorintosrc/core/error.rssrc/transport/mod.rsPR 2: Config + capability advertisement + server gate
OversizedTransferConfigstruct with builder, attached to both transport configssupport_oversized_transfertag viaAnnouncementManager::set_internal_common_tagswhen enabledoversized_enabled = false(server/mod.rs:1158) with config flagsupport_oversized_transferinget_client_capability_tagswhen enabledPR 3: Transport integration (outbound split + inbound reassembly + accept)
tx.sendon end, usevalidate_and_parse_oversizedserver/mod.rs:517-522) or SHA-256 check fails on clientOversizedTransferReceiverper transport,.clear()onclose()PR 4: Progress-aware timeout + e2e + docs + enable default
send_cancellable_requestwithreset_timeout_on_progress+max_total_timeoutProgressNotificationParamtolerates forwarded stripped progress notifications (unknown fields); if not, rely on receiver watchdog onlyenabled = true(matches TS default)MockRelayPoolcovering all encryption modes (disabled/optional/required)