@scriptc/compiler 0.4.0 → 0.4.2

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 (866) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +617 -83
  2. package/dist/backend/cycle-analysis.d.ts +2 -1
  3. package/dist/backend/cycle-analysis.js +4 -4
  4. package/dist/backend/cycle-analysis.js.map +1 -1
  5. package/dist/backend/cycle-mutability.d.ts +2 -1
  6. package/dist/backend/cycle-mutability.js +2 -2
  7. package/dist/backend/cycle-mutability.js.map +1 -1
  8. package/dist/backend/executable-features.js +10 -0
  9. package/dist/backend/executable-features.js.map +1 -1
  10. package/dist/backend/immutability.d.ts +2 -1
  11. package/dist/backend/immutability.js +2 -2
  12. package/dist/backend/immutability.js.map +1 -1
  13. package/dist/backend/library-pack.js +7 -0
  14. package/dist/backend/library-pack.js.map +1 -1
  15. package/dist/backend/link-plan-core.d.ts +2 -0
  16. package/dist/backend/link-plan-core.js +2 -0
  17. package/dist/backend/link-plan-core.js.map +1 -1
  18. package/dist/backend/link-plan.d.ts +1 -0
  19. package/dist/backend/link-plan.js +1 -0
  20. package/dist/backend/link-plan.js.map +1 -1
  21. package/dist/backend/llvm/alloc.d.ts +7 -3
  22. package/dist/backend/llvm/alloc.js +7 -4
  23. package/dist/backend/llvm/alloc.js.map +1 -1
  24. package/dist/backend/llvm/array-search.js +4 -1
  25. package/dist/backend/llvm/array-search.js.map +1 -1
  26. package/dist/backend/llvm/bytes-loop-versions.d.ts +23 -2
  27. package/dist/backend/llvm/bytes-loop-versions.js +115 -19
  28. package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
  29. package/dist/backend/llvm/bytes-loop-versions.test.js +131 -0
  30. package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
  31. package/dist/backend/llvm/classes.d.ts +99 -2
  32. package/dist/backend/llvm/classes.js +436 -57
  33. package/dist/backend/llvm/classes.js.map +1 -1
  34. package/dist/backend/llvm/classes.test.js +235 -16
  35. package/dist/backend/llvm/classes.test.js.map +1 -1
  36. package/dist/backend/llvm/common.d.ts +21 -5
  37. package/dist/backend/llvm/common.js +50 -5
  38. package/dist/backend/llvm/common.js.map +1 -1
  39. package/dist/backend/llvm/constant-callbacks.js +8 -4
  40. package/dist/backend/llvm/constant-callbacks.js.map +1 -1
  41. package/dist/backend/llvm/constant-callbacks.test.js +4 -4
  42. package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
  43. package/dist/backend/llvm/counted-loops.d.ts +4 -1
  44. package/dist/backend/llvm/counted-loops.js +62 -23
  45. package/dist/backend/llvm/counted-loops.js.map +1 -1
  46. package/dist/backend/llvm/dense-array-access.d.ts +3 -1
  47. package/dist/backend/llvm/dense-array-access.js +61 -38
  48. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  49. package/dist/backend/llvm/dense-array-access.test.js +4 -0
  50. package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
  51. package/dist/backend/llvm/dense-array-loops.d.ts +19 -16
  52. package/dist/backend/llvm/dense-array-loops.js +49 -13
  53. package/dist/backend/llvm/dense-array-loops.js.map +1 -1
  54. package/dist/backend/llvm/dense-array-loops.test.js +50 -14
  55. package/dist/backend/llvm/dense-array-loops.test.js.map +1 -1
  56. package/dist/backend/llvm/dyn.d.ts +34 -1
  57. package/dist/backend/llvm/dyn.js +393 -14
  58. package/dist/backend/llvm/dyn.js.map +1 -1
  59. package/dist/backend/llvm/emit-function.js +27 -8
  60. package/dist/backend/llvm/emit-function.js.map +1 -1
  61. package/dist/backend/llvm/emit-module.js +67 -39
  62. package/dist/backend/llvm/emit-module.js.map +1 -1
  63. package/dist/backend/llvm/emit-statements.d.ts +3 -25
  64. package/dist/backend/llvm/emit-statements.js +414 -37
  65. package/dist/backend/llvm/emit-statements.js.map +1 -1
  66. package/dist/backend/llvm/emitter.d.ts +159 -22
  67. package/dist/backend/llvm/emitter.js +573 -89
  68. package/dist/backend/llvm/emitter.js.map +1 -1
  69. package/dist/backend/llvm/expr-async.js +19 -0
  70. package/dist/backend/llvm/expr-async.js.map +1 -1
  71. package/dist/backend/llvm/expr-bytes.d.ts +5 -2
  72. package/dist/backend/llvm/expr-bytes.js +110 -40
  73. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  74. package/dist/backend/llvm/expr-calls.d.ts +1 -1
  75. package/dist/backend/llvm/expr-calls.js +51 -26
  76. package/dist/backend/llvm/expr-calls.js.map +1 -1
  77. package/dist/backend/llvm/expr-containers.js +27 -14
  78. package/dist/backend/llvm/expr-containers.js.map +1 -1
  79. package/dist/backend/llvm/expr-control.js +2 -3
  80. package/dist/backend/llvm/expr-control.js.map +1 -1
  81. package/dist/backend/llvm/expr-dynamic.js +95 -5
  82. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  83. package/dist/backend/llvm/expr-primitives.js +29 -11
  84. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  85. package/dist/backend/llvm/expr-primitives.test.js +55 -0
  86. package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
  87. package/dist/backend/llvm/expr-stream-bridges.js +48 -20
  88. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  89. package/dist/backend/llvm/expr-stream-callbacks.js +131 -35
  90. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  91. package/dist/backend/llvm/integer-clones.js +3 -3
  92. package/dist/backend/llvm/integer-clones.js.map +1 -1
  93. package/dist/backend/llvm/js-ic.d.ts +18 -0
  94. package/dist/backend/llvm/js-ic.js +712 -0
  95. package/dist/backend/llvm/js-ic.js.map +1 -0
  96. package/dist/backend/llvm/jsval.js +139 -11
  97. package/dist/backend/llvm/jsval.js.map +1 -1
  98. package/dist/backend/llvm/lib-dispatch.js +10 -0
  99. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  100. package/dist/backend/llvm/lib-filesystem.js +61 -0
  101. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  102. package/dist/backend/llvm/lib-http2.d.ts +4 -0
  103. package/dist/backend/llvm/lib-http2.js +20 -17
  104. package/dist/backend/llvm/lib-http2.js.map +1 -1
  105. package/dist/backend/llvm/lib-process.js +69 -17
  106. package/dist/backend/llvm/lib-process.js.map +1 -1
  107. package/dist/backend/llvm/lib-shared.js +75 -1
  108. package/dist/backend/llvm/lib-shared.js.map +1 -1
  109. package/dist/backend/llvm/lib-stream.js +65 -28
  110. package/dist/backend/llvm/lib-stream.js.map +1 -1
  111. package/dist/backend/llvm/lib-tls.js +23 -0
  112. package/dist/backend/llvm/lib-tls.js.map +1 -1
  113. package/dist/backend/llvm/local-array-reads.js +91 -61
  114. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  115. package/dist/backend/llvm/local-array-reads.test.js +14 -0
  116. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  117. package/dist/backend/llvm/map-number-lookup.d.ts +20 -4
  118. package/dist/backend/llvm/map-number-lookup.js +43 -7
  119. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  120. package/dist/backend/llvm/narrow-guards.js +64 -0
  121. package/dist/backend/llvm/narrow-guards.js.map +1 -1
  122. package/dist/backend/llvm/publish.d.ts +11 -1
  123. package/dist/backend/llvm/publish.js +80 -22
  124. package/dist/backend/llvm/publish.js.map +1 -1
  125. package/dist/backend/llvm/publish.test.js +3 -0
  126. package/dist/backend/llvm/publish.test.js.map +1 -1
  127. package/dist/backend/llvm/receivers.js +1 -1
  128. package/dist/backend/llvm/receivers.js.map +1 -1
  129. package/dist/backend/llvm/reference-writes.js +2 -0
  130. package/dist/backend/llvm/reference-writes.js.map +1 -1
  131. package/dist/backend/llvm/regex-matchers.js +161 -14
  132. package/dist/backend/llvm/regex-matchers.js.map +1 -1
  133. package/dist/backend/llvm/regex-matchers.test.js +18 -0
  134. package/dist/backend/llvm/regex-matchers.test.js.map +1 -1
  135. package/dist/backend/llvm/regions.js +2 -2
  136. package/dist/backend/llvm/regions.js.map +1 -1
  137. package/dist/backend/llvm/regions.test.js +7 -1
  138. package/dist/backend/llvm/regions.test.js.map +1 -1
  139. package/dist/backend/llvm/shapes.d.ts +17 -9
  140. package/dist/backend/llvm/shapes.js +21 -17
  141. package/dist/backend/llvm/shapes.js.map +1 -1
  142. package/dist/backend/llvm/speculative-integers.d.ts +20 -1
  143. package/dist/backend/llvm/speculative-integers.js +94 -6
  144. package/dist/backend/llvm/speculative-integers.js.map +1 -1
  145. package/dist/backend/llvm/speculative-integers.test.js +55 -1
  146. package/dist/backend/llvm/speculative-integers.test.js.map +1 -1
  147. package/dist/backend/llvm/string-lifetimes.test.js +2 -1
  148. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  149. package/dist/backend/llvm/string-reads.d.ts +4 -1
  150. package/dist/backend/llvm/string-reads.js +88 -4
  151. package/dist/backend/llvm/string-reads.js.map +1 -1
  152. package/dist/backend/llvm/thread-slots.test.js +5 -4
  153. package/dist/backend/llvm/thread-slots.test.js.map +1 -1
  154. package/dist/backend/llvm/wasm-modules.d.ts +6 -5
  155. package/dist/backend/llvm/wasm-modules.js +32 -9
  156. package/dist/backend/llvm/wasm-modules.js.map +1 -1
  157. package/dist/backend/mangle.d.ts +8 -0
  158. package/dist/backend/mangle.js +12 -0
  159. package/dist/backend/mangle.js.map +1 -1
  160. package/dist/backend/native/contracts.d.ts +40 -2
  161. package/dist/backend/native/executable.js +40 -7
  162. package/dist/backend/native/executable.js.map +1 -1
  163. package/dist/backend/native/library.js +3 -1
  164. package/dist/backend/native/library.js.map +1 -1
  165. package/dist/backend/native-codegen.d.ts +17 -6
  166. package/dist/backend/native-codegen.js +55 -9
  167. package/dist/backend/native-codegen.js.map +1 -1
  168. package/dist/backend/native-codegen.test.js +18 -14
  169. package/dist/backend/native-codegen.test.js.map +1 -1
  170. package/dist/backend/native-link-info-core.d.ts +30 -2
  171. package/dist/backend/native-link-info-core.js.map +1 -1
  172. package/dist/backend/native-profile.d.ts +32 -0
  173. package/dist/backend/native-profile.js +39 -0
  174. package/dist/backend/native-profile.js.map +1 -0
  175. package/dist/backend/native-profile.test.d.ts +1 -0
  176. package/dist/backend/native-profile.test.js +58 -0
  177. package/dist/backend/native-profile.test.js.map +1 -0
  178. package/dist/backend/native-tools.d.ts +14 -0
  179. package/dist/backend/native-tools.js +13 -0
  180. package/dist/backend/native-tools.js.map +1 -1
  181. package/dist/backend/optimization.d.ts +2 -2
  182. package/dist/backend/runtime-abi.d.ts +2 -2
  183. package/dist/backend/runtime-abi.js +2 -2
  184. package/dist/backend/runtime-pack-core.d.ts +4 -0
  185. package/dist/backend/runtime-pack-core.js +4 -0
  186. package/dist/backend/runtime-pack-core.js.map +1 -1
  187. package/dist/backend/runtime-pack-targets.test.js +7 -1
  188. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  189. package/dist/backend/runtime-pack.d.ts +0 -21
  190. package/dist/backend/runtime-pack.js +0 -29
  191. package/dist/backend/runtime-pack.js.map +1 -1
  192. package/dist/backend/runtime-pack.test.js +12 -69
  193. package/dist/backend/runtime-pack.test.js.map +1 -1
  194. package/dist/backend/target-diagnostics.js +38 -1
  195. package/dist/backend/target-diagnostics.js.map +1 -1
  196. package/dist/backend/warm-cache.js +6 -0
  197. package/dist/backend/warm-cache.js.map +1 -1
  198. package/dist/cli/command.js +89 -7
  199. package/dist/cli/command.js.map +1 -1
  200. package/dist/cli/host.d.ts +3 -0
  201. package/dist/cli/output-options.d.ts +2 -0
  202. package/dist/cli/output-options.js +9 -0
  203. package/dist/cli/output-options.js.map +1 -1
  204. package/dist/cli/usage.d.ts +15 -1
  205. package/dist/cli/usage.js +30 -2
  206. package/dist/cli/usage.js.map +1 -1
  207. package/dist/compile-types.d.ts +9 -0
  208. package/dist/contracts/check.js +2 -3
  209. package/dist/contracts/check.js.map +1 -1
  210. package/dist/coverage/report.d.ts +7 -2
  211. package/dist/coverage/report.js +18 -0
  212. package/dist/coverage/report.js.map +1 -1
  213. package/dist/coverage/verdict-cache.d.ts +1 -0
  214. package/dist/coverage/verdict-cache.js +4 -0
  215. package/dist/coverage/verdict-cache.js.map +1 -1
  216. package/dist/coverage/verdict-semantic.js +4 -0
  217. package/dist/coverage/verdict-semantic.js.map +1 -1
  218. package/dist/diagnostics/diagnostic.js.map +1 -1
  219. package/dist/diagnostics/dynamic-tier.d.ts +40 -0
  220. package/dist/diagnostics/dynamic-tier.js +57 -0
  221. package/dist/diagnostics/dynamic-tier.js.map +1 -0
  222. package/dist/diagnostics/envelope.d.ts +2 -1
  223. package/dist/diagnostics/envelope.js +5 -2
  224. package/dist/diagnostics/envelope.js.map +1 -1
  225. package/dist/executable/executable-cache.d.ts +32 -0
  226. package/dist/executable/executable-cache.js +65 -7
  227. package/dist/executable/executable-cache.js.map +1 -1
  228. package/dist/executable/executable-cache.test.js +50 -3
  229. package/dist/executable/executable-cache.test.js.map +1 -1
  230. package/dist/executable/prepare.js +3 -1
  231. package/dist/executable/prepare.js.map +1 -1
  232. package/dist/frontend/analysis.js +1 -0
  233. package/dist/frontend/analysis.js.map +1 -1
  234. package/dist/frontend/arguments-usage.d.ts +8 -0
  235. package/dist/frontend/arguments-usage.js +98 -0
  236. package/dist/frontend/arguments-usage.js.map +1 -1
  237. package/dist/frontend/arguments-usage.test.d.ts +1 -0
  238. package/dist/frontend/arguments-usage.test.js +32 -0
  239. package/dist/frontend/arguments-usage.test.js.map +1 -0
  240. package/dist/frontend/builtin-package-aliases.d.ts +24 -0
  241. package/dist/frontend/builtin-package-aliases.js +133 -0
  242. package/dist/frontend/builtin-package-aliases.js.map +1 -0
  243. package/dist/frontend/builtin-package-aliases.test.d.ts +1 -0
  244. package/dist/frontend/builtin-package-aliases.test.js +48 -0
  245. package/dist/frontend/builtin-package-aliases.test.js.map +1 -0
  246. package/dist/frontend/dispose-hook.d.ts +2 -0
  247. package/dist/frontend/dispose-hook.js +14 -0
  248. package/dist/frontend/dispose-hook.js.map +1 -0
  249. package/dist/frontend/dts-paths.d.ts +4 -0
  250. package/dist/frontend/dts-paths.js +9 -1
  251. package/dist/frontend/dts-paths.js.map +1 -1
  252. package/dist/frontend/jsx-entities.d.ts +4 -0
  253. package/dist/frontend/jsx-entities.js +259 -0
  254. package/dist/frontend/jsx-entities.js.map +1 -0
  255. package/dist/frontend/jsx-source.d.ts +71 -0
  256. package/dist/frontend/jsx-source.js +781 -0
  257. package/dist/frontend/jsx-source.js.map +1 -0
  258. package/dist/frontend/jsx-source.test.d.ts +1 -0
  259. package/dist/frontend/jsx-source.test.js +200 -0
  260. package/dist/frontend/jsx-source.test.js.map +1 -0
  261. package/dist/frontend/literal-values.test.js +8 -9
  262. package/dist/frontend/literal-values.test.js.map +1 -1
  263. package/dist/frontend/lowering/array-indexed-mutation.js +2 -1
  264. package/dist/frontend/lowering/array-indexed-mutation.js.map +1 -1
  265. package/dist/frontend/lowering/array-values.js +3 -2
  266. package/dist/frontend/lowering/array-values.js.map +1 -1
  267. package/dist/frontend/lowering/binding-analysis.d.ts +1 -1
  268. package/dist/frontend/lowering/binding-analysis.js +2 -2
  269. package/dist/frontend/lowering/binding-analysis.js.map +1 -1
  270. package/dist/frontend/lowering/builtins/arguments.d.ts +3 -0
  271. package/dist/frontend/lowering/builtins/arguments.js +30 -15
  272. package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
  273. package/dist/frontend/lowering/builtins/atomics.js +10 -6
  274. package/dist/frontend/lowering/builtins/atomics.js.map +1 -1
  275. package/dist/frontend/lowering/builtins/builtin-class-dyn.d.ts +8 -0
  276. package/dist/frontend/lowering/builtins/builtin-class-dyn.js +50 -1
  277. package/dist/frontend/lowering/builtins/builtin-class-dyn.js.map +1 -1
  278. package/dist/frontend/lowering/builtins/callable-aliases.js +3 -2
  279. package/dist/frontend/lowering/builtins/callable-aliases.js.map +1 -1
  280. package/dist/frontend/lowering/builtins/child-process-async.js +2 -1
  281. package/dist/frontend/lowering/builtins/child-process-async.js.map +1 -1
  282. package/dist/frontend/lowering/builtins/child-process-sync.js +2 -1
  283. package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -1
  284. package/dist/frontend/lowering/builtins/crypto.d.ts +7 -2
  285. package/dist/frontend/lowering/builtins/crypto.js +63 -4
  286. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  287. package/dist/frontend/lowering/builtins/date-classes.d.ts +46 -0
  288. package/dist/frontend/lowering/builtins/date-classes.js +477 -0
  289. package/dist/frontend/lowering/builtins/date-classes.js.map +1 -0
  290. package/dist/frontend/lowering/builtins/dates.d.ts +11 -1
  291. package/dist/frontend/lowering/builtins/dates.js +55 -26
  292. package/dist/frontend/lowering/builtins/dates.js.map +1 -1
  293. package/dist/frontend/lowering/builtins/dh.d.ts +15 -0
  294. package/dist/frontend/lowering/builtins/dh.js +151 -0
  295. package/dist/frontend/lowering/builtins/dh.js.map +1 -0
  296. package/dist/frontend/lowering/builtins/disposable-stack.js +2 -1
  297. package/dist/frontend/lowering/builtins/disposable-stack.js.map +1 -1
  298. package/dist/frontend/lowering/builtins/ecdh.d.ts +21 -0
  299. package/dist/frontend/lowering/builtins/ecdh.js +208 -0
  300. package/dist/frontend/lowering/builtins/ecdh.js.map +1 -0
  301. package/dist/frontend/lowering/builtins/errors.d.ts +15 -0
  302. package/dist/frontend/lowering/builtins/errors.js +110 -0
  303. package/dist/frontend/lowering/builtins/errors.js.map +1 -1
  304. package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +1 -1
  305. package/dist/frontend/lowering/builtins/filesystem-calls.js +23 -17
  306. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  307. package/dist/frontend/lowering/builtins/filesystem.js +6 -4
  308. package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
  309. package/dist/frontend/lowering/builtins/fs-paths.d.ts +15 -0
  310. package/dist/frontend/lowering/builtins/fs-paths.js +209 -0
  311. package/dist/frontend/lowering/builtins/fs-paths.js.map +1 -0
  312. package/dist/frontend/lowering/builtins/hash-stream.d.ts +16 -4
  313. package/dist/frontend/lowering/builtins/hash-stream.js +86 -23
  314. package/dist/frontend/lowering/builtins/hash-stream.js.map +1 -1
  315. package/dist/frontend/lowering/builtins/json.js +54 -1
  316. package/dist/frontend/lowering/builtins/json.js.map +1 -1
  317. package/dist/frontend/lowering/builtins/key-object.d.ts +2 -1
  318. package/dist/frontend/lowering/builtins/key-object.js +20 -7
  319. package/dist/frontend/lowering/builtins/key-object.js.map +1 -1
  320. package/dist/frontend/lowering/builtins/module-calls.js +11 -4
  321. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  322. package/dist/frontend/lowering/builtins/numbers.js +9 -5
  323. package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
  324. package/dist/frontend/lowering/builtins/operating-system.js +4 -3
  325. package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
  326. package/dist/frontend/lowering/builtins/performance.js +3 -2
  327. package/dist/frontend/lowering/builtins/performance.js.map +1 -1
  328. package/dist/frontend/lowering/builtins/process.d.ts +9 -0
  329. package/dist/frontend/lowering/builtins/process.js +47 -2
  330. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  331. package/dist/frontend/lowering/builtins/promises.js +3 -2
  332. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  333. package/dist/frontend/lowering/builtins/promisify-callback.d.ts +3 -0
  334. package/dist/frontend/lowering/builtins/promisify-callback.js +23 -4
  335. package/dist/frontend/lowering/builtins/promisify-callback.js.map +1 -1
  336. package/dist/frontend/lowering/builtins/readline.d.ts +2 -1
  337. package/dist/frontend/lowering/builtins/readline.js +23 -6
  338. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  339. package/dist/frontend/lowering/builtins/reflection.js +26 -0
  340. package/dist/frontend/lowering/builtins/reflection.js.map +1 -1
  341. package/dist/frontend/lowering/builtins/strings.js +13 -5
  342. package/dist/frontend/lowering/builtins/strings.js.map +1 -1
  343. package/dist/frontend/lowering/builtins/text-codecs.js +2 -1
  344. package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
  345. package/dist/frontend/lowering/builtins/timers.js +6 -2
  346. package/dist/frontend/lowering/builtins/timers.js.map +1 -1
  347. package/dist/frontend/lowering/builtins/typed-array-members.d.ts +7 -0
  348. package/dist/frontend/lowering/builtins/typed-array-members.js +160 -0
  349. package/dist/frontend/lowering/builtins/typed-array-members.js.map +1 -0
  350. package/dist/frontend/lowering/builtins/url.js +4 -3
  351. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  352. package/dist/frontend/lowering/builtins/v8.js +2 -1
  353. package/dist/frontend/lowering/builtins/v8.js.map +1 -1
  354. package/dist/frontend/lowering/builtins/webcrypto.js +39 -20
  355. package/dist/frontend/lowering/builtins/webcrypto.js.map +1 -1
  356. package/dist/frontend/lowering/call-arguments.js +2 -1
  357. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  358. package/dist/frontend/lowering/call-signatures.d.ts +4 -0
  359. package/dist/frontend/lowering/call-signatures.js +137 -13
  360. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  361. package/dist/frontend/lowering/caught-value-dispatch.d.ts +18 -1
  362. package/dist/frontend/lowering/caught-value-dispatch.js +201 -32
  363. package/dist/frontend/lowering/caught-value-dispatch.js.map +1 -1
  364. package/dist/frontend/lowering/cjs-exports-object.js +34 -1
  365. package/dist/frontend/lowering/cjs-exports-object.js.map +1 -1
  366. package/dist/frontend/lowering/class-assertions.js +3 -2
  367. package/dist/frontend/lowering/class-assertions.js.map +1 -1
  368. package/dist/frontend/lowering/class-construction.d.ts +2 -1
  369. package/dist/frontend/lowering/class-construction.js +8 -13
  370. package/dist/frontend/lowering/class-construction.js.map +1 -1
  371. package/dist/frontend/lowering/class-descriptors.js +1 -1
  372. package/dist/frontend/lowering/class-descriptors.js.map +1 -1
  373. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +34 -0
  374. package/dist/frontend/lowering/class-dynamic-dispatch.js +577 -152
  375. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  376. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +77 -0
  377. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
  378. package/dist/frontend/lowering/class-method-mutations.js +3 -0
  379. package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
  380. package/dist/frontend/lowering/class-method-values.js +1 -1
  381. package/dist/frontend/lowering/class-method-values.js.map +1 -1
  382. package/dist/frontend/lowering/class-protocols.d.ts +17 -0
  383. package/dist/frontend/lowering/class-protocols.js +117 -7
  384. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  385. package/dist/frontend/lowering/class-prototypes.d.ts +5 -0
  386. package/dist/frontend/lowering/class-prototypes.js +42 -4
  387. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  388. package/dist/frontend/lowering/class-to-primitive.d.ts +2 -2
  389. package/dist/frontend/lowering/class-to-primitive.js +31 -8
  390. package/dist/frontend/lowering/class-to-primitive.js.map +1 -1
  391. package/dist/frontend/lowering/class-unions.js +2 -1
  392. package/dist/frontend/lowering/class-unions.js.map +1 -1
  393. package/dist/frontend/lowering/coercions/fresh-spread.d.ts +13 -0
  394. package/dist/frontend/lowering/coercions/fresh-spread.js +95 -0
  395. package/dist/frontend/lowering/coercions/fresh-spread.js.map +1 -0
  396. package/dist/frontend/lowering/coercions/function-adapters.js +105 -75
  397. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
  398. package/dist/frontend/lowering/coercions/structural.js +8 -7
  399. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  400. package/dist/frontend/lowering/coercions/unions.js +8 -7
  401. package/dist/frontend/lowering/coercions/unions.js.map +1 -1
  402. package/dist/frontend/lowering/collection-ingestion.js +2 -1
  403. package/dist/frontend/lowering/collection-ingestion.js.map +1 -1
  404. package/dist/frontend/lowering/containers/array-callbacks.d.ts +15 -0
  405. package/dist/frontend/lowering/containers/array-callbacks.js +36 -32
  406. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  407. package/dist/frontend/lowering/containers/array-concat.js +2 -1
  408. package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
  409. package/dist/frontend/lowering/containers/array-construction.js +32 -4
  410. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  411. package/dist/frontend/lowering/containers/array-methods.js +11 -5
  412. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  413. package/dist/frontend/lowering/containers/array-pipelines.js +2 -1
  414. package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
  415. package/dist/frontend/lowering/containers/bytes.d.ts +10 -1
  416. package/dist/frontend/lowering/containers/bytes.js +601 -24
  417. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  418. package/dist/frontend/lowering/containers/callback-arguments.js +52 -2
  419. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  420. package/dist/frontend/lowering/containers/collection-grouping.js +3 -2
  421. package/dist/frontend/lowering/containers/collection-grouping.js.map +1 -1
  422. package/dist/frontend/lowering/containers/collection-methods.js +80 -10
  423. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  424. package/dist/frontend/lowering/containers/indexed-objects.js +8 -7
  425. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  426. package/dist/frontend/lowering/containers/iterator-helpers.d.ts +32 -1
  427. package/dist/frontend/lowering/containers/iterator-helpers.js +6 -5
  428. package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -1
  429. package/dist/frontend/lowering/containers/string-and-regexp.js +85 -22
  430. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  431. package/dist/frontend/lowering/containers/string-replacement.js +2 -1
  432. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
  433. package/dist/frontend/lowering/cycle-initialization.d.ts +26 -10
  434. package/dist/frontend/lowering/cycle-initialization.js +177 -39
  435. package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
  436. package/dist/frontend/lowering/deferred-module-initializers.d.ts +18 -1
  437. package/dist/frontend/lowering/deferred-module-initializers.js +226 -115
  438. package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
  439. package/dist/frontend/lowering/deferred-module-initializers.test.js +28 -0
  440. package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -1
  441. package/dist/frontend/lowering/dispatch-sites.d.ts +59 -0
  442. package/dist/frontend/lowering/dispatch-sites.js +204 -0
  443. package/dist/frontend/lowering/dispatch-sites.js.map +1 -0
  444. package/dist/frontend/lowering/dispatch-sites.test.d.ts +1 -0
  445. package/dist/frontend/lowering/dispatch-sites.test.js +59 -0
  446. package/dist/frontend/lowering/dispatch-sites.test.js.map +1 -0
  447. package/dist/frontend/lowering/dyn-streams.d.ts +3 -0
  448. package/dist/frontend/lowering/dyn-streams.js +1 -1
  449. package/dist/frontend/lowering/dyn-streams.js.map +1 -1
  450. package/dist/frontend/lowering/dynamic-tier.d.ts +25 -0
  451. package/dist/frontend/lowering/dynamic-tier.js +327 -0
  452. package/dist/frontend/lowering/dynamic-tier.js.map +1 -0
  453. package/dist/frontend/lowering/error-methods.js +4 -0
  454. package/dist/frontend/lowering/error-methods.js.map +1 -1
  455. package/dist/frontend/lowering/expressions/array-literals.js +48 -13
  456. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
  457. package/dist/frontend/lowering/expressions/binary.js +124 -8
  458. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  459. package/dist/frontend/lowering/expressions/element-access.js +30 -7
  460. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  461. package/dist/frontend/lowering/expressions/identifiers.js +46 -7
  462. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  463. package/dist/frontend/lowering/expressions/keyed-field-targets.d.ts +14 -2
  464. package/dist/frontend/lowering/expressions/keyed-field-targets.js +91 -10
  465. package/dist/frontend/lowering/expressions/keyed-field-targets.js.map +1 -1
  466. package/dist/frontend/lowering/expressions/narrowing.js +52 -7
  467. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  468. package/dist/frontend/lowering/expressions/object-literals.d.ts +0 -3
  469. package/dist/frontend/lowering/expressions/object-literals.js +75 -7
  470. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  471. package/dist/frontend/lowering/expressions/optional-chains.d.ts +1 -1
  472. package/dist/frontend/lowering/expressions/optional-chains.js +17 -8
  473. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  474. package/dist/frontend/lowering/expressions/property-access.d.ts +5 -4
  475. package/dist/frontend/lowering/expressions/property-access.js +351 -16
  476. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  477. package/dist/frontend/lowering/expressions/relational.js +112 -9
  478. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  479. package/dist/frontend/lowering/expressions/typeof.js +13 -0
  480. package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
  481. package/dist/frontend/lowering/expressions/updates.js +64 -10
  482. package/dist/frontend/lowering/expressions/updates.js.map +1 -1
  483. package/dist/frontend/lowering/generator-delegation.d.ts +8 -0
  484. package/dist/frontend/lowering/generator-delegation.js +191 -1
  485. package/dist/frontend/lowering/generator-delegation.js.map +1 -1
  486. package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +6 -1
  487. package/dist/frontend/lowering/generator-dynamic-dispatch.js +20 -30
  488. package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -1
  489. package/dist/frontend/lowering/generic-functions.d.ts +46 -1
  490. package/dist/frontend/lowering/generic-functions.js +660 -73
  491. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  492. package/dist/frontend/lowering/handle-properties.d.ts +24 -0
  493. package/dist/frontend/lowering/handle-properties.js +281 -0
  494. package/dist/frontend/lowering/handle-properties.js.map +1 -0
  495. package/dist/frontend/lowering/intern-tables.js +2 -1
  496. package/dist/frontend/lowering/intern-tables.js.map +1 -1
  497. package/dist/frontend/lowering/iterable-spelling.d.ts +7 -0
  498. package/dist/frontend/lowering/iterable-spelling.js +38 -0
  499. package/dist/frontend/lowering/iterable-spelling.js.map +1 -0
  500. package/dist/frontend/lowering/iterator-adapters.js +9 -8
  501. package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
  502. package/dist/frontend/lowering/js-dynamic-objects.js +3 -2
  503. package/dist/frontend/lowering/js-dynamic-objects.js.map +1 -1
  504. package/dist/frontend/lowering/json-require.js +2 -1
  505. package/dist/frontend/lowering/json-require.js.map +1 -1
  506. package/dist/frontend/lowering/key-order-witness.d.ts +7 -2
  507. package/dist/frontend/lowering/key-order-witness.js +21 -4
  508. package/dist/frontend/lowering/key-order-witness.js.map +1 -1
  509. package/dist/frontend/lowering/key-order-witness.test.js +38 -2
  510. package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
  511. package/dist/frontend/lowering/lifetime-regions.js +2 -1
  512. package/dist/frontend/lowering/lifetime-regions.js.map +1 -1
  513. package/dist/frontend/lowering/lower-array-sort.d.ts +33 -15
  514. package/dist/frontend/lowering/lower-array-sort.js +117 -21
  515. package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
  516. package/dist/frontend/lowering/lower-array-sort.test.js +93 -14
  517. package/dist/frontend/lowering/lower-array-sort.test.js.map +1 -1
  518. package/dist/frontend/lowering/lower-assert.js +6 -5
  519. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  520. package/dist/frontend/lowering/lower-async-iteration.js +3 -1
  521. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  522. package/dist/frontend/lowering/lower-builtin-values.js +1 -0
  523. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  524. package/dist/frontend/lowering/lower-calls.d.ts +4 -0
  525. package/dist/frontend/lowering/lower-calls.js +504 -97
  526. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  527. package/dist/frontend/lowering/lower-classes.d.ts +22 -0
  528. package/dist/frontend/lowering/lower-classes.js +339 -32
  529. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  530. package/dist/frontend/lowering/lower-dgram.js +65 -15
  531. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  532. package/dist/frontend/lowering/lower-event-emitter.d.ts +14 -0
  533. package/dist/frontend/lowering/lower-event-emitter.js +267 -20
  534. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  535. package/dist/frontend/lowering/lower-exprs.d.ts +19 -2
  536. package/dist/frontend/lowering/lower-exprs.js +148 -12
  537. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  538. package/dist/frontend/lowering/lower-functions.js +308 -72
  539. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  540. package/dist/frontend/lowering/lower-generators.js +10 -4
  541. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  542. package/dist/frontend/lowering/lower-inspect.js +578 -16
  543. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  544. package/dist/frontend/lowering/lower-mixins.js +2 -1
  545. package/dist/frontend/lowering/lower-mixins.js.map +1 -1
  546. package/dist/frontend/lowering/lower-mock.js +2 -1
  547. package/dist/frontend/lowering/lower-mock.js.map +1 -1
  548. package/dist/frontend/lowering/lower-modules.d.ts +11 -3
  549. package/dist/frontend/lowering/lower-modules.js +227 -72
  550. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  551. package/dist/frontend/lowering/lower-modules.test.js +2 -2
  552. package/dist/frontend/lowering/lower-modules.test.js.map +1 -1
  553. package/dist/frontend/lowering/lower-namespaces.d.ts +2 -1
  554. package/dist/frontend/lowering/lower-namespaces.js +24 -3
  555. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  556. package/dist/frontend/lowering/lower-server.d.ts +10 -0
  557. package/dist/frontend/lowering/lower-server.js +263 -60
  558. package/dist/frontend/lowering/lower-server.js.map +1 -1
  559. package/dist/frontend/lowering/lower-stdlib.js +39 -18
  560. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  561. package/dist/frontend/lowering/lower-stmts.d.ts +7 -10
  562. package/dist/frontend/lowering/lower-stmts.js +584 -69
  563. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  564. package/dist/frontend/lowering/lower-stmts.test.js +1 -1
  565. package/dist/frontend/lowering/lower-stmts.test.js.map +1 -1
  566. package/dist/frontend/lowering/lower-stream.js +575 -165
  567. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  568. package/dist/frontend/lowering/lower-timers.js +21 -4
  569. package/dist/frontend/lowering/lower-timers.js.map +1 -1
  570. package/dist/frontend/lowering/lowerer.d.ts +151 -30
  571. package/dist/frontend/lowering/lowerer.js +725 -84
  572. package/dist/frontend/lowering/lowerer.js.map +1 -1
  573. package/dist/frontend/lowering/lowerer.test.js +21 -9
  574. package/dist/frontend/lowering/lowerer.test.js.map +1 -1
  575. package/dist/frontend/lowering/narrowing-stability.js +5 -0
  576. package/dist/frontend/lowering/narrowing-stability.js.map +1 -1
  577. package/dist/frontend/lowering/native-ffi.js +1 -1
  578. package/dist/frontend/lowering/native-ffi.js.map +1 -1
  579. package/dist/frontend/lowering/object-enumeration-receiver.js +2 -1
  580. package/dist/frontend/lowering/object-enumeration-receiver.js.map +1 -1
  581. package/dist/frontend/lowering/pairs-snapshot.js +2 -1
  582. package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
  583. package/dist/frontend/lowering/private-brands.d.ts +9 -0
  584. package/dist/frontend/lowering/private-brands.js +66 -15
  585. package/dist/frontend/lowering/private-brands.js.map +1 -1
  586. package/dist/frontend/lowering/promise-executor-adapter.js +2 -1
  587. package/dist/frontend/lowering/promise-executor-adapter.js.map +1 -1
  588. package/dist/frontend/lowering/rebindable-functions.d.ts +8 -0
  589. package/dist/frontend/lowering/rebindable-functions.js +54 -0
  590. package/dist/frontend/lowering/rebindable-functions.js.map +1 -0
  591. package/dist/frontend/lowering/require-initialization.js +2 -1
  592. package/dist/frontend/lowering/require-initialization.js.map +1 -1
  593. package/dist/frontend/lowering/runtime-optional-elements.d.ts +5 -0
  594. package/dist/frontend/lowering/runtime-optional-elements.js +17 -1
  595. package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -1
  596. package/dist/frontend/lowering/runtime-optional-records.d.ts +2 -0
  597. package/dist/frontend/lowering/runtime-optional-records.js +18 -5
  598. package/dist/frontend/lowering/runtime-optional-records.js.map +1 -1
  599. package/dist/frontend/lowering/site-dependencies.d.ts +35 -0
  600. package/dist/frontend/lowering/site-dependencies.js +84 -0
  601. package/dist/frontend/lowering/site-dependencies.js.map +1 -0
  602. package/dist/frontend/lowering/site-dependencies.test.d.ts +1 -0
  603. package/dist/frontend/lowering/site-dependencies.test.js +53 -0
  604. package/dist/frontend/lowering/site-dependencies.test.js.map +1 -0
  605. package/dist/frontend/lowering/stable-names.d.ts +11 -0
  606. package/dist/frontend/lowering/stable-names.js +35 -0
  607. package/dist/frontend/lowering/stable-names.js.map +1 -0
  608. package/dist/frontend/lowering/static-typeof.d.ts +26 -0
  609. package/dist/frontend/lowering/static-typeof.js +172 -0
  610. package/dist/frontend/lowering/static-typeof.js.map +1 -0
  611. package/dist/frontend/lowering/strict-equality.js +2 -1
  612. package/dist/frontend/lowering/strict-equality.js.map +1 -1
  613. package/dist/frontend/lowering/string-index-bounds.js +3 -2
  614. package/dist/frontend/lowering/string-index-bounds.js.map +1 -1
  615. package/dist/frontend/lowering/structural-positions.d.ts +32 -0
  616. package/dist/frontend/lowering/structural-positions.js +108 -0
  617. package/dist/frontend/lowering/structural-positions.js.map +1 -0
  618. package/dist/frontend/lowering/surfaces.js +72 -30
  619. package/dist/frontend/lowering/surfaces.js.map +1 -1
  620. package/dist/frontend/lowering/thenables.d.ts +16 -0
  621. package/dist/frontend/lowering/thenables.js +124 -0
  622. package/dist/frontend/lowering/thenables.js.map +1 -0
  623. package/dist/frontend/lowering/var-hoisting.js +37 -3
  624. package/dist/frontend/lowering/var-hoisting.js.map +1 -1
  625. package/dist/frontend/npm-static-builtin-aliases.d.ts +8 -0
  626. package/dist/frontend/npm-static-builtin-aliases.js +65 -0
  627. package/dist/frontend/npm-static-builtin-aliases.js.map +1 -0
  628. package/dist/frontend/npm-static-bundled-chunks.d.ts +8 -1
  629. package/dist/frontend/npm-static-bundled-chunks.js +173 -2
  630. package/dist/frontend/npm-static-bundled-chunks.js.map +1 -1
  631. package/dist/frontend/npm-static-bundled-chunks.test.js +112 -0
  632. package/dist/frontend/npm-static-bundled-chunks.test.js.map +1 -1
  633. package/dist/frontend/npm-static-bundled-esm.js +224 -4
  634. package/dist/frontend/npm-static-bundled-esm.js.map +1 -1
  635. package/dist/frontend/npm-static-bundled-esm.test.js +129 -0
  636. package/dist/frontend/npm-static-bundled-esm.test.js.map +1 -1
  637. package/dist/frontend/npm-static-enum-iife.d.ts +6 -0
  638. package/dist/frontend/npm-static-enum-iife.js +280 -0
  639. package/dist/frontend/npm-static-enum-iife.js.map +1 -0
  640. package/dist/frontend/npm-static-enum-iife.test.d.ts +1 -0
  641. package/dist/frontend/npm-static-enum-iife.test.js +116 -0
  642. package/dist/frontend/npm-static-enum-iife.test.js.map +1 -0
  643. package/dist/frontend/npm-static-tsc-helpers.d.ts +5 -0
  644. package/dist/frontend/npm-static-tsc-helpers.js +106 -0
  645. package/dist/frontend/npm-static-tsc-helpers.js.map +1 -0
  646. package/dist/frontend/npm-static-tsc-helpers.test.d.ts +1 -0
  647. package/dist/frontend/npm-static-tsc-helpers.test.js +58 -0
  648. package/dist/frontend/npm-static-tsc-helpers.test.js.map +1 -0
  649. package/dist/frontend/npm-static-type-exports-host.d.ts +8 -0
  650. package/dist/frontend/npm-static-type-exports-host.js +214 -0
  651. package/dist/frontend/npm-static-type-exports-host.js.map +1 -0
  652. package/dist/frontend/npm-static-type-exports-host.test.d.ts +1 -0
  653. package/dist/frontend/npm-static-type-exports-host.test.js +53 -0
  654. package/dist/frontend/npm-static-type-exports-host.test.js.map +1 -0
  655. package/dist/frontend/npm-static-type-exports.d.ts +52 -0
  656. package/dist/frontend/npm-static-type-exports.js +261 -0
  657. package/dist/frontend/npm-static-type-exports.js.map +1 -0
  658. package/dist/frontend/npm-static-type-exports.test.d.ts +1 -0
  659. package/dist/frontend/npm-static-type-exports.test.js +103 -0
  660. package/dist/frontend/npm-static-type-exports.test.js.map +1 -0
  661. package/dist/frontend/npm-static-umd.d.ts +6 -0
  662. package/dist/frontend/npm-static-umd.js +203 -0
  663. package/dist/frontend/npm-static-umd.js.map +1 -0
  664. package/dist/frontend/npm-static-umd.test.d.ts +1 -0
  665. package/dist/frontend/npm-static-umd.test.js +105 -0
  666. package/dist/frontend/npm-static-umd.test.js.map +1 -0
  667. package/dist/frontend/npm-static.d.ts +16 -0
  668. package/dist/frontend/npm-static.js +93 -3
  669. package/dist/frontend/npm-static.js.map +1 -1
  670. package/dist/frontend/npm.js +13 -0
  671. package/dist/frontend/npm.js.map +1 -1
  672. package/dist/frontend/package-shims.d.ts +47 -0
  673. package/dist/frontend/package-shims.js +300 -0
  674. package/dist/frontend/package-shims.js.map +1 -0
  675. package/dist/frontend/pipeline.js +67 -1
  676. package/dist/frontend/pipeline.js.map +1 -1
  677. package/dist/frontend/program.d.ts +21 -0
  678. package/dist/frontend/program.js +174 -14
  679. package/dist/frontend/program.js.map +1 -1
  680. package/dist/frontend/program.test.js +1 -1
  681. package/dist/frontend/program.test.js.map +1 -1
  682. package/dist/frontend/resolve.js +13 -0
  683. package/dist/frontend/resolve.js.map +1 -1
  684. package/dist/frontend/services.d.ts +12 -0
  685. package/dist/frontend/services.js +37 -0
  686. package/dist/frontend/services.js.map +1 -1
  687. package/dist/frontend/ts7/ast-node.d.ts +21 -7
  688. package/dist/frontend/ts7/ast-node.js +131 -29
  689. package/dist/frontend/ts7/ast-node.js.map +1 -1
  690. package/dist/frontend/ts7/ast-node.test.js +60 -0
  691. package/dist/frontend/ts7/ast-node.test.js.map +1 -1
  692. package/dist/frontend/ts7/ast-wire.d.ts +27 -2
  693. package/dist/frontend/ts7/ast-wire.js +124 -21
  694. package/dist/frontend/ts7/ast-wire.js.map +1 -1
  695. package/dist/frontend/ts7/ast.d.ts +23 -2
  696. package/dist/frontend/ts7/ast.js +143 -2
  697. package/dist/frontend/ts7/ast.js.map +1 -1
  698. package/dist/frontend/ts7/checker.d.ts +13 -1
  699. package/dist/frontend/ts7/checker.js +75 -1
  700. package/dist/frontend/ts7/checker.js.map +1 -1
  701. package/dist/frontend/ts7/checker.test.js +9 -6
  702. package/dist/frontend/ts7/checker.test.js.map +1 -1
  703. package/dist/frontend/ts7/enums.d.ts +3 -3
  704. package/dist/frontend/ts7/enums.generated.d.ts +10 -0
  705. package/dist/frontend/ts7/enums.generated.js +21 -0
  706. package/dist/frontend/ts7/enums.generated.js.map +1 -1
  707. package/dist/frontend/ts7/enums.js +19 -0
  708. package/dist/frontend/ts7/enums.js.map +1 -1
  709. package/dist/frontend/ts7/program-host.d.ts +6 -5
  710. package/dist/frontend/ts7/program-host.js +12 -2
  711. package/dist/frontend/ts7/program-host.js.map +1 -1
  712. package/dist/frontend/ts7/semantic-checker.d.ts +10 -0
  713. package/dist/frontend/ts7/semantic-checker.js +25 -20
  714. package/dist/frontend/ts7/semantic-checker.js.map +1 -1
  715. package/dist/frontend/ts7/semantic-json.d.ts +13 -0
  716. package/dist/frontend/ts7/semantic-json.js +146 -0
  717. package/dist/frontend/ts7/semantic-json.js.map +1 -1
  718. package/dist/frontend/ts7/semantic-json.test.js +57 -1
  719. package/dist/frontend/ts7/semantic-json.test.js.map +1 -1
  720. package/dist/frontend/ts7/semantic-model.d.ts +18 -0
  721. package/dist/frontend/ts7/semantic-model.js +90 -16
  722. package/dist/frontend/ts7/semantic-model.js.map +1 -1
  723. package/dist/frontend/ts7/semantic-model.test.js +3 -2
  724. package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
  725. package/dist/frontend/ts7/session.d.ts +19 -4
  726. package/dist/frontend/ts7/session.js +1 -1
  727. package/dist/frontend/ts7/session.js.map +1 -1
  728. package/dist/frontend/tsc-codes.d.ts +1 -1
  729. package/dist/frontend/tsc-codes.js +7 -0
  730. package/dist/frontend/tsc-codes.js.map +1 -1
  731. package/dist/frontend/type-mapper.d.ts +38 -6
  732. package/dist/frontend/type-mapper.js +466 -47
  733. package/dist/frontend/type-mapper.js.map +1 -1
  734. package/dist/frontend/type-mapper.test.js +1 -1
  735. package/dist/frontend/type-mapper.test.js.map +1 -1
  736. package/dist/frontend-process-args.d.ts +4 -0
  737. package/dist/frontend-process-args.js +52 -0
  738. package/dist/frontend-process-args.js.map +1 -0
  739. package/dist/frontend-process-args.test.d.ts +1 -0
  740. package/dist/frontend-process-args.test.js +47 -0
  741. package/dist/frontend-process-args.test.js.map +1 -0
  742. package/dist/frontend-process.d.ts +1 -0
  743. package/dist/frontend-process.js +23 -0
  744. package/dist/frontend-process.js.map +1 -0
  745. package/dist/heap-collection.d.ts +16 -0
  746. package/dist/heap-collection.js +42 -0
  747. package/dist/heap-collection.js.map +1 -0
  748. package/dist/heap-collection.test.d.ts +1 -0
  749. package/dist/heap-collection.test.js +59 -0
  750. package/dist/heap-collection.test.js.map +1 -0
  751. package/dist/heap-pressure.d.ts +2 -0
  752. package/dist/heap-pressure.js +12 -0
  753. package/dist/heap-pressure.js.map +1 -0
  754. package/dist/index.d.ts +8 -0
  755. package/dist/index.js +453 -85
  756. package/dist/index.js.map +1 -1
  757. package/dist/ir/array-length-stability.d.ts +3 -2
  758. package/dist/ir/array-length-stability.js +22 -2
  759. package/dist/ir/array-length-stability.js.map +1 -1
  760. package/dist/ir/array-length-stability.test.js +47 -1
  761. package/dist/ir/array-length-stability.test.js.map +1 -1
  762. package/dist/ir/builtin-effects.js +41 -0
  763. package/dist/ir/builtin-effects.js.map +1 -1
  764. package/dist/ir/builtin-signatures.d.ts +5 -1
  765. package/dist/ir/builtin-signatures.js +187 -16
  766. package/dist/ir/builtin-signatures.js.map +1 -1
  767. package/dist/ir/final-fields.d.ts +2 -1
  768. package/dist/ir/final-fields.js +2 -2
  769. package/dist/ir/final-fields.js.map +1 -1
  770. package/dist/ir/function-references.test.js +2 -0
  771. package/dist/ir/function-references.test.js.map +1 -1
  772. package/dist/ir/int32-slots.d.ts +13 -5
  773. package/dist/ir/int32-slots.js +112 -115
  774. package/dist/ir/int32-slots.js.map +1 -1
  775. package/dist/ir/int32-slots.test.js +3 -1
  776. package/dist/ir/int32-slots.test.js.map +1 -1
  777. package/dist/ir/integer-loop-facts.d.ts +14 -4
  778. package/dist/ir/integer-loop-facts.js +172 -32
  779. package/dist/ir/integer-loop-facts.js.map +1 -1
  780. package/dist/ir/integer-loops.d.ts +49 -0
  781. package/dist/ir/integer-loops.js +193 -39
  782. package/dist/ir/integer-loops.js.map +1 -1
  783. package/dist/ir/integer-loops.test.js +201 -1
  784. package/dist/ir/integer-loops.test.js.map +1 -1
  785. package/dist/ir/integer-ranges.d.ts +10 -1
  786. package/dist/ir/integer-ranges.js +122 -25
  787. package/dist/ir/integer-ranges.js.map +1 -1
  788. package/dist/ir/integer-ranges.test.js +255 -1
  789. package/dist/ir/integer-ranges.test.js.map +1 -1
  790. package/dist/ir/ir.d.ts +17 -2
  791. package/dist/ir/ir.js +11 -1
  792. package/dist/ir/ir.js.map +1 -1
  793. package/dist/ir/js-ic.d.ts +52 -0
  794. package/dist/ir/js-ic.js +199 -0
  795. package/dist/ir/js-ic.js.map +1 -0
  796. package/dist/ir/js-ic.test.d.ts +1 -0
  797. package/dist/ir/js-ic.test.js +148 -0
  798. package/dist/ir/js-ic.test.js.map +1 -0
  799. package/dist/ir/jsval.js +38 -4
  800. package/dist/ir/jsval.js.map +1 -1
  801. package/dist/ir/runtime-features.d.ts +64 -5
  802. package/dist/ir/runtime-features.js +358 -101
  803. package/dist/ir/runtime-features.js.map +1 -1
  804. package/dist/ir/tiers.js +1 -0
  805. package/dist/ir/tiers.js.map +1 -1
  806. package/dist/ir/traverse.d.ts +2 -0
  807. package/dist/ir/traverse.js +124 -70
  808. package/dist/ir/traverse.js.map +1 -1
  809. package/dist/ir/validate.js +77 -24
  810. package/dist/ir/validate.js.map +1 -1
  811. package/dist/ir/validate.test.js +15 -2
  812. package/dist/ir/validate.test.js.map +1 -1
  813. package/dist/library/ir-policy.js +11 -0
  814. package/dist/library/ir-policy.js.map +1 -1
  815. package/dist/library/library-cache.d.ts +2 -0
  816. package/dist/library/library-cache.js.map +1 -1
  817. package/dist/library/prepare.js +2 -0
  818. package/dist/library/prepare.js.map +1 -1
  819. package/dist/native/cli.js +22 -0
  820. package/dist/native/cli.js.map +1 -1
  821. package/dist/native/compiler.js +33 -4
  822. package/dist/native/compiler.js.map +1 -1
  823. package/dist/native/executable-cache.js +3 -0
  824. package/dist/native/executable-cache.js.map +1 -1
  825. package/dist/native/prepare.js +8 -1
  826. package/dist/native/prepare.js.map +1 -1
  827. package/dist/native/sanitizer.test.js +10 -0
  828. package/dist/native/sanitizer.test.js.map +1 -1
  829. package/dist/startup-cache.d.ts +1 -0
  830. package/dist/startup-cache.js +1 -0
  831. package/dist/startup-cache.js.map +1 -1
  832. package/dist/text-parts.d.ts +7 -0
  833. package/dist/text-parts.js +44 -0
  834. package/dist/text-parts.js.map +1 -1
  835. package/dist/text-parts.test.d.ts +1 -0
  836. package/dist/text-parts.test.js +46 -0
  837. package/dist/text-parts.test.js.map +1 -0
  838. package/dist/timing.d.ts +9 -2
  839. package/dist/timing.js +7 -4
  840. package/dist/timing.js.map +1 -1
  841. package/dist/wasm/translate.d.ts +4 -0
  842. package/dist/wasm/translate.js +2 -2
  843. package/dist/wasm/translate.js.map +1 -1
  844. package/package.json +22 -21
  845. package/shims/fs-extra/core/api.ts +1192 -0
  846. package/shims/fs-extra/index.ts +9 -0
  847. package/shims/undici/core/agent.ts +163 -0
  848. package/shims/undici/core/api.ts +93 -0
  849. package/shims/undici/core/client.ts +1304 -0
  850. package/shims/undici/core/connector.ts +157 -0
  851. package/shims/undici/core/diagnostics-types.ts +68 -0
  852. package/shims/undici/core/diagnostics.ts +16 -0
  853. package/shims/undici/core/dispatcher.ts +574 -0
  854. package/shims/undici/core/errors-v5.ts +22 -0
  855. package/shims/undici/core/errors-v7.ts +25 -0
  856. package/shims/undici/core/errors.ts +255 -0
  857. package/shims/undici/core/fetch.ts +635 -0
  858. package/shims/undici/core/pool.ts +280 -0
  859. package/shims/undici/core/readable.ts +268 -0
  860. package/shims/undici/core/request.ts +313 -0
  861. package/shims/undici/core/timers.ts +80 -0
  862. package/shims/undici/core/types.ts +167 -0
  863. package/shims/undici/core/util.ts +67 -0
  864. package/shims/undici/v5.ts +119 -0
  865. package/shims/undici/v7.ts +119 -0
  866. package/surface-manifest.json +20 -52
