@scriptc/compiler 0.3.2 → 0.3.4

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 (454) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +1202 -64
  2. package/dist/backend/cycle-analysis.js +6 -1
  3. package/dist/backend/cycle-analysis.js.map +1 -1
  4. package/dist/backend/cycle-mutability.d.ts +5 -0
  5. package/dist/backend/cycle-mutability.js +62 -3
  6. package/dist/backend/cycle-mutability.js.map +1 -1
  7. package/dist/backend/executable-features.js +1 -0
  8. package/dist/backend/executable-features.js.map +1 -1
  9. package/dist/backend/library-pack.js +1 -0
  10. package/dist/backend/library-pack.js.map +1 -1
  11. package/dist/backend/llvm/alloc.js +24 -10
  12. package/dist/backend/llvm/alloc.js.map +1 -1
  13. package/dist/backend/llvm/alloc.test.js +47 -1
  14. package/dist/backend/llvm/alloc.test.js.map +1 -1
  15. package/dist/backend/llvm/array-search.d.ts +8 -0
  16. package/dist/backend/llvm/array-search.js +52 -0
  17. package/dist/backend/llvm/array-search.js.map +1 -0
  18. package/dist/backend/llvm/array-search.test.d.ts +1 -0
  19. package/dist/backend/llvm/array-search.test.js +72 -0
  20. package/dist/backend/llvm/array-search.test.js.map +1 -0
  21. package/dist/backend/llvm/call-lifetimes.d.ts +12 -1
  22. package/dist/backend/llvm/call-lifetimes.js +41 -11
  23. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  24. package/dist/backend/llvm/call-lifetimes.test.js +85 -1
  25. package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
  26. package/dist/backend/llvm/classes.js +87 -36
  27. package/dist/backend/llvm/classes.js.map +1 -1
  28. package/dist/backend/llvm/common.d.ts +6 -1
  29. package/dist/backend/llvm/common.js +8 -1
  30. package/dist/backend/llvm/common.js.map +1 -1
  31. package/dist/backend/llvm/dense-array-access.d.ts +5 -0
  32. package/dist/backend/llvm/dense-array-access.js +3 -3
  33. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  34. package/dist/backend/llvm/dyn.d.ts +44 -1
  35. package/dist/backend/llvm/dyn.js +251 -36
  36. package/dist/backend/llvm/dyn.js.map +1 -1
  37. package/dist/backend/llvm/emitter.d.ts +77 -14
  38. package/dist/backend/llvm/emitter.js +461 -108
  39. package/dist/backend/llvm/emitter.js.map +1 -1
  40. package/dist/backend/llvm/emitter.test.js +26 -3
  41. package/dist/backend/llvm/emitter.test.js.map +1 -1
  42. package/dist/backend/llvm/expr-async.js +52 -1
  43. package/dist/backend/llvm/expr-async.js.map +1 -1
  44. package/dist/backend/llvm/expr-bytes.d.ts +9 -0
  45. package/dist/backend/llvm/expr-bytes.js +169 -63
  46. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  47. package/dist/backend/llvm/expr-callbacks.js +16 -2
  48. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  49. package/dist/backend/llvm/expr-calls.d.ts +3 -1
  50. package/dist/backend/llvm/expr-calls.js +57 -2
  51. package/dist/backend/llvm/expr-calls.js.map +1 -1
  52. package/dist/backend/llvm/expr-containers.js +57 -19
  53. package/dist/backend/llvm/expr-containers.js.map +1 -1
  54. package/dist/backend/llvm/expr-dynamic.js +19 -8
  55. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  56. package/dist/backend/llvm/expr-primitives.js +28 -30
  57. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  58. package/dist/backend/llvm/expr-records.js +8 -4
  59. package/dist/backend/llvm/expr-records.js.map +1 -1
  60. package/dist/backend/llvm/expr-stream-bridges.js +35 -32
  61. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  62. package/dist/backend/llvm/expr-stream-callbacks.d.ts +13 -2
  63. package/dist/backend/llvm/expr-stream-callbacks.js +80 -5
  64. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  65. package/dist/backend/llvm/inline-unions.d.ts +48 -0
  66. package/dist/backend/llvm/inline-unions.js +134 -0
  67. package/dist/backend/llvm/inline-unions.js.map +1 -0
  68. package/dist/backend/llvm/inline-unions.test.d.ts +1 -0
  69. package/dist/backend/llvm/inline-unions.test.js +124 -0
  70. package/dist/backend/llvm/inline-unions.test.js.map +1 -0
  71. package/dist/backend/llvm/integer-remainder.d.ts +28 -5
  72. package/dist/backend/llvm/integer-remainder.js +80 -9
  73. package/dist/backend/llvm/integer-remainder.js.map +1 -1
  74. package/dist/backend/llvm/intern-tables.test.d.ts +1 -0
  75. package/dist/backend/llvm/intern-tables.test.js +77 -0
  76. package/dist/backend/llvm/intern-tables.test.js.map +1 -0
  77. package/dist/backend/llvm/lib-datagram.js +10 -0
  78. package/dist/backend/llvm/lib-datagram.js.map +1 -1
  79. package/dist/backend/llvm/lib-dispatch.js +255 -29
  80. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  81. package/dist/backend/llvm/lib-filesystem.js +176 -7
  82. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  83. package/dist/backend/llvm/lib-network.js +25 -6
  84. package/dist/backend/llvm/lib-network.js.map +1 -1
  85. package/dist/backend/llvm/lib-process.js +2 -2
  86. package/dist/backend/llvm/lib-process.js.map +1 -1
  87. package/dist/backend/llvm/lib-shared.d.ts +5 -0
  88. package/dist/backend/llvm/lib-shared.js +212 -1
  89. package/dist/backend/llvm/lib-shared.js.map +1 -1
  90. package/dist/backend/llvm/lib-stream.js +184 -0
  91. package/dist/backend/llvm/lib-stream.js.map +1 -1
  92. package/dist/backend/llvm/lib-test.js +9 -0
  93. package/dist/backend/llvm/lib-test.js.map +1 -1
  94. package/dist/backend/llvm/local-array-reads.js +7 -3
  95. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  96. package/dist/backend/llvm/local-array-reads.test.js +6 -3
  97. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  98. package/dist/backend/llvm/local-union-storage.d.ts +2 -0
  99. package/dist/backend/llvm/local-union-storage.js +5 -0
  100. package/dist/backend/llvm/local-union-storage.js.map +1 -1
  101. package/dist/backend/llvm/local-union-storage.test.js +1 -0
  102. package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
  103. package/dist/backend/llvm/loop-array-borrows.d.ts +8 -2
  104. package/dist/backend/llvm/loop-array-borrows.js +93 -13
  105. package/dist/backend/llvm/loop-array-borrows.js.map +1 -1
  106. package/dist/backend/llvm/map-number-lookup.d.ts +24 -0
  107. package/dist/backend/llvm/map-number-lookup.js +88 -0
  108. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  109. package/dist/backend/llvm/map-number-lookup.test.d.ts +1 -0
  110. package/dist/backend/llvm/map-number-lookup.test.js +158 -0
  111. package/dist/backend/llvm/map-number-lookup.test.js.map +1 -0
  112. package/dist/backend/llvm/map-read-lifetimes.d.ts +9 -0
  113. package/dist/backend/llvm/map-read-lifetimes.js +90 -1
  114. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  115. package/dist/backend/llvm/map-read-lifetimes.test.js +129 -1
  116. package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -1
  117. package/dist/backend/llvm/publish.d.ts +9 -0
  118. package/dist/backend/llvm/publish.js +25 -4
  119. package/dist/backend/llvm/publish.js.map +1 -1
  120. package/dist/backend/llvm/record-results.d.ts +8 -5
  121. package/dist/backend/llvm/record-results.js +20 -12
  122. package/dist/backend/llvm/record-results.js.map +1 -1
  123. package/dist/backend/llvm/reference-effects.js +13 -0
  124. package/dist/backend/llvm/reference-effects.js.map +1 -1
  125. package/dist/backend/llvm/reference-writes.js +19 -2
  126. package/dist/backend/llvm/reference-writes.js.map +1 -1
  127. package/dist/backend/llvm/regions.d.ts +5 -1
  128. package/dist/backend/llvm/regions.js +24 -10
  129. package/dist/backend/llvm/regions.js.map +1 -1
  130. package/dist/backend/llvm/serialized-ir-emission.test.js +2 -0
  131. package/dist/backend/llvm/serialized-ir-emission.test.js.map +1 -1
  132. package/dist/backend/llvm/shapes.d.ts +56 -10
  133. package/dist/backend/llvm/shapes.js +178 -39
  134. package/dist/backend/llvm/shapes.js.map +1 -1
  135. package/dist/backend/llvm/shapes.test.js +61 -3
  136. package/dist/backend/llvm/shapes.test.js.map +1 -1
  137. package/dist/backend/llvm/stack-objects.js +16 -4
  138. package/dist/backend/llvm/stack-objects.js.map +1 -1
  139. package/dist/backend/llvm/stack-objects.test.js +3 -0
  140. package/dist/backend/llvm/stack-objects.test.js.map +1 -1
  141. package/dist/backend/llvm/string-reads.js +2 -2
  142. package/dist/backend/llvm/string-reads.js.map +1 -1
  143. package/dist/backend/llvm/string-slices.js +2 -2
  144. package/dist/backend/llvm/string-slices.js.map +1 -1
  145. package/dist/backend/llvm/walkers.d.ts +11 -0
  146. package/dist/backend/llvm/walkers.js +106 -10
  147. package/dist/backend/llvm/walkers.js.map +1 -1
  148. package/dist/backend/may-throw.js +13 -4
  149. package/dist/backend/may-throw.js.map +1 -1
  150. package/dist/backend/native/contracts.d.ts +5 -2
  151. package/dist/backend/native/executable.js +27 -8
  152. package/dist/backend/native/executable.js.map +1 -1
  153. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  154. package/dist/backend/native/runtime-inputs.js +2 -0
  155. package/dist/backend/native/runtime-inputs.js.map +1 -1
  156. package/dist/backend/native-codegen-core.d.ts +4 -4
  157. package/dist/backend/native-codegen-core.js +4 -6
  158. package/dist/backend/native-codegen-core.js.map +1 -1
  159. package/dist/backend/native-codegen.test.js +7 -8
  160. package/dist/backend/native-codegen.test.js.map +1 -1
  161. package/dist/backend/native-link-info-core.d.ts +3 -0
  162. package/dist/backend/native-link-info-core.js.map +1 -1
  163. package/dist/backend/native-toolchain.test.js +1 -1
  164. package/dist/backend/native-toolchain.test.js.map +1 -1
  165. package/dist/backend/publication.js +3 -1
  166. package/dist/backend/publication.js.map +1 -1
  167. package/dist/backend/runtime-abi.d.ts +2 -2
  168. package/dist/backend/runtime-abi.js +2 -2
  169. package/dist/backend/runtime-pack-targets.test.js +2 -1
  170. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  171. package/dist/backend/runtime-pack.test.js +2 -1
  172. package/dist/backend/runtime-pack.test.js.map +1 -1
  173. package/dist/backend/target-diagnostics.js +11 -1
  174. package/dist/backend/target-diagnostics.js.map +1 -1
  175. package/dist/backend/target-diagnostics.test.js +4 -1
  176. package/dist/backend/target-diagnostics.test.js.map +1 -1
  177. package/dist/backend/warm-cache.js +1 -0
  178. package/dist/backend/warm-cache.js.map +1 -1
  179. package/dist/compat/fetch-profile.js +4 -4
  180. package/dist/compat/fetch-profile.js.map +1 -1
  181. package/dist/contracts/check.js +2 -0
  182. package/dist/contracts/check.js.map +1 -1
  183. package/dist/coverage/report.js +1 -1
  184. package/dist/coverage/report.js.map +1 -1
  185. package/dist/diagnostics/diagnostic.d.ts +6 -5
  186. package/dist/diagnostics/diagnostic.js +7 -6
  187. package/dist/diagnostics/diagnostic.js.map +1 -1
  188. package/dist/executable/executable-cache.d.ts +1 -0
  189. package/dist/executable/executable-cache.js +1 -0
  190. package/dist/executable/executable-cache.js.map +1 -1
  191. package/dist/executable/executable-cache.test.js +1 -0
  192. package/dist/executable/executable-cache.test.js.map +1 -1
  193. package/dist/frontend/builtin-modules.d.ts +1 -1
  194. package/dist/frontend/builtin-modules.js +1 -0
  195. package/dist/frontend/builtin-modules.js.map +1 -1
  196. package/dist/frontend/comptime-node.js +2 -2
  197. package/dist/frontend/comptime-node.js.map +1 -1
  198. package/dist/frontend/experimental-import.d.ts +5 -1
  199. package/dist/frontend/experimental-import.js +28 -3
  200. package/dist/frontend/experimental-import.js.map +1 -1
  201. package/dist/frontend/lowering/assert-instances.d.ts +38 -0
  202. package/dist/frontend/lowering/assert-instances.js +269 -0
  203. package/dist/frontend/lowering/assert-instances.js.map +1 -0
  204. package/dist/frontend/lowering/binding-analysis.d.ts +1 -1
  205. package/dist/frontend/lowering/binding-analysis.js +1 -1
  206. package/dist/frontend/lowering/builtins/arguments.d.ts +4 -0
  207. package/dist/frontend/lowering/builtins/arguments.js +8 -4
  208. package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
  209. package/dist/frontend/lowering/builtins/blob.d.ts +20 -0
  210. package/dist/frontend/lowering/builtins/blob.js +167 -0
  211. package/dist/frontend/lowering/builtins/blob.js.map +1 -0
  212. package/dist/frontend/lowering/builtins/child-process-async.d.ts +2 -2
  213. package/dist/frontend/lowering/builtins/child-process-async.js +2 -2
  214. package/dist/frontend/lowering/builtins/child-process-methods.js +1 -1
  215. package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
  216. package/dist/frontend/lowering/builtins/child-process-sync.js +1 -1
  217. package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -1
  218. package/dist/frontend/lowering/builtins/compression.d.ts +18 -0
  219. package/dist/frontend/lowering/builtins/compression.js +178 -4
  220. package/dist/frontend/lowering/builtins/compression.js.map +1 -1
  221. package/dist/frontend/lowering/builtins/constants.js +7 -2
  222. package/dist/frontend/lowering/builtins/constants.js.map +1 -1
  223. package/dist/frontend/lowering/builtins/crypto.d.ts +6 -0
  224. package/dist/frontend/lowering/builtins/crypto.js +526 -121
  225. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  226. package/dist/frontend/lowering/builtins/errors.js +23 -0
  227. package/dist/frontend/lowering/builtins/errors.js.map +1 -1
  228. package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +10 -0
  229. package/dist/frontend/lowering/builtins/filesystem-calls.js +89 -1
  230. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  231. package/dist/frontend/lowering/builtins/filesystem.d.ts +16 -7
  232. package/dist/frontend/lowering/builtins/filesystem.js +97 -15
  233. package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
  234. package/dist/frontend/lowering/builtins/fs-glob.d.ts +23 -0
  235. package/dist/frontend/lowering/builtins/fs-glob.js +224 -0
  236. package/dist/frontend/lowering/builtins/fs-glob.js.map +1 -0
  237. package/dist/frontend/lowering/builtins/key-object.d.ts +13 -0
  238. package/dist/frontend/lowering/builtins/key-object.js +56 -0
  239. package/dist/frontend/lowering/builtins/key-object.js.map +1 -0
  240. package/dist/frontend/lowering/builtins/module-calls.js +44 -11
  241. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  242. package/dist/frontend/lowering/builtins/performance.d.ts +25 -3
  243. package/dist/frontend/lowering/builtins/performance.js +340 -5
  244. package/dist/frontend/lowering/builtins/performance.js.map +1 -1
  245. package/dist/frontend/lowering/builtins/process.d.ts +2 -2
  246. package/dist/frontend/lowering/builtins/process.js +107 -14
  247. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  248. package/dist/frontend/lowering/builtins/properties.d.ts +0 -7
  249. package/dist/frontend/lowering/builtins/properties.js +39 -11
  250. package/dist/frontend/lowering/builtins/properties.js.map +1 -1
  251. package/dist/frontend/lowering/builtins/readline.d.ts +23 -8
  252. package/dist/frontend/lowering/builtins/readline.js +266 -90
  253. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  254. package/dist/frontend/lowering/builtins/timers.d.ts +3 -0
  255. package/dist/frontend/lowering/builtins/timers.js +109 -23
  256. package/dist/frontend/lowering/builtins/timers.js.map +1 -1
  257. package/dist/frontend/lowering/builtins/url.d.ts +8 -0
  258. package/dist/frontend/lowering/builtins/url.js +36 -0
  259. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  260. package/dist/frontend/lowering/call-arguments.js +1 -1
  261. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  262. package/dist/frontend/lowering/call-signatures.js +26 -2
  263. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  264. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +2 -0
  265. package/dist/frontend/lowering/class-dynamic-dispatch.js +171 -13
  266. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  267. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +1 -0
  268. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
  269. package/dist/frontend/lowering/class-protocol-dispatch.d.ts +45 -0
  270. package/dist/frontend/lowering/class-protocol-dispatch.js +516 -0
  271. package/dist/frontend/lowering/class-protocol-dispatch.js.map +1 -0
  272. package/dist/frontend/lowering/coercions/structural-plans.js +2 -1
  273. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  274. package/dist/frontend/lowering/coercions/structural.js +3 -3
  275. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  276. package/dist/frontend/lowering/collation-repertoire.js +6 -5
  277. package/dist/frontend/lowering/collation-repertoire.js.map +1 -1
  278. package/dist/frontend/lowering/containers/array-callbacks.js +4 -7
  279. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  280. package/dist/frontend/lowering/containers/array-methods.d.ts +0 -7
  281. package/dist/frontend/lowering/containers/array-methods.js +43 -2
  282. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  283. package/dist/frontend/lowering/containers/bytes.js +38 -26
  284. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  285. package/dist/frontend/lowering/containers/for-of.d.ts +1 -1
  286. package/dist/frontend/lowering/containers/for-of.js +5 -1
  287. package/dist/frontend/lowering/containers/for-of.js.map +1 -1
  288. package/dist/frontend/lowering/containers/indexed-objects.js +1 -1
  289. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  290. package/dist/frontend/lowering/crypto-tables.d.ts +3 -3
  291. package/dist/frontend/lowering/crypto-tables.js +77 -12
  292. package/dist/frontend/lowering/crypto-tables.js.map +1 -1
  293. package/dist/frontend/lowering/expressions/nullish-assignment.js +10 -0
  294. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
  295. package/dist/frontend/lowering/expressions/object-literals.js +16 -12
  296. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  297. package/dist/frontend/lowering/generic-functions.d.ts +2 -2
  298. package/dist/frontend/lowering/generic-functions.js +2 -2
  299. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  300. package/dist/frontend/lowering/http2-constants.js +1 -1
  301. package/dist/frontend/lowering/intern-tables.d.ts +13 -0
  302. package/dist/frontend/lowering/intern-tables.js +536 -0
  303. package/dist/frontend/lowering/intern-tables.js.map +1 -0
  304. package/dist/frontend/lowering/lower-array-sort.d.ts +12 -1
  305. package/dist/frontend/lowering/lower-array-sort.js +561 -191
  306. package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
  307. package/dist/frontend/lowering/lower-array-sort.test.js +4 -2
  308. package/dist/frontend/lowering/lower-array-sort.test.js.map +1 -1
  309. package/dist/frontend/lowering/lower-assert.js +702 -63
  310. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  311. package/dist/frontend/lowering/lower-async-iteration.d.ts +6 -3
  312. package/dist/frontend/lowering/lower-async-iteration.js +259 -4
  313. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  314. package/dist/frontend/lowering/lower-calls.js +118 -12
  315. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  316. package/dist/frontend/lowering/lower-classes.d.ts +11 -2
  317. package/dist/frontend/lowering/lower-classes.js +76 -9
  318. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  319. package/dist/frontend/lowering/lower-comptime.d.ts +1 -1
  320. package/dist/frontend/lowering/lower-comptime.js +4 -4
  321. package/dist/frontend/lowering/lower-comptime.js.map +1 -1
  322. package/dist/frontend/lowering/lower-dgram.js +77 -52
  323. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  324. package/dist/frontend/lowering/lower-event-target.d.ts +63 -0
  325. package/dist/frontend/lowering/lower-event-target.js +362 -0
  326. package/dist/frontend/lowering/lower-event-target.js.map +1 -0
  327. package/dist/frontend/lowering/lower-expando.js +2 -2
  328. package/dist/frontend/lowering/lower-exprs.js +124 -22
  329. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  330. package/dist/frontend/lowering/lower-inspect.d.ts +6 -0
  331. package/dist/frontend/lowering/lower-inspect.js +240 -49
  332. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  333. package/dist/frontend/lowering/lower-mixins.js +1 -1
  334. package/dist/frontend/lowering/lower-mock.d.ts +11 -0
  335. package/dist/frontend/lowering/lower-mock.js +504 -0
  336. package/dist/frontend/lowering/lower-mock.js.map +1 -0
  337. package/dist/frontend/lowering/lower-modules.d.ts +1 -1
  338. package/dist/frontend/lowering/lower-modules.js +14 -3
  339. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  340. package/dist/frontend/lowering/lower-namespaces.d.ts +2 -2
  341. package/dist/frontend/lowering/lower-namespaces.js +2 -2
  342. package/dist/frontend/lowering/lower-server.d.ts +3 -0
  343. package/dist/frontend/lowering/lower-server.js +419 -44
  344. package/dist/frontend/lowering/lower-server.js.map +1 -1
  345. package/dist/frontend/lowering/lower-stdlib.d.ts +7 -1
  346. package/dist/frontend/lowering/lower-stdlib.js +10 -3
  347. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  348. package/dist/frontend/lowering/lower-stmts.d.ts +2 -2
  349. package/dist/frontend/lowering/lower-stmts.js +69 -14
  350. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  351. package/dist/frontend/lowering/lower-stream.d.ts +10 -6
  352. package/dist/frontend/lowering/lower-stream.js +1020 -49
  353. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  354. package/dist/frontend/lowering/lower-test.js +86 -8
  355. package/dist/frontend/lowering/lower-test.js.map +1 -1
  356. package/dist/frontend/lowering/lower-timers.js +1 -1
  357. package/dist/frontend/lowering/lowerer.d.ts +45 -5
  358. package/dist/frontend/lowering/lowerer.js +317 -48
  359. package/dist/frontend/lowering/lowerer.js.map +1 -1
  360. package/dist/frontend/lowering/native-ffi.js +2 -2
  361. package/dist/frontend/lowering/native-ffi.js.map +1 -1
  362. package/dist/frontend/lowering/pairs-snapshot.d.ts +6 -0
  363. package/dist/frontend/lowering/pairs-snapshot.js +49 -0
  364. package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
  365. package/dist/frontend/lowering/runtime-optional-records.d.ts +115 -0
  366. package/dist/frontend/lowering/runtime-optional-records.js +715 -0
  367. package/dist/frontend/lowering/runtime-optional-records.js.map +1 -0
  368. package/dist/frontend/lowering/runtime-optional-records.test.d.ts +1 -0
  369. package/dist/frontend/lowering/runtime-optional-records.test.js +175 -0
  370. package/dist/frontend/lowering/runtime-optional-records.test.js.map +1 -0
  371. package/dist/frontend/lowering/surfaces.d.ts +11 -3
  372. package/dist/frontend/lowering/surfaces.js +334 -37
  373. package/dist/frontend/lowering/surfaces.js.map +1 -1
  374. package/dist/frontend/lowering/zlib-constants.d.ts +1 -0
  375. package/dist/frontend/lowering/zlib-constants.js +181 -0
  376. package/dist/frontend/lowering/zlib-constants.js.map +1 -0
  377. package/dist/frontend/mock-shapes.d.ts +10 -0
  378. package/dist/frontend/mock-shapes.js +76 -0
  379. package/dist/frontend/mock-shapes.js.map +1 -0
  380. package/dist/frontend/module-syntax.d.ts +1 -1
  381. package/dist/frontend/module-syntax.js +1 -1
  382. package/dist/frontend/npm-static-prune.js +1 -1
  383. package/dist/frontend/npm-static-prune.js.map +1 -1
  384. package/dist/frontend/npm-static-rewrite-syntax.js +4 -3
  385. package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
  386. package/dist/frontend/pipeline.js +6 -4
  387. package/dist/frontend/pipeline.js.map +1 -1
  388. package/dist/frontend/program.d.ts +3 -3
  389. package/dist/frontend/program.js +25 -18
  390. package/dist/frontend/program.js.map +1 -1
  391. package/dist/frontend/resolve.d.ts +4 -0
  392. package/dist/frontend/resolve.js +15 -1
  393. package/dist/frontend/resolve.js.map +1 -1
  394. package/dist/frontend/ts7/adapter.js +1 -1
  395. package/dist/frontend/ts7/ast-bytes.d.ts +1 -1
  396. package/dist/frontend/ts7/ast-bytes.js +1 -1
  397. package/dist/frontend/ts7/semantic-json.d.ts +1 -1
  398. package/dist/frontend/ts7/semantic-json.js +1 -1
  399. package/dist/frontend/ts7/semantic-json.js.map +1 -1
  400. package/dist/frontend/ts7/world-check.js +1 -1
  401. package/dist/frontend/tsc-codes.js +3 -2
  402. package/dist/frontend/tsc-codes.js.map +1 -1
  403. package/dist/frontend/type-mapper.d.ts +21 -1
  404. package/dist/frontend/type-mapper.js +245 -27
  405. package/dist/frontend/type-mapper.js.map +1 -1
  406. package/dist/index.js +7 -5
  407. package/dist/index.js.map +1 -1
  408. package/dist/ir/analysis.d.ts +12 -6
  409. package/dist/ir/analysis.js +26 -10
  410. package/dist/ir/analysis.js.map +1 -1
  411. package/dist/ir/analysis.test.js +15 -3
  412. package/dist/ir/analysis.test.js.map +1 -1
  413. package/dist/ir/builtin-effects.js +115 -0
  414. package/dist/ir/builtin-effects.js.map +1 -1
  415. package/dist/ir/builtin-signatures.d.ts +1 -1
  416. package/dist/ir/builtin-signatures.js +438 -46
  417. package/dist/ir/builtin-signatures.js.map +1 -1
  418. package/dist/ir/int32-slots.js +1 -0
  419. package/dist/ir/int32-slots.js.map +1 -1
  420. package/dist/ir/ir.d.ts +84 -17
  421. package/dist/ir/ir.js +54 -1
  422. package/dist/ir/ir.js.map +1 -1
  423. package/dist/ir/runtime-features.d.ts +1 -0
  424. package/dist/ir/runtime-features.js +111 -7
  425. package/dist/ir/runtime-features.js.map +1 -1
  426. package/dist/ir/serialize.js +1 -1
  427. package/dist/ir/serialize.js.map +1 -1
  428. package/dist/ir/traverse.js +1 -0
  429. package/dist/ir/traverse.js.map +1 -1
  430. package/dist/ir/validate.js +295 -14
  431. package/dist/ir/validate.js.map +1 -1
  432. package/dist/ir/validate.test.js +60 -0
  433. package/dist/ir/validate.test.js.map +1 -1
  434. package/dist/library/fence-eval.d.ts +1 -1
  435. package/dist/library/fence-eval.js +5 -4
  436. package/dist/library/fence-eval.js.map +1 -1
  437. package/dist/library/ir-policy.js +11 -4
  438. package/dist/library/ir-policy.js.map +1 -1
  439. package/dist/library/library-profile.js +13 -13
  440. package/dist/library/library-profile.js.map +1 -1
  441. package/dist/library/prepare.js +1 -1
  442. package/dist/library/prepare.js.map +1 -1
  443. package/dist/library/sidecar.js +3 -3
  444. package/dist/library/sidecar.js.map +1 -1
  445. package/dist/native/cli.js +1 -0
  446. package/dist/native/cli.js.map +1 -1
  447. package/dist/native/compiler.js +1 -3
  448. package/dist/native/compiler.js.map +1 -1
  449. package/dist/native/prepare.js +4 -2
  450. package/dist/native/prepare.js.map +1 -1
  451. package/dist/native/sanitizer.test.js +1 -0
  452. package/dist/native/sanitizer.test.js.map +1 -1
  453. package/package.json +20 -20
  454. package/surface-manifest.json +1279 -221
