@norskvideo/moq-net 0.1.2 → 0.1.4
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/README.md +1 -0
- package/announced.d.ts +111 -21
- package/announced.d.ts.map +1 -1
- package/announced.js +213 -40
- package/announced.js.map +1 -1
- package/broadcast.d.ts +80 -25
- package/broadcast.d.ts.map +1 -1
- package/broadcast.js +270 -49
- package/broadcast.js.map +1 -1
- package/connection/accept.d.ts +6 -0
- package/connection/accept.d.ts.map +1 -1
- package/connection/accept.js +42 -13
- package/connection/accept.js.map +1 -1
- package/connection/browser.d.ts +5 -0
- package/connection/browser.d.ts.map +1 -0
- package/connection/browser.js +31 -0
- package/connection/browser.js.map +1 -0
- package/connection/connect.d.ts +43 -1
- package/connection/connect.d.ts.map +1 -1
- package/connection/connect.js +118 -123
- package/connection/connect.js.map +1 -1
- package/connection/established.d.ts +43 -16
- package/connection/established.d.ts.map +1 -1
- package/connection/established.js.map +1 -1
- package/connection/handshake.d.ts +12 -1
- package/connection/handshake.d.ts.map +1 -1
- package/connection/handshake.js +30 -14
- package/connection/handshake.js.map +1 -1
- package/connection/index.d.ts +8 -0
- package/connection/index.d.ts.map +1 -1
- package/connection/index.js +6 -0
- package/connection/index.js.map +1 -1
- package/connection/reload.d.ts +66 -9
- package/connection/reload.d.ts.map +1 -1
- package/connection/reload.js +192 -66
- package/connection/reload.js.map +1 -1
- package/connection/stats.d.ts +92 -0
- package/connection/stats.d.ts.map +1 -0
- package/connection/stats.js +35 -0
- package/connection/stats.js.map +1 -0
- package/connection/transport.d.ts +10 -0
- package/connection/transport.d.ts.map +1 -0
- package/connection/transport.js +12 -0
- package/connection/transport.js.map +1 -0
- package/consume.d.ts +44 -0
- package/consume.d.ts.map +1 -0
- package/consume.js +60 -0
- package/consume.js.map +1 -0
- package/datagram.d.ts +23 -0
- package/datagram.d.ts.map +1 -0
- package/datagram.js +3 -0
- package/datagram.js.map +1 -0
- package/error.d.ts +76 -0
- package/error.d.ts.map +1 -0
- package/error.js +107 -0
- package/error.js.map +1 -0
- package/group.d.ts +143 -38
- package/group.d.ts.map +1 -1
- package/group.js +270 -68
- package/group.js.map +1 -1
- package/ietf/adapter.d.ts +2 -2
- package/ietf/adapter.d.ts.map +1 -1
- package/ietf/adapter.js +20 -10
- package/ietf/adapter.js.map +1 -1
- package/ietf/aliases.d.ts +73 -5
- package/ietf/aliases.d.ts.map +1 -1
- package/ietf/aliases.js +121 -14
- package/ietf/aliases.js.map +1 -1
- package/ietf/cluster.d.ts +141 -0
- package/ietf/cluster.d.ts.map +1 -0
- package/ietf/cluster.js +204 -0
- package/ietf/cluster.js.map +1 -0
- package/ietf/connection.d.ts +39 -6
- package/ietf/connection.d.ts.map +1 -1
- package/ietf/connection.js +73 -12
- package/ietf/connection.js.map +1 -1
- package/ietf/fetch.d.ts +17 -0
- package/ietf/fetch.d.ts.map +1 -1
- package/ietf/fetch.js +21 -0
- package/ietf/fetch.js.map +1 -1
- package/ietf/filter.d.ts +87 -0
- package/ietf/filter.d.ts.map +1 -0
- package/ietf/filter.js +292 -0
- package/ietf/filter.js.map +1 -0
- package/ietf/index.d.ts +2 -0
- package/ietf/index.d.ts.map +1 -1
- package/ietf/index.js +3 -0
- package/ietf/index.js.map +1 -1
- package/ietf/namespace.d.ts +6 -0
- package/ietf/namespace.d.ts.map +1 -1
- package/ietf/namespace.js +27 -2
- package/ietf/namespace.js.map +1 -1
- package/ietf/object.d.ts +54 -6
- package/ietf/object.d.ts.map +1 -1
- package/ietf/object.js +178 -25
- package/ietf/object.js.map +1 -1
- package/ietf/parameters.d.ts +35 -10
- package/ietf/parameters.d.ts.map +1 -1
- package/ietf/parameters.js +236 -45
- package/ietf/parameters.js.map +1 -1
- package/ietf/priority.d.ts +5 -0
- package/ietf/priority.d.ts.map +1 -0
- package/ietf/priority.js +10 -0
- package/ietf/priority.js.map +1 -0
- package/ietf/properties.d.ts +13 -2
- package/ietf/properties.d.ts.map +1 -1
- package/ietf/properties.js +65 -8
- package/ietf/properties.js.map +1 -1
- package/ietf/publish.d.ts.map +1 -1
- package/ietf/publish.js +13 -3
- package/ietf/publish.js.map +1 -1
- package/ietf/publish_namespace.d.ts +16 -2
- package/ietf/publish_namespace.d.ts.map +1 -1
- package/ietf/publish_namespace.js +25 -6
- package/ietf/publish_namespace.js.map +1 -1
- package/ietf/publisher.d.ts +40 -7
- package/ietf/publisher.d.ts.map +1 -1
- package/ietf/publisher.js +751 -134
- package/ietf/publisher.js.map +1 -1
- package/ietf/request.js +1 -1
- package/ietf/request.js.map +1 -1
- package/ietf/solicit.d.ts +41 -0
- package/ietf/solicit.d.ts.map +1 -0
- package/ietf/solicit.js +47 -0
- package/ietf/solicit.js.map +1 -0
- package/ietf/subscribe.d.ts +41 -2
- package/ietf/subscribe.d.ts.map +1 -1
- package/ietf/subscribe.js +103 -22
- package/ietf/subscribe.js.map +1 -1
- package/ietf/subscribe_namespace.d.ts +21 -7
- package/ietf/subscribe_namespace.d.ts.map +1 -1
- package/ietf/subscribe_namespace.js +31 -14
- package/ietf/subscribe_namespace.js.map +1 -1
- package/ietf/subscriber.d.ts +20 -7
- package/ietf/subscriber.d.ts.map +1 -1
- package/ietf/subscriber.js +512 -142
- package/ietf/subscriber.js.map +1 -1
- package/ietf/version.d.ts +7 -1
- package/ietf/version.d.ts.map +1 -1
- package/ietf/version.js +7 -0
- package/ietf/version.js.map +1 -1
- package/index.d.ts +10 -5
- package/index.d.ts.map +1 -1
- package/index.js +10 -5
- package/index.js.map +1 -1
- package/internal.d.ts +29 -0
- package/internal.d.ts.map +1 -0
- package/internal.js +8 -0
- package/internal.js.map +1 -0
- package/lite/announce.d.ts +62 -15
- package/lite/announce.d.ts.map +1 -1
- package/lite/announce.js +230 -94
- package/lite/announce.js.map +1 -1
- package/lite/connection.d.ts +69 -20
- package/lite/connection.d.ts.map +1 -1
- package/lite/connection.js +128 -81
- package/lite/connection.js.map +1 -1
- package/lite/datagram.d.ts +23 -0
- package/lite/datagram.d.ts.map +1 -0
- package/lite/datagram.js +57 -0
- package/lite/datagram.js.map +1 -0
- package/lite/datagram_stream.d.ts +8 -0
- package/lite/datagram_stream.d.ts.map +1 -0
- package/lite/datagram_stream.js +44 -0
- package/lite/datagram_stream.js.map +1 -0
- package/lite/fetch.d.ts.map +1 -1
- package/lite/fetch.js +2 -2
- package/lite/fetch.js.map +1 -1
- package/lite/index.d.ts +3 -0
- package/lite/index.d.ts.map +1 -1
- package/lite/index.js +3 -0
- package/lite/index.js.map +1 -1
- package/lite/priority.d.ts +67 -0
- package/lite/priority.d.ts.map +1 -0
- package/lite/priority.js +114 -0
- package/lite/priority.js.map +1 -0
- package/lite/probe.d.ts +18 -2
- package/lite/probe.d.ts.map +1 -1
- package/lite/probe.js +24 -22
- package/lite/probe.js.map +1 -1
- package/lite/publisher.d.ts +14 -7
- package/lite/publisher.d.ts.map +1 -1
- package/lite/publisher.js +406 -84
- package/lite/publisher.js.map +1 -1
- package/lite/setup.d.ts +83 -6
- package/lite/setup.d.ts.map +1 -1
- package/lite/setup.js +203 -31
- package/lite/setup.js.map +1 -1
- package/lite/stream.d.ts +12 -3
- package/lite/stream.d.ts.map +1 -1
- package/lite/stream.js +7 -4
- package/lite/stream.js.map +1 -1
- package/lite/subscribe.d.ts +37 -23
- package/lite/subscribe.d.ts.map +1 -1
- package/lite/subscribe.js +70 -55
- package/lite/subscribe.js.map +1 -1
- package/lite/subscriber.d.ts +29 -23
- package/lite/subscriber.d.ts.map +1 -1
- package/lite/subscriber.js +689 -112
- package/lite/subscriber.js.map +1 -1
- package/lite/track.d.ts +25 -13
- package/lite/track.d.ts.map +1 -1
- package/lite/track.js +60 -35
- package/lite/track.js.map +1 -1
- package/lite/version.d.ts +39 -4
- package/lite/version.d.ts.map +1 -1
- package/lite/version.js +139 -17
- package/lite/version.js.map +1 -1
- package/mock.d.ts +53 -3
- package/mock.d.ts.map +1 -1
- package/mock.js +110 -21
- package/mock.js.map +1 -1
- package/{lite/origin.d.ts → origin.d.ts} +25 -1
- package/origin.d.ts.map +1 -0
- package/{lite/origin.js → origin.js} +25 -1
- package/origin.js.map +1 -0
- package/package.json +6 -4
- package/path.d.ts +67 -0
- package/path.d.ts.map +1 -1
- package/path.js +128 -0
- package/path.js.map +1 -1
- package/stream.d.ts +94 -4
- package/stream.d.ts.map +1 -1
- package/stream.js +128 -17
- package/stream.js.map +1 -1
- package/time.d.ts +109 -86
- package/time.d.ts.map +1 -1
- package/time.js +80 -30
- package/time.js.map +1 -1
- package/track.d.ts +298 -47
- package/track.d.ts.map +1 -1
- package/track.js +721 -109
- package/track.js.map +1 -1
- package/util/timeout.d.ts +5 -0
- package/util/timeout.d.ts.map +1 -0
- package/util/timeout.js +18 -0
- package/util/timeout.js.map +1 -0
- package/util/utf8.d.ts +3 -0
- package/util/utf8.d.ts.map +1 -0
- package/util/utf8.js +7 -0
- package/util/utf8.js.map +1 -0
- package/varint.d.ts +14 -3
- package/varint.d.ts.map +1 -1
- package/varint.js +23 -12
- package/varint.js.map +1 -1
- package/zod.d.ts +5 -5
- package/zod.d.ts.map +1 -1
- package/zod.js.map +1 -1
- package/bandwidth.d.ts +0 -11
- package/bandwidth.d.ts.map +0 -1
- package/bandwidth.js +0 -7
- package/bandwidth.js.map +0 -1
- package/connection/cert.test.d.ts +0 -2
- package/connection/cert.test.d.ts.map +0 -1
- package/connection/cert.test.js +0 -26
- package/connection/cert.test.js.map +0 -1
- package/connection/reload.test.d.ts +0 -2
- package/connection/reload.test.d.ts.map +0 -1
- package/connection/reload.test.js +0 -39
- package/connection/reload.test.js.map +0 -1
- package/group.test.d.ts +0 -2
- package/group.test.d.ts.map +0 -1
- package/group.test.js +0 -66
- package/group.test.js.map +0 -1
- package/ietf/aliases.test.d.ts +0 -2
- package/ietf/aliases.test.d.ts.map +0 -1
- package/ietf/aliases.test.js +0 -30
- package/ietf/aliases.test.js.map +0 -1
- package/ietf/ietf.test.d.ts +0 -2
- package/ietf/ietf.test.d.ts.map +0 -1
- package/ietf/ietf.test.js +0 -873
- package/ietf/ietf.test.js.map +0 -1
- package/integration.test.d.ts +0 -2
- package/integration.test.d.ts.map +0 -1
- package/integration.test.js +0 -90
- package/integration.test.js.map +0 -1
- package/lite/origin.d.ts.map +0 -1
- package/lite/origin.js.map +0 -1
- package/lite/subscriber.test.d.ts +0 -2
- package/lite/subscriber.test.d.ts.map +0 -1
- package/lite/subscriber.test.js +0 -30
- package/lite/subscriber.test.js.map +0 -1
- package/lite/track.test.d.ts +0 -2
- package/lite/track.test.d.ts.map +0 -1
- package/lite/track.test.js +0 -53
- package/lite/track.test.js.map +0 -1
- package/path.test.d.ts +0 -2
- package/path.test.d.ts.map +0 -1
- package/path.test.js +0 -169
- package/path.test.js.map +0 -1
- package/stream.test.d.ts +0 -2
- package/stream.test.d.ts.map +0 -1
- package/stream.test.js +0 -210
- package/stream.test.js.map +0 -1
- package/track.test.d.ts +0 -2
- package/track.test.d.ts.map +0 -1
- package/track.test.js +0 -56
- package/track.test.js.map +0 -1
- package/util/error.d.ts +0 -3
- package/util/error.d.ts.map +0 -1
- package/util/error.js +0 -9
- package/util/error.js.map +0 -1
- package/util/index.d.ts +0 -2
- package/util/index.d.ts.map +0 -1
- package/util/index.js +0 -3
- package/util/index.js.map +0 -1
- package/varint.test.d.ts +0 -2
- package/varint.test.d.ts.map +0 -1
- package/varint.test.js +0 -106
- package/varint.test.js.map +0 -1
package/ietf/object.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { Reader, Writer } from "../stream";
|
|
2
|
+
import { Timescale, Timestamp } from "../time";
|
|
2
3
|
import { type IetfVersion } from "./version";
|
|
3
4
|
export interface GroupFlags {
|
|
4
5
|
hasExtensions: boolean;
|
|
@@ -6,6 +7,14 @@ export interface GroupFlags {
|
|
|
6
7
|
hasSubgroupObject: boolean;
|
|
7
8
|
hasEnd: boolean;
|
|
8
9
|
hasPriority: boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Whether this stream carries the subgroup from its first published object.
|
|
12
|
+
*
|
|
13
|
+
* A subgroup that starts partway through has a hole at the front, which moq-lite cannot
|
|
14
|
+
* represent. Always true on the drafts that predate the FIRST_OBJECT bit (before
|
|
15
|
+
* draft-18), where there is no such signal to read.
|
|
16
|
+
*/
|
|
17
|
+
firstObject: boolean;
|
|
9
18
|
}
|
|
10
19
|
/**
|
|
11
20
|
* STREAM_HEADER_SUBGROUP from moq-transport spec.
|
|
@@ -27,14 +36,53 @@ export declare class Group {
|
|
|
27
36
|
encode(w: Writer, version: IetfVersion): Promise<void>;
|
|
28
37
|
static decode(r: Reader, version: IetfVersion): Promise<Group>;
|
|
29
38
|
}
|
|
39
|
+
/** A moq-transport object inside a group stream. */
|
|
30
40
|
export declare class Frame {
|
|
41
|
+
/** The object payload, or `undefined` for the end of group marker. */
|
|
31
42
|
payload?: Uint8Array;
|
|
32
|
-
|
|
33
|
-
|
|
43
|
+
/** The presentation timestamp carried in object properties, when present. */
|
|
44
|
+
timestamp?: Timestamp;
|
|
45
|
+
constructor({ payload, timestamp }?: {
|
|
34
46
|
payload?: Uint8Array;
|
|
35
|
-
|
|
47
|
+
timestamp?: Timestamp;
|
|
36
48
|
});
|
|
37
|
-
|
|
38
|
-
|
|
49
|
+
/**
|
|
50
|
+
* Encode this frame using the group flags and negotiated IETF version.
|
|
51
|
+
*
|
|
52
|
+
* `idDelta` is the first object's absolute Object ID and zero for every later one, so a
|
|
53
|
+
* group whose head was trimmed by a filter still puts the true numbering on the wire.
|
|
54
|
+
*/
|
|
55
|
+
encode(w: Writer, flags: GroupFlags, timescale: Timescale, version?: IetfVersion | undefined, idDelta?: number): Promise<void>;
|
|
56
|
+
/** Decode a frame using the group flags and negotiated IETF version. */
|
|
57
|
+
static decode(r: Reader, flags: GroupFlags, timescale: Timescale | undefined, version?: IetfVersion | undefined): Promise<Frame>;
|
|
58
|
+
}
|
|
59
|
+
/** Where a {@link FetchFrame} sits in the track, and whether it opens the stream. */
|
|
60
|
+
export interface FetchPosition {
|
|
61
|
+
/** The group's sequence number. */
|
|
62
|
+
group: number;
|
|
63
|
+
/** The object's id within that group. */
|
|
64
|
+
object: number;
|
|
65
|
+
/** Whether this is the stream's first object, which is what carries the absolute ids. */
|
|
66
|
+
first: boolean;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* A moq-transport object inside a fetch stream, which a publisher writes to serve a fill.
|
|
70
|
+
*
|
|
71
|
+
* The first object carries its absolute Group and Object IDs plus the priority; every later
|
|
72
|
+
* one inherits them and increments the Object ID, so only the properties and the payload go
|
|
73
|
+
* on the wire. A fetch object has no status field: a zero payload length is simply an empty
|
|
74
|
+
* object.
|
|
75
|
+
*/
|
|
76
|
+
export declare class FetchFrame {
|
|
77
|
+
/** The object payload. */
|
|
78
|
+
payload: Uint8Array;
|
|
79
|
+
/** The presentation timestamp carried in object properties, when present. */
|
|
80
|
+
timestamp?: Timestamp;
|
|
81
|
+
constructor({ payload, timestamp }: {
|
|
82
|
+
payload: Uint8Array;
|
|
83
|
+
timestamp?: Timestamp;
|
|
84
|
+
});
|
|
85
|
+
/** Encode this object at `position`, stamping it in the track's timescale. */
|
|
86
|
+
encode(w: Writer, position: FetchPosition, timescale: Timescale, version?: IetfVersion | undefined): Promise<void>;
|
|
39
87
|
}
|
|
40
88
|
//# sourceMappingURL=object.d.ts.map
|
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,
|
|
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;AAwIzD,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,CAuChB;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
|
@@ -1,9 +1,20 @@
|
|
|
1
1
|
/* @ts-self-types="./object.d.ts" */
|
|
2
|
+
import { Reader, Writer } from "../stream.js";
|
|
3
|
+
import { Timescale, Timestamp } from "../time.js";
|
|
2
4
|
import { Version } from "./version.js";
|
|
3
5
|
const GROUP_END = 0x03;
|
|
6
|
+
// MOQ Object Property ids, shared with draft-ietf-moq-loc-04.
|
|
7
|
+
const PROP_TIMESCALE = 0x08n;
|
|
8
|
+
const PROP_TIMESTAMP = 0x10n;
|
|
9
|
+
// The Timestamp id from draft-ietf-moq-loc-03, accepted on decode only. Draft-03's
|
|
10
|
+
// body text and its IANA table disagreed (0x0A vs 0x06); this is the table's value,
|
|
11
|
+
// which is what shipped. Draft-04 assigns 0x0A to Secure Objects private properties,
|
|
12
|
+
// so it is not accepted here.
|
|
13
|
+
const PROP_TIMESTAMP_DRAFT03 = 0x06n;
|
|
4
14
|
// draft-18 adds bit 0x40 (FIRST_OBJECT) to the subgroup header type per spec
|
|
5
|
-
// 11.4.2.
|
|
6
|
-
//
|
|
15
|
+
// 11.4.2. Set on emit unless a filter trimmed the group's head; on parse a
|
|
16
|
+
// cleared bit is the peer saying its stream starts partway through a group,
|
|
17
|
+
// which the subscriber drops.
|
|
7
18
|
const FIRST_OBJECT_BIT = 0x40;
|
|
8
19
|
function hasFirstObjectBit(version) {
|
|
9
20
|
switch (version) {
|
|
@@ -16,6 +27,80 @@ function hasFirstObjectBit(version) {
|
|
|
16
27
|
return true;
|
|
17
28
|
}
|
|
18
29
|
}
|
|
30
|
+
function hasDeltaObjectPropertyTypes(version) {
|
|
31
|
+
switch (version) {
|
|
32
|
+
case Version.DRAFT_14:
|
|
33
|
+
case Version.DRAFT_15:
|
|
34
|
+
return false;
|
|
35
|
+
default:
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
async function encodeObjectPropertyType(w, id, prev, version) {
|
|
40
|
+
const encoded = hasDeltaObjectPropertyTypes(version) ? id - prev : id;
|
|
41
|
+
await w.u62(encoded);
|
|
42
|
+
}
|
|
43
|
+
// The units come from the track's TIMESCALE property, not from here: repeating the
|
|
44
|
+
// timescale on every object would cost bytes per frame to restate something fixed for
|
|
45
|
+
// the track's lifetime. The timestamp is converted into the track's units so the value
|
|
46
|
+
// on the wire matches what the track declared.
|
|
47
|
+
async function encodeObjectTime(w, timestamp, timescale, version) {
|
|
48
|
+
const value = Math.round((timestamp.value * timescale) / timestamp.scale);
|
|
49
|
+
await encodeObjectPropertyType(w, PROP_TIMESTAMP, 0n, version);
|
|
50
|
+
await w.u62(BigInt(value));
|
|
51
|
+
}
|
|
52
|
+
async function encodeObjectExtensions(timestamp, timescale, version) {
|
|
53
|
+
if (timestamp === undefined) {
|
|
54
|
+
return new Uint8Array();
|
|
55
|
+
}
|
|
56
|
+
const chunks = [];
|
|
57
|
+
const writer = new Writer(new WritableStream({
|
|
58
|
+
write(chunk) {
|
|
59
|
+
chunks.push(new Uint8Array(chunk));
|
|
60
|
+
},
|
|
61
|
+
}), version);
|
|
62
|
+
await encodeObjectTime(writer, timestamp, timescale, version);
|
|
63
|
+
writer.close();
|
|
64
|
+
await writer.closed;
|
|
65
|
+
const size = chunks.reduce((total, chunk) => total + chunk.byteLength, 0);
|
|
66
|
+
const result = new Uint8Array(size);
|
|
67
|
+
let offset = 0;
|
|
68
|
+
for (const chunk of chunks) {
|
|
69
|
+
result.set(chunk, offset);
|
|
70
|
+
offset += chunk.byteLength;
|
|
71
|
+
}
|
|
72
|
+
return result;
|
|
73
|
+
}
|
|
74
|
+
async function decodeObjectTime(r, timescale, version) {
|
|
75
|
+
let timestamp;
|
|
76
|
+
let overrideScale;
|
|
77
|
+
let prevType = 0n;
|
|
78
|
+
let first = true;
|
|
79
|
+
while (!(await r.done())) {
|
|
80
|
+
const step = await r.u62();
|
|
81
|
+
const id = !hasDeltaObjectPropertyTypes(version) || first ? step : prevType + step;
|
|
82
|
+
first = false;
|
|
83
|
+
prevType = id;
|
|
84
|
+
if (id % 2n === 0n) {
|
|
85
|
+
const value = await r.u62();
|
|
86
|
+
if (id === PROP_TIMESTAMP || id === PROP_TIMESTAMP_DRAFT03) {
|
|
87
|
+
timestamp = value;
|
|
88
|
+
}
|
|
89
|
+
else if (id === PROP_TIMESCALE) {
|
|
90
|
+
overrideScale = value;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
const size = await r.u53();
|
|
95
|
+
await r.read(size);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (timestamp === undefined) {
|
|
99
|
+
return undefined;
|
|
100
|
+
}
|
|
101
|
+
// An object-scope Timescale (which LOC permits) overrides the track's for this object.
|
|
102
|
+
return new Timestamp(Number(timestamp), overrideScale !== undefined ? Timescale(Number(overrideScale)) : timescale);
|
|
103
|
+
}
|
|
19
104
|
/**
|
|
20
105
|
* STREAM_HEADER_SUBGROUP from moq-transport spec.
|
|
21
106
|
* Used for stream-per-group delivery mode.
|
|
@@ -51,7 +136,7 @@ export class Group {
|
|
|
51
136
|
if (this.flags.hasEnd) {
|
|
52
137
|
id |= 0x08;
|
|
53
138
|
}
|
|
54
|
-
if (hasFirstObjectBit(version)) {
|
|
139
|
+
if (this.flags.firstObject && hasFirstObjectBit(version)) {
|
|
55
140
|
id |= FIRST_OBJECT_BIT;
|
|
56
141
|
}
|
|
57
142
|
await w.u53(id);
|
|
@@ -66,8 +151,12 @@ export class Group {
|
|
|
66
151
|
}
|
|
67
152
|
static async decode(r, version) {
|
|
68
153
|
const raw = await r.u53();
|
|
69
|
-
// Strip the draft-18 FIRST_OBJECT bit before the range check
|
|
70
|
-
|
|
154
|
+
// Strip the draft-18 FIRST_OBJECT bit before the range check, but keep the value:
|
|
155
|
+
// it is the only signal that a subgroup starts partway through. Drafts that predate
|
|
156
|
+
// it carry no such signal, so they are taken at their word.
|
|
157
|
+
const legacy = !hasFirstObjectBit(version);
|
|
158
|
+
const firstObject = legacy || (raw & FIRST_OBJECT_BIT) !== 0;
|
|
159
|
+
const id = legacy ? raw : raw & ~FIRST_OBJECT_BIT;
|
|
71
160
|
let hasPriority;
|
|
72
161
|
let baseId;
|
|
73
162
|
if (id >= 0x10 && id <= 0x1f) {
|
|
@@ -87,6 +176,7 @@ export class Group {
|
|
|
87
176
|
hasSubgroup: (baseId & 0x04) !== 0,
|
|
88
177
|
hasEnd: (baseId & 0x08) !== 0,
|
|
89
178
|
hasPriority,
|
|
179
|
+
firstObject,
|
|
90
180
|
};
|
|
91
181
|
const trackAlias = await r.u62();
|
|
92
182
|
const groupId = await r.u53();
|
|
@@ -95,21 +185,28 @@ export class Group {
|
|
|
95
185
|
return new Group({ trackAlias, groupId, subGroupId, publisherPriority, flags });
|
|
96
186
|
}
|
|
97
187
|
}
|
|
188
|
+
/** A moq-transport object inside a group stream. */
|
|
98
189
|
export class Frame {
|
|
99
|
-
|
|
190
|
+
/** The object payload, or `undefined` for the end of group marker. */
|
|
100
191
|
payload;
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
extensions;
|
|
105
|
-
constructor({ payload, extensions } = {}) {
|
|
192
|
+
/** The presentation timestamp carried in object properties, when present. */
|
|
193
|
+
timestamp;
|
|
194
|
+
constructor({ payload, timestamp } = {}) {
|
|
106
195
|
this.payload = payload;
|
|
107
|
-
this.
|
|
196
|
+
this.timestamp = timestamp;
|
|
108
197
|
}
|
|
109
|
-
|
|
110
|
-
|
|
198
|
+
/**
|
|
199
|
+
* Encode this frame using the group flags and negotiated IETF version.
|
|
200
|
+
*
|
|
201
|
+
* `idDelta` is the first object's absolute Object ID and zero for every later one, so a
|
|
202
|
+
* group whose head was trimmed by a filter still puts the true numbering on the wire.
|
|
203
|
+
*/
|
|
204
|
+
async encode(w, flags, timescale, version = w.version, idDelta = 0) {
|
|
205
|
+
await w.u53(idDelta);
|
|
111
206
|
if (flags.hasExtensions) {
|
|
112
|
-
|
|
207
|
+
const extensions = await encodeObjectExtensions(this.timestamp, timescale, version);
|
|
208
|
+
await w.u53(extensions.byteLength);
|
|
209
|
+
await w.write(extensions);
|
|
113
210
|
}
|
|
114
211
|
if (this.payload !== undefined) {
|
|
115
212
|
await w.u53(this.payload.byteLength);
|
|
@@ -125,30 +222,36 @@ export class Frame {
|
|
|
125
222
|
await w.u53(GROUP_END);
|
|
126
223
|
}
|
|
127
224
|
}
|
|
128
|
-
|
|
225
|
+
/** Decode a frame using the group flags and negotiated IETF version. */
|
|
226
|
+
static async decode(r, flags, timescale, version = r.version) {
|
|
227
|
+
// The first object's delta is its absolute Object ID; every later one is the prior ID
|
|
228
|
+
// plus the delta plus one. moq-lite groups start at object 0 and never skip one, so
|
|
229
|
+
// a sequential group is a zero delta throughout, and any other value means the group
|
|
230
|
+
// either starts partway through or has a gap that would renumber the frames after it.
|
|
129
231
|
const delta = await r.u53();
|
|
130
232
|
if (delta !== 0) {
|
|
131
|
-
throw new Error(`object
|
|
233
|
+
throw new Error(`object IDs must start at 0 and increment by 1, got a delta of ${delta}`);
|
|
132
234
|
}
|
|
133
|
-
let
|
|
235
|
+
let timestamp;
|
|
134
236
|
if (flags.hasExtensions) {
|
|
135
237
|
const extensionsLength = await r.u53();
|
|
136
|
-
|
|
137
|
-
//
|
|
138
|
-
//
|
|
139
|
-
if (
|
|
140
|
-
|
|
238
|
+
const extensions = await r.read(extensionsLength);
|
|
239
|
+
// A track that declared no timescale opted out of timestamps, so its objects
|
|
240
|
+
// are stamped on arrival even if one carries a Timestamp we cannot interpret.
|
|
241
|
+
if (timescale !== undefined) {
|
|
242
|
+
timestamp = await decodeObjectTime(new Reader(undefined, extensions, version), timescale, version);
|
|
243
|
+
}
|
|
141
244
|
}
|
|
142
245
|
const payloadLength = await r.u53();
|
|
143
246
|
if (payloadLength > 0) {
|
|
144
247
|
const payload = await r.read(payloadLength);
|
|
145
|
-
return new Frame({ payload,
|
|
248
|
+
return new Frame({ payload, timestamp });
|
|
146
249
|
}
|
|
147
250
|
const status = await r.u53();
|
|
148
251
|
if (flags.hasEnd) {
|
|
149
252
|
// Empty frame
|
|
150
253
|
if (status === 0)
|
|
151
|
-
return new Frame({ payload: new Uint8Array(0) });
|
|
254
|
+
return new Frame({ payload: new Uint8Array(0), timestamp });
|
|
152
255
|
}
|
|
153
256
|
else if (status === 0 || status === GROUP_END) {
|
|
154
257
|
// TODO status === 0 should be an empty frame, but moq-rs seems to be sending it incorrectly on group end.
|
|
@@ -157,4 +260,54 @@ export class Frame {
|
|
|
157
260
|
throw new Error(`Unsupported object status: ${status}`);
|
|
158
261
|
}
|
|
159
262
|
}
|
|
263
|
+
// Serialization Flags for a fetch object: the two low bits encode the subgroup (00 =
|
|
264
|
+
// subgroup zero), then one presence bit per field.
|
|
265
|
+
const FETCH_OBJECT_ID = 0x04;
|
|
266
|
+
const FETCH_GROUP_ID = 0x08;
|
|
267
|
+
const FETCH_PRIORITY = 0x10;
|
|
268
|
+
const FETCH_PROPERTIES = 0x20;
|
|
269
|
+
/**
|
|
270
|
+
* A moq-transport object inside a fetch stream, which a publisher writes to serve a fill.
|
|
271
|
+
*
|
|
272
|
+
* The first object carries its absolute Group and Object IDs plus the priority; every later
|
|
273
|
+
* one inherits them and increments the Object ID, so only the properties and the payload go
|
|
274
|
+
* on the wire. A fetch object has no status field: a zero payload length is simply an empty
|
|
275
|
+
* object.
|
|
276
|
+
*/
|
|
277
|
+
export class FetchFrame {
|
|
278
|
+
/** The object payload. */
|
|
279
|
+
payload;
|
|
280
|
+
/** The presentation timestamp carried in object properties, when present. */
|
|
281
|
+
timestamp;
|
|
282
|
+
constructor({ payload, timestamp }) {
|
|
283
|
+
this.payload = payload;
|
|
284
|
+
this.timestamp = timestamp;
|
|
285
|
+
}
|
|
286
|
+
/** Encode this object at `position`, stamping it in the track's timescale. */
|
|
287
|
+
async encode(w, position, timescale, version = w.version) {
|
|
288
|
+
if (position.first) {
|
|
289
|
+
// Include the priority too: "same as the prior object" has no prior to refer to.
|
|
290
|
+
const properties = this.timestamp !== undefined ? FETCH_PROPERTIES : 0;
|
|
291
|
+
await w.u53(FETCH_GROUP_ID | FETCH_OBJECT_ID | FETCH_PRIORITY | properties);
|
|
292
|
+
await w.u53(position.group);
|
|
293
|
+
await w.u53(position.object);
|
|
294
|
+
await w.u8(0);
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
// Same group and priority; the Object ID is the prior one plus one.
|
|
298
|
+
await w.u53(this.timestamp !== undefined ? FETCH_PROPERTIES : 0);
|
|
299
|
+
}
|
|
300
|
+
// Omitted entirely rather than written empty when the object carries no timestamp:
|
|
301
|
+
// the track declared no units, so there is no property to send.
|
|
302
|
+
if (this.timestamp !== undefined) {
|
|
303
|
+
const extensions = await encodeObjectExtensions(this.timestamp, timescale, version);
|
|
304
|
+
await w.u53(extensions.byteLength);
|
|
305
|
+
await w.write(extensions);
|
|
306
|
+
}
|
|
307
|
+
await w.u53(this.payload.byteLength);
|
|
308
|
+
if (this.payload.byteLength > 0) {
|
|
309
|
+
await w.write(this.payload);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
160
313
|
//# sourceMappingURL=object.js.map
|
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 type { Reader, Writer } from \"../stream.ts\";\nimport { type IetfVersion, Version } from \"./version.ts\";\n\nconst GROUP_END = 0x03;\n\n// draft-18 adds bit 0x40 (FIRST_OBJECT) to the subgroup header type per spec\n// 11.4.2. moq-lite always starts subgroups at object 0, so the bit carries no\n// extra information for us: set it on emit, strip it on parse.\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\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}\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 (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.\n\t\tconst id = hasFirstObjectBit(version) ? raw & ~FIRST_OBJECT_BIT : raw;\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};\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\nexport class Frame {\n\t// undefined means end of group\n\tpayload?: Uint8Array;\n\t// Raw MOQ Object Properties / extension-header bytes (§11.2.1.2), if the\n\t// subgroup carried the PROPERTIES bit. draft-ietf-moq-loc-03 rides its\n\t// Timestamp/Timescale/VideoConfig here; undefined when there were none.\n\textensions?: Uint8Array;\n\n\tconstructor({ payload, extensions }: { payload?: Uint8Array; extensions?: Uint8Array } = {}) {\n\t\tthis.payload = payload;\n\t\tthis.extensions = extensions;\n\t}\n\n\tasync encode(w: Writer, flags: GroupFlags): Promise<void> {\n\t\tawait w.u53(0); // id_delta = 0\n\n\t\tif (flags.hasExtensions) {\n\t\t\tawait w.u53(0); // extensions length = 0\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\tstatic async decode(r: Reader, flags: GroupFlags): Promise<Frame> {\n\t\tconst delta = await r.u53();\n\t\tif (delta !== 0) {\n\t\t\tthrow new Error(`object ID delta is not supported: ${delta}`);\n\t\t}\n\n\t\tlet extensions: Uint8Array | undefined;\n\t\tif (flags.hasExtensions) {\n\t\t\tconst extensionsLength = await r.u53();\n\t\t\t// Keep the extension bytes so per-object metadata (e.g. the LOC\n\t\t\t// Timestamp/Timescale/VideoConfig, draft-ietf-moq-loc-03 §2.3) survives\n\t\t\t// up to the container decoder instead of being dropped here.\n\t\t\tif (extensionsLength > 0) extensions = await r.read(extensionsLength);\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, extensions });\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) });\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"]}
|
|
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"]}
|
package/ietf/parameters.d.ts
CHANGED
|
@@ -7,6 +7,12 @@ export declare const SetupOption: {
|
|
|
7
7
|
readonly MaxAuthTokenCacheSize: 4n;
|
|
8
8
|
readonly Authority: 5n;
|
|
9
9
|
readonly Implementation: 7n;
|
|
10
|
+
/** RELAY_HOPS, from the MoQ Cluster extension. See `cluster.ts`. */
|
|
11
|
+
readonly RelayHops: 0x40b55n;
|
|
12
|
+
/** RELAY_COST, from the MoQ Cluster extension. See `cluster.ts`. */
|
|
13
|
+
readonly RelayCost: 0x40b56n;
|
|
14
|
+
/** SOLICIT, from the MoQ Solicit extension. See `solicit.ts`. */
|
|
15
|
+
readonly Solicit: 0x40b5an;
|
|
10
16
|
};
|
|
11
17
|
export declare class SetupOptions {
|
|
12
18
|
vars: Map<bigint, bigint>;
|
|
@@ -22,7 +28,14 @@ export declare class SetupOptions {
|
|
|
22
28
|
encode(w: Writer, version: IetfVersion): Promise<void>;
|
|
23
29
|
static decode(r: Reader, version: IetfVersion): Promise<SetupOptions>;
|
|
24
30
|
}
|
|
31
|
+
/** A `{Group, Object}` pair carried by a message parameter, such as LARGEST_OBJECT. */
|
|
32
|
+
export type MessageLocation = {
|
|
33
|
+
groupId: bigint;
|
|
34
|
+
objectId: bigint;
|
|
35
|
+
};
|
|
36
|
+
/** Message parameters used in control messages. */
|
|
25
37
|
export declare class Parameters {
|
|
38
|
+
#private;
|
|
26
39
|
vars: Map<bigint, bigint>;
|
|
27
40
|
bytes: Map<bigint, Uint8Array>;
|
|
28
41
|
constructor();
|
|
@@ -40,16 +53,28 @@ export declare class Parameters {
|
|
|
40
53
|
set deliveryTimeout(v: bigint);
|
|
41
54
|
get maxCacheDuration(): bigint | undefined;
|
|
42
55
|
set maxCacheDuration(v: bigint);
|
|
43
|
-
get largest():
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
get subscriptionFilter():
|
|
52
|
-
set subscriptionFilter(v:
|
|
56
|
+
get largest(): MessageLocation | undefined;
|
|
57
|
+
set largest(v: MessageLocation);
|
|
58
|
+
/**
|
|
59
|
+
* LOCATION_FILTER, as its raw parameter value.
|
|
60
|
+
*
|
|
61
|
+
* Raw because the encoding is version dependent: a Filter Type tag through draft-19, a
|
|
62
|
+
* list of up to four varints from draft-20 on. See `filter.ts`.
|
|
63
|
+
*/
|
|
64
|
+
get subscriptionFilter(): Uint8Array | undefined;
|
|
65
|
+
set subscriptionFilter(v: Uint8Array);
|
|
66
|
+
/** FILL_PARAMETERS: the draft-20 backfill request, as its raw parameter value. */
|
|
67
|
+
get fillParameters(): Uint8Array | undefined;
|
|
68
|
+
set fillParameters(v: Uint8Array);
|
|
69
|
+
/** INCLUDE_PROPERTIES: whether the peer wants Track Properties on the response. */
|
|
70
|
+
get includeProperties(): boolean | undefined;
|
|
71
|
+
set includeProperties(v: boolean);
|
|
72
|
+
/** HOP_PATH: the hop chain an advertisement traversed, as its raw parameter value. */
|
|
73
|
+
get hopPath(): Uint8Array | undefined;
|
|
74
|
+
set hopPath(v: Uint8Array);
|
|
75
|
+
/** ROUTE_COST: the accumulated cost of that path. Absent means 0. */
|
|
76
|
+
get routeCost(): bigint | undefined;
|
|
77
|
+
set routeCost(v: bigint);
|
|
53
78
|
encode(w: Writer, version: IetfVersion): Promise<void>;
|
|
54
79
|
static decode(r: Reader, version: IetfVersion): Promise<Parameters>;
|
|
55
80
|
}
|
package/ietf/parameters.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parameters.d.ts","sourceRoot":"","sources":["../../src/ietf/parameters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,EAAE,KAAK,WAAW,EAAW,MAAM,cAAc,CAAC;AAGzD,eAAO,MAAM,WAAW;aACvB,IAAI,EAAE,EAAE;aACR,YAAY,EAAE,EAAE;aAChB,kBAAkB,EAAE,EAAE;aACtB,qBAAqB,EAAE,EAAE;aACzB,SAAS,EAAE,EAAE;aACb,cAAc,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"parameters.d.ts","sourceRoot":"","sources":["../../src/ietf/parameters.ts"],"names":[],"mappings":"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"}
|