@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.test.js","sourceRoot":"","sources":["../src/path.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, test } from \"bun:test\";\nimport * as Path from \"./path.ts\";\n\ntest(\"Path constructor trims leading and trailing slashes\", () => {\n\texpect(Path.from(\"/foo/bar/\")).toBe(\"foo/bar\" as Path.Valid);\n\texpect(Path.from(\"///foo/bar///\")).toBe(\"foo/bar\" as Path.Valid);\n\texpect(Path.from(\"foo/bar\")).toBe(\"foo/bar\" as Path.Valid);\n});\n\ntest(\"Path constructor handles empty paths\", () => {\n\texpect(Path.from(\"\")).toBe(\"\" as Path.Valid);\n\texpect(Path.from(\"/\")).toBe(\"\" as Path.Valid);\n\texpect(Path.from(\"///\")).toBe(\"\" as Path.Valid);\n});\n\ntest(\"hasPrefix matches exact paths\", () => {\n\tconst path = Path.from(\"foo/bar\");\n\texpect(Path.hasPrefix(Path.from(\"foo/bar\"), path)).toBe(true);\n});\n\ntest(\"hasPrefix matches proper prefixes\", () => {\n\tconst path = Path.from(\"foo/bar/baz\");\n\texpect(Path.hasPrefix(Path.from(\"foo\"), path)).toBe(true);\n\texpect(Path.hasPrefix(Path.from(\"foo/bar\"), path)).toBe(true);\n});\n\ntest(\"hasPrefix does not match partial segment prefixes\", () => {\n\tconst path = Path.from(\"foobar\");\n\texpect(Path.hasPrefix(Path.from(\"foo\"), path)).toBe(false);\n\n\tconst path2 = Path.from(\"foo/bar\");\n\texpect(Path.hasPrefix(Path.from(\"fo\"), path2)).toBe(false);\n});\n\ntest(\"hasPrefix handles empty prefix\", () => {\n\tconst path = Path.from(\"foo/bar\");\n\texpect(Path.hasPrefix(Path.empty(), path)).toBe(true);\n});\n\ntest(\"hasPrefix ignores trailing slashes in prefix\", () => {\n\tconst path = Path.from(\"foo/bar\");\n\texpect(Path.hasPrefix(Path.from(\"foo/\"), path)).toBe(true);\n\texpect(Path.hasPrefix(Path.from(\"foo/bar/\"), path)).toBe(true);\n});\n\ntest(\"stripPrefix strips valid prefixes\", () => {\n\tconst path = Path.from(\"foo/bar/baz\");\n\n\tconst suffix1 = Path.stripPrefix(Path.from(\"foo\"), path);\n\texpect(suffix1).toBe(\"bar/baz\" as Path.Valid);\n\n\tconst suffix2 = Path.stripPrefix(Path.from(\"foo/bar\"), path);\n\texpect(suffix2).toBe(\"baz\" as Path.Valid);\n\n\tconst suffix3 = Path.stripPrefix(Path.from(\"foo/bar/baz\"), path);\n\texpect(suffix3).toBe(\"\" as Path.Valid);\n});\n\ntest(\"stripPrefix returns null for invalid prefixes\", () => {\n\tconst path = Path.from(\"foo/bar\");\n\texpect(Path.stripPrefix(Path.from(\"notfound\"), path)).toBe(null);\n\texpect(Path.stripPrefix(Path.from(\"fo\"), path)).toBe(null);\n});\n\ntest(\"stripPrefix handles empty prefix\", () => {\n\tconst path = Path.from(\"foo/bar\");\n\tconst result = Path.stripPrefix(Path.empty(), path);\n\texpect(result).toBe(\"foo/bar\" as Path.Valid);\n});\n\ntest(\"stripPrefix accepts Path instances\", () => {\n\tconst path = Path.from(\"foo/bar/baz\");\n\tconst prefix = Path.from(\"foo/bar\");\n\tconst result = Path.stripPrefix(prefix, path);\n\texpect(result).toBe(\"baz\" as Path.Valid);\n});\n\ntest(\"join paths with slashes\", () => {\n\tconst base = Path.from(\"foo\");\n\tconst joined = Path.join(base, Path.from(\"bar\"));\n\texpect(joined).toBe(\"foo/bar\" as Path.Valid);\n});\n\ntest(\"join handles empty base\", () => {\n\tconst base = Path.empty();\n\tconst joined = Path.join(base, Path.from(\"bar\"));\n\texpect(joined).toBe(\"bar\" as Path.Valid);\n});\n\ntest(\"join handles empty suffix\", () => {\n\tconst base = Path.from(\"foo\");\n\tconst joined = Path.join(base, Path.empty());\n\texpect(joined).toBe(\"foo\" as Path.Valid);\n});\n\ntest(\"join accepts Path instances\", () => {\n\tconst base = Path.from(\"foo\");\n\tconst suffix = Path.from(\"bar\");\n\tconst joined = Path.join(base, suffix);\n\texpect(joined).toBe(\"foo/bar\" as Path.Valid);\n});\n\ntest(\"join handles multiple joins\", () => {\n\tconst path = Path.join(\n\t\tPath.join(Path.join(Path.from(\"api\"), Path.from(\"v1\")), Path.from(\"users\")),\n\t\tPath.from(\"123\"),\n\t);\n\texpect(path).toBe(\"api/v1/users/123\" as Path.Valid);\n});\n\ntest(\"isEmpty checks correctly\", () => {\n\texpect(Path.from(\"\") === \"\").toBe(true);\n\texpect(Path.from(\"foo\") === \"\").toBe(false);\n\texpect(Path.empty() === \"\").toBe(true);\n});\n\ntest(\"length property works correctly\", () => {\n\texpect(Path.from(\"foo\").length).toBe(3);\n\texpect(Path.from(\"foo/bar\").length).toBe(7);\n\texpect(Path.empty().length).toBe(0);\n});\n\ntest(\"equals checks correctly\", () => {\n\tconst path1 = Path.from(\"foo/bar\");\n\tconst path2 = Path.from(\"/foo/bar/\");\n\tconst path3 = Path.from(\"foo/baz\");\n\n\texpect(path1 === path2).toBe(true);\n\texpect(path1 === path3).toBe(false);\n});\n\ntest(\"JSON serialization works\", () => {\n\tconst path = Path.from(\"foo/bar\");\n\texpect(JSON.stringify(path)).toBe('\"foo/bar\"');\n});\n\ntest(\"handles paths with multiple consecutive slashes\", () => {\n\tconst path = Path.from(\"foo//bar///baz\");\n\t// Multiple consecutive slashes are collapsed to single slashes\n\texpect(path).toBe(\"foo/bar/baz\" as Path.Valid);\n});\n\ntest(\"removes multiple slashes comprehensively\", () => {\n\t// Test various multiple slash scenarios\n\texpect(Path.from(\"foo//bar\")).toBe(\"foo/bar\" as Path.Valid);\n\texpect(Path.from(\"foo///bar\")).toBe(\"foo/bar\" as Path.Valid);\n\texpect(Path.from(\"foo////bar\")).toBe(\"foo/bar\" as Path.Valid);\n\n\t// Multiple occurrences of double slashes\n\texpect(Path.from(\"foo//bar//baz\")).toBe(\"foo/bar/baz\" as Path.Valid);\n\texpect(Path.from(\"a//b//c//d\")).toBe(\"a/b/c/d\" as Path.Valid);\n\n\t// Mixed slash counts\n\texpect(Path.from(\"foo//bar///baz////qux\")).toBe(\"foo/bar/baz/qux\" as Path.Valid);\n\n\t// With leading and trailing slashes\n\texpect(Path.from(\"//foo//bar//\")).toBe(\"foo/bar\" as Path.Valid);\n\texpect(Path.from(\"///foo///bar///\")).toBe(\"foo/bar\" as Path.Valid);\n\n\t// Edge case: only slashes\n\texpect(Path.from(\"//\")).toBe(\"\" as Path.Valid);\n\texpect(Path.from(\"////\")).toBe(\"\" as Path.Valid);\n\n\t// Test that operations work correctly with normalized paths\n\tconst pathWithSlashes = Path.from(\"foo//bar///baz\");\n\texpect(Path.hasPrefix(Path.from(\"foo/bar\"), pathWithSlashes)).toBe(true);\n\texpect(Path.stripPrefix(Path.from(\"foo\"), pathWithSlashes)).toBe(\"bar/baz\" as Path.Valid);\n\texpect(Path.join(pathWithSlashes, Path.from(\"qux\"))).toBe(\"foo/bar/baz/qux\" as Path.Valid);\n});\n\ntest(\"handles special characters\", () => {\n\tconst path = Path.from(\"foo-bar_baz.txt\");\n\texpect(path).toBe(\"foo-bar_baz.txt\" as Path.Valid);\n\texpect(Path.hasPrefix(Path.from(\"foo-bar\"), path)).toBe(false);\n\texpect(Path.hasPrefix(Path.from(\"foo-bar_baz.txt\"), path)).toBe(true);\n});\n\ntest(\"from accepts multiple arguments\", () => {\n\texpect(Path.from(\"foo\", \"bar\", \"baz\")).toBe(\"foo/bar/baz\" as Path.Valid);\n\texpect(Path.from(\"api\", \"v1\", \"users\")).toBe(\"api/v1/users\" as Path.Valid);\n});\n\ntest(\"from handles empty strings in arguments\", () => {\n\texpect(Path.from(\"foo\", \"\", \"bar\")).toBe(\"foo/bar\" as Path.Valid);\n\texpect(Path.from(\"\", \"foo\", \"bar\", \"\")).toBe(\"foo/bar\" as Path.Valid);\n});\n\ntest(\"from sanitizes multiple arguments with slashes\", () => {\n\texpect(Path.from(\"/foo/\", \"/bar/\", \"/baz/\")).toBe(\"foo/bar/baz\" as Path.Valid);\n\texpect(Path.from(\"foo//\", \"//bar\", \"baz\")).toBe(\"foo/bar/baz\" as Path.Valid);\n});\n\ntest(\"parts splits a path into its components\", () => {\n\texpect(Path.parts(Path.from(\"\"))).toEqual([]);\n\texpect(Path.parts(Path.from(\"foo\"))).toEqual([\"foo\"]);\n\texpect(Path.parts(Path.from(\"/foo//bar/\"))).toEqual([\"foo\", \"bar\"]);\n});\n\ntest(\"decode enforces the max part count\", () => {\n\tconst atLimit = Array.from({ length: Path.MAX_PARTS }, (_, i) => `${i}`).join(\"/\");\n\texpect(Path.decode(atLimit)).toBe(atLimit as Path.Valid);\n\texpect(() => Path.decode(`${atLimit}/extra`)).toThrow();\n});\n\ntest(\"encode enforces the max part count\", () => {\n\tconst atLimit = Array.from({ length: Path.MAX_PARTS }, (_, i) => `${i}`).join(\"/\") as Path.Valid;\n\texpect(Path.encode(atLimit)).toBe(atLimit);\n\texpect(() => Path.encode(`${atLimit}/extra` as Path.Valid)).toThrow();\n});\n"]}
package/stream.d.ts ADDED
@@ -0,0 +1,57 @@
1
+ import type { IetfVersion } from "./ietf/version";
2
+ export declare class Stream {
3
+ reader: Reader;
4
+ writer: Writer;
5
+ constructor(props: {
6
+ writable: WritableStream<Uint8Array>;
7
+ readable: ReadableStream<Uint8Array>;
8
+ writer?: Writer;
9
+ reader?: Reader;
10
+ version?: IetfVersion;
11
+ });
12
+ static accept(quic: WebTransport, version?: IetfVersion): Promise<Stream | undefined>;
13
+ static open(quic: WebTransport, version?: IetfVersion, priority?: number): Promise<Stream>;
14
+ close(): void;
15
+ abort(reason: Error): void;
16
+ }
17
+ export declare class Reader {
18
+ #private;
19
+ version?: IetfVersion;
20
+ constructor(stream: ReadableStream<Uint8Array>, buffer?: Uint8Array, version?: IetfVersion);
21
+ constructor(stream: undefined, buffer: Uint8Array, version?: IetfVersion);
22
+ read(size: number): Promise<Uint8Array>;
23
+ readAll(): Promise<Uint8Array>;
24
+ string(): Promise<string>;
25
+ bool(): Promise<boolean>;
26
+ u8(): Promise<number>;
27
+ u16(): Promise<number>;
28
+ u53(): Promise<number>;
29
+ u62(): Promise<bigint>;
30
+ done(): Promise<boolean>;
31
+ stop(reason: unknown): void;
32
+ get closed(): Promise<void>;
33
+ }
34
+ export declare class Writer {
35
+ #private;
36
+ version?: IetfVersion;
37
+ constructor(stream: WritableStream<Uint8Array>, version?: IetfVersion);
38
+ bool(v: boolean): Promise<void>;
39
+ u8(v: number): Promise<void>;
40
+ u16(v: number): Promise<void>;
41
+ i32(v: number): Promise<void>;
42
+ u53(v: number): Promise<void>;
43
+ u62(v: bigint): Promise<void>;
44
+ write(v: Uint8Array): Promise<void>;
45
+ string(str: string): Promise<void>;
46
+ close(): void;
47
+ get closed(): Promise<void>;
48
+ reset(reason: unknown): void;
49
+ static open(quic: WebTransport, version?: IetfVersion): Promise<Writer>;
50
+ }
51
+ export declare class Readers {
52
+ #private;
53
+ constructor(quic: WebTransport, version?: IetfVersion);
54
+ next(): Promise<Reader | undefined>;
55
+ close(): void;
56
+ }
57
+ //# sourceMappingURL=stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"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"}
package/stream.js ADDED
@@ -0,0 +1,326 @@
1
+ /* @ts-self-types="./stream.d.ts" */
2
+ import { Version } from "./ietf/version.js";
3
+ import * as Varint from "./varint.js";
4
+ const MAX_U31 = 2 ** 31 - 1;
5
+ const MAX_READ_SIZE = 1024 * 1024 * 64; // don't allocate more than 64MB for a message
6
+ function isLeadingOnes(version) {
7
+ return (version !== undefined &&
8
+ version !== Version.DRAFT_14 &&
9
+ version !== Version.DRAFT_15 &&
10
+ version !== Version.DRAFT_16);
11
+ }
12
+ export class Stream {
13
+ reader;
14
+ writer;
15
+ constructor(props) {
16
+ this.writer = props.writer ?? new Writer(props.writable, props.version);
17
+ this.reader = props.reader ?? new Reader(props.readable, undefined, props.version);
18
+ }
19
+ static async accept(quic, version) {
20
+ for (;;) {
21
+ const reader = quic.incomingBidirectionalStreams.getReader();
22
+ const next = await reader.read();
23
+ reader.releaseLock();
24
+ if (next.done)
25
+ return;
26
+ const { readable, writable } = next.value;
27
+ return new Stream({ readable, writable, version });
28
+ }
29
+ }
30
+ static async open(quic, version, priority) {
31
+ const { readable, writable } = await quic.createBidirectionalStream({ sendOrder: priority });
32
+ return new Stream({ readable, writable, version });
33
+ }
34
+ close() {
35
+ this.writer.close();
36
+ this.reader.stop(new Error("cancel"));
37
+ }
38
+ abort(reason) {
39
+ this.writer.reset(reason);
40
+ this.reader.stop(reason);
41
+ }
42
+ }
43
+ // Reader wraps a stream and provides convience methods for reading pieces from a stream
44
+ // Unfortunately we can't use a BYOB reader because it's not supported with WebTransport+WebWorkers yet.
45
+ export class Reader {
46
+ #buffer;
47
+ #stream; // if undefined, the buffer is consumed then EOF
48
+ #reader;
49
+ version;
50
+ constructor(stream, buffer, version) {
51
+ this.#buffer = buffer ?? new Uint8Array();
52
+ this.#stream = stream;
53
+ this.#reader = this.#stream?.getReader();
54
+ this.version = version;
55
+ }
56
+ // Adds more data to the buffer, returning true if more data was added.
57
+ async #fill() {
58
+ if (!this.#reader) {
59
+ return false;
60
+ }
61
+ const result = await this.#reader.read();
62
+ if (result.done) {
63
+ return false;
64
+ }
65
+ if (result.value.byteLength === 0) {
66
+ throw new Error("unexpected empty chunk");
67
+ }
68
+ const buffer = new Uint8Array(result.value);
69
+ if (this.#buffer.byteLength === 0) {
70
+ this.#buffer = buffer;
71
+ }
72
+ else {
73
+ const temp = new Uint8Array(this.#buffer.byteLength + buffer.byteLength);
74
+ temp.set(this.#buffer);
75
+ temp.set(buffer, this.#buffer.byteLength);
76
+ this.#buffer = temp;
77
+ }
78
+ return true;
79
+ }
80
+ // Add more data to the buffer until it's at least size bytes.
81
+ async #fillTo(size) {
82
+ if (size > MAX_READ_SIZE) {
83
+ throw new Error(`read size ${size} exceeds max size ${MAX_READ_SIZE}`);
84
+ }
85
+ while (this.#buffer.byteLength < size) {
86
+ if (!(await this.#fill())) {
87
+ throw new Error("unexpected end of stream");
88
+ }
89
+ }
90
+ }
91
+ // Consumes the first size bytes of the buffer.
92
+ #slice(size) {
93
+ const result = new Uint8Array(this.#buffer.buffer, this.#buffer.byteOffset, size);
94
+ this.#buffer = new Uint8Array(this.#buffer.buffer, this.#buffer.byteOffset + size, this.#buffer.byteLength - size);
95
+ return result;
96
+ }
97
+ async read(size) {
98
+ if (size === 0)
99
+ return new Uint8Array();
100
+ await this.#fillTo(size);
101
+ return this.#slice(size);
102
+ }
103
+ async readAll() {
104
+ while (await this.#fill()) {
105
+ // keep going
106
+ }
107
+ return this.#slice(this.#buffer.byteLength);
108
+ }
109
+ async string() {
110
+ const length = await this.u53();
111
+ const buffer = await this.read(length);
112
+ return new TextDecoder().decode(buffer);
113
+ }
114
+ async bool() {
115
+ const v = await this.u8();
116
+ if (v === 0)
117
+ return false;
118
+ if (v === 1)
119
+ return true;
120
+ throw new Error("invalid bool value");
121
+ }
122
+ async u8() {
123
+ await this.#fillTo(1);
124
+ return this.#slice(1)[0];
125
+ }
126
+ async u16() {
127
+ await this.#fillTo(2);
128
+ const view = new DataView(this.#buffer.buffer, this.#buffer.byteOffset, 2);
129
+ const result = view.getUint16(0);
130
+ this.#slice(2);
131
+ return result;
132
+ }
133
+ // Returns a Number using 53-bits, the max Javascript can use for integer math.
134
+ // Values > 2^53-1 are coerced to a Number (precision is lost) and logged. We
135
+ // downgrade overflow from throw to warn so a stray u64 field on the wire (e.g.
136
+ // a peer's session-level Origin id) doesn't tear down the whole stream/session.
137
+ async u53() {
138
+ const v = await this.u62();
139
+ if (v > Varint.MAX_U53) {
140
+ console.warn(`value larger than 53-bits; use u62 instead (precision lost): ${v.toString()}`);
141
+ }
142
+ return Number(v);
143
+ }
144
+ // NOTE: Returns a bigint instead of a number since it may be larger than 53-bits
145
+ async u62() {
146
+ if (isLeadingOnes(this.version)) {
147
+ return this.#readLeadingOnes();
148
+ }
149
+ return this.#readQuicVarint();
150
+ }
151
+ async #readQuicVarint() {
152
+ await this.#fillTo(1);
153
+ const size = (this.#buffer[0] & 0xc0) >> 6;
154
+ if (size === 0) {
155
+ const first = this.#slice(1)[0];
156
+ return BigInt(first) & 0x3fn;
157
+ }
158
+ if (size === 1) {
159
+ await this.#fillTo(2);
160
+ const slice = this.#slice(2);
161
+ const view = new DataView(slice.buffer, slice.byteOffset, slice.byteLength);
162
+ return BigInt(view.getUint16(0)) & 0x3fffn;
163
+ }
164
+ if (size === 2) {
165
+ await this.#fillTo(4);
166
+ const slice = this.#slice(4);
167
+ const view = new DataView(slice.buffer, slice.byteOffset, slice.byteLength);
168
+ return BigInt(view.getUint32(0)) & 0x3fffffffn;
169
+ }
170
+ await this.#fillTo(8);
171
+ const slice = this.#slice(8);
172
+ const view = new DataView(slice.buffer, slice.byteOffset, slice.byteLength);
173
+ return view.getBigUint64(0) & 0x3fffffffffffffffn;
174
+ }
175
+ async #readLeadingOnes() {
176
+ await this.#fillTo(1);
177
+ const b = this.#buffer[0];
178
+ // Count leading 1-bits
179
+ let ones = 0;
180
+ for (let bit = 7; bit >= 0; bit--) {
181
+ if (b & (1 << bit))
182
+ ones++;
183
+ else
184
+ break;
185
+ }
186
+ // 1111110x is a 7-byte form. Draft-17 rejects it; draft-18+ allows it per #1595.
187
+ if (ones === 6 && this.version === Version.DRAFT_17) {
188
+ throw new Error("invalid leading-ones varint: 1111110x prefix is reserved on draft-17");
189
+ }
190
+ let totalSize;
191
+ if (ones <= 5)
192
+ totalSize = ones + 1;
193
+ else if (ones === 6)
194
+ totalSize = 7;
195
+ else if (ones === 7)
196
+ totalSize = 8;
197
+ else
198
+ totalSize = 9; // ones === 8
199
+ await this.#fillTo(totalSize);
200
+ const slice = this.#slice(totalSize);
201
+ const [value] = Varint.decodeLeadingOnes(slice);
202
+ return value;
203
+ }
204
+ // Returns false if there is more data to read, blocking if it hasn't been received yet.
205
+ async done() {
206
+ if (this.#buffer.byteLength > 0)
207
+ return false;
208
+ return !(await this.#fill());
209
+ }
210
+ stop(reason) {
211
+ this.#reader?.cancel(reason).catch(() => void 0);
212
+ }
213
+ get closed() {
214
+ return this.#reader?.closed ?? Promise.resolve();
215
+ }
216
+ }
217
+ // Writer wraps a stream and writes chunks of data
218
+ export class Writer {
219
+ #writer;
220
+ #stream;
221
+ // Scratch buffer for writing varints.
222
+ // Fixed at 9 bytes (leading-ones max).
223
+ #scratch;
224
+ version;
225
+ constructor(stream, version) {
226
+ this.#stream = stream;
227
+ this.#scratch = new ArrayBuffer(9);
228
+ this.#writer = this.#stream.getWriter();
229
+ this.version = version;
230
+ }
231
+ async bool(v) {
232
+ await this.write(setUint8(this.#scratch, v ? 1 : 0));
233
+ }
234
+ async u8(v) {
235
+ await this.write(setUint8(this.#scratch, v));
236
+ }
237
+ async u16(v) {
238
+ await this.write(setUint16(this.#scratch, v));
239
+ }
240
+ async i32(v) {
241
+ if (Math.abs(v) > MAX_U31) {
242
+ throw new Error(`overflow, value larger than 32-bits: ${v.toString()}`);
243
+ }
244
+ // We don't use a VarInt, so it always takes 4 bytes.
245
+ // This could be improved but nothing is standardized yet.
246
+ await this.write(setInt32(this.#scratch, v));
247
+ }
248
+ async u53(v) {
249
+ if (v > Varint.MAX_U53) {
250
+ // Number values above 2^53-1 have already lost precision before reaching
251
+ // the wire, but downgrade overflow to warn so an upstream miscount
252
+ // doesn't tear down the whole stream. The encoded varint will reflect
253
+ // the truncated Number value.
254
+ console.warn(`value larger than 53-bits; use u62 instead (precision lost): ${v.toString()}`);
255
+ }
256
+ if (isLeadingOnes(this.version)) {
257
+ await this.write(Varint.encodeLeadingOnesTo(this.#scratch, v));
258
+ }
259
+ else {
260
+ await this.write(Varint.encodeTo(this.#scratch, v));
261
+ }
262
+ }
263
+ async u62(v) {
264
+ if (isLeadingOnes(this.version)) {
265
+ await this.write(Varint.encodeLeadingOnesTo(this.#scratch, v));
266
+ }
267
+ else {
268
+ await this.write(Varint.encodeTo(this.#scratch, v));
269
+ }
270
+ }
271
+ async write(v) {
272
+ await this.#writer.write(v);
273
+ }
274
+ async string(str) {
275
+ const data = new TextEncoder().encode(str);
276
+ await this.u53(data.byteLength);
277
+ await this.write(data);
278
+ }
279
+ close() {
280
+ this.#writer.close().catch(() => void 0);
281
+ }
282
+ get closed() {
283
+ return this.#writer.closed;
284
+ }
285
+ reset(reason) {
286
+ this.#writer.abort(reason).catch(() => void 0);
287
+ }
288
+ static async open(quic, version) {
289
+ const writable = (await quic.createUnidirectionalStream());
290
+ return new Writer(writable, version);
291
+ }
292
+ }
293
+ function setUint8(dst, v) {
294
+ const buffer = new Uint8Array(dst, 0, 1);
295
+ buffer[0] = v;
296
+ return buffer;
297
+ }
298
+ function setUint16(dst, v) {
299
+ const view = new DataView(dst, 0, 2);
300
+ view.setUint16(0, v);
301
+ return new Uint8Array(view.buffer, view.byteOffset, view.byteLength);
302
+ }
303
+ function setInt32(dst, v) {
304
+ const view = new DataView(dst, 0, 4);
305
+ view.setInt32(0, v);
306
+ return new Uint8Array(view.buffer, view.byteOffset, view.byteLength);
307
+ }
308
+ // Returns the next stream from the connection
309
+ export class Readers {
310
+ #reader;
311
+ #version;
312
+ constructor(quic, version) {
313
+ this.#reader = quic.incomingUnidirectionalStreams.getReader();
314
+ this.#version = version;
315
+ }
316
+ async next() {
317
+ const next = await this.#reader.read();
318
+ if (next.done)
319
+ return;
320
+ return new Reader(next.value, undefined, this.#version);
321
+ }
322
+ close() {
323
+ this.#reader.cancel();
324
+ }
325
+ }
326
+ //# sourceMappingURL=stream.js.map
package/stream.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.js","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAEtC,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AAC5B,MAAM,aAAa,GAAG,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC,8CAA8C;AAEtF,SAAS,aAAa,CAAC,OAAqB;IAC3C,OAAO,CACN,OAAO,KAAK,SAAS;QACrB,OAAO,KAAK,OAAO,CAAC,QAAQ;QAC5B,OAAO,KAAK,OAAO,CAAC,QAAQ;QAC5B,OAAO,KAAK,OAAO,CAAC,QAAQ,CAC5B,CAAC;AACH,CAAC;AAED,MAAM,OAAO,MAAM;IAClB,MAAM,CAAS;IACf,MAAM,CAAS;IAEf,YAAY,KAMX;QACA,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACxE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACpF,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAkB,EAAE,OAAqB;QAC5D,SAAS,CAAC;YACT,MAAM,MAAM,GACX,IAAI,CAAC,4BAA4B,CAAC,SAAS,EAAkE,CAAC;YAC/G,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACjC,MAAM,CAAC,WAAW,EAAE,CAAC;YAErB,IAAI,IAAI,CAAC,IAAI;gBAAE,OAAO;YACtB,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;YAC1C,OAAO,IAAI,MAAM,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QACpD,CAAC;IACF,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAkB,EAAE,OAAqB,EAAE,QAAiB;QAC7E,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC7F,OAAO,IAAI,MAAM,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,KAAK;QACJ,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACpB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,MAAa;QAClB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;CACD;AAED,wFAAwF;AACxF,wGAAwG;AACxG,MAAM,OAAO,MAAM;IAClB,OAAO,CAAa;IACpB,OAAO,CAA8B,CAAC,gDAAgD;IACtF,OAAO,CAA2C;IAClD,OAAO,CAAe;IAKtB,YAAY,MAAmC,EAAE,MAAmB,EAAE,OAAqB;QAC1F,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC1C,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;QACzC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACxB,CAAC;IAED,uEAAuE;IACvE,KAAK,CAAC,KAAK;QACV,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,KAAK,CAAC;QACd,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACzC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,KAAK,CAAC;QACd,CAAC;QAED,IAAI,MAAM,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC3C,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAE5C,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACvB,CAAC;aAAM,CAAC;YACP,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;YACzE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAC1C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACrB,CAAC;QAED,OAAO,IAAI,CAAC;IACb,CAAC;IAED,8DAA8D;IAC9D,KAAK,CAAC,OAAO,CAAC,IAAY;QACzB,IAAI,IAAI,GAAG,aAAa,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,aAAa,IAAI,qBAAqB,aAAa,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,IAAI,EAAE,CAAC;YACvC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC7C,CAAC;QACF,CAAC;IACF,CAAC;IAED,+CAA+C;IAC/C,MAAM,CAAC,IAAY;QAClB,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAClF,IAAI,CAAC,OAAO,GAAG,IAAI,UAAU,CAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,EACnB,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,IAAI,EAC9B,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,IAAI,CAC9B,CAAC;QAEF,OAAO,MAAM,CAAC;IACf,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAY;QACtB,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,IAAI,UAAU,EAAE,CAAC;QAExC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,OAAO;QACZ,OAAO,MAAM,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;YAC3B,aAAa;QACd,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,MAAM;QACX,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvC,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,IAAI;QACT,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,EAAE,EAAE,CAAC;QAC1B,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAC1B,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,EAAE;QACP,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACtB,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,GAAG;QACR,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAC3E,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACf,OAAO,MAAM,CAAC;IACf,CAAC;IAED,+EAA+E;IAC/E,6EAA6E;IAC7E,+EAA+E;IAC/E,gFAAgF;IAChF,KAAK,CAAC,GAAG;QACR,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3B,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC9F,CAAC;QAED,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,iFAAiF;IACjF,KAAK,CAAC,GAAG;QACR,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAChC,CAAC;QACD,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,eAAe;QACpB,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QAE3C,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YAChB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAChC,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;QAC9B,CAAC;QACD,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YAChB,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;YAE5E,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;QAC5C,CAAC;QACD,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YAChB,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;YAE5E,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC;QAChD,CAAC;QACD,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QAE5E,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,gBAAgB;QACrB,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAE1B,uBAAuB;QACvB,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;YACnC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC;gBAAE,IAAI,EAAE,CAAC;;gBACtB,MAAM;QACZ,CAAC;QAED,iFAAiF;QACjF,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrD,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;QACzF,CAAC;QAED,IAAI,SAAiB,CAAC;QACtB,IAAI,IAAI,IAAI,CAAC;YAAE,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC;aAC/B,IAAI,IAAI,KAAK,CAAC;YAAE,SAAS,GAAG,CAAC,CAAC;aAC9B,IAAI,IAAI,KAAK,CAAC;YAAE,SAAS,GAAG,CAAC,CAAC;;YAC9B,SAAS,GAAG,CAAC,CAAC,CAAC,aAAa;QAEjC,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAErC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAChD,OAAO,KAAK,CAAC;IACd,CAAC;IAED,wFAAwF;IACxF,KAAK,CAAC,IAAI;QACT,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QAC9C,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,CAAC,MAAe;QACnB,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,MAAM;QACT,OAAO,IAAI,CAAC,OAAO,EAAE,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAClD,CAAC;CACD;AAED,kDAAkD;AAClD,MAAM,OAAO,MAAM;IAClB,OAAO,CAA0C;IACjD,OAAO,CAA6B;IAEpC,sCAAsC;IACtC,uCAAuC;IACvC,QAAQ,CAAc;IAEtB,OAAO,CAAe;IAEtB,YAAY,MAAkC,EAAE,OAAqB;QACpE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QACxC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,CAAU;QACpB,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,EAAE,CAAC,CAAS;QACjB,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,CAAS;QAClB,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,CAAS;QAClB,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACzE,CAAC;QAED,qDAAqD;QACrD,0DAA0D;QAC1D,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,CAAS;QAClB,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YACxB,yEAAyE;YACzE,mEAAmE;YACnE,sEAAsE;YACtE,8BAA8B;YAC9B,OAAO,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC9F,CAAC;QACD,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;QAChE,CAAC;aAAM,CAAC;YACP,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;QACrD,CAAC;IACF,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,CAAS;QAClB,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;QAChE,CAAC;aAAM,CAAC;YACP,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;QACrD,CAAC;IACF,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,CAAa;QACxB,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACvB,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAChC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAED,KAAK;QACJ,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,MAAM;QACT,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,MAAe;QACpB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAkB,EAAE,OAAqB;QAC1D,MAAM,QAAQ,GAAG,CAAC,MAAM,IAAI,CAAC,0BAA0B,EAAE,CAA+B,CAAC;QACzF,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;CACD;AAED,SAAS,QAAQ,CAAC,GAAgB,EAAE,CAAS;IAC5C,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACzC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACd,OAAO,MAAM,CAAC;AACf,CAAC;AAED,SAAS,SAAS,CAAC,GAAgB,EAAE,CAAS;IAC7C,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACrC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACrB,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,QAAQ,CAAC,GAAgB,EAAE,CAAS;IAC5C,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACrC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpB,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;AACtE,CAAC;AAED,8CAA8C;AAC9C,MAAM,OAAO,OAAO;IACnB,OAAO,CAA0D;IACjE,QAAQ,CAAe;IAEvB,YAAY,IAAkB,EAAE,OAAqB;QACpD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,6BAA6B,CAAC,SAAS,EAE1D,CAAC;QACF,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,IAAI;QACT,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACvC,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO;QACtB,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzD,CAAC;IAED,KAAK;QACJ,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;IACvB,CAAC;CACD","sourcesContent":["import type { IetfVersion } from \"./ietf/version.ts\";\nimport { Version } from \"./ietf/version.ts\";\nimport * as Varint from \"./varint.ts\";\n\nconst MAX_U31 = 2 ** 31 - 1;\nconst MAX_READ_SIZE = 1024 * 1024 * 64; // don't allocate more than 64MB for a message\n\nfunction isLeadingOnes(version?: IetfVersion): boolean {\n\treturn (\n\t\tversion !== undefined &&\n\t\tversion !== Version.DRAFT_14 &&\n\t\tversion !== Version.DRAFT_15 &&\n\t\tversion !== Version.DRAFT_16\n\t);\n}\n\nexport class Stream {\n\treader: Reader;\n\twriter: Writer;\n\n\tconstructor(props: {\n\t\twritable: WritableStream<Uint8Array>;\n\t\treadable: ReadableStream<Uint8Array>;\n\t\twriter?: Writer;\n\t\treader?: Reader;\n\t\tversion?: IetfVersion;\n\t}) {\n\t\tthis.writer = props.writer ?? new Writer(props.writable, props.version);\n\t\tthis.reader = props.reader ?? new Reader(props.readable, undefined, props.version);\n\t}\n\n\tstatic async accept(quic: WebTransport, version?: IetfVersion): Promise<Stream | undefined> {\n\t\tfor (;;) {\n\t\t\tconst reader =\n\t\t\t\tquic.incomingBidirectionalStreams.getReader() as ReadableStreamDefaultReader<WebTransportBidirectionalStream>;\n\t\t\tconst next = await reader.read();\n\t\t\treader.releaseLock();\n\n\t\t\tif (next.done) return;\n\t\t\tconst { readable, writable } = next.value;\n\t\t\treturn new Stream({ readable, writable, version });\n\t\t}\n\t}\n\n\tstatic async open(quic: WebTransport, version?: IetfVersion, priority?: number): Promise<Stream> {\n\t\tconst { readable, writable } = await quic.createBidirectionalStream({ sendOrder: priority });\n\t\treturn new Stream({ readable, writable, version });\n\t}\n\n\tclose() {\n\t\tthis.writer.close();\n\t\tthis.reader.stop(new Error(\"cancel\"));\n\t}\n\n\tabort(reason: Error) {\n\t\tthis.writer.reset(reason);\n\t\tthis.reader.stop(reason);\n\t}\n}\n\n// Reader wraps a stream and provides convience methods for reading pieces from a stream\n// Unfortunately we can't use a BYOB reader because it's not supported with WebTransport+WebWorkers yet.\nexport class Reader {\n\t#buffer: Uint8Array;\n\t#stream?: ReadableStream<Uint8Array>; // if undefined, the buffer is consumed then EOF\n\t#reader?: ReadableStreamDefaultReader<Uint8Array>;\n\tversion?: IetfVersion;\n\n\t// Either stream or buffer MUST be provided.\n\tconstructor(stream: ReadableStream<Uint8Array>, buffer?: Uint8Array, version?: IetfVersion);\n\tconstructor(stream: undefined, buffer: Uint8Array, version?: IetfVersion);\n\tconstructor(stream?: ReadableStream<Uint8Array>, buffer?: Uint8Array, version?: IetfVersion) {\n\t\tthis.#buffer = buffer ?? new Uint8Array();\n\t\tthis.#stream = stream;\n\t\tthis.#reader = this.#stream?.getReader();\n\t\tthis.version = version;\n\t}\n\n\t// Adds more data to the buffer, returning true if more data was added.\n\tasync #fill(): Promise<boolean> {\n\t\tif (!this.#reader) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst result = await this.#reader.read();\n\t\tif (result.done) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (result.value.byteLength === 0) {\n\t\t\tthrow new Error(\"unexpected empty chunk\");\n\t\t}\n\n\t\tconst buffer = new Uint8Array(result.value);\n\n\t\tif (this.#buffer.byteLength === 0) {\n\t\t\tthis.#buffer = buffer;\n\t\t} else {\n\t\t\tconst temp = new Uint8Array(this.#buffer.byteLength + buffer.byteLength);\n\t\t\ttemp.set(this.#buffer);\n\t\t\ttemp.set(buffer, this.#buffer.byteLength);\n\t\t\tthis.#buffer = temp;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t// Add more data to the buffer until it's at least size bytes.\n\tasync #fillTo(size: number) {\n\t\tif (size > MAX_READ_SIZE) {\n\t\t\tthrow new Error(`read size ${size} exceeds max size ${MAX_READ_SIZE}`);\n\t\t}\n\n\t\twhile (this.#buffer.byteLength < size) {\n\t\t\tif (!(await this.#fill())) {\n\t\t\t\tthrow new Error(\"unexpected end of stream\");\n\t\t\t}\n\t\t}\n\t}\n\n\t// Consumes the first size bytes of the buffer.\n\t#slice(size: number): Uint8Array {\n\t\tconst result = new Uint8Array(this.#buffer.buffer, this.#buffer.byteOffset, size);\n\t\tthis.#buffer = new Uint8Array(\n\t\t\tthis.#buffer.buffer,\n\t\t\tthis.#buffer.byteOffset + size,\n\t\t\tthis.#buffer.byteLength - size,\n\t\t);\n\n\t\treturn result;\n\t}\n\n\tasync read(size: number): Promise<Uint8Array> {\n\t\tif (size === 0) return new Uint8Array();\n\n\t\tawait this.#fillTo(size);\n\t\treturn this.#slice(size);\n\t}\n\n\tasync readAll(): Promise<Uint8Array> {\n\t\twhile (await this.#fill()) {\n\t\t\t// keep going\n\t\t}\n\t\treturn this.#slice(this.#buffer.byteLength);\n\t}\n\n\tasync string(): Promise<string> {\n\t\tconst length = await this.u53();\n\t\tconst buffer = await this.read(length);\n\t\treturn new TextDecoder().decode(buffer);\n\t}\n\n\tasync bool(): Promise<boolean> {\n\t\tconst v = await this.u8();\n\t\tif (v === 0) return false;\n\t\tif (v === 1) return true;\n\t\tthrow new Error(\"invalid bool value\");\n\t}\n\n\tasync u8(): Promise<number> {\n\t\tawait this.#fillTo(1);\n\t\treturn this.#slice(1)[0];\n\t}\n\n\tasync u16(): Promise<number> {\n\t\tawait this.#fillTo(2);\n\t\tconst view = new DataView(this.#buffer.buffer, this.#buffer.byteOffset, 2);\n\t\tconst result = view.getUint16(0);\n\t\tthis.#slice(2);\n\t\treturn result;\n\t}\n\n\t// Returns a Number using 53-bits, the max Javascript can use for integer math.\n\t// Values > 2^53-1 are coerced to a Number (precision is lost) and logged. We\n\t// downgrade overflow from throw to warn so a stray u64 field on the wire (e.g.\n\t// a peer's session-level Origin id) doesn't tear down the whole stream/session.\n\tasync u53(): Promise<number> {\n\t\tconst v = await this.u62();\n\t\tif (v > Varint.MAX_U53) {\n\t\t\tconsole.warn(`value larger than 53-bits; use u62 instead (precision lost): ${v.toString()}`);\n\t\t}\n\n\t\treturn Number(v);\n\t}\n\n\t// NOTE: Returns a bigint instead of a number since it may be larger than 53-bits\n\tasync u62(): Promise<bigint> {\n\t\tif (isLeadingOnes(this.version)) {\n\t\t\treturn this.#readLeadingOnes();\n\t\t}\n\t\treturn this.#readQuicVarint();\n\t}\n\n\tasync #readQuicVarint(): Promise<bigint> {\n\t\tawait this.#fillTo(1);\n\t\tconst size = (this.#buffer[0] & 0xc0) >> 6;\n\n\t\tif (size === 0) {\n\t\t\tconst first = this.#slice(1)[0];\n\t\t\treturn BigInt(first) & 0x3fn;\n\t\t}\n\t\tif (size === 1) {\n\t\t\tawait this.#fillTo(2);\n\t\t\tconst slice = this.#slice(2);\n\t\t\tconst view = new DataView(slice.buffer, slice.byteOffset, slice.byteLength);\n\n\t\t\treturn BigInt(view.getUint16(0)) & 0x3fffn;\n\t\t}\n\t\tif (size === 2) {\n\t\t\tawait this.#fillTo(4);\n\t\t\tconst slice = this.#slice(4);\n\t\t\tconst view = new DataView(slice.buffer, slice.byteOffset, slice.byteLength);\n\n\t\t\treturn BigInt(view.getUint32(0)) & 0x3fffffffn;\n\t\t}\n\t\tawait this.#fillTo(8);\n\t\tconst slice = this.#slice(8);\n\t\tconst view = new DataView(slice.buffer, slice.byteOffset, slice.byteLength);\n\n\t\treturn view.getBigUint64(0) & 0x3fffffffffffffffn;\n\t}\n\n\tasync #readLeadingOnes(): Promise<bigint> {\n\t\tawait this.#fillTo(1);\n\t\tconst b = this.#buffer[0];\n\n\t\t// Count leading 1-bits\n\t\tlet ones = 0;\n\t\tfor (let bit = 7; bit >= 0; bit--) {\n\t\t\tif (b & (1 << bit)) ones++;\n\t\t\telse break;\n\t\t}\n\n\t\t// 1111110x is a 7-byte form. Draft-17 rejects it; draft-18+ allows it per #1595.\n\t\tif (ones === 6 && this.version === Version.DRAFT_17) {\n\t\t\tthrow new Error(\"invalid leading-ones varint: 1111110x prefix is reserved on draft-17\");\n\t\t}\n\n\t\tlet totalSize: number;\n\t\tif (ones <= 5) totalSize = ones + 1;\n\t\telse if (ones === 6) totalSize = 7;\n\t\telse if (ones === 7) totalSize = 8;\n\t\telse totalSize = 9; // ones === 8\n\n\t\tawait this.#fillTo(totalSize);\n\t\tconst slice = this.#slice(totalSize);\n\n\t\tconst [value] = Varint.decodeLeadingOnes(slice);\n\t\treturn value;\n\t}\n\n\t// Returns false if there is more data to read, blocking if it hasn't been received yet.\n\tasync done(): Promise<boolean> {\n\t\tif (this.#buffer.byteLength > 0) return false;\n\t\treturn !(await this.#fill());\n\t}\n\n\tstop(reason: unknown) {\n\t\tthis.#reader?.cancel(reason).catch(() => void 0);\n\t}\n\n\tget closed(): Promise<void> {\n\t\treturn this.#reader?.closed ?? Promise.resolve();\n\t}\n}\n\n// Writer wraps a stream and writes chunks of data\nexport class Writer {\n\t#writer: WritableStreamDefaultWriter<Uint8Array>;\n\t#stream: WritableStream<Uint8Array>;\n\n\t// Scratch buffer for writing varints.\n\t// Fixed at 9 bytes (leading-ones max).\n\t#scratch: ArrayBuffer;\n\n\tversion?: IetfVersion;\n\n\tconstructor(stream: WritableStream<Uint8Array>, version?: IetfVersion) {\n\t\tthis.#stream = stream;\n\t\tthis.#scratch = new ArrayBuffer(9);\n\t\tthis.#writer = this.#stream.getWriter();\n\t\tthis.version = version;\n\t}\n\n\tasync bool(v: boolean) {\n\t\tawait this.write(setUint8(this.#scratch, v ? 1 : 0));\n\t}\n\n\tasync u8(v: number) {\n\t\tawait this.write(setUint8(this.#scratch, v));\n\t}\n\n\tasync u16(v: number) {\n\t\tawait this.write(setUint16(this.#scratch, v));\n\t}\n\n\tasync i32(v: number) {\n\t\tif (Math.abs(v) > MAX_U31) {\n\t\t\tthrow new Error(`overflow, value larger than 32-bits: ${v.toString()}`);\n\t\t}\n\n\t\t// We don't use a VarInt, so it always takes 4 bytes.\n\t\t// This could be improved but nothing is standardized yet.\n\t\tawait this.write(setInt32(this.#scratch, v));\n\t}\n\n\tasync u53(v: number) {\n\t\tif (v > Varint.MAX_U53) {\n\t\t\t// Number values above 2^53-1 have already lost precision before reaching\n\t\t\t// the wire, but downgrade overflow to warn so an upstream miscount\n\t\t\t// doesn't tear down the whole stream. The encoded varint will reflect\n\t\t\t// the truncated Number value.\n\t\t\tconsole.warn(`value larger than 53-bits; use u62 instead (precision lost): ${v.toString()}`);\n\t\t}\n\t\tif (isLeadingOnes(this.version)) {\n\t\t\tawait this.write(Varint.encodeLeadingOnesTo(this.#scratch, v));\n\t\t} else {\n\t\t\tawait this.write(Varint.encodeTo(this.#scratch, v));\n\t\t}\n\t}\n\n\tasync u62(v: bigint) {\n\t\tif (isLeadingOnes(this.version)) {\n\t\t\tawait this.write(Varint.encodeLeadingOnesTo(this.#scratch, v));\n\t\t} else {\n\t\t\tawait this.write(Varint.encodeTo(this.#scratch, v));\n\t\t}\n\t}\n\n\tasync write(v: Uint8Array) {\n\t\tawait this.#writer.write(v);\n\t}\n\n\tasync string(str: string) {\n\t\tconst data = new TextEncoder().encode(str);\n\t\tawait this.u53(data.byteLength);\n\t\tawait this.write(data);\n\t}\n\n\tclose() {\n\t\tthis.#writer.close().catch(() => void 0);\n\t}\n\n\tget closed(): Promise<void> {\n\t\treturn this.#writer.closed;\n\t}\n\n\treset(reason: unknown) {\n\t\tthis.#writer.abort(reason).catch(() => void 0);\n\t}\n\n\tstatic async open(quic: WebTransport, version?: IetfVersion): Promise<Writer> {\n\t\tconst writable = (await quic.createUnidirectionalStream()) as WritableStream<Uint8Array>;\n\t\treturn new Writer(writable, version);\n\t}\n}\n\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 setInt32(dst: ArrayBuffer, v: number): Uint8Array {\n\tconst view = new DataView(dst, 0, 4);\n\tview.setInt32(0, v);\n\treturn new Uint8Array(view.buffer, view.byteOffset, view.byteLength);\n}\n\n// Returns the next stream from the connection\nexport class Readers {\n\t#reader: ReadableStreamDefaultReader<ReadableStream<Uint8Array>>;\n\t#version?: IetfVersion;\n\n\tconstructor(quic: WebTransport, version?: IetfVersion) {\n\t\tthis.#reader = quic.incomingUnidirectionalStreams.getReader() as ReadableStreamDefaultReader<\n\t\t\tReadableStream<Uint8Array>\n\t\t>;\n\t\tthis.#version = version;\n\t}\n\n\tasync next(): Promise<Reader | undefined> {\n\t\tconst next = await this.#reader.read();\n\t\tif (next.done) return;\n\t\treturn new Reader(next.value, undefined, this.#version);\n\t}\n\n\tclose() {\n\t\tthis.#reader.cancel();\n\t}\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=stream.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.test.d.ts","sourceRoot":"","sources":["../src/stream.test.ts"],"names":[],"mappings":""}