@@ -3,7 +3,7 @@ import * as ts from "../ts7/adapter.js";
3
3
  import { ladderFenceExpr } from "./lowerer.js";
4
4
  import { isJsSourceFile, locOf } from "../program.js";
5
5
  import { arrayOf, BOOL, BYTES_U8, canBoxFuncIntoDyn, canConvertToDyn, DYN, DYN_HANDLE_KINDS, F64, funcOf, HTTP2SESSION_T, HTTP2STREAM_T, HTTPCLIENTREQ_T, HTTPREQ_T, HTTPRES_T, NETSERVER_T, NETSOCKET_T, NULL_T, SECURECTX_T, STRING, UNDEFINED_T, typeKey, VOID, } from "../../ir/ir.js";
6
- import { AGENT_DOCUMENTED_OPTIONS, builtinFenceHintOf, builtinModuleFnOf, fenceOrDropOptionKey, HTTP_CLIENT_DOCUMENTED_OPTIONS, HTTP_SERVER_DOCUMENTED_OPTIONS, HTTP2_SECURE_SERVER_DOCUMENTED_OPTIONS, HTTPS_CLIENT_DOCUMENTED_OPTIONS, sideEffectFreeOptionValue, TLS_SERVER_DOCUMENTED_OPTIONS, } from "./surfaces.js";
6
+ import { AGENT_DOCUMENTED_OPTIONS, HTTPS_AGENT_DOCUMENTED_OPTIONS, builtinFenceHintOf, builtinModuleFnOf, fenceOrDropOptionKey, HTTP_CLIENT_DOCUMENTED_OPTIONS, HTTP_SERVER_DOCUMENTED_OPTIONS, HTTP2_SECURE_SERVER_DOCUMENTED_OPTIONS, HTTPS_CLIENT_DOCUMENTED_OPTIONS, sideEffectFreeOptionValue, TLS_SERVER_DOCUMENTED_OPTIONS, } from "./surfaces.js";
7
7
  import { conditionalSpreadOf } from "./expressions/object-literals.js";
