@norskvideo/moq-net 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (274) hide show
  1. package/README.md +70 -0
  2. package/announced.d.ts +45 -0
  3. package/announced.d.ts.map +1 -0
  4. package/announced.js +70 -0
  5. package/announced.js.map +1 -0
  6. package/bandwidth.d.ts +11 -0
  7. package/bandwidth.d.ts.map +1 -0
  8. package/bandwidth.js +7 -0
  9. package/bandwidth.js.map +1 -0
  10. package/broadcast.d.ts +39 -0
  11. package/broadcast.d.ts.map +1 -0
  12. package/broadcast.js +76 -0
  13. package/broadcast.js.map +1 -0
  14. package/connection/accept.d.ts +15 -0
  15. package/connection/accept.d.ts.map +1 -0
  16. package/connection/accept.js +137 -0
  17. package/connection/accept.js.map +1 -0
  18. package/connection/cert.test.d.ts +2 -0
  19. package/connection/cert.test.d.ts.map +1 -0
  20. package/connection/cert.test.js +26 -0
  21. package/connection/cert.test.js.map +1 -0
  22. package/connection/connect.d.ts +37 -0
  23. package/connection/connect.d.ts.map +1 -0
  24. package/connection/connect.js +348 -0
  25. package/connection/connect.js.map +1 -0
  26. package/connection/established.d.ts +30 -0
  27. package/connection/established.d.ts.map +1 -0
  28. package/connection/established.js +3 -0
  29. package/connection/established.js.map +1 -0
  30. package/connection/handshake.d.ts +10 -0
  31. package/connection/handshake.d.ts.map +1 -0
  32. package/connection/handshake.js +48 -0
  33. package/connection/handshake.js.map +1 -0
  34. package/connection/index.d.ts +5 -0
  35. package/connection/index.d.ts.map +1 -0
  36. package/connection/index.js +6 -0
  37. package/connection/index.js.map +1 -0
  38. package/connection/reload.d.ts +47 -0
  39. package/connection/reload.d.ts.map +1 -0
  40. package/connection/reload.js +137 -0
  41. package/connection/reload.js.map +1 -0
  42. package/group.d.ts +66 -0
  43. package/group.d.ts.map +1 -0
  44. package/group.js +135 -0
  45. package/group.js.map +1 -0
  46. package/group.test.d.ts +2 -0
  47. package/group.test.d.ts.map +1 -0
  48. package/group.test.js +66 -0
  49. package/group.test.js.map +1 -0
  50. package/ietf/adapter.d.ts +65 -0
  51. package/ietf/adapter.d.ts.map +1 -0
  52. package/ietf/adapter.js +626 -0
  53. package/ietf/adapter.js.map +1 -0
  54. package/ietf/connection.d.ts +65 -0
  55. package/ietf/connection.d.ts.map +1 -0
  56. package/ietf/connection.js +248 -0
  57. package/ietf/connection.js.map +1 -0
  58. package/ietf/control.d.ts +135 -0
  59. package/ietf/control.d.ts.map +1 -0
  60. package/ietf/control.js +242 -0
  61. package/ietf/control.js.map +1 -0
  62. package/ietf/fetch.d.ts +64 -0
  63. package/ietf/fetch.d.ts.map +1 -0
  64. package/ietf/fetch.js +100 -0
  65. package/ietf/fetch.js.map +1 -0
  66. package/ietf/goaway.d.ts +15 -0
  67. package/ietf/goaway.d.ts.map +1 -0
  68. package/ietf/goaway.js +34 -0
  69. package/ietf/goaway.js.map +1 -0
  70. package/ietf/ietf.test.d.ts +2 -0
  71. package/ietf/ietf.test.d.ts.map +1 -0
  72. package/ietf/ietf.test.js +873 -0
  73. package/ietf/ietf.test.js.map +1 -0
  74. package/ietf/index.d.ts +18 -0
  75. package/ietf/index.d.ts.map +1 -0
  76. package/ietf/index.js +19 -0
  77. package/ietf/index.js.map +1 -0
  78. package/ietf/message.d.ts +4 -0
  79. package/ietf/message.d.ts.map +1 -0
  80. package/ietf/message.js +54 -0
  81. package/ietf/message.js.map +1 -0
  82. package/ietf/namespace.d.ts +5 -0
  83. package/ietf/namespace.d.ts.map +1 -0
  84. package/ietf/namespace.js +27 -0
  85. package/ietf/namespace.js.map +1 -0
  86. package/ietf/object.d.ts +40 -0
  87. package/ietf/object.d.ts.map +1 -0
  88. package/ietf/object.js +160 -0
  89. package/ietf/object.js.map +1 -0
  90. package/ietf/parameters.d.ts +56 -0
  91. package/ietf/parameters.d.ts.map +1 -0
  92. package/ietf/parameters.js +337 -0
  93. package/ietf/parameters.js.map +1 -0
  94. package/ietf/properties.d.ts +4 -0
  95. package/ietf/properties.d.ts.map +1 -0
  96. package/ietf/properties.js +33 -0
  97. package/ietf/properties.js.map +1 -0
  98. package/ietf/publish.d.ts +68 -0
  99. package/ietf/publish.d.ts.map +1 -0
  100. package/ietf/publish.js +192 -0
  101. package/ietf/publish.js.map +1 -0
  102. package/ietf/publish_namespace.d.ts +68 -0
  103. package/ietf/publish_namespace.d.ts.map +1 -0
  104. package/ietf/publish_namespace.js +176 -0
  105. package/ietf/publish_namespace.js.map +1 -0
  106. package/ietf/publisher.d.ts +50 -0
  107. package/ietf/publisher.d.ts.map +1 -0
  108. package/ietf/publisher.js +330 -0
  109. package/ietf/publisher.js.map +1 -0
  110. package/ietf/request.d.ts +52 -0
  111. package/ietf/request.d.ts.map +1 -0
  112. package/ietf/request.js +119 -0
  113. package/ietf/request.js.map +1 -0
  114. package/ietf/setup.d.ts +38 -0
  115. package/ietf/setup.d.ts.map +1 -0
  116. package/ietf/setup.js +129 -0
  117. package/ietf/setup.js.map +1 -0
  118. package/ietf/subscribe.d.ts +66 -0
  119. package/ietf/subscribe.d.ts.map +1 -0
  120. package/ietf/subscribe.js +276 -0
  121. package/ietf/subscribe.js.map +1 -0
  122. package/ietf/subscribe_namespace.d.ts +101 -0
  123. package/ietf/subscribe_namespace.d.ts.map +1 -0
  124. package/ietf/subscribe_namespace.js +256 -0
  125. package/ietf/subscribe_namespace.js.map +1 -0
  126. package/ietf/subscriber.d.ts +53 -0
  127. package/ietf/subscriber.d.ts.map +1 -0
  128. package/ietf/subscriber.js +404 -0
  129. package/ietf/subscriber.js.map +1 -0
  130. package/ietf/track.d.ts +40 -0
  131. package/ietf/track.d.ts.map +1 -0
  132. package/ietf/track.js +108 -0
  133. package/ietf/track.js.map +1 -0
  134. package/ietf/version.d.ts +56 -0
  135. package/ietf/version.d.ts.map +1 -0
  136. package/ietf/version.js +63 -0
  137. package/ietf/version.js.map +1 -0
  138. package/index.d.ts +22 -0
  139. package/index.d.ts.map +1 -0
  140. package/index.js +23 -0
  141. package/index.js.map +1 -0
  142. package/integration.test.d.ts +2 -0
  143. package/integration.test.d.ts.map +1 -0
  144. package/integration.test.js +90 -0
  145. package/integration.test.js.map +1 -0
  146. package/lite/announce.d.ts +35 -0
  147. package/lite/announce.d.ts.map +1 -0
  148. package/lite/announce.js +166 -0
  149. package/lite/announce.js.map +1 -0
  150. package/lite/connection.d.ts +47 -0
  151. package/lite/connection.d.ts.map +1 -0
  152. package/lite/connection.js +247 -0
  153. package/lite/connection.js.map +1 -0
  154. package/lite/fetch.d.ts +14 -0
  155. package/lite/fetch.d.ts.map +1 -0
  156. package/lite/fetch.js +47 -0
  157. package/lite/fetch.js.map +1 -0
  158. package/lite/goaway.d.ts +10 -0
  159. package/lite/goaway.d.ts.map +1 -0
  160. package/lite/goaway.js +37 -0
  161. package/lite/goaway.js.map +1 -0
  162. package/lite/group.d.ts +18 -0
  163. package/lite/group.d.ts.map +1 -0
  164. package/lite/group.js +46 -0
  165. package/lite/group.js.map +1 -0
  166. package/lite/index.d.ts +11 -0
  167. package/lite/index.d.ts.map +1 -0
  168. package/lite/index.js +12 -0
  169. package/lite/index.js.map +1 -0
  170. package/lite/message.d.ts +5 -0
  171. package/lite/message.d.ts.map +1 -0
  172. package/lite/message.js +51 -0
  173. package/lite/message.js.map +1 -0
  174. package/lite/origin.d.ts +25 -0
  175. package/lite/origin.d.ts.map +1 -0
  176. package/lite/origin.js +35 -0
  177. package/lite/origin.js.map +1 -0
  178. package/lite/probe.d.ts +12 -0
  179. package/lite/probe.d.ts.map +1 -0
  180. package/lite/probe.js +60 -0
  181. package/lite/probe.js.map +1 -0
  182. package/lite/publisher.d.ts +63 -0
  183. package/lite/publisher.d.ts.map +1 -0
  184. package/lite/publisher.js +350 -0
  185. package/lite/publisher.js.map +1 -0
  186. package/lite/session.d.ts +36 -0
  187. package/lite/session.d.ts.map +1 -0
  188. package/lite/session.js +130 -0
  189. package/lite/session.js.map +1 -0
  190. package/lite/setup.d.ts +18 -0
  191. package/lite/setup.d.ts.map +1 -0
  192. package/lite/setup.js +55 -0
  193. package/lite/setup.js.map +1 -0
  194. package/lite/stream.d.ts +23 -0
  195. package/lite/stream.d.ts.map +1 -0
  196. package/lite/stream.js +20 -0
  197. package/lite/stream.js.map +1 -0
  198. package/lite/subscribe.d.ts +111 -0
  199. package/lite/subscribe.d.ts.map +1 -0
  200. package/lite/subscribe.js +341 -0
  201. package/lite/subscribe.js.map +1 -0
  202. package/lite/subscriber.d.ts +80 -0
  203. package/lite/subscriber.d.ts.map +1 -0
  204. package/lite/subscriber.js +316 -0
  205. package/lite/subscriber.js.map +1 -0
  206. package/lite/track.d.ts +38 -0
  207. package/lite/track.d.ts.map +1 -0
  208. package/lite/track.js +81 -0
  209. package/lite/track.js.map +1 -0
  210. package/lite/track.test.d.ts +2 -0
  211. package/lite/track.test.d.ts.map +1 -0
  212. package/lite/track.test.js +53 -0
  213. package/lite/track.test.js.map +1 -0
  214. package/lite/version.d.ts +16 -0
  215. package/lite/version.d.ts.map +1 -0
  216. package/lite/version.js +41 -0
  217. package/lite/version.js.map +1 -0
  218. package/mock.d.ts +16 -0
  219. package/mock.d.ts.map +1 -0
  220. package/mock.js +154 -0
  221. package/mock.js.map +1 -0
  222. package/package.json +27 -0
  223. package/path.d.ts +111 -0
  224. package/path.d.ts.map +1 -0
  225. package/path.js +133 -0
  226. package/path.js.map +1 -0
  227. package/path.test.d.ts +2 -0
  228. package/path.test.d.ts.map +1 -0
  229. package/path.test.js +169 -0
  230. package/path.test.js.map +1 -0
  231. package/stream.d.ts +57 -0
  232. package/stream.d.ts.map +1 -0
  233. package/stream.js +326 -0
  234. package/stream.js.map +1 -0
  235. package/stream.test.d.ts +2 -0
  236. package/stream.test.d.ts.map +1 -0
  237. package/stream.test.js +210 -0
  238. package/stream.test.js.map +1 -0
  239. package/time.d.ts +109 -0
  240. package/time.d.ts.map +1 -0
  241. package/time.js +94 -0
  242. package/time.js.map +1 -0
  243. package/track.d.ts +85 -0
  244. package/track.d.ts.map +1 -0
  245. package/track.js +227 -0
  246. package/track.js.map +1 -0
  247. package/track.test.d.ts +2 -0
  248. package/track.test.d.ts.map +1 -0
  249. package/track.test.js +56 -0
  250. package/track.test.js.map +1 -0
  251. package/util/error.d.ts +3 -0
  252. package/util/error.d.ts.map +1 -0
  253. package/util/error.js +9 -0
  254. package/util/error.js.map +1 -0
  255. package/util/hex.d.ts +3 -0
  256. package/util/hex.d.ts.map +1 -0
  257. package/util/hex.js +16 -0
  258. package/util/hex.js.map +1 -0
  259. package/util/index.d.ts +2 -0
  260. package/util/index.d.ts.map +1 -0
  261. package/util/index.js +3 -0
  262. package/util/index.js.map +1 -0
  263. package/varint.d.ts +36 -0
  264. package/varint.d.ts.map +1 -0
  265. package/varint.js +288 -0
  266. package/varint.js.map +1 -0
  267. package/varint.test.d.ts +2 -0
  268. package/varint.test.d.ts.map +1 -0
  269. package/varint.test.js +106 -0
  270. package/varint.test.js.map +1 -0
  271. package/zod.d.ts +13 -0
  272. package/zod.d.ts.map +1 -0
  273. package/zod.js +19 -0
  274. package/zod.js.map +1 -0
