@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.
Files changed (310) hide show
  1. package/README.md +1 -0
  2. package/announced.d.ts +111 -21
  3. package/announced.d.ts.map +1 -1
  4. package/announced.js +213 -40
  5. package/announced.js.map +1 -1
  6. package/broadcast.d.ts +80 -25
  7. package/broadcast.d.ts.map +1 -1
  8. package/broadcast.js +270 -49
  9. package/broadcast.js.map +1 -1
  10. package/connection/accept.d.ts +6 -0
  11. package/connection/accept.d.ts.map +1 -1
  12. package/connection/accept.js +42 -13
  13. package/connection/accept.js.map +1 -1
  14. package/connection/browser.d.ts +5 -0
  15. package/connection/browser.d.ts.map +1 -0
  16. package/connection/browser.js +31 -0
  17. package/connection/browser.js.map +1 -0
  18. package/connection/connect.d.ts +43 -1
  19. package/connection/connect.d.ts.map +1 -1
  20. package/connection/connect.js +118 -123
  21. package/connection/connect.js.map +1 -1
  22. package/connection/established.d.ts +43 -16
  23. package/connection/established.d.ts.map +1 -1
  24. package/connection/established.js.map +1 -1
  25. package/connection/handshake.d.ts +12 -1
  26. package/connection/handshake.d.ts.map +1 -1
  27. package/connection/handshake.js +30 -14
  28. package/connection/handshake.js.map +1 -1
  29. package/connection/index.d.ts +8 -0
  30. package/connection/index.d.ts.map +1 -1
  31. package/connection/index.js +6 -0
  32. package/connection/index.js.map +1 -1
  33. package/connection/reload.d.ts +66 -9
  34. package/connection/reload.d.ts.map +1 -1
  35. package/connection/reload.js +192 -66
  36. package/connection/reload.js.map +1 -1
  37. package/connection/stats.d.ts +92 -0
  38. package/connection/stats.d.ts.map +1 -0
  39. package/connection/stats.js +35 -0
  40. package/connection/stats.js.map +1 -0
  41. package/connection/transport.d.ts +10 -0
  42. package/connection/transport.d.ts.map +1 -0
  43. package/connection/transport.js +12 -0
  44. package/connection/transport.js.map +1 -0
  45. package/consume.d.ts +44 -0
  46. package/consume.d.ts.map +1 -0
  47. package/consume.js +60 -0
  48. package/consume.js.map +1 -0
  49. package/datagram.d.ts +23 -0
  50. package/datagram.d.ts.map +1 -0
  51. package/datagram.js +3 -0
  52. package/datagram.js.map +1 -0
  53. package/error.d.ts +76 -0
  54. package/error.d.ts.map +1 -0
  55. package/error.js +107 -0
  56. package/error.js.map +1 -0
  57. package/group.d.ts +143 -38
  58. package/group.d.ts.map +1 -1
  59. package/group.js +270 -68
  60. package/group.js.map +1 -1
  61. package/ietf/adapter.d.ts +2 -2
  62. package/ietf/adapter.d.ts.map +1 -1
  63. package/ietf/adapter.js +20 -10
  64. package/ietf/adapter.js.map +1 -1
  65. package/ietf/aliases.d.ts +73 -5
  66. package/ietf/aliases.d.ts.map +1 -1
  67. package/ietf/aliases.js +121 -14
  68. package/ietf/aliases.js.map +1 -1
  69. package/ietf/cluster.d.ts +141 -0
  70. package/ietf/cluster.d.ts.map +1 -0
  71. package/ietf/cluster.js +204 -0
  72. package/ietf/cluster.js.map +1 -0
  73. package/ietf/connection.d.ts +39 -6
  74. package/ietf/connection.d.ts.map +1 -1
  75. package/ietf/connection.js +73 -12
  76. package/ietf/connection.js.map +1 -1
  77. package/ietf/fetch.d.ts +17 -0
  78. package/ietf/fetch.d.ts.map +1 -1
  79. package/ietf/fetch.js +21 -0
  80. package/ietf/fetch.js.map +1 -1
  81. package/ietf/filter.d.ts +87 -0
  82. package/ietf/filter.d.ts.map +1 -0
  83. package/ietf/filter.js +292 -0
  84. package/ietf/filter.js.map +1 -0
  85. package/ietf/index.d.ts +2 -0
  86. package/ietf/index.d.ts.map +1 -1
  87. package/ietf/index.js +3 -0
  88. package/ietf/index.js.map +1 -1
  89. package/ietf/namespace.d.ts +6 -0
  90. package/ietf/namespace.d.ts.map +1 -1
  91. package/ietf/namespace.js +27 -2
  92. package/ietf/namespace.js.map +1 -1
  93. package/ietf/object.d.ts +54 -6
  94. package/ietf/object.d.ts.map +1 -1
  95. package/ietf/object.js +178 -25
  96. package/ietf/object.js.map +1 -1
  97. package/ietf/parameters.d.ts +35 -10
  98. package/ietf/parameters.d.ts.map +1 -1
  99. package/ietf/parameters.js +236 -45
  100. package/ietf/parameters.js.map +1 -1
  101. package/ietf/priority.d.ts +5 -0
  102. package/ietf/priority.d.ts.map +1 -0
  103. package/ietf/priority.js +10 -0
  104. package/ietf/priority.js.map +1 -0
  105. package/ietf/properties.d.ts +13 -2
  106. package/ietf/properties.d.ts.map +1 -1
  107. package/ietf/properties.js +65 -8
  108. package/ietf/properties.js.map +1 -1
  109. package/ietf/publish.d.ts.map +1 -1
  110. package/ietf/publish.js +13 -3
  111. package/ietf/publish.js.map +1 -1
  112. package/ietf/publish_namespace.d.ts +16 -2
  113. package/ietf/publish_namespace.d.ts.map +1 -1
  114. package/ietf/publish_namespace.js +25 -6
  115. package/ietf/publish_namespace.js.map +1 -1
  116. package/ietf/publisher.d.ts +40 -7
  117. package/ietf/publisher.d.ts.map +1 -1
  118. package/ietf/publisher.js +751 -134
  119. package/ietf/publisher.js.map +1 -1
  120. package/ietf/request.js +1 -1
  121. package/ietf/request.js.map +1 -1
  122. package/ietf/solicit.d.ts +41 -0
  123. package/ietf/solicit.d.ts.map +1 -0
  124. package/ietf/solicit.js +47 -0
  125. package/ietf/solicit.js.map +1 -0
  126. package/ietf/subscribe.d.ts +41 -2
  127. package/ietf/subscribe.d.ts.map +1 -1
  128. package/ietf/subscribe.js +103 -22
  129. package/ietf/subscribe.js.map +1 -1
  130. package/ietf/subscribe_namespace.d.ts +21 -7
  131. package/ietf/subscribe_namespace.d.ts.map +1 -1
  132. package/ietf/subscribe_namespace.js +31 -14
  133. package/ietf/subscribe_namespace.js.map +1 -1
  134. package/ietf/subscriber.d.ts +20 -7
  135. package/ietf/subscriber.d.ts.map +1 -1
  136. package/ietf/subscriber.js +512 -142
  137. package/ietf/subscriber.js.map +1 -1
  138. package/ietf/version.d.ts +7 -1
  139. package/ietf/version.d.ts.map +1 -1
  140. package/ietf/version.js +7 -0
  141. package/ietf/version.js.map +1 -1
  142. package/index.d.ts +10 -5
  143. package/index.d.ts.map +1 -1
  144. package/index.js +10 -5
  145. package/index.js.map +1 -1
  146. package/internal.d.ts +29 -0
  147. package/internal.d.ts.map +1 -0
  148. package/internal.js +8 -0
  149. package/internal.js.map +1 -0
  150. package/lite/announce.d.ts +62 -15
  151. package/lite/announce.d.ts.map +1 -1
  152. package/lite/announce.js +230 -94
  153. package/lite/announce.js.map +1 -1
  154. package/lite/connection.d.ts +69 -20
  155. package/lite/connection.d.ts.map +1 -1
  156. package/lite/connection.js +128 -81
  157. package/lite/connection.js.map +1 -1
  158. package/lite/datagram.d.ts +23 -0
  159. package/lite/datagram.d.ts.map +1 -0
  160. package/lite/datagram.js +57 -0
  161. package/lite/datagram.js.map +1 -0
  162. package/lite/datagram_stream.d.ts +8 -0
  163. package/lite/datagram_stream.d.ts.map +1 -0
  164. package/lite/datagram_stream.js +44 -0
  165. package/lite/datagram_stream.js.map +1 -0
  166. package/lite/fetch.d.ts.map +1 -1
  167. package/lite/fetch.js +2 -2
  168. package/lite/fetch.js.map +1 -1
  169. package/lite/index.d.ts +3 -0
  170. package/lite/index.d.ts.map +1 -1
  171. package/lite/index.js +3 -0
  172. package/lite/index.js.map +1 -1
  173. package/lite/priority.d.ts +67 -0
  174. package/lite/priority.d.ts.map +1 -0
  175. package/lite/priority.js +114 -0
  176. package/lite/priority.js.map +1 -0
  177. package/lite/probe.d.ts +18 -2
  178. package/lite/probe.d.ts.map +1 -1
  179. package/lite/probe.js +24 -22
  180. package/lite/probe.js.map +1 -1
  181. package/lite/publisher.d.ts +14 -7
  182. package/lite/publisher.d.ts.map +1 -1
  183. package/lite/publisher.js +406 -84
  184. package/lite/publisher.js.map +1 -1
  185. package/lite/setup.d.ts +83 -6
  186. package/lite/setup.d.ts.map +1 -1
  187. package/lite/setup.js +203 -31
  188. package/lite/setup.js.map +1 -1
  189. package/lite/stream.d.ts +12 -3
  190. package/lite/stream.d.ts.map +1 -1
  191. package/lite/stream.js +7 -4
  192. package/lite/stream.js.map +1 -1
  193. package/lite/subscribe.d.ts +37 -23
  194. package/lite/subscribe.d.ts.map +1 -1
  195. package/lite/subscribe.js +70 -55
  196. package/lite/subscribe.js.map +1 -1
  197. package/lite/subscriber.d.ts +29 -23
  198. package/lite/subscriber.d.ts.map +1 -1
  199. package/lite/subscriber.js +689 -112
  200. package/lite/subscriber.js.map +1 -1
  201. package/lite/track.d.ts +25 -13
  202. package/lite/track.d.ts.map +1 -1
  203. package/lite/track.js +60 -35
  204. package/lite/track.js.map +1 -1
  205. package/lite/version.d.ts +39 -4
  206. package/lite/version.d.ts.map +1 -1
  207. package/lite/version.js +139 -17
  208. package/lite/version.js.map +1 -1
  209. package/mock.d.ts +53 -3
  210. package/mock.d.ts.map +1 -1
  211. package/mock.js +110 -21
  212. package/mock.js.map +1 -1
  213. package/{lite/origin.d.ts → origin.d.ts} +25 -1
  214. package/origin.d.ts.map +1 -0
  215. package/{lite/origin.js → origin.js} +25 -1
  216. package/origin.js.map +1 -0
  217. package/package.json +6 -4
  218. package/path.d.ts +67 -0
  219. package/path.d.ts.map +1 -1
  220. package/path.js +128 -0
  221. package/path.js.map +1 -1
  222. package/stream.d.ts +94 -4
  223. package/stream.d.ts.map +1 -1
  224. package/stream.js +128 -17
  225. package/stream.js.map +1 -1
  226. package/time.d.ts +109 -86
  227. package/time.d.ts.map +1 -1
  228. package/time.js +80 -30
  229. package/time.js.map +1 -1
  230. package/track.d.ts +298 -47
  231. package/track.d.ts.map +1 -1
  232. package/track.js +721 -109
  233. package/track.js.map +1 -1
  234. package/util/timeout.d.ts +5 -0
  235. package/util/timeout.d.ts.map +1 -0
  236. package/util/timeout.js +18 -0
  237. package/util/timeout.js.map +1 -0
  238. package/util/utf8.d.ts +3 -0
  239. package/util/utf8.d.ts.map +1 -0
  240. package/util/utf8.js +7 -0
  241. package/util/utf8.js.map +1 -0
  242. package/varint.d.ts +14 -3
  243. package/varint.d.ts.map +1 -1
  244. package/varint.js +23 -12
  245. package/varint.js.map +1 -1
  246. package/zod.d.ts +5 -5
  247. package/zod.d.ts.map +1 -1
  248. package/zod.js.map +1 -1
  249. package/bandwidth.d.ts +0 -11
  250. package/bandwidth.d.ts.map +0 -1
  251. package/bandwidth.js +0 -7
  252. package/bandwidth.js.map +0 -1
  253. package/connection/cert.test.d.ts +0 -2
  254. package/connection/cert.test.d.ts.map +0 -1
  255. package/connection/cert.test.js +0 -26
  256. package/connection/cert.test.js.map +0 -1
  257. package/connection/reload.test.d.ts +0 -2
  258. package/connection/reload.test.d.ts.map +0 -1
  259. package/connection/reload.test.js +0 -39
  260. package/connection/reload.test.js.map +0 -1
  261. package/group.test.d.ts +0 -2
  262. package/group.test.d.ts.map +0 -1
  263. package/group.test.js +0 -66
  264. package/group.test.js.map +0 -1
  265. package/ietf/aliases.test.d.ts +0 -2
  266. package/ietf/aliases.test.d.ts.map +0 -1
  267. package/ietf/aliases.test.js +0 -30
  268. package/ietf/aliases.test.js.map +0 -1
  269. package/ietf/ietf.test.d.ts +0 -2
  270. package/ietf/ietf.test.d.ts.map +0 -1
  271. package/ietf/ietf.test.js +0 -873
  272. package/ietf/ietf.test.js.map +0 -1
  273. package/integration.test.d.ts +0 -2
  274. package/integration.test.d.ts.map +0 -1
  275. package/integration.test.js +0 -90
  276. package/integration.test.js.map +0 -1
  277. package/lite/origin.d.ts.map +0 -1
  278. package/lite/origin.js.map +0 -1
  279. package/lite/subscriber.test.d.ts +0 -2
  280. package/lite/subscriber.test.d.ts.map +0 -1
  281. package/lite/subscriber.test.js +0 -30
  282. package/lite/subscriber.test.js.map +0 -1
  283. package/lite/track.test.d.ts +0 -2
  284. package/lite/track.test.d.ts.map +0 -1
  285. package/lite/track.test.js +0 -53
  286. package/lite/track.test.js.map +0 -1
  287. package/path.test.d.ts +0 -2
  288. package/path.test.d.ts.map +0 -1
  289. package/path.test.js +0 -169
  290. package/path.test.js.map +0 -1
  291. package/stream.test.d.ts +0 -2
  292. package/stream.test.d.ts.map +0 -1
  293. package/stream.test.js +0 -210
  294. package/stream.test.js.map +0 -1
  295. package/track.test.d.ts +0 -2
  296. package/track.test.d.ts.map +0 -1
  297. package/track.test.js +0 -56
  298. package/track.test.js.map +0 -1
  299. package/util/error.d.ts +0 -3
  300. package/util/error.d.ts.map +0 -1
  301. package/util/error.js +0 -9
  302. package/util/error.js.map +0 -1
  303. package/util/index.d.ts +0 -2
  304. package/util/index.d.ts.map +0 -1
  305. package/util/index.js +0 -3
  306. package/util/index.js.map +0 -1
  307. package/varint.test.d.ts +0 -2
  308. package/varint.test.d.ts.map +0 -1
  309. package/varint.test.js +0 -106
  310. package/varint.test.js.map +0 -1