8
8
  import { resultIsDiscarded } from "./call-position.js";
9
9
  import { lowerCallbackArg as lowerCallbackArgShared } from "./callback-arg.js";
@@ -166,7 +166,7 @@ export function voidizedCallback(lowerer, cb, loc) {
166
166
  body: [
167
167
  {
168
168
  kind: "return",
169
- value: { kind: "closure", fnName: impl, captures: ["f.0"], type: toT, loc },
169
+ value: { kind: "closure", fnName: impl, captures: ["f.0"], type: toT, adapts: true, loc },
170
170
  loc,
171
171
  },
172
172
  ],
@@ -175,6 +175,20 @@ export function voidizedCallback(lowerer, cb, loc) {
175
175
  }
176
176
  return { kind: "call", callee: name, args: [cb], type: toT, loc };
177
177
  }
178
+ /** A socket or server listener with parameters that the runtime calls
179
+ * through the checked-dynamic boundary (close(hadError), write's
180
+ * cb(err), 'drop', getConnections): a dyn function value as is, or a
181
+ * typed function boxed with per-argument checks. */
182
+ function lowerSocketDynListener(lowerer, node, what) {
183
+ const cb = lowerer.lowerExpr(node);
184
+ if (cb.type.kind === "dyn")
185
+ return cb;
186
+ if (cb.type.kind === "func" &&
187
+ canBoxFuncIntoDyn(cb.type, (id) => lowerer.shapes.get(id), (id) => lowerer.unions.get(id))) {
188
+ return { kind: "dynFrom", value: cb, type: DYN, loc: locOf(node) };
189
+ }
190
+ lowerer.noLowering(`${what} that cannot cross the checked-dynamic boundary`, node, "the callback's parameters and return value must have checked-dynamic conversions");
191
+ }
178
192
  /** A registration/side-effect libCall re-shaped to answer its RECEIVER —
179
193
  * Node's `return this` chaining (server.listen(...), res.writeHead(...)):
180
194
  * an interned helper runs the void call and returns its first argument.
@@ -1030,6 +1044,31 @@ export function lowerHttpServerTimeoutAssignment(lowerer, left, right, loc) {
1030
1044
  loc,
1031
1045
  };
1032
1046
  }
1047
+ /** `server.maxConnections = n`: the value crosses as a dyn (undefined
1048
+ * and null unset the cap). */
1049
+ export function lowerNetServerMaxConnectionsAssignment(lowerer, left, right, loc) {
1050
+ if (!ts.isPropertyAccessExpression(left) || left.questionDotToken)
1051
+ return null;
1052
+ if (left.name.text !== "maxConnections")
1053
+ return null;
1054
+ if (lowerer.mapTypeOf(lowerer.typeOf(left.expression))?.kind !== "netServer")
1055
+ return null;
1056
+ if (!lowerer.isStdlibMember(left))
1057
+ return null;
1058
+ const receiver = coerceToHandle(lowerer, left.expression, NETSERVER_T);
1059
+ const value = lowerer.coerceToExpected(lowerer.lowerExpr(right), DYN);
1060
+ return {
1061
+ kind: "exprStmt",
1062
+ expr: {
1063
+ kind: "libCall",
1064
+ fn: "net.serverMaxConnectionsSet",
1065
+ args: [receiver, value],
1066
+ type: VOID,
1067
+ loc,
1068
+ },
1069
+ loc,
1070
+ };
1071
+ }
1033
1072
  /** Method calls on net.Server receivers: listen(port[, cb]), close([cb]),
1034
1073
  * on/once("connection" | "error" | "close", cb). address() alone fences
1035
1074
  * toward the composed address().port read. Null for other receivers. */
