{
  "moqt": {
    "document": "draft-ietf-moq-transport-22",
    "protocolId": "moqt-22",
    "protocolIds": ["moqt-22", "moqt-20"],
    "fallbackDocument": "draft-ietf-moq-transport-20",
    "note": "Every SDK implements draft-ietf-moq-transport-22, and draft-ietf-moq-transport-20 as a fallback, and no other version. protocolId is draft-22's wire identifier (draft-22 Section 6.2 rule: \"moqt-\" plus the draft number) and the default. protocolIds is the list a client offers as the WebTransport protocol identifiers (WT-Available-Protocols) or ALPN, in preference order; the connection proceeds on either. The two drafts differ on the wire only in the LOCATION_FILTER parameter (draft-22 Section 9.20.9), which the core encodes for the negotiated one. See docs/research/moqt-22-delta.md."
  },
  "relay": {
    "defaultEndpoint": "https://relay.mux.global",
    "authentication": {
      "scheme": "jwt-query-parameter",
      "parameter": "jwt",
      "note": "An explicit jwt parameter already present on the URL takes precedence over a token callback. An empty jwt parameter is rejected as an argument error, not treated as absent."
    },
    "limits": {
      "maxObjectPropertiesBytes": 65536,
      "maxTrackProperties": 64,
      "note": "moq-relay implementation limits, not draft-22 ones. maxObjectPropertiesBytes is the limit on an object's encoded property block (MAX_OBJECT_EXTENSIONS since 0.17.0): the relay stops the subgroup stream on a larger block and the object is lost with no error to the subscriber, so both SDKs refuse such a write as an argument error. limits.maxObjectPropertiesBytes stays the core's draft-22 bound for what a subscriber decodes. maxTrackProperties is the number of track properties the relay parses from SUBSCRIBE_OK (MAX_PROPERTIES in 0.17.0): past it, the relay refuses every subscriber with REQUEST_ERROR 18 'too many' and the publisher hears nothing, so both SDKs refuse such a track at registration."
    }
  },
  "limits": {
    "maxObjectPayloadBytes": 16777216,
    "maxObjectPropertiesBytes": 1048576,
    "maxTrackPropertiesBytes": 65525,
    "maxPropertyValueBytes": 65535,
    "maxNamespaceFields": 32,
    "note": "maxTrackPropertiesBytes is the encoded track property block a publisher's SUBSCRIBE_OK can carry: the 16-bit control message length (65535) less the track alias, a varint of up to 9 bytes that is the peer's request ID and so unknown at registration, and the 1-byte count of the message parameters, of which the SDKs send none. Both SDKs refuse a larger block at registration; the core holds the bound. The same block rides in TRACK_STATUS_OK (a REQUEST_OK, which has no track alias) beside LARGEST_OBJECT once the track has written an object: it fits while the group and object ID varints take at most 8 bytes together, plus whatever the block leaves under the bound, so only a block within 10 bytes of the bound can overflow it, and that TRACK_STATUS is answered INTERNAL_ERROR."
  },
  "trackProperties": {
    "defaultPublisherPriority": { "type": 14, "max": 255 },
    "defaultPublisherGroupOrder": { "type": 34, "values": [1, 2] },
    "note": "Track property values draft-22 restricts (sections 10.4 and 10.5): a Default Publisher Priority above 255 is invalid and a Default Publisher Group Order other than 1 (ascending) or 2 (descending) is a PROTOCOL_VIOLATION. moq-relay refuses every subscriber to such a track with REQUEST_ERROR 18 'invalid value', so both SDKs refuse it at registration."
  },
  "media": {
    "locDocument": "draft-ietf-moq-loc-04",
    "msfDocument": "draft-ietf-moq-msf-01",
    "catalogVersion": "draft-01",
    "defaultTimescale": 1000000,
    "tracks": {
      "catalog": "catalog",
      "video": "video",
      "audio": "audio",
      "mediaTimeline": "timeline",
      "interrupt": "interrupt",
      "transcript": "transcript"
    },
    "properties": {
      "timestamp": 16,
      "timescale": 8,
      "videoConfig": 13,
      "audioConfig": 15
    }
  },
  "mediaTrackProperties": {
    "publisherPriority": { "audio": 16, "video": 96 },
    "note": "The Default Publisher Priority (track property 0x0E) mediaTrackProperties / media_track_properties give each kind; lower is more urgent (draft-22 section 5.1), so audio goes ahead of video. moq-relay 0.17 orders delivery by subscriber priority alone (issue #154)."
  },
  "mediaSubscribeParameters": {
    "subscriberPriority": { "audio": 16, "video": 96 },
    "note": "The SUBSCRIBER_PRIORITY mediaSubscribeParameters / media_subscribe_parameters give a viewer's subscription to each kind: the same values as mediaTrackProperties.publisherPriority, lower being more urgent. moq-relay 0.17 orders what it sends a viewer by subscriber priority alone and ignores the publisher's (issue #154, spec/relay-interop.md), so this is the priority that puts audio ahead of video there (issue #337)."
  }
}
