@norskvideo/moq-net 0.1.8 → 0.2.1

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 (286) hide show
  1. package/README.md +2 -2
  2. package/announce.d.ts +7 -0
  3. package/announce.d.ts.map +1 -0
  4. package/announce.js +8 -0
  5. package/announce.js.map +1 -0
  6. package/announced.d.ts +49 -91
  7. package/announced.d.ts.map +1 -1
  8. package/announced.js +21 -156
  9. package/announced.js.map +1 -1
  10. package/bandwidth.d.ts +163 -0
  11. package/bandwidth.d.ts.map +1 -0
  12. package/bandwidth.js +304 -0
  13. package/bandwidth.js.map +1 -0
  14. package/bandwidth_api.d.ts +7 -0
  15. package/bandwidth_api.d.ts.map +1 -0
  16. package/bandwidth_api.js +8 -0
  17. package/bandwidth_api.js.map +1 -0
  18. package/broadcast.d.ts +44 -35
  19. package/broadcast.d.ts.map +1 -1
  20. package/broadcast.js +104 -60
  21. package/broadcast.js.map +1 -1
  22. package/connection/accept.d.ts +16 -1
  23. package/connection/accept.d.ts.map +1 -1
  24. package/connection/accept.js +52 -28
  25. package/connection/accept.js.map +1 -1
  26. package/connection/browser.d.ts.map +1 -1
  27. package/connection/browser.js +9 -7
  28. package/connection/browser.js.map +1 -1
  29. package/connection/connect.d.ts +30 -6
  30. package/connection/connect.d.ts.map +1 -1
  31. package/connection/connect.js +110 -54
  32. package/connection/connect.js.map +1 -1
  33. package/connection/established.d.ts +17 -21
  34. package/connection/established.d.ts.map +1 -1
  35. package/connection/established.js.map +1 -1
  36. package/connection/forward.d.ts +2 -0
  37. package/connection/forward.d.ts.map +1 -0
  38. package/connection/forward.js +173 -0
  39. package/connection/forward.js.map +1 -0
  40. package/connection/handshake.d.ts +1 -0
  41. package/connection/handshake.d.ts.map +1 -1
  42. package/connection/handshake.js +5 -2
  43. package/connection/handshake.js.map +1 -1
  44. package/connection/index.d.ts +5 -5
  45. package/connection/index.d.ts.map +1 -1
  46. package/connection/index.js +4 -5
  47. package/connection/index.js.map +1 -1
  48. package/connection/pool.d.ts +186 -0
  49. package/connection/pool.d.ts.map +1 -0
  50. package/connection/pool.js +361 -0
  51. package/connection/pool.js.map +1 -0
  52. package/connection/reload.d.ts +14 -93
  53. package/connection/reload.d.ts.map +1 -1
  54. package/connection/reload.js +217 -81
  55. package/connection/reload.js.map +1 -1
  56. package/connection/stats.d.ts +3 -26
  57. package/connection/stats.d.ts.map +1 -1
  58. package/connection/stats.js.map +1 -1
  59. package/connection/transport.d.ts +0 -7
  60. package/connection/transport.d.ts.map +1 -1
  61. package/consume.d.ts +1 -43
  62. package/consume.d.ts.map +1 -1
  63. package/consume.js +1 -1
  64. package/consume.js.map +1 -1
  65. package/error.d.ts +180 -29
  66. package/error.d.ts.map +1 -1
  67. package/error.js +331 -16
  68. package/error.js.map +1 -1
  69. package/errors.d.ts +7 -0
  70. package/errors.d.ts.map +1 -0
  71. package/errors.js +8 -0
  72. package/errors.js.map +1 -0
  73. package/group.d.ts +9 -43
  74. package/group.d.ts.map +1 -1
  75. package/group.js +284 -69
  76. package/group.js.map +1 -1
  77. package/hop.d.ts +115 -0
  78. package/hop.d.ts.map +1 -0
  79. package/hop.js +119 -0
  80. package/hop.js.map +1 -0
  81. package/ietf/adapter.d.ts +5 -1
  82. package/ietf/adapter.d.ts.map +1 -1
  83. package/ietf/adapter.js +105 -60
  84. package/ietf/adapter.js.map +1 -1
  85. package/ietf/aliases.d.ts +1 -78
  86. package/ietf/aliases.d.ts.map +1 -1
  87. package/ietf/cluster.d.ts +9 -123
  88. package/ietf/cluster.d.ts.map +1 -1
  89. package/ietf/cluster.js +84 -44
  90. package/ietf/cluster.js.map +1 -1
  91. package/ietf/connection.d.ts +6 -72
  92. package/ietf/connection.d.ts.map +1 -1
  93. package/ietf/connection.js +62 -56
  94. package/ietf/connection.js.map +1 -1
  95. package/ietf/error.d.ts +11 -0
  96. package/ietf/error.d.ts.map +1 -0
  97. package/ietf/error.js +193 -0
  98. package/ietf/error.js.map +1 -0
  99. package/ietf/fetch.d.ts +7 -20
  100. package/ietf/fetch.d.ts.map +1 -1
  101. package/ietf/fetch.js +52 -22
  102. package/ietf/fetch.js.map +1 -1
  103. package/ietf/filter.d.ts +2 -0
  104. package/ietf/filter.d.ts.map +1 -1
  105. package/ietf/filter.js +10 -1
  106. package/ietf/filter.js.map +1 -1
  107. package/ietf/goaway.d.ts.map +1 -1
  108. package/ietf/goaway.js +22 -5
  109. package/ietf/goaway.js.map +1 -1
  110. package/ietf/hidden.d.ts +2 -0
  111. package/ietf/hidden.d.ts.map +1 -0
  112. package/ietf/hidden.js +30 -0
  113. package/ietf/hidden.js.map +1 -0
  114. package/ietf/index.d.ts +2 -0
  115. package/ietf/index.d.ts.map +1 -1
  116. package/ietf/index.js +2 -0
  117. package/ietf/index.js.map +1 -1
  118. package/ietf/object.d.ts +15 -8
  119. package/ietf/object.d.ts.map +1 -1
  120. package/ietf/object.js +51 -36
  121. package/ietf/object.js.map +1 -1
  122. package/ietf/parameters.d.ts +14 -2
  123. package/ietf/parameters.d.ts.map +1 -1
  124. package/ietf/parameters.js +97 -29
  125. package/ietf/parameters.js.map +1 -1
  126. package/ietf/properties.d.ts +1 -0
  127. package/ietf/properties.d.ts.map +1 -1
  128. package/ietf/properties.js +14 -0
  129. package/ietf/properties.js.map +1 -1
  130. package/ietf/publish.d.ts +19 -2
  131. package/ietf/publish.d.ts.map +1 -1
  132. package/ietf/publish.js +40 -6
  133. package/ietf/publish.js.map +1 -1
  134. package/ietf/publish_namespace.d.ts +25 -0
  135. package/ietf/publish_namespace.d.ts.map +1 -1
  136. package/ietf/publish_namespace.js +63 -0
  137. package/ietf/publish_namespace.js.map +1 -1
  138. package/ietf/publisher.d.ts +1 -82
  139. package/ietf/publisher.d.ts.map +1 -1
  140. package/ietf/publisher.js +483 -235
  141. package/ietf/publisher.js.map +1 -1
  142. package/ietf/solicit.d.ts +1 -40
  143. package/ietf/solicit.d.ts.map +1 -1
  144. package/ietf/subscribe.d.ts +8 -6
  145. package/ietf/subscribe.d.ts.map +1 -1
  146. package/ietf/subscribe.js +33 -27
  147. package/ietf/subscribe.js.map +1 -1
  148. package/ietf/subscribe_namespace.d.ts +8 -2
  149. package/ietf/subscribe_namespace.d.ts.map +1 -1
  150. package/ietf/subscribe_namespace.js +18 -8
  151. package/ietf/subscribe_namespace.js.map +1 -1
  152. package/ietf/subscriber.d.ts +1 -65
  153. package/ietf/subscriber.d.ts.map +1 -1
  154. package/ietf/subscriber.js +337 -123
  155. package/ietf/subscriber.js.map +1 -1
  156. package/ietf/token.d.ts +2 -0
  157. package/ietf/token.d.ts.map +1 -0
  158. package/ietf/token.js +99 -0
  159. package/ietf/token.js.map +1 -0
  160. package/ietf/track.d.ts +4 -0
  161. package/ietf/track.d.ts.map +1 -1
  162. package/ietf/track.js +6 -20
  163. package/ietf/track.js.map +1 -1
  164. package/ietf/version.d.ts +12 -1
  165. package/ietf/version.d.ts.map +1 -1
  166. package/ietf/version.js +13 -0
  167. package/ietf/version.js.map +1 -1
  168. package/index.d.ts +12 -7
  169. package/index.d.ts.map +1 -1
  170. package/index.js +10 -5
  171. package/index.js.map +1 -1
  172. package/internal.d.ts +115 -1
  173. package/internal.d.ts.map +1 -1
  174. package/internal.js +108 -0
  175. package/internal.js.map +1 -1
  176. package/lite/announce.d.ts +60 -10
  177. package/lite/announce.d.ts.map +1 -1
  178. package/lite/announce.js +176 -31
  179. package/lite/announce.js.map +1 -1
  180. package/lite/connection.d.ts +9 -59
  181. package/lite/connection.d.ts.map +1 -1
  182. package/lite/connection.js +34 -35
  183. package/lite/connection.js.map +1 -1
  184. package/lite/datagram.d.ts +3 -2
  185. package/lite/datagram.d.ts.map +1 -1
  186. package/lite/datagram.js +7 -8
  187. package/lite/datagram.js.map +1 -1
  188. package/lite/fetch.d.ts +15 -1
  189. package/lite/fetch.d.ts.map +1 -1
  190. package/lite/fetch.js +39 -7
  191. package/lite/fetch.js.map +1 -1
  192. package/lite/goaway.d.ts.map +1 -1
  193. package/lite/goaway.js +7 -1
  194. package/lite/goaway.js.map +1 -1
  195. package/lite/group.d.ts +30 -12
  196. package/lite/group.d.ts.map +1 -1
  197. package/lite/group.js +68 -26
  198. package/lite/group.js.map +1 -1
  199. package/lite/message.d.ts +2 -2
  200. package/lite/message.d.ts.map +1 -1
  201. package/lite/message.js +14 -5
  202. package/lite/message.js.map +1 -1
  203. package/lite/priority.d.ts +1 -61
  204. package/lite/priority.d.ts.map +1 -1
  205. package/lite/priority.js +4 -5
  206. package/lite/priority.js.map +1 -1
  207. package/lite/publisher.d.ts +1 -69
  208. package/lite/publisher.d.ts.map +1 -1
  209. package/lite/publisher.js +630 -262
  210. package/lite/publisher.js.map +1 -1
  211. package/lite/setup.d.ts +8 -8
  212. package/lite/setup.d.ts.map +1 -1
  213. package/lite/setup.js +33 -30
  214. package/lite/setup.js.map +1 -1
  215. package/lite/subscribe.d.ts +71 -17
  216. package/lite/subscribe.d.ts.map +1 -1
  217. package/lite/subscribe.js +205 -53
  218. package/lite/subscribe.js.map +1 -1
  219. package/lite/subscriber.d.ts +15 -56
  220. package/lite/subscriber.d.ts.map +1 -1
  221. package/lite/subscriber.js +451 -247
  222. package/lite/subscriber.js.map +1 -1
  223. package/lite/track.d.ts +4 -10
  224. package/lite/track.d.ts.map +1 -1
  225. package/lite/track.js +34 -29
  226. package/lite/track.js.map +1 -1
  227. package/lite/version.d.ts +42 -6
  228. package/lite/version.d.ts.map +1 -1
  229. package/lite/version.js +126 -10
  230. package/lite/version.js.map +1 -1
  231. package/origin.d.ts +256 -29
  232. package/origin.d.ts.map +1 -1
  233. package/origin.js +1427 -37
  234. package/origin.js.map +1 -1
  235. package/package.json +8 -3
  236. package/path.d.ts +25 -7
  237. package/path.d.ts.map +1 -1
  238. package/path.js +5 -3
  239. package/path.js.map +1 -1
  240. package/stream.d.ts +73 -14
  241. package/stream.d.ts.map +1 -1
  242. package/stream.js +372 -141
  243. package/stream.js.map +1 -1
  244. package/tail.d.ts +18 -0
  245. package/tail.d.ts.map +1 -0
  246. package/tail.js +167 -0
  247. package/tail.js.map +1 -0
  248. package/time.d.ts +15 -2
  249. package/time.d.ts.map +1 -1
  250. package/time.js +28 -9
  251. package/time.js.map +1 -1
  252. package/track.d.ts +211 -83
  253. package/track.d.ts.map +1 -1
  254. package/track.js +816 -205
  255. package/track.js.map +1 -1
  256. package/util/abort.d.ts +2 -0
  257. package/util/abort.d.ts.map +1 -0
  258. package/util/abort.js +20 -0
  259. package/util/abort.js.map +1 -0
  260. package/util/log.d.ts +5 -0
  261. package/util/log.d.ts.map +1 -0
  262. package/util/log.js +17 -0
  263. package/util/log.js.map +1 -0
  264. package/util/u64.d.ts +39 -0
  265. package/util/u64.d.ts.map +1 -0
  266. package/util/u64.js +83 -0
  267. package/util/u64.js.map +1 -0
  268. package/util/varint.d.ts +29 -0
  269. package/util/varint.d.ts.map +1 -0
  270. package/util/varint.js +198 -0
  271. package/util/varint.js.map +1 -0
  272. package/varint.d.ts +10 -6
  273. package/varint.d.ts.map +1 -1
  274. package/varint.js +40 -237
  275. package/varint.js.map +1 -1
  276. package/wire.d.ts +80 -0
  277. package/wire.d.ts.map +1 -0
  278. package/wire.js +32 -0
  279. package/wire.js.map +1 -0
  280. package/zod.d.ts +1 -1
  281. package/zod.d.ts.map +1 -1
  282. package/zod.js.map +1 -1
  283. package/mock.d.ts +0 -66
  284. package/mock.d.ts.map +0 -1
  285. package/mock.js +0 -243
  286. package/mock.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"u64.js","sourceRoot":"","sources":["../../src/util/u64.ts"],"names":[],"mappings":"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","sourcesContent":["// An unsigned 64-bit integer as two u32 halves, so nothing on the hot path needs a BigInt.\n// Package-internal. Varints are only its wire encoding; see ./varint.ts.\n\n/** 2^32, the weight of the upper half. */\nexport const POW32 = 0x1_0000_0000;\n// An upper half at or above this is past `Number.MAX_SAFE_INTEGER`.\nconst SAFE_HI = 2 ** 21;\n\n/** Join two halves into a `number`, throwing if it is above `Number.MAX_SAFE_INTEGER` rather than rounding. */\nexport function toNumber(hi: number, lo: number): number {\n\tif (hi >= SAFE_HI) throw new RangeError(`value larger than 53-bits: ${toBigInt(hi, lo)}`);\n\treturn hi * POW32 + lo;\n}\n\n/** Join two halves into a bigint, exact up to 64 bits. */\nexport function toBigInt(hi: number, lo: number): bigint {\n\treturn hi === 0 ? BigInt(lo) : (BigInt(hi) << 32n) | BigInt(lo);\n}\n\n/**\n * An unsigned 64-bit integer, held as two 32-bit halves so it encodes and decodes without a BigInt.\n * Converting to a `number` throws past 2^53 rather than rounding.\n */\nexport class U64 {\n\t/** The value 0. */\n\tstatic readonly ZERO = new U64(0, 0);\n\t/** The largest value, 2^64 - 1. */\n\tstatic readonly MAX = new U64(POW32 - 1, POW32 - 1);\n\n\t/** The upper 32 bits. */\n\treadonly hi: number;\n\t/** The lower 32 bits. */\n\treadonly lo: number;\n\n\t/** Join the upper and lower 32 bits, throwing if either is not a u32. */\n\tconstructor(hi: number, lo: number) {\n\t\tif (!Number.isInteger(hi) || hi < 0 || hi >= POW32) throw new RangeError(`invalid upper half: ${hi}`);\n\t\tif (!Number.isInteger(lo) || lo < 0 || lo >= POW32) throw new RangeError(`invalid lower half: ${lo}`);\n\t\tthis.hi = hi;\n\t\tthis.lo = lo;\n\t}\n\n\t/** Convert a non-negative safe integer, throwing on anything else. */\n\tstatic fromNumber(v: number): U64 {\n\t\tif (!Number.isSafeInteger(v) || v < 0) throw new RangeError(`invalid u64: ${v}`);\n\t\treturn new U64(Math.floor(v / POW32), v >>> 0);\n\t}\n\n\t/** Convert a bigint, throwing unless it is in [0, 2^64). */\n\tstatic fromBigInt(v: bigint): U64 {\n\t\tif (v < 0n || v >> 64n) throw new RangeError(`invalid u64: ${v}`);\n\t\treturn new U64(Number(v >> 32n), Number(v & 0xffffffffn));\n\t}\n\n\t/** Convert to a `number`, throwing if it is above `Number.MAX_SAFE_INTEGER`. */\n\ttoNumber(): number {\n\t\treturn toNumber(this.hi, this.lo);\n\t}\n\n\t/** Convert to a bigint, exactly. */\n\ttoBigInt(): bigint {\n\t\treturn toBigInt(this.hi, this.lo);\n\t}\n\n\t/** The value in decimal. */\n\ttoString(): string {\n\t\treturn this.hi < SAFE_HI ? String(this.hi * POW32 + this.lo) : this.toBigInt().toString();\n\t}\n\n\t/** Negative if this is less than `other`, zero if equal, positive if greater. */\n\tcompare(other: U64): number {\n\t\treturn this.hi - other.hi || this.lo - other.lo;\n\t}\n\n\t/** Whether this equals `other`. */\n\tequals(other: U64): boolean {\n\t\treturn this.hi === other.hi && this.lo === other.lo;\n\t}\n\n\t/** This plus a non-negative safe integer, throwing if the sum reaches 2^64. */\n\tadd(delta: number): U64 {\n\t\tif (!Number.isSafeInteger(delta) || delta < 0) throw new RangeError(`invalid delta: ${delta}`);\n\t\tconst lo = this.lo + (delta >>> 0);\n\t\tconst hi = this.hi + Math.floor(delta / POW32) + (lo >= POW32 ? 1 : 0);\n\t\tif (hi >= POW32) throw new RangeError(`overflow, ${this} + ${delta} exceeds 64 bits`);\n\t\treturn new U64(hi, lo >>> 0);\n\t}\n}\n"]}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * The upper half of the last value decoded or split. Each returns its lower half and leaves the