@@ -1041,6 +1080,24 @@ function lowerNetServerMethodCall(lowerer, call, access) {
1041
1080
  const name = access.name.text;
1042
1081
  const loc = locOf(call);
1043
1082
  const args = call.arguments;
1083
+ if (name === "getConnections") {
1084
+ // cb(null, count) on the next tick; answers the server.
1085
+ if (args.length !== 1) {
1086
+ lowerer.noLowering(`getConnections with ${args.length} arguments`, call, "the form is getConnections(callback)");
1087
+ }
1088
+ const receiver = coerceToHandle(lowerer, access.expression, NETSERVER_T);
1089
+ const cb = lowerSocketDynListener(lowerer, args[0], "getConnections callbacks");
1090
+ if (resultIsDiscarded(call)) {
1091
+ return {
1092
+ kind: "libCall",
1093
+ fn: "net.serverGetConnections",
1094
+ args: [receiver, cb],
1095
+ type: VOID,
1096
+ loc,
1097
+ };
1098
+ }
1099
+ return receiverReturningCall(lowerer, "net.serverGetConnections", [receiver, cb], NETSERVER_T, loc);
1100
+ }
1044
1101
  if (name === "setTimeout") {
1045
1102
  if (args.length < 1 || args.length > 2)
1046
1103
  lowerer.noLowering("server.setTimeout arguments", call, "pass milliseconds and an optional socket callback");
@@ -1356,6 +1413,17 @@ function lowerNetServerMethodCall(lowerer, call, access) {
1356
1413
  loc,
1357
1414
  };
1358
1415
  }
1416
+ if (event === "drop") {
1417
+ // A connection past maxConnections, with its local and remote
1418
+ // addresses.
1419
+ return {
1420
+ kind: "libCall",
1421
+ fn: "net.serverOnDrop",
1422
+ args: [receiver, lowerSocketDynListener(lowerer, args[1], "drop listeners"), once],
1423
+ type: VOID,
1424
+ loc,
1425
+ };
1426
+ }
1359
1427
  if (event === "session") {
1360
1428
  // The h2c server's per-connection session event: (session). The
1361
1429
  // result is voidized; the handle passes by reference.
@@ -1450,7 +1518,7 @@ function lowerNetServerMethodCall(lowerer, call, access) {
1450
1518
  loc,
1451
1519
  };
1452
1520
  }
1453
- lowerer.noLowering(`server.${name}(${event === null ? "non-literal event" : `"${event}"`}, ...)`, args[0], '"connection", "request", "stream", "session", "upgrade", "connect", "error", "close", "listening", and "sessionError" are the supported server events (as literals)');
1521
+ lowerer.noLowering(`server.${name}(${event === null ? "non-literal event" : `"${event}"`}, ...)`, args[0], '"connection", "request", "drop", "stream", "session", "upgrade", "connect", "error", "close", "listening", and "sessionError" are the supported server events (as literals)');
1454
1522
  }
