# ECP-0053: Direct WebRTC Wire Framing (Chunked Frames)

Status: Draft

## Problem

`direct-publish` currently sends each CMAF object (init or `.m4s` fragment) as a single WebRTC
data-channel message (`encode_object_frame(meta, data)`).

Real OTA CMAF fragments routinely exceed typical data-channel maximum message sizes, causing
runtime failure like:

- `Error: outbound packet larger than maximum message size`

This blocks real-world HDHomeRun end-to-end streaming via `https://every.channel`.

## Goal

Make direct WebRTC transport robust by supporting large objects while keeping:

- ordered delivery,
- simple decoding in the website and CLI,
- no additional servers beyond the existing bootstrap API.

## Proposal

Define a minimal application-layer framing over WebRTC data-channel messages:

- Each data-channel message begins with a 1-byte tag:
  - `0x00`: legacy "whole object frame in one message" (optional compatibility)
  - `0x01`: stream-chunk bytes (new default)
- In `0x01` mode, bytes carry a length-prefixed stream:
  - `[u32_be length][frame bytes]` repeated
  - `frame bytes` are exactly the existing `encode_object_frame(meta, data)` output
- Publishers MUST:
  - use `0x01` mode,
  - split the stream into safe message payloads (e.g. 16 KiB chunks)
- Subscribers SHOULD:
  - accept both `0x01` and `0x00` to ease rollout.

## Rollout

- Update `ec-node direct-publish`, the website receiver, and `ec-node direct-subscribe`.
- Redeploy static site assets; bootstrap API unchanged.

## Reversibility

- The change is localized to `direct-*` and can be removed or replaced without touching MoQ.

