@moqtap/codec 0.9.0 → 0.11.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 (232) hide show
  1. package/CHANGELOG.md +173 -0
  2. package/dist/auth-redaction-DsdLq4Qs.d.cts +102 -0
  3. package/dist/auth-redaction-DsdLq4Qs.d.ts +102 -0
  4. package/dist/{chunk-PU2KV7VP.cjs → chunk-27K5BUAG.cjs} +485 -515
  5. package/dist/{chunk-BV6MITLO.js → chunk-3RNQMGKA.js} +365 -390
  6. package/dist/{chunk-2XH6PHXR.js → chunk-5AWIXOLB.js} +442 -467
  7. package/dist/{chunk-4XLYCT5Q.cjs → chunk-5IMHJIAZ.cjs} +52 -2
  8. package/dist/{chunk-TVSFDQYE.cjs → chunk-5JGZCKJO.cjs} +513 -531
  9. package/dist/{chunk-IADVBKEJ.cjs → chunk-73K4OSAN.cjs} +407 -432
  10. package/dist/{chunk-N2V7Z37J.js → chunk-7VQKRGRD.js} +19 -3
  11. package/dist/{chunk-UZO5Z2XT.cjs → chunk-A3UCQOIB.cjs} +490 -515
  12. package/dist/{chunk-JKMYAUGY.js → chunk-A7PDMVXM.js} +35 -11
  13. package/dist/{chunk-VZHL2U2N.cjs → chunk-A7VQO6YC.cjs} +54 -38
  14. package/dist/{chunk-KCH4BQXK.cjs → chunk-ACQHZLRZ.cjs} +73 -47
  15. package/dist/{chunk-H6DTAIWM.js → chunk-BBICOMW6.js} +47 -19
  16. package/dist/{chunk-MAXEHYVB.cjs → chunk-BNIUVOCJ.cjs} +554 -612
  17. package/dist/{chunk-QGIHC6BA.cjs → chunk-CNC6ANS4.cjs} +70 -46
  18. package/dist/{chunk-NH4L6NIY.js → chunk-FDLQSWHK.js} +437 -467
  19. package/dist/{chunk-IJAF6PAY.js → chunk-FFNOE4UR.js} +19 -3
  20. package/dist/{chunk-CZNW3R5E.cjs → chunk-GMENT63T.cjs} +54 -38
  21. package/dist/{chunk-7ENEWAMZ.cjs → chunk-HM7BLRVP.cjs} +305 -305
  22. package/dist/{chunk-XHAP2YST.js → chunk-HZONHFNO.js} +19 -3
  23. package/dist/{chunk-EVCPBFSR.cjs → chunk-ILYABWDK.cjs} +83 -55
  24. package/dist/{chunk-IDV2JYJ6.cjs → chunk-KRSFTZVO.cjs} +56 -40
  25. package/dist/{chunk-RIIA4ALQ.cjs → chunk-KSPH6KMH.cjs} +54 -38
  26. package/dist/{chunk-UA5XFP4O.cjs → chunk-KTY4LAUV.cjs} +485 -494
  27. package/dist/{chunk-RZTLQAKF.js → chunk-OJNLJT5D.js} +0 -1
  28. package/dist/{chunk-YJGOD3Y4.js → chunk-PJK2ZS3I.js} +492 -550
  29. package/dist/{chunk-TMXRYOBS.js → chunk-PSMZKHOC.js} +444 -453
  30. package/dist/{chunk-7RE6KSIY.cjs → chunk-Q5JQGHWY.cjs} +0 -1
  31. package/dist/{chunk-23KRITJ6.js → chunk-SQTUQY5E.js} +37 -11
  32. package/dist/{chunk-XQGEOFGE.js → chunk-WCRLAKDW.js} +253 -253
  33. package/dist/{chunk-KYVTM5VI.js → chunk-WL2YUEXH.js} +19 -3
  34. package/dist/{chunk-Q7NSUXXB.js → chunk-YCNIVZS7.js} +464 -482
  35. package/dist/{chunk-KLPWJU6W.js → chunk-YRZQVNZO.js} +50 -0
  36. package/dist/{codec-Bym-K2q2.d.cts → codec-76xzrLTL.d.cts} +21 -2
  37. package/dist/{codec-BKsVu3Fr.d.ts → codec-8p40WdLg.d.ts} +21 -2
  38. package/dist/{codec-Dl_QIXMz.d.ts → codec-BN2Bu0KI.d.ts} +20 -1
  39. package/dist/{codec-D4RvFQmu.d.ts → codec-Bb6GKTrv.d.ts} +21 -2
  40. package/dist/{codec-DAyiF5sq.d.cts → codec-BgpfHoAd.d.cts} +21 -2
  41. package/dist/{codec-CA6nbbEk.d.ts → codec-BkheTXO7.d.ts} +21 -2
  42. package/dist/{codec-DchsPfr3.d.cts → codec-BwVDkokh.d.cts} +21 -2
  43. package/dist/{codec-CgZdadPt.d.cts → codec-C5s1eBJX.d.cts} +21 -2
  44. package/dist/codec-CM5yd6n3.d.ts +38 -0
  45. package/dist/{codec-DJmqoIsp.d.cts → codec-Cb8HC3XV.d.cts} +21 -2
  46. package/dist/codec-Clu_skx8.d.cts +38 -0
  47. package/dist/{codec-DzkdW4kO.d.cts → codec-CpOpemR8.d.cts} +20 -1
  48. package/dist/{codec-CXCjya_G.d.cts → codec-Cshdl9Tt.d.cts} +20 -1
  49. package/dist/{codec-CSBFdPgP.d.cts → codec-DELe00w_.d.cts} +21 -2
  50. package/dist/{codec-C_xxsbKy.d.cts → codec-DHzKAUCa.d.cts} +21 -2
  51. package/dist/{codec--CVeqGQv.d.ts → codec-DdVBtvx7.d.ts} +20 -1
  52. package/dist/{codec-CviAa4lp.d.ts → codec-DlxGuYMv.d.ts} +21 -2
  53. package/dist/{codec-BNy5syCU.d.ts → codec-DxtgPxJS.d.ts} +20 -1
  54. package/dist/{codec-CtvFK4aV.d.cts → codec-GAY4lybi.d.cts} +21 -2
  55. package/dist/{codec-Cfo_z5ET.d.cts → codec-I8u2pfS4.d.cts} +20 -1
  56. package/dist/{codec-vddqy0KY.d.cts → codec-XLrnreeu.d.cts} +21 -2
  57. package/dist/{codec-O-1Js7h4.d.ts → codec-c0YEwwWn.d.ts} +21 -2
  58. package/dist/{codec-Cl73EfRW.d.ts → codec-ejDu-va6.d.ts} +21 -2
  59. package/dist/{codec-C006F75E.d.ts → codec-kaBUzdpV.d.ts} +21 -2
  60. package/dist/{codec-C5evFHL-.d.ts → codec-mVYqkIUF.d.ts} +21 -2
  61. package/dist/{codec-BMwgZIgG.d.ts → codec-qSbO5nOa.d.ts} +21 -2
  62. package/dist/{codec-BQa6Qsav.d.ts → codec-yYKGOipj.d.ts} +21 -2
  63. package/dist/{codec-DzLvG8Wb.d.cts → codec-zfzg9uiy.d.cts} +21 -2
  64. package/dist/draft07.cjs +48 -4
  65. package/dist/draft07.d.cts +42 -2
  66. package/dist/draft07.d.ts +42 -2
  67. package/dist/draft07.js +49 -5
  68. package/dist/draft08.cjs +76 -3
  69. package/dist/draft08.d.cts +70 -2
  70. package/dist/draft08.d.ts +70 -2
  71. package/dist/draft08.js +77 -4
  72. package/dist/draft09.cjs +76 -3
  73. package/dist/draft09.d.cts +70 -2
  74. package/dist/draft09.d.ts +70 -2
  75. package/dist/draft09.js +77 -4
  76. package/dist/draft10.cjs +76 -3
  77. package/dist/draft10.d.cts +70 -2
  78. package/dist/draft10.d.ts +70 -2
  79. package/dist/draft10.js +77 -4
  80. package/dist/draft11-session.d.cts +1 -1
  81. package/dist/draft11-session.d.ts +1 -1
  82. package/dist/draft11.cjs +104 -3
  83. package/dist/draft11.d.cts +100 -4
  84. package/dist/draft11.d.ts +100 -4
  85. package/dist/draft11.js +105 -4
  86. package/dist/draft12-session.d.cts +1 -1
  87. package/dist/draft12-session.d.ts +1 -1
  88. package/dist/draft12.cjs +113 -3
  89. package/dist/draft12.d.cts +109 -4
  90. package/dist/draft12.d.ts +109 -4
  91. package/dist/draft12.js +114 -4
  92. package/dist/draft13-session.d.cts +1 -1
  93. package/dist/draft13-session.d.ts +1 -1
  94. package/dist/draft13.cjs +105 -3
  95. package/dist/draft13.d.cts +101 -4
  96. package/dist/draft13.d.ts +101 -4
  97. package/dist/draft13.js +106 -4
  98. package/dist/draft14-session.d.cts +1 -1
  99. package/dist/draft14-session.d.ts +1 -1
  100. package/dist/draft14.cjs +107 -3
  101. package/dist/draft14.d.cts +103 -30
  102. package/dist/draft14.d.ts +103 -30
  103. package/dist/draft14.js +108 -4
  104. package/dist/draft15-session.d.cts +1 -1
  105. package/dist/draft15-session.d.ts +1 -1
  106. package/dist/draft15.cjs +69 -3
  107. package/dist/draft15.d.cts +65 -22
  108. package/dist/draft15.d.ts +65 -22
  109. package/dist/draft15.js +70 -4
  110. package/dist/draft16-session.cjs +2 -2
  111. package/dist/draft16-session.d.cts +1 -1
  112. package/dist/draft16-session.d.ts +1 -1
  113. package/dist/draft16-session.js +1 -1
  114. package/dist/draft16.cjs +76 -8
  115. package/dist/draft16.d.cts +67 -13
  116. package/dist/draft16.d.ts +67 -13
  117. package/dist/draft16.js +73 -5
  118. package/dist/draft17-session.d.cts +1 -1
  119. package/dist/draft17-session.d.ts +1 -1
  120. package/dist/draft17.cjs +77 -3
  121. package/dist/draft17.d.cts +73 -4
  122. package/dist/draft17.d.ts +73 -4
  123. package/dist/draft17.js +78 -4
  124. package/dist/draft18-session.d.cts +1 -1
  125. package/dist/draft18-session.d.ts +1 -1
  126. package/dist/draft18.cjs +8 -3
  127. package/dist/draft18.d.cts +4 -3
  128. package/dist/draft18.d.ts +4 -3
  129. package/dist/draft18.js +9 -4
  130. package/dist/draft19-session.d.cts +1 -1
  131. package/dist/draft19-session.d.ts +1 -1
  132. package/dist/draft19.cjs +11 -4
  133. package/dist/draft19.d.cts +4 -3
  134. package/dist/draft19.d.ts +4 -3
  135. package/dist/draft19.js +12 -5
  136. package/dist/draft20-session.d.cts +1 -1
  137. package/dist/draft20-session.d.ts +1 -1
  138. package/dist/draft20.cjs +8 -3
  139. package/dist/draft20.d.cts +4 -3
  140. package/dist/draft20.d.ts +4 -3
  141. package/dist/draft20.js +9 -4
  142. package/dist/index.cjs +30 -30
  143. package/dist/index.d.cts +25 -24
  144. package/dist/index.d.ts +25 -24
  145. package/dist/index.js +15 -15
  146. package/dist/session.cjs +2 -2
  147. package/dist/session.d.cts +10 -10
  148. package/dist/session.d.ts +10 -10
  149. package/dist/session.js +1 -1
  150. package/dist/{types-zHgCS6o5.d.cts → types-Btp416jt.d.cts} +15 -7
  151. package/dist/{types-zHgCS6o5.d.ts → types-Btp416jt.d.ts} +15 -7
  152. package/dist/{types-Cm9fjeYC.d.cts → types-BxTL1NXw.d.cts} +9 -2
  153. package/dist/{types-Cm9fjeYC.d.ts → types-BxTL1NXw.d.ts} +9 -2
  154. package/dist/{types-Bio-91Rt.d.cts → types-CI_SX4Xe.d.cts} +2 -2
  155. package/dist/{types-Bio-91Rt.d.ts → types-CI_SX4Xe.d.ts} +2 -2
  156. package/dist/{types-HI_bbXka.d.cts → types-CmqT0jUf.d.cts} +1 -1
  157. package/dist/{types-HI_bbXka.d.ts → types-CmqT0jUf.d.ts} +1 -1
  158. package/dist/{types-CPaYBsMG.d.cts → types-CuibHYcf.d.cts} +9 -2
  159. package/dist/{types-CPaYBsMG.d.ts → types-CuibHYcf.d.ts} +9 -2
  160. package/dist/{types-CWCQwuvy.d.cts → types-CwN7AEoL.d.cts} +24 -12
  161. package/dist/{types-CWCQwuvy.d.ts → types-CwN7AEoL.d.ts} +24 -12
  162. package/dist/{types-Ck45Ex5S.d.cts → types-D0kTgUuL.d.cts} +1 -1
  163. package/dist/{types-Ck45Ex5S.d.ts → types-D0kTgUuL.d.ts} +1 -1
  164. package/dist/{types-D9eiB_9A.d.cts → types-DAnalt5K.d.cts} +9 -2
  165. package/dist/{types-D9eiB_9A.d.ts → types-DAnalt5K.d.ts} +9 -2
  166. package/dist/{types-CXlSn0I9.d.cts → types-DjxexghA.d.cts} +2 -2
  167. package/dist/{types-CXlSn0I9.d.ts → types-DjxexghA.d.ts} +2 -2
  168. package/dist/{types-Cqp10JtB.d.cts → types-DxXNP32l.d.cts} +10 -2
  169. package/dist/{types-Cqp10JtB.d.ts → types-DxXNP32l.d.ts} +10 -2
  170. package/package.json +3 -3
  171. package/src/core/auth-redaction.ts +192 -0
  172. package/src/drafts/draft07/codec.ts +40 -0
  173. package/src/drafts/draft07/error-codes.ts +44 -0
  174. package/src/drafts/draft07/index.ts +15 -0
  175. package/src/drafts/draft08/codec.ts +40 -0
  176. package/src/drafts/draft08/error-codes.ts +76 -0
  177. package/src/drafts/draft08/index.ts +21 -0
  178. package/src/drafts/draft09/codec.ts +40 -0
  179. package/src/drafts/draft09/error-codes.ts +76 -0
  180. package/src/drafts/draft09/index.ts +21 -0
  181. package/src/drafts/draft10/codec.ts +40 -0
  182. package/src/drafts/draft10/error-codes.ts +76 -0
  183. package/src/drafts/draft10/index.ts +21 -0
  184. package/src/drafts/draft11/codec.ts +71 -8
  185. package/src/drafts/draft11/error-codes.ts +106 -0
  186. package/src/drafts/draft11/index.ts +23 -0
  187. package/src/drafts/draft11/types.ts +1 -1
  188. package/src/drafts/draft12/codec.ts +83 -16
  189. package/src/drafts/draft12/error-codes.ts +116 -0
  190. package/src/drafts/draft12/index.ts +25 -0
  191. package/src/drafts/draft12/types.ts +2 -2
  192. package/src/drafts/draft13/codec.ts +75 -11
  193. package/src/drafts/draft13/error-codes.ts +107 -0
  194. package/src/drafts/draft13/index.ts +23 -0
  195. package/src/drafts/draft13/types.ts +3 -3
  196. package/src/drafts/draft14/codec.ts +79 -12
  197. package/src/drafts/draft14/data-streams.ts +331 -259
  198. package/src/drafts/draft14/error-codes.ts +109 -0
  199. package/src/drafts/draft14/index.ts +23 -0
  200. package/src/drafts/draft14/types.ts +1 -1
  201. package/src/drafts/draft15/codec.ts +71 -8
  202. package/src/drafts/draft15/data-streams.ts +489 -444
  203. package/src/drafts/draft15/error-codes.ts +66 -0
  204. package/src/drafts/draft15/index.ts +15 -0
  205. package/src/drafts/draft15/types.ts +9 -2
  206. package/src/drafts/draft16/codec.ts +149 -49
  207. package/src/drafts/draft16/data-streams.ts +513 -442
  208. package/src/drafts/draft16/error-codes.ts +68 -0
  209. package/src/drafts/draft16/index.ts +15 -0
  210. package/src/drafts/draft16/messages.ts +4 -4
  211. package/src/drafts/draft16/session-fsm.ts +0 -1
  212. package/src/drafts/draft16/types.ts +24 -10
  213. package/src/drafts/draft17/codec.ts +77 -10
  214. package/src/drafts/draft17/data-streams.ts +567 -488
  215. package/src/drafts/draft17/index.ts +15 -0
  216. package/src/drafts/draft17/types.ts +9 -2
  217. package/src/drafts/draft18/codec.ts +70 -7
  218. package/src/drafts/draft18/data-streams.ts +570 -482
  219. package/src/drafts/draft18/index.ts +3 -0
  220. package/src/drafts/draft18/types.ts +18 -10
  221. package/src/drafts/draft19/codec.ts +95 -23
  222. package/src/drafts/draft19/data-streams.ts +570 -482
  223. package/src/drafts/draft19/error-codes.ts +3 -1
  224. package/src/drafts/draft19/index.ts +3 -0
  225. package/src/drafts/draft19/messages.ts +3 -1
  226. package/src/drafts/draft19/types.ts +32 -18
  227. package/src/drafts/draft20/codec.ts +115 -36
  228. package/src/drafts/draft20/data-streams.ts +610 -563
  229. package/src/drafts/draft20/index.ts +3 -0
  230. package/src/drafts/draft20/types.ts +31 -13
  231. package/dist/codec-BJ7BHuiZ.d.ts +0 -18
  232. package/dist/codec-C6Mx4bwz.d.cts +0 -18