1455
1523
  if (name === "emit") {
1456
1524
  // The demux route: emit("connection", socket) hands an accepted
@@ -1476,6 +1544,18 @@ function lowerNetServerMethodCall(lowerer, call, access) {
1476
1544
  loc,
1477
1545
  };
1478
1546
  }
1547
+ if ((name === "ref" || name === "unref") && args.length === 0) {
1548
+ // Whether the server keeps the event loop alive.
1549
+ requireStatementPosition(lowerer, call, `server.${name}()`);
1550
+ const receiver = coerceToHandle(lowerer, access.expression, NETSERVER_T);
1551
+ return {
1552
+ kind: "libCall",
1553
+ fn: "net.serverSetRef",
1554
+ args: [receiver, boolLit(name === "ref", loc)],
1555
+ type: VOID,
1556
+ loc,
1557
+ };
1558
+ }
1479
1559
  if (name === "address") {
1480
1560
  // The full AddressInfo record (the dgram.address materialization).
1481
1561
  // The composed `server.address().port` read already lowered through
@@ -1485,11 +1565,51 @@ function lowerNetServerMethodCall(lowerer, call, access) {
1485
1565
  lowerer.noLowering(`address with ${args.length} arguments`, call, "address() takes no arguments");
1486
1566
  }
1487
1567
  const result = lowerer.mapTypeOf(lowerer.typeOf(call));
1488
- if (!result || !isAddressInfoRecord(lowerer, result)) {
1568
+ if (result && isAddressInfoRecord(lowerer, result)) {
1569
+ const receiver = coerceToHandle(lowerer, access.expression, NETSERVER_T);
1570
+ return { kind: "libCall", fn: "net.serverAddress", args: [receiver], type: result, loc };
1571
+ }
1572
+ // @types/node's `string | AddressInfo | null`: the record while the
1573
+ // server listens (a TCP server never answers the pipe-path string),
1574
+ // null otherwise, like Node.
1575
+ const arms = result?.kind === "union" ? (lowerer.unions.get(result.unionId)?.arms ?? []) : [];
1576
+ const record = arms.find((arm) => isAddressInfoRecord(lowerer, arm));
1577
+ const nullTag = result?.kind === "union" ? lowerer.armTag(result.unionId, NULL_T) : -1;
1578
+ if (!result || result.kind !== "union" || record === undefined || nullTag < 0) {
1489
1579
  lowerer.noLowering("address() where the result is not the {address, family, port} record", call, "the AddressInfo shape is the supported result");
1490
1580
  }
1581
+ const unionId = result.unionId;
1491
1582
  const receiver = coerceToHandle(lowerer, access.expression, NETSERVER_T);
1492
- return { kind: "libCall", fn: "net.serverAddress", args: [receiver], type: result, loc };
1583
+ const local = lowerer.declareHiddenLocal("%addressServer", NETSERVER_T);
1584
+ const server = varRef(local.id, NETSERVER_T, loc);
1585
+ return {
1586
+ kind: "seqExpr",
1587
+ stmts: [{ kind: "varDecl", localId: local.id, init: receiver, loc }],
1588
+ result: {
1589
+ kind: "ternary",
1590
+ cond: { kind: "libCall", fn: "net.serverListening", args: [server], type: BOOL, loc },
1591
+ then: {
1592
+ kind: "unionWrap",
1593
+ unionId,
1594
+ tag: lowerer.armTag(unionId, record),
1595
+ value: { kind: "libCall", fn: "net.serverAddress", args: [server], type: record, loc },
1596
+ type: result,
1597
+ loc,
1598
+ },
1599
+ else_: {
1600
+ kind: "unionWrap",
1601
+ unionId,
1602
+ tag: nullTag,
1603
+ value: { kind: "unitLit", unit: "null", type: NULL_T, loc },
1604
+ type: result,
1605
+ loc,
1606
+ },
1607
+ type: result,
1608
+ loc,
1609
+ },
1610
+ type: result,
1611
+ loc,
1612
+ };
1493
1613
  }
1494
1614
  lowerer.noLowering(`Server.${name}`, call, 'listen, close, address().port, emit("connection", socket), and on/once of connection/request/upgrade/error/close/listening/sessionError are the supported Server members', lowerer.checker.getSymbolAtLocation(access.name));
1495
1615
  }
