@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
@@ -9,6 +9,12 @@ export const SetupOption = {
9
9
  MaxAuthTokenCacheSize: 4n,
10
10
  Authority: 5n,
11
11
  Implementation: 7n,
12
+ /** RELAY_HOPS, from the MoQ Cluster extension. See `cluster.ts`. */
13
+ RelayHops: 0x40b55n,
14
+ /** RELAY_COST, from the MoQ Cluster extension. See `cluster.ts`. */
15
+ RelayCost: 0x40b56n,
16
+ /** SOLICIT, from the MoQ Solicit extension. See `solicit.ts`. */
17
+ Solicit: 0x40b5an,
12
18
  };
13
19
  /// Setup Options — used in SETUP messages.
14
20
  ///
@@ -166,27 +172,82 @@ export class SetupOptions {
166
172
  }
167
173
  }
168
174
  // ---- Message Parameters (used in Subscribe, Publish, Fetch, etc.) ----
169
- // Count-prefixed KVPs with delta-encoded keys (d16+).
175
+ // Count-prefixed KVPs through d16, then definition-specific Type-Value pairs.
176
+ // Parameter types are delta-encoded from d16 onward.
170
177
  // Varint parameter IDs (even)
171
178
  const MSG_PARAM_DELIVERY_TIMEOUT = 0x02n;
179
+ /// SUBGROUP_DELIVERY_TIMEOUT, alongside the per-object one above.
180
+ const MSG_PARAM_SUBGROUP_DELIVERY_TIMEOUT = 0x06n;
172
181
  const MSG_PARAM_MAX_CACHE_DURATION = 0x04n;
173
182
  const MSG_PARAM_EXPIRES = 0x08n;
174
183
  const MSG_PARAM_PUBLISHER_PRIORITY = 0x0en;
175
184
  const MSG_PARAM_FORWARD = 0x10n;
176
185
  const MSG_PARAM_SUBSCRIBER_PRIORITY = 0x20n;
177
186
  const MSG_PARAM_GROUP_ORDER = 0x22n;
187
+ /// ROUTE_COST, from the MoQ Cluster extension. See `cluster.ts`.
188
+ const MSG_PARAM_ROUTE_COST = 0x40b58n;
178
189
  // Bytes parameter IDs (odd)
179
190
  const MSG_PARAM_LARGEST_OBJECT = 0x09n;
180
191
  const MSG_PARAM_SUBSCRIPTION_FILTER = 0x21n;