@@ -3,8 +3,10 @@ import {
3
3
  BufferWriter,
4
4
  DecodeError,
5
5
  bytesToHex,
6
- hexToBytes
7
- } from "./chunk-KLPWJU6W.js";
6
+ hexToBytes,
7
+ recordAuthValueSpan,
8
+ redactWith
9
+ } from "./chunk-YRZQVNZO.js";
8
10
 
9
11
  // src/drafts/draft16/messages.ts
10
12
  var MSG_REQUEST_UPDATE = 0x02n;
@@ -159,91 +161,99 @@ function encodeFetchStream(stream) {
159
161
  }
160
162
  return w.finish();
161
163
  }
164
+ function readSubgroupHeader(r) {
165
+ const streamType = Number(r.readVarInt());
166
+ if (!(streamType >= 16 && streamType <= 31 || streamType >= 48 && streamType <= 63) || (streamType & 6) === 6) {
167
+ throw new DecodeError(
168
+ "CONSTRAINT_VIOLATION",
169
+ `Expected subgroup stream type 0x10-0x1F/0x30-0x3F, got 0x${streamType.toString(16)}`,
170
+ 0
171
+ );
172
+ }
173
+ const extensionsPresent = (streamType & 1) !== 0;
174
+ const hasSubgroupField = (streamType & 4) !== 0;
175
+ const subgroupIsFirstObjId = (streamType & 2) !== 0 && !hasSubgroupField;
176
+ const endOfGroup = (streamType & 8) !== 0;
177
+ const hasPriority = streamType < 48;
178
+ const trackAlias = r.readVarInt();
179
+ const groupId = r.readVarInt();
180
+ let subgroupId = 0n;
181
+ if (hasSubgroupField) {
182
+ subgroupId = r.readVarInt();
183
+ }
184
+ let publisherPriority = 128;
185
+ if (hasPriority) {
186
+ publisherPriority = r.readUint8();
187
+ }
188
+ return {
189
+ streamType,
190
+ extensionsPresent,
191
+ subgroupIsFirstObjId,
192
+ endOfGroup,
193
+ trackAlias,
194
+ groupId,
195
+ subgroupId,
196
+ publisherPriority
197
+ };
198
+ }
199
+ function readSubgroupObject(r, extensionsPresent, isFirst, prevObjectId, base) {
200
+ const byteOffset = base + r.offset;
201
+ const delta = r.readVarInt();
202
+ const objectId = isFirst ? delta : prevObjectId + 1n + delta;
203
+ let extensionData = new Uint8Array(0);
204
+ if (extensionsPresent) {
205
+ const extLen = Number(r.readVarInt());
206
+ extensionData = extLen > 0 ? r.readBytesView(extLen) : new Uint8Array(0);
207
+ }
208
+ const payloadLength = Number(r.readVarInt());
209
+ let payload;
210
+ let status;
211
+ let payloadByteOffset;
212
+ if (payloadLength === 0) {
213
+ status = r.readVarInt();
214
+ payloadByteOffset = base + r.offset;
215
+ payload = new Uint8Array(0);
216
+ } else {
217
+ payloadByteOffset = base + r.offset;
218
+ payload = r.readBytesView(payloadLength);
219
+ }
220
+ const obj = {
221
+ type: "object",
222
+ byteOffset,
223
+ payloadByteOffset,
224
+ objectId,
225
+ payloadLength,
226
+ payload,
227
+ extensionData
228
+ };
229
+ if (status !== void 0) obj.status = status;
230
+ return obj;
231
+ }
162
232
  function decodeSubgroupStream(bytes) {
163
233
  try {
164
234
  const r = new BufferReader(bytes);
165
- const streamType = Number(r.readVarInt());
166
- if (!(streamType >= 16 && streamType <= 31 || streamType >= 48 && streamType <= 63) || (streamType & 6) === 6) {
167
- return {
168
- ok: false,
169
- error: new DecodeError(
170
- "CONSTRAINT_VIOLATION",
171
- `Expected subgroup stream type 0x10-0x1F/0x30-0x3F, got 0x${streamType.toString(16)}`,
172
- 0
173
- )
174
- };
175
- }
176
- const extensionsPresent = (streamType & 1) !== 0;
177
- const hasSubgroupField = (streamType & 4) !== 0;
178
- const subgroupIsFirstObjId = (streamType & 2) !== 0 && !hasSubgroupField;
179
- const endOfGroup = (streamType & 8) !== 0;
180
- const hasPriority = streamType < 48;
181
- const trackAlias = r.readVarInt();
182
- const groupId = r.readVarInt();
183
- let subgroupId = 0n;
184
- if (hasSubgroupField) {
185
- subgroupId = r.readVarInt();
186
- }
187
- let publisherPriority = 128;
188
- if (hasPriority) {
189
- publisherPriority = r.readUint8();
190
- }
235
+ const h = readSubgroupHeader(r);
191
236
  const objects = [];
192
237
  let prevObjectId = -1n;
193
- let firstObject = true;
238
+ let isFirst = true;
239
+ let subgroupId = h.subgroupId;
194
240
  while (r.remaining > 0) {
195
- const byteOffset = r.offset;
196
- const delta = r.readVarInt();
197
- let objectId;
198
- if (firstObject) {
199
- objectId = delta;
200
- if (subgroupIsFirstObjId && firstObject) {
201
- subgroupId = objectId;
202
- }
203
- firstObject = false;
204
- } else {
205
- objectId = prevObjectId + 1n + delta;
206
- }
207
- let extensionData = new Uint8Array(0);
208
- if (extensionsPresent) {
209
- const extLen = Number(r.readVarInt());
210
- extensionData = extLen > 0 ? r.readBytesView(extLen) : new Uint8Array(0);
211
- }
212
- const payloadLength = Number(r.readVarInt());
213
- let payload;
214
- let status;
215
- let payloadByteOffset;
216
- if (payloadLength === 0) {
217
- status = r.readVarInt();
218
- payloadByteOffset = r.offset;
219
- payload = new Uint8Array(0);
220
- } else {
221
- payloadByteOffset = r.offset;
222
- payload = r.readBytesView(payloadLength);
223
- }
224
- const obj = {
225
- type: "object",
226
- byteOffset,
227
- payloadByteOffset,
228
- objectId,
229
- payloadLength,
230
- extensionData,
231
- payload
232
- };
233
- if (status !== void 0) obj.status = status;
241
+ const obj = readSubgroupObject(r, h.extensionsPresent, isFirst, prevObjectId, 0);
242
+ if (isFirst && h.subgroupIsFirstObjId) subgroupId = obj.objectId;
243
+ isFirst = false;
234
244
  objects.push(obj);
235
- prevObjectId = objectId;
245
+ prevObjectId = obj.objectId;
236
246
  }
237
247
  const result = {
238
248
  type: "subgroup",
239
- headerType: streamType,
240
- trackAlias,
241
- groupId,
249
+ headerType: h.streamType,
250
+ trackAlias: h.trackAlias,
251
+ groupId: h.groupId,
242
252
  subgroupId,
243
- publisherPriority,
244
- objects
253
+ publisherPriority: h.publisherPriority,
254
+ objects,
255
+ ...h.endOfGroup ? { endOfGroup: true } : {}
245
256
  };
246
- if (endOfGroup) result.endOfGroup = true;
247
257
  return {
248
258
  ok: true,
249
259
  value: result,
@@ -308,6 +318,123 @@ function decodeDatagram(bytes) {
308
318
  throw e;
309
319
  }
310
320
  }
321
+ function newFetchObjectState() {
322
+ return { prevGroupId: 0n, prevSubgroupId: 0n, prevObjectId: 0n, prevPriority: 128, first: true };
323
+ }
324
+ function readFetchObject(r, base, st) {
325
+ let obj;
326
+ const byteOffset = base + r.offset;
327
+ const flags = Number(r.readVarInt());
328
+ let groupId = st.prevGroupId;
329
+ let subgroupId = st.prevSubgroupId;
330
+ let objectId = st.prevObjectId + 1n;
331
+ let payloadLength;
332
+ let payload;
333
+ if (flags >= 128) {
334
+ if (flags !== 140 && flags !== 268) {
335
+ throw new DecodeError(
336
+ "CONSTRAINT_VIOLATION",
337
+ `Unknown serialization flags value: 0x${flags.toString(16)}`,
338
+ r.offset
339
+ );
340
+ }
341
+ groupId = r.readVarInt();
342
+ objectId = r.readVarInt();
343
+ payloadLength = Number(r.readVarInt());
344
+ const payloadByteOffset = base + r.offset;
345
+ payload = payloadLength > 0 ? r.readBytesView(payloadLength) : new Uint8Array(0);
346
+ obj = {
347
+ type: "object",
348
+ byteOffset,
349
+ payloadByteOffset,
350
+ serializationFlags: flags,
351
+ groupId,
352
+ subgroupId,
353
+ objectId,
354
+ publisherPriority: st.prevPriority,
355
+ payloadLength,
356
+ extensionData: new Uint8Array(0),
357
+ payload
358
+ };
359
+ } else {
360
+ const datagramForwarding = (flags & 64) !== 0;
361
+ const subgroupEncoding = datagramForwarding ? -1 : flags & 3;
362
+ const objectIdPresent = (flags & 4) !== 0;
363
+ const groupIdPresent = (flags & 8) !== 0;
364
+ const priorityPresent = (flags & 16) !== 0;
365
+ const extensionsPresent = (flags & 32) !== 0;
366
+ if (groupIdPresent) {
367
+ groupId = r.readVarInt();
368
+ } else if (st.first) {
369
+ throw new DecodeError(
370
+ "CONSTRAINT_VIOLATION",
371
+ "First fetch object must include groupId",
372
+ r.offset
373
+ );
374
+ }
375
+ if (datagramForwarding) {
376
+ } else if (subgroupEncoding === 0) {
377
+ subgroupId = 0n;
378
+ } else if (subgroupEncoding === 1) {
379
+ if (st.first) {
380
+ throw new DecodeError(
381
+ "CONSTRAINT_VIOLATION",
382
+ "First fetch object cannot reference prior subgroupId",
383
+ r.offset
384
+ );
385
+ }
386
+ } else if (subgroupEncoding === 2) {
387
+ if (st.first) {
388
+ throw new DecodeError(
389
+ "CONSTRAINT_VIOLATION",
390
+ "First fetch object cannot reference prior subgroupId",
391
+ r.offset
392
+ );
393
+ }
394
+ subgroupId = st.prevSubgroupId + 1n;
395
+ } else {
396
+ subgroupId = r.readVarInt();
397
+ }
398
+ if (objectIdPresent) {
399
+ objectId = r.readVarInt();
400
+ } else if (st.first) {
401
+ throw new DecodeError(
402
+ "CONSTRAINT_VIOLATION",
403
+ "First fetch object must include objectId",
404
+ r.offset
405
+ );
406
+ }
407
+ if (priorityPresent) {
408
+ st.prevPriority = r.readUint8();
409
+ }
410
+ let extensionData = new Uint8Array(0);
411
+ if (extensionsPresent) {
412
+ const extLen = Number(r.readVarInt());
413
+ extensionData = extLen > 0 ? r.readBytesView(extLen) : new Uint8Array(0);
414
+ }
415
+ payloadLength = Number(r.readVarInt());
416
+ const payloadByteOffset = base + r.offset;
417
+ payload = payloadLength > 0 ? r.readBytesView(payloadLength) : new Uint8Array(0);
418
+ obj = {
419
+ type: "object",
420
+ byteOffset,
421
+ payloadByteOffset,
422
+ serializationFlags: flags,
423
+ groupId,
424
+ subgroupId,
425
+ objectId,
426
+ publisherPriority: st.prevPriority,
427
+ payloadLength,
428
+ extensionData,
429
+ payload
430
+ };
431
+ }
432
+ st.prevGroupId = groupId;
433
+ st.prevSubgroupId = subgroupId;
434
+ st.prevObjectId = objectId;
435
+ st.first = false;
436
+ return obj;
437
+ }
311
438
  function decodeFetchStream(bytes) {
312
439
  try {
313
440
  const r = new BufferReader(bytes);
@@ -324,137 +451,9 @@ function decodeFetchStream(bytes) {
324
451
  }
325
452
  const requestId = r.readVarInt();
326
453
  const objects = [];
327
- let prevGroupId = 0n;
328
- let prevSubgroupId = 0n;
329
- let prevObjectId = 0n;
330
- let prevPriority = 128;
331
- let first = true;
454
+ const st = newFetchObjectState();
332
455
  while (r.remaining > 0) {
333
- const byteOffset = r.offset;
334
- const flags = Number(r.readVarInt());
335
- let groupId = prevGroupId;
336
- let subgroupId = prevSubgroupId;
337
- let objectId = prevObjectId + 1n;
338
- let payloadLength;
339
- let payload;
340
- if (flags >= 128) {
341
- if (flags !== 140 && flags !== 268) {
342
- return {
343
- ok: false,
344
- error: new DecodeError(
345
- "CONSTRAINT_VIOLATION",
346
- `Unknown serialization flags value: 0x${flags.toString(16)}`,
347
- r.offset
348
- )
349
- };
350
- }
351
- groupId = r.readVarInt();
352
- objectId = r.readVarInt();
353
- payloadLength = Number(r.readVarInt());
354
- const payloadByteOffset = r.offset;
355
- payload = payloadLength > 0 ? r.readBytesView(payloadLength) : new Uint8Array(0);
356
- objects.push({
357
- type: "object",
358
- byteOffset,
359
- payloadByteOffset,
360
- serializationFlags: flags,
361
- groupId,
362
- subgroupId,
363
- objectId,
364
- publisherPriority: prevPriority,
365
- payloadLength,
366
- extensionData: new Uint8Array(0),
367
- payload
368
- });
369
- } else {
370
- const datagramForwarding = (flags & 64) !== 0;
371
- const subgroupEncoding = datagramForwarding ? -1 : flags & 3;
372
- const objectIdPresent = (flags & 4) !== 0;
373
- const groupIdPresent = (flags & 8) !== 0;
374
- const priorityPresent = (flags & 16) !== 0;
375
- const extensionsPresent = (flags & 32) !== 0;
376
- if (groupIdPresent) {
377
- groupId = r.readVarInt();
378
- } else if (first) {
379
- return {
380
- ok: false,
381
- error: new DecodeError(
382
- "CONSTRAINT_VIOLATION",
383
- "First fetch object must include groupId",
384
- r.offset
385
- )
386
- };
387
- }
388
- if (datagramForwarding) {
389
- } else if (subgroupEncoding === 0) {
390
- subgroupId = 0n;
391
- } else if (subgroupEncoding === 1) {
392
- if (first) {
393
- return {
394
- ok: false,
395
- error: new DecodeError(
396
- "CONSTRAINT_VIOLATION",
397
- "First fetch object cannot reference prior subgroupId",
398
- r.offset
399
- )
400
- };
401
- }
402
- } else if (subgroupEncoding === 2) {
403
- if (first) {
404
- return {
405
- ok: false,
406
- error: new DecodeError(
407
- "CONSTRAINT_VIOLATION",
408
- "First fetch object cannot reference prior subgroupId",
409
- r.offset
410
- )
411
- };
412
- }
413
- subgroupId = prevSubgroupId + 1n;
414
- } else {
415
- subgroupId = r.readVarInt();
416
- }
417
- if (objectIdPresent) {
418
- objectId = r.readVarInt();
419
- } else if (first) {
420
- return {
421
- ok: false,
422
- error: new DecodeError(
423
- "CONSTRAINT_VIOLATION",
424
- "First fetch object must include objectId",
425
- r.offset
426
- )
427
- };
428
- }
429
- if (priorityPresent) {
430
- prevPriority = r.readUint8();
431
- }
432
- let extensionData = new Uint8Array(0);
433
- if (extensionsPresent) {
434
- const extLen = Number(r.readVarInt());
435
- extensionData = extLen > 0 ? r.readBytesView(extLen) : new Uint8Array(0);
436
- }
437
- payloadLength = Number(r.readVarInt());
438
- const payloadByteOffset = r.offset;
439
- payload = payloadLength > 0 ? r.readBytesView(payloadLength) : new Uint8Array(0);
440
- objects.push({
441
- type: "object",
442
- byteOffset,
443
- payloadByteOffset,
444
- serializationFlags: flags,
445
- groupId,
446
- subgroupId,
447
- objectId,
448
- publisherPriority: prevPriority,
449
- payloadLength,
450
- extensionData,
451
- payload
452
- });
453
- }
454
- prevGroupId = groupId;
455
- prevSubgroupId = subgroupId;
456
- prevObjectId = objectId;
457
- first = false;
456
+ objects.push(readFetchObject(r, 0, st));
458
457
  }
459
458
  return {
460
459
  ok: true,
@@ -480,61 +479,69 @@ function decodeDataStream(streamType, bytes) {
480
479
  }
481
480
  }
482
481
  }
482
+ var StreamBuffer = class {
483
+ buf = new Uint8Array(0);
484
+ /** Bytes written into `buf`. */
485
+ len = 0;
486
+ /** Consumed prefix of `buf`; `base + offset` is the position in the stream. */
487
+ offset = 0;
488
+ /** Absolute position of `buf[0]` within the stream. */
489
+ base = 0;
490
+ get unread() {
491
+ return this.len - this.offset;
492
+ }
493
+ append(chunk) {
494
+ if (this.len + chunk.length > this.buf.length) {
495
+ const live = this.len - this.offset;
496
+ const needed = live + chunk.length;
497
+ let cap = Math.max(4096, this.buf.length);
498
+ while (cap < needed * 2) cap *= 2;
499
+ const next = new Uint8Array(cap);
500
+ next.set(this.buf.subarray(this.offset, this.len), 0);
501
+ this.buf = next;
502
+ this.base += this.offset;
503
+ this.len = live;
504
+ this.offset = 0;
505
+ }
506
+ this.buf.set(chunk, this.len);
507
+ this.len += chunk.length;
508
+ }
509
+ /**
510
+ * The written bytes, for a reader positioned at `offset`. Bounded by `len`
511
+ * rather than by capacity, so `BufferReader.remaining` counts real bytes and
512
+ * not the spare room after them.
513
+ */
514
+ written() {
515
+ return this.buf.subarray(0, this.len);
516
+ }
517
+ };
483
518
  function createSubgroupStreamDecoder() {
484
- let buffer = new Uint8Array(0);
485
- let offset = 0;
519
+ const b = new StreamBuffer();
520
+ let header = null;
486
521
  let headerEmitted = false;
487
522
  let prevObjectId = -1n;
488
- let firstObject = true;
489
- let _subgroupIsFirstObjId = false;
490
- let _extensionsPresent = false;
523
+ let isFirst = true;
524
+ function emitHeader(controller, h, subgroupId) {
525
+ controller.enqueue({
526
+ type: "subgroup_header",
527
+ headerType: h.streamType,
528
+ trackAlias: h.trackAlias,
529
+ groupId: h.groupId,
530
+ subgroupId,
531
+ publisherPriority: h.publisherPriority,
532
+ ...h.endOfGroup ? { endOfGroup: true } : {}
533
+ });
534
+ headerEmitted = true;
535
+ }
491
536
  return new TransformStream({
492
537
  transform(chunk, controller) {
493
- if (offset > 0) {
494
- buffer = buffer.subarray(offset);
495
- offset = 0;
496
- }
497
- const newBuffer = new Uint8Array(buffer.length + chunk.length);
498
- newBuffer.set(buffer, 0);
499
- newBuffer.set(chunk, buffer.length);
500
- buffer = newBuffer;
501
- if (!headerEmitted) {
538
+ b.append(chunk);
539
+ const view = b.written();
540
+ if (header === null) {
502
541
  try {
503
- const r = new BufferReader(buffer.subarray(offset));
504
- const streamType = Number(r.readVarInt());
505
- if (!(streamType >= 16 && streamType <= 31 || streamType >= 48 && streamType <= 63)) {
506
- controller.error(
507
- new DecodeError(
508
- "CONSTRAINT_VIOLATION",
509
- `Expected subgroup stream type, got 0x${streamType.toString(16)}`,
510
- 0
511
- )
512
- );
513
- return;
514
- }
515
- _extensionsPresent = (streamType & 1) !== 0;
516
- const hasSubgroupField = (streamType & 4) !== 0;
517
- _subgroupIsFirstObjId = (streamType & 2) !== 0 && !hasSubgroupField;
518
- const hasPriority = streamType < 48;
519
- const trackAlias = r.readVarInt();
520
- const groupId = r.readVarInt();
521
- let subgroupId = 0n;
522
- if (hasSubgroupField) {
523
- subgroupId = r.readVarInt();
524
- }
525
- let publisherPriority = 128;
526
- if (hasPriority) {
527
- publisherPriority = r.readUint8();
528
- }
529
- controller.enqueue({
530
- type: "subgroup_header",
531
- trackAlias,
532
- groupId,
533
- subgroupId,
534
- publisherPriority
535
- });
536
- headerEmitted = true;
537
- offset += r.offset;
542
+ const hr = new BufferReader(view, b.offset);
543
+ header = readSubgroupHeader(hr);
544
+ b.offset = hr.offset;
538
545
  } catch (e) {
539
546
  if (e instanceof DecodeError && e.code === "UNEXPECTED_END") {
540
547
  return;
@@ -542,80 +549,51 @@ function createSubgroupStreamDecoder() {
542
549
  controller.error(e);
543
550
  return;
544
551
  }
552
+ if (!header.subgroupIsFirstObjId) emitHeader(controller, header, header.subgroupId);
545
553
  }
546
- while (offset < buffer.length) {
554
+ const h = header;
555
+ if (h === null) return;
556
+ const r = new BufferReader(view, b.offset);
557
+ while (r.remaining > 0) {
558
+ const start = r.offset;
559
+ let obj;
547
560
  try {
548
- const r = new BufferReader(buffer.subarray(offset));
549
- const delta = r.readVarInt();
550
- let objectId;
551
- if (firstObject) {
552
- objectId = delta;
553
- firstObject = false;
554
- } else {
555
- objectId = prevObjectId + 1n + delta;
556
- }
557
- let extensionData = new Uint8Array(0);
558
- if (_extensionsPresent) {
559
- const extLen = Number(r.readVarInt());
560
- extensionData = extLen > 0 ? r.readBytesView(extLen) : new Uint8Array(0);
561
- }
562
- const payloadLength = Number(r.readVarInt());
563
- let payloadByteOffset;
564
- let status;
565
- if (payloadLength === 0) {
566
- status = r.readVarInt();
567
- payloadByteOffset = r.offset;
568
- } else {
569
- payloadByteOffset = r.offset;
570
- }
571
- const payload = payloadLength > 0 ? r.readBytesView(payloadLength) : new Uint8Array(0);
572
- const obj = {
573
- type: "object",
574
- byteOffset: 0,
575
- payloadByteOffset,
576
- objectId,
577
- payloadLength,
578
- payload,
579
- extensionData
580
- };
581
- if (status !== void 0) obj.status = status;
582
- controller.enqueue(obj);
583
- offset += r.offset;
584
- prevObjectId = objectId;
561
+ obj = readSubgroupObject(r, h.extensionsPresent, isFirst, prevObjectId, b.base);
585
562
  } catch (e) {
586
563
  if (e instanceof DecodeError && e.code === "UNEXPECTED_END") {
587
- break;
564
+ b.offset = start;
565
+ return;
588
566
  }
589
567
  controller.error(e);
590
568
  return;
591
569
  }
570
+ if (!headerEmitted) emitHeader(controller, h, obj.objectId);
571
+ isFirst = false;
572
+ b.offset = r.offset;
573
+ prevObjectId = obj.objectId;
574
+ controller.enqueue(obj);
592
575
  }
593
576
  },
594
577
  flush(controller) {
595
- if (offset < buffer.length) {
578
+ if (header !== null && !headerEmitted) emitHeader(controller, header, 0n);
579
+ if (b.unread > 0) {
596
580
  controller.error(new DecodeError("UNEXPECTED_END", "Stream ended with incomplete data", 0));
597
581
  }
598
582
  }
599
583
  });
600
584
  }
601
585
  function createFetchStreamDecoder() {
602
- let buffer = new Uint8Array(0);
603
- let offset = 0;
586
+ const b = new StreamBuffer();
604
587
  let headerEmitted = false;
588
+ const st = newFetchObjectState();
605
589
  return new TransformStream({
606
590
  transform(chunk, controller) {
607
- if (offset > 0) {
608
- buffer = buffer.subarray(offset);
609
- offset = 0;
610
- }
611
- const newBuffer = new Uint8Array(buffer.length + chunk.length);
612
- newBuffer.set(buffer, 0);
613
- newBuffer.set(chunk, buffer.length);
614
- buffer = newBuffer;
591
+ b.append(chunk);
592
+ const view = b.written();
615
593
  if (!headerEmitted) {
616
594
  try {
617
- const r = new BufferReader(buffer.subarray(offset));
618
- const streamType = r.readVarInt();
595
+ const r2 = new BufferReader(view, b.offset);
596
+ const streamType = r2.readVarInt();
619
597
  if (streamType !== FETCH_STREAM_TYPE) {
620
598
  controller.error(
621
599
  new DecodeError(
@@ -626,10 +604,10 @@ function createFetchStreamDecoder() {
626
604
  );
627
605
  return;
628
606
  }
629
- const requestId = r.readVarInt();
607
+ const requestId = r2.readVarInt();
630
608
  controller.enqueue({ type: "fetch_header", requestId });
631
609
  headerEmitted = true;
632
- offset += r.offset;
610
+ b.offset = r2.offset;
633
611
  } catch (e) {
634
612
  if (e instanceof DecodeError && e.code === "UNEXPECTED_END") {
635
613
  return;
@@ -638,99 +616,82 @@ function createFetchStreamDecoder() {
638
616
  return;
639
617
  }
640
618
  }
641
- while (offset < buffer.length) {
619
+ const r = new BufferReader(view, b.offset);
620
+ while (r.remaining > 0) {
621
+ const start = r.offset;
622
+ let obj;
642
623
  try {
643
- const r = new BufferReader(buffer.subarray(offset));
644
- const flags = Number(r.readVarInt());
645
- const objectIdPresent = (flags & 4) !== 0;
646
- const groupIdPresent = (flags & 8) !== 0;
647
- const priorityPresent = (flags & 16) !== 0;
648
- const extensionsPresent = (flags & 32) !== 0;
649
- const subgroupEncoding = flags & 3;
650
- if (groupIdPresent) r.readVarInt();
651
- if (subgroupEncoding === 3) r.readVarInt();
652
- let objectId = 0n;
653
- if (objectIdPresent) objectId = r.readVarInt();
654
- if (priorityPresent) r.readUint8();
655
- let extensionData = new Uint8Array(0);
656
- if (extensionsPresent) {
657
- const extLen = Number(r.readVarInt());
658
- extensionData = extLen > 0 ? r.readBytesView(extLen) : new Uint8Array(0);
659
- }
660
- const payloadLength = Number(r.readVarInt());
661
- const payloadByteOffset = r.offset;
662
- const payload = payloadLength > 0 ? r.readBytesView(payloadLength) : new Uint8Array(0);
663
- controller.enqueue({
664
- type: "object",
665
- byteOffset: 0,
666
- payloadByteOffset,
667
- objectId,
668
- payloadLength,
669
- payload,
670
- extensionData
671
- });
672
- offset += r.offset;
624
+ obj = readFetchObject(r, b.base, st);
673
625
  } catch (e) {
674
626
  if (e instanceof DecodeError && e.code === "UNEXPECTED_END") {
675
- break;
627
+ b.offset = start;
628
+ return;
676
629
  }
677
630
  controller.error(e);
678
631
  return;
679
632
  }
633
+ b.offset = r.offset;
634
+ controller.enqueue(obj);
680
635
  }
681
636
  },
682
637
  flush(controller) {
683
- if (offset < buffer.length) {
638
+ if (b.unread > 0) {
684
639
  controller.error(new DecodeError("UNEXPECTED_END", "Stream ended with incomplete data", 0));
685
640
  }
686
641
  }
687
642
  });
688
643
  }
689
644
  function createDataStreamDecoder() {
690
- let buffer = new Uint8Array(0);
691
- let offset = 0;
692
- let inner = null;
693
- return new TransformStream({
694
- transform(chunk, controller) {
695
- if (offset > 0) {
696
- buffer = buffer.subarray(offset);
697
- offset = 0;
698
- }
699
- const newBuffer = new Uint8Array(buffer.length + chunk.length);
700
- newBuffer.set(buffer, 0);
701
- newBuffer.set(chunk, buffer.length);
702
- buffer = newBuffer;
703
- if (inner === null) {
704
- if (offset >= buffer.length) return;
705
- const firstByte = buffer[offset];
706
- if (firstByte >= 16 && firstByte <= 31 || firstByte >= 48 && firstByte <= 63) {
707
- const decoder = createSubgroupStreamDecoder();
708
- inner = decoder;
709
- } else if (firstByte === 5) {
710
- const decoder = createFetchStreamDecoder();
711
- inner = decoder;
712
- } else {
713
- controller.error(
714
- new DecodeError(
715
- "CONSTRAINT_VIOLATION",
716
- `Unknown data stream type: 0x${firstByte.toString(16)}`,
717
- 0
718
- )
719
- );
720
- return;
645
+ let writer = null;
646
+ let pump = Promise.resolve();
647
+ let broken = false;
648
+ function attach(inner, controller) {
649
+ writer = inner.writable.getWriter();
650
+ const reader = inner.readable.getReader();
651
+ pump = (async () => {
652
+ try {
653
+ for (; ; ) {
654
+ const { done, value } = await reader.read();
655
+ if (done) break;
656
+ controller.enqueue(value);
657
+ }
658
+ } catch (e) {
659
+ if (!broken) {
660
+ broken = true;
661
+ controller.error(e);
721
662
  }
722
663
  }
723
- },
724
- flush(controller) {
725
- if (offset >= buffer.length) return;
726
- const view = buffer.subarray(offset);
727
- const firstByte = view[0];
728
- let result;
664
+ })();
665
+ }
666
+ async function feed(bytes) {
667
+ if (writer === null || broken || bytes.length === 0) return;
668
+ try {
669
+ await writer.write(bytes);
670
+ } catch {
671
+ broken = true;
672
+ }
673
+ }
674
+ return new TransformStream({
675
+ async transform(chunk, controller) {
676
+ if (broken) return;
677
+ if (writer !== null) {
678
+ await feed(chunk);
679
+ return;
680
+ }
681
+ if (chunk.length === 0) return;
682
+ const firstByte = chunk[0];
729
683
  if (firstByte >= 16 && firstByte <= 31 || firstByte >= 48 && firstByte <= 63) {
730
- result = decodeSubgroupStream(view);
684
+ attach(
685
+ createSubgroupStreamDecoder(),
686
+ controller
687
+ );
731
688
  } else if (firstByte === 5) {
732
- result = decodeFetchStream(view);
689
+ attach(
690
+ createFetchStreamDecoder(),
691
+ controller
692
+ );
733
693
  } else {
694
+ broken = true;
734
695
  controller.error(
735
696
  new DecodeError(
736
697
  "CONSTRAINT_VIOLATION",
@@ -740,31 +701,15 @@ function createDataStreamDecoder() {
740
701
  );
741
702
  return;
742
703
  }
743
- if (!result.ok) {
744
- controller.error(result.error);
745
- return;
746
- }
747
- const stream = result.value;
748
- if (stream.type === "subgroup") {
749
- controller.enqueue({
750
- type: "subgroup_header",
751
- trackAlias: stream.trackAlias,
752
- groupId: stream.groupId,
753
- subgroupId: stream.subgroupId,
754
- publisherPriority: stream.publisherPriority
755
- });
756
- for (const obj of stream.objects) {
757
- controller.enqueue(obj);
758
- }
759
- } else if (stream.type === "fetch") {
760
- controller.enqueue({
761
- type: "fetch_header",
762
- requestId: stream.requestId
763
- });
764
- for (const obj of stream.objects) {
765
- controller.enqueue(obj);
766
- }
704
+ await feed(chunk);
705
+ },
706
+ async flush() {
707
+ if (writer === null) return;
708
+ try {
709
+ await writer.close();
710
+ } catch {
767
711
  }
712
+ await pump;
768
713
  }
769
714
  });
770
715
  }
@@ -773,72 +718,96 @@ function createDataStreamDecoder() {
773
718
  var textEncoder = /* @__PURE__ */ new TextEncoder();
774
719
  var textDecoder = /* @__PURE__ */ new TextDecoder();
775
720
  function encodeSetupParams(params, writer) {
776
- let count = 0;
777
- if (params.path !== void 0) count++;
778
- if (params.max_request_id !== void 0) count++;
779
- if (params.authorization_token !== void 0) count++;
780
- if (params.max_auth_token_cache_size !== void 0) count++;
781
- if (params.authority !== void 0) count++;
782
- if (params.moqt_implementation !== void 0) count++;
783
- if (params.unknown) count += params.unknown.length;
784
- writer.writeVarInt(count);
721
+ const entries = [];
785
722
  if (params.path !== void 0) {
786
- writer.writeVarInt(SETUP_PARAM_PATH);
787
- const encoded = textEncoder.encode(params.path);
788
- writer.writeVarInt(encoded.byteLength);
789
- writer.writeBytes(encoded);
723
+ entries.push({
724
+ type: SETUP_PARAM_PATH,
725
+ encode: (w) => {
726
+ const encoded = textEncoder.encode(params.path);
727
+ w.writeVarInt(encoded.byteLength);
728
+ w.writeBytes(encoded);
729
+ }
730
+ });
790
731
  }
791
732
  if (params.max_request_id !== void 0) {
792
- writer.writeVarInt(SETUP_PARAM_MAX_REQUEST_ID);
793
- writer.writeVarInt(params.max_request_id);
733
+ entries.push({
734
+ type: SETUP_PARAM_MAX_REQUEST_ID,
735
+ encode: (w) => w.writeVarInt(params.max_request_id)
736
+ });
794
737
  }
795
- if (params.authorization_token !== void 0) {
796
- writer.writeVarInt(SETUP_PARAM_AUTHORIZATION_TOKEN);
797
- const tmpW = new BufferWriter(64);
798
- encodeAuthorizationToken(params.authorization_token, tmpW);
799
- const raw = tmpW.finish();
800
- writer.writeVarInt(raw.byteLength);
801
- writer.writeBytes(raw);
738
+ for (const token of params.authorization_token ?? []) {
739
+ entries.push({
740
+ type: SETUP_PARAM_AUTHORIZATION_TOKEN,
741
+ encode: (w) => {
742
+ const tmpW = new BufferWriter(64);
743
+ encodeAuthorizationToken(token, tmpW);
744
+ const raw = tmpW.finish();
745
+ w.writeVarInt(raw.byteLength);
746
+ w.writeBytes(raw);
747
+ }
748
+ });
802
749
  }
803
750
  if (params.max_auth_token_cache_size !== void 0) {
804
- writer.writeVarInt(SETUP_PARAM_MAX_AUTH_TOKEN_CACHE_SIZE);
805
- writer.writeVarInt(params.max_auth_token_cache_size);
751
+ entries.push({
752
+ type: SETUP_PARAM_MAX_AUTH_TOKEN_CACHE_SIZE,
753
+ encode: (w) => w.writeVarInt(params.max_auth_token_cache_size)
754
+ });
806
755
  }
807
756
  if (params.authority !== void 0) {
808
- writer.writeVarInt(SETUP_PARAM_AUTHORITY);
809
- const encoded = textEncoder.encode(params.authority);
810
- writer.writeVarInt(encoded.byteLength);
811
- writer.writeBytes(encoded);
757
+ entries.push({
758
+ type: SETUP_PARAM_AUTHORITY,
759
+ encode: (w) => {
760
+ const encoded = textEncoder.encode(params.authority);
761
+ w.writeVarInt(encoded.byteLength);
762
+ w.writeBytes(encoded);
763
+ }
764
+ });
812
765
  }
813
766
  if (params.moqt_implementation !== void 0) {
814
- writer.writeVarInt(SETUP_PARAM_MOQT_IMPLEMENTATION);
815
- const encoded = textEncoder.encode(params.moqt_implementation);
816
- writer.writeVarInt(encoded.byteLength);
817
- writer.writeBytes(encoded);
767
+ entries.push({
768
+ type: SETUP_PARAM_MOQT_IMPLEMENTATION,
769
+ encode: (w) => {
770
+ const encoded = textEncoder.encode(params.moqt_implementation);
771
+ w.writeVarInt(encoded.byteLength);
772
+ w.writeBytes(encoded);
773
+ }
774
+ });
818
775
  }
819
776
  if (params.unknown) {
820
777
  for (const u of params.unknown) {
821
778
  const id = BigInt(u.id);
822
- writer.writeVarInt(id);
823
- if (id % 2n === 0n) {
824
- const raw = hexToBytes(u.raw_hex);
825
- const tmpReader = new BufferReader(raw);
826
- const value = tmpReader.readVarInt();
827
- writer.writeVarInt(value);
828
- } else {
829
- const raw = hexToBytes(u.raw_hex);
830
- writer.writeVarInt(raw.byteLength);
831
- writer.writeBytes(raw);
832
- }
779
+ entries.push({
780
+ type: id,
781
+ encode: (w) => {
782
+ const raw = hexToBytes(u.raw_hex);
783
+ if (id % 2n === 0n) {
784
+ w.writeVarInt(new BufferReader(raw).readVarInt());
785
+ } else {
786
+ w.writeVarInt(raw.byteLength);
787
+ w.writeBytes(raw);
788
+ }
789
+ }
790
+ });
833
791
  }
834
792
  }
793
+ entries.sort((a, b) => a.type < b.type ? -1 : a.type > b.type ? 1 : 0);
794
+ writer.writeVarInt(entries.length);
795
+ let prevType = 0n;
796
+ for (const entry of entries) {
797
+ writer.writeVarInt(entry.type - prevType);
798
+ entry.encode(writer);
799
+ prevType = entry.type;
800
+ }
835
801
  }
836
802
  function decodeSetupParams(reader) {
837
803
  const count = Number(reader.readVarInt());
838
804
  const result = {};
839
805
  const unknown = [];
806
+ let prevType = 0n;
840
807
  for (let i = 0; i < count; i++) {
841
- const paramType = reader.readVarInt();
808
+ const delta = reader.readVarInt();
809
+ const paramType = prevType + delta;
810
+ prevType = paramType;
842
811
  if (paramType % 2n === 0n) {
843
812
  const value = reader.readVarInt();
844
813
  if (paramType === SETUP_PARAM_MAX_REQUEST_ID) {
@@ -861,7 +830,9 @@ function decodeSetupParams(reader) {
861
830
  if (paramType === SETUP_PARAM_PATH) {
862
831
  result.path = textDecoder.decode(bytes);
863
832
  } else if (paramType === SETUP_PARAM_AUTHORIZATION_TOKEN) {
864
- result.authorization_token = decodeAuthorizationToken(new BufferReader(bytes));
833
+ const token = decodeAuthorizationToken(new BufferReader(bytes));
834
+ noteAuthTokenValue(reader.offset - length, length, token.token_value);
835
+ result.authorization_token = [...result.authorization_token ?? [], token];
865
836
  } else if (paramType === SETUP_PARAM_AUTHORITY) {
866
837
  result.authority = textDecoder.decode(bytes);
867
838
  } else if (paramType === SETUP_PARAM_MOQT_IMPLEMENTATION) {
@@ -994,12 +965,12 @@ function encodeParams(params, writer) {
994
965
  encode: (w) => w.writeVarInt(params.delivery_timeout)
995
966
  });
996
967
  }
997
- if (params.authorization_token !== void 0) {
968
+ for (const token of params.authorization_token ?? []) {
998
969
  entries.push({
999
970
  type: PARAM_AUTHORIZATION_TOKEN,
1000
971
  encode: (w) => {
1001
972
  const tmpW = new BufferWriter(64);
1002
- encodeAuthorizationToken(params.authorization_token, tmpW);
973
+ encodeAuthorizationToken(token, tmpW);
1003
974
  const raw = tmpW.finish();
1004
975
  w.writeVarInt(raw.byteLength);
1005
976
  w.writeBytes(raw);
@@ -1121,7 +1092,9 @@ function decodeParams(reader) {
1121
1092
  } else if (paramType === PARAM_AUTHORIZATION_TOKEN) {
1122
1093
  const length = Number(reader.readVarInt());
1123
1094
  const tokenBytes = reader.readBytes(length);
1124
- result.authorization_token = decodeAuthorizationToken(new BufferReader(tokenBytes));
1095
+ const token = decodeAuthorizationToken(new BufferReader(tokenBytes));
1096
+ noteAuthTokenValue(reader.offset - length, length, token.token_value);
1097
+ result.authorization_token = [...result.authorization_token ?? [], token];
1125
1098
  } else if (paramType === PARAM_MAX_CACHE_DURATION) {
1126
1099
  result.max_cache_duration = reader.readVarInt();
1127
1100
  } else if (paramType === PARAM_EXPIRES) {
@@ -1705,6 +1678,23 @@ function createDraft16Codec() {
1705
1678
  createDataStreamDecoder
1706
1679
  };
1707
1680
  }
1681
+ function noteAuthTokenValue(valueStart, valueLength, value) {
1682
+ if (value === void 0 || value.byteLength === 0) return;
1683
+ recordAuthValueSpan(valueStart + valueLength - value.byteLength, value.byteLength);
1684
+ }
1685
+ function redactAuthTokens(bytes) {
1686
+ let payloadStart;
1687
+ try {
1688
+ const probe = new BufferReader(bytes);
1689
+ probe.readVarInt();
1690
+ probe.readUint8();
1691
+ probe.readUint8();
1692
+ payloadStart = probe.offset;
1693
+ } catch {
1694
+ return { bytes, redacted: 0, incomplete: false, decoded: false };
1695
+ }
1696
+ return redactWith(bytes, payloadStart, () => decodeMessage(bytes).ok);
1697
+ }
1708
1698
 
1709
1699
  export {
1710
1700
  MSG_REQUEST_UPDATE,
@@ -1751,5 +1741,6 @@ export {
1751
1741
  encodeMessage,
1752
1742
  decodeMessage,
1753
1743
  createStreamDecoder,
1754
- createDraft16Codec
1744
+ createDraft16Codec,
1745
+ redactAuthTokens
1755
1746
  };