@norskvideo/moq-net 0.1.6 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ietf/object.d.ts.map +1 -1
- package/ietf/object.js +13 -7
- package/ietf/object.js.map +1 -1
- package/package.json +2 -2
package/ietf/object.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../../src/ietf/object.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,KAAK,WAAW,EAAW,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../../src/ietf/object.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,KAAK,WAAW,EAAW,MAAM,cAAc,CAAC;AAgJzD,MAAM,WAAW,UAAU;IAC1B,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,MAAM,EAAE,OAAO,CAAC;IAGhB,WAAW,EAAE,OAAO,CAAC;IACrB;;;;;;OAMG;IACH,WAAW,EAAE,OAAO,CAAC;CACrB;AAED;;;GAGG;AACH,qBAAa,KAAK;IACjB,KAAK,EAAE,UAAU,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAE1B,YAAY,EACX,UAAU,EACV,OAAO,EACP,UAAU,EACV,iBAAiB,EACjB,KAAK,GACL,EAAE;QACF,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,KAAK,EAAE,UAAU,CAAC;KAClB,EAMA;IAEK,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA+B3D;IAED,OAAa,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,CAoCnE;CACD;AAED,oDAAoD;AACpD,qBAAa,KAAK;IACjB,sEAAsE;IACtE,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,6EAA6E;IAC7E,SAAS,CAAC,EAAE,SAAS,CAAC;IAEtB,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,GAAE;QAAE,OAAO,CAAC,EAAE,UAAU,CAAC;QAAC,SAAS,CAAC,EAAE,SAAS,CAAA;KAAO,EAGvF;IAED;;;;;OAKG;IACG,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,0BAAY,EAAE,OAAO,SAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBhH;IAED,wEAAwE;IACxE,OAAa,MAAM,CAClB,CAAC,EAAE,MAAM,EACT,KAAK,EAAE,UAAU,EACjB,SAAS,EAAE,SAAS,GAAG,SAAS,EAChC,OAAO,0BAAY,GACjB,OAAO,CAAC,KAAK,CAAC,CAqChB;CACD;AASD,qFAAqF;AACrF,MAAM,WAAW,aAAa;IAC7B,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,yFAAyF;IACzF,KAAK,EAAE,OAAO,CAAC;CACf;AAED;;;;;;;GAOG;AACH,qBAAa,UAAU;IACtB,0BAA0B;IAC1B,OAAO,EAAE,UAAU,CAAC;IACpB,6EAA6E;IAC7E,SAAS,CAAC,EAAE,SAAS,CAAC;IAEtB,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE;QAAE,OAAO,EAAE,UAAU,CAAC;QAAC,SAAS,CAAC,EAAE,SAAS,CAAA;KAAE,EAGjF;IAED,8EAA8E;IACxE,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,0BAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBzG;CACD"}
|
package/ietf/object.js
CHANGED
|
@@ -98,8 +98,16 @@ async function decodeObjectTime(r, timescale, version) {
|
|
|
98
98
|
if (timestamp === undefined) {
|
|
99
99
|
return undefined;
|
|
100
100
|
}
|
|
101
|
-
// An object-scope Timescale (which LOC permits) overrides the track's for this object
|
|
102
|
-
|
|
101
|
+
// An object-scope Timescale (which LOC permits) overrides the track's for this object, and
|
|
102
|
+
// on a track that declared none it is the only statement of the units there is: a
|
|
103
|
+
// publisher on a draft with no TIMESCALE track property (Norsk on draft-16) can say
|
|
104
|
+
// nothing else. A Timestamp with no units anywhere cannot be interpreted; guessing them
|
|
105
|
+
// would be worse than the arrival stamp the caller falls back to.
|
|
106
|
+
const scale = overrideScale !== undefined ? Timescale(Number(overrideScale)) : timescale;
|
|
107
|
+
if (scale === undefined) {
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
110
|
+
return new Timestamp(Number(timestamp), scale);
|
|
103
111
|
}
|
|
104
112
|
/**
|
|
105
113
|
* STREAM_HEADER_SUBGROUP from moq-transport spec.
|
|
@@ -236,11 +244,9 @@ export class Frame {
|
|
|
236
244
|
if (flags.hasExtensions) {
|
|
237
245
|
const extensionsLength = await r.u53();
|
|
238
246
|
const extensions = await r.read(extensionsLength);
|
|
239
|
-
//
|
|
240
|
-
//
|
|
241
|
-
|
|
242
|
-
timestamp = await decodeObjectTime(new Reader(undefined, extensions, version), timescale, version);
|
|
243
|
-
}
|
|
247
|
+
// The track's TIMESCALE gives the units, or the object's own does; an object with
|
|
248
|
+
// neither is stamped on arrival by the caller, even if it carries a Timestamp.
|
|
249
|
+
timestamp = await decodeObjectTime(new Reader(undefined, extensions, version), timescale, version);
|
|
244
250
|
}
|
|
245
251
|
const payloadLength = await r.u53();
|
|
246
252
|
if (payloadLength > 0) {
|
package/ietf/object.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"object.js","sourceRoot":"","sources":["../../src/ietf/object.ts"],"names":[],"mappings":"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","sourcesContent":["import { Reader, Writer } from \"../stream.ts\";\nimport { Timescale, Timestamp } from \"../time.ts\";\nimport { type IetfVersion, Version } from \"./version.ts\";\n\nconst GROUP_END = 0x03;\n\n// MOQ Object Property ids, shared with draft-ietf-moq-loc-04.\nconst PROP_TIMESCALE = 0x08n;\nconst PROP_TIMESTAMP = 0x10n;\n\n// The Timestamp id from draft-ietf-moq-loc-03, accepted on decode only. Draft-03's\n// body text and its IANA table disagreed (0x0A vs 0x06); this is the table's value,\n// which is what shipped. Draft-04 assigns 0x0A to Secure Objects private properties,\n// so it is not accepted here.\nconst PROP_TIMESTAMP_DRAFT03 = 0x06n;\n\n// draft-18 adds bit 0x40 (FIRST_OBJECT) to the subgroup header type per spec\n// 11.4.2. Set on emit unless a filter trimmed the group's head; on parse a\n// cleared bit is the peer saying its stream starts partway through a group,\n// which the subscriber drops.\nconst FIRST_OBJECT_BIT = 0x40;\n\nfunction hasFirstObjectBit(version: IetfVersion): boolean {\n\tswitch (version) {\n\t\tcase Version.DRAFT_14:\n\t\tcase Version.DRAFT_15:\n\t\tcase Version.DRAFT_16:\n\t\tcase Version.DRAFT_17:\n\t\t\treturn false;\n\t\tdefault:\n\t\t\treturn true;\n\t}\n}\n\nfunction hasDeltaObjectPropertyTypes(version: IetfVersion | undefined): boolean {\n\tswitch (version) {\n\t\tcase Version.DRAFT_14:\n\t\tcase Version.DRAFT_15:\n\t\t\treturn false;\n\t\tdefault:\n\t\t\treturn true;\n\t}\n}\n\nasync function encodeObjectPropertyType(\n\tw: Writer,\n\tid: bigint,\n\tprev: bigint,\n\tversion: IetfVersion | undefined,\n): Promise<void> {\n\tconst encoded = hasDeltaObjectPropertyTypes(version) ? id - prev : id;\n\tawait w.u62(encoded);\n}\n\n// The units come from the track's TIMESCALE property, not from here: repeating the\n// timescale on every object would cost bytes per frame to restate something fixed for\n// the track's lifetime. The timestamp is converted into the track's units so the value\n// on the wire matches what the track declared.\nasync function encodeObjectTime(\n\tw: Writer,\n\ttimestamp: Timestamp,\n\ttimescale: Timescale,\n\tversion: IetfVersion | undefined,\n): Promise<void> {\n\tconst value = Math.round((timestamp.value * timescale) / timestamp.scale);\n\tawait encodeObjectPropertyType(w, PROP_TIMESTAMP, 0n, version);\n\tawait w.u62(BigInt(value));\n}\n\nasync function encodeObjectExtensions(\n\ttimestamp: Timestamp | undefined,\n\ttimescale: Timescale,\n\tversion: IetfVersion | undefined,\n): Promise<Uint8Array> {\n\tif (timestamp === undefined) {\n\t\treturn new Uint8Array();\n\t}\n\n\tconst chunks: Uint8Array[] = [];\n\tconst writer = new Writer(\n\t\tnew WritableStream<Uint8Array>({\n\t\t\twrite(chunk) {\n\t\t\t\tchunks.push(new Uint8Array(chunk));\n\t\t\t},\n\t\t}),\n\t\tversion,\n\t);\n\tawait encodeObjectTime(writer, timestamp, timescale, version);\n\twriter.close();\n\tawait writer.closed;\n\n\tconst size = chunks.reduce((total, chunk) => total + chunk.byteLength, 0);\n\tconst result = new Uint8Array(size);\n\tlet offset = 0;\n\tfor (const chunk of chunks) {\n\t\tresult.set(chunk, offset);\n\t\toffset += chunk.byteLength;\n\t}\n\treturn result;\n}\n\nasync function decodeObjectTime(\n\tr: Reader,\n\ttimescale: Timescale,\n\tversion: IetfVersion | undefined,\n): Promise<Timestamp | undefined> {\n\tlet timestamp: bigint | undefined;\n\tlet overrideScale: bigint | undefined;\n\tlet prevType = 0n;\n\tlet first = true;\n\n\twhile (!(await r.done())) {\n\t\tconst step = await r.u62();\n\t\tconst id = !hasDeltaObjectPropertyTypes(version) || first ? step : prevType + step;\n\t\tfirst = false;\n\t\tprevType = id;\n\n\t\tif (id % 2n === 0n) {\n\t\t\tconst value = await r.u62();\n\t\t\tif (id === PROP_TIMESTAMP || id === PROP_TIMESTAMP_DRAFT03) {\n\t\t\t\ttimestamp = value;\n\t\t\t} else if (id === PROP_TIMESCALE) {\n\t\t\t\toverrideScale = value;\n\t\t\t}\n\t\t} else {\n\t\t\tconst size = await r.u53();\n\t\t\tawait r.read(size);\n\t\t}\n\t}\n\n\tif (timestamp === undefined) {\n\t\treturn undefined;\n\t}\n\n\t// An object-scope Timescale (which LOC permits) overrides the track's for this object.\n\treturn new Timestamp(Number(timestamp), overrideScale !== undefined ? Timescale(Number(overrideScale)) : timescale);\n}\n\nexport interface GroupFlags {\n\thasExtensions: boolean;\n\thasSubgroup: boolean;\n\thasSubgroupObject: boolean;\n\thasEnd: boolean;\n\t// v15: whether priority is present in the header.\n\t// When false (0x30 base), priority inherits from the control message.\n\thasPriority: boolean;\n\t/**\n\t * Whether this stream carries the subgroup from its first published object.\n\t *\n\t * A subgroup that starts partway through has a hole at the front, which moq-lite cannot\n\t * represent. Always true on the drafts that predate the FIRST_OBJECT bit (before\n\t * draft-18), where there is no such signal to read.\n\t */\n\tfirstObject: boolean;\n}\n\n/**\n * STREAM_HEADER_SUBGROUP from moq-transport spec.\n * Used for stream-per-group delivery mode.\n */\nexport class Group {\n\tflags: GroupFlags;\n\ttrackAlias: bigint;\n\tgroupId: number;\n\tsubGroupId: number;\n\tpublisherPriority: number;\n\n\tconstructor({\n\t\ttrackAlias,\n\t\tgroupId,\n\t\tsubGroupId,\n\t\tpublisherPriority,\n\t\tflags,\n\t}: {\n\t\ttrackAlias: bigint;\n\t\tgroupId: number;\n\t\tsubGroupId: number;\n\t\tpublisherPriority: number;\n\t\tflags: GroupFlags;\n\t}) {\n\t\tthis.flags = flags;\n\t\tthis.trackAlias = trackAlias;\n\t\tthis.groupId = groupId;\n\t\tthis.subGroupId = subGroupId;\n\t\tthis.publisherPriority = publisherPriority;\n\t}\n\n\tasync encode(w: Writer, version: IetfVersion): Promise<void> {\n\t\tif (!this.flags.hasSubgroup && this.subGroupId !== 0) {\n\t\t\tthrow new Error(`Subgroup ID must be 0 if hasSubgroup is false: ${this.subGroupId}`);\n\t\t}\n\n\t\tconst base = this.flags.hasPriority ? 0x10 : 0x30;\n\t\tlet id = base;\n\t\tif (this.flags.hasExtensions) {\n\t\t\tid |= 0x01;\n\t\t}\n\t\tif (this.flags.hasSubgroupObject) {\n\t\t\tid |= 0x02;\n\t\t}\n\t\tif (this.flags.hasSubgroup) {\n\t\t\tid |= 0x04;\n\t\t}\n\t\tif (this.flags.hasEnd) {\n\t\t\tid |= 0x08;\n\t\t}\n\t\tif (this.flags.firstObject && hasFirstObjectBit(version)) {\n\t\t\tid |= FIRST_OBJECT_BIT;\n\t\t}\n\t\tawait w.u53(id);\n\t\tawait w.u62(this.trackAlias);\n\t\tawait w.u53(this.groupId);\n\t\tif (this.flags.hasSubgroup) {\n\t\t\tawait w.u53(this.subGroupId);\n\t\t}\n\t\tif (this.flags.hasPriority) {\n\t\t\tawait w.u8(this.publisherPriority);\n\t\t}\n\t}\n\n\tstatic async decode(r: Reader, version: IetfVersion): Promise<Group> {\n\t\tconst raw = await r.u53();\n\t\t// Strip the draft-18 FIRST_OBJECT bit before the range check, but keep the value:\n\t\t// it is the only signal that a subgroup starts partway through. Drafts that predate\n\t\t// it carry no such signal, so they are taken at their word.\n\t\tconst legacy = !hasFirstObjectBit(version);\n\t\tconst firstObject = legacy || (raw & FIRST_OBJECT_BIT) !== 0;\n\t\tconst id = legacy ? raw : raw & ~FIRST_OBJECT_BIT;\n\n\t\tlet hasPriority: boolean;\n\t\tlet baseId: number;\n\t\tif (id >= 0x10 && id <= 0x1f) {\n\t\t\thasPriority = true;\n\t\t\tbaseId = id;\n\t\t} else if (id >= 0x30 && id <= 0x3f) {\n\t\t\thasPriority = false;\n\t\t\tbaseId = id - (0x30 - 0x10);\n\t\t} else {\n\t\t\tthrow new Error(`Unsupported group type: ${id}`);\n\t\t}\n\n\t\tconst flags: GroupFlags = {\n\t\t\thasExtensions: (baseId & 0x01) !== 0,\n\t\t\thasSubgroupObject: (baseId & 0x02) !== 0,\n\t\t\thasSubgroup: (baseId & 0x04) !== 0,\n\t\t\thasEnd: (baseId & 0x08) !== 0,\n\t\t\thasPriority,\n\t\t\tfirstObject,\n\t\t};\n\n\t\tconst trackAlias = await r.u62();\n\t\tconst groupId = await r.u53();\n\t\tconst subGroupId = flags.hasSubgroup ? await r.u53() : 0;\n\t\tconst publisherPriority = hasPriority ? await r.u8() : 128; // Default priority when absent\n\n\t\treturn new Group({ trackAlias, groupId, subGroupId, publisherPriority, flags });\n\t}\n}\n\n/** A moq-transport object inside a group stream. */\nexport class Frame {\n\t/** The object payload, or `undefined` for the end of group marker. */\n\tpayload?: Uint8Array;\n\t/** The presentation timestamp carried in object properties, when present. */\n\ttimestamp?: Timestamp;\n\n\tconstructor({ payload, timestamp }: { payload?: Uint8Array; timestamp?: Timestamp } = {}) {\n\t\tthis.payload = payload;\n\t\tthis.timestamp = timestamp;\n\t}\n\n\t/**\n\t * Encode this frame using the group flags and negotiated IETF version.\n\t *\n\t * `idDelta` is the first object's absolute Object ID and zero for every later one, so a\n\t * group whose head was trimmed by a filter still puts the true numbering on the wire.\n\t */\n\tasync encode(w: Writer, flags: GroupFlags, timescale: Timescale, version = w.version, idDelta = 0): Promise<void> {\n\t\tawait w.u53(idDelta);\n\n\t\tif (flags.hasExtensions) {\n\t\t\tconst extensions = await encodeObjectExtensions(this.timestamp, timescale, version);\n\t\t\tawait w.u53(extensions.byteLength);\n\t\t\tawait w.write(extensions);\n\t\t}\n\n\t\tif (this.payload !== undefined) {\n\t\t\tawait w.u53(this.payload.byteLength);\n\n\t\t\tif (this.payload.byteLength === 0) {\n\t\t\t\tawait w.u53(0); // status = normal\n\t\t\t} else {\n\t\t\t\tawait w.write(this.payload);\n\t\t\t}\n\t\t} else {\n\t\t\tawait w.u53(0); // length = 0\n\t\t\tawait w.u53(GROUP_END);\n\t\t}\n\t}\n\n\t/** Decode a frame using the group flags and negotiated IETF version. */\n\tstatic async decode(\n\t\tr: Reader,\n\t\tflags: GroupFlags,\n\t\ttimescale: Timescale | undefined,\n\t\tversion = r.version,\n\t): Promise<Frame> {\n\t\t// The first object's delta is its absolute Object ID; every later one is the prior ID\n\t\t// plus the delta plus one. moq-lite groups start at object 0 and never skip one, so\n\t\t// a sequential group is a zero delta throughout, and any other value means the group\n\t\t// either starts partway through or has a gap that would renumber the frames after it.\n\t\tconst delta = await r.u53();\n\t\tif (delta !== 0) {\n\t\t\tthrow new Error(`object IDs must start at 0 and increment by 1, got a delta of ${delta}`);\n\t\t}\n\n\t\tlet timestamp: Timestamp | undefined;\n\t\tif (flags.hasExtensions) {\n\t\t\tconst extensionsLength = await r.u53();\n\t\t\tconst extensions = await r.read(extensionsLength);\n\t\t\t// A track that declared no timescale opted out of timestamps, so its objects\n\t\t\t// are stamped on arrival even if one carries a Timestamp we cannot interpret.\n\t\t\tif (timescale !== undefined) {\n\t\t\t\ttimestamp = await decodeObjectTime(new Reader(undefined, extensions, version), timescale, version);\n\t\t\t}\n\t\t}\n\n\t\tconst payloadLength = await r.u53();\n\n\t\tif (payloadLength > 0) {\n\t\t\tconst payload = await r.read(payloadLength);\n\t\t\treturn new Frame({ payload, timestamp });\n\t\t}\n\n\t\tconst status = await r.u53();\n\n\t\tif (flags.hasEnd) {\n\t\t\t// Empty frame\n\t\t\tif (status === 0) return new Frame({ payload: new Uint8Array(0), timestamp });\n\t\t} else if (status === 0 || status === GROUP_END) {\n\t\t\t// TODO status === 0 should be an empty frame, but moq-rs seems to be sending it incorrectly on group end.\n\t\t\treturn new Frame();\n\t\t}\n\n\t\tthrow new Error(`Unsupported object status: ${status}`);\n\t}\n}\n\n// Serialization Flags for a fetch object: the two low bits encode the subgroup (00 =\n// subgroup zero), then one presence bit per field.\nconst FETCH_OBJECT_ID = 0x04;\nconst FETCH_GROUP_ID = 0x08;\nconst FETCH_PRIORITY = 0x10;\nconst FETCH_PROPERTIES = 0x20;\n\n/** Where a {@link FetchFrame} sits in the track, and whether it opens the stream. */\nexport interface FetchPosition {\n\t/** The group's sequence number. */\n\tgroup: number;\n\t/** The object's id within that group. */\n\tobject: number;\n\t/** Whether this is the stream's first object, which is what carries the absolute ids. */\n\tfirst: boolean;\n}\n\n/**\n * A moq-transport object inside a fetch stream, which a publisher writes to serve a fill.\n *\n * The first object carries its absolute Group and Object IDs plus the priority; every later\n * one inherits them and increments the Object ID, so only the properties and the payload go\n * on the wire. A fetch object has no status field: a zero payload length is simply an empty\n * object.\n */\nexport class FetchFrame {\n\t/** The object payload. */\n\tpayload: Uint8Array;\n\t/** The presentation timestamp carried in object properties, when present. */\n\ttimestamp?: Timestamp;\n\n\tconstructor({ payload, timestamp }: { payload: Uint8Array; timestamp?: Timestamp }) {\n\t\tthis.payload = payload;\n\t\tthis.timestamp = timestamp;\n\t}\n\n\t/** Encode this object at `position`, stamping it in the track's timescale. */\n\tasync encode(w: Writer, position: FetchPosition, timescale: Timescale, version = w.version): Promise<void> {\n\t\tif (position.first) {\n\t\t\t// Include the priority too: \"same as the prior object\" has no prior to refer to.\n\t\t\tconst properties = this.timestamp !== undefined ? FETCH_PROPERTIES : 0;\n\t\t\tawait w.u53(FETCH_GROUP_ID | FETCH_OBJECT_ID | FETCH_PRIORITY | properties);\n\t\t\tawait w.u53(position.group);\n\t\t\tawait w.u53(position.object);\n\t\t\tawait w.u8(0);\n\t\t} else {\n\t\t\t// Same group and priority; the Object ID is the prior one plus one.\n\t\t\tawait w.u53(this.timestamp !== undefined ? FETCH_PROPERTIES : 0);\n\t\t}\n\n\t\t// Omitted entirely rather than written empty when the object carries no timestamp:\n\t\t// the track declared no units, so there is no property to send.\n\t\tif (this.timestamp !== undefined) {\n\t\t\tconst extensions = await encodeObjectExtensions(this.timestamp, timescale, version);\n\t\t\tawait w.u53(extensions.byteLength);\n\t\t\tawait w.write(extensions);\n\t\t}\n\n\t\tawait w.u53(this.payload.byteLength);\n\t\tif (this.payload.byteLength > 0) {\n\t\t\tawait w.write(this.payload);\n\t\t}\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"object.js","sourceRoot":"","sources":["../../src/ietf/object.ts"],"names":[],"mappings":"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","sourcesContent":["import { Reader, Writer } from \"../stream.ts\";\nimport { Timescale, Timestamp } from \"../time.ts\";\nimport { type IetfVersion, Version } from \"./version.ts\";\n\nconst GROUP_END = 0x03;\n\n// MOQ Object Property ids, shared with draft-ietf-moq-loc-04.\nconst PROP_TIMESCALE = 0x08n;\nconst PROP_TIMESTAMP = 0x10n;\n\n// The Timestamp id from draft-ietf-moq-loc-03, accepted on decode only. Draft-03's\n// body text and its IANA table disagreed (0x0A vs 0x06); this is the table's value,\n// which is what shipped. Draft-04 assigns 0x0A to Secure Objects private properties,\n// so it is not accepted here.\nconst PROP_TIMESTAMP_DRAFT03 = 0x06n;\n\n// draft-18 adds bit 0x40 (FIRST_OBJECT) to the subgroup header type per spec\n// 11.4.2. Set on emit unless a filter trimmed the group's head; on parse a\n// cleared bit is the peer saying its stream starts partway through a group,\n// which the subscriber drops.\nconst FIRST_OBJECT_BIT = 0x40;\n\nfunction hasFirstObjectBit(version: IetfVersion): boolean {\n\tswitch (version) {\n\t\tcase Version.DRAFT_14:\n\t\tcase Version.DRAFT_15:\n\t\tcase Version.DRAFT_16:\n\t\tcase Version.DRAFT_17:\n\t\t\treturn false;\n\t\tdefault:\n\t\t\treturn true;\n\t}\n}\n\nfunction hasDeltaObjectPropertyTypes(version: IetfVersion | undefined): boolean {\n\tswitch (version) {\n\t\tcase Version.DRAFT_14:\n\t\tcase Version.DRAFT_15:\n\t\t\treturn false;\n\t\tdefault:\n\t\t\treturn true;\n\t}\n}\n\nasync function encodeObjectPropertyType(\n\tw: Writer,\n\tid: bigint,\n\tprev: bigint,\n\tversion: IetfVersion | undefined,\n): Promise<void> {\n\tconst encoded = hasDeltaObjectPropertyTypes(version) ? id - prev : id;\n\tawait w.u62(encoded);\n}\n\n// The units come from the track's TIMESCALE property, not from here: repeating the\n// timescale on every object would cost bytes per frame to restate something fixed for\n// the track's lifetime. The timestamp is converted into the track's units so the value\n// on the wire matches what the track declared.\nasync function encodeObjectTime(\n\tw: Writer,\n\ttimestamp: Timestamp,\n\ttimescale: Timescale,\n\tversion: IetfVersion | undefined,\n): Promise<void> {\n\tconst value = Math.round((timestamp.value * timescale) / timestamp.scale);\n\tawait encodeObjectPropertyType(w, PROP_TIMESTAMP, 0n, version);\n\tawait w.u62(BigInt(value));\n}\n\nasync function encodeObjectExtensions(\n\ttimestamp: Timestamp | undefined,\n\ttimescale: Timescale,\n\tversion: IetfVersion | undefined,\n): Promise<Uint8Array> {\n\tif (timestamp === undefined) {\n\t\treturn new Uint8Array();\n\t}\n\n\tconst chunks: Uint8Array[] = [];\n\tconst writer = new Writer(\n\t\tnew WritableStream<Uint8Array>({\n\t\t\twrite(chunk) {\n\t\t\t\tchunks.push(new Uint8Array(chunk));\n\t\t\t},\n\t\t}),\n\t\tversion,\n\t);\n\tawait encodeObjectTime(writer, timestamp, timescale, version);\n\twriter.close();\n\tawait writer.closed;\n\n\tconst size = chunks.reduce((total, chunk) => total + chunk.byteLength, 0);\n\tconst result = new Uint8Array(size);\n\tlet offset = 0;\n\tfor (const chunk of chunks) {\n\t\tresult.set(chunk, offset);\n\t\toffset += chunk.byteLength;\n\t}\n\treturn result;\n}\n\nasync function decodeObjectTime(\n\tr: Reader,\n\ttimescale: Timescale | undefined,\n\tversion: IetfVersion | undefined,\n): Promise<Timestamp | undefined> {\n\tlet timestamp: bigint | undefined;\n\tlet overrideScale: bigint | undefined;\n\tlet prevType = 0n;\n\tlet first = true;\n\n\twhile (!(await r.done())) {\n\t\tconst step = await r.u62();\n\t\tconst id = !hasDeltaObjectPropertyTypes(version) || first ? step : prevType + step;\n\t\tfirst = false;\n\t\tprevType = id;\n\n\t\tif (id % 2n === 0n) {\n\t\t\tconst value = await r.u62();\n\t\t\tif (id === PROP_TIMESTAMP || id === PROP_TIMESTAMP_DRAFT03) {\n\t\t\t\ttimestamp = value;\n\t\t\t} else if (id === PROP_TIMESCALE) {\n\t\t\t\toverrideScale = value;\n\t\t\t}\n\t\t} else {\n\t\t\tconst size = await r.u53();\n\t\t\tawait r.read(size);\n\t\t}\n\t}\n\n\tif (timestamp === undefined) {\n\t\treturn undefined;\n\t}\n\n\t// An object-scope Timescale (which LOC permits) overrides the track's for this object, and\n\t// on a track that declared none it is the only statement of the units there is: a\n\t// publisher on a draft with no TIMESCALE track property (Norsk on draft-16) can say\n\t// nothing else. A Timestamp with no units anywhere cannot be interpreted; guessing them\n\t// would be worse than the arrival stamp the caller falls back to.\n\tconst scale = overrideScale !== undefined ? Timescale(Number(overrideScale)) : timescale;\n\tif (scale === undefined) {\n\t\treturn undefined;\n\t}\n\treturn new Timestamp(Number(timestamp), scale);\n}\n\nexport interface GroupFlags {\n\thasExtensions: boolean;\n\thasSubgroup: boolean;\n\thasSubgroupObject: boolean;\n\thasEnd: boolean;\n\t// v15: whether priority is present in the header.\n\t// When false (0x30 base), priority inherits from the control message.\n\thasPriority: boolean;\n\t/**\n\t * Whether this stream carries the subgroup from its first published object.\n\t *\n\t * A subgroup that starts partway through has a hole at the front, which moq-lite cannot\n\t * represent. Always true on the drafts that predate the FIRST_OBJECT bit (before\n\t * draft-18), where there is no such signal to read.\n\t */\n\tfirstObject: boolean;\n}\n\n/**\n * STREAM_HEADER_SUBGROUP from moq-transport spec.\n * Used for stream-per-group delivery mode.\n */\nexport class Group {\n\tflags: GroupFlags;\n\ttrackAlias: bigint;\n\tgroupId: number;\n\tsubGroupId: number;\n\tpublisherPriority: number;\n\n\tconstructor({\n\t\ttrackAlias,\n\t\tgroupId,\n\t\tsubGroupId,\n\t\tpublisherPriority,\n\t\tflags,\n\t}: {\n\t\ttrackAlias: bigint;\n\t\tgroupId: number;\n\t\tsubGroupId: number;\n\t\tpublisherPriority: number;\n\t\tflags: GroupFlags;\n\t}) {\n\t\tthis.flags = flags;\n\t\tthis.trackAlias = trackAlias;\n\t\tthis.groupId = groupId;\n\t\tthis.subGroupId = subGroupId;\n\t\tthis.publisherPriority = publisherPriority;\n\t}\n\n\tasync encode(w: Writer, version: IetfVersion): Promise<void> {\n\t\tif (!this.flags.hasSubgroup && this.subGroupId !== 0) {\n\t\t\tthrow new Error(`Subgroup ID must be 0 if hasSubgroup is false: ${this.subGroupId}`);\n\t\t}\n\n\t\tconst base = this.flags.hasPriority ? 0x10 : 0x30;\n\t\tlet id = base;\n\t\tif (this.flags.hasExtensions) {\n\t\t\tid |= 0x01;\n\t\t}\n\t\tif (this.flags.hasSubgroupObject) {\n\t\t\tid |= 0x02;\n\t\t}\n\t\tif (this.flags.hasSubgroup) {\n\t\t\tid |= 0x04;\n\t\t}\n\t\tif (this.flags.hasEnd) {\n\t\t\tid |= 0x08;\n\t\t}\n\t\tif (this.flags.firstObject && hasFirstObjectBit(version)) {\n\t\t\tid |= FIRST_OBJECT_BIT;\n\t\t}\n\t\tawait w.u53(id);\n\t\tawait w.u62(this.trackAlias);\n\t\tawait w.u53(this.groupId);\n\t\tif (this.flags.hasSubgroup) {\n\t\t\tawait w.u53(this.subGroupId);\n\t\t}\n\t\tif (this.flags.hasPriority) {\n\t\t\tawait w.u8(this.publisherPriority);\n\t\t}\n\t}\n\n\tstatic async decode(r: Reader, version: IetfVersion): Promise<Group> {\n\t\tconst raw = await r.u53();\n\t\t// Strip the draft-18 FIRST_OBJECT bit before the range check, but keep the value:\n\t\t// it is the only signal that a subgroup starts partway through. Drafts that predate\n\t\t// it carry no such signal, so they are taken at their word.\n\t\tconst legacy = !hasFirstObjectBit(version);\n\t\tconst firstObject = legacy || (raw & FIRST_OBJECT_BIT) !== 0;\n\t\tconst id = legacy ? raw : raw & ~FIRST_OBJECT_BIT;\n\n\t\tlet hasPriority: boolean;\n\t\tlet baseId: number;\n\t\tif (id >= 0x10 && id <= 0x1f) {\n\t\t\thasPriority = true;\n\t\t\tbaseId = id;\n\t\t} else if (id >= 0x30 && id <= 0x3f) {\n\t\t\thasPriority = false;\n\t\t\tbaseId = id - (0x30 - 0x10);\n\t\t} else {\n\t\t\tthrow new Error(`Unsupported group type: ${id}`);\n\t\t}\n\n\t\tconst flags: GroupFlags = {\n\t\t\thasExtensions: (baseId & 0x01) !== 0,\n\t\t\thasSubgroupObject: (baseId & 0x02) !== 0,\n\t\t\thasSubgroup: (baseId & 0x04) !== 0,\n\t\t\thasEnd: (baseId & 0x08) !== 0,\n\t\t\thasPriority,\n\t\t\tfirstObject,\n\t\t};\n\n\t\tconst trackAlias = await r.u62();\n\t\tconst groupId = await r.u53();\n\t\tconst subGroupId = flags.hasSubgroup ? await r.u53() : 0;\n\t\tconst publisherPriority = hasPriority ? await r.u8() : 128; // Default priority when absent\n\n\t\treturn new Group({ trackAlias, groupId, subGroupId, publisherPriority, flags });\n\t}\n}\n\n/** A moq-transport object inside a group stream. */\nexport class Frame {\n\t/** The object payload, or `undefined` for the end of group marker. */\n\tpayload?: Uint8Array;\n\t/** The presentation timestamp carried in object properties, when present. */\n\ttimestamp?: Timestamp;\n\n\tconstructor({ payload, timestamp }: { payload?: Uint8Array; timestamp?: Timestamp } = {}) {\n\t\tthis.payload = payload;\n\t\tthis.timestamp = timestamp;\n\t}\n\n\t/**\n\t * Encode this frame using the group flags and negotiated IETF version.\n\t *\n\t * `idDelta` is the first object's absolute Object ID and zero for every later one, so a\n\t * group whose head was trimmed by a filter still puts the true numbering on the wire.\n\t */\n\tasync encode(w: Writer, flags: GroupFlags, timescale: Timescale, version = w.version, idDelta = 0): Promise<void> {\n\t\tawait w.u53(idDelta);\n\n\t\tif (flags.hasExtensions) {\n\t\t\tconst extensions = await encodeObjectExtensions(this.timestamp, timescale, version);\n\t\t\tawait w.u53(extensions.byteLength);\n\t\t\tawait w.write(extensions);\n\t\t}\n\n\t\tif (this.payload !== undefined) {\n\t\t\tawait w.u53(this.payload.byteLength);\n\n\t\t\tif (this.payload.byteLength === 0) {\n\t\t\t\tawait w.u53(0); // status = normal\n\t\t\t} else {\n\t\t\t\tawait w.write(this.payload);\n\t\t\t}\n\t\t} else {\n\t\t\tawait w.u53(0); // length = 0\n\t\t\tawait w.u53(GROUP_END);\n\t\t}\n\t}\n\n\t/** Decode a frame using the group flags and negotiated IETF version. */\n\tstatic async decode(\n\t\tr: Reader,\n\t\tflags: GroupFlags,\n\t\ttimescale: Timescale | undefined,\n\t\tversion = r.version,\n\t): Promise<Frame> {\n\t\t// The first object's delta is its absolute Object ID; every later one is the prior ID\n\t\t// plus the delta plus one. moq-lite groups start at object 0 and never skip one, so\n\t\t// a sequential group is a zero delta throughout, and any other value means the group\n\t\t// either starts partway through or has a gap that would renumber the frames after it.\n\t\tconst delta = await r.u53();\n\t\tif (delta !== 0) {\n\t\t\tthrow new Error(`object IDs must start at 0 and increment by 1, got a delta of ${delta}`);\n\t\t}\n\n\t\tlet timestamp: Timestamp | undefined;\n\t\tif (flags.hasExtensions) {\n\t\t\tconst extensionsLength = await r.u53();\n\t\t\tconst extensions = await r.read(extensionsLength);\n\t\t\t// The track's TIMESCALE gives the units, or the object's own does; an object with\n\t\t\t// neither is stamped on arrival by the caller, even if it carries a Timestamp.\n\t\t\ttimestamp = await decodeObjectTime(new Reader(undefined, extensions, version), timescale, version);\n\t\t}\n\n\t\tconst payloadLength = await r.u53();\n\n\t\tif (payloadLength > 0) {\n\t\t\tconst payload = await r.read(payloadLength);\n\t\t\treturn new Frame({ payload, timestamp });\n\t\t}\n\n\t\tconst status = await r.u53();\n\n\t\tif (flags.hasEnd) {\n\t\t\t// Empty frame\n\t\t\tif (status === 0) return new Frame({ payload: new Uint8Array(0), timestamp });\n\t\t} else if (status === 0 || status === GROUP_END) {\n\t\t\t// TODO status === 0 should be an empty frame, but moq-rs seems to be sending it incorrectly on group end.\n\t\t\treturn new Frame();\n\t\t}\n\n\t\tthrow new Error(`Unsupported object status: ${status}`);\n\t}\n}\n\n// Serialization Flags for a fetch object: the two low bits encode the subgroup (00 =\n// subgroup zero), then one presence bit per field.\nconst FETCH_OBJECT_ID = 0x04;\nconst FETCH_GROUP_ID = 0x08;\nconst FETCH_PRIORITY = 0x10;\nconst FETCH_PROPERTIES = 0x20;\n\n/** Where a {@link FetchFrame} sits in the track, and whether it opens the stream. */\nexport interface FetchPosition {\n\t/** The group's sequence number. */\n\tgroup: number;\n\t/** The object's id within that group. */\n\tobject: number;\n\t/** Whether this is the stream's first object, which is what carries the absolute ids. */\n\tfirst: boolean;\n}\n\n/**\n * A moq-transport object inside a fetch stream, which a publisher writes to serve a fill.\n *\n * The first object carries its absolute Group and Object IDs plus the priority; every later\n * one inherits them and increments the Object ID, so only the properties and the payload go\n * on the wire. A fetch object has no status field: a zero payload length is simply an empty\n * object.\n */\nexport class FetchFrame {\n\t/** The object payload. */\n\tpayload: Uint8Array;\n\t/** The presentation timestamp carried in object properties, when present. */\n\ttimestamp?: Timestamp;\n\n\tconstructor({ payload, timestamp }: { payload: Uint8Array; timestamp?: Timestamp }) {\n\t\tthis.payload = payload;\n\t\tthis.timestamp = timestamp;\n\t}\n\n\t/** Encode this object at `position`, stamping it in the track's timescale. */\n\tasync encode(w: Writer, position: FetchPosition, timescale: Timescale, version = w.version): Promise<void> {\n\t\tif (position.first) {\n\t\t\t// Include the priority too: \"same as the prior object\" has no prior to refer to.\n\t\t\tconst properties = this.timestamp !== undefined ? FETCH_PROPERTIES : 0;\n\t\t\tawait w.u53(FETCH_GROUP_ID | FETCH_OBJECT_ID | FETCH_PRIORITY | properties);\n\t\t\tawait w.u53(position.group);\n\t\t\tawait w.u53(position.object);\n\t\t\tawait w.u8(0);\n\t\t} else {\n\t\t\t// Same group and priority; the Object ID is the prior one plus one.\n\t\t\tawait w.u53(this.timestamp !== undefined ? FETCH_PROPERTIES : 0);\n\t\t}\n\n\t\t// Omitted entirely rather than written empty when the object carries no timestamp:\n\t\t// the track declared no units, so there is no property to send.\n\t\tif (this.timestamp !== undefined) {\n\t\t\tconst extensions = await encodeObjectExtensions(this.timestamp, timescale, version);\n\t\t\tawait w.u53(extensions.byteLength);\n\t\t\tawait w.write(extensions);\n\t\t}\n\n\t\tawait w.u53(this.payload.byteLength);\n\t\tif (this.payload.byteLength > 0) {\n\t\t\tawait w.write(this.payload);\n\t\t}\n\t}\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@norskvideo/moq-net",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.7",
|
|
5
5
|
"description": "The networking layer for Media over QUIC: real-time pub/sub with built-in caching, fan-out, and prioritization.",
|
|
6
6
|
"license": "(MIT OR Apache-2.0)",
|
|
7
7
|
"repository": "github:moq-dev/moq",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"@moq/qmux": "^0.3.3",
|
|
21
21
|
"async-mutex": "^0.5.0",
|
|
22
22
|
"bowser": "^2.14.1",
|
|
23
|
-
"@norskvideo/moq-signals": "^0.1.
|
|
23
|
+
"@norskvideo/moq-signals": "^0.1.7"
|
|
24
24
|
},
|
|
25
25
|
"peerDependencies": {
|
|
26
26
|
"zod": "^4.4.3"
|