@@ -1504,14 +1624,26 @@ function lowerNetSocketMethodCall(lowerer, call, access) {
1504
1624
  const name = access.name.text;
1505
1625
  const loc = locOf(call);
1506
1626
  const args = call.arguments;
1627
+ if ((name === "ref" || name === "unref") && args.length === 0) {
1628
+ // Whether the socket keeps the event loop alive.
1629
+ requireStatementPosition(lowerer, call, `socket.${name}()`);
1630
+ const receiver = lowerer.lowerExpr(access.expression);
1631
+ return {
1632
+ kind: "libCall",
1633
+ fn: "net.sockSetRef",
1634
+ args: [receiver, boolLit(name === "ref", loc)],
1635
+ type: VOID,
1636
+ loc,
1637
+ };
1638
+ }
1507
1639
  if (name === "write" || name === "end") {
1508
1640
  requireStatementPosition(lowerer, call, `socket.${name}(...)`);
1509
1641
  // write(chunk, encoding) — the two-argument encoding form: 'buffer'
1510
- // beside a string chunk is Node's stream_base typecheck ("Second
1511
- // argument must be a buffer", thrown synchronously on an established
1512
- // socket — the invalid-input probes' shape); utf8 spellings are the
1513
- // plain write (that IS the encoding written); a Buffer chunk ignores
1514
- // the encoding like Node does. Other encodings keep the fence.
1642
+ // beside a string chunk is Writable's encoding check (a synchronous
1643
+ // ERR_UNKNOWN_ENCODING TypeError, "Unknown encoding: buffer" — the
1644
+ // invalid-input probes' shape); utf8 spellings are the plain write
1645
+ // (that IS the encoding written); a Buffer chunk ignores the encoding
1646
+ // like Node does. Other encodings keep the fence.
1515
1647
  if (name === "write" && args.length === 2) {
1516
1648
  const encT = lowerer.typeOf(args[1]);
1517
1649
  const chunkT = lowerer.mapTypeOf(lowerer.typeOf(args[0]));
@@ -1520,7 +1652,7 @@ function lowerNetSocketMethodCall(lowerer, call, access) {
1520
1652
  chunkT.kind === "string" &&
1521
1653
  isJsSourceFile(call.getSourceFile())) {
1522
1654
  lowerer.lowerExpr(args[0]); // evaluation order (effect-free in practice)
1523
- return nodeThrowExpr(1, "ERR_INVALID_ARG_TYPE", "Second argument must be a buffer", VOID, loc);
1655
+ return nodeThrowExpr(1, "ERR_UNKNOWN_ENCODING", "Unknown encoding: buffer", VOID, loc);
1524
1656
  }
1525
1657
  const passthrough = (chunkT.kind === "string" && (encT.value === "utf8" || encT.value === "utf-8")) ||
1526
1658
  (chunkT.kind === "bytes" && chunkT.elem === "u8");
@@ -1532,6 +1664,79 @@ function lowerNetSocketMethodCall(lowerer, call, access) {
1532
1664
  }
1533
1665
  }
1534
1666
  }
1667
+ // A trailing callback: write's runs once the data is flushed (with
1668
+ // null for the error), end's once the socket finishes ('finish').
1669
+ const last = args.length > 0 ? args[args.length - 1] : null;
1670
+ if (last !== null &&
1671
+ args.length <= 2 &&
1672
+ (name === "end" || args.length === 2) &&
1673
+ lowerer.checker.getCallSignatures(lowerer.typeOf(last)).length > 0) {
1674
+ const sockLocal = lowerer.declareHiddenLocal("%sockCb", NETSOCKET_T);
1675
+ const stmts = [
1676
+ {
1677
+ kind: "varDecl",
1678
+ localId: sockLocal.id,
1679
+ init: coerceToHandle(lowerer, access.expression, NETSOCKET_T),
1680
+ loc,
1681
+ },
1682
+ ];
1683
+ const receiver = () => ({
1684
+ kind: "varRef",
1685
+ localId: sockLocal.id,
1686
+ type: NETSOCKET_T,
1687
+ loc,
1688
+ });
1689
+ const dataNode = args.length === 2 ? args[0] : null;
1690
+ let main = {
1691
+ kind: "libCall",
1692
+ fn: "net.sockEnd",
1693
+ args: [receiver()],
1694
+ type: VOID,
1695
+ loc,
1696
+ };
1697
+ if (dataNode !== null) {
1698
+ const data = lowerer.lowerExpr(dataNode);
1699
+ const fn = data.type.kind === "string"
1700
+ ? name === "write"
1701
+ ? "net.sockWrite"
1702
+ : "net.sockEndStr"
1703
+ : data.type.kind === "bytes" && data.type.elem === "u8"
1704
+ ? name === "write"
1705
+ ? "net.sockWriteBytes"
1706
+ : "net.sockEndBytes"
1707
+ : data.type.kind === "dyn"
1708
+ ? name === "write"
1709
+ ? "net.sockWriteDyn"
1710
+ : "net.sockEndDyn"
1711
+ : null;
1712
+ if (fn === null) {
1713
+ lowerer.noLowering(`${name} of '${lowerer.fmt(data.type)}' data`, dataNode, NARROW_DATA_HINT);
1714
+ }
1715
+ main = { kind: "libCall", fn, args: [receiver(), data], type: VOID, loc };
1716
+ }
1717
+ const cb = lowerer.lowerExpr(last);
1718
+ let register;
1719
+ if (cb.type.kind === "func" && cb.type.params.length === 0 && cb.type.ret.kind === "void") {
1720
+ register = {
1721
+ kind: "libCall",
1722
+ fn: name === "write" ? "net.sockOnWriteFlush" : "net.sockOnFinish",
1723
+ args: [receiver(), cb],
1724
+ type: VOID,
1725
+ loc,
1726
+ };
1727
+ }
1728
+ else {
1729
+ register = {
1730
+ kind: "libCall",
1731
+ fn: name === "write" ? "net.sockOnWriteFlushDyn" : "net.sockOnFinishDyn",
1732
+ args: [receiver(), lowerSocketDynListener(lowerer, last, `${name} callbacks`)],
1733
+ type: VOID,
1734
+ loc,
1735
+ };
1736
+ }
1737
+ stmts.push({ kind: "exprStmt", expr: main, loc });
1738
+ return { kind: "seqExpr", stmts, result: register, type: VOID, loc };
1739
+ }
1535
1740
  const maxArgs = name === "write" ? 1 : 1;
1536
1741
  const minArgs = name === "write" ? 1 : 0;
1537
1742
  if (args.length < minArgs || args.length > maxArgs) {
@@ -1580,13 +1785,44 @@ function lowerNetSocketMethodCall(lowerer, call, access) {
1580
1785
  }
1581
1786
  if (name === "setTimeout") {
1582
1787
  requireStatementPosition(lowerer, call, "socket.setTimeout(...)");
1583
- if (args.length !== 1) {
1584
- lowerer.noLowering(`setTimeout with ${args.length} arguments`, call, "the supported form is setTimeout(ms) — register the callback separately: socket.once('timeout', ...)");
1788
+ if (args.length !== 1 && args.length !== 2) {
1789
+ lowerer.noLowering(`setTimeout with ${args.length} arguments`, call, "the supported forms are setTimeout(ms) and setTimeout(ms, callback)");
1585
1790
  }
1586
1791
  const receiver = coerceToHandle(lowerer, access.expression, NETSOCKET_T);
1587
1792
  const ms = lowerer.lowerExprExpecting(args[0], F64);
1793
+ if (args.length === 2) {
1794
+ // Node adds the callback as a once('timeout') listener (removes it
1795
+ // for 0); msecs is checked first either way.
1796
+ const { cb } = lowerCallbackArg(lowerer, args[1], "setTimeout callbacks", 0, () => false, "use ()", []);
1797
+ return {
1798
+ kind: "libCall",
1799
+ fn: "net.sockSetTimeoutCb",
1800
+ args: [receiver, ms, cb],
1801
+ type: VOID,
1802
+ loc,
1803
+ };
1804
+ }
1588
1805
  return { kind: "libCall", fn: "net.sockSetTimeout", args: [receiver, ms], type: VOID, loc };
1589
1806
  }
1807
+ if (name === "setKeepAlive") {
1808
+ // SO_KEEPALIVE plus the initial delay (whole seconds, at least 1);
1809
+ // Node's defaults are false and 0. Answers the socket.
1810
+ if (args.length > 2) {
1811
+ lowerer.noLowering(`setKeepAlive with ${args.length} arguments`, call, "the form is setKeepAlive(enable?, initialDelay?)");
1812
+ }
1813
+ const receiver = coerceToHandle(lowerer, access.expression, NETSOCKET_T);
1814
+ const enable = args.length >= 1 ? lowerer.lowerExprExpecting(args[0], BOOL) : boolLit(false, loc);
1815
+ const delay = args.length === 2
1816
+ ? lowerer.lowerExprExpecting(args[1], F64)
1817
+ : { kind: "numLit", value: 0, type: F64, loc };
1818
+ return {
1819
+ kind: "libCall",
1820
+ fn: "net.sockSetKeepAlive",
1821
+ args: [receiver, enable, delay],
1822
+ type: NETSOCKET_T,
1823
+ loc,
1824
+ };
1825
+ }
1590
1826
  if (name === "pause" || name === "resume") {
1591
1827
  // Flow control (the struct's flag comments in scr_net.c): pause holds
1592
1828
  // reads off — kernel/TCP backpressure is the buffer; resume flows
@@ -1675,6 +1911,28 @@ function lowerNetSocketMethodCall(lowerer, call, access) {
1675
1911
  const event = evT.isStringLiteralType() ? evT.value : null;
1676
1912
  const receiver = coerceToHandle(lowerer, access.expression, NETSOCKET_T);
1677
1913
  if (event === "data") {
1914
+ const sigs = lowerer.checker.getCallSignatures(lowerer.typeOf(args[1]));
1915
+ const firstParam = sigs.length === 1 ? sigs[0].getParameters()[0] : undefined;
1916
+ const param = firstParam !== undefined
1917
+ ? lowerer.mapTypeOf(lowerer.checker.getTypeOfSymbol(firstParam))
1918
+ : null;
1919
+ if (param !== null &&
1920
+ param.kind !== "dyn" &&
1921
+ !(param.kind === "bytes" && param.elem === "u8")) {
1922
+ // A chunk typed string (or string | Buffer): the listener takes
1923
+ // the chunk through a checked boundary, so a string arrives after
1924
+ // setEncoding and a Buffer without it fails the check instead of
1925
+ // being decoded.
1926
+ const boxed = lowerSocketDynListener(lowerer, args[1], "data listeners");
1927
+ const cb = { kind: "dynCheck", value: boxed, type: funcOf([DYN], VOID), loc };
1928
+ return {
1929
+ kind: "libCall",
1930
+ fn: "net.sockOnData",
1931
+ args: [receiver, cb, once],
1932
+ type: VOID,
1933
+ loc,
1934
+ };
1935
+ }
1678
1936
  const { cb } = lowerCallbackArg(lowerer, args[1], "data listeners", 1, (p) => p.kind === "bytes" && p.elem === "u8", "use (chunk: Buffer) or ()", [DYN]);
1679
1937
  return { kind: "libCall", fn: "net.sockOnData", args: [receiver, cb, once], type: VOID, loc };
1680
1938
  }
@@ -1688,9 +1946,23 @@ function lowerNetSocketMethodCall(lowerer, call, access) {
1688
1946
  loc,
1689
1947
  };
1690
1948
  }
1949
+ if (event === "close" &&
1950
+ lowerer.checker
1951
+ .getCallSignatures(lowerer.typeOf(args[1]))
1952
+ .some((sig) => sig.getParameters().length > 0)) {
1953
+ // close(hadError): true when the socket closed because of an error.
1954
+ return {
1955
+ kind: "libCall",
1956
+ fn: "net.sockOnCloseDyn",
1957
+ args: [receiver, lowerSocketDynListener(lowerer, args[1], "close listeners"), once],
1958
+ type: VOID,
1959
+ loc,
1960
+ };
1961
+ }
1691
1962
  if (event === "end" ||
1692
1963
  event === "close" ||
1693
1964
  event === "connect" ||
1965
+ event === "ready" ||
1694
1966
  event === "timeout" ||
1695
1967
  event === "readable") {
1696
1968
  const { cb } = lowerCallbackArg(lowerer, args[1], `${event} listeners`, 0, () => false, "use ()", []);
@@ -1702,7 +1974,9 @@ function lowerNetSocketMethodCall(lowerer, call, access) {
1702
1974
  ? "net.sockOnTimeout"
1703
1975
  : event === "readable"
1704
1976
  ? "net.sockOnReadable"
1705
- : "net.sockOnConnect";
1977
+ : event === "ready"
1978
+ ? "net.sockOnReady"
1979
+ : "net.sockOnConnect";
1706
1980
  return { kind: "libCall", fn, args: [receiver, cb, once], type: VOID, loc };
1707
1981
  }
1708
1982
  if (event === "finish") {
@@ -1737,9 +2011,9 @@ function lowerNetSocketMethodCall(lowerer, call, access) {
1737
2011
  loc,
1738
2012
  };
1739
2013
  }
1740
- lowerer.noLowering(`socket.${name}(${event === null ? "non-literal event" : `"${event}"`}, ...)`, args[0], '"data", "end", "close", "error", "connect", "timeout", "readable", "secureConnect", and "session" are the supported socket events (as literals)');
2014
+ lowerer.noLowering(`socket.${name}(${event === null ? "non-literal event" : `"${event}"`}, ...)`, args[0], '"data", "end", "close", "error", "connect", "ready", "timeout", "readable", "secureConnect", and "session" are the supported socket events (as literals)');
1741
2015
  }
1742
- lowerer.noLowering(`Socket.${name}`, call, "write, end, destroy, pipe, setTimeout, remoteAddress, read, unshift, and on/once of data/end/close/error/connect/timeout/readable are the supported Socket members", lowerer.checker.getSymbolAtLocation(access.name));
2016
+ lowerer.noLowering(`Socket.${name}`, call, "write, end, destroy, pipe, setTimeout, setKeepAlive, setNoDelay, the address fields, read, unshift, and on/once of data/end/close/error/connect/ready/timeout/readable are the supported Socket members", lowerer.checker.getSymbolAtLocation(access.name));
1743
2017
  }
1744
2018
  /** The method-call dispatch for both server-surface receiver kinds — one
1745
2019
  * entry in lower-calls.ts's intrinsic chain (the lowerChildMethodCall
@@ -1768,6 +2042,7 @@ function headersSnapshotHelper(lowerer, shapeId, loc) {
1768
2042
  libCall: "http.reqHeaderPairs",
1769
2043
  params: [{ localId: "r.0", name: "r", type: HTTPREQ_T }],
1770
2044
  callArgs: [varRef("r.0", HTTPREQ_T, loc)],
2045
+ listKey: { name: "set-cookie", libCall: "http.reqHeaderList" },
1771
2046
  });
1772
2047
  }
1773
2048
  function trailersSnapshotHelper(lowerer, shapeId, loc) {
@@ -2203,6 +2478,23 @@ export function lowerServerProperty(lowerer, expr) {
2203
2478
  const receiver = coerceToHandle(lowerer, expr.expression, NETSERVER_T);
2204
2479
  return { kind: "libCall", fn: "net.serverListening", args: [receiver], type: BOOL, loc };
2205
2480
  }
2481
+ if (expr.name.text === "maxConnections") {
2482
+ const receiver = coerceToHandle(lowerer, expr.expression, NETSERVER_T);
2483
+ const value = {
2484
+ kind: "libCall",
2485
+ fn: "net.serverMaxConnectionsGet",
2486
+ args: [receiver],
2487
+ type: DYN,
2488
+ loc,
2489
+ };
2490
+ // The property's declared type: an earlier `= undefined` narrows
2491
+ // the read's own type to undefined.
2492
+ const sym = lowerer.checker.getSymbolAtLocation(expr.name);
2493
+ const declared = lowerer.mapTypeOf(sym ? lowerer.checker.getTypeOfSymbol(sym) : lowerer.typeOf(expr));
2494
+ return declared === null || declared.kind === "dyn"
2495
+ ? value
2496
+ : lowerer.coerceInto(expr, value, declared);
2497
+ }
2206
2498
  const field = httpServerTimeoutField(expr.name.text);
2207
2499
  if (field !== null) {
2208
2500
  const receiver = coerceToHandle(lowerer, expr.expression, NETSERVER_T);
@@ -2404,6 +2696,45 @@ export function lowerServerProperty(lowerer, expr) {
2404
2696
  loc,
2405
2697
  };
2406
2698
  }
2699
+ if (recvKind === "netSocket" && lowerer.isStdlibMember(expr)) {
2700
+ const name = expr.name.text;
2701
+ // The other address fields: the peer's cached like remoteAddress, the
2702
+ // local ones read live (undefined while connecting and after close).
2703
+ const field = [
2704
+ "remotePort",
2705
+ "remoteFamily",
2706
+ "localAddress",
2707
+ "localPort",
2708
+ "localFamily",
2709
+ ].indexOf(name);
2710
+ if (field >= 0) {
2711
+ const receiver = coerceToHandle(lowerer, expr.expression, NETSOCKET_T);
2712
+ const value = {
2713
+ kind: "libCall",
2714
+ fn: "net.sockAddrField",
2715
+ args: [receiver, { kind: "numLit", value: field, type: F64, loc }],
2716
+ type: DYN,
2717
+ loc,
2718
+ };
2719
+ const declared = lowerer.mapTypeOf(lowerer.typeOf(expr));
2720
+ return declared === null || declared.kind === "dyn"
2721
+ ? value
2722
+ : lowerer.coerceInto(expr, value, declared);
2723
+ }
2724
+ const scalar = name === "bytesRead"
2725
+ ? { fn: "net.sockBytesRead", type: F64 }
2726
+ : name === "connecting"
2727
+ ? { fn: "net.sockConnecting", type: BOOL }
2728
+ : name === "pending"
2729
+ ? { fn: "net.sockPending", type: BOOL }
2730
+ : name === "readyState"
2731
+ ? { fn: "net.sockReadyState", type: STRING }
2732
+ : null;
2733
+ if (scalar !== null) {
2734
+ const receiver = coerceToHandle(lowerer, expr.expression, NETSOCKET_T);
2735
+ return { kind: "libCall", fn: scalar.fn, args: [receiver], type: scalar.type, loc };
2736
+ }
2737
+ }
2407
2738
  if (recvKind === "httpClientReq" &&
2408
2739
  lowerer.isStdlibMember(expr) &&
2409
2740
  expr.name.text === "destroyed") {
@@ -2457,14 +2788,15 @@ export function lowerServerProperty(lowerer, expr) {
2457
2788
  const collection = httpReqFieldCollection(lowerer, expr.expression);
2458
2789
  const receiver = coerceToHandle(lowerer, expr.expression.expression, HTTPREQ_T);
2459
2790
  const key = { kind: "strLit", value: expr.name.text, type: STRING, loc };
2460
- const fn = collection === "headers"
2791
+ const list = isSetCookieRead(lowerer, expr, collection, key);
2792
+ const fn = collection === "headers" && !list
2461
2793
  ? "http.reqHeader"
2462
2794
  : collection === "trailers"
2463
2795
  ? "http.reqTrailer"
2464
- : collection === "headersDistinct"
2796
+ : collection === "headersDistinct" || list
2465
2797
  ? "http.reqHeaderValues"
2466
2798
  : "http.reqTrailerValues";
2467
- const type = collection.endsWith("Distinct")
2799
+ const type = collection.endsWith("Distinct") || list
2468
2800
  ? lowerer.withUndefinedArm(arrayOf(STRING))
2469
2801
  : lowerer.envValueType();
2470
2802
  return { kind: "libCall", fn, args: [receiver, key], type, loc };
@@ -2694,7 +3026,7 @@ function lowerHttpServerOptions(lowerer, node, what) {
2694
3026
  }
2695
3027
  if (key === "joinDuplicateHeaders") {
2696
3028
  // Literal true/false: the flag decides parse-time read semantics,
2697
- // so a runtime value would silently pick one — fence dynamics.
3029
+ // so a runtime value would pick one without a diagnostic — fence dynamics.
2698
3030
  if (initializer !== null && initializer.kind === ts.SyntaxKind.TrueKeyword) {
2699
3031
  joinDup = true;
2700
3032
  continue;
@@ -2938,7 +3270,9 @@ export function lowerHttpAgentNew(lowerer, expr) {
2938
3270
  lowerer.lowerExpr(initializer); // evaluate, like Node
2939
3271
  break;
2940
3272
  default:
2941
- fenceOrDropOptionKey(lowerer, prop, key, api, AGENT_DOCUMENTED_OPTIONS, "keepAlive, keepAliveMsecs, maxSockets, maxFreeSockets, timeout, port, and scheduling are the supported options");
3273
+ fenceOrDropOptionKey(lowerer, prop, key, api, bi.module === "https" ? HTTPS_AGENT_DOCUMENTED_OPTIONS : AGENT_DOCUMENTED_OPTIONS, bi.module === "https"
3274
+ ? "keepAlive, keepAliveMsecs, maxSockets, maxFreeSockets, timeout, port, and scheduling are the supported options; pass TLS options such as ca and rejectUnauthorized on each https.request"
3275
+ : "keepAlive, keepAliveMsecs, maxSockets, maxFreeSockets, timeout, port, and scheduling are the supported options");
2942
3276
  }
2943
3277
  }
2944
3278
  }
@@ -4313,7 +4647,7 @@ function lowerHttpClientCall(lowerer, expr, member, loc, secure = false) {
4313
4647
  }
4314
4648
  if (connCb !== null && (host !== null || port !== null)) {
4315
4649
  // Node would use host/port only for the Host header once a dialer
4316
- // exists — a silent half-use; set headers.host instead.
4650
+ // exists — a partial use with no warning; set headers.host instead.
4317
4651
  lowerer.noLowering(`${member} mixing createConnection with hostname/host/port`, optsNode, "the dialer supplies the socket — set the Host header via headers: { host: ... } instead");
4318
4652
  }
4319
4653
  if (agentVal !== null && connCb !== null) {
@@ -4780,22 +5114,36 @@ export function lowerHttpHeadersElement(lowerer, expr) {
4780
5114
  lowerer.unsupported("SC1090", expr.argumentExpression, `indexing req.${collection} with non-string keys`);
4781
5115
  }
4782
5116
  const receiver = lowerer.lowerExpr(recv);
5117
+ const list = isSetCookieRead(lowerer, expr, collection, key);
4783
5118
  return {
4784
5119
  kind: "libCall",
4785
- fn: collection === "headers"
5120
+ fn: collection === "headers" && !list
4786
5121
  ? "http.reqHeader"
4787
5122
  : collection === "trailers"
4788
5123
  ? "http.reqTrailer"
4789
- : collection === "headersDistinct"
5124
+ : collection === "headersDistinct" || list
4790
5125
  ? "http.reqHeaderValues"
4791
5126
  : "http.reqTrailerValues",
4792
5127
  args: [receiver, key],
4793
- type: collection.endsWith("Distinct")
5128
+ type: collection.endsWith("Distinct") || list
4794
5129
  ? lowerer.withUndefinedArm(arrayOf(STRING))
4795
5130
  : lowerer.envValueType(),
4796
5131
  loc: locOf(expr),
4797
5132
  };
4798
5133
  }
5134
+ /** `headers["set-cookie"]` reads Node's array of every Set-Cookie line,
5135
+ * the `string[] | undefined` that @types/node's IncomingHttpHeaders
5136
+ * declares. A read typed as a string (the bundled declarations type every
5137
+ * header as one) is refused, because Node's value is an array. */
5138
+ function isSetCookieRead(lowerer, expr, collection, key) {
5139
+ if (collection !== "headers" || key.kind !== "strLit" || key.value !== "set-cookie")
5140
+ return false;
5141
+ const type = lowerer.mapTypeOf(lowerer.typeOf(expr));
5142
+ const array = lowerer.withUndefinedArm(arrayOf(STRING));
5143
+ if (type?.kind === "union" && array.kind === "union" && type.unionId === array.unionId)
5144
+ return true;
5145
+ lowerer.noLowering("reading set-cookie through string-typed headers", expr, "Node stores set-cookie as an array: read headersDistinct['set-cookie'], or install @types/node, which types headers['set-cookie'] as string[]");
5146
+ }
4799
5147
  /** Method calls on IncomingMessage receivers: on/once("data" | "end").
4800
5148
  * Null for other receivers. */
4801
5149
  function lowerHttpReqMethodCall(lowerer, call, access) {
@@ -4834,7 +5182,7 @@ function lowerHttpReqMethodCall(lowerer, call, access) {
4834
5182
  }
4835
5183
  if (name === "setEncoding") {
4836
5184
  // setEncoding('utf8') — 'data' delivers strings (the chunk-encoding
4837
- // window); other real encodings fence loudly at runtime, unknown
5185
+ // window); other real encodings throw "not supported yet" at runtime, unknown
4838
5186
  // names throw Node's ERR_UNKNOWN_ENCODING.
4839
5187
  requireStatementPosition(lowerer, call, "req.setEncoding(...)");
4840
5188
  if (args.length !== 1) {
@@ -5054,12 +5402,17 @@ function lowerHttpResMethodCall(lowerer, call, access) {
5054
5402
  // retains the setHeader refusal below.
5055
5403
  value = lowerer.coerceInto(args[1], value, STRING);
5056
5404
  }
5057
- if (value.type.kind === "f64") {
5058
- // Node formats number values via String(n) — the same ToString.
5059
- value = { kind: "toString", operand: value, type: STRING, loc };
5060
- }
5061
5405
  if (value.type.kind !== "string") {
5062
- lowerer.noLowering(`setHeader with a '${lowerer.fmt(value.type)}' value`, args[1], "header values are strings or numbers here");
5406
+ // Numbers and arrays keep their type for getHeader/getHeaders, like
5407
+ // Node's stored value; numbers serialize as String(n) and arrays as
5408
+ // one line per element.
5409
+ return {
5410
+ kind: "libCall",
5411
+ fn: "http.resSetHeaderDyn",
5412
+ args: [receiver, header, lowerer.coerceToExpected(value, DYN)],
5413
+ type: VOID,
5414
+ loc,
5415
+ };
5063
5416
  }
5064
5417
  return {
5065
5418
  kind: "libCall",
@@ -5069,6 +5422,22 @@ function lowerHttpResMethodCall(lowerer, call, access) {
5069
5422
  loc,
5070
5423
  };
5071
5424
  }
5425
+ if (name === "appendHeader") {
5426
+ requireStatementPosition(lowerer, call, "res.appendHeader(...)");
5427
+ if (args.length !== 2) {
5428
+ lowerer.noLowering(`appendHeader with ${args.length} arguments`, call, "the supported form is appendHeader(name, value)");
5429
+ }
5430
+ const receiver = coerceToHandle(lowerer, access.expression, HTTPRES_T);
5431
+ const header = lowerer.lowerExprExpecting(args[0], STRING);
5432
+ const value = lowerer.lowerExpr(args[1]);
5433
+ return {
5434
+ kind: "libCall",
5435
+ fn: "http.resAppendHeader",
5436
+ args: [receiver, header, lowerer.coerceToExpected(value, DYN)],
5437
+ type: VOID,
5438
+ loc,
5439
+ };
5440
+ }
5072
5441
  if (name === "writeHead") {
5073
5442
  if (args.length < 1 || args.length > 3) {
5074
5443
  lowerer.noLowering(`writeHead with ${args.length} arguments`, call, "the supported forms are writeHead(status[, statusMessage][, headers]) — headers as a literal object, a Record, or a flat [name, value, ...] array");
@@ -5127,7 +5496,8 @@ function lowerHttpResMethodCall(lowerer, call, access) {
5127
5496
  if (v.type.kind === "dyn") {
5128
5497
  // A checked-dynamic headers value (an untyped JS helper's
5129
5498
  // parameter — the suite's test(headers) idiom): the runtime OBJ
5130
- // walk sets each entry, loud fences for non-string/number values.
5499
+ // walk sets each entry and throws ERR_INVALID_ARG_TYPE for
5500
+ // non-string/number values.
5131
5501
  return headResult("http.resWriteHeadDyn", [receiver, status, v]);
5132
5502
  }
5133
5503
  if (v.type.kind !== "record") {
@@ -5173,9 +5543,9 @@ function lowerHttpResMethodCall(lowerer, call, access) {
5173
5543
  }
5174
5544
  const receiver = coerceToHandle(lowerer, access.expression, HTTPRES_T);
5175
5545
  // end's callback forms — end(cb) / end(data, cb): the callback fires
5176
- // deferred once the body went out (Node's 'finish' emit), through
5177
- // the resOnFinish slot registered just before the end call in an
5178
- // interned composing helper.
5546
+ // deferred once the body went out (just before Node's 'finish' emit),
5547
+ // through the resOnEndCallback slot registered just before the end
5548
+ // call in an interned composing helper.
5179
5549
  let cbArg = null;
5180
5550
  let dataNode = args[0];
5181
5551
  if (name === "end" && args.length === 2) {
@@ -5218,7 +5588,7 @@ function lowerHttpResMethodCall(lowerer, call, access) {
5218
5588
  kind: "exprStmt",
5219
5589
  expr: {
5220
5590
  kind: "libCall",
5221
- fn: "http.resOnFinish",
5591
+ fn: "http.resOnEndCallback",
5222
5592
  args: [
5223
5593
  varRef(params[0].localId, params[0].type, loc),
5224
5594
  varRef(params[all.length - 1].localId, params[all.length - 1].type, loc),
@@ -5274,10 +5644,9 @@ function lowerHttpResMethodCall(lowerer, call, access) {
5274
5644
  }
5275
5645
  if (name === "getHeader" || name === "hasHeader" || name === "removeHeader") {
5276
5646
  // The header CRUD trio (setHeader's readers): getHeader answers the
5277
- // value as SET — `string | undefined` here, where Node can also
5278
- // answer numbers/arrays it was handed (this surface stores strings);
5279
- // removeHeader drops every case-insensitive match before the head
5280
- // goes out; hasHeader is the boolean probe.
5647
+ // value as set (a number, string or string[]); removeHeader drops
5648
+ // every case-insensitive match before the head goes out; hasHeader is
5649
+ // the boolean probe.
5281
5650
  if (name === "removeHeader")
5282
5651
  requireStatementPosition(lowerer, call, "res.removeHeader(...)");
5283
5652
  if (args.length !== 1) {
@@ -5286,13 +5655,19 @@ function lowerHttpResMethodCall(lowerer, call, access) {
5286
5655
  const receiver = coerceToHandle(lowerer, access.expression, HTTPRES_T);
5287
5656
  const header = lowerer.lowerExprExpecting(args[0], STRING);
5288
5657
  if (name === "getHeader") {
5289
- return {
5658
+ // The value as set: number, string or string[] (undefined when
5659
+ // absent), checked against the declared result type.
5660
+ const value = {
5290
5661
  kind: "libCall",
5291
- fn: "http.resGetHeader",
5662
+ fn: "http.resGetHeaderDyn",
5292
5663
  args: [receiver, header],
5293
- type: lowerer.envValueType(),
5664
+ type: DYN,
5294
5665
  loc,
5295
5666
  };
5667
+ const declared = lowerer.mapTypeOf(lowerer.typeOf(call));
5668
+ return declared === null || declared.kind === "dyn"
5669
+ ? value
5670
+ : lowerer.coerceInto(call, value, declared);
5296
5671
  }
5297
5672
  if (name === "hasHeader") {
5298
5673
  return {
@@ -5341,6 +5716,6 @@ function lowerHttpResMethodCall(lowerer, call, access) {
5341
5716
  }
5342
5717
  lowerer.noLowering(`res.${name}(${event === null ? "non-literal event" : `"${event}"`}, ...)`, args[0], '"close" and "finish" are the supported response events (as literals)');
5343
5718
  }
5344
- lowerer.noLowering(`ServerResponse.${name}`, call, "setHeader, getHeader, hasHeader, removeHeader, writeHead, writeContinue, writeProcessing, writeEarlyHints, setTimeout, write, end, destroy, response state reads, and on/once of close are the supported ServerResponse members", lowerer.checker.getSymbolAtLocation(access.name));
5719
+ lowerer.noLowering(`ServerResponse.${name}`, call, "setHeader, appendHeader, getHeader, hasHeader, removeHeader, writeHead, writeContinue, writeProcessing, writeEarlyHints, setTimeout, write, end, destroy, response state reads, and on/once of close are the supported ServerResponse members", lowerer.checker.getSymbolAtLocation(access.name));
5345
5720
  }
5346
5721
  //# sourceMappingURL=lower-server.js.map