package/ietf/object.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- import type { Reader, Writer } from "../stream";
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
- extensions?: Uint8Array;
33
- constructor({ payload, extensions }?: {
43
+ /** The presentation timestamp carried in object properties, when present. */
44
+ timestamp?: Timestamp;
45
+ constructor({ payload, timestamp }?: {
34
46
  payload?: Uint8Array;
35
- extensions?: Uint8Array;
47
+ timestamp?: Timestamp;
36
48
  });
37
- encode(w: Writer, flags: GroupFlags): Promise<void>;
38
- static decode(r: Reader, flags: GroupFlags): Promise<Frame>;
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
@@ -1 +1 @@
1
- {"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../../src/ietf/object.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,KAAK,WAAW,EAAW,MAAM,cAAc,CAAC;AAqBzD,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;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,CA+BnE;CACD;AAED,qBAAa,KAAK;IAEjB,OAAO,CAAC,EAAE,UAAU,CAAC;IAIrB,UAAU,CAAC,EAAE,UAAU,CAAC;IAExB,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,GAAE;QAAE,OAAO,CAAC,EAAE,UAAU,CAAC;QAAC,UAAU,CAAC,EAAE,UAAU,CAAA;KAAO,EAG1F;IAEK,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBxD;IAED,OAAa,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAiChE;CACD"}
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. moq-lite always starts subgroups at object 0, so the bit carries no
6
- // extra information for us: set it on emit, strip it on parse.
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
- const id = hasFirstObjectBit(version) ? raw & ~FIRST_OBJECT_BIT : raw;
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
- // undefined means end of group
190
+ /** The object payload, or `undefined` for the end of group marker. */
100
191
  payload;
101
- // Raw MOQ Object Properties / extension-header bytes (§11.2.1.2), if the
102
- // subgroup carried the PROPERTIES bit. draft-ietf-moq-loc-03 rides its
103
- // Timestamp/Timescale/VideoConfig here; undefined when there were none.
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.extensions = extensions;
196
+ this.timestamp = timestamp;
108
197
  }
109
- async encode(w, flags) {
110
- await w.u53(0); // id_delta = 0
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
- await w.u53(0); // extensions length = 0
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
- static async decode(r, flags) {
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 ID delta is not supported: ${delta}`);
233
+ throw new Error(`object IDs must start at 0 and increment by 1, got a delta of ${delta}`);
132
234
  }
133
- let extensions;
235
+ let timestamp;
134
236
  if (flags.hasExtensions) {
135
237
  const extensionsLength = await r.u53();
136
- // Keep the extension bytes so per-object metadata (e.g. the LOC
137
- // Timestamp/Timescale/VideoConfig, draft-ietf-moq-loc-03 §2.3) survives
138
- // up to the container decoder instead of being dropped here.
139
- if (extensionsLength > 0)
140
- extensions = await r.read(extensionsLength);
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, extensions });
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
@@ -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"]}
@@ -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
- groupId: bigint;
45
- objectId: bigint;
46
- } | undefined;
47
- set largest(v: {
48
- groupId: bigint;
49
- objectId: bigint;
50
- });
51
- get subscriptionFilter(): number | undefined;
52
- set subscriptionFilter(v: number);
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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"parameters.d.ts","sourceRoot":"","sources":["../../src/ietf/parameters.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"parameters.d.ts","sourceRoot":"","sources":["../../src/ietf/parameters.ts"],"names":[],"mappings":"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"}