@norskvideo/moq-net 0.1.0

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 (274) hide show
  1. package/README.md +70 -0
  2. package/announced.d.ts +45 -0
  3. package/announced.d.ts.map +1 -0
  4. package/announced.js +70 -0
  5. package/announced.js.map +1 -0
  6. package/bandwidth.d.ts +11 -0
  7. package/bandwidth.d.ts.map +1 -0
  8. package/bandwidth.js +7 -0
  9. package/bandwidth.js.map +1 -0
  10. package/broadcast.d.ts +39 -0
  11. package/broadcast.d.ts.map +1 -0
  12. package/broadcast.js +76 -0
  13. package/broadcast.js.map +1 -0
  14. package/connection/accept.d.ts +15 -0
  15. package/connection/accept.d.ts.map +1 -0
  16. package/connection/accept.js +137 -0
  17. package/connection/accept.js.map +1 -0
  18. package/connection/cert.test.d.ts +2 -0
  19. package/connection/cert.test.d.ts.map +1 -0
  20. package/connection/cert.test.js +26 -0
  21. package/connection/cert.test.js.map +1 -0
  22. package/connection/connect.d.ts +37 -0
  23. package/connection/connect.d.ts.map +1 -0
  24. package/connection/connect.js +348 -0
  25. package/connection/connect.js.map +1 -0
  26. package/connection/established.d.ts +30 -0
  27. package/connection/established.d.ts.map +1 -0
  28. package/connection/established.js +3 -0
  29. package/connection/established.js.map +1 -0
  30. package/connection/handshake.d.ts +10 -0
  31. package/connection/handshake.d.ts.map +1 -0
  32. package/connection/handshake.js +48 -0
  33. package/connection/handshake.js.map +1 -0
  34. package/connection/index.d.ts +5 -0
  35. package/connection/index.d.ts.map +1 -0
  36. package/connection/index.js +6 -0
  37. package/connection/index.js.map +1 -0
  38. package/connection/reload.d.ts +47 -0
  39. package/connection/reload.d.ts.map +1 -0
  40. package/connection/reload.js +137 -0
  41. package/connection/reload.js.map +1 -0
  42. package/group.d.ts +66 -0
  43. package/group.d.ts.map +1 -0
  44. package/group.js +135 -0
  45. package/group.js.map +1 -0
  46. package/group.test.d.ts +2 -0
  47. package/group.test.d.ts.map +1 -0
  48. package/group.test.js +66 -0
  49. package/group.test.js.map +1 -0
  50. package/ietf/adapter.d.ts +65 -0
  51. package/ietf/adapter.d.ts.map +1 -0
  52. package/ietf/adapter.js +626 -0
  53. package/ietf/adapter.js.map +1 -0
  54. package/ietf/connection.d.ts +65 -0
  55. package/ietf/connection.d.ts.map +1 -0
  56. package/ietf/connection.js +248 -0
  57. package/ietf/connection.js.map +1 -0
  58. package/ietf/control.d.ts +135 -0
  59. package/ietf/control.d.ts.map +1 -0
  60. package/ietf/control.js +242 -0
  61. package/ietf/control.js.map +1 -0
  62. package/ietf/fetch.d.ts +64 -0
  63. package/ietf/fetch.d.ts.map +1 -0
  64. package/ietf/fetch.js +100 -0
  65. package/ietf/fetch.js.map +1 -0
  66. package/ietf/goaway.d.ts +15 -0
  67. package/ietf/goaway.d.ts.map +1 -0
  68. package/ietf/goaway.js +34 -0
  69. package/ietf/goaway.js.map +1 -0
  70. package/ietf/ietf.test.d.ts +2 -0
  71. package/ietf/ietf.test.d.ts.map +1 -0
  72. package/ietf/ietf.test.js +873 -0
  73. package/ietf/ietf.test.js.map +1 -0
  74. package/ietf/index.d.ts +18 -0
  75. package/ietf/index.d.ts.map +1 -0
  76. package/ietf/index.js +19 -0
  77. package/ietf/index.js.map +1 -0
  78. package/ietf/message.d.ts +4 -0
  79. package/ietf/message.d.ts.map +1 -0
  80. package/ietf/message.js +54 -0
  81. package/ietf/message.js.map +1 -0
  82. package/ietf/namespace.d.ts +5 -0
  83. package/ietf/namespace.d.ts.map +1 -0
  84. package/ietf/namespace.js +27 -0
  85. package/ietf/namespace.js.map +1 -0
  86. package/ietf/object.d.ts +40 -0
  87. package/ietf/object.d.ts.map +1 -0
  88. package/ietf/object.js +160 -0
  89. package/ietf/object.js.map +1 -0
  90. package/ietf/parameters.d.ts +56 -0
  91. package/ietf/parameters.d.ts.map +1 -0
  92. package/ietf/parameters.js +337 -0
  93. package/ietf/parameters.js.map +1 -0
  94. package/ietf/properties.d.ts +4 -0
  95. package/ietf/properties.d.ts.map +1 -0
  96. package/ietf/properties.js +33 -0
  97. package/ietf/properties.js.map +1 -0
  98. package/ietf/publish.d.ts +68 -0
  99. package/ietf/publish.d.ts.map +1 -0
  100. package/ietf/publish.js +192 -0
  101. package/ietf/publish.js.map +1 -0
  102. package/ietf/publish_namespace.d.ts +68 -0
  103. package/ietf/publish_namespace.d.ts.map +1 -0
  104. package/ietf/publish_namespace.js +176 -0
  105. package/ietf/publish_namespace.js.map +1 -0
  106. package/ietf/publisher.d.ts +50 -0
  107. package/ietf/publisher.d.ts.map +1 -0
  108. package/ietf/publisher.js +330 -0
  109. package/ietf/publisher.js.map +1 -0
  110. package/ietf/request.d.ts +52 -0
  111. package/ietf/request.d.ts.map +1 -0
  112. package/ietf/request.js +119 -0
  113. package/ietf/request.js.map +1 -0
  114. package/ietf/setup.d.ts +38 -0
  115. package/ietf/setup.d.ts.map +1 -0
  116. package/ietf/setup.js +129 -0
  117. package/ietf/setup.js.map +1 -0
  118. package/ietf/subscribe.d.ts +66 -0
  119. package/ietf/subscribe.d.ts.map +1 -0
  120. package/ietf/subscribe.js +276 -0
  121. package/ietf/subscribe.js.map +1 -0
  122. package/ietf/subscribe_namespace.d.ts +101 -0
  123. package/ietf/subscribe_namespace.d.ts.map +1 -0
  124. package/ietf/subscribe_namespace.js +256 -0
  125. package/ietf/subscribe_namespace.js.map +1 -0
  126. package/ietf/subscriber.d.ts +53 -0
  127. package/ietf/subscriber.d.ts.map +1 -0
  128. package/ietf/subscriber.js +404 -0
  129. package/ietf/subscriber.js.map +1 -0
  130. package/ietf/track.d.ts +40 -0
  131. package/ietf/track.d.ts.map +1 -0
  132. package/ietf/track.js +108 -0
  133. package/ietf/track.js.map +1 -0
  134. package/ietf/version.d.ts +56 -0
  135. package/ietf/version.d.ts.map +1 -0
  136. package/ietf/version.js +63 -0
  137. package/ietf/version.js.map +1 -0
  138. package/index.d.ts +22 -0
  139. package/index.d.ts.map +1 -0
  140. package/index.js +23 -0
  141. package/index.js.map +1 -0
  142. package/integration.test.d.ts +2 -0
  143. package/integration.test.d.ts.map +1 -0
  144. package/integration.test.js +90 -0
  145. package/integration.test.js.map +1 -0
  146. package/lite/announce.d.ts +35 -0
  147. package/lite/announce.d.ts.map +1 -0
  148. package/lite/announce.js +166 -0
  149. package/lite/announce.js.map +1 -0
  150. package/lite/connection.d.ts +47 -0
  151. package/lite/connection.d.ts.map +1 -0
  152. package/lite/connection.js +247 -0
  153. package/lite/connection.js.map +1 -0
  154. package/lite/fetch.d.ts +14 -0
  155. package/lite/fetch.d.ts.map +1 -0
  156. package/lite/fetch.js +47 -0
  157. package/lite/fetch.js.map +1 -0
  158. package/lite/goaway.d.ts +10 -0
  159. package/lite/goaway.d.ts.map +1 -0
  160. package/lite/goaway.js +37 -0
  161. package/lite/goaway.js.map +1 -0
  162. package/lite/group.d.ts +18 -0
  163. package/lite/group.d.ts.map +1 -0
  164. package/lite/group.js +46 -0
  165. package/lite/group.js.map +1 -0
  166. package/lite/index.d.ts +11 -0
  167. package/lite/index.d.ts.map +1 -0
  168. package/lite/index.js +12 -0
  169. package/lite/index.js.map +1 -0
  170. package/lite/message.d.ts +5 -0
  171. package/lite/message.d.ts.map +1 -0
  172. package/lite/message.js +51 -0
  173. package/lite/message.js.map +1 -0
  174. package/lite/origin.d.ts +25 -0
  175. package/lite/origin.d.ts.map +1 -0
  176. package/lite/origin.js +35 -0
  177. package/lite/origin.js.map +1 -0
  178. package/lite/probe.d.ts +12 -0
  179. package/lite/probe.d.ts.map +1 -0
  180. package/lite/probe.js +60 -0
  181. package/lite/probe.js.map +1 -0
  182. package/lite/publisher.d.ts +63 -0
  183. package/lite/publisher.d.ts.map +1 -0
  184. package/lite/publisher.js +350 -0
  185. package/lite/publisher.js.map +1 -0
  186. package/lite/session.d.ts +36 -0
  187. package/lite/session.d.ts.map +1 -0
  188. package/lite/session.js +130 -0
  189. package/lite/session.js.map +1 -0
  190. package/lite/setup.d.ts +18 -0
  191. package/lite/setup.d.ts.map +1 -0
  192. package/lite/setup.js +55 -0
  193. package/lite/setup.js.map +1 -0
  194. package/lite/stream.d.ts +23 -0
  195. package/lite/stream.d.ts.map +1 -0
  196. package/lite/stream.js +20 -0
  197. package/lite/stream.js.map +1 -0
  198. package/lite/subscribe.d.ts +111 -0
  199. package/lite/subscribe.d.ts.map +1 -0
  200. package/lite/subscribe.js +341 -0
  201. package/lite/subscribe.js.map +1 -0
  202. package/lite/subscriber.d.ts +80 -0
  203. package/lite/subscriber.d.ts.map +1 -0
  204. package/lite/subscriber.js +316 -0
  205. package/lite/subscriber.js.map +1 -0
  206. package/lite/track.d.ts +38 -0
  207. package/lite/track.d.ts.map +1 -0
  208. package/lite/track.js +81 -0
  209. package/lite/track.js.map +1 -0
  210. package/lite/track.test.d.ts +2 -0
  211. package/lite/track.test.d.ts.map +1 -0
  212. package/lite/track.test.js +53 -0
  213. package/lite/track.test.js.map +1 -0
  214. package/lite/version.d.ts +16 -0
  215. package/lite/version.d.ts.map +1 -0
  216. package/lite/version.js +41 -0
  217. package/lite/version.js.map +1 -0
  218. package/mock.d.ts +16 -0
  219. package/mock.d.ts.map +1 -0
  220. package/mock.js +154 -0
  221. package/mock.js.map +1 -0
  222. package/package.json +27 -0
  223. package/path.d.ts +111 -0
  224. package/path.d.ts.map +1 -0
  225. package/path.js +133 -0
  226. package/path.js.map +1 -0
  227. package/path.test.d.ts +2 -0
  228. package/path.test.d.ts.map +1 -0
  229. package/path.test.js +169 -0
  230. package/path.test.js.map +1 -0
  231. package/stream.d.ts +57 -0
  232. package/stream.d.ts.map +1 -0
  233. package/stream.js +326 -0
  234. package/stream.js.map +1 -0
  235. package/stream.test.d.ts +2 -0
  236. package/stream.test.d.ts.map +1 -0
  237. package/stream.test.js +210 -0
  238. package/stream.test.js.map +1 -0
  239. package/time.d.ts +109 -0
  240. package/time.d.ts.map +1 -0
  241. package/time.js +94 -0
  242. package/time.js.map +1 -0
  243. package/track.d.ts +85 -0
  244. package/track.d.ts.map +1 -0
  245. package/track.js +227 -0
  246. package/track.js.map +1 -0
  247. package/track.test.d.ts +2 -0
  248. package/track.test.d.ts.map +1 -0
  249. package/track.test.js +56 -0
  250. package/track.test.js.map +1 -0
  251. package/util/error.d.ts +3 -0
  252. package/util/error.d.ts.map +1 -0
  253. package/util/error.js +9 -0
  254. package/util/error.js.map +1 -0
  255. package/util/hex.d.ts +3 -0
  256. package/util/hex.d.ts.map +1 -0
  257. package/util/hex.js +16 -0
  258. package/util/hex.js.map +1 -0
  259. package/util/index.d.ts +2 -0
  260. package/util/index.d.ts.map +1 -0
  261. package/util/index.js +3 -0
  262. package/util/index.js.map +1 -0
  263. package/varint.d.ts +36 -0
  264. package/varint.d.ts.map +1 -0
  265. package/varint.js +288 -0
  266. package/varint.js.map +1 -0
  267. package/varint.test.d.ts +2 -0
  268. package/varint.test.d.ts.map +1 -0
  269. package/varint.test.js +106 -0
  270. package/varint.test.js.map +1 -0
  271. package/zod.d.ts +13 -0
  272. package/zod.d.ts.map +1 -0
  273. package/zod.js +19 -0
  274. package/zod.js.map +1 -0
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Supported MoQ Transport protocol versions
3
+ */
4
+ export declare const Version: {
5
+ /**
6
+ * draft-ietf-moq-transport-07
7
+ * https://www.ietf.org/archive/id/draft-ietf-moq-transport-07.txt
8
+ */
9
+ readonly DRAFT_07: 4278190087;
10
+ /**
11
+ * draft-ietf-moq-transport-14
12
+ * https://www.ietf.org/archive/id/draft-ietf-moq-transport-14.txt
13
+ */
14
+ readonly DRAFT_14: 4278190094;
15
+ /**
16
+ * draft-ietf-moq-transport-15
17
+ * https://www.ietf.org/archive/id/draft-ietf-moq-transport-15.txt
18
+ */
19
+ readonly DRAFT_15: 4278190095;
20
+ /**
21
+ * draft-ietf-moq-transport-16
22
+ * https://www.ietf.org/archive/id/draft-ietf-moq-transport-16.txt
23
+ */
24
+ readonly DRAFT_16: 4278190096;
25
+ /**
26
+ * draft-ietf-moq-transport-17
27
+ * https://www.ietf.org/archive/id/draft-ietf-moq-transport-17.txt
28
+ */
29
+ readonly DRAFT_17: 4278190097;
30
+ /**
31
+ * draft-ietf-moq-transport-18
32
+ * https://www.ietf.org/archive/id/draft-ietf-moq-transport-18.txt
33
+ */
34
+ readonly DRAFT_18: 4278190098;
35
+ /**
36
+ * draft-ietf-moq-transport-19
37
+ * https://www.ietf.org/archive/id/draft-ietf-moq-transport-19.txt
38
+ */
39
+ readonly DRAFT_19: 4278190099;
40
+ };
41
+ export type Version = (typeof Version)[keyof typeof Version];
42
+ export declare const ALPN: {
43
+ readonly DRAFT_14: "moq-00";
44
+ readonly DRAFT_15: "moqt-15";
45
+ readonly DRAFT_16: "moqt-16";
46
+ readonly DRAFT_17: "moqt-17";
47
+ readonly DRAFT_18: "moqt-18";
48
+ readonly DRAFT_19: "moqt-19";
49
+ };
50
+ /**
51
+ * IETF protocol versions used by the ietf/ module.
52
+ * Use this narrower type for version-branched encode/decode to get exhaustive matching.
53
+ */
54
+ export type IetfVersion = typeof Version.DRAFT_14 | typeof Version.DRAFT_15 | typeof Version.DRAFT_16 | typeof Version.DRAFT_17 | typeof Version.DRAFT_18 | typeof Version.DRAFT_19;
55
+ export declare function versionName(v: Version): string;
56
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/ietf/version.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,OAAO;IACnB;;;OAGG;aACH,QAAQ,EAAE,UAAU;IAEpB;;;OAGG;aACH,QAAQ,EAAE,UAAU;IAEpB;;;OAGG;aACH,QAAQ,EAAE,UAAU;IAEpB;;;OAGG;aACH,QAAQ,EAAE,UAAU;IAEpB;;;OAGG;aACH,QAAQ,EAAE,UAAU;IAEpB;;;OAGG;aACH,QAAQ,EAAE,UAAU;IAEpB;;;OAGG;aACH,QAAQ,EAAE,UAAU;CACX,CAAC;AAEX,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,OAAO,OAAO,CAAC,CAAC;AAG7D,eAAO,MAAM,IAAI;aAChB,QAAQ,EAAE,QAAQ;aAClB,QAAQ,EAAE,SAAS;aACnB,QAAQ,EAAE,SAAS;aACnB,QAAQ,EAAE,SAAS;aACnB,QAAQ,EAAE,SAAS;aACnB,QAAQ,EAAE,SAAS;CACV,CAAC;AAEX;;;GAGG;AACH,MAAM,MAAM,WAAW,GACpB,OAAO,OAAO,CAAC,QAAQ,GACvB,OAAO,OAAO,CAAC,QAAQ,GACvB,OAAO,OAAO,CAAC,QAAQ,GACvB,OAAO,OAAO,CAAC,QAAQ,GACvB,OAAO,OAAO,CAAC,QAAQ,GACvB,OAAO,OAAO,CAAC,QAAQ,CAAC;AAY3B,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAE9C"}
@@ -0,0 +1,63 @@
1
+ /* @ts-self-types="./version.d.ts" */
2
+ /**
3
+ * Supported MoQ Transport protocol versions
4
+ */
5
+ export const Version = {
6
+ /**
7
+ * draft-ietf-moq-transport-07
8
+ * https://www.ietf.org/archive/id/draft-ietf-moq-transport-07.txt
9
+ */
10
+ DRAFT_07: 0xff000007,
11
+ /**
12
+ * draft-ietf-moq-transport-14
13
+ * https://www.ietf.org/archive/id/draft-ietf-moq-transport-14.txt
14
+ */
15
+ DRAFT_14: 0xff00000e,
16
+ /**
17
+ * draft-ietf-moq-transport-15
18
+ * https://www.ietf.org/archive/id/draft-ietf-moq-transport-15.txt
19
+ */
20
+ DRAFT_15: 0xff00000f,
21
+ /**
22
+ * draft-ietf-moq-transport-16
23
+ * https://www.ietf.org/archive/id/draft-ietf-moq-transport-16.txt
24
+ */
25
+ DRAFT_16: 0xff000010,
26
+ /**
27
+ * draft-ietf-moq-transport-17
28
+ * https://www.ietf.org/archive/id/draft-ietf-moq-transport-17.txt
29
+ */
30
+ DRAFT_17: 0xff000011,
31
+ /**
32
+ * draft-ietf-moq-transport-18
33
+ * https://www.ietf.org/archive/id/draft-ietf-moq-transport-18.txt
34
+ */
35
+ DRAFT_18: 0xff000012,
36
+ /**
37
+ * draft-ietf-moq-transport-19
38
+ * https://www.ietf.org/archive/id/draft-ietf-moq-transport-19.txt
39
+ */
40
+ DRAFT_19: 0xff000013,
41
+ };
42
+ // ALPN / WebTransport subprotocol identifiers for draft versions.
43
+ export const ALPN = {
44
+ DRAFT_14: "moq-00",
45
+ DRAFT_15: "moqt-15",
46
+ DRAFT_16: "moqt-16",
47
+ DRAFT_17: "moqt-17",
48
+ DRAFT_18: "moqt-18",
49
+ DRAFT_19: "moqt-19",
50
+ };
51
+ const VERSION_NAMES = {
52
+ [Version.DRAFT_07]: "moq-transport-07",
53
+ [Version.DRAFT_14]: "moq-transport-14",
54
+ [Version.DRAFT_15]: "moq-transport-15",
55
+ [Version.DRAFT_16]: "moq-transport-16",
56
+ [Version.DRAFT_17]: "moq-transport-17",
57
+ [Version.DRAFT_18]: "moq-transport-18",
58
+ [Version.DRAFT_19]: "moq-transport-19",
59
+ };
60
+ export function versionName(v) {
61
+ return VERSION_NAMES[v] ?? `unknown(0x${v.toString(16)})`;
62
+ }
63
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/ietf/version.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG;IACtB;;;OAGG;IACH,QAAQ,EAAE,UAAU;IAEpB;;;OAGG;IACH,QAAQ,EAAE,UAAU;IAEpB;;;OAGG;IACH,QAAQ,EAAE,UAAU;IAEpB;;;OAGG;IACH,QAAQ,EAAE,UAAU;IAEpB;;;OAGG;IACH,QAAQ,EAAE,UAAU;IAEpB;;;OAGG;IACH,QAAQ,EAAE,UAAU;IAEpB;;;OAGG;IACH,QAAQ,EAAE,UAAU;CACX,CAAC;AAIX,kEAAkE;AAClE,MAAM,CAAC,MAAM,IAAI,GAAG;IACnB,QAAQ,EAAE,QAAQ;IAClB,QAAQ,EAAE,SAAS;IACnB,QAAQ,EAAE,SAAS;IACnB,QAAQ,EAAE,SAAS;IACnB,QAAQ,EAAE,SAAS;IACnB,QAAQ,EAAE,SAAS;CACV,CAAC;AAcX,MAAM,aAAa,GAA2B;IAC7C,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,kBAAkB;IACtC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,kBAAkB;IACtC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,kBAAkB;IACtC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,kBAAkB;IACtC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,kBAAkB;IACtC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,kBAAkB;IACtC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,kBAAkB;CACtC,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,CAAU;IACrC,OAAO,aAAa,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC;AAC3D,CAAC","sourcesContent":["/**\n * Supported MoQ Transport protocol versions\n */\nexport const Version = {\n\t/**\n\t * draft-ietf-moq-transport-07\n\t * https://www.ietf.org/archive/id/draft-ietf-moq-transport-07.txt\n\t */\n\tDRAFT_07: 0xff000007,\n\n\t/**\n\t * draft-ietf-moq-transport-14\n\t * https://www.ietf.org/archive/id/draft-ietf-moq-transport-14.txt\n\t */\n\tDRAFT_14: 0xff00000e,\n\n\t/**\n\t * draft-ietf-moq-transport-15\n\t * https://www.ietf.org/archive/id/draft-ietf-moq-transport-15.txt\n\t */\n\tDRAFT_15: 0xff00000f,\n\n\t/**\n\t * draft-ietf-moq-transport-16\n\t * https://www.ietf.org/archive/id/draft-ietf-moq-transport-16.txt\n\t */\n\tDRAFT_16: 0xff000010,\n\n\t/**\n\t * draft-ietf-moq-transport-17\n\t * https://www.ietf.org/archive/id/draft-ietf-moq-transport-17.txt\n\t */\n\tDRAFT_17: 0xff000011,\n\n\t/**\n\t * draft-ietf-moq-transport-18\n\t * https://www.ietf.org/archive/id/draft-ietf-moq-transport-18.txt\n\t */\n\tDRAFT_18: 0xff000012,\n\n\t/**\n\t * draft-ietf-moq-transport-19\n\t * https://www.ietf.org/archive/id/draft-ietf-moq-transport-19.txt\n\t */\n\tDRAFT_19: 0xff000013,\n} as const;\n\nexport type Version = (typeof Version)[keyof typeof Version];\n\n// ALPN / WebTransport subprotocol identifiers for draft versions.\nexport const ALPN = {\n\tDRAFT_14: \"moq-00\",\n\tDRAFT_15: \"moqt-15\",\n\tDRAFT_16: \"moqt-16\",\n\tDRAFT_17: \"moqt-17\",\n\tDRAFT_18: \"moqt-18\",\n\tDRAFT_19: \"moqt-19\",\n} as const;\n\n/**\n * IETF protocol versions used by the ietf/ module.\n * Use this narrower type for version-branched encode/decode to get exhaustive matching.\n */\nexport type IetfVersion =\n\t| typeof Version.DRAFT_14\n\t| typeof Version.DRAFT_15\n\t| typeof Version.DRAFT_16\n\t| typeof Version.DRAFT_17\n\t| typeof Version.DRAFT_18\n\t| typeof Version.DRAFT_19;\n\nconst VERSION_NAMES: Record<number, string> = {\n\t[Version.DRAFT_07]: \"moq-transport-07\",\n\t[Version.DRAFT_14]: \"moq-transport-14\",\n\t[Version.DRAFT_15]: \"moq-transport-15\",\n\t[Version.DRAFT_16]: \"moq-transport-16\",\n\t[Version.DRAFT_17]: \"moq-transport-17\",\n\t[Version.DRAFT_18]: \"moq-transport-18\",\n\t[Version.DRAFT_19]: \"moq-transport-19\",\n};\n\nexport function versionName(v: Version): string {\n\treturn VERSION_NAMES[v] ?? `unknown(0x${v.toString(16)})`;\n}\n"]}
package/index.d.ts ADDED
@@ -0,0 +1,22 @@
1
+ /**
2
+ * MoQ networking layer for browsers: connect to a relay, then publish and consume
3
+ * broadcasts, tracks, groups, and frames over WebTransport (or a WebSocket fallback).
4
+ *
5
+ * @module
6
+ */
7
+ /** Re-export of {@link https://jsr.io/@moq/signals | @moq/signals}, the reactive primitives used throughout this package. */
8
+ export * as Signals from "@norskvideo/moq-signals";
9
+ export * from "./announced";
10
+ export * from "./bandwidth";
11
+ export * from "./broadcast";
12
+ /** Connection helpers: connect to or accept a MoQ session and reconnect on failure. */
13
+ export * as Connection from "./connection/index";
14
+ export * from "./group";
15
+ /** Broadcast path utilities with delimiter-aware prefix matching. */
16
+ export * as Path from "./path";
17
+ /** Branded time types (nanoseconds, microseconds, milliseconds, seconds) with conversions. */
18
+ export * as Time from "./time";
19
+ export * from "./track";
20
+ /** QUIC variable-length integer encoding and decoding. */
21
+ export * as Varint from "./varint";
22
+ //# sourceMappingURL=index.d.ts.map
package/index.d.ts.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,6HAA6H;AAC7H,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC;AACxC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,uFAAuF;AACvF,OAAO,KAAK,UAAU,MAAM,uBAAuB,CAAC;AACpD,cAAc,YAAY,CAAC;AAC3B,qEAAqE;AACrE,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,8FAA8F;AAC9F,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,cAAc,YAAY,CAAC;AAC3B,0DAA0D;AAC1D,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC"}
package/index.js ADDED
@@ -0,0 +1,23 @@
1
+ /* @ts-self-types="./index.d.ts" */
2
+ /**
3
+ * MoQ networking layer for browsers: connect to a relay, then publish and consume
4
+ * broadcasts, tracks, groups, and frames over WebTransport (or a WebSocket fallback).
5
+ *
6
+ * @module
7
+ */
8
+ import * as Signals_1 from "@norskvideo/moq-signals";
9
+ export { Signals_1 as Signals };
10
+ export * from "./announced.js";
11
+ export * from "./bandwidth.js";
12
+ export * from "./broadcast.js";
13
+ import * as Connection_1 from "./connection/index.js";
14
+ export { Connection_1 as Connection };
15
+ export * from "./group.js";
16
+ import * as Path_1 from "./path.js";
17
+ export { Path_1 as Path };
18
+ import * as Time_1 from "./time.js";
19
+ export { Time_1 as Time };
20
+ export * from "./track.js";
21
+ import * as Varint_1 from "./varint.js";
22
+ export { Varint_1 as Varint };
23
+ //# sourceMappingURL=index.js.map
package/index.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;2BAGsB,cAAc;sBAA3B,OAAO;AACnB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;8BAEH,uBAAuB;yBAAvC,UAAU;AACtB,cAAc,YAAY,CAAC;wBAEL,WAAW;mBAArB,IAAI;wBAEM,WAAW;mBAArB,IAAI;AAChB,cAAc,YAAY,CAAC;0BAEH,aAAa;qBAAzB,MAAM","sourcesContent":["/**\n * MoQ networking layer for browsers: connect to a relay, then publish and consume\n * broadcasts, tracks, groups, and frames over WebTransport (or a WebSocket fallback).\n *\n * @module\n */\n\n/** Re-export of {@link https://jsr.io/@moq/signals | @moq/signals}, the reactive primitives used throughout this package. */\nexport * as Signals from \"@moq/signals\";\nexport * from \"./announced.ts\";\nexport * from \"./bandwidth.ts\";\nexport * from \"./broadcast.ts\";\n/** Connection helpers: connect to or accept a MoQ session and reconnect on failure. */\nexport * as Connection from \"./connection/index.ts\";\nexport * from \"./group.ts\";\n/** Broadcast path utilities with delimiter-aware prefix matching. */\nexport * as Path from \"./path.ts\";\n/** Branded time types (nanoseconds, microseconds, milliseconds, seconds) with conversions. */\nexport * as Time from \"./time.ts\";\nexport * from \"./track.ts\";\n/** QUIC variable-length integer encoding and decoding. */\nexport * as Varint from \"./varint.ts\";\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=integration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration.test.d.ts","sourceRoot":"","sources":["../src/integration.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,90 @@
1
+ /* @ts-self-types="./integration.test.d.ts" */
2
+ import { expect, test } from "bun:test";
3
+ import { Broadcast } from "./broadcast.js";
4
+ import { accept, connect } from "./connection/index.js";
5
+ import * as Ietf from "./ietf/index.js";
6
+ import * as Lite from "./lite/index.js";
7
+ import { createMockTransportPair } from "./mock.js";
8
+ import * as Path from "./path.js";
9
+ const url = new URL("https://localhost:4443/test");
10
+ async function runPublishSubscribeFlow(protocol, version) {
11
+ const pair = createMockTransportPair(protocol);
12
+ const [client, server] = await Promise.all([
13
+ connect(url, { transport: pair.client }),
14
+ accept(pair.server, url, version !== undefined ? { version } : undefined),
15
+ ]);
16
+ // Server publishes a broadcast
17
+ const broadcast = new Broadcast();
18
+ server.publish(Path.from("test"), broadcast);
19
+ // Client discovers announced broadcast
20
+ const announced = client.announced();
21
+ const entry = await announced.next();
22
+ if (!entry)
23
+ throw new Error("expected entry");
24
+ expect(entry.path).toBe("test");
25
+ expect(entry.active).toBe(true);
26
+ // Client consumes the broadcast and subscribes to a track
27
+ const remote = client.consume(Path.from("test"));
28
+ const track = remote.subscribe("video", 0);
29
+ // Server handles the subscription request
30
+ const req = await broadcast.requested();
31
+ if (!req)
32
+ throw new Error("expected req");
33
+ expect(req.track.name).toBe("video");
34
+ // Server writes data
35
+ req.track.writeString("hello");
36
+ // Client reads data
37
+ const data = await track.readString();
38
+ expect(data).toBe("hello");
39
+ // Cleanup
40
+ req.track.close();
41
+ broadcast.close();
42
+ announced.close();
43
+ remote.close();
44
+ client.close();
45
+ server.close();
46
+ }
47
+ test("integration: lite draft-01", async () => {
48
+ await runPublishSubscribeFlow("", Lite.Version.DRAFT_01);
49
+ });
50
+ test("integration: lite draft-02", async () => {
51
+ await runPublishSubscribeFlow("", Lite.Version.DRAFT_02);
52
+ });
53
+ test("integration: lite draft-03", async () => {
54
+ await runPublishSubscribeFlow(Lite.ALPN_03);
55
+ });
56
+ test("integration: ietf draft-14", async () => {
57
+ await runPublishSubscribeFlow("", Ietf.Version.DRAFT_14);
58
+ });
59
+ test("integration: ietf draft-15", async () => {
60
+ await runPublishSubscribeFlow(Ietf.ALPN.DRAFT_15);
61
+ });
62
+ test("integration: ietf draft-16", async () => {
63
+ await runPublishSubscribeFlow(Ietf.ALPN.DRAFT_16);
64
+ });
65
+ test("integration: ietf draft-17", async () => {
66
+ await runPublishSubscribeFlow(Ietf.ALPN.DRAFT_17);
67
+ });
68
+ test("integration: ietf draft-18", async () => {
69
+ await runPublishSubscribeFlow(Ietf.ALPN.DRAFT_18);
70
+ });
71
+ test("integration: ietf draft-19", async () => {
72
+ await runPublishSubscribeFlow(Ietf.ALPN.DRAFT_19);
73
+ });
74
+ test("integration: subscribe to non-existent broadcast", async () => {
75
+ const pair = createMockTransportPair("");
76
+ const [client, server] = await Promise.all([
77
+ connect(url, { transport: pair.client }),
78
+ accept(pair.server, url, { version: Ietf.Version.DRAFT_14 }),
79
+ ]);
80
+ // Client tries to consume a broadcast that nobody is publishing
81
+ const remote = client.consume(Path.from("nonexistent"));
82
+ const track = remote.subscribe("video", 0);
83
+ // Reading should eventually error since the broadcast doesn't exist
84
+ await expect((async () => {
85
+ await track.readString();
86
+ })()).rejects.toThrow();
87
+ client.close();
88
+ server.close();
89
+ });
90
+ //# sourceMappingURL=integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration.test.js","sourceRoot":"","sources":["../src/integration.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, test } from \"bun:test\";\nimport { Broadcast } from \"./broadcast.ts\";\nimport { accept, connect } from \"./connection/index.ts\";\nimport * as Ietf from \"./ietf/index.ts\";\nimport * as Lite from \"./lite/index.ts\";\nimport { createMockTransportPair } from \"./mock.ts\";\nimport * as Path from \"./path.ts\";\n\nconst url = new URL(\"https://localhost:4443/test\");\n\nasync function runPublishSubscribeFlow(protocol: string, version?: number) {\n\tconst pair = createMockTransportPair(protocol);\n\n\tconst [client, server] = await Promise.all([\n\t\tconnect(url, { transport: pair.client }),\n\t\taccept(pair.server, url, version !== undefined ? { version } : undefined),\n\t]);\n\n\t// Server publishes a broadcast\n\tconst broadcast = new Broadcast();\n\tserver.publish(Path.from(\"test\"), broadcast);\n\n\t// Client discovers announced broadcast\n\tconst announced = client.announced();\n\tconst entry = await announced.next();\n\tif (!entry) throw new Error(\"expected entry\");\n\texpect(entry.path).toBe(\"test\" as Path.Valid);\n\texpect(entry.active).toBe(true);\n\n\t// Client consumes the broadcast and subscribes to a track\n\tconst remote = client.consume(Path.from(\"test\"));\n\tconst track = remote.subscribe(\"video\", 0);\n\n\t// Server handles the subscription request\n\tconst req = await broadcast.requested();\n\tif (!req) throw new Error(\"expected req\");\n\texpect(req.track.name).toBe(\"video\");\n\n\t// Server writes data\n\treq.track.writeString(\"hello\");\n\n\t// Client reads data\n\tconst data = await track.readString();\n\texpect(data).toBe(\"hello\");\n\n\t// Cleanup\n\treq.track.close();\n\tbroadcast.close();\n\tannounced.close();\n\tremote.close();\n\tclient.close();\n\tserver.close();\n}\n\ntest(\"integration: lite draft-01\", async () => {\n\tawait runPublishSubscribeFlow(\"\", Lite.Version.DRAFT_01);\n});\n\ntest(\"integration: lite draft-02\", async () => {\n\tawait runPublishSubscribeFlow(\"\", Lite.Version.DRAFT_02);\n});\n\ntest(\"integration: lite draft-03\", async () => {\n\tawait runPublishSubscribeFlow(Lite.ALPN_03);\n});\n\ntest(\"integration: ietf draft-14\", async () => {\n\tawait runPublishSubscribeFlow(\"\", Ietf.Version.DRAFT_14);\n});\n\ntest(\"integration: ietf draft-15\", async () => {\n\tawait runPublishSubscribeFlow(Ietf.ALPN.DRAFT_15);\n});\n\ntest(\"integration: ietf draft-16\", async () => {\n\tawait runPublishSubscribeFlow(Ietf.ALPN.DRAFT_16);\n});\n\ntest(\"integration: ietf draft-17\", async () => {\n\tawait runPublishSubscribeFlow(Ietf.ALPN.DRAFT_17);\n});\n\ntest(\"integration: ietf draft-18\", async () => {\n\tawait runPublishSubscribeFlow(Ietf.ALPN.DRAFT_18);\n});\n\ntest(\"integration: ietf draft-19\", async () => {\n\tawait runPublishSubscribeFlow(Ietf.ALPN.DRAFT_19);\n});\n\ntest(\"integration: subscribe to non-existent broadcast\", async () => {\n\tconst pair = createMockTransportPair(\"\");\n\n\tconst [client, server] = await Promise.all([\n\t\tconnect(url, { transport: pair.client }),\n\t\taccept(pair.server, url, { version: Ietf.Version.DRAFT_14 }),\n\t]);\n\n\t// Client tries to consume a broadcast that nobody is publishing\n\tconst remote = client.consume(Path.from(\"nonexistent\"));\n\tconst track = remote.subscribe(\"video\", 0);\n\n\t// Reading should eventually error since the broadcast doesn't exist\n\tawait expect(\n\t\t(async () => {\n\t\t\tawait track.readString();\n\t\t})(),\n\t).rejects.toThrow();\n\n\tclient.close();\n\tserver.close();\n});\n"]}
@@ -0,0 +1,35 @@
1
+ import * as Path from "../path";
2
+ import type { Reader, Writer } from "../stream";
3
+ import { type Origin } from "./origin";
4
+ import { Version } from "./version";
5
+ export declare const MAX_HOPS = 32;
6
+ export declare class Announce {
7
+ #private;
8
+ suffix: Path.Valid;
9
+ active: boolean;
10
+ hops: Origin[];
11
+ constructor(props: {
12
+ suffix: Path.Valid;
13
+ active: boolean;
14
+ hops?: Origin[];
15
+ });
16
+ encode(w: Writer, version: Version): Promise<void>;
17
+ static decode(r: Reader, version: Version): Promise<Announce>;
18
+ static decodeMaybe(r: Reader, version: Version): Promise<Announce | undefined>;
19
+ }
20
+ export declare class AnnounceInterest {
21
+ #private;
22
+ prefix: Path.Valid;
23
+ excludeHop: bigint;
24
+ constructor(prefix: Path.Valid, excludeHop?: bigint);
25
+ encode(w: Writer, version: Version): Promise<void>;
26
+ static decode(r: Reader, version: Version): Promise<AnnounceInterest>;
27
+ }
28
+ export declare class AnnounceInit {
29
+ #private;
30
+ suffixes: Path.Valid[];
31
+ constructor(paths: Path.Valid[]);
32
+ encode(w: Writer, version: Version): Promise<void>;
33
+ static decode(r: Reader, version: Version): Promise<AnnounceInit>;
34
+ }
35
+ //# sourceMappingURL=announce.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"announce.d.ts","sourceRoot":"","sources":["../../src/lite/announce.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,YAAY,CAAC;AACnC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAKvC,eAAO,MAAM,QAAQ,KAAK,CAAC;AAE3B,qBAAa,QAAQ;;IACpB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IAEf,YAAY,KAAK,EAAE;QAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,EAO1E;IAwDK,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvD;IAED,OAAa,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAElE;IAED,OAAa,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAEnF;CACD;AAED,qBAAa,gBAAgB;;IAC5B,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC;IAGnB,UAAU,EAAE,MAAM,CAAC;IAEnB,YAAY,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,UAAU,GAAE,MAAW,EAGtD;IA+BK,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvD;IAED,OAAa,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAE1E;CACD;AAKD,qBAAa,YAAY;;IACxB,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IAEvB,YAAY,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAE9B;IA4BK,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAGvD;IAED,OAAa,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CAGtE;CACD"}
@@ -0,0 +1,166 @@
1
+ /* @ts-self-types="./announce.d.ts" */
2
+ import * as Path from "../path.js";
3
+ import * as Message from "./message.js";
4
+ import { OriginSchema } from "./origin.js";
5
+ import { Version } from "./version.js";
6
+ // Must match the MAX_HOPS in Rust's model/origin.rs. Broadcasts with longer
7
+ // hop chains are rejected; this keeps loop-detection bounded and rejects
8
+ // pathological announcements across clusters with unbounded forwarding.
9
+ export const MAX_HOPS = 32;
10
+ export class Announce {
11
+ suffix;
12
+ active;
13
+ hops;
14
+ constructor(props) {
15
+ this.suffix = props.suffix;
16
+ this.active = props.active;
17
+ this.hops = props.hops ?? [];
18
+ if (this.hops.length > MAX_HOPS) {
19
+ throw new Error(`hop count ${this.hops.length} exceeds maximum ${MAX_HOPS}`);
20
+ }
21
+ }
22
+ async #encode(w, version) {
23
+ await w.bool(this.active);
24
+ await w.string(Path.encode(this.suffix));
25
+ switch (version) {
26
+ case Version.DRAFT_01:
27
+ case Version.DRAFT_02:
28
+ break;
29
+ case Version.DRAFT_03:
30
+ await w.u53(this.hops.length);
31
+ break;
32
+ default:
33
+ // Lite04+: hop count + individual Origin varints.
34
+ await w.u53(this.hops.length);
35
+ for (const origin of this.hops) {
36
+ await w.u62(origin);
37
+ }
38
+ break;
39
+ }
40
+ }
41
+ static async #decode(r, version) {
42
+ const active = await r.bool();
43
+ const suffix = Path.decode(await r.string());
44
+ let hops = [];
45
+ switch (version) {
46
+ case Version.DRAFT_01:
47
+ case Version.DRAFT_02:
48
+ break;
49
+ case Version.DRAFT_03: {
50
+ const count = await r.u53();
51
+ if (count > MAX_HOPS)
52
+ throw new Error(`hop count ${count} exceeds maximum ${MAX_HOPS}`);
53
+ // Lite03 carries only a hop count, not individual ids. Fill with
54
+ // the zero placeholder (OriginSchema accepts 0 as valid on-wire).
55
+ const placeholder = OriginSchema.parse(0n);
56
+ hops = new Array(count).fill(placeholder);
57
+ break;
58
+ }
59
+ default: {
60
+ // Lite04+: hop count + individual Origin varints.
61
+ const count = await r.u53();
62
+ if (count > MAX_HOPS)
63
+ throw new Error(`hop count ${count} exceeds maximum ${MAX_HOPS}`);
64
+ hops = [];
65
+ for (let i = 0; i < count; i++) {
66
+ hops.push(OriginSchema.parse(await r.u62()));
67
+ }
68
+ break;
69
+ }
70
+ }
71
+ return new Announce({ suffix, active, hops });
72
+ }
73
+ async encode(w, version) {
74
+ return Message.encode(w, (w) => this.#encode(w, version));
75
+ }
76
+ static async decode(r, version) {
77
+ return Message.decode(r, (r) => Announce.#decode(r, version));
78
+ }
79
+ static async decodeMaybe(r, version) {
80
+ return Message.decodeMaybe(r, (r) => Announce.#decode(r, version));
81
+ }
82
+ }
83
+ export class AnnounceInterest {
84
+ prefix;
85
+ // 62-bit Origin id of the peer asking for announces. Zero means "no exclusion".
86
+ // Must be a bigint: peer origins are up to 62 bits and overflow u53.
87
+ excludeHop;
88
+ constructor(prefix, excludeHop = 0n) {
89
+ this.prefix = prefix;
90
+ this.excludeHop = excludeHop;
91
+ }
92
+ async #encode(w, version) {
93
+ await w.string(Path.encode(this.prefix));
94
+ switch (version) {
95
+ case Version.DRAFT_01:
96
+ case Version.DRAFT_02:
97
+ case Version.DRAFT_03:
98
+ break;
99
+ default:
100
+ // Lite04+: exclude_hop field (u62 varint).
101
+ await w.u62(this.excludeHop);
102
+ break;
103
+ }
104
+ }
105
+ static async #decode(r, version) {
106
+ const prefix = Path.decode(await r.string());
107
+ let excludeHop = 0n;
108
+ switch (version) {
109
+ case Version.DRAFT_01:
110
+ case Version.DRAFT_02:
111
+ case Version.DRAFT_03:
112
+ break;
113
+ default:
114
+ excludeHop = await r.u62();
115
+ break;
116
+ }
117
+ return new AnnounceInterest(prefix, excludeHop);
118
+ }
119
+ async encode(w, version) {
120
+ return Message.encode(w, (w) => this.#encode(w, version));
121
+ }
122
+ static async decode(r, version) {
123
+ return Message.decode(r, (r) => AnnounceInterest.#decode(r, version));
124
+ }
125
+ }
126
+ /// Sent after setup to communicate the initially announced paths.
127
+ ///
128
+ /// Used by Draft01/Draft02 only. Draft03+ uses individual Announce messages instead.
129
+ export class AnnounceInit {
130
+ suffixes;
131
+ constructor(paths) {
132
+ this.suffixes = paths;
133
+ }
134
+ static #guard(version) {
135
+ switch (version) {
136
+ case Version.DRAFT_01:
137
+ case Version.DRAFT_02:
138
+ break;
139
+ default:
140
+ throw new Error("announce init not supported for this version");
141
+ }
142
+ }
143
+ async #encode(w) {
144
+ await w.u53(this.suffixes.length);
145
+ for (const path of this.suffixes) {
146
+ await w.string(Path.encode(path));
147
+ }
148
+ }
149
+ static async #decode(r) {
150
+ const count = await r.u53();
151
+ const suffixes = [];
152
+ for (let i = 0; i < count; i++) {
153
+ suffixes.push(Path.decode(await r.string()));
154
+ }
155
+ return new AnnounceInit(suffixes);
156
+ }
157
+ async encode(w, version) {
158
+ AnnounceInit.#guard(version);
159
+ return Message.encode(w, this.#encode.bind(this));
160
+ }
161
+ static async decode(r, version) {
162
+ AnnounceInit.#guard(version);
163
+ return Message.decode(r, AnnounceInit.#decode);
164
+ }
165
+ }
166
+ //# sourceMappingURL=announce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"announce.js","sourceRoot":"","sources":["../../src/lite/announce.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Path from \"../path.ts\";\nimport type { Reader, Writer } from \"../stream.ts\";\nimport * as Message from \"./message.ts\";\nimport { type Origin, OriginSchema } from \"./origin.ts\";\nimport { Version } from \"./version.ts\";\n\n// Must match the MAX_HOPS in Rust's model/origin.rs. Broadcasts with longer\n// hop chains are rejected; this keeps loop-detection bounded and rejects\n// pathological announcements across clusters with unbounded forwarding.\nexport const MAX_HOPS = 32;\n\nexport class Announce {\n\tsuffix: Path.Valid;\n\tactive: boolean;\n\thops: Origin[];\n\n\tconstructor(props: { suffix: Path.Valid; active: boolean; hops?: Origin[] }) {\n\t\tthis.suffix = props.suffix;\n\t\tthis.active = props.active;\n\t\tthis.hops = props.hops ?? [];\n\t\tif (this.hops.length > MAX_HOPS) {\n\t\t\tthrow new Error(`hop count ${this.hops.length} exceeds maximum ${MAX_HOPS}`);\n\t\t}\n\t}\n\n\tasync #encode(w: Writer, version: Version) {\n\t\tawait w.bool(this.active);\n\t\tawait w.string(Path.encode(this.suffix));\n\n\t\tswitch (version) {\n\t\t\tcase Version.DRAFT_01:\n\t\t\tcase Version.DRAFT_02:\n\t\t\t\tbreak;\n\t\t\tcase Version.DRAFT_03:\n\t\t\t\tawait w.u53(this.hops.length);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t// Lite04+: hop count + individual Origin varints.\n\t\t\t\tawait w.u53(this.hops.length);\n\t\t\t\tfor (const origin of this.hops) {\n\t\t\t\t\tawait w.u62(origin);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tstatic async #decode(r: Reader, version: Version): Promise<Announce> {\n\t\tconst active = await r.bool();\n\t\tconst suffix = Path.decode(await r.string());\n\n\t\tlet hops: Origin[] = [];\n\t\tswitch (version) {\n\t\t\tcase Version.DRAFT_01:\n\t\t\tcase Version.DRAFT_02:\n\t\t\t\tbreak;\n\t\t\tcase Version.DRAFT_03: {\n\t\t\t\tconst count = await r.u53();\n\t\t\t\tif (count > MAX_HOPS) throw new Error(`hop count ${count} exceeds maximum ${MAX_HOPS}`);\n\t\t\t\t// Lite03 carries only a hop count, not individual ids. Fill with\n\t\t\t\t// the zero placeholder (OriginSchema accepts 0 as valid on-wire).\n\t\t\t\tconst placeholder = OriginSchema.parse(0n);\n\t\t\t\thops = new Array<Origin>(count).fill(placeholder);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\t// Lite04+: hop count + individual Origin varints.\n\t\t\t\tconst count = await r.u53();\n\t\t\t\tif (count > MAX_HOPS) throw new Error(`hop count ${count} exceeds maximum ${MAX_HOPS}`);\n\t\t\t\thops = [];\n\t\t\t\tfor (let i = 0; i < count; i++) {\n\t\t\t\t\thops.push(OriginSchema.parse(await r.u62()));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn new Announce({ suffix, active, hops });\n\t}\n\n\tasync encode(w: Writer, version: Version): Promise<void> {\n\t\treturn Message.encode(w, (w) => this.#encode(w, version));\n\t}\n\n\tstatic async decode(r: Reader, version: Version): Promise<Announce> {\n\t\treturn Message.decode(r, (r) => Announce.#decode(r, version));\n\t}\n\n\tstatic async decodeMaybe(r: Reader, version: Version): Promise<Announce | undefined> {\n\t\treturn Message.decodeMaybe(r, (r) => Announce.#decode(r, version));\n\t}\n}\n\nexport class AnnounceInterest {\n\tprefix: Path.Valid;\n\t// 62-bit Origin id of the peer asking for announces. Zero means \"no exclusion\".\n\t// Must be a bigint: peer origins are up to 62 bits and overflow u53.\n\texcludeHop: bigint;\n\n\tconstructor(prefix: Path.Valid, excludeHop: bigint = 0n) {\n\t\tthis.prefix = prefix;\n\t\tthis.excludeHop = excludeHop;\n\t}\n\n\tasync #encode(w: Writer, version: Version) {\n\t\tawait w.string(Path.encode(this.prefix));\n\t\tswitch (version) {\n\t\t\tcase Version.DRAFT_01:\n\t\t\tcase Version.DRAFT_02:\n\t\t\tcase Version.DRAFT_03:\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t// Lite04+: exclude_hop field (u62 varint).\n\t\t\t\tawait w.u62(this.excludeHop);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tstatic async #decode(r: Reader, version: Version): Promise<AnnounceInterest> {\n\t\tconst prefix = Path.decode(await r.string());\n\t\tlet excludeHop = 0n;\n\t\tswitch (version) {\n\t\t\tcase Version.DRAFT_01:\n\t\t\tcase Version.DRAFT_02:\n\t\t\tcase Version.DRAFT_03:\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\texcludeHop = await r.u62();\n\t\t\t\tbreak;\n\t\t}\n\t\treturn new AnnounceInterest(prefix, excludeHop);\n\t}\n\n\tasync encode(w: Writer, version: Version): Promise<void> {\n\t\treturn Message.encode(w, (w) => this.#encode(w, version));\n\t}\n\n\tstatic async decode(r: Reader, version: Version): Promise<AnnounceInterest> {\n\t\treturn Message.decode(r, (r) => AnnounceInterest.#decode(r, version));\n\t}\n}\n\n/// Sent after setup to communicate the initially announced paths.\n///\n/// Used by Draft01/Draft02 only. Draft03+ uses individual Announce messages instead.\nexport class AnnounceInit {\n\tsuffixes: Path.Valid[];\n\n\tconstructor(paths: Path.Valid[]) {\n\t\tthis.suffixes = paths;\n\t}\n\n\tstatic #guard(version: Version) {\n\t\tswitch (version) {\n\t\t\tcase Version.DRAFT_01:\n\t\t\tcase Version.DRAFT_02:\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new Error(\"announce init not supported for this version\");\n\t\t}\n\t}\n\n\tasync #encode(w: Writer) {\n\t\tawait w.u53(this.suffixes.length);\n\t\tfor (const path of this.suffixes) {\n\t\t\tawait w.string(Path.encode(path));\n\t\t}\n\t}\n\n\tstatic async #decode(r: Reader): Promise<AnnounceInit> {\n\t\tconst count = await r.u53();\n\t\tconst suffixes: Path.Valid[] = [];\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tsuffixes.push(Path.decode(await r.string()));\n\t\t}\n\t\treturn new AnnounceInit(suffixes);\n\t}\n\n\tasync encode(w: Writer, version: Version): Promise<void> {\n\t\tAnnounceInit.#guard(version);\n\t\treturn Message.encode(w, this.#encode.bind(this));\n\t}\n\n\tstatic async decode(r: Reader, version: Version): Promise<AnnounceInit> {\n\t\tAnnounceInit.#guard(version);\n\t\treturn Message.decode(r, AnnounceInit.#decode);\n\t}\n}\n"]}
@@ -0,0 +1,47 @@
1
+ import { Signal } from "@norskvideo/moq-signals";
2
+ import type { Announced } from "../announced";
3
+ import { type Bandwidth } from "../bandwidth";
4
+ import type { Broadcast } from "../broadcast";
5
+ import type { Established } from "../connection/established";
6
+ import * as Path from "../path";
7
+ import { Stream } from "../stream";
8
+ import type * as Time from "../time";
9
+ import { type Origin } from "./origin";
10
+ import { Version } from "./version";
11
+ /**
12
+ * Represents a connection to a MoQ server.
13
+ *
14
+ * @public
15
+ */
16
+ export declare class Connection implements Established {
17
+ #private;
18
+ readonly url: URL;
19
+ readonly version: string;
20
+ /** Estimated send bitrate from the congestion controller. */
21
+ readonly sendBandwidth?: Bandwidth;
22
+ /** Estimated receive bitrate from PROBE (moq-lite-03+ only). */
23
+ readonly recvBandwidth?: Bandwidth;
24
+ /** RTT in milliseconds from PROBE (moq-lite-04+ only). */
25
+ readonly rtt?: Signal<Time.Milli | undefined>;
26
+ /** Random per-connection origin id. Shared by Publisher (for outbound hop
27
+ * chains) and Subscriber (available for optional self-filtering on announces). */
28
+ readonly origin: Origin;
29
+ /**
30
+ * Creates a new Connection instance.
31
+ * @param url - The URL of the connection
32
+ * @param quic - The WebTransport session
33
+ * @param session - The session stream
34
+ *
35
+ * @internal
36
+ */
37
+ constructor(url: URL, quic: WebTransport, version: Version, session?: Stream);
38
+ /**
39
+ * Closes the connection.
40
+ */
41
+ close(): void;
42
+ publish(path: Path.Valid, broadcast: Broadcast): void;
43
+ announced(prefix?: Path.Valid): Announced;
44
+ consume(broadcast: Path.Valid): Broadcast;
45
+ get closed(): Promise<void>;
46
+ }
47
+ //# sourceMappingURL=connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/lite/connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,KAAK,SAAS,EAAmB,MAAM,iBAAiB,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,KAAK,IAAI,MAAM,YAAY,CAAC;AACnC,OAAO,EAAwB,MAAM,EAAU,MAAM,cAAc,CAAC;AACpE,OAAO,KAAK,KAAK,IAAI,MAAM,YAAY,CAAC;AAIxC,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,aAAa,CAAC;AAQxD,OAAO,EAAkB,OAAO,EAAe,MAAM,cAAc,CAAC;AAIpE;;;;GAIG;AACH,qBAAa,UAAW,YAAW,WAAW;;IAE7C,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAGlB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAiBzB,6DAA6D;IAC7D,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,CAAC;IAEnC,gEAAgE;IAChE,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,CAAC;IAEnC,0DAA0D;IAC1D,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC;IAE9C;sFACkF;IAClF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB;;;;;;;OAOG;IACH,YAAY,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,EA2B3E;IAED;;OAEG;IACH,KAAK,SAUJ;IA2BD,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,QAE7C;IAED,SAAS,CAAC,MAAM,aAAe,GAAG,SAAS,CAE1C;IAED,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,GAAG,SAAS,CAExC;IA2HD,IAAI,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAE1B;CACD"}