3
+ * upper one here rather than allocating a pair; read it before the next call.
4
+ */
5
+ export declare const parts: {
6
+ hi: number;
7
+ };
8
+ /** Split a non-negative integer of up to 64 bits, returning the lower half. The encoder bounds it. */
9
+ export declare function split(v: number | bigint): number;
10
+ /** The size of a QUIC varint, from its first byte. */
11
+ export declare function peekQuic(first: number): number;
12
+ /** Decode a QUIC varint of `size` bytes at `o`, returning the lower half and setting `parts.hi`. The bytes must be there. */
13
+ export declare function readQuic(buf: Uint8Array, o: number, size: number): number;
14
+ /** The size of `hi`/`lo` as a QUIC varint, throwing at 2^62 or above. */
15
+ export declare function lengthQuic(hi: number, lo: number): number;
16
+ /** Encode a QUIC varint of {@link lengthQuic} `size` at the start of `dst`. */
17
+ export declare function writeQuic(dst: Uint8Array, hi: number, lo: number, size: number): void;
18
+ /** The size of a leading-ones varint, from its first byte. */
19
+ export declare function peekLeadingOnes(first: number): number;
20
+ /** Decode a leading-ones varint of `size` bytes at `o`, returning the lower half and setting `parts.hi`. The bytes must be there. */
21
+ export declare function readLeadingOnes(buf: Uint8Array, o: number, size: number): number;
22
+ /**
23
+ * The size of `hi`/`lo` as a leading-ones varint, in its shortest form. The 7-byte form is skipped:
24
+ * draft-17 rejects it, and the 8-byte form is valid everywhere.
25
+ */
26
+ export declare function lengthLeadingOnes(hi: number, lo: number): number;
27
+ /** Encode a leading-ones varint of {@link lengthLeadingOnes} `size` at the start of `dst`. */
28
+ export declare function writeLeadingOnes(dst: Uint8Array, hi: number, lo: number, size: number): void;
29
+ //# sourceMappingURL=varint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"varint.d.ts","sourceRoot":"","sources":["../../src/util/varint.ts"],"names":[],"mappings":"AAmBA;;;GAGG;AACH,eAAO,MAAM,KAAK;IAAK,EAAE;CAAK,CAAC;AAE/B,sGAAsG;AACtG,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAYhD;AAaD,sDAAsD;AACtD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,6HAA6H;AAC7H,wBAAgB,QAAQ,CAAC,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAUzE;AAED,yEAAyE;AACzE,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAQzD;AAED,+EAA+E;AAC/E,wBAAgB,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAY9E;AAED,8DAA8D;AAC9D,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,qIAAqI;AACrI,wBAAgB,eAAe,CAAC,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CA+BhF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAWhE;AAED,8FAA8F;AAC9F,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAmCrF"}
package/util/varint.js ADDED
@@ -0,0 +1,198 @@
1
+ /* @ts-self-types="./varint.d.ts" */
2
+ // The varint wire codec on 32-bit halves (see ./u64.ts), so neither format needs a BigInt.
3
+ // Package-internal: the public API in ../varint.ts and the stream Cursor and Writer are built on it.
4
+ //
5
+ // QUIC (RFC 9000 Section 16): the top two bits give the size.
6
+ // 00xxxxxx → 1 byte, 01 → 2, 10 → 4, 11 → 8 (62 bits)
7
+ //
8
+ // Leading-ones (moq-transport draft-17+ Section 1.4.1): the leading 1-bits give the size.
9
+ // 0xxxxxxx → 1 byte (7 bits)
10
+ // 10xxxxxx + 1B → 2 bytes (14 bits)
11
+ // 110xxxxx + 2B → 3 bytes (21 bits)
12
+ // 1110xxxx + 3B → 4 bytes (28 bits)
13
+ // 11110xxx + 4B → 5 bytes (35 bits)
14
+ // 111110xx + 5B → 6 bytes (42 bits)
15
+ // 1111110x + 6B → 7 bytes (49 bits), draft-18+ only (invalid in draft-17 per #1595)
16
+ // 11111110 + 7B → 8 bytes (56 bits)
17
+ // 11111111 + 8B → 9 bytes (64 bits)
18
+ import { POW32, toBigInt } from "./u64.js";
19
+ /**
20
+ * The upper half of the last value decoded or split. Each returns its lower half and leaves the
21
+ * upper one here rather than allocating a pair; read it before the next call.
22
+ */
23
+ export const parts = { hi: 0 };
24
+ /** Split a non-negative integer of up to 64 bits, returning the lower half. The encoder bounds it. */
25
+ export function split(v) {
26
+ if (typeof v === "number") {
27
+ if (!Number.isInteger(v))
28
+ throw new RangeError(`not an integer: ${v}`);
29
+ if (v < 0)
30
+ throw new RangeError(`underflow, value is negative: ${v}`);
31
+ if (v >= POW32 * POW32)
32
+ throw new RangeError(`value exceeds 64 bits: ${v}`);
33
+ parts.hi = Math.floor(v / POW32);
34
+ return v >>> 0;
35
+ }
36
+ if (v < 0n)
37
+ throw new RangeError(`underflow, value is negative: ${v}`);
38
+ if (v >> 64n)
39
+ throw new RangeError(`value exceeds 64 bits: ${v}`);
40
+ parts.hi = Number(v >> 32n);
41
+ return Number(v & 0xffffffffn);
42
+ }
43
+ function u32(buf, o) {
44
+ return ((buf[o] << 24) | (buf[o + 1] << 16) | (buf[o + 2] << 8) | buf[o + 3]) >>> 0;
45
+ }
46
+ function setU32(buf, o, v) {
47
+ buf[o] = v >>> 24;
48
+ buf[o + 1] = v >>> 16;
49
+ buf[o + 2] = v >>> 8;
50
+ buf[o + 3] = v;
51
+ }
52
+ /** The size of a QUIC varint, from its first byte. */
53
+ export function peekQuic(first) {
54
+ return 1 << (first >> 6);
55
+ }
56
+ /** Decode a QUIC varint of `size` bytes at `o`, returning the lower half and setting `parts.hi`. The bytes must be there. */
57
+ export function readQuic(buf, o, size) {
58
+ const b = buf[o] & 0x3f;
59
+ if (size === 8) {
60
+ parts.hi = (b << 24) | (buf[o + 1] << 16) | (buf[o + 2] << 8) | buf[o + 3];
61
+ return u32(buf, o + 4);
62
+ }
63
+ parts.hi = 0;
64
+ if (size === 1)
65
+ return b;
66
+ if (size === 2)
67
+ return (b << 8) | buf[o + 1];
68
+ return (b << 24) | (buf[o + 1] << 16) | (buf[o + 2] << 8) | buf[o + 3];
69
+ }
70
+ /** The size of `hi`/`lo` as a QUIC varint, throwing at 2^62 or above. */
71
+ export function lengthQuic(hi, lo) {
72
+ if (hi === 0) {
73
+ if (lo < 0x40)
74
+ return 1;
75
+ if (lo < 0x4000)
76
+ return 2;
77
+ if (lo < 0x4000_0000)
78
+ return 4;
79
+ }
80
+ if (hi >= 0x4000_0000)
81
+ throw new RangeError(`overflow, value larger than 62-bits: ${toBigInt(hi, lo)}`);
82
+ return 8;
83
+ }
84
+ /** Encode a QUIC varint of {@link lengthQuic} `size` at the start of `dst`. */
85
+ export function writeQuic(dst, hi, lo, size) {
86
+ if (size === 1) {
87
+ dst[0] = lo;
88
+ }
89
+ else if (size === 2) {
90
+ dst[0] = 0x40 | (lo >>> 8);
91
+ dst[1] = lo;
92
+ }
93
+ else if (size === 4) {
94
+ setU32(dst, 0, 0x8000_0000 | lo);
95
+ }
96
+ else {
97
+ setU32(dst, 0, 0xc000_0000 | hi);
98
+ setU32(dst, 4, lo);
99
+ }
100
+ }
101
+ /** The size of a leading-ones varint, from its first byte. */
102
+ export function peekLeadingOnes(first) {
103
+ return Math.clz32(~(first << 24)) + 1;
104
+ }
105
+ /** Decode a leading-ones varint of `size` bytes at `o`, returning the lower half and setting `parts.hi`. The bytes must be there. */
106
+ export function readLeadingOnes(buf, o, size) {
107
+ const b = buf[o];
108
+ switch (size) {
109
+ case 1:
110
+ parts.hi = 0;
111
+ return b;
112
+ case 2:
113
+ parts.hi = 0;
114
+ return ((b & 0x3f) << 8) | buf[o + 1];
115
+ case 3:
116
+ parts.hi = 0;
117
+ return ((b & 0x1f) << 16) | (buf[o + 1] << 8) | buf[o + 2];
118
+ case 4:
119
+ parts.hi = 0;
120
+ return ((b & 0x0f) << 24) | (buf[o + 1] << 16) | (buf[o + 2] << 8) | buf[o + 3];
121
+ case 5:
122
+ parts.hi = b & 0x07;
123
+ return u32(buf, o + 1);
124
+ case 6:
125
+ parts.hi = ((b & 0x03) << 8) | buf[o + 1];
126
+ return u32(buf, o + 2);
127
+ case 7:
128
+ parts.hi = ((b & 0x01) << 16) | (buf[o + 1] << 8) | buf[o + 2];
129
+ return u32(buf, o + 3);
130
+ case 8:
131
+ parts.hi = (buf[o + 1] << 16) | (buf[o + 2] << 8) | buf[o + 3];
132
+ return u32(buf, o + 4);
133
+ default:
134
+ parts.hi = u32(buf, o + 1);
135
+ return u32(buf, o + 5);
136
+ }
137
+ }
138
+ /**
139
+ * The size of `hi`/`lo` as a leading-ones varint, in its shortest form. The 7-byte form is skipped:
140
+ * draft-17 rejects it, and the 8-byte form is valid everywhere.
141
+ */
142
+ export function lengthLeadingOnes(hi, lo) {
143
+ if (hi === 0) {
144
+ if (lo < 0x80)
145
+ return 1;
146
+ if (lo < 0x4000)
147
+ return 2;
148
+ if (lo < 0x20_0000)
149
+ return 3;
150
+ if (lo < 0x1000_0000)
151
+ return 4;
152
+ }
153
+ if (hi < 0x8)
154
+ return 5;
155
+ if (hi < 0x400)
156
+ return 6;
157
+ if (hi < 0x100_0000)
158
+ return 8;
159
+ return 9;
160
+ }
161
+ /** Encode a leading-ones varint of {@link lengthLeadingOnes} `size` at the start of `dst`. */
162
+ export function writeLeadingOnes(dst, hi, lo, size) {
163
+ switch (size) {
164
+ case 1:
165
+ dst[0] = lo;
166
+ return;
167
+ case 2:
168
+ dst[0] = 0x80 | (lo >>> 8);
169
+ dst[1] = lo;
170
+ return;
171
+ case 3:
172
+ dst[0] = 0xc0 | (lo >>> 16);
173
+ dst[1] = lo >>> 8;
174
+ dst[2] = lo;
175
+ return;
176
+ case 4:
177
+ setU32(dst, 0, 0xe000_0000 | lo);
178
+ return;
179
+ case 5:
180
+ dst[0] = 0xf0 | hi;
181
+ setU32(dst, 1, lo);
182
+ return;
183
+ case 6:
184
+ dst[0] = 0xf8 | (hi >>> 8);
185
+ dst[1] = hi;
186
+ setU32(dst, 2, lo);
187
+ return;
188
+ case 8:
189
+ setU32(dst, 0, 0xfe00_0000 | hi);
190
+ setU32(dst, 4, lo);
191
+ return;
192
+ default:
193
+ dst[0] = 0xff;
194
+ setU32(dst, 1, hi);
195
+ setU32(dst, 5, lo);
196
+ }
197
+ }
198
+ //# sourceMappingURL=varint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"varint.js","sourceRoot":"","sources":["../../src/util/varint.ts"],"names":[],"mappings":"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","sourcesContent":["// The varint wire codec on 32-bit halves (see ./u64.ts), so neither format needs a BigInt.\n// Package-internal: the public API in ../varint.ts and the stream Cursor and Writer are built on it.\n//\n// QUIC (RFC 9000 Section 16): the top two bits give the size.\n// 00xxxxxx → 1 byte, 01 → 2, 10 → 4, 11 → 8 (62 bits)\n//\n// Leading-ones (moq-transport draft-17+ Section 1.4.1): the leading 1-bits give the size.\n// 0xxxxxxx → 1 byte (7 bits)\n// 10xxxxxx + 1B → 2 bytes (14 bits)\n// 110xxxxx + 2B → 3 bytes (21 bits)\n// 1110xxxx + 3B → 4 bytes (28 bits)\n// 11110xxx + 4B → 5 bytes (35 bits)\n// 111110xx + 5B → 6 bytes (42 bits)\n// 1111110x + 6B → 7 bytes (49 bits), draft-18+ only (invalid in draft-17 per #1595)\n// 11111110 + 7B → 8 bytes (56 bits)\n// 11111111 + 8B → 9 bytes (64 bits)\n\nimport { POW32, toBigInt } from \"./u64.ts\";\n\n/**\n * The upper half of the last value decoded or split. Each returns its lower half and leaves the\n * upper one here rather than allocating a pair; read it before the next call.\n */\nexport const parts = { hi: 0 };\n\n/** Split a non-negative integer of up to 64 bits, returning the lower half. The encoder bounds it. */\nexport function split(v: number | bigint): number {\n\tif (typeof v === \"number\") {\n\t\tif (!Number.isInteger(v)) throw new RangeError(`not an integer: ${v}`);\n\t\tif (v < 0) throw new RangeError(`underflow, value is negative: ${v}`);\n\t\tif (v >= POW32 * POW32) throw new RangeError(`value exceeds 64 bits: ${v}`);\n\t\tparts.hi = Math.floor(v / POW32);\n\t\treturn v >>> 0;\n\t}\n\tif (v < 0n) throw new RangeError(`underflow, value is negative: ${v}`);\n\tif (v >> 64n) throw new RangeError(`value exceeds 64 bits: ${v}`);\n\tparts.hi = Number(v >> 32n);\n\treturn Number(v & 0xffffffffn);\n}\n\nfunction u32(buf: Uint8Array, o: number): number {\n\treturn ((buf[o] << 24) | (buf[o + 1] << 16) | (buf[o + 2] << 8) | buf[o + 3]) >>> 0;\n}\n\nfunction setU32(buf: Uint8Array, o: number, v: number) {\n\tbuf[o] = v >>> 24;\n\tbuf[o + 1] = v >>> 16;\n\tbuf[o + 2] = v >>> 8;\n\tbuf[o + 3] = v;\n}\n\n/** The size of a QUIC varint, from its first byte. */\nexport function peekQuic(first: number): number {\n\treturn 1 << (first >> 6);\n}\n\n/** Decode a QUIC varint of `size` bytes at `o`, returning the lower half and setting `parts.hi`. The bytes must be there. */\nexport function readQuic(buf: Uint8Array, o: number, size: number): number {\n\tconst b = buf[o] & 0x3f;\n\tif (size === 8) {\n\t\tparts.hi = (b << 24) | (buf[o + 1] << 16) | (buf[o + 2] << 8) | buf[o + 3];\n\t\treturn u32(buf, o + 4);\n\t}\n\tparts.hi = 0;\n\tif (size === 1) return b;\n\tif (size === 2) return (b << 8) | buf[o + 1];\n\treturn (b << 24) | (buf[o + 1] << 16) | (buf[o + 2] << 8) | buf[o + 3];\n}\n\n/** The size of `hi`/`lo` as a QUIC varint, throwing at 2^62 or above. */\nexport function lengthQuic(hi: number, lo: number): number {\n\tif (hi === 0) {\n\t\tif (lo < 0x40) return 1;\n\t\tif (lo < 0x4000) return 2;\n\t\tif (lo < 0x4000_0000) return 4;\n\t}\n\tif (hi >= 0x4000_0000) throw new RangeError(`overflow, value larger than 62-bits: ${toBigInt(hi, lo)}`);\n\treturn 8;\n}\n\n/** Encode a QUIC varint of {@link lengthQuic} `size` at the start of `dst`. */\nexport function writeQuic(dst: Uint8Array, hi: number, lo: number, size: number) {\n\tif (size === 1) {\n\t\tdst[0] = lo;\n\t} else if (size === 2) {\n\t\tdst[0] = 0x40 | (lo >>> 8);\n\t\tdst[1] = lo;\n\t} else if (size === 4) {\n\t\tsetU32(dst, 0, 0x8000_0000 | lo);\n\t} else {\n\t\tsetU32(dst, 0, 0xc000_0000 | hi);\n\t\tsetU32(dst, 4, lo);\n\t}\n}\n\n/** The size of a leading-ones varint, from its first byte. */\nexport function peekLeadingOnes(first: number): number {\n\treturn Math.clz32(~(first << 24)) + 1;\n}\n\n/** Decode a leading-ones varint of `size` bytes at `o`, returning the lower half and setting `parts.hi`. The bytes must be there. */\nexport function readLeadingOnes(buf: Uint8Array, o: number, size: number): number {\n\tconst b = buf[o];\n\tswitch (size) {\n\t\tcase 1:\n\t\t\tparts.hi = 0;\n\t\t\treturn b;\n\t\tcase 2:\n\t\t\tparts.hi = 0;\n\t\t\treturn ((b & 0x3f) << 8) | buf[o + 1];\n\t\tcase 3:\n\t\t\tparts.hi = 0;\n\t\t\treturn ((b & 0x1f) << 16) | (buf[o + 1] << 8) | buf[o + 2];\n\t\tcase 4:\n\t\t\tparts.hi = 0;\n\t\t\treturn ((b & 0x0f) << 24) | (buf[o + 1] << 16) | (buf[o + 2] << 8) | buf[o + 3];\n\t\tcase 5:\n\t\t\tparts.hi = b & 0x07;\n\t\t\treturn u32(buf, o + 1);\n\t\tcase 6:\n\t\t\tparts.hi = ((b & 0x03) << 8) | buf[o + 1];\n\t\t\treturn u32(buf, o + 2);\n\t\tcase 7:\n\t\t\tparts.hi = ((b & 0x01) << 16) | (buf[o + 1] << 8) | buf[o + 2];\n\t\t\treturn u32(buf, o + 3);\n\t\tcase 8:\n\t\t\tparts.hi = (buf[o + 1] << 16) | (buf[o + 2] << 8) | buf[o + 3];\n\t\t\treturn u32(buf, o + 4);\n\t\tdefault:\n\t\t\tparts.hi = u32(buf, o + 1);\n\t\t\treturn u32(buf, o + 5);\n\t}\n}\n\n/**\n * The size of `hi`/`lo` as a leading-ones varint, in its shortest form. The 7-byte form is skipped:\n * draft-17 rejects it, and the 8-byte form is valid everywhere.\n */\nexport function lengthLeadingOnes(hi: number, lo: number): number {\n\tif (hi === 0) {\n\t\tif (lo < 0x80) return 1;\n\t\tif (lo < 0x4000) return 2;\n\t\tif (lo < 0x20_0000) return 3;\n\t\tif (lo < 0x1000_0000) return 4;\n\t}\n\tif (hi < 0x8) return 5;\n\tif (hi < 0x400) return 6;\n\tif (hi < 0x100_0000) return 8;\n\treturn 9;\n}\n\n/** Encode a leading-ones varint of {@link lengthLeadingOnes} `size` at the start of `dst`. */\nexport function writeLeadingOnes(dst: Uint8Array, hi: number, lo: number, size: number) {\n\tswitch (size) {\n\t\tcase 1:\n\t\t\tdst[0] = lo;\n\t\t\treturn;\n\t\tcase 2:\n\t\t\tdst[0] = 0x80 | (lo >>> 8);\n\t\t\tdst[1] = lo;\n\t\t\treturn;\n\t\tcase 3:\n\t\t\tdst[0] = 0xc0 | (lo >>> 16);\n\t\t\tdst[1] = lo >>> 8;\n\t\t\tdst[2] = lo;\n\t\t\treturn;\n\t\tcase 4:\n\t\t\tsetU32(dst, 0, 0xe000_0000 | lo);\n\t\t\treturn;\n\t\tcase 5:\n\t\t\tdst[0] = 0xf0 | hi;\n\t\t\tsetU32(dst, 1, lo);\n\t\t\treturn;\n\t\tcase 6:\n\t\t\tdst[0] = 0xf8 | (hi >>> 8);\n\t\t\tdst[1] = hi;\n\t\t\tsetU32(dst, 2, lo);\n\t\t\treturn;\n\t\tcase 8:\n\t\t\tsetU32(dst, 0, 0xfe00_0000 | hi);\n\t\t\tsetU32(dst, 4, lo);\n\t\t\treturn;\n\t\tdefault:\n\t\t\tdst[0] = 0xff;\n\t\t\tsetU32(dst, 1, hi);\n\t\t\tsetU32(dst, 5, lo);\n\t}\n}\n"]}
package/varint.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * QUIC variable-length integer encoding and decoding.
2
+ * Variable-length integers: QUIC's (RFC 9000 Section 16) and moq-transport's leading-ones form.
3
3
  * https://www.rfc-editor.org/rfc/rfc9000#section-16