181
- /// Message Parameters — count-prefixed KVPs used in control messages.
192
+ /// FILL_PARAMETERS, draft-20's request for a backfill.
193
+ const MSG_PARAM_FILL_PARAMETERS = 0x23n;
194
+ /// INCLUDE_PROPERTIES, draft-20's opt-out from Track Properties. Its own section calls the
195
+ /// value a uint8, but 0x35 is odd, so the Key-Value-Pair rule length prefixes it.
196
+ const MSG_PARAM_INCLUDE_PROPERTIES = 0x35n;
197
+ /// HOP_PATH, from the MoQ Cluster extension. See `cluster.ts`.
198
+ const MSG_PARAM_HOP_PATH = 0x40b57n;
199
+ function getMessageParamKind(id) {
200
+ switch (id) {
201
+ case MSG_PARAM_DELIVERY_TIMEOUT:
202
+ case MSG_PARAM_SUBGROUP_DELIVERY_TIMEOUT:
203
+ case MSG_PARAM_MAX_CACHE_DURATION:
204
+ case MSG_PARAM_EXPIRES:
205
+ case MSG_PARAM_ROUTE_COST:
206
+ return "varint";
207
+ case MSG_PARAM_PUBLISHER_PRIORITY:
208
+ case MSG_PARAM_SUBSCRIBER_PRIORITY:
209
+ case MSG_PARAM_GROUP_ORDER:
210
+ return "uint8";
211
+ case MSG_PARAM_FORWARD:
212
+ return "bool";
213
+ case MSG_PARAM_LARGEST_OBJECT:
214
+ return "location";
215
+ case MSG_PARAM_SUBSCRIPTION_FILTER:
216
+ case MSG_PARAM_FILL_PARAMETERS:
217
+ case MSG_PARAM_INCLUDE_PROPERTIES:
218
+ case MSG_PARAM_HOP_PATH:
219
+ return "bytes";
220
+ default:
221
+ throw new Error(`unknown message parameter id: ${id.toString()}`);
222
+ }
223
+ }
224
+ function decodeLocation(data) {
225
+ const [groupId, objectData] = Varint.decodeBigInt(data);
226
+ const [objectId, trailing] = Varint.decodeBigInt(objectData);
227
+ if (trailing.length !== 0) {
228
+ throw new Error("trailing bytes in message parameter Location");
229
+ }
230
+ return { groupId, objectId };
231
+ }
232
+ function encodeLocation({ groupId, objectId }) {
233
+ const group = Varint.encode(groupId);
234
+ const object = Varint.encode(objectId);
235
+ const combined = new Uint8Array(group.length + object.length);
236
+ combined.set(group, 0);
237
+ combined.set(object, group.length);
238
+ return combined;
239
+ }
240
+ /** Message parameters used in control messages. */
182
241
  export class Parameters {
183
242
  vars;
184
243
  bytes;
244
+ #locations;
185
245
  constructor() {
186
246
  this.vars = new Map();
187
247
  this.bytes = new Map();
248
+ this.#locations = new Map();
188
249
  }
189
- // --- Varint accessors ---
250
+ // --- Numeric accessors ---
190
251
  get subscriberPriority() {
191
252
  const v = this.vars.get(MSG_PARAM_SUBSCRIBER_PRIORITY);
192
253
  return v !== undefined ? Number(v) : undefined;
@@ -235,33 +296,61 @@ export class Parameters {
235
296
  }
236
297
  // --- Bytes accessors ---
237
298
  get largest() {
238
- const data = this.bytes.get(MSG_PARAM_LARGEST_OBJECT);
239
- if (!data || data.length === 0)
240
- return undefined;
241
- const [groupId, rest] = Varint.decode(data);
242
- const [objectId] = Varint.decode(rest);
243
- return { groupId: BigInt(groupId), objectId: BigInt(objectId) };
299
+ const location = this.#locations.get(MSG_PARAM_LARGEST_OBJECT);
300
+ return location && { ...location };
244
301
  }
245
302
  set largest(v) {
246
- const buf1 = Varint.encode(Number(v.groupId));
247
- const buf2 = Varint.encode(Number(v.objectId));
248
- const combined = new Uint8Array(buf1.length + buf2.length);
249
- combined.set(buf1, 0);
250
- combined.set(buf2, buf1.length);
251
- this.bytes.set(MSG_PARAM_LARGEST_OBJECT, combined);
303
+ this.#locations.set(MSG_PARAM_LARGEST_OBJECT, { ...v });
252
304
  }
305
+ /**
306
+ * LOCATION_FILTER, as its raw parameter value.
307
+ *
308
+ * Raw because the encoding is version dependent: a Filter Type tag through draft-19, a
309
+ * list of up to four varints from draft-20 on. See `filter.ts`.
310
+ */
253
311
  get subscriptionFilter() {
254
- const data = this.bytes.get(MSG_PARAM_SUBSCRIPTION_FILTER);
255
- if (!data || data.length === 0)
256
- return undefined;
257
- // Filter type is a varint — for our purposes, the first byte suffices
258
- return data[0];
312
+ return this.bytes.get(MSG_PARAM_SUBSCRIPTION_FILTER);
259
313
  }
260
314
  set subscriptionFilter(v) {
261
- this.bytes.set(MSG_PARAM_SUBSCRIPTION_FILTER, new Uint8Array([v]));
315
+ this.bytes.set(MSG_PARAM_SUBSCRIPTION_FILTER, v);
316
+ }
317
+ /** FILL_PARAMETERS: the draft-20 backfill request, as its raw parameter value. */
318
+ get fillParameters() {
319
+ return this.bytes.get(MSG_PARAM_FILL_PARAMETERS);
320
+ }
321
+ set fillParameters(v) {
322
+ this.bytes.set(MSG_PARAM_FILL_PARAMETERS, v);
323
+ }
324
+ /** INCLUDE_PROPERTIES: whether the peer wants Track Properties on the response. */
325
+ get includeProperties() {
326
+ const data = this.bytes.get(MSG_PARAM_INCLUDE_PROPERTIES);
327
+ if (!data)
328
+ return undefined;
329
+ // The draft allows exactly 0 or 1; anything else is a protocol violation.
330
+ if (data.length !== 1 || data[0] > 1) {
331
+ throw new Error(`invalid INCLUDE_PROPERTIES value: ${data.join(",")}`);
332
+ }
333
+ return data[0] === 1;
334
+ }
335
+ set includeProperties(v) {
336
+ this.bytes.set(MSG_PARAM_INCLUDE_PROPERTIES, new Uint8Array([v ? 1 : 0]));
337
+ }
338
+ /** HOP_PATH: the hop chain an advertisement traversed, as its raw parameter value. */
339
+ get hopPath() {
340
+ return this.bytes.get(MSG_PARAM_HOP_PATH);
341
+ }
342
+ set hopPath(v) {
343
+ this.bytes.set(MSG_PARAM_HOP_PATH, v);
344
+ }
345
+ /** ROUTE_COST: the accumulated cost of that path. Absent means 0. */
346
+ get routeCost() {
347
+ return this.vars.get(MSG_PARAM_ROUTE_COST);
348
+ }
349
+ set routeCost(v) {
350
+ this.vars.set(MSG_PARAM_ROUTE_COST, v);
262
351
  }
263
352
  async encode(w, version) {
264
- await w.u53(this.vars.size + this.bytes.size);
353
+ await w.u53(this.vars.size + this.bytes.size + this.#locations.size);
265
354
  if (version === Version.DRAFT_14 || version === Version.DRAFT_15) {
266
355
  for (const [id, value] of this.vars) {
267
356
  await w.u62(id);
@@ -272,30 +361,90 @@ export class Parameters {
272
361
  await w.u53(value.length);
273
362
  await w.write(value);
274
363
  }
364
+ for (const [id, value] of this.#locations) {
365
+ const encoded = encodeLocation(value);
366
+ await w.u62(id);
367
+ await w.u53(encoded.length);
368
+ await w.write(encoded);
369
+ }
275
370
  }
276
371
  else {
277
- // d16+: Delta encoding, merge vars and bytes, sort by key
372
+ // d16+: Delta encoding, merge all parameter storage, sort by key
278
373
  const all = [];
279
374
  for (const id of this.vars.keys())
280
- all.push({ key: id, isVar: true });
375
+ all.push({ key: id, storage: "var" });
281
376
  for (const id of this.bytes.keys())
282
- all.push({ key: id, isVar: false });
377
+ all.push({ key: id, storage: "bytes" });
378
+ for (const id of this.#locations.keys())
379
+ all.push({ key: id, storage: "location" });
283
380
  all.sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0));
284
381
  let prevId = 0n;
285
382
  for (let i = 0; i < all.length; i++) {
286
- const { key, isVar } = all[i];
383
+ const { key, storage } = all[i];
287
384
  const delta = i === 0 ? key : key - prevId;
288
385
  prevId = key;
289
386
  await w.u62(delta);
290
- if (isVar) {
291
- // biome-ignore lint/style/noNonNullAssertion: key is guaranteed to exist in vars map
292
- await w.u62(this.vars.get(key));
387
+ if (version === Version.DRAFT_16) {
388
+ if (storage === "var") {
389
+ // biome-ignore lint/style/noNonNullAssertion: key is guaranteed to exist in vars map
390
+ await w.u62(this.vars.get(key));
391
+ }
392
+ else {
393
+ const value = storage === "bytes"
394
+ ? // biome-ignore lint/style/noNonNullAssertion: key is guaranteed to exist in bytes map
395
+ this.bytes.get(key)
396
+ : // biome-ignore lint/style/noNonNullAssertion: key is guaranteed to exist in locations map
397
+ encodeLocation(this.#locations.get(key));
398
+ await w.u53(value.length);
399
+ await w.write(value);
400
+ }
401
+ continue;
293
402
  }
294
- else {
295
- // biome-ignore lint/style/noNonNullAssertion: key is guaranteed to exist in bytes map
296
- const value = this.bytes.get(key);
297
- await w.u53(value.length);
298
- await w.write(value);
403
+ switch (getMessageParamKind(key)) {
404
+ case "varint": {
405
+ const value = this.vars.get(key);
406
+ if (value === undefined)
407
+ throw new Error(`invalid varint message parameter: ${key.toString()}`);
408
+ await w.u62(value);
409
+ break;
410
+ }
411
+ case "uint8": {
412
+ const value = this.vars.get(key);
413
+ if (value === undefined || value < 0n || value > 0xffn) {
414
+ throw new Error(`invalid uint8 message parameter: ${key.toString()}`);
415
+ }
416
+ await w.u8(Number(value));
417
+ break;
418
+ }
419
+ case "bool": {
420
+ const value = this.vars.get(key);
421
+ if (value !== 0n && value !== 1n) {
422
+ throw new Error(`invalid bool message parameter: ${key.toString()}`);
423
+ }
424
+ await w.bool(value === 1n);
425
+ break;
426
+ }
427
+ case "location": {
428
+ const location = this.#locations.get(key);
429
+ if (location === undefined)
430
+ throw new Error(`invalid Location message parameter: ${key.toString()}`);
431
+ // LARGEST_OBJECT is an odd type, so the Key-Value-Pair rule gives it
432
+ // a Length on every draft: two varints inside the value.
433
+ const group = Varint.encodeLeadingOnes(location.groupId);
434
+ const object = Varint.encodeLeadingOnes(location.objectId);
435
+ await w.u53(group.length + object.length);
436
+ await w.write(group);
437
+ await w.write(object);
438
+ break;
439
+ }
440
+ case "bytes": {
441
+ const value = this.bytes.get(key);
442
+ if (value === undefined)
443
+ throw new Error(`invalid bytes message parameter: ${key.toString()}`);
444
+ await w.u53(value.length);
445
+ await w.write(value);
446
+ break;
447
+ }
299
448
  }
300
449
  }
301
450
  }
@@ -315,20 +464,62 @@ export class Parameters {
315
464
  id = i === 0 ? delta : prevType + delta;
316
465
  prevType = id;
317
466
  }
318
- if (id % 2n === 0n) {
319
- if (params.vars.has(id)) {
320
- throw new Error(`duplicate message parameter id: ${id.toString()}`);
467
+ if (version === Version.DRAFT_14 || version === Version.DRAFT_15 || version === Version.DRAFT_16) {
468
+ if (id % 2n === 0n) {
469
+ if (params.vars.has(id)) {
470
+ throw new Error(`duplicate message parameter id: ${id.toString()}`);
471
+ }
472
+ const varint = await r.u62();
473
+ params.vars.set(id, varint);
474
+ }
475
+ else {
476
+ const size = await r.u53();
477
+ const bytes = await r.read(size);
478
+ if (id === MSG_PARAM_LARGEST_OBJECT) {
479
+ if (params.#locations.has(id)) {
480
+ throw new Error(`duplicate message parameter id: ${id.toString()}`);
481
+ }
482
+ params.#locations.set(id, decodeLocation(bytes));
483
+ }
484
+ else {
485
+ if (params.bytes.has(id)) {
486
+ throw new Error(`duplicate message parameter id: ${id.toString()}`);
487
+ }
488
+ params.bytes.set(id, bytes);
489
+ }
321
490
  }
322
- const varint = await r.u62();
323
- params.vars.set(id, varint);
491
+ continue;
324
492
  }
325
- else {
326
- if (params.bytes.has(id)) {
327
- throw new Error(`duplicate message parameter id: ${id.toString()}`);
493
+ if (params.vars.has(id) || params.bytes.has(id) || params.#locations.has(id)) {
494
+ throw new Error(`duplicate message parameter id: ${id.toString()}`);
495
+ }
496
+ switch (getMessageParamKind(id)) {
497
+ case "varint":
498
+ params.vars.set(id, await r.u62());
499
+ break;
500
+ case "uint8":
501
+ params.vars.set(id, BigInt(await r.u8()));
502
+ break;
503
+ case "bool":
504
+ params.vars.set(id, (await r.bool()) ? 1n : 0n);
505
+ break;
506
+ case "location": {
507
+ // LARGEST_OBJECT is an odd type, so the Key-Value-Pair rule gives it a
508
+ // Length on every draft: two varints inside the value.
509
+ const size = await r.u53();
510
+ const [groupId, objectData] = Varint.decodeLeadingOnes(await r.read(size));
511
+ const [objectId, trailing] = Varint.decodeLeadingOnes(objectData);
512
+ if (trailing.length !== 0) {
513
+ throw new Error("trailing bytes in message parameter Location");
514
+ }
515
+ params.#locations.set(id, { groupId, objectId });
516
+ break;
517
+ }
518
+ case "bytes": {
519
+ const size = await r.u53();
520
+ params.bytes.set(id, await r.read(size));
521
+ break;
328
522
  }
329
- const size = await r.u53();
330
- const bytes = await r.read(size);
331
- params.bytes.set(id, bytes);
332
523
  }
333
524
  }
334
525
  return params;
@@ -1 +1 @@
1
- {"version":3,"file":"parameters.js","sourceRoot":"","sources":["../../src/ietf/parameters.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Reader, Writer } from \"../stream.ts\";\nimport * as Varint from \"../varint.ts\";\nimport { type IetfVersion, Version } from \"./version.ts\";\n\n/// Setup Option key constants (separate namespace from Message Parameters).\nexport const SetupOption = {\n\tPath: 1n,\n\tMaxRequestId: 2n,\n\tAuthorizationToken: 3n,\n\tMaxAuthTokenCacheSize: 4n,\n\tAuthority: 5n,\n\tImplementation: 7n,\n} as const;\n\n/// Setup Options — used in SETUP messages.\n///\n/// In d14-d16 these are count-prefixed (\"Setup Parameters\").\n/// In d17 these have no count prefix (\"Setup Options\") and read/write to end of message.\nexport class SetupOptions {\n\tvars: Map<bigint, bigint>;\n\tbytes: Map<bigint, Uint8Array>;\n\n\tconstructor() {\n\t\tthis.vars = new Map();\n\t\tthis.bytes = new Map();\n\t}\n\n\tget size() {\n\t\treturn this.vars.size + this.bytes.size;\n\t}\n\n\tsetBytes(id: bigint, value: Uint8Array) {\n\t\tif (id % 2n !== 1n) {\n\t\t\tthrow new Error(`invalid parameter id: ${id.toString()}, must be odd`);\n\t\t}\n\t\tthis.bytes.set(id, value);\n\t}\n\n\tsetVarint(id: bigint, value: bigint) {\n\t\tif (id % 2n !== 0n) {\n\t\t\tthrow new Error(`invalid parameter id: ${id.toString()}, must be even`);\n\t\t}\n\t\tthis.vars.set(id, value);\n\t}\n\n\tgetBytes(id: bigint): Uint8Array | undefined {\n\t\tif (id % 2n !== 1n) {\n\t\t\tthrow new Error(`invalid parameter id: ${id.toString()}, must be odd`);\n\t\t}\n\t\treturn this.bytes.get(id);\n\t}\n\n\tgetVarint(id: bigint): bigint | undefined {\n\t\tif (id % 2n !== 0n) {\n\t\t\tthrow new Error(`invalid parameter id: ${id.toString()}, must be even`);\n\t\t}\n\t\treturn this.vars.get(id);\n\t}\n\n\tremoveBytes(id: bigint): boolean {\n\t\tif (id % 2n !== 1n) {\n\t\t\tthrow new Error(`invalid parameter id: ${id.toString()}, must be odd`);\n\t\t}\n\t\treturn this.bytes.delete(id);\n\t}\n\n\tremoveVarint(id: bigint): boolean {\n\t\tif (id % 2n !== 0n) {\n\t\t\tthrow new Error(`invalid parameter id: ${id.toString()}, must be even`);\n\t\t}\n\t\treturn this.vars.delete(id);\n\t}\n\n\tasync encode(w: Writer, version: IetfVersion) {\n\t\tif (version !== Version.DRAFT_14 && version !== Version.DRAFT_15) {\n\t\t\t// d17+: no count prefix; d16: count prefix\n\t\t\tif (version === Version.DRAFT_16) {\n\t\t\t\tawait w.u53(this.vars.size + this.bytes.size);\n\t\t\t}\n\n\t\t\t// Delta encoding: collect all keys, sort, encode deltas\n\t\t\tconst all: { key: bigint; isVar: boolean }[] = [];\n\t\t\tfor (const id of this.vars.keys()) all.push({ key: id, isVar: true });\n\t\t\tfor (const id of this.bytes.keys()) all.push({ key: id, isVar: false });\n\t\t\tall.sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0));\n\n\t\t\tlet prevId = 0n;\n\t\t\tfor (let i = 0; i < all.length; i++) {\n\t\t\t\tconst { key, isVar } = all[i];\n\t\t\t\tconst delta = i === 0 ? key : key - prevId;\n\t\t\t\tprevId = key;\n\t\t\t\tawait w.u62(delta);\n\n\t\t\t\tif (isVar) {\n\t\t\t\t\t// biome-ignore lint/style/noNonNullAssertion: key is guaranteed to exist in vars map\n\t\t\t\t\tawait w.u62(this.vars.get(key)!);\n\t\t\t\t} else {\n\t\t\t\t\t// biome-ignore lint/style/noNonNullAssertion: key is guaranteed to exist in bytes map\n\t\t\t\t\tconst value = this.bytes.get(key)!;\n\t\t\t\t\tawait w.u53(value.length);\n\t\t\t\t\tawait w.write(value);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tawait w.u53(this.vars.size + this.bytes.size);\n\n\t\t\tfor (const [id, value] of this.vars) {\n\t\t\t\tawait w.u62(id);\n\t\t\t\tawait w.u62(value);\n\t\t\t}\n\n\t\t\tfor (const [id, value] of this.bytes) {\n\t\t\t\tawait w.u62(id);\n\t\t\t\tawait w.u53(value.length);\n\t\t\t\tawait w.write(value);\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic async decode(r: Reader, version: IetfVersion): Promise<SetupOptions> {\n\t\tconst params = new SetupOptions();\n\n\t\tif (version !== Version.DRAFT_14 && version !== Version.DRAFT_15 && version !== Version.DRAFT_16) {\n\t\t\t// d17+: no count prefix, read until reader is done\n\t\t\tlet prevType = 0n;\n\t\t\tlet i = 0;\n\t\t\twhile (!(await r.done())) {\n\t\t\t\tconst delta = await r.u62();\n\t\t\t\tconst id = i === 0 ? delta : prevType + delta;\n\t\t\t\tprevType = id;\n\t\t\t\ti++;\n\n\t\t\t\tif (id % 2n === 0n) {\n\t\t\t\t\tif (params.vars.has(id)) {\n\t\t\t\t\t\tthrow new Error(`duplicate parameter id: ${id.toString()}`);\n\t\t\t\t\t}\n\t\t\t\t\tconst varint = await r.u62();\n\t\t\t\t\tparams.setVarint(id, varint);\n\t\t\t\t} else {\n\t\t\t\t\tif (params.bytes.has(id)) {\n\t\t\t\t\t\tthrow new Error(`duplicate parameter id: ${id.toString()}`);\n\t\t\t\t\t}\n\t\t\t\t\tconst size = await r.u53();\n\t\t\t\t\tconst bytes = await r.read(size);\n\t\t\t\t\tparams.setBytes(id, bytes);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconst count = await r.u53();\n\t\t\tlet prevType = 0n;\n\n\t\t\tfor (let i = 0; i < count; i++) {\n\t\t\t\tlet id: bigint;\n\t\t\t\tif (version === Version.DRAFT_16) {\n\t\t\t\t\tconst delta = await r.u62();\n\t\t\t\t\tid = i === 0 ? delta : prevType + delta;\n\t\t\t\t\tprevType = id;\n\t\t\t\t} else {\n\t\t\t\t\tid = await r.u62();\n\t\t\t\t}\n\n\t\t\t\tif (id % 2n === 0n) {\n\t\t\t\t\tif (params.vars.has(id)) {\n\t\t\t\t\t\tthrow new Error(`duplicate parameter id: ${id.toString()}`);\n\t\t\t\t\t}\n\t\t\t\t\tconst varint = await r.u62();\n\t\t\t\t\tparams.setVarint(id, varint);\n\t\t\t\t} else {\n\t\t\t\t\tif (params.bytes.has(id)) {\n\t\t\t\t\t\tthrow new Error(`duplicate parameter id: ${id.toString()}`);\n\t\t\t\t\t}\n\t\t\t\t\tconst size = await r.u53();\n\t\t\t\t\tconst bytes = await r.read(size);\n\t\t\t\t\tparams.setBytes(id, bytes);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn params;\n\t}\n}\n\n// ---- Message Parameters (used in Subscribe, Publish, Fetch, etc.) ----\n// Count-prefixed KVPs with delta-encoded keys (d16+).\n\n// Varint parameter IDs (even)\nconst MSG_PARAM_DELIVERY_TIMEOUT = 0x02n;\nconst MSG_PARAM_MAX_CACHE_DURATION = 0x04n;\nconst MSG_PARAM_EXPIRES = 0x08n;\nconst MSG_PARAM_PUBLISHER_PRIORITY = 0x0en;\nconst MSG_PARAM_FORWARD = 0x10n;\nconst MSG_PARAM_SUBSCRIBER_PRIORITY = 0x20n;\nconst MSG_PARAM_GROUP_ORDER = 0x22n;\n\n// Bytes parameter IDs (odd)\nconst MSG_PARAM_LARGEST_OBJECT = 0x09n;\nconst MSG_PARAM_SUBSCRIPTION_FILTER = 0x21n;\n\n/// Message Parameters — count-prefixed KVPs used in control messages.\nexport class Parameters {\n\tvars: Map<bigint, bigint>;\n\tbytes: Map<bigint, Uint8Array>;\n\n\tconstructor() {\n\t\tthis.vars = new Map();\n\t\tthis.bytes = new Map();\n\t}\n\n\t// --- Varint accessors ---\n\n\tget subscriberPriority(): number | undefined {\n\t\tconst v = this.vars.get(MSG_PARAM_SUBSCRIBER_PRIORITY);\n\t\treturn v !== undefined ? Number(v) : undefined;\n\t}\n\n\tset subscriberPriority(v: number) {\n\t\tthis.vars.set(MSG_PARAM_SUBSCRIBER_PRIORITY, BigInt(v));\n\t}\n\n\tget groupOrder(): number | undefined {\n\t\tconst v = this.vars.get(MSG_PARAM_GROUP_ORDER);\n\t\treturn v !== undefined ? Number(v) : undefined;\n\t}\n\n\tset groupOrder(v: number) {\n\t\tthis.vars.set(MSG_PARAM_GROUP_ORDER, BigInt(v));\n\t}\n\n\tget forward(): boolean | undefined {\n\t\tconst v = this.vars.get(MSG_PARAM_FORWARD);\n\t\treturn v !== undefined ? v !== 0n : undefined;\n\t}\n\n\tset forward(v: boolean) {\n\t\tthis.vars.set(MSG_PARAM_FORWARD, v ? 1n : 0n);\n\t}\n\n\tget publisherPriority(): number | undefined {\n\t\tconst v = this.vars.get(MSG_PARAM_PUBLISHER_PRIORITY);\n\t\treturn v !== undefined ? Number(v) : undefined;\n\t}\n\n\tset publisherPriority(v: number) {\n\t\tthis.vars.set(MSG_PARAM_PUBLISHER_PRIORITY, BigInt(v));\n\t}\n\n\tget expires(): bigint | undefined {\n\t\treturn this.vars.get(MSG_PARAM_EXPIRES);\n\t}\n\n\tset expires(v: bigint) {\n\t\tthis.vars.set(MSG_PARAM_EXPIRES, v);\n\t}\n\n\tget deliveryTimeout(): bigint | undefined {\n\t\treturn this.vars.get(MSG_PARAM_DELIVERY_TIMEOUT);\n\t}\n\n\tset deliveryTimeout(v: bigint) {\n\t\tthis.vars.set(MSG_PARAM_DELIVERY_TIMEOUT, v);\n\t}\n\n\tget maxCacheDuration(): bigint | undefined {\n\t\treturn this.vars.get(MSG_PARAM_MAX_CACHE_DURATION);\n\t}\n\n\tset maxCacheDuration(v: bigint) {\n\t\tthis.vars.set(MSG_PARAM_MAX_CACHE_DURATION, v);\n\t}\n\n\t// --- Bytes accessors ---\n\n\tget largest(): { groupId: bigint; objectId: bigint } | undefined {\n\t\tconst data = this.bytes.get(MSG_PARAM_LARGEST_OBJECT);\n\t\tif (!data || data.length === 0) return undefined;\n\t\tconst [groupId, rest] = Varint.decode(data);\n\t\tconst [objectId] = Varint.decode(rest);\n\t\treturn { groupId: BigInt(groupId), objectId: BigInt(objectId) };\n\t}\n\n\tset largest(v: { groupId: bigint; objectId: bigint }) {\n\t\tconst buf1 = Varint.encode(Number(v.groupId));\n\t\tconst buf2 = Varint.encode(Number(v.objectId));\n\t\tconst combined = new Uint8Array(buf1.length + buf2.length);\n\t\tcombined.set(buf1, 0);\n\t\tcombined.set(buf2, buf1.length);\n\t\tthis.bytes.set(MSG_PARAM_LARGEST_OBJECT, combined);\n\t}\n\n\tget subscriptionFilter(): number | undefined {\n\t\tconst data = this.bytes.get(MSG_PARAM_SUBSCRIPTION_FILTER);\n\t\tif (!data || data.length === 0) return undefined;\n\t\t// Filter type is a varint — for our purposes, the first byte suffices\n\t\treturn data[0];\n\t}\n\n\tset subscriptionFilter(v: number) {\n\t\tthis.bytes.set(MSG_PARAM_SUBSCRIPTION_FILTER, new Uint8Array([v]));\n\t}\n\n\tasync encode(w: Writer, version: IetfVersion) {\n\t\tawait w.u53(this.vars.size + this.bytes.size);\n\n\t\tif (version === Version.DRAFT_14 || version === Version.DRAFT_15) {\n\t\t\tfor (const [id, value] of this.vars) {\n\t\t\t\tawait w.u62(id);\n\t\t\t\tawait w.u62(value);\n\t\t\t}\n\n\t\t\tfor (const [id, value] of this.bytes) {\n\t\t\t\tawait w.u62(id);\n\t\t\t\tawait w.u53(value.length);\n\t\t\t\tawait w.write(value);\n\t\t\t}\n\t\t} else {\n\t\t\t// d16+: Delta encoding, merge vars and bytes, sort by key\n\t\t\tconst all: { key: bigint; isVar: boolean }[] = [];\n\t\t\tfor (const id of this.vars.keys()) all.push({ key: id, isVar: true });\n\t\t\tfor (const id of this.bytes.keys()) all.push({ key: id, isVar: false });\n\t\t\tall.sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0));\n\n\t\t\tlet prevId = 0n;\n\t\t\tfor (let i = 0; i < all.length; i++) {\n\t\t\t\tconst { key, isVar } = all[i];\n\t\t\t\tconst delta = i === 0 ? key : key - prevId;\n\t\t\t\tprevId = key;\n\t\t\t\tawait w.u62(delta);\n\n\t\t\t\tif (isVar) {\n\t\t\t\t\t// biome-ignore lint/style/noNonNullAssertion: key is guaranteed to exist in vars map\n\t\t\t\t\tawait w.u62(this.vars.get(key)!);\n\t\t\t\t} else {\n\t\t\t\t\t// biome-ignore lint/style/noNonNullAssertion: key is guaranteed to exist in bytes map\n\t\t\t\t\tconst value = this.bytes.get(key)!;\n\t\t\t\t\tawait w.u53(value.length);\n\t\t\t\t\tawait w.write(value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic async decode(r: Reader, version: IetfVersion): Promise<Parameters> {\n\t\tconst count = await r.u53();\n\t\tconst params = new Parameters();\n\n\t\tlet prevType = 0n;\n\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tlet id: bigint;\n\t\t\tif (version === Version.DRAFT_14 || version === Version.DRAFT_15) {\n\t\t\t\tid = await r.u62();\n\t\t\t} else {\n\t\t\t\t// d16+: delta encoding\n\t\t\t\tconst delta = await r.u62();\n\t\t\t\tid = i === 0 ? delta : prevType + delta;\n\t\t\t\tprevType = id;\n\t\t\t}\n\n\t\t\tif (id % 2n === 0n) {\n\t\t\t\tif (params.vars.has(id)) {\n\t\t\t\t\tthrow new Error(`duplicate message parameter id: ${id.toString()}`);\n\t\t\t\t}\n\t\t\t\tconst varint = await r.u62();\n\t\t\t\tparams.vars.set(id, varint);\n\t\t\t} else {\n\t\t\t\tif (params.bytes.has(id)) {\n\t\t\t\t\tthrow new Error(`duplicate message parameter id: ${id.toString()}`);\n\t\t\t\t}\n\t\t\t\tconst size = await r.u53();\n\t\t\t\tconst bytes = await r.read(size);\n\t\t\t\tparams.bytes.set(id, bytes);\n\t\t\t}\n\t\t}\n\n\t\treturn params;\n\t}\n}\n"]}
1
+ {"version":3,"file":"parameters.js","sourceRoot":"","sources":["../../src/ietf/parameters.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Reader, Writer } from \"../stream.ts\";\nimport * as Varint from \"../varint.ts\";\nimport { type IetfVersion, Version } from \"./version.ts\";\n\n/// Setup Option key constants (separate namespace from Message Parameters).\nexport const SetupOption = {\n\tPath: 1n,\n\tMaxRequestId: 2n,\n\tAuthorizationToken: 3n,\n\tMaxAuthTokenCacheSize: 4n,\n\tAuthority: 5n,\n\tImplementation: 7n,\n\t/** RELAY_HOPS, from the MoQ Cluster extension. See `cluster.ts`. */\n\tRelayHops: 0x40b55n,\n\t/** RELAY_COST, from the MoQ Cluster extension. See `cluster.ts`. */\n\tRelayCost: 0x40b56n,\n\t/** SOLICIT, from the MoQ Solicit extension. See `solicit.ts`. */\n\tSolicit: 0x40b5an,\n} as const;\n\n/// Setup Options — used in SETUP messages.\n///\n/// In d14-d16 these are count-prefixed (\"Setup Parameters\").\n/// In d17 these have no count prefix (\"Setup Options\") and read/write to end of message.\nexport class SetupOptions {\n\tvars: Map<bigint, bigint>;\n\tbytes: Map<bigint, Uint8Array>;\n\n\tconstructor() {\n\t\tthis.vars = new Map();\n\t\tthis.bytes = new Map();\n\t}\n\n\tget size() {\n\t\treturn this.vars.size + this.bytes.size;\n\t}\n\n\tsetBytes(id: bigint, value: Uint8Array) {\n\t\tif (id % 2n !== 1n) {\n\t\t\tthrow new Error(`invalid parameter id: ${id.toString()}, must be odd`);\n\t\t}\n\t\tthis.bytes.set(id, value);\n\t}\n\n\tsetVarint(id: bigint, value: bigint) {\n\t\tif (id % 2n !== 0n) {\n\t\t\tthrow new Error(`invalid parameter id: ${id.toString()}, must be even`);\n\t\t}\n\t\tthis.vars.set(id, value);\n\t}\n\n\tgetBytes(id: bigint): Uint8Array | undefined {\n\t\tif (id % 2n !== 1n) {\n\t\t\tthrow new Error(`invalid parameter id: ${id.toString()}, must be odd`);\n\t\t}\n\t\treturn this.bytes.get(id);\n\t}\n\n\tgetVarint(id: bigint): bigint | undefined {\n\t\tif (id % 2n !== 0n) {\n\t\t\tthrow new Error(`invalid parameter id: ${id.toString()}, must be even`);\n\t\t}\n\t\treturn this.vars.get(id);\n\t}\n\n\tremoveBytes(id: bigint): boolean {\n\t\tif (id % 2n !== 1n) {\n\t\t\tthrow new Error(`invalid parameter id: ${id.toString()}, must be odd`);\n\t\t}\n\t\treturn this.bytes.delete(id);\n\t}\n\n\tremoveVarint(id: bigint): boolean {\n\t\tif (id % 2n !== 0n) {\n\t\t\tthrow new Error(`invalid parameter id: ${id.toString()}, must be even`);\n\t\t}\n\t\treturn this.vars.delete(id);\n\t}\n\n\tasync encode(w: Writer, version: IetfVersion) {\n\t\tif (version !== Version.DRAFT_14 && version !== Version.DRAFT_15) {\n\t\t\t// d17+: no count prefix; d16: count prefix\n\t\t\tif (version === Version.DRAFT_16) {\n\t\t\t\tawait w.u53(this.vars.size + this.bytes.size);\n\t\t\t}\n\n\t\t\t// Delta encoding: collect all keys, sort, encode deltas\n\t\t\tconst all: { key: bigint; isVar: boolean }[] = [];\n\t\t\tfor (const id of this.vars.keys()) all.push({ key: id, isVar: true });\n\t\t\tfor (const id of this.bytes.keys()) all.push({ key: id, isVar: false });\n\t\t\tall.sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0));\n\n\t\t\tlet prevId = 0n;\n\t\t\tfor (let i = 0; i < all.length; i++) {\n\t\t\t\tconst { key, isVar } = all[i];\n\t\t\t\tconst delta = i === 0 ? key : key - prevId;\n\t\t\t\tprevId = key;\n\t\t\t\tawait w.u62(delta);\n\n\t\t\t\tif (isVar) {\n\t\t\t\t\t// biome-ignore lint/style/noNonNullAssertion: key is guaranteed to exist in vars map\n\t\t\t\t\tawait w.u62(this.vars.get(key)!);\n\t\t\t\t} else {\n\t\t\t\t\t// biome-ignore lint/style/noNonNullAssertion: key is guaranteed to exist in bytes map\n\t\t\t\t\tconst value = this.bytes.get(key)!;\n\t\t\t\t\tawait w.u53(value.length);\n\t\t\t\t\tawait w.write(value);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tawait w.u53(this.vars.size + this.bytes.size);\n\n\t\t\tfor (const [id, value] of this.vars) {\n\t\t\t\tawait w.u62(id);\n\t\t\t\tawait w.u62(value);\n\t\t\t}\n\n\t\t\tfor (const [id, value] of this.bytes) {\n\t\t\t\tawait w.u62(id);\n\t\t\t\tawait w.u53(value.length);\n\t\t\t\tawait w.write(value);\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic async decode(r: Reader, version: IetfVersion): Promise<SetupOptions> {\n\t\tconst params = new SetupOptions();\n\n\t\tif (version !== Version.DRAFT_14 && version !== Version.DRAFT_15 && version !== Version.DRAFT_16) {\n\t\t\t// d17+: no count prefix, read until reader is done\n\t\t\tlet prevType = 0n;\n\t\t\tlet i = 0;\n\t\t\twhile (!(await r.done())) {\n\t\t\t\tconst delta = await r.u62();\n\t\t\t\tconst id = i === 0 ? delta : prevType + delta;\n\t\t\t\tprevType = id;\n\t\t\t\ti++;\n\n\t\t\t\tif (id % 2n === 0n) {\n\t\t\t\t\tif (params.vars.has(id)) {\n\t\t\t\t\t\tthrow new Error(`duplicate parameter id: ${id.toString()}`);\n\t\t\t\t\t}\n\t\t\t\t\tconst varint = await r.u62();\n\t\t\t\t\tparams.setVarint(id, varint);\n\t\t\t\t} else {\n\t\t\t\t\tif (params.bytes.has(id)) {\n\t\t\t\t\t\tthrow new Error(`duplicate parameter id: ${id.toString()}`);\n\t\t\t\t\t}\n\t\t\t\t\tconst size = await r.u53();\n\t\t\t\t\tconst bytes = await r.read(size);\n\t\t\t\t\tparams.setBytes(id, bytes);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconst count = await r.u53();\n\t\t\tlet prevType = 0n;\n\n\t\t\tfor (let i = 0; i < count; i++) {\n\t\t\t\tlet id: bigint;\n\t\t\t\tif (version === Version.DRAFT_16) {\n\t\t\t\t\tconst delta = await r.u62();\n\t\t\t\t\tid = i === 0 ? delta : prevType + delta;\n\t\t\t\t\tprevType = id;\n\t\t\t\t} else {\n\t\t\t\t\tid = await r.u62();\n\t\t\t\t}\n\n\t\t\t\tif (id % 2n === 0n) {\n\t\t\t\t\tif (params.vars.has(id)) {\n\t\t\t\t\t\tthrow new Error(`duplicate parameter id: ${id.toString()}`);\n\t\t\t\t\t}\n\t\t\t\t\tconst varint = await r.u62();\n\t\t\t\t\tparams.setVarint(id, varint);\n\t\t\t\t} else {\n\t\t\t\t\tif (params.bytes.has(id)) {\n\t\t\t\t\t\tthrow new Error(`duplicate parameter id: ${id.toString()}`);\n\t\t\t\t\t}\n\t\t\t\t\tconst size = await r.u53();\n\t\t\t\t\tconst bytes = await r.read(size);\n\t\t\t\t\tparams.setBytes(id, bytes);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn params;\n\t}\n}\n\n// ---- Message Parameters (used in Subscribe, Publish, Fetch, etc.) ----\n// Count-prefixed KVPs through d16, then definition-specific Type-Value pairs.\n// Parameter types are delta-encoded from d16 onward.\n\n// Varint parameter IDs (even)\nconst MSG_PARAM_DELIVERY_TIMEOUT = 0x02n;\n/// SUBGROUP_DELIVERY_TIMEOUT, alongside the per-object one above.\nconst MSG_PARAM_SUBGROUP_DELIVERY_TIMEOUT = 0x06n;\nconst MSG_PARAM_MAX_CACHE_DURATION = 0x04n;\nconst MSG_PARAM_EXPIRES = 0x08n;\nconst MSG_PARAM_PUBLISHER_PRIORITY = 0x0en;\nconst MSG_PARAM_FORWARD = 0x10n;\nconst MSG_PARAM_SUBSCRIBER_PRIORITY = 0x20n;\nconst MSG_PARAM_GROUP_ORDER = 0x22n;\n/// ROUTE_COST, from the MoQ Cluster extension. See `cluster.ts`.\nconst MSG_PARAM_ROUTE_COST = 0x40b58n;\n\n// Bytes parameter IDs (odd)\nconst MSG_PARAM_LARGEST_OBJECT = 0x09n;\nconst MSG_PARAM_SUBSCRIPTION_FILTER = 0x21n;\n/// FILL_PARAMETERS, draft-20's request for a backfill.\nconst MSG_PARAM_FILL_PARAMETERS = 0x23n;\n/// INCLUDE_PROPERTIES, draft-20's opt-out from Track Properties. Its own section calls the\n/// value a uint8, but 0x35 is odd, so the Key-Value-Pair rule length prefixes it.\nconst MSG_PARAM_INCLUDE_PROPERTIES = 0x35n;\n/// HOP_PATH, from the MoQ Cluster extension. See `cluster.ts`.\nconst MSG_PARAM_HOP_PATH = 0x40b57n;\n\ntype MessageParamKind = \"varint\" | \"uint8\" | \"bool\" | \"location\" | \"bytes\";\n/** A `{Group, Object}` pair carried by a message parameter, such as LARGEST_OBJECT. */\nexport type MessageLocation = { groupId: bigint; objectId: bigint };\n\nfunction getMessageParamKind(id: bigint): MessageParamKind {\n\tswitch (id) {\n\t\tcase MSG_PARAM_DELIVERY_TIMEOUT:\n\t\tcase MSG_PARAM_SUBGROUP_DELIVERY_TIMEOUT:\n\t\tcase MSG_PARAM_MAX_CACHE_DURATION:\n\t\tcase MSG_PARAM_EXPIRES:\n\t\tcase MSG_PARAM_ROUTE_COST:\n\t\t\treturn \"varint\";\n\t\tcase MSG_PARAM_PUBLISHER_PRIORITY:\n\t\tcase MSG_PARAM_SUBSCRIBER_PRIORITY:\n\t\tcase MSG_PARAM_GROUP_ORDER:\n\t\t\treturn \"uint8\";\n\t\tcase MSG_PARAM_FORWARD:\n\t\t\treturn \"bool\";\n\t\tcase MSG_PARAM_LARGEST_OBJECT:\n\t\t\treturn \"location\";\n\t\tcase MSG_PARAM_SUBSCRIPTION_FILTER:\n\t\tcase MSG_PARAM_FILL_PARAMETERS:\n\t\tcase MSG_PARAM_INCLUDE_PROPERTIES:\n\t\tcase MSG_PARAM_HOP_PATH:\n\t\t\treturn \"bytes\";\n\t\tdefault:\n\t\t\tthrow new Error(`unknown message parameter id: ${id.toString()}`);\n\t}\n}\n\nfunction decodeLocation(data: Uint8Array): MessageLocation {\n\tconst [groupId, objectData] = Varint.decodeBigInt(data);\n\tconst [objectId, trailing] = Varint.decodeBigInt(objectData);\n\tif (trailing.length !== 0) {\n\t\tthrow new Error(\"trailing bytes in message parameter Location\");\n\t}\n\treturn { groupId, objectId };\n}\n\nfunction encodeLocation({ groupId, objectId }: MessageLocation): Uint8Array {\n\tconst group = Varint.encode(groupId);\n\tconst object = Varint.encode(objectId);\n\tconst combined = new Uint8Array(group.length + object.length);\n\tcombined.set(group, 0);\n\tcombined.set(object, group.length);\n\treturn combined;\n}\n\n/** Message parameters used in control messages. */\nexport class Parameters {\n\tvars: Map<bigint, bigint>;\n\tbytes: Map<bigint, Uint8Array>;\n\t#locations: Map<bigint, MessageLocation>;\n\n\tconstructor() {\n\t\tthis.vars = new Map();\n\t\tthis.bytes = new Map();\n\t\tthis.#locations = new Map();\n\t}\n\n\t// --- Numeric accessors ---\n\n\tget subscriberPriority(): number | undefined {\n\t\tconst v = this.vars.get(MSG_PARAM_SUBSCRIBER_PRIORITY);\n\t\treturn v !== undefined ? Number(v) : undefined;\n\t}\n\n\tset subscriberPriority(v: number) {\n\t\tthis.vars.set(MSG_PARAM_SUBSCRIBER_PRIORITY, BigInt(v));\n\t}\n\n\tget groupOrder(): number | undefined {\n\t\tconst v = this.vars.get(MSG_PARAM_GROUP_ORDER);\n\t\treturn v !== undefined ? Number(v) : undefined;\n\t}\n\n\tset groupOrder(v: number) {\n\t\tthis.vars.set(MSG_PARAM_GROUP_ORDER, BigInt(v));\n\t}\n\n\tget forward(): boolean | undefined {\n\t\tconst v = this.vars.get(MSG_PARAM_FORWARD);\n\t\treturn v !== undefined ? v !== 0n : undefined;\n\t}\n\n\tset forward(v: boolean) {\n\t\tthis.vars.set(MSG_PARAM_FORWARD, v ? 1n : 0n);\n\t}\n\n\tget publisherPriority(): number | undefined {\n\t\tconst v = this.vars.get(MSG_PARAM_PUBLISHER_PRIORITY);\n\t\treturn v !== undefined ? Number(v) : undefined;\n\t}\n\n\tset publisherPriority(v: number) {\n\t\tthis.vars.set(MSG_PARAM_PUBLISHER_PRIORITY, BigInt(v));\n\t}\n\n\tget expires(): bigint | undefined {\n\t\treturn this.vars.get(MSG_PARAM_EXPIRES);\n\t}\n\n\tset expires(v: bigint) {\n\t\tthis.vars.set(MSG_PARAM_EXPIRES, v);\n\t}\n\n\tget deliveryTimeout(): bigint | undefined {\n\t\treturn this.vars.get(MSG_PARAM_DELIVERY_TIMEOUT);\n\t}\n\n\tset deliveryTimeout(v: bigint) {\n\t\tthis.vars.set(MSG_PARAM_DELIVERY_TIMEOUT, v);\n\t}\n\n\tget maxCacheDuration(): bigint | undefined {\n\t\treturn this.vars.get(MSG_PARAM_MAX_CACHE_DURATION);\n\t}\n\n\tset maxCacheDuration(v: bigint) {\n\t\tthis.vars.set(MSG_PARAM_MAX_CACHE_DURATION, v);\n\t}\n\n\t// --- Bytes accessors ---\n\n\tget largest(): MessageLocation | undefined {\n\t\tconst location = this.#locations.get(MSG_PARAM_LARGEST_OBJECT);\n\t\treturn location && { ...location };\n\t}\n\n\tset largest(v: MessageLocation) {\n\t\tthis.#locations.set(MSG_PARAM_LARGEST_OBJECT, { ...v });\n\t}\n\n\t/**\n\t * LOCATION_FILTER, as its raw parameter value.\n\t *\n\t * Raw because the encoding is version dependent: a Filter Type tag through draft-19, a\n\t * list of up to four varints from draft-20 on. See `filter.ts`.\n\t */\n\tget subscriptionFilter(): Uint8Array | undefined {\n\t\treturn this.bytes.get(MSG_PARAM_SUBSCRIPTION_FILTER);\n\t}\n\n\tset subscriptionFilter(v: Uint8Array) {\n\t\tthis.bytes.set(MSG_PARAM_SUBSCRIPTION_FILTER, v);\n\t}\n\n\t/** FILL_PARAMETERS: the draft-20 backfill request, as its raw parameter value. */\n\tget fillParameters(): Uint8Array | undefined {\n\t\treturn this.bytes.get(MSG_PARAM_FILL_PARAMETERS);\n\t}\n\n\tset fillParameters(v: Uint8Array) {\n\t\tthis.bytes.set(MSG_PARAM_FILL_PARAMETERS, v);\n\t}\n\n\t/** INCLUDE_PROPERTIES: whether the peer wants Track Properties on the response. */\n\tget includeProperties(): boolean | undefined {\n\t\tconst data = this.bytes.get(MSG_PARAM_INCLUDE_PROPERTIES);\n\t\tif (!data) return undefined;\n\t\t// The draft allows exactly 0 or 1; anything else is a protocol violation.\n\t\tif (data.length !== 1 || data[0] > 1) {\n\t\t\tthrow new Error(`invalid INCLUDE_PROPERTIES value: ${data.join(\",\")}`);\n\t\t}\n\t\treturn data[0] === 1;\n\t}\n\n\tset includeProperties(v: boolean) {\n\t\tthis.bytes.set(MSG_PARAM_INCLUDE_PROPERTIES, new Uint8Array([v ? 1 : 0]));\n\t}\n\n\t/** HOP_PATH: the hop chain an advertisement traversed, as its raw parameter value. */\n\tget hopPath(): Uint8Array | undefined {\n\t\treturn this.bytes.get(MSG_PARAM_HOP_PATH);\n\t}\n\n\tset hopPath(v: Uint8Array) {\n\t\tthis.bytes.set(MSG_PARAM_HOP_PATH, v);\n\t}\n\n\t/** ROUTE_COST: the accumulated cost of that path. Absent means 0. */\n\tget routeCost(): bigint | undefined {\n\t\treturn this.vars.get(MSG_PARAM_ROUTE_COST);\n\t}\n\n\tset routeCost(v: bigint) {\n\t\tthis.vars.set(MSG_PARAM_ROUTE_COST, v);\n\t}\n\n\tasync encode(w: Writer, version: IetfVersion) {\n\t\tawait w.u53(this.vars.size + this.bytes.size + this.#locations.size);\n\n\t\tif (version === Version.DRAFT_14 || version === Version.DRAFT_15) {\n\t\t\tfor (const [id, value] of this.vars) {\n\t\t\t\tawait w.u62(id);\n\t\t\t\tawait w.u62(value);\n\t\t\t}\n\n\t\t\tfor (const [id, value] of this.bytes) {\n\t\t\t\tawait w.u62(id);\n\t\t\t\tawait w.u53(value.length);\n\t\t\t\tawait w.write(value);\n\t\t\t}\n\n\t\t\tfor (const [id, value] of this.#locations) {\n\t\t\t\tconst encoded = encodeLocation(value);\n\t\t\t\tawait w.u62(id);\n\t\t\t\tawait w.u53(encoded.length);\n\t\t\t\tawait w.write(encoded);\n\t\t\t}\n\t\t} else {\n\t\t\t// d16+: Delta encoding, merge all parameter storage, sort by key\n\t\t\tconst all: { key: bigint; storage: \"var\" | \"bytes\" | \"location\" }[] = [];\n\t\t\tfor (const id of this.vars.keys()) all.push({ key: id, storage: \"var\" });\n\t\t\tfor (const id of this.bytes.keys()) all.push({ key: id, storage: \"bytes\" });\n\t\t\tfor (const id of this.#locations.keys()) all.push({ key: id, storage: \"location\" });\n\t\t\tall.sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0));\n\n\t\t\tlet prevId = 0n;\n\t\t\tfor (let i = 0; i < all.length; i++) {\n\t\t\t\tconst { key, storage } = all[i];\n\t\t\t\tconst delta = i === 0 ? key : key - prevId;\n\t\t\t\tprevId = key;\n\t\t\t\tawait w.u62(delta);\n\n\t\t\t\tif (version === Version.DRAFT_16) {\n\t\t\t\t\tif (storage === \"var\") {\n\t\t\t\t\t\t// biome-ignore lint/style/noNonNullAssertion: key is guaranteed to exist in vars map\n\t\t\t\t\t\tawait w.u62(this.vars.get(key)!);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst value =\n\t\t\t\t\t\t\tstorage === \"bytes\"\n\t\t\t\t\t\t\t\t? // biome-ignore lint/style/noNonNullAssertion: key is guaranteed to exist in bytes map\n\t\t\t\t\t\t\t\t\tthis.bytes.get(key)!\n\t\t\t\t\t\t\t\t: // biome-ignore lint/style/noNonNullAssertion: key is guaranteed to exist in locations map\n\t\t\t\t\t\t\t\t\tencodeLocation(this.#locations.get(key)!);\n\t\t\t\t\t\tawait w.u53(value.length);\n\t\t\t\t\t\tawait w.write(value);\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tswitch (getMessageParamKind(key)) {\n\t\t\t\t\tcase \"varint\": {\n\t\t\t\t\t\tconst value = this.vars.get(key);\n\t\t\t\t\t\tif (value === undefined) throw new Error(`invalid varint message parameter: ${key.toString()}`);\n\t\t\t\t\t\tawait w.u62(value);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"uint8\": {\n\t\t\t\t\t\tconst value = this.vars.get(key);\n\t\t\t\t\t\tif (value === undefined || value < 0n || value > 0xffn) {\n\t\t\t\t\t\t\tthrow new Error(`invalid uint8 message parameter: ${key.toString()}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tawait w.u8(Number(value));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"bool\": {\n\t\t\t\t\t\tconst value = this.vars.get(key);\n\t\t\t\t\t\tif (value !== 0n && value !== 1n) {\n\t\t\t\t\t\t\tthrow new Error(`invalid bool message parameter: ${key.toString()}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tawait w.bool(value === 1n);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"location\": {\n\t\t\t\t\t\tconst location = this.#locations.get(key);\n\t\t\t\t\t\tif (location === undefined)\n\t\t\t\t\t\t\tthrow new Error(`invalid Location message parameter: ${key.toString()}`);\n\t\t\t\t\t\t// LARGEST_OBJECT is an odd type, so the Key-Value-Pair rule gives it\n\t\t\t\t\t\t// a Length on every draft: two varints inside the value.\n\t\t\t\t\t\tconst group = Varint.encodeLeadingOnes(location.groupId);\n\t\t\t\t\t\tconst object = Varint.encodeLeadingOnes(location.objectId);\n\t\t\t\t\t\tawait w.u53(group.length + object.length);\n\t\t\t\t\t\tawait w.write(group);\n\t\t\t\t\t\tawait w.write(object);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"bytes\": {\n\t\t\t\t\t\tconst value = this.bytes.get(key);\n\t\t\t\t\t\tif (value === undefined) throw new Error(`invalid bytes message parameter: ${key.toString()}`);\n\t\t\t\t\t\tawait w.u53(value.length);\n\t\t\t\t\t\tawait w.write(value);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic async decode(r: Reader, version: IetfVersion): Promise<Parameters> {\n\t\tconst count = await r.u53();\n\t\tconst params = new Parameters();\n\n\t\tlet prevType = 0n;\n\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tlet id: bigint;\n\t\t\tif (version === Version.DRAFT_14 || version === Version.DRAFT_15) {\n\t\t\t\tid = await r.u62();\n\t\t\t} else {\n\t\t\t\t// d16+: delta encoding\n\t\t\t\tconst delta = await r.u62();\n\t\t\t\tid = i === 0 ? delta : prevType + delta;\n\t\t\t\tprevType = id;\n\t\t\t}\n\n\t\t\tif (version === Version.DRAFT_14 || version === Version.DRAFT_15 || version === Version.DRAFT_16) {\n\t\t\t\tif (id % 2n === 0n) {\n\t\t\t\t\tif (params.vars.has(id)) {\n\t\t\t\t\t\tthrow new Error(`duplicate message parameter id: ${id.toString()}`);\n\t\t\t\t\t}\n\t\t\t\t\tconst varint = await r.u62();\n\t\t\t\t\tparams.vars.set(id, varint);\n\t\t\t\t} else {\n\t\t\t\t\tconst size = await r.u53();\n\t\t\t\t\tconst bytes = await r.read(size);\n\t\t\t\t\tif (id === MSG_PARAM_LARGEST_OBJECT) {\n\t\t\t\t\t\tif (params.#locations.has(id)) {\n\t\t\t\t\t\t\tthrow new Error(`duplicate message parameter id: ${id.toString()}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tparams.#locations.set(id, decodeLocation(bytes));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (params.bytes.has(id)) {\n\t\t\t\t\t\t\tthrow new Error(`duplicate message parameter id: ${id.toString()}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tparams.bytes.set(id, bytes);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (params.vars.has(id) || params.bytes.has(id) || params.#locations.has(id)) {\n\t\t\t\tthrow new Error(`duplicate message parameter id: ${id.toString()}`);\n\t\t\t}\n\n\t\t\tswitch (getMessageParamKind(id)) {\n\t\t\t\tcase \"varint\":\n\t\t\t\t\tparams.vars.set(id, await r.u62());\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"uint8\":\n\t\t\t\t\tparams.vars.set(id, BigInt(await r.u8()));\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"bool\":\n\t\t\t\t\tparams.vars.set(id, (await r.bool()) ? 1n : 0n);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"location\": {\n\t\t\t\t\t// LARGEST_OBJECT is an odd type, so the Key-Value-Pair rule gives it a\n\t\t\t\t\t// Length on every draft: two varints inside the value.\n\t\t\t\t\tconst size = await r.u53();\n\t\t\t\t\tconst [groupId, objectData] = Varint.decodeLeadingOnes(await r.read(size));\n\t\t\t\t\tconst [objectId, trailing] = Varint.decodeLeadingOnes(objectData);\n\t\t\t\t\tif (trailing.length !== 0) {\n\t\t\t\t\t\tthrow new Error(\"trailing bytes in message parameter Location\");\n\t\t\t\t\t}\n\t\t\t\t\tparams.#locations.set(id, { groupId, objectId });\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"bytes\": {\n\t\t\t\t\tconst size = await r.u53();\n\t\t\t\t\tparams.bytes.set(id, await r.read(size));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn params;\n\t}\n}\n"]}
@@ -0,0 +1,5 @@
1
+ /** Convert an IETF subscriber priority into the model's higher-first priority. */
2
+ export declare function fromWire(priority: number): number;
3
+ /** Convert the model's higher-first priority into an IETF subscriber priority. */
4
+ export declare function toWire(priority: number): number;
5
+ //# sourceMappingURL=priority.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"priority.d.ts","sourceRoot":"","sources":["../../src/ietf/priority.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,kFAAkF;AAClF,wBAAgB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE/C"}
@@ -0,0 +1,10 @@
1
+ /* @ts-self-types="./priority.d.ts" */
2
+ /** Convert an IETF subscriber priority into the model's higher-first priority. */
3
+ export function fromWire(priority) {
4
+ return 0xff - priority;
5
+ }
6
+ /** Convert the model's higher-first priority into an IETF subscriber priority. */
7
+ export function toWire(priority) {
8
+ return 0xff - priority;
9
+ }
10
+ //# sourceMappingURL=priority.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"priority.js","sourceRoot":"","sources":["../../src/ietf/priority.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,MAAM,UAAU,QAAQ,CAAC,QAAgB;IACxC,OAAO,IAAI,GAAG,QAAQ,CAAC;AACxB,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,MAAM,CAAC,QAAgB;IACtC,OAAO,IAAI,GAAG,QAAQ,CAAC;AACxB,CAAC","sourcesContent":["/** Convert an IETF subscriber priority into the model's higher-first priority. */\nexport function fromWire(priority: number): number {\n\treturn 0xff - priority;\n}\n\n/** Convert the model's higher-first priority into an IETF subscriber priority. */\nexport function toWire(priority: number): number {\n\treturn 0xff - priority;\n}\n"]}
@@ -1,4 +1,15 @@
1
- import type { Reader } from "../stream";
1
+ import type { Reader, Writer } from "../stream";
2
+ import { Timescale } from "../time";
2
3
  import { type IetfVersion } from "./version";
3
- export declare function skip(r: Reader, version: IetfVersion): Promise<void>;
4
+ /**
5
+ * DEFAULT_PUBLISHER_GROUP_ORDER's descending value: the newest group first, which is what
6
+ * we serve, matching moq-lite.
7
+ */
8
+ export declare const DESCENDING = 2;
9
+ export interface Properties {
10
+ timescale?: Timescale;
11
+ groupOrder?: number;
12
+ }
13
+ export declare function encode(w: Writer, properties: Properties, version: IetfVersion): Promise<void>;
14
+ export declare function decode(r: Reader, version: IetfVersion): Promise<Properties>;
4
15
  //# sourceMappingURL=properties.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"properties.d.ts","sourceRoot":"","sources":["../../src/ietf/properties.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,KAAK,WAAW,EAAW,MAAM,cAAc,CAAC;AASzD,wBAAsB,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBzE"}
1
+ {"version":3,"file":"properties.d.ts","sourceRoot":"","sources":["../../src/ietf/properties.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,KAAK,WAAW,EAAW,MAAM,cAAc,CAAC;AAazD;;;GAGG;AACH,eAAO,MAAM,UAAU,IAAO,CAAC;AAG/B,MAAM,WAAW,UAAU;IAI1B,SAAS,CAAC,EAAE,SAAS,CAAC;IAMtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAMD,wBAAsB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBnG;AAYD,wBAAsB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAwCjF"}