@@ -0,0 +1,1304 @@
1
+ // undici's Client (lib/dispatcher/client.js + client-h1.js): HTTP/1.1 over
2
+ // one TCP/TLS connection at a time, with keep-alive reuse, a request queue,
3
+ // headers/body/idle timeouts and the same request lifecycle callbacks.
4
+ import type { Socket } from "node:net";
5
+ import { buildConnector } from "./connector.ts";
6
+ import { channels } from "./diagnostics.ts";
7
+ import { DispatcherBase } from "./dispatcher.ts";
8
+ import type { Dispatcher } from "./dispatcher.ts";
9
+ import {
10
+ BodyTimeoutError,
11
+ HeadersOverflowError,
12
+ HeadersTimeoutError,
13
+ HTTPParserError,
14
+ InformationalError,
15
+ InvalidArgumentError,
16
+ NotSupportedError,
17
+ RequestAbortedError,
18
+ RequestContentLengthMismatchError,
19
+ ResponseContentLengthMismatchError,
20
+ ResponseExceededMaxSizeError,
21
+ SocketError,
22
+ UndiciError,
23
+ } from "./errors.ts";
24
+ import type { SocketInfo } from "./errors.ts";
25
+ import { Request } from "./request.ts";
26
+ import { FastTimer } from "./timers.ts";
27
+ import { parseKeepAliveTimeout, parseOrigin } from "./util.ts";
28
+ import type {
29
+ ClientOptions,
30
+ Connector,
31
+ ConnectorOptions,
32
+ DispatchHandlers,
33
+ DispatchOptions,
34
+ Profile,
35
+ } from "./types.ts";
36
+
37
+ const TIMEOUT_NONE = 0;
38
+ const TIMEOUT_HEADERS = 1;
39
+ const TIMEOUT_BODY = 2;
40
+ const TIMEOUT_IDLE = 3;
41
+
42
+ export class Client extends DispatcherBase {
43
+ __url: URL;
44
+ __connector: Connector;
45
+ __socket: Socket | null;
46
+ __connecting: boolean;
47
+ __queue: (Request | null)[];
48
+ __runningIdx: number;
49
+ __pendingIdx: number;
50
+ __pipelining: number;
51
+ __hostHeader: string;
52
+ __maxHeaderSize: number;
53
+ __keepAliveDefaultTimeout: number;
54
+ __keepAliveMaxTimeout: number;
55
+ __keepAliveTimeoutThreshold: number;
56
+ __keepAliveTimeoutValue: number;
57
+ __headersTimeout: number;
58
+ __bodyTimeout: number;
59
+ __strictContentLength: boolean;
60
+ __maxRequests: number;
61
+ __maxResponseSize: number;
62
+ __resuming: number;
63
+ __needDrain: number;
64
+ __closedResolve: (() => void) | null;
65
+ __serverName: string | null;
66
+ __localAddress: string | null;
67
+ // Per-connection state (one socket at a time).
68
+ __sockNoRef: boolean;
69
+ __sockReset: boolean;
70
+ __sockBlocking: boolean;
71
+ __sockCounter: number;
72
+ __parser: ResponseParser | null;
73
+ __sockError: Error | null;
74
+ // The parser timer, held as closures over its handle (a nullable timer
75
+ // field does not compile under @types/node).
76
+ __timerCancel: (() => void) | null;
77
+ __timerRefresh: (() => void) | null;
78
+ __timerType: number;
79
+
80
+ constructor(url: string | URL, options: ClientOptions | undefined, profile: Profile) {
81
+ super(profile);
82
+ const opts: ClientOptions = options ?? {};
83
+ const pipelining = opts.pipelining ?? 1;
84
+ if (!Number.isInteger(pipelining) || pipelining < 0) {
85
+ throw new InvalidArgumentError("invalid pipelining");
86
+ }
87
+ if (pipelining > 1) {
88
+ throw new NotSupportedError(
89
+ "scriptc's undici client does not pipeline more than one request yet",
90
+ );
91
+ }
92
+ const maxHeaderSize = opts.maxHeaderSize ?? null;
93
+ if (maxHeaderSize !== null && !Number.isFinite(maxHeaderSize)) {
94
+ throw new InvalidArgumentError("invalid maxHeaderSize");
95
+ }
96
+ const connectTimeout = opts.connectTimeout ?? null;
97
+ if (connectTimeout !== null && (!Number.isFinite(connectTimeout) || connectTimeout < 0)) {
98
+ throw new InvalidArgumentError("invalid connectTimeout");
99
+ }
100
+ const keepAliveTimeout = opts.keepAliveTimeout ?? null;
101
+ if (
102
+ keepAliveTimeout !== null &&
103
+ (!Number.isFinite(keepAliveTimeout) || keepAliveTimeout <= 0)
104
+ ) {
105
+ throw new InvalidArgumentError("invalid keepAliveTimeout");
106
+ }
107
+ const keepAliveMaxTimeout = opts.keepAliveMaxTimeout ?? null;
108
+ if (
109
+ keepAliveMaxTimeout !== null &&
110
+ (!Number.isFinite(keepAliveMaxTimeout) || keepAliveMaxTimeout <= 0)
111
+ ) {
112
+ throw new InvalidArgumentError("invalid keepAliveMaxTimeout");
113
+ }
114
+ const keepAliveTimeoutThreshold = opts.keepAliveTimeoutThreshold ?? null;
115
+ if (keepAliveTimeoutThreshold !== null && !Number.isFinite(keepAliveTimeoutThreshold)) {
116
+ throw new InvalidArgumentError("invalid keepAliveTimeoutThreshold");
117
+ }
118
+ const headersTimeout = opts.headersTimeout ?? null;
119
+ if (headersTimeout !== null && (!Number.isInteger(headersTimeout) || headersTimeout < 0)) {
120
+ throw new InvalidArgumentError("headersTimeout must be a positive integer or zero");
121
+ }
122
+ const bodyTimeout = opts.bodyTimeout ?? null;
123
+ if (bodyTimeout !== null && (!Number.isInteger(bodyTimeout) || bodyTimeout < 0)) {
124
+ throw new InvalidArgumentError("bodyTimeout must be a positive integer or zero");
125
+ }
126
+ const maxRequests = opts.maxRequestsPerClient ?? 0;
127
+ if (!Number.isInteger(maxRequests) || maxRequests < 0) {
128
+ throw new InvalidArgumentError("maxRequestsPerClient must be a positive number");
129
+ }
130
+ const maxResponseSize = opts.maxResponseSize ?? -1;
131
+ if (!Number.isInteger(maxResponseSize) || maxResponseSize < -1) {
132
+ throw new InvalidArgumentError("maxResponseSize must be a positive number");
133
+ }
134
+
135
+ const connect = opts.connect ?? null;
136
+ if (typeof connect === "function") {
137
+ this.__connector = connect;
138
+ } else {
139
+ this.__connector = buildConnector(
140
+ connect !== null
141
+ ? {
142
+ ...connect,
143
+ timeout: connect.timeout !== undefined ? connect.timeout : connectTimeout,
144
+ }
145
+ : { timeout: connectTimeout },
146
+ );
147
+ }
148
+ // 5.x composes `interceptors.Client` around dispatch; 7.x dropped the
149
+ // option and ignores it.
150
+ const interceptors = opts.interceptors;
151
+ if (profile.major < 7 && interceptors !== undefined && interceptors.Client !== undefined) {
152
+ this.__interceptors = interceptors.Client;
153
+ }
154
+
155
+ this.__url = parseOrigin(url, profile);
156
+ this.__socket = null;
157
+ this.__connecting = false;
158
+ this.__queue = [];
159
+ this.__runningIdx = 0;
160
+ this.__pendingIdx = 0;
161
+ this.__pipelining = pipelining;
162
+ this.__hostHeader = `host: ${this.__url.hostname}${this.__url.port ? `:${this.__url.port}` : ""}\r\n`;
163
+ this.__maxHeaderSize = maxHeaderSize !== null && maxHeaderSize !== 0 ? maxHeaderSize : 16384;
164
+ this.__keepAliveDefaultTimeout = keepAliveTimeout ?? 4e3;
165
+ this.__keepAliveMaxTimeout = keepAliveMaxTimeout ?? 600e3;
166
+ this.__keepAliveTimeoutThreshold =
167
+ keepAliveTimeoutThreshold ?? (profile.major >= 7 ? 2e3 : 1e3);
168
+ this.__keepAliveTimeoutValue = this.__keepAliveDefaultTimeout;
169
+ const defaultTimeout = profile.major >= 7 ? 300e3 : 30e3;
170
+ this.__headersTimeout = headersTimeout ?? defaultTimeout;
171
+ this.__bodyTimeout = bodyTimeout ?? defaultTimeout;
172
+ this.__strictContentLength = opts.strictContentLength ?? true;
173
+ this.__maxRequests = maxRequests;
174
+ this.__maxResponseSize = maxResponseSize;
175
+ this.__resuming = 0;
176
+ this.__needDrain = 0;
177
+ this.__closedResolve = null;
178
+ this.__serverName = null;
179
+ this.__localAddress = opts.localAddress ?? null;
180
+ this.__sockNoRef = false;
181
+ this.__sockReset = false;
182
+ this.__sockBlocking = false;
183
+ this.__sockCounter = 0;
184
+ this.__parser = null;
185
+ this.__sockError = null;
186
+ this.__timerCancel = null;
187
+ this.__timerRefresh = null;
188
+ this.__timerType = TIMEOUT_NONE;
189
+ }
190
+
191
+ get pipelining(): number {
192
+ return this.__pipelining;
193
+ }
194
+
195
+ __pendingCount(): number {
196
+ return this.__queue.length - this.__pendingIdx;
197
+ }
198
+
199
+ __runningCount(): number {
200
+ return this.__pendingIdx - this.__runningIdx;
201
+ }
202
+
203
+ __sizeCount(): number {
204
+ return this.__queue.length - this.__runningIdx;
205
+ }
206
+
207
+ __connectedFlag(): boolean {
208
+ const socket = this.__socket;
209
+ return socket !== null && !this.__connecting && !socket.destroyed;
210
+ }
211
+
212
+ __busy(): boolean {
213
+ return (
214
+ (this.__socket !== null && (this.__sockReset || this.__sockBlocking)) ||
215
+ this.__sizeCount() >= (this.__pipelining || 1) ||
216
+ this.__pendingCount() > 0
217
+ );
218
+ }
219
+
220
+ __dispatch(opts: DispatchOptions, handler: DispatchHandlers): boolean {
221
+ const originValue = opts.origin;
222
+ const origin =
223
+ originValue === undefined || originValue === ""
224
+ ? this.__url.origin
225
+ : typeof originValue === "string"
226
+ ? originValue
227
+ : originValue.origin;
228
+ const request = new Request(origin, opts, handler, this.__profile);
229
+ this.__queue.push(request);
230
+ if (this.__resuming === 0) this.__resume(true);
231
+ if (this.__resuming !== 0 && this.__needDrain !== 2 && this.__busy()) this.__needDrain = 2;
232
+ return this.__needDrain < 2;
233
+ }
234
+
235
+ __close(): Promise<void> {
236
+ return new Promise<void>((resolve) => {
237
+ if (this.__sizeCount() === 0) {
238
+ this.destroy().then(() => resolve());
239
+ } else {
240
+ this.__closedResolve = resolve;
241
+ }
242
+ });
243
+ }
244
+
245
+ __destroy(err: Error): Promise<void> {
246
+ return new Promise<void>((resolve) => {
247
+ const requests = this.__queue.splice(this.__pendingIdx);
248
+ for (const request of requests) if (request !== null) this.__errorRequest(request, err);
249
+ const done = (): void => {
250
+ const closed = this.__closedResolve;
251
+ if (closed !== null) {
252
+ this.__closedResolve = null;
253
+ closed();
254
+ }
255
+ resolve();
256
+ };
257
+ const socket = this.__socket;
258
+ if (socket === null) {
259
+ queueMicrotask(done);
260
+ } else {
261
+ socket.on("close", () => done());
262
+ this.__destroySocket(socket, err);
263
+ }
264
+ this.__resume(false);
265
+ });
266
+ }
267
+
268
+ /** util.destroy(socket, err): remember the first error for 'close'. */
269
+ __destroySocket(socket: Socket, err: Error): void {
270
+ if (socket === this.__socket && this.__sockError === null) this.__sockError = err;
271
+ socket.destroy();
272
+ }
273
+
274
+ __errorRequest(request: Request, err: Error): void {
275
+ try {
276
+ request.onError(err);
277
+ } catch (e) {
278
+ this.emit("error", e as Error);
279
+ }
280
+ }
281
+
282
+ __socketInfo(): SocketInfo {
283
+ const socket = this.__socket;
284
+ if (socket === null) return {};
285
+ return {
286
+ localAddress: socket.localAddress,
287
+ localPort: socket.localPort,
288
+ remoteAddress: socket.remoteAddress,
289
+ remotePort: socket.remotePort,
290
+ remoteFamily: socket.remoteFamily,
291
+ timeout: undefined,
292
+ bytesWritten: socket.bytesWritten,
293
+ bytesRead: socket.bytesRead,
294
+ };
295
+ }
296
+
297
+ /** The parser timer: 5.x uses native timers throughout; 7.x drives the
298
+ * headers and body timeouts from its fast timers. */
299
+ __setTimeout(delay: number, type: number): void {
300
+ this.__clearTimer();
301
+ this.__timerType = type;
302
+ if (delay > 0) {
303
+ if (this.__profile.major >= 7 && (type === TIMEOUT_HEADERS || type === TIMEOUT_BODY)) {
304
+ const fast = new FastTimer(() => this.__onTimeout(), delay);
305
+ this.__timerCancel = () => fast.clear();
306
+ this.__timerRefresh = () => fast.refresh();
307
+ } else {
308
+ const timer = setTimeout(() => this.__onTimeout(), delay);
309
+ timer.unref();
310
+ this.__timerCancel = () => clearTimeout(timer);
311
+ this.__timerRefresh = () => {
312
+ timer.refresh();
313
+ };
314
+ }
315
+ }
316
+ }
317
+
318
+ __clearTimer(): void {
319
+ const cancel = this.__timerCancel;
320
+ this.__timerCancel = null;
321
+ this.__timerRefresh = null;
322
+ if (cancel !== null) cancel();
323
+ }
324
+
325
+ __refreshTimer(): void {
326
+ const refresh = this.__timerRefresh;
327
+ if (refresh !== null) refresh();
328
+ }
329
+
330
+ __onTimeout(): void {
331
+ const socket = this.__socket;
332
+ const parser = this.__parser;
333
+ // A body timeout that fires while the response is paused keeps its
334
+ // timer: resuming refreshes it, as undici's parser does.
335
+ if (this.__timerType === TIMEOUT_BODY && parser !== null && parser.paused) return;
336
+ this.__timerCancel = null;
337
+ this.__timerRefresh = null;
338
+ if (socket === null || parser === null) return;
339
+ if (this.__timerType === TIMEOUT_HEADERS) {
340
+ this.__destroySocket(socket, new HeadersTimeoutError());
341
+ } else if (this.__timerType === TIMEOUT_BODY) {
342
+ this.__destroySocket(socket, new BodyTimeoutError());
343
+ } else if (this.__timerType === TIMEOUT_IDLE) {
344
+ this.__destroySocket(socket, new InformationalError("socket idle timeout"));
345
+ }
346
+ }
347
+
348
+ __connect(): void {
349
+ const url = this.__url;
350
+ let hostname = url.hostname;
351
+ if (hostname.startsWith("[")) {
352
+ const idx = hostname.indexOf("]");
353
+ hostname = hostname.slice(1, idx);
354
+ }
355
+ this.__connecting = true;
356
+ const params: ConnectorOptions = {
357
+ host: url.host,
358
+ hostname,
359
+ protocol: url.protocol,
360
+ port: url.port,
361
+ servername: this.__serverName ?? undefined,
362
+ localAddress: this.__localAddress,
363
+ };
364
+ const connectParams = {
365
+ host: url.host,
366
+ hostname,
367
+ protocol: url.protocol,
368
+ port: url.port,
369
+ servername: this.__serverName,
370
+ localAddress: this.__localAddress,
371
+ };
372
+ if (channels.beforeConnect.hasSubscribers) {
373
+ channels.beforeConnect.publish({ connectParams, connector: this.__connector });
374
+ }
375
+ let settled = false;
376
+ const onConnected = (err: Error | null, socket: Socket | null): void => {
377
+ if (settled) return;
378
+ settled = true;
379
+ // undici awaits the connector's promise: continue on a later tick.
380
+ queueMicrotask(() => {
381
+ if (err !== null || socket === null)
382
+ this.__onConnectError(err ?? new SocketError("connect failed"), connectParams);
383
+ else this.__onConnected(socket, connectParams);
384
+ });
385
+ };
386
+ try {
387
+ this.__connector(params, onConnected);
388
+ } catch (err) {
389
+ onConnected(err as Error, null);
390
+ }
391
+ }
392
+
393
+ __onConnected(
394
+ socket: Socket,
395
+ connectParams: {
396
+ host: string;
397
+ hostname: string;
398
+ protocol: string;
399
+ port: string;
400
+ servername: string | null;
401
+ localAddress: string | null;
402
+ },
403
+ ): void {
404
+ this.__connecting = false;
405
+ if (this.destroyed) {
406
+ socket.destroy();
407
+ this.__resume(false);
408
+ return;
409
+ }
410
+ this.__socket = socket;
411
+ this.__sockNoRef = false;
412
+ this.__sockReset = false;
413
+ this.__sockBlocking = false;
414
+ this.__sockCounter = 0;
415
+ this.__sockError = null;
416
+ const parser = new ResponseParser(this, socket);
417
+ this.__parser = parser;
418
+ socket.on("data", (chunk: Buffer) => {
419
+ if (this.__socket === socket) parser.execute(chunk);
420
+ });
421
+ socket.on("error", (err: Error) => {
422
+ if (this.__socket === socket) this.__onSocketError(socket, err);
423
+ });
424
+ socket.on("end", () => {
425
+ if (this.__socket === socket) this.__onSocketEnd(socket);
426
+ });
427
+ socket.on("close", () => {
428
+ if (this.__socket === socket) this.__onSocketClose(socket);
429
+ });
430
+ if (channels.connected.hasSubscribers) {
431
+ channels.connected.publish({ connectParams, connector: this.__connector, socket });
432
+ }
433
+ this.emit("connect", this.__url, [this as Dispatcher]);
434
+ this.__resume(false);
435
+ }
436
+
437
+ __onConnectError(
438
+ err: Error,
439
+ connectParams: {
440
+ host: string;
441
+ hostname: string;
442
+ protocol: string;
443
+ port: string;
444
+ servername: string | null;
445
+ localAddress: string | null;
446
+ },
447
+ ): void {
448
+ this.__connecting = false;
449
+ if (channels.connectError.hasSubscribers) {
450
+ channels.connectError.publish({ connectParams, connector: this.__connector, error: err });
451
+ }
452
+ this.__onError(err);
453
+ this.emit("connectionError", this.__url, [this as Dispatcher], err);
454
+ this.__resume(false);
455
+ }
456
+
457
+ /** client.js onError: with nothing running, a connection-level failure
458
+ * fails every queued request. */
459
+ __onError(err: Error): void {
460
+ const code = errorCode(err);
461
+ if (this.__runningCount() === 0 && code !== "UND_ERR_INFO" && code !== "UND_ERR_SOCKET") {
462
+ const requests = this.__queue.splice(this.__runningIdx);
463
+ for (const request of requests) if (request !== null) this.__errorRequest(request, err);
464
+ }
465
+ }
466
+
467
+ __onSocketError(socket: Socket, err: Error): void {
468
+ const parser = this.__parser;
469
+ if (
470
+ errorCode(err) === "ECONNRESET" &&
471
+ parser !== null &&
472
+ parser.statusCode !== 0 &&
473
+ !parser.shouldKeepAlive
474
+ ) {
475
+ parser.finishOnEof();
476
+ return;
477
+ }
478
+ this.__destroySocket(socket, err);
479
+ this.__onError(err);
480
+ }
481
+
482
+ __onSocketEnd(socket: Socket): void {
483
+ const parser = this.__parser;
484
+ if (parser !== null && parser.statusCode !== 0 && !parser.shouldKeepAlive) {
485
+ parser.finishOnEof();
486
+ return;
487
+ }
488
+ this.__destroySocket(socket, new SocketError("other side closed", this.__socketInfo()));
489
+ }
490
+
491
+ __onSocketClose(_socket: Socket): void {
492
+ const parser = this.__parser;
493
+ const recorded = this.__sockError;
494
+ this.__sockError = null;
495
+ if (
496
+ recorded === null &&
497
+ parser !== null &&
498
+ parser.statusCode !== 0 &&
499
+ !parser.shouldKeepAlive
500
+ ) {
501
+ parser.finishOnEof();
502
+ }
503
+ const err = recorded ?? new SocketError("closed", this.__socketInfo());
504
+ this.__parser = null;
505
+ this.__socket = null;
506
+ this.__clearTimer();
507
+ this.__timerType = TIMEOUT_NONE;
508
+ if (this.destroyed) {
509
+ const requests = this.__queue.splice(this.__runningIdx);
510
+ for (const request of requests) if (request !== null) this.__errorRequest(request, err);
511
+ } else if (this.__runningCount() > 0 && errorCode(err) !== "UND_ERR_INFO") {
512
+ const request = this.__queue[this.__runningIdx];
513
+ this.__queue[this.__runningIdx++] = null;
514
+ if (request !== null && request !== undefined) this.__errorRequest(request, err);
515
+ }
516
+ this.__pendingIdx = this.__runningIdx;
517
+ this.emit("disconnect", this.__url, [this as Dispatcher], err);
518
+ this.__resume(false);
519
+ }
520
+
521
+ __emitDrain(): void {
522
+ this.__needDrain = 0;
523
+ this.emit("drain", this.__url, [this as Dispatcher]);
524
+ }
525
+
526
+ __resume(sync: boolean): void {
527
+ if (this.__resuming === 2) return;
528
+ this.__resuming = 2;
529
+ this.__resumeLoop(sync);
530
+ this.__resuming = 0;
531
+ if (this.__runningIdx > 256) {
532
+ this.__queue.splice(0, this.__runningIdx);
533
+ this.__pendingIdx -= this.__runningIdx;
534
+ this.__runningIdx = 0;
535
+ }
536
+ }
537
+
538
+ __resumeLoop(sync: boolean): void {
539
+ for (;;) {
540
+ if (this.destroyed) return;
541
+ if (this.closed && this.__sizeCount() === 0) {
542
+ this.destroy();
543
+ return;
544
+ }
545
+ const socket = this.__socket;
546
+ const parser = this.__parser;
547
+ if (socket !== null && parser !== null) {
548
+ if (this.__sizeCount() === 0) {
549
+ if (!this.__sockNoRef) {
550
+ socket.unref();
551
+ this.__sockNoRef = true;
552
+ }
553
+ } else if (this.__sockNoRef) {
554
+ socket.ref();
555
+ this.__sockNoRef = false;
556
+ }
557
+ if (this.__sizeCount() === 0) {
558
+ if (this.__timerType !== TIMEOUT_IDLE)
559
+ this.__setTimeout(this.__keepAliveTimeoutValue, TIMEOUT_IDLE);
560
+ } else if (this.__runningCount() > 0 && parser.statusCode < 200) {
561
+ if (this.__timerType !== TIMEOUT_HEADERS) {
562
+ const request = this.__queue[this.__runningIdx];
563
+ const headersTimeout =
564
+ request !== null && request !== undefined && request.headersTimeout !== null
565
+ ? request.headersTimeout
566
+ : this.__headersTimeout;
567
+ this.__setTimeout(headersTimeout, TIMEOUT_HEADERS);
568
+ }
569
+ }
570
+ }
571
+
572
+ if (this.__busy()) {
573
+ this.__needDrain = 2;
574
+ } else if (this.__needDrain === 2) {
575
+ if (sync) {
576
+ this.__needDrain = 1;
577
+ process.nextTick(() => this.__emitDrain());
578
+ } else {
579
+ this.__emitDrain();
580
+ }
581
+ continue;
582
+ }
583
+
584
+ if (this.__pendingCount() === 0) return;
585
+ if (this.__runningCount() >= (this.__pipelining || 1)) return;
586
+
587
+ const request = this.__queue[this.__pendingIdx]!;
588
+ if (this.__url.protocol === "https:" && this.__serverName !== request.servername) {
589
+ if (this.__runningCount() > 0) return;
590
+ this.__serverName = request.servername;
591
+ if (socket !== null) {
592
+ this.__destroySocket(socket, new InformationalError("servername changed"));
593
+ return;
594
+ }
595
+ }
596
+ if (this.__connecting) return;
597
+ if (socket === null) {
598
+ this.__connect();
599
+ continue;
600
+ }
601
+ if (socket.destroyed || this.__sockReset || this.__sockBlocking) return;
602
+ if (this.__runningCount() > 0 && !request.idempotent) return;
603
+
604
+ if (!request.aborted && this.__write(request, socket)) {
605
+ this.__pendingIdx++;
606
+ } else {
607
+ this.__queue.splice(this.__pendingIdx, 1);
608
+ }
609
+ }
610
+ }
611
+
612
+ __write(request: Request, socket: Socket): boolean {
613
+ const method = request.method;
614
+ const body = request.body;
615
+ const expectsPayload = method === "PUT" || method === "POST" || method === "PATCH";
616
+ // util.bodyLength: a missing body has length 0.
617
+ let contentLength: number | null = body !== null ? body.length : 0;
618
+ if (contentLength === 0 && !expectsPayload) contentLength = null;
619
+ const declared = request.contentLength;
620
+ const sendsLength =
621
+ method !== "GET" && method !== "HEAD" && method !== "OPTIONS" && method !== "TRACE";
622
+ const mismatch =
623
+ declared !== null &&
624
+ declared !== contentLength &&
625
+ (this.__profile.major < 7 || (sendsLength && contentLength !== null && contentLength > 0));
626
+ if (mismatch) {
627
+ if (this.__strictContentLength) {
628
+ this.__errorRequest(request, new RequestContentLengthMismatchError());
629
+ return false;
630
+ }
631
+ process.emitWarning(new RequestContentLengthMismatchError());
632
+ }
633
+
634
+ const abort = (err?: Error): void => {
635
+ if (request.aborted || request.completed) return;
636
+ this.__errorRequest(request, err ?? new RequestAbortedError());
637
+ this.__destroySocket(socket, new InformationalError("aborted"));
638
+ };
639
+ try {
640
+ request.onConnect(abort);
641
+ } catch (err) {
642
+ this.__errorRequest(request, err as Error);
643
+ }
644
+ if (request.aborted) return false;
645
+
646
+ if (method === "HEAD") this.__sockReset = true;
647
+ if (request.reset !== null) this.__sockReset = request.reset;
648
+ if (this.__maxRequests > 0 && this.__sockCounter++ >= this.__maxRequests)
649
+ this.__sockReset = true;
650
+ if (request.blocking) this.__sockBlocking = true;
651
+
652
+ let header = `${method} ${request.path} HTTP/1.1\r\n`;
653
+ header += request.host !== null ? `host: ${request.host}\r\n` : this.__hostHeader;
654
+ if (this.__pipelining !== 0 && !(this.__profile.major >= 7 && this.__sockReset)) {
655
+ header += "connection: keep-alive\r\n";
656
+ } else {
657
+ header += "connection: close\r\n";
658
+ }
659
+ header += request.headers;
660
+ if (channels.sendHeaders.hasSubscribers) {
661
+ channels.sendHeaders.publish({ request: request.diagnosticView(), headers: header, socket });
662
+ }
663
+ if (body === null) {
664
+ if (contentLength === 0) socket.write(`${header}content-length: 0\r\n\r\n`);
665
+ else socket.write(`${header}\r\n`);
666
+ } else {
667
+ socket.write(`${header}content-length: ${contentLength}\r\n\r\n`);
668
+ socket.write(body);
669
+ request.onBodySent(body);
670
+ if (!expectsPayload && (this.__profile.major < 7 || request.reset !== false))
671
+ this.__sockReset = true;
672
+ }
673
+ request.onRequestSent();
674
+ return true;
675
+ }
676
+
677
+ // ResponseParser callbacks.
678
+
679
+ __onHeadersComplete(parser: ResponseParser, socket: Socket): number {
680
+ const request = this.__queue[this.__runningIdx];
681
+ if (request === null || request === undefined || socket.destroyed) return -1;
682
+ const statusCode = parser.statusCode;
683
+ if (statusCode === 100) {
684
+ this.__destroySocket(socket, new SocketError("bad response", this.__socketInfo()));
685
+ return -1;
686
+ }
687
+ if (statusCode >= 200) {
688
+ const bodyTimeout = request.bodyTimeout !== null ? request.bodyTimeout : this.__bodyTimeout;
689
+ this.__setTimeout(bodyTimeout, TIMEOUT_BODY);
690
+ }
691
+ if (parser.shouldKeepAlive && this.__pipelining !== 0) {
692
+ const hint =
693
+ parser.keepAliveHeader !== "" ? parseKeepAliveTimeout(parser.keepAliveHeader) : null;
694
+ if (hint !== null) {
695
+ const timeout = Math.min(
696
+ hint - this.__keepAliveTimeoutThreshold,
697
+ this.__keepAliveMaxTimeout,
698
+ );
699
+ if (timeout <= 0) this.__sockReset = true;
700
+ else this.__keepAliveTimeoutValue = timeout;
701
+ } else {
702
+ this.__keepAliveTimeoutValue = this.__keepAliveDefaultTimeout;
703
+ }
704
+ } else {
705
+ this.__sockReset = true;
706
+ }
707
+ let pause = false;
708
+ try {
709
+ pause =
710
+ request.onHeaders(statusCode, parser.headers, () => parser.resume(), parser.statusText) ===
711
+ false;
712
+ } catch (err) {
713
+ this.__destroySocket(socket, err as Error);
714
+ return -1;
715
+ }
716
+ if (request.method === "HEAD") return 1;
717
+ if (statusCode < 200) return 1;
718
+ if (this.__sockBlocking) {
719
+ this.__sockBlocking = false;
720
+ this.__resume(false);
721
+ }
722
+ return pause ? 2 : 0;
723
+ }
724
+
725
+ __onBody(parser: ResponseParser, socket: Socket, chunk: Buffer): boolean {
726
+ const request = this.__queue[this.__runningIdx];
727
+ if (request === null || request === undefined || socket.destroyed) return false;
728
+ if (this.__timerType === TIMEOUT_BODY) this.__refreshTimer();
729
+ if (this.__maxResponseSize > -1 && parser.bytesRead + chunk.length > this.__maxResponseSize) {
730
+ this.__destroySocket(socket, new ResponseExceededMaxSizeError());
731
+ return false;
732
+ }
733
+ parser.bytesRead += chunk.length;
734
+ try {
735
+ return request.onData(chunk) !== false;
736
+ } catch (err) {
737
+ this.__destroySocket(socket, err as Error);
738
+ return false;
739
+ }
740
+ }
741
+
742
+ /** Returns false when the socket was torn down (stop parsing). */
743
+ __onMessageComplete(parser: ResponseParser, socket: Socket, trailers: Buffer[]): boolean {
744
+ if (socket.destroyed && (parser.statusCode === 0 || parser.shouldKeepAlive)) return false;
745
+ const request = this.__queue[this.__runningIdx];
746
+ if (request === null || request === undefined) return false;
747
+ const statusCode = parser.statusCode;
748
+ const shouldKeepAlive = parser.shouldKeepAlive;
749
+ const contentLength = parser.contentLength;
750
+ const bytesRead = parser.bytesRead;
751
+ parser.reset();
752
+ if (statusCode < 200) return true;
753
+ if (request.method !== "HEAD" && contentLength >= 0 && bytesRead !== contentLength) {
754
+ this.__destroySocket(socket, new ResponseContentLengthMismatchError());
755
+ return false;
756
+ }
757
+ try {
758
+ request.onComplete(trailers);
759
+ } catch (err) {
760
+ this.__errorRequest(request, err as Error);
761
+ }
762
+ this.__queue[this.__runningIdx++] = null;
763
+ if (!shouldKeepAlive) {
764
+ this.__destroySocket(socket, new InformationalError("reset"));
765
+ return false;
766
+ }
767
+ if (this.__sockReset && this.__runningCount() === 0) {
768
+ this.__destroySocket(socket, new InformationalError("reset"));
769
+ return false;
770
+ }
771
+ if (this.__pipelining === 1) setImmediate(() => this.__resume(false));
772
+ else this.__resume(false);
773
+ return true;
774
+ }
775
+
776
+ __onParseError(socket: Socket, err: Error): void {
777
+ this.__destroySocket(socket, err);
778
+ }
779
+ }
780
+
781
+ function errorCode(err: Error): string {
782
+ if (err instanceof UndiciError) return err.code;
783
+ return (err as NodeJS.ErrnoException).code ?? "";
784
+ }
785
+
786
+ const CRLF = Buffer.from("\r\n");
787
+
788
+ // Chunk-size line states (llhttp's chunk_size* and chunk_extension* nodes).
789
+ const SIZE_FIRST = 0;
790
+ const SIZE_DIGITS = 1;
791
+ const SIZE_AFTER = 2;
792
+ const SIZE_EXT = 3;
793
+ const SIZE_EXT_NAME = 4;
794
+ const SIZE_EXT_VALUE = 5;
795
+ const SIZE_EXT_QUOTED = 6;
796
+ const SIZE_EXT_PAIR = 7;
797
+ const SIZE_EXT_QUOTED_DONE = 8;
798
+ const SIZE_CR = 9;
799
+
800
+ function hexDigit(c: number): number {
801
+ if (c >= 0x30 && c <= 0x39) return c - 0x30;
802
+ if (c >= 0x41 && c <= 0x46) return c - 0x37;
803
+ if (c >= 0x61 && c <= 0x66) return c - 0x57;
804
+ return -1;
805
+ }
806
+
807
+ /** tchar: ALPHA, DIGIT and !#$%&'*+-.^_`|~. */
808
+ const TOKEN_BYTES = tokenBytes();
809
+
810
+ function tokenBytes(): Uint8Array {
811
+ const table = new Uint8Array(256);
812
+ const marks = "!#$%&'*+-.^_`|~";
813
+ for (let i = 0; i < marks.length; i++) table[marks.charCodeAt(i)] = 1;
814
+ for (let c = 0x30; c <= 0x39; c++) table[c] = 1;
815
+ for (let c = 0x41; c <= 0x5a; c++) {
816
+ table[c] = 1;
817
+ table[c + 0x20] = 1;
818
+ }
819
+ return table;
820
+ }
821
+
822
+ /** qdtext: HTAB, SP and 0x21-0xff but '"' and '\\'. */
823
+ function isQuotedByte(c: number): boolean {
824
+ return c === 0x09 || c === 0x20 || (c >= 0x21 && c !== 0x22 && c !== 0x5c);
825
+ }
826
+
827
+ /** The byte after '\\' in a quoted-pair: HTAB, SP, VCHAR or obs-text. */
828
+ function isQuotedPairByte(c: number): boolean {
829
+ return c === 0x09 || c === 0x20 || (c >= 0x21 && c !== 0x7f);
830
+ }
831
+
832
+ /** An incremental HTTP/1.1 response parser (the subset of llhttp undici
833
+ * relies on): status line, raw header pairs, Content-Length, chunked and
834
+ * read-until-close bodies, trailers, and pause/resume back-pressure. */
835
+ class ResponseParser {
836
+ client: Client;
837
+ socket: Socket;
838
+ /** Unconsumed bytes of the current arrival, then the later arrivals in
839
+ * order. */
840
+ buf: Buffer;
841
+ queue: Buffer[];
842
+ state: number;
843
+ paused: boolean;
844
+ statusCode: number;
845
+ statusText: string;
846
+ headers: Buffer[];
847
+ headersSize: number;
848
+ versionMinor: number;
849
+ contentLength: number;
850
+ chunked: boolean;
851
+ connectionHeader: string;
852
+ keepAliveHeader: string;
853
+ shouldKeepAlive: boolean;
854
+ remaining: number;
855
+ bytesRead: number;
856
+ trailers: Buffer[];
857
+ skipBody: boolean;
858
+ sizeState: number;
859
+ sizeDigits: number;
860
+ chunkSize: number;
861
+
862
+ constructor(client: Client, socket: Socket) {
863
+ this.client = client;
864
+ this.socket = socket;
865
+ this.buf = Buffer.alloc(0);
866
+ this.queue = [];
867
+ this.state = 0;
868
+ this.paused = false;
869
+ this.statusCode = 0;
870
+ this.statusText = "";
871
+ this.headers = [];
872
+ this.headersSize = 0;
873
+ this.versionMinor = 1;
874
+ this.contentLength = -1;
875
+ this.chunked = false;
876
+ this.connectionHeader = "";
877
+ this.keepAliveHeader = "";
878
+ this.shouldKeepAlive = true;
879
+ this.remaining = 0;
880
+ this.bytesRead = 0;
881
+ this.trailers = [];
882
+ this.skipBody = false;
883
+ this.sizeState = SIZE_FIRST;
884
+ this.sizeDigits = 0;
885
+ this.chunkSize = 0;
886
+ }
887
+
888
+ reset(): void {
889
+ this.state = 0;
890
+ this.statusCode = 0;
891
+ this.statusText = "";
892
+ this.headers = [];
893
+ this.headersSize = 0;
894
+ this.contentLength = -1;
895
+ this.chunked = false;
896
+ this.connectionHeader = "";
897
+ this.keepAliveHeader = "";
898
+ this.remaining = 0;
899
+ this.bytesRead = 0;
900
+ this.trailers = [];
901
+ this.skipBody = false;
902
+ }
903
+
904
+ execute(data: Buffer): void {
905
+ if (this.buf.length === 0 && this.queue.length === 0) this.buf = data;
906
+ else this.queue.push(data);
907
+ if (!this.paused) this.run();
908
+ }
909
+
910
+ /** Moves the next queued arrival into `buf`, after the bytes left in it;
911
+ * false when nothing is queued. Only a partial status, header or trailer
912
+ * line (bounded by maxHeaderSize) or a partial chunk-data CRLF is copied. */
913
+ more(): boolean {
914
+ const next = this.queue.shift();
915
+ if (next === undefined) return false;
916
+ this.buf = this.buf.length === 0 ? next : Buffer.concat([this.buf, next]);
917
+ return true;
918
+ }
919
+
920
+ resume(): void {
921
+ if (!this.paused) return;
922
+ if (this.client.__timerType === TIMEOUT_BODY) this.client.__refreshTimer();
923
+ this.paused = false;
924
+ this.socket.resume();
925
+ this.run();
926
+ }
927
+
928
+ pause(): void {
929
+ this.paused = true;
930
+ this.socket.pause();
931
+ }
932
+
933
+ /** EOF while reading a close-delimited body completes the message. */
934
+ finishOnEof(): void {
935
+ if (this.state === 6) {
936
+ this.client.__onMessageComplete(this, this.socket, []);
937
+ }
938
+ }
939
+
940
+ /** A parse error with llhttp's reason: undici 7 puts it inside its
941
+ * protocol message and, as its error table maps names to numbers only,
942
+ * sets no code; undici 5 uses the reason as the message and the code. */
943
+ fail(reason: string, code: string): void {
944
+ const err =
945
+ this.client.__profile.major >= 7
946
+ ? new HTTPParserError(`Response does not match the HTTP/1.1 protocol (${reason})`)
947
+ : new HTTPParserError(reason, code, "");
948
+ this.client.__onParseError(this.socket, err);
949
+ this.state = 99;
950
+ }
951
+
952
+ /** Reads the chunk-size line one byte at a time as llhttp does, so a line
953
+ * that never ends holds no memory: hex digits (past 16 significant ones
954
+ * the size overflows), then extensions, checked and dropped, then CRLF.
955
+ * The 7.x profile follows llhttp 9 (undici 7), the 5.x profile llhttp 8
956
+ * in its lenient mode (undici 5). Returns true when the line is complete
957
+ * and chunkSize holds its size; false when it needs more bytes or failed. */
958
+ chunkSizeLine(): boolean {
959
+ const buf = this.buf;
960
+ if (this.sizeState === SIZE_FIRST) {
961
+ // The common line, hex digits then CRLF in this buffer, in one pass;
962
+ // any other line takes the byte loop below from its start.
963
+ let size = 0;
964
+ let digits = 0;
965
+ let j = 0;
966
+ for (; j < buf.length && j < 32; j++) {
967
+ const d = hexDigit(buf[j]!);
968
+ if (d === -1) break;
969
+ if (digits > 0 || d !== 0) {
970
+ digits++;
971
+ size = size * 16 + d;
972
+ }
973
+ }
974
+ if (j > 0 && digits <= 16 && j + 1 < buf.length && buf[j] === 0x0d && buf[j + 1] === 0x0a) {
975
+ this.chunkSize = size;
976
+ this.buf = buf.subarray(j + 2);
977
+ return true;
978
+ }
979
+ }
980
+ const v7 = this.client.__profile.major >= 7;
981
+ let i = 0;
982
+ while (i < buf.length) {
983
+ const c = buf[i]!;
984
+ const state = this.sizeState;
985
+ if (state === SIZE_FIRST || state === SIZE_DIGITS) {
986
+ const d = hexDigit(c);
987
+ if (d === -1) {
988
+ if (state === SIZE_FIRST) {
989
+ this.fail("Invalid character in chunk size", "INVALID_CHUNK_SIZE");
990
+ return false;
991
+ }
992
+ this.sizeState = SIZE_AFTER;
993
+ continue;
994
+ }
995
+ if (state === SIZE_FIRST) {
996
+ this.chunkSize = 0;
997
+ this.sizeDigits = 0;
998
+ this.sizeState = SIZE_DIGITS;
999
+ }
1000
+ if (this.sizeDigits > 0 || d !== 0) {
1001
+ if (this.sizeDigits === 16) {
1002
+ this.fail("Chunk size overflow", "INVALID_CHUNK_SIZE");
1003
+ return false;
1004
+ }
1005
+ this.sizeDigits++;
1006
+ this.chunkSize = this.chunkSize * 16 + d;
1007
+ }
1008
+ } else if (state === SIZE_AFTER) {
1009
+ if (c === 0x0d) this.sizeState = SIZE_CR;
1010
+ else if (c === 0x3b) this.sizeState = SIZE_EXT;
1011
+ else if (c === 0x0a && v7) {
1012
+ this.fail("Missing expected CR after chunk size", "CR_EXPECTED");
1013
+ return false;
1014
+ } else {
1015
+ this.fail("Invalid character in chunk size", "INVALID_CHUNK_SIZE");
1016
+ return false;
1017
+ }
1018
+ } else if (state === SIZE_EXT) {
1019
+ if (c === 0x20 || c === 0x0d) {
1020
+ this.fail("Invalid character in chunk extensions", "STRICT");
1021
+ return false;
1022
+ }
1023
+ this.sizeState = SIZE_EXT_NAME;
1024
+ continue;
1025
+ } else if (state === SIZE_EXT_NAME) {
1026
+ if (c === 0x3d) this.sizeState = SIZE_EXT_VALUE;
1027
+ else if (c === 0x3b) this.sizeState = SIZE_EXT;
1028
+ else if (c === 0x0d) this.sizeState = SIZE_CR;
1029
+ else if (c === 0x0a && v7) {
1030
+ this.fail("Missing expected CR after chunk extension name", "CR_EXPECTED");
1031
+ return false;
1032
+ } else if (TOKEN_BYTES[c] !== 1) {
1033
+ this.fail("Invalid character in chunk extensions name", "STRICT");
1034
+ return false;
1035
+ }
1036
+ } else if (state === SIZE_EXT_VALUE) {
1037
+ if (c === 0x22) this.sizeState = SIZE_EXT_QUOTED;
1038
+ // llhttp 8 goes on with the chunk-size node after a value's ';'.
1039
+ else if (c === 0x3b) this.sizeState = v7 ? SIZE_EXT : SIZE_AFTER;
1040
+ else if (c === 0x0d) this.sizeState = SIZE_CR;
1041
+ else if (c === 0x0a && v7) {
1042
+ this.fail("Missing expected CR after chunk extension value", "CR_EXPECTED");
1043
+ return false;
1044
+ } else if (TOKEN_BYTES[c] !== 1) {
1045
+ this.fail("Invalid character in chunk extensions value", "STRICT");
1046
+ return false;
1047
+ }
1048
+ } else if (state === SIZE_EXT_QUOTED) {
1049
+ if (c === 0x22) this.sizeState = SIZE_EXT_QUOTED_DONE;
1050
+ else if (c === 0x5c && v7) this.sizeState = SIZE_EXT_PAIR;
1051
+ else if (!isQuotedByte(c)) {
1052
+ this.fail("Invalid character in chunk extensions quoted value", "STRICT");
1053
+ return false;
1054
+ }
1055
+ } else if (state === SIZE_EXT_PAIR) {
1056
+ if (!isQuotedPairByte(c)) {
1057
+ this.fail("Invalid quoted-pair in chunk extensions quoted value", "STRICT");
1058
+ return false;
1059
+ }
1060
+ this.sizeState = SIZE_EXT_QUOTED;
1061
+ } else if (state === SIZE_EXT_QUOTED_DONE) {
1062
+ if (c === 0x3b) this.sizeState = SIZE_EXT;
1063
+ else if (c === 0x0d) this.sizeState = SIZE_CR;
1064
+ else if (c === 0x0a && v7) {
1065
+ this.fail("Missing expected CR after chunk extension value", "CR_EXPECTED");
1066
+ return false;
1067
+ } else {
1068
+ this.fail("Invalid character in chunk extensions quote value", "STRICT");
1069
+ return false;
1070
+ }
1071
+ } else {
1072
+ // SIZE_CR: llhttp 9 needs the LF; llhttp 8's lenient mode skips
1073
+ // whatever byte follows the CR.
1074
+ if (c !== 0x0a && v7) {
1075
+ this.fail("Expected LF after chunk size", "STRICT");
1076
+ return false;
1077
+ }
1078
+ this.buf = buf.subarray(i + 1);
1079
+ this.sizeState = SIZE_FIRST;
1080
+ return true;
1081
+ }
1082
+ i++;
1083
+ }
1084
+ this.buf = Buffer.alloc(0);
1085
+ return false;
1086
+ }
1087
+
1088
+ line(): Buffer | null {
1089
+ const idx = this.buf.indexOf(CRLF);
1090
+ if (idx === -1) return null;
1091
+ const out = this.buf.subarray(0, idx);
1092
+ this.buf = this.buf.subarray(idx + 2);
1093
+ return out;
1094
+ }
1095
+
1096
+ run(): void {
1097
+ while (!this.paused && this.state !== 99) {
1098
+ if (this.state === 0) {
1099
+ // Status line.
1100
+ const line = this.line();
1101
+ if (line === null) {
1102
+ if (this.buf.length > this.client.__maxHeaderSize) {
1103
+ this.client.__onParseError(this.socket, new HeadersOverflowError());
1104
+ this.state = 99;
1105
+ return;
1106
+ }
1107
+ if (this.more()) continue;
1108
+ return;
1109
+ }
1110
+ if (line.length === 0) continue;
1111
+ const text = line.toString("latin1");
1112
+ const m = /^HTTP\/1\.([01]) (\d{3})(?: (.*))?$/.exec(text);
1113
+ if (m === null) {
1114
+ const v7 = this.client.__profile.major >= 7;
1115
+ if (!text.startsWith("HTTP/")) {
1116
+ this.fail(v7 ? "Expected HTTP/, RTSP/ or ICE/" : "Expected HTTP/", "INVALID_CONSTANT");
1117
+ } else {
1118
+ this.fail(v7 ? "Invalid status code" : "Invalid response status", "INVALID_STATUS");
1119
+ }
1120
+ return;
1121
+ }
1122
+ this.versionMinor = Number(m[1]);
1123
+ this.statusCode = Number(m[2]);
1124
+ this.statusText = m[3] ?? "";
1125
+ this.headersSize = line.length;
1126
+ this.state = 1;
1127
+ } else if (this.state === 1 || this.state === 5) {
1128
+ // Header (1) or trailer (5) lines.
1129
+ const line = this.line();
1130
+ if (line === null) {
1131
+ if (this.headersSize + this.buf.length > this.client.__maxHeaderSize) {
1132
+ this.client.__onParseError(this.socket, new HeadersOverflowError());
1133
+ this.state = 99;
1134
+ return;
1135
+ }
1136
+ if (this.more()) continue;
1137
+ return;
1138
+ }
1139
+ this.headersSize += line.length;
1140
+ if (this.headersSize > this.client.__maxHeaderSize) {
1141
+ this.client.__onParseError(this.socket, new HeadersOverflowError());
1142
+ this.state = 99;
1143
+ return;
1144
+ }
1145
+ if (line.length > 0) {
1146
+ const colon = line.indexOf(0x3a);
1147
+ if (colon <= 0) {
1148
+ this.fail("Invalid header token", "INVALID_HEADER_TOKEN");
1149
+ return;
1150
+ }
1151
+ const name = line.subarray(0, colon);
1152
+ let start = colon + 1;
1153
+ let end = line.length;
1154
+ while (start < end && (line[start] === 0x20 || line[start] === 0x09)) start++;
1155
+ while (end > start && (line[end - 1] === 0x20 || line[end - 1] === 0x09)) end--;
1156
+ const value = line.subarray(start, end);
1157
+ if (this.state === 5) {
1158
+ this.trailers.push(Buffer.from(name), Buffer.from(value));
1159
+ continue;
1160
+ }
1161
+ this.headers.push(Buffer.from(name), Buffer.from(value));
1162
+ const lower = name.toString("latin1").toLowerCase();
1163
+ if (lower === "content-length") {
1164
+ const n = Number(value.toString("latin1"));
1165
+ if (!Number.isInteger(n) || n < 0) {
1166
+ this.fail("Invalid character in Content-Length", "INVALID_CONTENT_LENGTH");
1167
+ return;
1168
+ }
1169
+ this.contentLength = n;
1170
+ } else if (lower === "transfer-encoding") {
1171
+ this.chunked = /(?:^|,)\s*chunked\s*$/i.test(value.toString("latin1"));
1172
+ } else if (lower === "connection") {
1173
+ this.connectionHeader = value.toString("latin1").toLowerCase();
1174
+ } else if (lower === "keep-alive") {
1175
+ this.keepAliveHeader = value.toString("latin1");
1176
+ }
1177
+ continue;
1178
+ }
1179
+ if (this.state === 5) {
1180
+ if (!this.complete()) return;
1181
+ continue;
1182
+ }
1183
+ // End of headers.
1184
+ const noBody = this.statusCode < 200 || this.statusCode === 204 || this.statusCode === 304;
1185
+ const closeRequested = /(?:^|,)\s*close\s*(?:,|$)/.test(this.connectionHeader);
1186
+ const keepAliveRequested = /(?:^|,)\s*keep-alive\s*(?:,|$)/.test(this.connectionHeader);
1187
+ this.shouldKeepAlive = this.versionMinor === 1 ? !closeRequested : keepAliveRequested;
1188
+ if (!noBody && !this.chunked && this.contentLength < 0) this.shouldKeepAlive = false;
1189
+ const ret = this.client.__onHeadersComplete(this, this.socket);
1190
+ if (ret === -1) {
1191
+ this.state = 99;
1192
+ return;
1193
+ }
1194
+ this.skipBody = ret === 1 || noBody;
1195
+ if (this.skipBody) {
1196
+ if (!this.complete()) return;
1197
+ continue;
1198
+ }
1199
+ if (this.chunked) {
1200
+ this.state = 3;
1201
+ } else if (this.contentLength >= 0) {
1202
+ this.remaining = this.contentLength;
1203
+ this.state = 2;
1204
+ if (this.remaining === 0) {
1205
+ if (ret === 2) this.pause();
1206
+ if (!this.complete()) return;
1207
+ continue;
1208
+ }
1209
+ } else {
1210
+ this.state = 6;
1211
+ }
1212
+ if (ret === 2) this.pause();
1213
+ } else if (this.state === 2) {
1214
+ // Content-Length body.
1215
+ if (this.buf.length === 0) {
1216
+ if (this.more()) continue;
1217
+ return;
1218
+ }
1219
+ const n = Math.min(this.remaining, this.buf.length);
1220
+ const chunk = this.buf.subarray(0, n);
1221
+ this.buf = this.buf.subarray(n);
1222
+ this.remaining -= n;
1223
+ const more = this.client.__onBody(this, this.socket, Buffer.from(chunk));
1224
+ if (this.socket.destroyed) {
1225
+ this.state = 99;
1226
+ return;
1227
+ }
1228
+ if (!more) this.pause();
1229
+ if (this.remaining === 0) {
1230
+ if (!this.complete()) return;
1231
+ }
1232
+ } else if (this.state === 3) {
1233
+ // Chunk size line; a partial one continues with the next arrival.
1234
+ if (!this.chunkSizeLine()) {
1235
+ if (this.state === 3 && this.more()) continue;
1236
+ return;
1237
+ }
1238
+ if (this.chunkSize === 0) {
1239
+ this.state = 5;
1240
+ } else {
1241
+ this.remaining = this.chunkSize;
1242
+ this.state = 4;
1243
+ }
1244
+ } else if (this.state === 4) {
1245
+ // Chunk data, then its CRLF.
1246
+ if (this.remaining > 0) {
1247
+ if (this.buf.length === 0) {
1248
+ if (this.more()) continue;
1249
+ return;
1250
+ }
1251
+ const n = Math.min(this.remaining, this.buf.length);
1252
+ const chunk = this.buf.subarray(0, n);
1253
+ this.buf = this.buf.subarray(n);
1254
+ this.remaining -= n;
1255
+ const more = this.client.__onBody(this, this.socket, Buffer.from(chunk));
1256
+ if (this.socket.destroyed) {
1257
+ this.state = 99;
1258
+ return;
1259
+ }
1260
+ if (!more) this.pause();
1261
+ continue;
1262
+ }
1263
+ if (this.buf.length < 2) {
1264
+ if (this.more()) continue;
1265
+ return;
1266
+ }
1267
+ if (this.buf[0] !== 0x0d || this.buf[1] !== 0x0a) {
1268
+ this.fail("Expected LF after chunk data", "STRICT");
1269
+ return;
1270
+ }
1271
+ this.buf = this.buf.subarray(2);
1272
+ this.state = 3;
1273
+ } else if (this.state === 6) {
1274
+ // Read until the connection closes.
1275
+ if (this.buf.length === 0) {
1276
+ if (this.more()) continue;
1277
+ return;
1278
+ }
1279
+ const chunk = this.buf;
1280
+ this.buf = Buffer.alloc(0);
1281
+ const more = this.client.__onBody(this, this.socket, Buffer.from(chunk));
1282
+ if (this.socket.destroyed) {
1283
+ this.state = 99;
1284
+ return;
1285
+ }
1286
+ if (!more) this.pause();
1287
+ } else {
1288
+ return;
1289
+ }
1290
+ }
1291
+ }
1292
+
1293
+ /** Message complete: hand the trailers over and get ready for the next
1294
+ * response on this connection. Returns false when parsing must stop. */
1295
+ complete(): boolean {
1296
+ const trailers = this.trailers;
1297
+ const ok = this.client.__onMessageComplete(this, this.socket, trailers);
1298
+ if (!ok) {
1299
+ this.state = 99;
1300
+ return false;
1301
+ }
1302
+ return true;
1303
+ }
1304
+ }