4
4
  *
5
5
  * @module
@@ -18,19 +18,23 @@ export declare function sizeLeadingOnes(v: number | bigint): number;
18
18
  export declare function encodeLeadingOnesTo(dst: ArrayBuffer, v: number | bigint): Uint8Array;
19
19
  /** Encode a value in leading-ones varint format into a freshly allocated buffer. */
20
20
  export declare function encodeLeadingOnes(v: number | bigint): Uint8Array;
21
- /** Decode a leading-ones varint, returning the value and the remaining buffer. */
21
+ /**
22
+ * Decode a leading-ones varint, returning the value and the remaining buffer.
23
+ *
24
+ * Accepts the 7-byte form, which only draft-18+ allows, since there is no version here to check.
25
+ */
22
26
  export declare function decodeLeadingOnes(buf: Uint8Array): [bigint, Uint8Array];
23
27
  /**
24
28
  * Returns the number of bytes needed to encode a value as a varint.
25
29
  */
26
30
  export declare function size(v: number): number;
27
31
  /**
28
- * Encodes a number or bigint into a scratch buffer.
29
- * Used by stream.ts to avoid allocations.
32
+ * Encodes a value as a QUIC variable-length integer into the provided buffer,
33
+ * returning the written subarray.
30
34
  */
31
35
  export declare function encodeTo(dst: ArrayBuffer, v: number | bigint): Uint8Array;