package/varint.js ADDED
@@ -0,0 +1,288 @@
1
+ /* @ts-self-types="./varint.d.ts" */
2
+ // QUIC variable-length integer encoding/decoding
3
+ // https://www.rfc-editor.org/rfc/rfc9000#section-16
4
+ /** Largest value that fits in a 1-byte varint (6 bits). */
5
+ export const MAX_U6 = 2 ** 6 - 1;
6
+ /** Largest value that fits in a 2-byte varint (14 bits). */
7
+ export const MAX_U14 = 2 ** 14 - 1;
8
+ /** Largest value that fits in a 4-byte varint (30 bits). */
9
+ export const MAX_U30 = 2 ** 30 - 1;
10
+ /** Largest value representable without precision loss (`Number.MAX_SAFE_INTEGER`, 53 bits). */
11
+ export const MAX_U53 = Number.MAX_SAFE_INTEGER;
12
+ // Leading-ones varint encoding/decoding (draft-17 Section 1.4.1)
13
+ // Encoding scheme:
14
+ // 0xxxxxxx → 1 byte (7 bits)
15
+ // 10xxxxxx + 1B → 2 bytes (14 bits)
16
+ // 110xxxxx + 2B → 3 bytes (21 bits)
17
+ // 1110xxxx + 3B → 4 bytes (28 bits)
18
+ // 11110xxx + 4B → 5 bytes (35 bits)
19
+ // 111110xx + 5B → 6 bytes (42 bits)
20
+ // 1111110x + 6B → 7 bytes (49 bits), draft-18+ only (invalid in draft-17 per #1595)
21
+ // 11111110 + 7B → 8 bytes (56 bits)
22
+ // 11111111 + 8B → 9 bytes (64 bits)
23
+ const MAX_U64 = (1n << 64n) - 1n;
24
+ /** Number of bytes needed to encode a value in the leading-ones varint format. */
25
+ export function sizeLeadingOnes(v) {
26
+ const b = BigInt(v);
27
+ if (b < 0n)
28
+ throw new RangeError(`value is negative: ${v}`);
29
+ if (b > MAX_U64)
30
+ throw new RangeError(`value exceeds 64 bits: ${v}`);
31
+ if (b < 1n << 7n)
32
+ return 1;
33
+ if (b < 1n << 14n)
34
+ return 2;
35
+ if (b < 1n << 21n)
36
+ return 3;
37
+ if (b < 1n << 28n)
38
+ return 4;
39
+ if (b < 1n << 35n)
40
+ return 5;
41
+ if (b < 1n << 42n)
42
+ return 6;
43
+ if (b < 1n << 56n)
44
+ return 8;
45
+ return 9;
46
+ }
47
+ /** Encode a value in leading-ones varint format into the provided buffer, returning the written subarray. */
48
+ export function encodeLeadingOnesTo(dst, v) {
49
+ const x = BigInt(v);
50
+ if (x < 0n)
51
+ throw new RangeError(`underflow, value is negative: ${v}`);
52
+ if (x > MAX_U64)
53
+ throw new RangeError(`value exceeds 64 bits: ${v}`);
54
+ const view = new DataView(dst);
55
+ if (x < 1n << 7n) {
56
+ view.setUint8(0, Number(x));
57
+ return new Uint8Array(dst, 0, 1);
58
+ }
59
+ if (x < 1n << 14n) {
60
+ view.setUint8(0, 0x80 | Number(x >> 8n));
61
+ view.setUint8(1, Number(x & 0xffn));
62
+ return new Uint8Array(dst, 0, 2);
63
+ }
64
+ if (x < 1n << 21n) {
65
+ view.setUint8(0, 0xc0 | Number(x >> 16n));
66
+ view.setUint16(1, Number(x & 0xffffn));
67
+ return new Uint8Array(dst, 0, 3);
68
+ }
69
+ if (x < 1n << 28n) {
70
+ view.setUint8(0, 0xe0 | Number(x >> 24n));
71
+ view.setUint8(1, Number((x >> 16n) & 0xffn));
72
+ view.setUint16(2, Number(x & 0xffffn));
73
+ return new Uint8Array(dst, 0, 4);
74
+ }
75
+ if (x < 1n << 35n) {
76
+ view.setUint8(0, 0xf0 | Number(x >> 32n));
77
+ view.setUint32(1, Number(x & 0xffffffffn));
78
+ return new Uint8Array(dst, 0, 5);
79
+ }
80
+ if (x < 1n << 42n) {
81
+ view.setUint8(0, 0xf8 | Number(x >> 40n));
82
+ view.setUint8(1, Number((x >> 32n) & 0xffn));
83
+ view.setUint32(2, Number(x & 0xffffffffn));
84
+ return new Uint8Array(dst, 0, 6);
85
+ }
86
+ if (x < 1n << 56n) {
87
+ // 11111110 + 7 bytes
88
+ view.setUint8(0, 0xfe);
89
+ view.setUint8(1, Number((x >> 48n) & 0xffn));
90
+ view.setUint16(2, Number((x >> 32n) & 0xffffn));
91
+ view.setUint32(4, Number(x & 0xffffffffn));
92
+ return new Uint8Array(dst, 0, 8);
93
+ }
94
+ // 11111111 + 8 bytes
95
+ view.setUint8(0, 0xff);
96
+ view.setBigUint64(1, x);
97
+ return new Uint8Array(dst, 0, 9);
98
+ }
99
+ /** Encode a value in leading-ones varint format into a freshly allocated buffer. */
100
+ export function encodeLeadingOnes(v) {
101
+ return encodeLeadingOnesTo(new ArrayBuffer(9), v);
102
+ }
103
+ /** Decode a leading-ones varint, returning the value and the remaining buffer. */
104
+ export function decodeLeadingOnes(buf) {
105
+ if (buf.length === 0)
106
+ throw new Error("buffer is empty");
107
+ const b = buf[0];
108
+ // Count leading 1-bits
109
+ let ones = 0;
110
+ for (let bit = 7; bit >= 0; bit--) {
111
+ if (b & (1 << bit))
112
+ ones++;
113
+ else
114
+ break;
115
+ }
116
+ // 1111110x is a 7-byte form: invalid on draft-17, allowed on draft-18+ per #1595.
117
+ // This standalone decoder is permissive (Postel-style) since we lack version context here.
118
+ let totalSize;
119
+ if (ones <= 5)
120
+ totalSize = ones + 1;
121
+ else if (ones === 6)
122
+ totalSize = 7;
123
+ else if (ones === 7)
124
+ totalSize = 8;
125
+ else
126
+ totalSize = 9; // ones === 8
127
+ if (buf.length < totalSize) {
128
+ throw new Error(`buffer too short: need ${totalSize} bytes, have ${buf.length}`);
129
+ }
130
+ const view = new DataView(buf.buffer, buf.byteOffset, totalSize);
131
+ const remain = buf.subarray(totalSize);
132
+ let value;
133
+ switch (ones) {
134
+ case 0:
135
+ value = BigInt(b);
136
+ break;
137
+ case 1:
138
+ value = (BigInt(b & 0x3f) << 8n) | BigInt(buf[1]);
139
+ break;
140
+ case 2:
141
+ value = (BigInt(b & 0x1f) << 16n) | BigInt(view.getUint16(1));
142
+ break;
143
+ case 3:
144
+ value = (BigInt(b & 0x0f) << 24n) | (BigInt(buf[1]) << 16n) | (BigInt(buf[2]) << 8n) | BigInt(buf[3]);
145
+ break;
146
+ case 4:
147
+ value = (BigInt(b & 0x07) << 32n) | BigInt(view.getUint32(1));
148
+ break;
149
+ case 5:
150
+ value =
151
+ (BigInt(b & 0x03) << 40n) |
152
+ (BigInt(buf[1]) << 32n) |
153
+ (BigInt(buf[2]) << 24n) |
154
+ (BigInt(buf[3]) << 16n) |
155
+ (BigInt(buf[4]) << 8n) |
156
+ BigInt(buf[5]);
157
+ break;
158
+ case 6: {
159
+ // 1111110x + 6 bytes = 49 bits (draft-18+)
160
+ value =
161
+ (BigInt(b & 0x01) << 48n) |
162
+ (BigInt(buf[1]) << 40n) |
163
+ (BigInt(buf[2]) << 32n) |
164
+ (BigInt(buf[3]) << 24n) |
165
+ (BigInt(buf[4]) << 16n) |
166
+ (BigInt(buf[5]) << 8n) |
167
+ BigInt(buf[6]);
168
+ break;
169
+ }
170
+ case 7: {
171
+ // 11111110 + 7 bytes = 56 usable bits
172
+ const hi = new Uint8Array(8);
173
+ hi[0] = 0;
174
+ hi.set(buf.subarray(1, 8), 1);
175
+ value = new DataView(hi.buffer).getBigUint64(0);
176
+ break;
177
+ }
178
+ case 8: {
179
+ // 11111111 + 8 bytes = 64 bits
180
+ value = new DataView(buf.buffer, buf.byteOffset + 1, 8).getBigUint64(0);
181
+ break;
182
+ }
183
+ default:
184
+ throw new Error("impossible");
185
+ }
186
+ return [value, remain];
187
+ }
188
+ /**
189
+ * Returns the number of bytes needed to encode a value as a varint.
190
+ */
191
+ export function size(v) {
192
+ if (v <= MAX_U6)
193
+ return 1;
194
+ if (v <= MAX_U14)
195
+ return 2;
196
+ if (v <= MAX_U30)
197
+ return 4;
198
+ if (v <= MAX_U53)
199
+ return 8;
200
+ throw new Error(`overflow, value larger than 53-bits: ${v}`);
201
+ }
202
+ // Helper functions for writing to an ArrayBuffer
203
+ function setUint8(dst, v) {
204
+ const buffer = new Uint8Array(dst, 0, 1);
205
+ buffer[0] = v;
206
+ return buffer;
207
+ }
208
+ function setUint16(dst, v) {
209
+ const view = new DataView(dst, 0, 2);
210
+ view.setUint16(0, v);
211
+ return new Uint8Array(view.buffer, view.byteOffset, view.byteLength);
212
+ }
213
+ function setUint32(dst, v) {
214
+ const view = new DataView(dst, 0, 4);
215
+ view.setUint32(0, v);
216
+ return new Uint8Array(view.buffer, view.byteOffset, view.byteLength);
217
+ }
218
+ function setUint64(dst, v) {
219
+ const view = new DataView(dst, 0, 8);
220
+ view.setBigUint64(0, v);
221
+ return new Uint8Array(view.buffer, view.byteOffset, view.byteLength);
222
+ }
223
+ const MAX_U62 = 2n ** 62n - 1n;
224
+ /**
225
+ * Encodes a number or bigint into a scratch buffer.
226
+ * Used by stream.ts to avoid allocations.
227
+ */
228
+ export function encodeTo(dst, v) {
229
+ const b = BigInt(v);
230
+ if (b < 0n) {
231
+ throw new Error(`underflow, value is negative: ${v}`);
232
+ }
233
+ if (b > MAX_U62) {
234
+ throw new Error(`overflow, value larger than 62-bits: ${v}`);
235
+ }
236
+ const n = Number(b);
237
+ if (n <= MAX_U6) {
238
+ return setUint8(dst, n);
239
+ }
240
+ if (n <= MAX_U14) {
241
+ return setUint16(dst, n | 0x4000);
242
+ }
243
+ if (n <= MAX_U30) {
244
+ return setUint32(dst, n | 0x80000000);
245
+ }
246
+ return setUint64(dst, b | 0xc000000000000000n);
247
+ }
248
+ /**
249
+ * Encodes a number as a QUIC variable-length integer.
250
+ * Returns a new Uint8Array containing the encoded bytes.
251
+ */
252
+ export function encode(v) {
253
+ return encodeTo(new ArrayBuffer(8), v);
254
+ }
255
+ /**
256
+ * Decodes a QUIC variable-length integer from a buffer.
257
+ * Returns a tuple of [value, remaining buffer].
258
+ */
259
+ export function decode(buf) {
260
+ if (buf.length === 0) {
261
+ throw new Error("buffer is empty");
262
+ }
263
+ const size = 1 << ((buf[0] & 0xc0) >> 6);
264
+ if (buf.length < size) {
265
+ throw new Error(`buffer too short: need ${size} bytes, have ${buf.length}`);
266
+ }
267
+ const view = new DataView(buf.buffer, buf.byteOffset, size);
268
+ const remain = buf.subarray(size);
269
+ let v;
270
+ if (size === 1) {
271
+ v = buf[0] & 0x3f;
272
+ }
273
+ else if (size === 2) {
274
+ v = view.getUint16(0) & 0x3fff;
275
+ }
276
+ else if (size === 4) {
277
+ v = view.getUint32(0) & 0x3fffffff;
278
+ }
279
+ else if (size === 8) {
280
+ // NOTE: Precision loss above 2^53, but we're using number type
281
+ v = Number(view.getBigUint64(0) & 0x3fffffffffffffffn);
282
+ }
283
+ else {
284
+ throw new Error("impossible");
285
+ }
286
+ return [v, remain];
287
+ }
288
+ //# sourceMappingURL=varint.js.map
package/varint.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"varint.js","sourceRoot":"","sources":["../src/varint.ts"],"names":[],"mappings":"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","sourcesContent":["// QUIC variable-length integer encoding/decoding\n// https://www.rfc-editor.org/rfc/rfc9000#section-16\n\n/** Largest value that fits in a 1-byte varint (6 bits). */\nexport const MAX_U6 = 2 ** 6 - 1;\n/** Largest value that fits in a 2-byte varint (14 bits). */\nexport const MAX_U14 = 2 ** 14 - 1;\n/** Largest value that fits in a 4-byte varint (30 bits). */\nexport const MAX_U30 = 2 ** 30 - 1;\n/** Largest value representable without precision loss (`Number.MAX_SAFE_INTEGER`, 53 bits). */\nexport const MAX_U53 = Number.MAX_SAFE_INTEGER;\n\n// Leading-ones varint encoding/decoding (draft-17 Section 1.4.1)\n// Encoding scheme:\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\nconst MAX_U64 = (1n << 64n) - 1n;\n\n/** Number of bytes needed to encode a value in the leading-ones varint format. */\nexport function sizeLeadingOnes(v: number | bigint): number {\n\tconst b = BigInt(v);\n\tif (b < 0n) throw new RangeError(`value is negative: ${v}`);\n\tif (b > MAX_U64) throw new RangeError(`value exceeds 64 bits: ${v}`);\n\tif (b < 1n << 7n) return 1;\n\tif (b < 1n << 14n) return 2;\n\tif (b < 1n << 21n) return 3;\n\tif (b < 1n << 28n) return 4;\n\tif (b < 1n << 35n) return 5;\n\tif (b < 1n << 42n) return 6;\n\tif (b < 1n << 56n) return 8;\n\treturn 9;\n}\n\n/** Encode a value in leading-ones varint format into the provided buffer, returning the written subarray. */\nexport function encodeLeadingOnesTo(dst: ArrayBuffer, v: number | bigint): Uint8Array {\n\tconst x = BigInt(v);\n\tif (x < 0n) throw new RangeError(`underflow, value is negative: ${v}`);\n\tif (x > MAX_U64) throw new RangeError(`value exceeds 64 bits: ${v}`);\n\n\tconst view = new DataView(dst);\n\n\tif (x < 1n << 7n) {\n\t\tview.setUint8(0, Number(x));\n\t\treturn new Uint8Array(dst, 0, 1);\n\t}\n\tif (x < 1n << 14n) {\n\t\tview.setUint8(0, 0x80 | Number(x >> 8n));\n\t\tview.setUint8(1, Number(x & 0xffn));\n\t\treturn new Uint8Array(dst, 0, 2);\n\t}\n\tif (x < 1n << 21n) {\n\t\tview.setUint8(0, 0xc0 | Number(x >> 16n));\n\t\tview.setUint16(1, Number(x & 0xffffn));\n\t\treturn new Uint8Array(dst, 0, 3);\n\t}\n\tif (x < 1n << 28n) {\n\t\tview.setUint8(0, 0xe0 | Number(x >> 24n));\n\t\tview.setUint8(1, Number((x >> 16n) & 0xffn));\n\t\tview.setUint16(2, Number(x & 0xffffn));\n\t\treturn new Uint8Array(dst, 0, 4);\n\t}\n\tif (x < 1n << 35n) {\n\t\tview.setUint8(0, 0xf0 | Number(x >> 32n));\n\t\tview.setUint32(1, Number(x & 0xffffffffn));\n\t\treturn new Uint8Array(dst, 0, 5);\n\t}\n\tif (x < 1n << 42n) {\n\t\tview.setUint8(0, 0xf8 | Number(x >> 40n));\n\t\tview.setUint8(1, Number((x >> 32n) & 0xffn));\n\t\tview.setUint32(2, Number(x & 0xffffffffn));\n\t\treturn new Uint8Array(dst, 0, 6);\n\t}\n\tif (x < 1n << 56n) {\n\t\t// 11111110 + 7 bytes\n\t\tview.setUint8(0, 0xfe);\n\t\tview.setUint8(1, Number((x >> 48n) & 0xffn));\n\t\tview.setUint16(2, Number((x >> 32n) & 0xffffn));\n\t\tview.setUint32(4, Number(x & 0xffffffffn));\n\t\treturn new Uint8Array(dst, 0, 8);\n\t}\n\t// 11111111 + 8 bytes\n\tview.setUint8(0, 0xff);\n\tview.setBigUint64(1, x);\n\treturn new Uint8Array(dst, 0, 9);\n}\n\n/** Encode a value in leading-ones varint format into a freshly allocated buffer. */\nexport function encodeLeadingOnes(v: number | bigint): Uint8Array {\n\treturn encodeLeadingOnesTo(new ArrayBuffer(9), v);\n}\n\n/** Decode a leading-ones varint, returning the value and the remaining buffer. */\nexport function decodeLeadingOnes(buf: Uint8Array): [bigint, Uint8Array] {\n\tif (buf.length === 0) throw new Error(\"buffer is empty\");\n\n\tconst b = buf[0];\n\t// Count leading 1-bits\n\tlet ones = 0;\n\tfor (let bit = 7; bit >= 0; bit--) {\n\t\tif (b & (1 << bit)) ones++;\n\t\telse break;\n\t}\n\n\t// 1111110x is a 7-byte form: invalid on draft-17, allowed on draft-18+ per #1595.\n\t// This standalone decoder is permissive (Postel-style) since we lack version context here.\n\n\tlet totalSize: number;\n\tif (ones <= 5) totalSize = ones + 1;\n\telse if (ones === 6) totalSize = 7;\n\telse if (ones === 7) totalSize = 8;\n\telse totalSize = 9; // ones === 8\n\n\tif (buf.length < totalSize) {\n\t\tthrow new Error(`buffer too short: need ${totalSize} bytes, have ${buf.length}`);\n\t}\n\n\tconst view = new DataView(buf.buffer, buf.byteOffset, totalSize);\n\tconst remain = buf.subarray(totalSize);\n\tlet value: bigint;\n\n\tswitch (ones) {\n\t\tcase 0:\n\t\t\tvalue = BigInt(b);\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\tvalue = (BigInt(b & 0x3f) << 8n) | BigInt(buf[1]);\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tvalue = (BigInt(b & 0x1f) << 16n) | BigInt(view.getUint16(1));\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tvalue = (BigInt(b & 0x0f) << 24n) | (BigInt(buf[1]) << 16n) | (BigInt(buf[2]) << 8n) | BigInt(buf[3]);\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\tvalue = (BigInt(b & 0x07) << 32n) | BigInt(view.getUint32(1));\n\t\t\tbreak;\n\t\tcase 5:\n\t\t\tvalue =\n\t\t\t\t(BigInt(b & 0x03) << 40n) |\n\t\t\t\t(BigInt(buf[1]) << 32n) |\n\t\t\t\t(BigInt(buf[2]) << 24n) |\n\t\t\t\t(BigInt(buf[3]) << 16n) |\n\t\t\t\t(BigInt(buf[4]) << 8n) |\n\t\t\t\tBigInt(buf[5]);\n\t\t\tbreak;\n\t\tcase 6: {\n\t\t\t// 1111110x + 6 bytes = 49 bits (draft-18+)\n\t\t\tvalue =\n\t\t\t\t(BigInt(b & 0x01) << 48n) |\n\t\t\t\t(BigInt(buf[1]) << 40n) |\n\t\t\t\t(BigInt(buf[2]) << 32n) |\n\t\t\t\t(BigInt(buf[3]) << 24n) |\n\t\t\t\t(BigInt(buf[4]) << 16n) |\n\t\t\t\t(BigInt(buf[5]) << 8n) |\n\t\t\t\tBigInt(buf[6]);\n\t\t\tbreak;\n\t\t}\n\t\tcase 7: {\n\t\t\t// 11111110 + 7 bytes = 56 usable bits\n\t\t\tconst hi = new Uint8Array(8);\n\t\t\thi[0] = 0;\n\t\t\thi.set(buf.subarray(1, 8), 1);\n\t\t\tvalue = new DataView(hi.buffer).getBigUint64(0);\n\t\t\tbreak;\n\t\t}\n\t\tcase 8: {\n\t\t\t// 11111111 + 8 bytes = 64 bits\n\t\t\tvalue = new DataView(buf.buffer, buf.byteOffset + 1, 8).getBigUint64(0);\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tthrow new Error(\"impossible\");\n\t}\n\n\treturn [value, remain];\n}\n\n/**\n * Returns the number of bytes needed to encode a value as a varint.\n */\nexport function size(v: number): number {\n\tif (v <= MAX_U6) return 1;\n\tif (v <= MAX_U14) return 2;\n\tif (v <= MAX_U30) return 4;\n\tif (v <= MAX_U53) return 8;\n\tthrow new Error(`overflow, value larger than 53-bits: ${v}`);\n}\n\n// Helper functions for writing to an ArrayBuffer\nfunction setUint8(dst: ArrayBuffer, v: number): Uint8Array {\n\tconst buffer = new Uint8Array(dst, 0, 1);\n\tbuffer[0] = v;\n\treturn buffer;\n}\n\nfunction setUint16(dst: ArrayBuffer, v: number): Uint8Array {\n\tconst view = new DataView(dst, 0, 2);\n\tview.setUint16(0, v);\n\treturn new Uint8Array(view.buffer, view.byteOffset, view.byteLength);\n}\n\nfunction setUint32(dst: ArrayBuffer, v: number): Uint8Array {\n\tconst view = new DataView(dst, 0, 4);\n\tview.setUint32(0, v);\n\treturn new Uint8Array(view.buffer, view.byteOffset, view.byteLength);\n}\n\nfunction setUint64(dst: ArrayBuffer, v: bigint): Uint8Array {\n\tconst view = new DataView(dst, 0, 8);\n\tview.setBigUint64(0, v);\n\treturn new Uint8Array(view.buffer, view.byteOffset, view.byteLength);\n}\n\nconst MAX_U62 = 2n ** 62n - 1n;\n\n/**\n * Encodes a number or bigint into a scratch buffer.\n * Used by stream.ts to avoid allocations.\n */\nexport function encodeTo(dst: ArrayBuffer, v: number | bigint): Uint8Array {\n\tconst b = BigInt(v);\n\tif (b < 0n) {\n\t\tthrow new Error(`underflow, value is negative: ${v}`);\n\t}\n\tif (b > MAX_U62) {\n\t\tthrow new Error(`overflow, value larger than 62-bits: ${v}`);\n\t}\n\tconst n = Number(b);\n\tif (n <= MAX_U6) {\n\t\treturn setUint8(dst, n);\n\t}\n\tif (n <= MAX_U14) {\n\t\treturn setUint16(dst, n | 0x4000);\n\t}\n\tif (n <= MAX_U30) {\n\t\treturn setUint32(dst, n | 0x80000000);\n\t}\n\treturn setUint64(dst, b | 0xc000000000000000n);\n}\n\n/**\n * Encodes a number as a QUIC variable-length integer.\n * Returns a new Uint8Array containing the encoded bytes.\n */\nexport function encode(v: number): Uint8Array {\n\treturn encodeTo(new ArrayBuffer(8), v);\n}\n\n/**\n * Decodes a QUIC variable-length integer from a buffer.\n * Returns a tuple of [value, remaining buffer].\n */\nexport function decode(buf: Uint8Array): [number, Uint8Array] {\n\tif (buf.length === 0) {\n\t\tthrow new Error(\"buffer is empty\");\n\t}\n\n\tconst size = 1 << ((buf[0] & 0xc0) >> 6);\n\n\tif (buf.length < size) {\n\t\tthrow new Error(`buffer too short: need ${size} bytes, have ${buf.length}`);\n\t}\n\n\tconst view = new DataView(buf.buffer, buf.byteOffset, size);\n\tconst remain = buf.subarray(size);\n\n\tlet v: number;\n\n\tif (size === 1) {\n\t\tv = buf[0] & 0x3f;\n\t} else if (size === 2) {\n\t\tv = view.getUint16(0) & 0x3fff;\n\t} else if (size === 4) {\n\t\tv = view.getUint32(0) & 0x3fffffff;\n\t} else if (size === 8) {\n\t\t// NOTE: Precision loss above 2^53, but we're using number type\n\t\tv = Number(view.getBigUint64(0) & 0x3fffffffffffffffn);\n\t} else {\n\t\tthrow new Error(\"impossible\");\n\t}\n\n\treturn [v, remain];\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=varint.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"varint.test.d.ts","sourceRoot":"","sources":["../src/varint.test.ts"],"names":[],"mappings":""}
package/varint.test.js ADDED
@@ -0,0 +1,106 @@
1
+ /* @ts-self-types="./varint.test.d.ts" */
2
+ import { expect, test } from "bun:test";
3
+ import * as Varint from "./varint.js";
4
+ test("Varint encode/decode roundtrip - 1 byte values (0-63)", () => {
5
+ const testValues = [0, 1, 32, 63];
6
+ for (const value of testValues) {
7
+ const encoded = Varint.encode(value);
8
+ expect(encoded.byteLength).toBe(1);
9
+ const [decoded, remaining] = Varint.decode(encoded);
10
+ expect(decoded).toBe(value);
11
+ expect(remaining.byteLength).toBe(0);
12
+ }
13
+ });
14
+ test("Varint encode/decode roundtrip - 2 byte values (64-16383)", () => {
15
+ const testValues = [64, 100, 1000, 16383];
16
+ for (const value of testValues) {
17
+ const encoded = Varint.encode(value);
18
+ expect(encoded.byteLength).toBe(2);
19
+ const [decoded, remaining] = Varint.decode(encoded);
20
+ expect(decoded).toBe(value);
21
+ expect(remaining.byteLength).toBe(0);
22
+ }
23
+ });
24
+ test("Varint encode/decode roundtrip - 4 byte values (16384-1073741823)", () => {
25
+ const testValues = [16384, 100000, 1073741823];
26
+ for (const value of testValues) {
27
+ const encoded = Varint.encode(value);
28
+ expect(encoded.byteLength).toBe(4);
29
+ const [decoded, remaining] = Varint.decode(encoded);
30
+ expect(decoded).toBe(value);
31
+ expect(remaining.byteLength).toBe(0);
32
+ }
33
+ });
34
+ test("Varint encode/decode roundtrip - 8 byte values (1073741824+)", () => {
35
+ const testValues = [1073741824, Number.MAX_SAFE_INTEGER];
36
+ for (const value of testValues) {
37
+ const encoded = Varint.encode(value);
38
+ expect(encoded.byteLength).toBe(8);
39
+ const [decoded, remaining] = Varint.decode(encoded);
40
+ expect(decoded).toBe(value);
41
+ expect(remaining.byteLength).toBe(0);
42
+ }
43
+ });
44
+ test("Varint size calculation", () => {
45
+ expect(Varint.size(0)).toBe(1);
46
+ expect(Varint.size(63)).toBe(1);
47
+ expect(Varint.size(64)).toBe(2);
48
+ expect(Varint.size(16383)).toBe(2);
49
+ expect(Varint.size(16384)).toBe(4);
50
+ expect(Varint.size(1073741823)).toBe(4);
51
+ expect(Varint.size(1073741824)).toBe(8);
52
+ expect(Varint.size(Number.MAX_SAFE_INTEGER)).toBe(8);
53
+ });
54
+ test("Varint decode returns remaining buffer", () => {
55
+ // Encode a value and append extra data
56
+ const encoded = Varint.encode(42);
57
+ const extra = new Uint8Array([0xde, 0xad, 0xbe, 0xef]);
58
+ const combined = new Uint8Array(encoded.byteLength + extra.byteLength);
59
+ combined.set(encoded, 0);
60
+ combined.set(extra, encoded.byteLength);
61
+ const [decoded, remaining] = Varint.decode(combined);
62
+ expect(decoded).toBe(42);
63
+ expect(remaining).toEqual(extra);
64
+ });
65
+ test("Varint decode handles buffer at non-zero offset", () => {
66
+ // Create a buffer with padding before the varint
67
+ const padding = new Uint8Array([0xff, 0xff]);
68
+ const encoded = Varint.encode(1000); // 2-byte varint
69
+ const combined = new Uint8Array(padding.byteLength + encoded.byteLength);
70
+ combined.set(padding, 0);
71
+ combined.set(encoded, padding.byteLength);
72
+ // Create a subarray starting after the padding
73
+ const subarray = combined.subarray(padding.byteLength);
74
+ const [decoded, remaining] = Varint.decode(subarray);
75
+ expect(decoded).toBe(1000);
76
+ expect(remaining.byteLength).toBe(0);
77
+ });
78
+ test("Varint encode rejects negative values", () => {
79
+ expect(() => Varint.encode(-1)).toThrow(/underflow/);
80
+ });
81
+ test("Varint decode throws on empty buffer", () => {
82
+ expect(() => Varint.decode(new Uint8Array(0))).toThrow(/buffer is empty/);
83
+ });
84
+ test("Varint decode throws on truncated buffer", () => {
85
+ // Create a 2-byte varint header but only provide 1 byte
86
+ const truncated = new Uint8Array([0x40]); // 0x40 = 2-byte marker with value 0
87
+ expect(() => Varint.decode(truncated)).toThrow(/buffer too short/);
88
+ });
89
+ test("Varint boundary values", () => {
90
+ // Test exact boundary values
91
+ const boundaries = [
92
+ { value: 63, expectedSize: 1 },
93
+ { value: 64, expectedSize: 2 },
94
+ { value: 16383, expectedSize: 2 },
95
+ { value: 16384, expectedSize: 4 },
96
+ { value: 1073741823, expectedSize: 4 },
97
+ { value: 1073741824, expectedSize: 8 },
98
+ ];
99
+ for (const { value, expectedSize } of boundaries) {
100
+ const encoded = Varint.encode(value);
101
+ expect(encoded.byteLength).toBe(expectedSize);
102
+ const [decoded] = Varint.decode(encoded);
103
+ expect(decoded).toBe(value);
104
+ }
105
+ });
106
+ //# sourceMappingURL=varint.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"varint.test.js","sourceRoot":"","sources":["../src/varint.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, test } from \"bun:test\";\nimport * as Varint from \"./varint.ts\";\n\ntest(\"Varint encode/decode roundtrip - 1 byte values (0-63)\", () => {\n\tconst testValues = [0, 1, 32, 63];\n\n\tfor (const value of testValues) {\n\t\tconst encoded = Varint.encode(value);\n\t\texpect(encoded.byteLength).toBe(1);\n\n\t\tconst [decoded, remaining] = Varint.decode(encoded);\n\t\texpect(decoded).toBe(value);\n\t\texpect(remaining.byteLength).toBe(0);\n\t}\n});\n\ntest(\"Varint encode/decode roundtrip - 2 byte values (64-16383)\", () => {\n\tconst testValues = [64, 100, 1000, 16383];\n\n\tfor (const value of testValues) {\n\t\tconst encoded = Varint.encode(value);\n\t\texpect(encoded.byteLength).toBe(2);\n\n\t\tconst [decoded, remaining] = Varint.decode(encoded);\n\t\texpect(decoded).toBe(value);\n\t\texpect(remaining.byteLength).toBe(0);\n\t}\n});\n\ntest(\"Varint encode/decode roundtrip - 4 byte values (16384-1073741823)\", () => {\n\tconst testValues = [16384, 100000, 1073741823];\n\n\tfor (const value of testValues) {\n\t\tconst encoded = Varint.encode(value);\n\t\texpect(encoded.byteLength).toBe(4);\n\n\t\tconst [decoded, remaining] = Varint.decode(encoded);\n\t\texpect(decoded).toBe(value);\n\t\texpect(remaining.byteLength).toBe(0);\n\t}\n});\n\ntest(\"Varint encode/decode roundtrip - 8 byte values (1073741824+)\", () => {\n\tconst testValues = [1073741824, Number.MAX_SAFE_INTEGER];\n\n\tfor (const value of testValues) {\n\t\tconst encoded = Varint.encode(value);\n\t\texpect(encoded.byteLength).toBe(8);\n\n\t\tconst [decoded, remaining] = Varint.decode(encoded);\n\t\texpect(decoded).toBe(value);\n\t\texpect(remaining.byteLength).toBe(0);\n\t}\n});\n\ntest(\"Varint size calculation\", () => {\n\texpect(Varint.size(0)).toBe(1);\n\texpect(Varint.size(63)).toBe(1);\n\texpect(Varint.size(64)).toBe(2);\n\texpect(Varint.size(16383)).toBe(2);\n\texpect(Varint.size(16384)).toBe(4);\n\texpect(Varint.size(1073741823)).toBe(4);\n\texpect(Varint.size(1073741824)).toBe(8);\n\texpect(Varint.size(Number.MAX_SAFE_INTEGER)).toBe(8);\n});\n\ntest(\"Varint decode returns remaining buffer\", () => {\n\t// Encode a value and append extra data\n\tconst encoded = Varint.encode(42);\n\tconst extra = new Uint8Array([0xde, 0xad, 0xbe, 0xef]);\n\tconst combined = new Uint8Array(encoded.byteLength + extra.byteLength);\n\tcombined.set(encoded, 0);\n\tcombined.set(extra, encoded.byteLength);\n\n\tconst [decoded, remaining] = Varint.decode(combined);\n\texpect(decoded).toBe(42);\n\texpect(remaining).toEqual(extra);\n});\n\ntest(\"Varint decode handles buffer at non-zero offset\", () => {\n\t// Create a buffer with padding before the varint\n\tconst padding = new Uint8Array([0xff, 0xff]);\n\tconst encoded = Varint.encode(1000); // 2-byte varint\n\tconst combined = new Uint8Array(padding.byteLength + encoded.byteLength);\n\tcombined.set(padding, 0);\n\tcombined.set(encoded, padding.byteLength);\n\n\t// Create a subarray starting after the padding\n\tconst subarray = combined.subarray(padding.byteLength);\n\n\tconst [decoded, remaining] = Varint.decode(subarray);\n\texpect(decoded).toBe(1000);\n\texpect(remaining.byteLength).toBe(0);\n});\n\ntest(\"Varint encode rejects negative values\", () => {\n\texpect(() => Varint.encode(-1)).toThrow(/underflow/);\n});\n\ntest(\"Varint decode throws on empty buffer\", () => {\n\texpect(() => Varint.decode(new Uint8Array(0))).toThrow(/buffer is empty/);\n});\n\ntest(\"Varint decode throws on truncated buffer\", () => {\n\t// Create a 2-byte varint header but only provide 1 byte\n\tconst truncated = new Uint8Array([0x40]); // 0x40 = 2-byte marker with value 0\n\texpect(() => Varint.decode(truncated)).toThrow(/buffer too short/);\n});\n\ntest(\"Varint boundary values\", () => {\n\t// Test exact boundary values\n\tconst boundaries = [\n\t\t{ value: 63, expectedSize: 1 },\n\t\t{ value: 64, expectedSize: 2 },\n\t\t{ value: 16383, expectedSize: 2 },\n\t\t{ value: 16384, expectedSize: 4 },\n\t\t{ value: 1073741823, expectedSize: 4 },\n\t\t{ value: 1073741824, expectedSize: 8 },\n\t];\n\n\tfor (const { value, expectedSize } of boundaries) {\n\t\tconst encoded = Varint.encode(value);\n\t\texpect(encoded.byteLength).toBe(expectedSize);\n\n\t\tconst [decoded] = Varint.decode(encoded);\n\t\texpect(decoded).toBe(value);\n\t}\n});\n"]}
package/zod.d.ts ADDED
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Helpers for reading and writing Zod-validated JSON frames on a track or group.
3
+ *
4
+ * @module
5
+ */
6
+ import type * as z from "zod/mini";
7
+ import type { Group } from "./group";
8
+ import type { Track } from "./track";
9
+ /** Read the next JSON frame and validate it against the schema. Returns undefined at end of stream. */
10
+ export declare function read<T = unknown>(source: Track | Group, schema: z.ZodMiniType<T>): Promise<T | undefined>;
11
+ /** Validate a value against the schema, then write it as a JSON frame. */
12
+ export declare function write<T = unknown>(source: Track | Group, value: T, schema: z.ZodMiniType<T>): void;
13
+ //# sourceMappingURL=zod.d.ts.map
package/zod.d.ts.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zod.d.ts","sourceRoot":"","sources":["../src/zod.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,KAAK,CAAC,MAAM,UAAU,CAAC;AACnC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,uGAAuG;AACvG,wBAAsB,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,KAAK,GAAG,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAI/G;AAED,0EAA0E;AAC1E,wBAAgB,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAG3F"}
package/zod.js ADDED
@@ -0,0 +1,19 @@
1
+ /* @ts-self-types="./zod.d.ts" */
2
+ /**
3
+ * Helpers for reading and writing Zod-validated JSON frames on a track or group.
4
+ *
5
+ * @module
6
+ */
7
+ /** Read the next JSON frame and validate it against the schema. Returns undefined at end of stream. */
8
+ export async function read(source, schema) {
9
+ const next = await source.readJson();
10
+ if (next === undefined)
11
+ return undefined; // only treat undefined as EOF, not other falsy values
12
+ return schema.parse(next);
13
+ }
14
+ /** Validate a value against the schema, then write it as a JSON frame. */
15
+ export function write(source, value, schema) {
16
+ const valid = schema.parse(value);
17
+ source.writeJson(valid);
18
+ }
19
+ //# sourceMappingURL=zod.js.map
package/zod.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zod.js","sourceRoot":"","sources":["../src/zod.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,uGAAuG;AACvG,MAAM,CAAC,KAAK,UAAU,IAAI,CAAc,MAAqB,EAAE,MAAwB;IACtF,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;IACrC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC,CAAC,sDAAsD;IAChG,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,KAAK,CAAc,MAAqB,EAAE,KAAQ,EAAE,MAAwB;IAC3F,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC","sourcesContent":["/**\n * Helpers for reading and writing Zod-validated JSON frames on a track or group.\n *\n * @module\n */\n\nimport type * as z from \"zod/mini\";\nimport type { Group } from \"./group.ts\";\nimport type { Track } from \"./track.ts\";\n\n/** Read the next JSON frame and validate it against the schema. Returns undefined at end of stream. */\nexport async function read<T = unknown>(source: Track | Group, schema: z.ZodMiniType<T>): Promise<T | undefined> {\n\tconst next = await source.readJson();\n\tif (next === undefined) return undefined; // only treat undefined as EOF, not other falsy values\n\treturn schema.parse(next);\n}\n\n/** Validate a value against the schema, then write it as a JSON frame. */\nexport function write<T = unknown>(source: Track | Group, value: T, schema: z.ZodMiniType<T>) {\n\tconst valid = schema.parse(value);\n\tsource.writeJson(valid);\n}\n"]}