@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/stream.test.js ADDED
@@ -0,0 +1,210 @@
1
+ /* @ts-self-types="./stream.test.d.ts" */
2
+ import { expect, test } from "bun:test";
3
+ import { Reader, Writer } from "./stream.js";
4
+ // Helper to create a writable stream that captures written data
5
+ function createTestWritableStream() {
6
+ const written = [];
7
+ const stream = new WritableStream({
8
+ write(chunk) {
9
+ written.push(new Uint8Array(chunk));
10
+ },
11
+ });
12
+ return { stream, written };
13
+ }
14
+ // Helper to concatenate written chunks
15
+ function concatChunks(chunks) {
16
+ const totalLength = chunks.reduce((sum, chunk) => sum + chunk.byteLength, 0);
17
+ const result = new Uint8Array(totalLength);
18
+ let offset = 0;
19
+ for (const chunk of chunks) {
20
+ result.set(chunk, offset);
21
+ offset += chunk.byteLength;
22
+ }
23
+ return result;
24
+ }
25
+ test("Writer u8", async () => {
26
+ const { stream, written } = createTestWritableStream();
27
+ const writer = new Writer(stream);
28
+ await writer.u8(42);
29
+ await writer.u8(255);
30
+ writer.close();
31
+ await writer.closed;
32
+ expect(written.length).toBe(2);
33
+ expect(written[0]).toEqual(new Uint8Array([42]));
34
+ expect(written[1]).toEqual(new Uint8Array([255]));
35
+ });
36
+ test("Writer i32", async () => {
37
+ const { stream, written } = createTestWritableStream();
38
+ const writer = new Writer(stream);
39
+ await writer.i32(0);
40
+ await writer.i32(-1);
41
+ await writer.i32(1000);
42
+ writer.close();
43
+ await writer.closed;
44
+ const result = concatChunks(written);
45
+ expect(result.byteLength).toBe(12); // 3 * 4 bytes
46
+ // Read back the values
47
+ const view = new DataView(result.buffer, result.byteOffset, result.byteLength);
48
+ expect(view.getInt32(0)).toBe(0);
49
+ expect(view.getInt32(4)).toBe(-1);
50
+ expect(view.getInt32(8)).toBe(1000);
51
+ });
52
+ test("Writer u53", async () => {
53
+ const { stream, written } = createTestWritableStream();
54
+ const writer = new Writer(stream);
55
+ await writer.u53(0);
56
+ await writer.u53(63); // MAX_U6
57
+ await writer.u53(64); // MIN for 2-byte varint
58
+ await writer.u53(16383); // MAX_U14
59
+ await writer.u53(16384); // MIN for 4-byte varint
60
+ writer.close();
61
+ await writer.closed;
62
+ // Verify the varint encoding sizes
63
+ expect(written[0].byteLength).toBe(1); // 0 fits in 1 byte
64
+ expect(written[1].byteLength).toBe(1); // 63 fits in 1 byte
65
+ expect(written[2].byteLength).toBe(2); // 64 needs 2 bytes
66
+ expect(written[3].byteLength).toBe(2); // 16383 fits in 2 bytes
67
+ expect(written[4].byteLength).toBe(4); // 16384 needs 4 bytes
68
+ });
69
+ test("Writer string", async () => {
70
+ const { stream, written } = createTestWritableStream();
71
+ const writer = new Writer(stream);
72
+ await writer.string("hello");
73
+ await writer.string("🎉");
74
+ writer.close();
75
+ await writer.closed;
76
+ const result = concatChunks(written);
77
+ // Create a reader to parse the result
78
+ const reader = new Reader(undefined, result);
79
+ const str1 = await reader.string();
80
+ const str2 = await reader.string();
81
+ expect(str1).toBe("hello");
82
+ expect(str2).toBe("🎉");
83
+ });
84
+ test("Reader u8", async () => {
85
+ const data = new Uint8Array([42, 255, 0, 128]);
86
+ const reader = new Reader(undefined, data);
87
+ expect(await reader.u8()).toBe(42);
88
+ expect(await reader.u8()).toBe(255);
89
+ expect(await reader.u8()).toBe(0);
90
+ expect(await reader.u8()).toBe(128);
91
+ expect(await reader.done()).toBe(true);
92
+ });
93
+ test("Reader read with exact sizes", async () => {
94
+ const data = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);
95
+ const reader = new Reader(undefined, data);
96
+ const chunk1 = await reader.read(3);
97
+ expect(chunk1).toEqual(new Uint8Array([1, 2, 3]));
98
+ const chunk2 = await reader.read(2);
99
+ expect(chunk2).toEqual(new Uint8Array([4, 5]));
100
+ const chunk3 = await reader.read(3);
101
+ expect(chunk3).toEqual(new Uint8Array([6, 7, 8]));
102
+ expect(await reader.done()).toBe(true);
103
+ });
104
+ test("Reader read with zero size", async () => {
105
+ const data = new Uint8Array([1, 2, 3]);
106
+ const reader = new Reader(undefined, data);
107
+ const chunk = await reader.read(0);
108
+ expect(chunk).toEqual(new Uint8Array([]));
109
+ // Original data should still be available
110
+ const remaining = await reader.read(3);
111
+ expect(remaining).toEqual(new Uint8Array([1, 2, 3]));
112
+ });
113
+ test("Reader readAll", async () => {
114
+ const data = new Uint8Array([1, 2, 3, 4, 5]);
115
+ const reader = new Reader(undefined, data);
116
+ // Read some data first
117
+ await reader.read(2);
118
+ // readAll should get the remaining data
119
+ const remaining = await reader.readAll();
120
+ expect(remaining).toEqual(new Uint8Array([3, 4, 5]));
121
+ expect(await reader.done()).toBe(true);
122
+ });
123
+ test("Reader u53 varint decoding", async () => {
124
+ // Test various varint sizes
125
+ const testValues = [0, 63, 64, 16383, 16384, 1073741823, 1073741824];
126
+ const { stream, written } = createTestWritableStream();
127
+ const testWriter = new Writer(stream);
128
+ for (const value of testValues) {
129
+ await testWriter.u53(value);
130
+ }
131
+ testWriter.close();
132
+ await testWriter.closed;
133
+ const data = concatChunks(written);
134
+ const reader = new Reader(undefined, data);
135
+ for (const expectedValue of testValues) {
136
+ const actualValue = await reader.u53();
137
+ expect(actualValue).toBe(expectedValue);
138
+ }
139
+ expect(await reader.done()).toBe(true);
140
+ });
141
+ test("Reader u62 varint decoding", async () => {
142
+ const testValues = [0n, 63n, 64n, 16383n, 16384n, 1073741823n, 1073741824n, 9007199254740991n]; // MAX_U53
143
+ const { stream, written } = createTestWritableStream();
144
+ const testWriter = new Writer(stream);
145
+ for (const value of testValues) {
146
+ await testWriter.u62(value);
147
+ }
148
+ testWriter.close();
149
+ await testWriter.closed;
150
+ const data = concatChunks(written);
151
+ const reader = new Reader(undefined, data);
152
+ for (const expectedValue of testValues) {
153
+ const actualValue = await reader.u62();
154
+ expect(actualValue).toBe(expectedValue);
155
+ }
156
+ expect(await reader.done()).toBe(true);
157
+ });
158
+ test("Reader string decoding", async () => {
159
+ const testStrings = ["hello", "🎉", "", "world with spaces", "multi\nline\nstring"];
160
+ const { stream, written } = createTestWritableStream();
161
+ const writer = new Writer(stream);
162
+ for (const str of testStrings) {
163
+ await writer.string(str);
164
+ }
165
+ writer.close();
166
+ await writer.closed;
167
+ const data = concatChunks(written);
168
+ const reader = new Reader(undefined, data);
169
+ for (const expectedString of testStrings) {
170
+ const actualString = await reader.string();
171
+ expect(actualString).toBe(expectedString);
172
+ }
173
+ expect(await reader.done()).toBe(true);
174
+ });
175
+ test("Reader from stream", async () => {
176
+ const chunks = [new Uint8Array([1, 2, 3]), new Uint8Array([4, 5]), new Uint8Array([6, 7, 8, 9])];
177
+ const stream = new ReadableStream({
178
+ start(controller) {
179
+ for (const chunk of chunks) {
180
+ controller.enqueue(chunk);
181
+ }
182
+ controller.close();
183
+ },
184
+ });
185
+ const reader = new Reader(stream);
186
+ // Read all data
187
+ const result = await reader.readAll();
188
+ expect(result).toEqual(new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9]));
189
+ });
190
+ test("Reader stream with partial reads", async () => {
191
+ const chunks = [new Uint8Array([1, 2]), new Uint8Array([3, 4, 5]), new Uint8Array([6])];
192
+ const stream = new ReadableStream({
193
+ start(controller) {
194
+ for (const chunk of chunks) {
195
+ controller.enqueue(chunk);
196
+ }
197
+ controller.close();
198
+ },
199
+ });
200
+ const reader = new Reader(stream);
201
+ // Read specific amounts that cross chunk boundaries
202
+ const first = await reader.read(3); // Should span first two chunks
203
+ expect(first).toEqual(new Uint8Array([1, 2, 3]));
204
+ const second = await reader.read(2);
205
+ expect(second).toEqual(new Uint8Array([4, 5]));
206
+ const third = await reader.read(1);
207
+ expect(third).toEqual(new Uint8Array([6]));
208
+ expect(await reader.done()).toBe(true);
209
+ });
210
+ //# sourceMappingURL=stream.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.test.js","sourceRoot":"","sources":["../src/stream.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE7C,gEAAgE;AAChE,SAAS,wBAAwB;IAChC,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,IAAI,cAAc,CAAa;QAC7C,KAAK,CAAC,KAAK;YACV,OAAO,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;QACrC,CAAC;KACD,CAAC,CAAC;IACH,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAC5B,CAAC;AAED,uCAAuC;AACvC,SAAS,YAAY,CAAC,MAAoB;IACzC,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IAC7E,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC;IAC3C,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC5B,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC;IAC5B,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;IAC5B,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,wBAAwB,EAAE,CAAC;IACvD,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;IAElC,MAAM,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACpB,MAAM,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IAErB,MAAM,CAAC,KAAK,EAAE,CAAC;IACf,MAAM,MAAM,CAAC,MAAM,CAAC;IAEpB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE;IAC7B,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,wBAAwB,EAAE,CAAC;IACvD,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;IAElC,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACpB,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrB,MAAM,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAEvB,MAAM,CAAC,KAAK,EAAE,CAAC;IACf,MAAM,MAAM,CAAC,MAAM,CAAC;IAEpB,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc;IAElD,uBAAuB;IACvB,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IAC/E,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE;IAC7B,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,wBAAwB,EAAE,CAAC;IACvD,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;IAElC,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACpB,MAAM,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;IAC/B,MAAM,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,wBAAwB;IAC9C,MAAM,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU;IACnC,MAAM,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,wBAAwB;IAEjD,MAAM,CAAC,KAAK,EAAE,CAAC;IACf,MAAM,MAAM,CAAC,MAAM,CAAC;IAEpB,mCAAmC;IACnC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,mBAAmB;IAC1D,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB;IAC3D,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,mBAAmB;IAC1D,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,wBAAwB;IAC/D,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,sBAAsB;AAC9D,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,eAAe,EAAE,KAAK,IAAI,EAAE;IAChC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,wBAAwB,EAAE,CAAC;IACvD,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;IAElC,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7B,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAE1B,MAAM,CAAC,KAAK,EAAE,CAAC;IACf,MAAM,MAAM,CAAC,MAAM,CAAC;IAEpB,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAErC,sCAAsC;IACtC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAE7C,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;IACnC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;IAEnC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;IAC5B,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAE3C,MAAM,CAAC,MAAM,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnC,MAAM,CAAC,MAAM,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,CAAC,MAAM,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,CAAC,MAAM,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEpC,MAAM,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;IAC/C,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAE3C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAElD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAE/C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAElD,MAAM,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;IAC7C,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAE3C,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;IAE1C,0CAA0C;IAC1C,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvC,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACtD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gBAAgB,EAAE,KAAK,IAAI,EAAE;IACjC,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAE3C,uBAAuB;IACvB,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAErB,wCAAwC;IACxC,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;IACzC,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAErD,MAAM,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;IAC7C,4BAA4B;IAC5B,MAAM,UAAU,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IAErE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,wBAAwB,EAAE,CAAC;IACvD,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;IAEtC,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;QAChC,MAAM,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,UAAU,CAAC,KAAK,EAAE,CAAC;IACnB,MAAM,UAAU,CAAC,MAAM,CAAC;IAExB,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAE3C,KAAK,MAAM,aAAa,IAAI,UAAU,EAAE,CAAC;QACxC,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;QACvC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;IAC7C,MAAM,UAAU,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC,CAAC,UAAU;IAE1G,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,wBAAwB,EAAE,CAAC;IACvD,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;IAEtC,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;QAChC,MAAM,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,UAAU,CAAC,KAAK,EAAE,CAAC;IACnB,MAAM,UAAU,CAAC,MAAM,CAAC;IAExB,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAE3C,KAAK,MAAM,aAAa,IAAI,UAAU,EAAE,CAAC;QACxC,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;QACvC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;IACzC,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,mBAAmB,EAAE,qBAAqB,CAAC,CAAC;IAEpF,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,wBAAwB,EAAE,CAAC;IACvD,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;IAElC,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,CAAC,KAAK,EAAE,CAAC;IACf,MAAM,MAAM,CAAC,MAAM,CAAC;IAEpB,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAE3C,KAAK,MAAM,cAAc,IAAI,WAAW,EAAE,CAAC;QAC1C,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;QAC3C,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;IACrC,MAAM,MAAM,GAAG,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEjG,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC;QACjC,KAAK,CAAC,UAAU;YACf,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC5B,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC3B,CAAC;YACD,UAAU,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC;KACD,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;IAElC,gBAAgB;IAChB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;IACtC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACrE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;IACnD,MAAM,MAAM,GAAG,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAExF,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC;QACjC,KAAK,CAAC,UAAU;YACf,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC5B,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC3B,CAAC;YACD,UAAU,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC;KACD,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;IAElC,oDAAoD;IACpD,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,+BAA+B;IACnE,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEjD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAE/C,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3C,MAAM,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC,CAAC,CAAC","sourcesContent":["import { expect, test } from \"bun:test\";\nimport { Reader, Writer } from \"./stream.ts\";\n\n// Helper to create a writable stream that captures written data\nfunction createTestWritableStream(): { stream: WritableStream<Uint8Array>; written: Uint8Array[] } {\n\tconst written: Uint8Array[] = [];\n\tconst stream = new WritableStream<Uint8Array>({\n\t\twrite(chunk) {\n\t\t\twritten.push(new Uint8Array(chunk));\n\t\t},\n\t});\n\treturn { stream, written };\n}\n\n// Helper to concatenate written chunks\nfunction concatChunks(chunks: Uint8Array[]): Uint8Array {\n\tconst totalLength = chunks.reduce((sum, chunk) => sum + chunk.byteLength, 0);\n\tconst result = new Uint8Array(totalLength);\n\tlet offset = 0;\n\tfor (const chunk of chunks) {\n\t\tresult.set(chunk, offset);\n\t\toffset += chunk.byteLength;\n\t}\n\treturn result;\n}\n\ntest(\"Writer u8\", async () => {\n\tconst { stream, written } = createTestWritableStream();\n\tconst writer = new Writer(stream);\n\n\tawait writer.u8(42);\n\tawait writer.u8(255);\n\n\twriter.close();\n\tawait writer.closed;\n\n\texpect(written.length).toBe(2);\n\texpect(written[0]).toEqual(new Uint8Array([42]));\n\texpect(written[1]).toEqual(new Uint8Array([255]));\n});\n\ntest(\"Writer i32\", async () => {\n\tconst { stream, written } = createTestWritableStream();\n\tconst writer = new Writer(stream);\n\n\tawait writer.i32(0);\n\tawait writer.i32(-1);\n\tawait writer.i32(1000);\n\n\twriter.close();\n\tawait writer.closed;\n\n\tconst result = concatChunks(written);\n\texpect(result.byteLength).toBe(12); // 3 * 4 bytes\n\n\t// Read back the values\n\tconst view = new DataView(result.buffer, result.byteOffset, result.byteLength);\n\texpect(view.getInt32(0)).toBe(0);\n\texpect(view.getInt32(4)).toBe(-1);\n\texpect(view.getInt32(8)).toBe(1000);\n});\n\ntest(\"Writer u53\", async () => {\n\tconst { stream, written } = createTestWritableStream();\n\tconst writer = new Writer(stream);\n\n\tawait writer.u53(0);\n\tawait writer.u53(63); // MAX_U6\n\tawait writer.u53(64); // MIN for 2-byte varint\n\tawait writer.u53(16383); // MAX_U14\n\tawait writer.u53(16384); // MIN for 4-byte varint\n\n\twriter.close();\n\tawait writer.closed;\n\n\t// Verify the varint encoding sizes\n\texpect(written[0].byteLength).toBe(1); // 0 fits in 1 byte\n\texpect(written[1].byteLength).toBe(1); // 63 fits in 1 byte\n\texpect(written[2].byteLength).toBe(2); // 64 needs 2 bytes\n\texpect(written[3].byteLength).toBe(2); // 16383 fits in 2 bytes\n\texpect(written[4].byteLength).toBe(4); // 16384 needs 4 bytes\n});\n\ntest(\"Writer string\", async () => {\n\tconst { stream, written } = createTestWritableStream();\n\tconst writer = new Writer(stream);\n\n\tawait writer.string(\"hello\");\n\tawait writer.string(\"🎉\");\n\n\twriter.close();\n\tawait writer.closed;\n\n\tconst result = concatChunks(written);\n\n\t// Create a reader to parse the result\n\tconst reader = new Reader(undefined, result);\n\n\tconst str1 = await reader.string();\n\tconst str2 = await reader.string();\n\n\texpect(str1).toBe(\"hello\");\n\texpect(str2).toBe(\"🎉\");\n});\n\ntest(\"Reader u8\", async () => {\n\tconst data = new Uint8Array([42, 255, 0, 128]);\n\tconst reader = new Reader(undefined, data);\n\n\texpect(await reader.u8()).toBe(42);\n\texpect(await reader.u8()).toBe(255);\n\texpect(await reader.u8()).toBe(0);\n\texpect(await reader.u8()).toBe(128);\n\n\texpect(await reader.done()).toBe(true);\n});\n\ntest(\"Reader read with exact sizes\", async () => {\n\tconst data = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);\n\tconst reader = new Reader(undefined, data);\n\n\tconst chunk1 = await reader.read(3);\n\texpect(chunk1).toEqual(new Uint8Array([1, 2, 3]));\n\n\tconst chunk2 = await reader.read(2);\n\texpect(chunk2).toEqual(new Uint8Array([4, 5]));\n\n\tconst chunk3 = await reader.read(3);\n\texpect(chunk3).toEqual(new Uint8Array([6, 7, 8]));\n\n\texpect(await reader.done()).toBe(true);\n});\n\ntest(\"Reader read with zero size\", async () => {\n\tconst data = new Uint8Array([1, 2, 3]);\n\tconst reader = new Reader(undefined, data);\n\n\tconst chunk = await reader.read(0);\n\texpect(chunk).toEqual(new Uint8Array([]));\n\n\t// Original data should still be available\n\tconst remaining = await reader.read(3);\n\texpect(remaining).toEqual(new Uint8Array([1, 2, 3]));\n});\n\ntest(\"Reader readAll\", async () => {\n\tconst data = new Uint8Array([1, 2, 3, 4, 5]);\n\tconst reader = new Reader(undefined, data);\n\n\t// Read some data first\n\tawait reader.read(2);\n\n\t// readAll should get the remaining data\n\tconst remaining = await reader.readAll();\n\texpect(remaining).toEqual(new Uint8Array([3, 4, 5]));\n\n\texpect(await reader.done()).toBe(true);\n});\n\ntest(\"Reader u53 varint decoding\", async () => {\n\t// Test various varint sizes\n\tconst testValues = [0, 63, 64, 16383, 16384, 1073741823, 1073741824];\n\n\tconst { stream, written } = createTestWritableStream();\n\tconst testWriter = new Writer(stream);\n\n\tfor (const value of testValues) {\n\t\tawait testWriter.u53(value);\n\t}\n\n\ttestWriter.close();\n\tawait testWriter.closed;\n\n\tconst data = concatChunks(written);\n\tconst reader = new Reader(undefined, data);\n\n\tfor (const expectedValue of testValues) {\n\t\tconst actualValue = await reader.u53();\n\t\texpect(actualValue).toBe(expectedValue);\n\t}\n\n\texpect(await reader.done()).toBe(true);\n});\n\ntest(\"Reader u62 varint decoding\", async () => {\n\tconst testValues = [0n, 63n, 64n, 16383n, 16384n, 1073741823n, 1073741824n, 9007199254740991n]; // MAX_U53\n\n\tconst { stream, written } = createTestWritableStream();\n\tconst testWriter = new Writer(stream);\n\n\tfor (const value of testValues) {\n\t\tawait testWriter.u62(value);\n\t}\n\n\ttestWriter.close();\n\tawait testWriter.closed;\n\n\tconst data = concatChunks(written);\n\tconst reader = new Reader(undefined, data);\n\n\tfor (const expectedValue of testValues) {\n\t\tconst actualValue = await reader.u62();\n\t\texpect(actualValue).toBe(expectedValue);\n\t}\n\n\texpect(await reader.done()).toBe(true);\n});\n\ntest(\"Reader string decoding\", async () => {\n\tconst testStrings = [\"hello\", \"🎉\", \"\", \"world with spaces\", \"multi\\nline\\nstring\"];\n\n\tconst { stream, written } = createTestWritableStream();\n\tconst writer = new Writer(stream);\n\n\tfor (const str of testStrings) {\n\t\tawait writer.string(str);\n\t}\n\n\twriter.close();\n\tawait writer.closed;\n\n\tconst data = concatChunks(written);\n\tconst reader = new Reader(undefined, data);\n\n\tfor (const expectedString of testStrings) {\n\t\tconst actualString = await reader.string();\n\t\texpect(actualString).toBe(expectedString);\n\t}\n\n\texpect(await reader.done()).toBe(true);\n});\n\ntest(\"Reader from stream\", async () => {\n\tconst chunks = [new Uint8Array([1, 2, 3]), new Uint8Array([4, 5]), new Uint8Array([6, 7, 8, 9])];\n\n\tconst stream = new ReadableStream({\n\t\tstart(controller) {\n\t\t\tfor (const chunk of chunks) {\n\t\t\t\tcontroller.enqueue(chunk);\n\t\t\t}\n\t\t\tcontroller.close();\n\t\t},\n\t});\n\n\tconst reader = new Reader(stream);\n\n\t// Read all data\n\tconst result = await reader.readAll();\n\texpect(result).toEqual(new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9]));\n});\n\ntest(\"Reader stream with partial reads\", async () => {\n\tconst chunks = [new Uint8Array([1, 2]), new Uint8Array([3, 4, 5]), new Uint8Array([6])];\n\n\tconst stream = new ReadableStream({\n\t\tstart(controller) {\n\t\t\tfor (const chunk of chunks) {\n\t\t\t\tcontroller.enqueue(chunk);\n\t\t\t}\n\t\t\tcontroller.close();\n\t\t},\n\t});\n\n\tconst reader = new Reader(stream);\n\n\t// Read specific amounts that cross chunk boundaries\n\tconst first = await reader.read(3); // Should span first two chunks\n\texpect(first).toEqual(new Uint8Array([1, 2, 3]));\n\n\tconst second = await reader.read(2);\n\texpect(second).toEqual(new Uint8Array([4, 5]));\n\n\tconst third = await reader.read(1);\n\texpect(third).toEqual(new Uint8Array([6]));\n\n\texpect(await reader.done()).toBe(true);\n});\n"]}
package/time.d.ts ADDED
@@ -0,0 +1,109 @@
1
+ /** A duration in nanoseconds, branded so it can't be mixed with other units. */
2
+ export type Nano = number & {
3
+ readonly _brand: "nano";
4
+ };
5
+ /**
6
+ * Constructors, conversions, and arithmetic for {@link Nano} values.
7
+ *
8
+ * Calling `Nano(x)` brands a raw number as nanoseconds. The unit is the caller's
9
+ * assertion: no conversion happens, so reach for `fromMicro`/`fromMilli`/`fromSecond`
10
+ * when the source has a unit.
11
+ */
12
+ export declare const Nano: {
13
+ readonly zero: Nano;
14
+ readonly fromMicro: (us: Micro) => Nano;
15
+ readonly fromMilli: (ms: Milli) => Nano;
16
+ readonly fromSecond: (s: Second) => Nano;
17
+ readonly toMicro: (ns: Nano) => Micro;
18
+ readonly toMilli: (ns: Nano) => Milli;
19
+ readonly toSecond: (ns: Nano) => Second;
20
+ readonly now: () => Nano;
21
+ readonly add: (a: Nano, b: Nano) => Nano;
22
+ readonly sub: (a: Nano, b: Nano) => Nano;
23
+ readonly mul: (a: Nano, b: number) => Nano;
24
+ readonly div: (a: Nano, b: number) => Nano;
25
+ readonly max: (a: Nano, b: Nano) => Nano;
26
+ readonly min: (a: Nano, b: Nano) => Nano;
27
+ };
28
+ /** A duration in microseconds, branded so it can't be mixed with other units. */
29
+ export type Micro = number & {
30
+ readonly _brand: "micro";
31
+ };
32
+ /**
33
+ * Constructors, conversions, and arithmetic for {@link Micro} values.
34
+ *
35
+ * Calling `Micro(x)` brands a raw number as microseconds. This asserts the unit
36
+ * rather than converting, so use `fromNano`/`fromMilli`/`fromSecond` to convert
37
+ * from another unit.
38
+ */
39
+ export declare const Micro: {
40
+ readonly zero: Micro;
41
+ readonly fromNano: (ns: Nano) => Micro;
42
+ readonly fromMilli: (ms: Milli) => Micro;
43
+ readonly fromSecond: (s: Second) => Micro;
44
+ readonly toNano: (us: Micro) => Nano;
45
+ readonly toMilli: (us: Micro) => Milli;
46
+ readonly toSecond: (us: Micro) => Second;
47
+ readonly now: () => Micro;
48
+ readonly add: (a: Micro, b: Micro) => Micro;
49
+ readonly sub: (a: Micro, b: Micro) => Micro;
50
+ readonly mul: (a: Micro, b: number) => Micro;
51
+ readonly div: (a: Micro, b: number) => Micro;
52
+ readonly max: (a: Micro, b: Micro) => Micro;
53
+ readonly min: (a: Micro, b: Micro) => Micro;
54
+ };
55
+ /** A duration in milliseconds, branded so it can't be mixed with other units. */
56
+ export type Milli = number & {
57
+ readonly _brand: "milli";
58
+ };
59
+ /**
60
+ * Constructors, conversions, and arithmetic for {@link Milli} values.
61
+ *
62
+ * Calling `Milli(x)` brands a raw number as milliseconds. This asserts the unit
63
+ * rather than converting, so use `fromNano`/`fromMicro`/`fromSecond` to convert
64
+ * from another unit.
65
+ */
66
+ export declare const Milli: {
67
+ readonly zero: Milli;
68
+ readonly fromNano: (ns: Nano) => Milli;
69
+ readonly fromMicro: (us: Micro) => Milli;
70
+ readonly fromSecond: (s: Second) => Milli;
71
+ readonly toNano: (ms: Milli) => Nano;
72
+ readonly toMicro: (ms: Milli) => Micro;
73
+ readonly toSecond: (ms: Milli) => Second;
74
+ readonly now: () => Milli;
75
+ readonly add: (a: Milli, b: Milli) => Milli;
76
+ readonly sub: (a: Milli, b: Milli) => Milli;
77
+ readonly mul: (a: Milli, b: number) => Milli;
78
+ readonly div: (a: Milli, b: number) => Milli;
79
+ readonly max: (a: Milli, b: Milli) => Milli;
80
+ readonly min: (a: Milli, b: Milli) => Milli;
81
+ };
82
+ /** A duration in seconds, branded so it can't be mixed with other units. */
83
+ export type Second = number & {
84
+ readonly _brand: "second";
85
+ };
86
+ /**
87
+ * Constructors, conversions, and arithmetic for {@link Second} values.
88
+ *
89
+ * Calling `Second(x)` brands a raw number as seconds. This asserts the unit
90
+ * rather than converting, so use `fromNano`/`fromMicro`/`fromMilli` to convert
91
+ * from another unit.
92
+ */
93
+ export declare const Second: {
94
+ readonly zero: Second;
95
+ readonly fromNano: (ns: Nano) => Second;
96
+ readonly fromMicro: (us: Micro) => Second;
97
+ readonly fromMilli: (ms: Milli) => Second;
98
+ readonly toNano: (s: Second) => Nano;
99
+ readonly toMicro: (s: Second) => Micro;
100
+ readonly toMilli: (s: Second) => Milli;
101
+ readonly now: () => Second;
102
+ readonly add: (a: Second, b: Second) => Second;
103
+ readonly sub: (a: Second, b: Second) => Second;
104
+ readonly mul: (a: Second, b: number) => Second;
105
+ readonly div: (a: Second, b: number) => Second;
106
+ readonly max: (a: Second, b: Second) => Second;
107
+ readonly min: (a: Second, b: Second) => Second;
108
+ };
109
+ //# sourceMappingURL=time.d.ts.map
package/time.d.ts.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../src/time.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAExD;;;;;;GAMG;AACH,eAAO,MAAM,IAAI;aAChB,IAAI,EAAO,IAAI;aACf,SAAS,OAAO,KAAK,KAAG,IAAI;aAC5B,SAAS,OAAO,KAAK,KAAG,IAAI;aAC5B,UAAU,MAAM,MAAM,KAAG,IAAI;aAC7B,OAAO,OAAO,IAAI,KAAG,KAAK;aAC1B,OAAO,OAAO,IAAI,KAAG,KAAK;aAC1B,QAAQ,OAAO,IAAI,KAAG,MAAM;aAC5B,GAAG,QAAM,IAAI;aACb,GAAG,MAAM,IAAI,KAAK,IAAI,KAAG,IAAI;aAC7B,GAAG,MAAM,IAAI,KAAK,IAAI,KAAG,IAAI;aAC7B,GAAG,MAAM,IAAI,KAAK,MAAM,KAAG,IAAI;aAC/B,GAAG,MAAM,IAAI,KAAK,MAAM,KAAG,IAAI;aAC/B,GAAG,MAAM,IAAI,KAAK,IAAI,KAAG,IAAI;aAC7B,GAAG,MAAM,IAAI,KAAK,IAAI,KAAG,IAAI;CACpB,CAAC;AAEX,iFAAiF;AACjF,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC;AAE1D;;;;;;GAMG;AACH,eAAO,MAAM,KAAK;aACjB,IAAI,EAAO,KAAK;aAChB,QAAQ,OAAO,IAAI,KAAG,KAAK;aAC3B,SAAS,OAAO,KAAK,KAAG,KAAK;aAC7B,UAAU,MAAM,MAAM,KAAG,KAAK;aAC9B,MAAM,OAAO,KAAK,KAAG,IAAI;aACzB,OAAO,OAAO,KAAK,KAAG,KAAK;aAC3B,QAAQ,OAAO,KAAK,KAAG,MAAM;aAC7B,GAAG,QAAM,KAAK;aACd,GAAG,MAAM,KAAK,KAAK,KAAK,KAAG,KAAK;aAChC,GAAG,MAAM,KAAK,KAAK,KAAK,KAAG,KAAK;aAChC,GAAG,MAAM,KAAK,KAAK,MAAM,KAAG,KAAK;aACjC,GAAG,MAAM,KAAK,KAAK,MAAM,KAAG,KAAK;aACjC,GAAG,MAAM,KAAK,KAAK,KAAK,KAAG,KAAK;aAChC,GAAG,MAAM,KAAK,KAAK,KAAK,KAAG,KAAK;CACvB,CAAC;AAEX,iFAAiF;AACjF,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC;AAE1D;;;;;;GAMG;AACH,eAAO,MAAM,KAAK;aACjB,IAAI,EAAO,KAAK;aAChB,QAAQ,OAAO,IAAI,KAAG,KAAK;aAC3B,SAAS,OAAO,KAAK,KAAG,KAAK;aAC7B,UAAU,MAAM,MAAM,KAAG,KAAK;aAC9B,MAAM,OAAO,KAAK,KAAG,IAAI;aACzB,OAAO,OAAO,KAAK,KAAG,KAAK;aAC3B,QAAQ,OAAO,KAAK,KAAG,MAAM;aAC7B,GAAG,QAAM,KAAK;aACd,GAAG,MAAM,KAAK,KAAK,KAAK,KAAG,KAAK;aAChC,GAAG,MAAM,KAAK,KAAK,KAAK,KAAG,KAAK;aAChC,GAAG,MAAM,KAAK,KAAK,MAAM,KAAG,KAAK;aACjC,GAAG,MAAM,KAAK,KAAK,MAAM,KAAG,KAAK;aACjC,GAAG,MAAM,KAAK,KAAK,KAAK,KAAG,KAAK;aAChC,GAAG,MAAM,KAAK,KAAK,KAAK,KAAG,KAAK;CACvB,CAAC;AAEX,4EAA4E;AAC5E,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAA;CAAE,CAAC;AAE5D;;;;;;GAMG;AACH,eAAO,MAAM,MAAM;aAClB,IAAI,EAAO,MAAM;aACjB,QAAQ,OAAO,IAAI,KAAG,MAAM;aAC5B,SAAS,OAAO,KAAK,KAAG,MAAM;aAC9B,SAAS,OAAO,KAAK,KAAG,MAAM;aAC9B,MAAM,MAAM,MAAM,KAAG,IAAI;aACzB,OAAO,MAAM,MAAM,KAAG,KAAK;aAC3B,OAAO,MAAM,MAAM,KAAG,KAAK;aAC3B,GAAG,QAAM,MAAM;aACf,GAAG,MAAM,MAAM,KAAK,MAAM,KAAG,MAAM;aACnC,GAAG,MAAM,MAAM,KAAK,MAAM,KAAG,MAAM;aACnC,GAAG,MAAM,MAAM,KAAK,MAAM,KAAG,MAAM;aACnC,GAAG,MAAM,MAAM,KAAK,MAAM,KAAG,MAAM;aACnC,GAAG,MAAM,MAAM,KAAK,MAAM,KAAG,MAAM;aACnC,GAAG,MAAM,MAAM,KAAK,MAAM,KAAG,MAAM;CAC1B,CAAC"}
package/time.js ADDED
@@ -0,0 +1,94 @@
1
+ /* @ts-self-types="./time.d.ts" */
2
+ /**
3
+ * Constructors, conversions, and arithmetic for {@link Nano} values.
4
+ *
5
+ * Calling `Nano(x)` brands a raw number as nanoseconds. The unit is the caller's
6
+ * assertion: no conversion happens, so reach for `fromMicro`/`fromMilli`/`fromSecond`
7
+ * when the source has a unit.
8
+ */
9
+ export const Nano = {
10
+ zero: 0,
11
+ fromMicro: (us) => (us * 1_000),
12
+ fromMilli: (ms) => (ms * 1_000_000),
13
+ fromSecond: (s) => (s * 1_000_000_000),
14
+ toMicro: (ns) => (ns / 1_000),
15
+ toMilli: (ns) => (ns / 1_000_000),
16
+ toSecond: (ns) => (ns / 1_000_000_000),
17
+ now: () => (performance.now() * 1_000_000),
18
+ add: (a, b) => (a + b),
19
+ sub: (a, b) => (a - b),
20
+ mul: (a, b) => (a * b),
21
+ div: (a, b) => (a / b),
22
+ max: (a, b) => Math.max(a, b),
23
+ min: (a, b) => Math.min(a, b),
24
+ };
25
+ /**
26
+ * Constructors, conversions, and arithmetic for {@link Micro} values.
27
+ *
28
+ * Calling `Micro(x)` brands a raw number as microseconds. This asserts the unit
29
+ * rather than converting, so use `fromNano`/`fromMilli`/`fromSecond` to convert
30
+ * from another unit.
31
+ */
32
+ export const Micro = {
33
+ zero: 0,
34
+ fromNano: (ns) => (ns / 1_000),
35
+ fromMilli: (ms) => (ms * 1_000),
36
+ fromSecond: (s) => (s * 1_000_000),
37
+ toNano: (us) => (us * 1_000),
38
+ toMilli: (us) => (us / 1_000),
39
+ toSecond: (us) => (us / 1_000_000),
40
+ now: () => (performance.now() * 1_000),
41
+ add: (a, b) => (a + b),
42
+ sub: (a, b) => (a - b),
43
+ mul: (a, b) => (a * b),
44
+ div: (a, b) => (a / b),
45
+ max: (a, b) => Math.max(a, b),
46
+ min: (a, b) => Math.min(a, b),
47
+ };
48
+ /**
49
+ * Constructors, conversions, and arithmetic for {@link Milli} values.
50
+ *
51
+ * Calling `Milli(x)` brands a raw number as milliseconds. This asserts the unit
52
+ * rather than converting, so use `fromNano`/`fromMicro`/`fromSecond` to convert
53
+ * from another unit.
54
+ */
55
+ export const Milli = {
56
+ zero: 0,
57
+ fromNano: (ns) => (ns / 1_000_000),
58
+ fromMicro: (us) => (us / 1_000),
59
+ fromSecond: (s) => (s * 1_000),
60
+ toNano: (ms) => (ms * 1_000_000),
61
+ toMicro: (ms) => (ms * 1_000),
62
+ toSecond: (ms) => (ms / 1_000),
63
+ now: () => performance.now(),
64
+ add: (a, b) => (a + b),
65
+ sub: (a, b) => (a - b),
66
+ mul: (a, b) => (a * b),
67
+ div: (a, b) => (a / b),
68
+ max: (a, b) => Math.max(a, b),
69
+ min: (a, b) => Math.min(a, b),
70
+ };
71
+ /**
72
+ * Constructors, conversions, and arithmetic for {@link Second} values.
73
+ *
74
+ * Calling `Second(x)` brands a raw number as seconds. This asserts the unit
75
+ * rather than converting, so use `fromNano`/`fromMicro`/`fromMilli` to convert
76
+ * from another unit.
77
+ */
78
+ export const Second = {
79
+ zero: 0,
80
+ fromNano: (ns) => (ns / 1_000_000_000),
81
+ fromMicro: (us) => (us / 1_000_000),
82
+ fromMilli: (ms) => (ms / 1_000),
83
+ toNano: (s) => (s * 1_000_000_000),
84
+ toMicro: (s) => (s * 1_000_000),
85
+ toMilli: (s) => (s * 1_000),
86
+ now: () => (performance.now() / 1_000),
87
+ add: (a, b) => (a + b),
88
+ sub: (a, b) => (a - b),
89
+ mul: (a, b) => (a * b),
90
+ div: (a, b) => (a / b),
91
+ max: (a, b) => Math.max(a, b),
92
+ min: (a, b) => Math.min(a, b),
93
+ };
94
+ //# sourceMappingURL=time.js.map
package/time.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time.js","sourceRoot":"","sources":["../src/time.ts"],"names":[],"mappings":"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","sourcesContent":["/** A duration in nanoseconds, branded so it can't be mixed with other units. */\nexport type Nano = number & { readonly _brand: \"nano\" };\n\n/**\n * Constructors, conversions, and arithmetic for {@link Nano} values.\n *\n * Calling `Nano(x)` brands a raw number as nanoseconds. The unit is the caller's\n * assertion: no conversion happens, so reach for `fromMicro`/`fromMilli`/`fromSecond`\n * when the source has a unit.\n */\nexport const Nano = {\n\tzero: 0 as Nano,\n\tfromMicro: (us: Micro): Nano => (us * 1_000) as Nano,\n\tfromMilli: (ms: Milli): Nano => (ms * 1_000_000) as Nano,\n\tfromSecond: (s: Second): Nano => (s * 1_000_000_000) as Nano,\n\ttoMicro: (ns: Nano): Micro => (ns / 1_000) as Micro,\n\ttoMilli: (ns: Nano): Milli => (ns / 1_000_000) as Milli,\n\ttoSecond: (ns: Nano): Second => (ns / 1_000_000_000) as Second,\n\tnow: (): Nano => (performance.now() * 1_000_000) as Nano,\n\tadd: (a: Nano, b: Nano): Nano => (a + b) as Nano,\n\tsub: (a: Nano, b: Nano): Nano => (a - b) as Nano,\n\tmul: (a: Nano, b: number): Nano => (a * b) as Nano,\n\tdiv: (a: Nano, b: number): Nano => (a / b) as Nano,\n\tmax: (a: Nano, b: Nano): Nano => Math.max(a, b) as Nano,\n\tmin: (a: Nano, b: Nano): Nano => Math.min(a, b) as Nano,\n} as const;\n\n/** A duration in microseconds, branded so it can't be mixed with other units. */\nexport type Micro = number & { readonly _brand: \"micro\" };\n\n/**\n * Constructors, conversions, and arithmetic for {@link Micro} values.\n *\n * Calling `Micro(x)` brands a raw number as microseconds. This asserts the unit\n * rather than converting, so use `fromNano`/`fromMilli`/`fromSecond` to convert\n * from another unit.\n */\nexport const Micro = {\n\tzero: 0 as Micro,\n\tfromNano: (ns: Nano): Micro => (ns / 1_000) as Micro,\n\tfromMilli: (ms: Milli): Micro => (ms * 1_000) as Micro,\n\tfromSecond: (s: Second): Micro => (s * 1_000_000) as Micro,\n\ttoNano: (us: Micro): Nano => (us * 1_000) as Nano,\n\ttoMilli: (us: Micro): Milli => (us / 1_000) as Milli,\n\ttoSecond: (us: Micro): Second => (us / 1_000_000) as Second,\n\tnow: (): Micro => (performance.now() * 1_000) as Micro,\n\tadd: (a: Micro, b: Micro): Micro => (a + b) as Micro,\n\tsub: (a: Micro, b: Micro): Micro => (a - b) as Micro,\n\tmul: (a: Micro, b: number): Micro => (a * b) as Micro,\n\tdiv: (a: Micro, b: number): Micro => (a / b) as Micro,\n\tmax: (a: Micro, b: Micro): Micro => Math.max(a, b) as Micro,\n\tmin: (a: Micro, b: Micro): Micro => Math.min(a, b) as Micro,\n} as const;\n\n/** A duration in milliseconds, branded so it can't be mixed with other units. */\nexport type Milli = number & { readonly _brand: \"milli\" };\n\n/**\n * Constructors, conversions, and arithmetic for {@link Milli} values.\n *\n * Calling `Milli(x)` brands a raw number as milliseconds. This asserts the unit\n * rather than converting, so use `fromNano`/`fromMicro`/`fromSecond` to convert\n * from another unit.\n */\nexport const Milli = {\n\tzero: 0 as Milli,\n\tfromNano: (ns: Nano): Milli => (ns / 1_000_000) as Milli,\n\tfromMicro: (us: Micro): Milli => (us / 1_000) as Milli,\n\tfromSecond: (s: Second): Milli => (s * 1_000) as Milli,\n\ttoNano: (ms: Milli): Nano => (ms * 1_000_000) as Nano,\n\ttoMicro: (ms: Milli): Micro => (ms * 1_000) as Micro,\n\ttoSecond: (ms: Milli): Second => (ms / 1_000) as Second,\n\tnow: (): Milli => performance.now() as Milli,\n\tadd: (a: Milli, b: Milli): Milli => (a + b) as Milli,\n\tsub: (a: Milli, b: Milli): Milli => (a - b) as Milli,\n\tmul: (a: Milli, b: number): Milli => (a * b) as Milli,\n\tdiv: (a: Milli, b: number): Milli => (a / b) as Milli,\n\tmax: (a: Milli, b: Milli): Milli => Math.max(a, b) as Milli,\n\tmin: (a: Milli, b: Milli): Milli => Math.min(a, b) as Milli,\n} as const;\n\n/** A duration in seconds, branded so it can't be mixed with other units. */\nexport type Second = number & { readonly _brand: \"second\" };\n\n/**\n * Constructors, conversions, and arithmetic for {@link Second} values.\n *\n * Calling `Second(x)` brands a raw number as seconds. This asserts the unit\n * rather than converting, so use `fromNano`/`fromMicro`/`fromMilli` to convert\n * from another unit.\n */\nexport const Second = {\n\tzero: 0 as Second,\n\tfromNano: (ns: Nano): Second => (ns / 1_000_000_000) as Second,\n\tfromMicro: (us: Micro): Second => (us / 1_000_000) as Second,\n\tfromMilli: (ms: Milli): Second => (ms / 1_000) as Second,\n\ttoNano: (s: Second): Nano => (s * 1_000_000_000) as Nano,\n\ttoMicro: (s: Second): Micro => (s * 1_000_000) as Micro,\n\ttoMilli: (s: Second): Milli => (s * 1_000) as Milli,\n\tnow: (): Second => (performance.now() / 1_000) as Second,\n\tadd: (a: Second, b: Second): Second => (a + b) as Second,\n\tsub: (a: Second, b: Second): Second => (a - b) as Second,\n\tmul: (a: Second, b: number): Second => (a * b) as Second,\n\tdiv: (a: Second, b: number): Second => (a / b) as Second,\n\tmax: (a: Second, b: Second): Second => Math.max(a, b) as Second,\n\tmin: (a: Second, b: Second): Second => Math.min(a, b) as Second,\n} as const;\n"]}
package/track.d.ts ADDED
@@ -0,0 +1,85 @@
1
+ import { Signal } from "@norskvideo/moq-signals";
2
+ import { Group } from "./group";
3
+ /** Reactive backing state for a {@link Track}: buffered groups, a closed flag, and the subscription priority. */
4
+ export declare class TrackState {
5
+ groups: Signal<Group[]>;
6
+ closed: Signal<boolean | Error>;
7
+ priority: Signal<number | undefined>;
8
+ }
9
+ /** A live stream of groups within a broadcast, identified by name. */
10
+ export declare class Track {
11
+ #private;
12
+ /** Name of this track within its broadcast. */
13
+ readonly name: string;
14
+ /** Reactive backing state. */
15
+ state: TrackState;
16
+ /** Resolves with the abort error (or undefined) once closed. */
17
+ readonly closed: Promise<Error | undefined>;
18
+ constructor(name: string);
19
+ /**
20
+ * Appends a new group to the track.
21
+ * @returns A GroupProducer for the new group
22
+ */
23
+ appendGroup(): Group;
24
+ /**
25
+ * Inserts an existing group into the track.
26
+ * @param group - The group to insert
27
+ */
28
+ writeGroup(group: Group): void;
29
+ /**
30
+ * Appends a frame to the track in its own group.
31
+ *
32
+ * @param frame - The frame to append
33
+ */
34
+ writeFrame(frame: Uint8Array): void;
35
+ /** Appends a string to the track as its own single-frame group. */
36
+ writeString(str: string): void;
37
+ /** Appends a JSON value to the track as its own single-frame group. */
38
+ writeJson(json: unknown): void;
39
+ /** Appends a boolean to the track as its own single-frame group. */
40
+ writeBool(bool: boolean): void;
41
+ /**
42
+ * Receive the next group available on this track, in arrival order.
43
+ *
44
+ * Groups may arrive out of order or with gaps due to network conditions.
45
+ * Use {@link nextGroupOrdered} if you need groups in sequence order,
46
+ * skipping those that arrive too late.
47
+ */
48
+ recvGroup(): Promise<Group | undefined>;
49
+ /**
50
+ * @deprecated Use {@link recvGroup} for arrival order, or {@link nextGroupOrdered} for sequence order.
51
+ */
52
+ nextGroup(): Promise<Group | undefined>;
53
+ /**
54
+ * Return the next group with a strictly-greater sequence number than the last returned.
55
+ *
56
+ * Late arrivals (with a sequence number at or below the last one returned) are silently skipped.
57
+ *
58
+ * NOTE: This will be renamed to `nextGroup` in the next major version.
59
+ */
60
+ nextGroupOrdered(): Promise<Group | undefined>;
61
+ /** Reads the next frame across all groups, discarding older groups. */
62
+ readFrame(): Promise<Uint8Array | undefined>;
63
+ /** Reads the next frame along with its group and frame sequence numbers. */
64
+ readFrameSequence(): Promise<{
65
+ group: number;
66
+ frame: number;
67
+ data: Uint8Array;
68
+ } | undefined>;
69
+ /** Reads the next frame and decodes it as a UTF-8 string. */
70
+ readString(): Promise<string | undefined>;
71
+ /** Reads the next frame and parses it as JSON. */
72
+ readJson(): Promise<unknown | undefined>;
73
+ /** Reads the next frame and decodes it as a one-byte boolean, throwing on a malformed frame. */
74
+ readBool(): Promise<boolean | undefined>;
75
+ /**
76
+ * Update the subscription priority. Triggers a SUBSCRIBE_UPDATE
77
+ * to the publisher when used on a subscribed track.
78
+ */
79
+ updatePriority(priority: number): void;
80
+ /**
81
+ * Closes the publisher and all associated groups.
82
+ */
83
+ close(abort?: Error): void;
84
+ }
85
+ //# sourceMappingURL=track.d.ts.map
package/track.d.ts.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"track.d.ts","sourceRoot":"","sources":["../src/track.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,iHAAiH;AACjH,qBAAa,UAAU;IACtB,MAAM,kBAA2B;IACjC,MAAM,0BAAsC;IAC5C,QAAQ,6BAA6C;CACrD;AAED,sEAAsE;AACtE,qBAAa,KAAK;;IACjB,+CAA+C;IAC/C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,8BAA8B;IAC9B,KAAK,aAAoB;IAIzB,gEAAgE;IAChE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC;IAE5C,YAAY,IAAI,EAAE,MAAM,EAUvB;IAED;;;OAGG;IACH,WAAW,IAAI,KAAK,CAYnB;IAED;;;OAGG;IACH,UAAU,CAAC,KAAK,EAAE,KAAK,QAYtB;IAED;;;;OAIG;IACH,UAAU,CAAC,KAAK,EAAE,UAAU,QAI3B;IAED,mEAAmE;IACnE,WAAW,CAAC,GAAG,EAAE,MAAM,QAItB;IAED,uEAAuE;IACvE,SAAS,CAAC,IAAI,EAAE,OAAO,QAItB;IAED,oEAAoE;IACpE,SAAS,CAAC,IAAI,EAAE,OAAO,QAItB;IAED;;;;;;OAMG;IACG,SAAS,IAAI,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAa5C;IAED;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAE5C;IAED;;;;;;OAMG;IACG,gBAAgB,IAAI,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAWnD;IAED,uEAAuE;IACjE,SAAS,IAAI,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAEjD;IAED,4EAA4E;IACtE,iBAAiB,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,UAAU,CAAA;KAAE,GAAG,SAAS,CAAC,CA8CjG;IAED,6DAA6D;IACvD,UAAU,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAI9C;IAED,kDAAkD;IAC5C,QAAQ,IAAI,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAI7C;IAED,gGAAgG;IAC1F,QAAQ,IAAI,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAK7C;IAED;;;OAGG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,QAE9B;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,QAMlB;CACD"}