32
36
  /**
33
- * Encodes a number or bigint as a QUIC variable-length integer.
37
+ * Encodes a value as a QUIC variable-length integer.
34
38
  * Returns a new Uint8Array containing the encoded bytes.
35
39
  */
36
40
  export declare function encode(v: number | bigint): Uint8Array;
@@ -41,7 +45,7 @@ export declare function encode(v: number | bigint): Uint8Array;
41
45
  export declare function decodeBigInt(buf: Uint8Array): [bigint, Uint8Array];
42
46
  /**
43
47
  * Decodes a QUIC variable-length integer from a buffer.
44
- * Values above 53 bits lose precision; use {@link decodeBigInt} for exact decoding.
48
+ * Throws above `Number.MAX_SAFE_INTEGER` rather than rounding; use {@link decodeBigInt} for those.
45
49
  */
46
50
  export declare function decode(buf: Uint8Array): [number, Uint8Array];
47
51
  //# sourceMappingURL=varint.d.ts.map
package/varint.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"varint.d.ts","sourceRoot":"","sources":["../src/varint.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,2DAA2D;AAC3D,eAAO,MAAM,MAAM,QAAa,CAAC;AACjC,4DAA4D;AAC5D,eAAO,MAAM,OAAO,QAAc,CAAC;AACnC,4DAA4D;AAC5D,eAAO,MAAM,OAAO,QAAc,CAAC;AACnC,+FAA+F;AAC/F,eAAO,MAAM,OAAO,QAA0B,CAAC;AAgB/C,kFAAkF;AAClF,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAY1D;AAED,6GAA6G;AAC7G,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,CAkDpF;AAED,oFAAoF;AACpF,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,CAEhE;AAED,kFAAkF;AAClF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,UAAU,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAmFvE;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAMtC;AA6BD;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,CAmBzE;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,CAErD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CA6BlE;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,GAAG,EAAE,UAAU,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAG5D"}
1
+ {"version":3,"file":"varint.d.ts","sourceRoot":"","sources":["../src/varint.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgBH,2DAA2D;AAC3D,eAAO,MAAM,MAAM,QAAa,CAAC;AACjC,4DAA4D;AAC5D,eAAO,MAAM,OAAO,QAAc,CAAC;AACnC,4DAA4D;AAC5D,eAAO,MAAM,OAAO,QAAc,CAAC;AACnC,+FAA+F;AAC/F,eAAO,MAAM,OAAO,QAA0B,CAAC;AAU/C,kFAAkF;AAClF,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAG1D;AAED,6GAA6G;AAC7G,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,CAKpF;AAED,oFAAoF;AACpF,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,CAEhE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,UAAU,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAIvE;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAMtC;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,CAKzE;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,CAErD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAIlE;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,GAAG,EAAE,UAAU,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAI5D"}
package/varint.js CHANGED
@@ -1,10 +1,12 @@
1
1
  /* @ts-self-types="./varint.d.ts" */
2
2
  /**
3
- * QUIC variable-length integer encoding and decoding.
3
+ * Variable-length integers: QUIC's (RFC 9000 Section 16) and moq-transport's leading-ones form.
4
4
  * https://www.rfc-editor.org/rfc/rfc9000#section-16
5
5
  *
6
6
  * @module
7
7
  */
8
+ import { toBigInt, toNumber } from "./util/u64.js";
9
+ import { lengthLeadingOnes, lengthQuic, parts, peekLeadingOnes, peekQuic, readLeadingOnes, readQuic, split, writeLeadingOnes, writeQuic, } from "./util/varint.js";
8
10
  /** Largest value that fits in a 1-byte varint (6 bits). */
9
11
  export const MAX_U6 = 2 ** 6 - 1;
10
12
  /** Largest value that fits in a 2-byte varint (14 bits). */
@@ -13,181 +15,40 @@ export const MAX_U14 = 2 ** 14 - 1;
13
15
  export const MAX_U30 = 2 ** 30 - 1;
14
16
  /** Largest value representable without precision loss (`Number.MAX_SAFE_INTEGER`, 53 bits). */
15
17
  export const MAX_U53 = Number.MAX_SAFE_INTEGER;
16
- // Leading-ones varint encoding/decoding (draft-17 Section 1.4.1)
17
- // Encoding scheme:
18
- // 0xxxxxxx → 1 byte (7 bits)
19
- // 10xxxxxx + 1B → 2 bytes (14 bits)
20
- // 110xxxxx + 2B → 3 bytes (21 bits)
21
- // 1110xxxx + 3B → 4 bytes (28 bits)
22
- // 11110xxx + 4B → 5 bytes (35 bits)
23
- // 111110xx + 5B → 6 bytes (42 bits)
24
- // 1111110x + 6B → 7 bytes (49 bits), draft-18+ only (invalid in draft-17 per #1595)
25
- // 11111110 + 7B → 8 bytes (56 bits)
26
- // 11111111 + 8B → 9 bytes (64 bits)
27
- const MAX_U64 = (1n << 64n) - 1n;
18
+ // The size of the varint at the start of `buf`, throwing unless all of it is there.
19
+ function sizeOf(buf, size) {
20
+ if (buf.length === 0)
21
+ throw new Error("buffer is empty");
22
+ const n = size(buf[0]);
23
+ if (buf.length < n)
24
+ throw new Error(`buffer too short: need ${n} bytes, have ${buf.length}`);
25
+ return n;
26
+ }
28
27
  /** Number of bytes needed to encode a value in the leading-ones varint format. */
29
28
  export function sizeLeadingOnes(v) {
30
- const b = BigInt(v);
31
- if (b < 0n)
32
- throw new RangeError(`value is negative: ${v}`);
33
- if (b > MAX_U64)
34
- throw new RangeError(`value exceeds 64 bits: ${v}`);
35
- if (b < 1n << 7n)
36
- return 1;
37
- if (b < 1n << 14n)
38
- return 2;
39
- if (b < 1n << 21n)
40
- return 3;
41
- if (b < 1n << 28n)
42
- return 4;
43
- if (b < 1n << 35n)
44
- return 5;
45
- if (b < 1n << 42n)
46
- return 6;
47
- if (b < 1n << 56n)
48
- return 8;
49
- return 9;
29
+ const lo = split(v);
30
+ return lengthLeadingOnes(parts.hi, lo);
50
31
  }
51
32
  /** Encode a value in leading-ones varint format into the provided buffer, returning the written subarray. */
52
33
  export function encodeLeadingOnesTo(dst, v) {
53
- const x = BigInt(v);
54
- if (x < 0n)
55
- throw new RangeError(`underflow, value is negative: ${v}`);
56
- if (x > MAX_U64)
57
- throw new RangeError(`value exceeds 64 bits: ${v}`);
58
- const view = new DataView(dst);
59
- if (x < 1n << 7n) {
60
- view.setUint8(0, Number(x));
61
- return new Uint8Array(dst, 0, 1);
62
- }
63
- if (x < 1n << 14n) {
64
- view.setUint8(0, 0x80 | Number(x >> 8n));
65
- view.setUint8(1, Number(x & 0xffn));
66
- return new Uint8Array(dst, 0, 2);
67
- }
68
- if (x < 1n << 21n) {
69
- view.setUint8(0, 0xc0 | Number(x >> 16n));
70
- view.setUint16(1, Number(x & 0xffffn));
71
- return new Uint8Array(dst, 0, 3);
72
- }
73
- if (x < 1n << 28n) {
74
- view.setUint8(0, 0xe0 | Number(x >> 24n));
75
- view.setUint8(1, Number((x >> 16n) & 0xffn));
76
- view.setUint16(2, Number(x & 0xffffn));
77
- return new Uint8Array(dst, 0, 4);
78
- }
79
- if (x < 1n << 35n) {
80
- view.setUint8(0, 0xf0 | Number(x >> 32n));
81
- view.setUint32(1, Number(x & 0xffffffffn));
82
- return new Uint8Array(dst, 0, 5);
83
- }
84
- if (x < 1n << 42n) {
85
- view.setUint8(0, 0xf8 | Number(x >> 40n));
86
- view.setUint8(1, Number((x >> 32n) & 0xffn));
87
- view.setUint32(2, Number(x & 0xffffffffn));
88
- return new Uint8Array(dst, 0, 6);
89
- }
90
- if (x < 1n << 56n) {
91
- // 11111110 + 7 bytes
92
- view.setUint8(0, 0xfe);
93
- view.setUint8(1, Number((x >> 48n) & 0xffn));
94
- view.setUint16(2, Number((x >> 32n) & 0xffffn));
95
- view.setUint32(4, Number(x & 0xffffffffn));
96
- return new Uint8Array(dst, 0, 8);
97
- }
98
- // 11111111 + 8 bytes
99
- view.setUint8(0, 0xff);
100
- view.setBigUint64(1, x);
101
- return new Uint8Array(dst, 0, 9);
34
+ const lo = split(v);
35
+ const buf = new Uint8Array(dst, 0, lengthLeadingOnes(parts.hi, lo));
36
+ writeLeadingOnes(buf, parts.hi, lo, buf.length);
37
+ return buf;
102
38
  }
103
39
  /** Encode a value in leading-ones varint format into a freshly allocated buffer. */
104
40
  export function encodeLeadingOnes(v) {
105
41
  return encodeLeadingOnesTo(new ArrayBuffer(9), v);
106
42
  }
107
- /** Decode a leading-ones varint, returning the value and the remaining buffer. */
43
+ /**
44
+ * Decode a leading-ones varint, returning the value and the remaining buffer.
45
+ *
46
+ * Accepts the 7-byte form, which only draft-18+ allows, since there is no version here to check.
47
+ */
108
48
  export function decodeLeadingOnes(buf) {
109
- if (buf.length === 0)
110
- throw new Error("buffer is empty");
111
- const b = buf[0];
112
- // Count leading 1-bits
113
- let ones = 0;
114
- for (let bit = 7; bit >= 0; bit--) {
115
- if (b & (1 << bit))
116
- ones++;
117
- else
118
- break;
119
- }
120
- // 1111110x is a 7-byte form: invalid on draft-17, allowed on draft-18+ per #1595.
121
- // This standalone decoder is permissive (Postel-style) since we lack version context here.
122
- let totalSize;
123
- if (ones <= 5)
124
- totalSize = ones + 1;
125
- else if (ones === 6)
126
- totalSize = 7;
127
- else if (ones === 7)
128
- totalSize = 8;
129
- else
130
- totalSize = 9; // ones === 8
131
- if (buf.length < totalSize) {
132
- throw new Error(`buffer too short: need ${totalSize} bytes, have ${buf.length}`);
133
- }
134
- const view = new DataView(buf.buffer, buf.byteOffset, totalSize);
135
- const remain = buf.subarray(totalSize);
136
- let value;
137
- switch (ones) {
138
- case 0:
139
- value = BigInt(b);
140
- break;
141
- case 1:
142
- value = (BigInt(b & 0x3f) << 8n) | BigInt(buf[1]);
143
- break;
144
- case 2:
145
- value = (BigInt(b & 0x1f) << 16n) | BigInt(view.getUint16(1));
146
- break;
147
- case 3:
148
- value = (BigInt(b & 0x0f) << 24n) | (BigInt(buf[1]) << 16n) | (BigInt(buf[2]) << 8n) | BigInt(buf[3]);
149
- break;
150
- case 4:
151
- value = (BigInt(b & 0x07) << 32n) | BigInt(view.getUint32(1));
152
- break;
153
- case 5:
154
- value =
155
- (BigInt(b & 0x03) << 40n) |
156
- (BigInt(buf[1]) << 32n) |
157
- (BigInt(buf[2]) << 24n) |
158
- (BigInt(buf[3]) << 16n) |
159
- (BigInt(buf[4]) << 8n) |
160
- BigInt(buf[5]);
161
- break;
162
- case 6: {
163
- // 1111110x + 6 bytes = 49 bits (draft-18+)
164
- value =
165
- (BigInt(b & 0x01) << 48n) |
166
- (BigInt(buf[1]) << 40n) |
167
- (BigInt(buf[2]) << 32n) |
168
- (BigInt(buf[3]) << 24n) |
169
- (BigInt(buf[4]) << 16n) |
170
- (BigInt(buf[5]) << 8n) |
171
- BigInt(buf[6]);
172
- break;
173
- }
174
- case 7: {
175
- // 11111110 + 7 bytes = 56 usable bits
176
- const hi = new Uint8Array(8);
177
- hi[0] = 0;
178
- hi.set(buf.subarray(1, 8), 1);
179
- value = new DataView(hi.buffer).getBigUint64(0);
180
- break;
181
- }
182
- case 8: {
183
- // 11111111 + 8 bytes = 64 bits
184
- value = new DataView(buf.buffer, buf.byteOffset + 1, 8).getBigUint64(0);
185
- break;
186
- }
187
- default:
188
- throw new Error("impossible");
189
- }
190
- return [value, remain];
49
+ const size = sizeOf(buf, peekLeadingOnes);
50
+ const lo = readLeadingOnes(buf, 0, size);
51
+ return [toBigInt(parts.hi, lo), buf.subarray(size)];
191
52
  }
192
53
  /**
193
54
  * Returns the number of bytes needed to encode a value as a varint.
@@ -203,54 +64,18 @@ export function size(v) {
203
64
  return 8;
204
65
  throw new Error(`overflow, value larger than 53-bits: ${v}`);
205
66
  }
206
- // Helper functions for writing to an ArrayBuffer
207
- function setUint8(dst, v) {
208
- const buffer = new Uint8Array(dst, 0, 1);
209
- buffer[0] = v;
210
- return buffer;
211
- }
212
- function setUint16(dst, v) {
213
- const view = new DataView(dst, 0, 2);
214
- view.setUint16(0, v);
215
- return new Uint8Array(view.buffer, view.byteOffset, view.byteLength);
216
- }
217
- function setUint32(dst, v) {
218
- const view = new DataView(dst, 0, 4);
219
- view.setUint32(0, v);
220
- return new Uint8Array(view.buffer, view.byteOffset, view.byteLength);
221
- }
222
- function setUint64(dst, v) {
223
- const view = new DataView(dst, 0, 8);
224
- view.setBigUint64(0, v);
225
- return new Uint8Array(view.buffer, view.byteOffset, view.byteLength);
226
- }
227
- const MAX_U62 = 2n ** 62n - 1n;
228
67
  /**
229
- * Encodes a number or bigint into a scratch buffer.
230
- * Used by stream.ts to avoid allocations.
68
+ * Encodes a value as a QUIC variable-length integer into the provided buffer,
69
+ * returning the written subarray.
231
70
  */
232
71
  export function encodeTo(dst, v) {
233
- const b = BigInt(v);
234
- if (b < 0n) {
235
- throw new Error(`underflow, value is negative: ${v}`);
236
- }
237
- if (b > MAX_U62) {
238
- throw new Error(`overflow, value larger than 62-bits: ${v}`);
239
- }
240
- const n = Number(b);
241
- if (n <= MAX_U6) {
242
- return setUint8(dst, n);
243
- }
244
- if (n <= MAX_U14) {
245
- return setUint16(dst, n | 0x4000);
246
- }
247
- if (n <= MAX_U30) {
248
- return setUint32(dst, n | 0x80000000);
249
- }
250
- return setUint64(dst, b | 0xc000000000000000n);
72
+ const lo = split(v);
73
+ const buf = new Uint8Array(dst, 0, lengthQuic(parts.hi, lo));
74
+ writeQuic(buf, parts.hi, lo, buf.length);
75
+ return buf;
251
76
  }
252
77
  /**
253
- * Encodes a number or bigint as a QUIC variable-length integer.
78
+ * Encodes a value as a QUIC variable-length integer.
254
79
  * Returns a new Uint8Array containing the encoded bytes.
255
80
  */
256
81
  export function encode(v) {
@@ -261,39 +86,17 @@ export function encode(v) {
261
86
  * Returns a tuple of [value, remaining buffer].
262
87
  */
263
88
  export function decodeBigInt(buf) {
264
- if (buf.length === 0) {
265
- throw new Error("buffer is empty");
266
- }
267
- const size = 1 << ((buf[0] & 0xc0) >> 6);
268
- if (buf.length < size) {
269
- throw new Error(`buffer too short: need ${size} bytes, have ${buf.length}`);
270
- }
271
- const view = new DataView(buf.buffer, buf.byteOffset, size);
272
- const remain = buf.subarray(size);
273
- let value;
274
- if (size === 1) {
275
- value = BigInt(buf[0] & 0x3f);
276
- }
277
- else if (size === 2) {
278
- value = BigInt(view.getUint16(0) & 0x3fff);
279
- }
280
- else if (size === 4) {
281
- value = BigInt(view.getUint32(0) & 0x3fffffff);
282
- }
283
- else if (size === 8) {
284
- value = view.getBigUint64(0) & 0x3fffffffffffffffn;
285
- }
286
- else {
287
- throw new Error("impossible");
288
- }
289
- return [value, remain];
89
+ const size = sizeOf(buf, peekQuic);
90
+ const lo = readQuic(buf, 0, size);
91
+ return [toBigInt(parts.hi, lo), buf.subarray(size)];
290
92
  }
291
93
  /**
292
94
  * Decodes a QUIC variable-length integer from a buffer.
293
- * Values above 53 bits lose precision; use {@link decodeBigInt} for exact decoding.
95
+ * Throws above `Number.MAX_SAFE_INTEGER` rather than rounding; use {@link decodeBigInt} for those.
294
96
  */
295
97
  export function decode(buf) {
296
- const [value, remain] = decodeBigInt(buf);
297
- return [Number(value), remain];
98
+ const size = sizeOf(buf, peekQuic);
99
+ const lo = readQuic(buf, 0, size);
100
+ return [toNumber(parts.hi, lo), buf.subarray(size)];
298
101
  }
299
102
  //# sourceMappingURL=varint.js.map