every.channel/evolution/proposals/ECP-0012-moq-object-wire-format.md
2026-02-15 16:17:27 -05:00

1.5 KiB

ECP-0012: MoQ object wire format + track mapping

Status: Draft

Problem

We need a concrete, interoperable way to represent every.channel chunk objects over MoQ tracks so that publishers and subscribers can exchange data without relying on file relay conventions.

Constraints

  • Works over moq-lite tracks with group/frame semantics.
  • Must carry both metadata (timing, encryption) and chunk bytes.
  • Should be simple to parse and deterministic.

Decision

  • Broadcast name: the canonical stream id (e.g. ec/stream/v1/...).
  • Track name: fixed chunks track for object payloads.
  • Group sequence: use chunk_index (u64) as the group sequence.
  • Frame payload: a single frame per group containing:
    • 4-byte big-endian length prefix for JSON metadata
    • JSON-encoded ObjectMeta
    • raw chunk bytes (ciphertext or plaintext)

This yields a deterministic, self-contained payload with minimal framing and easy debugging.

ObjectMeta may include optional integrity helpers:

  • chunk_hash (blake3 of plaintext chunk bytes)
  • chunk_proof (Merkle branch proving membership in an epoch manifest)

Alternatives considered

  • Separate meta/data frames: rejected due to ordering ambiguity and more framing.
  • Binary codec (postcard/bincode): deferred until interop is proven.

Rollout / teardown

  • Implement encode/decode helpers in ec-moq.
  • Update publisher to emit one frame per chunk group.
  • Update subscriber to decode into ObjectPayload.
  • If superseded, provide a compatibility adapter in ec-moq.