@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.
- package/ambient/scriptc-node-fallback.d.ts +1202 -64
- package/dist/backend/cycle-analysis.js +6 -1
- package/dist/backend/cycle-analysis.js.map +1 -1
- package/dist/backend/cycle-mutability.d.ts +5 -0
- package/dist/backend/cycle-mutability.js +62 -3
- package/dist/backend/cycle-mutability.js.map +1 -1
- package/dist/backend/executable-features.js +1 -0
- package/dist/backend/executable-features.js.map +1 -1
- package/dist/backend/library-pack.js +1 -0
- package/dist/backend/library-pack.js.map +1 -1
- package/dist/backend/llvm/alloc.js +24 -10
- package/dist/backend/llvm/alloc.js.map +1 -1
- package/dist/backend/llvm/alloc.test.js +47 -1
- package/dist/backend/llvm/alloc.test.js.map +1 -1
- package/dist/backend/llvm/array-search.d.ts +8 -0
- package/dist/backend/llvm/array-search.js +52 -0
- package/dist/backend/llvm/array-search.js.map +1 -0
- package/dist/backend/llvm/array-search.test.d.ts +1 -0
- package/dist/backend/llvm/array-search.test.js +72 -0
- package/dist/backend/llvm/array-search.test.js.map +1 -0
- package/dist/backend/llvm/call-lifetimes.d.ts +12 -1
- package/dist/backend/llvm/call-lifetimes.js +41 -11
- package/dist/backend/llvm/call-lifetimes.js.map +1 -1
- package/dist/backend/llvm/call-lifetimes.test.js +85 -1
- package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/classes.js +87 -36
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/common.d.ts +6 -1
- package/dist/backend/llvm/common.js +8 -1
- package/dist/backend/llvm/common.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.d.ts +5 -0
- package/dist/backend/llvm/dense-array-access.js +3 -3
- package/dist/backend/llvm/dense-array-access.js.map +1 -1
- package/dist/backend/llvm/dyn.d.ts +44 -1
- package/dist/backend/llvm/dyn.js +251 -36
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +77 -14
- package/dist/backend/llvm/emitter.js +461 -108
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/emitter.test.js +26 -3
- package/dist/backend/llvm/emitter.test.js.map +1 -1
- package/dist/backend/llvm/expr-async.js +52 -1
- package/dist/backend/llvm/expr-async.js.map +1 -1
- package/dist/backend/llvm/expr-bytes.d.ts +9 -0
- package/dist/backend/llvm/expr-bytes.js +169 -63
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-callbacks.js +16 -2
- package/dist/backend/llvm/expr-callbacks.js.map +1 -1
- package/dist/backend/llvm/expr-calls.d.ts +3 -1
- package/dist/backend/llvm/expr-calls.js +57 -2
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-containers.js +57 -19
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.js +19 -8
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +28 -30
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-records.js +8 -4
- package/dist/backend/llvm/expr-records.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.js +35 -32
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/expr-stream-callbacks.d.ts +13 -2
- package/dist/backend/llvm/expr-stream-callbacks.js +80 -5
- package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
- package/dist/backend/llvm/inline-unions.d.ts +48 -0
- package/dist/backend/llvm/inline-unions.js +134 -0
- package/dist/backend/llvm/inline-unions.js.map +1 -0
- package/dist/backend/llvm/inline-unions.test.d.ts +1 -0
- package/dist/backend/llvm/inline-unions.test.js +124 -0
- package/dist/backend/llvm/inline-unions.test.js.map +1 -0
- package/dist/backend/llvm/integer-remainder.d.ts +28 -5
- package/dist/backend/llvm/integer-remainder.js +80 -9
- package/dist/backend/llvm/integer-remainder.js.map +1 -1
- package/dist/backend/llvm/intern-tables.test.d.ts +1 -0
- package/dist/backend/llvm/intern-tables.test.js +77 -0
- package/dist/backend/llvm/intern-tables.test.js.map +1 -0
- package/dist/backend/llvm/lib-datagram.js +10 -0
- package/dist/backend/llvm/lib-datagram.js.map +1 -1
- package/dist/backend/llvm/lib-dispatch.js +255 -29
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +176 -7
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-network.js +25 -6
- package/dist/backend/llvm/lib-network.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +2 -2
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.d.ts +5 -0
- package/dist/backend/llvm/lib-shared.js +212 -1
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/lib-stream.js +184 -0
- package/dist/backend/llvm/lib-stream.js.map +1 -1
- package/dist/backend/llvm/lib-test.js +9 -0
- package/dist/backend/llvm/lib-test.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.js +7 -3
- package/dist/backend/llvm/local-array-reads.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.test.js +6 -3
- package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
- package/dist/backend/llvm/local-union-storage.d.ts +2 -0
- package/dist/backend/llvm/local-union-storage.js +5 -0
- package/dist/backend/llvm/local-union-storage.js.map +1 -1
- package/dist/backend/llvm/local-union-storage.test.js +1 -0
- package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
- package/dist/backend/llvm/loop-array-borrows.d.ts +8 -2
- package/dist/backend/llvm/loop-array-borrows.js +93 -13
- package/dist/backend/llvm/loop-array-borrows.js.map +1 -1
- package/dist/backend/llvm/map-number-lookup.d.ts +24 -0
- package/dist/backend/llvm/map-number-lookup.js +88 -0
- package/dist/backend/llvm/map-number-lookup.js.map +1 -1
- package/dist/backend/llvm/map-number-lookup.test.d.ts +1 -0
- package/dist/backend/llvm/map-number-lookup.test.js +158 -0
- package/dist/backend/llvm/map-number-lookup.test.js.map +1 -0
- package/dist/backend/llvm/map-read-lifetimes.d.ts +9 -0
- package/dist/backend/llvm/map-read-lifetimes.js +90 -1
- package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
- package/dist/backend/llvm/map-read-lifetimes.test.js +129 -1
- package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/publish.d.ts +9 -0
- package/dist/backend/llvm/publish.js +25 -4
- package/dist/backend/llvm/publish.js.map +1 -1
- package/dist/backend/llvm/record-results.d.ts +8 -5
- package/dist/backend/llvm/record-results.js +20 -12
- package/dist/backend/llvm/record-results.js.map +1 -1
- package/dist/backend/llvm/reference-effects.js +13 -0
- package/dist/backend/llvm/reference-effects.js.map +1 -1
- package/dist/backend/llvm/reference-writes.js +19 -2
- package/dist/backend/llvm/reference-writes.js.map +1 -1
- package/dist/backend/llvm/regions.d.ts +5 -1
- package/dist/backend/llvm/regions.js +24 -10
- package/dist/backend/llvm/regions.js.map +1 -1
- package/dist/backend/llvm/serialized-ir-emission.test.js +2 -0
- package/dist/backend/llvm/serialized-ir-emission.test.js.map +1 -1
- package/dist/backend/llvm/shapes.d.ts +56 -10
- package/dist/backend/llvm/shapes.js +178 -39
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/shapes.test.js +61 -3
- package/dist/backend/llvm/shapes.test.js.map +1 -1
- package/dist/backend/llvm/stack-objects.js +16 -4
- package/dist/backend/llvm/stack-objects.js.map +1 -1
- package/dist/backend/llvm/stack-objects.test.js +3 -0
- package/dist/backend/llvm/stack-objects.test.js.map +1 -1
- package/dist/backend/llvm/string-reads.js +2 -2
- package/dist/backend/llvm/string-reads.js.map +1 -1
- package/dist/backend/llvm/string-slices.js +2 -2
- package/dist/backend/llvm/string-slices.js.map +1 -1
- package/dist/backend/llvm/walkers.d.ts +11 -0
- package/dist/backend/llvm/walkers.js +106 -10
- package/dist/backend/llvm/walkers.js.map +1 -1
- package/dist/backend/may-throw.js +13 -4
- package/dist/backend/may-throw.js.map +1 -1
- package/dist/backend/native/contracts.d.ts +5 -2
- package/dist/backend/native/executable.js +27 -8
- package/dist/backend/native/executable.js.map +1 -1
- package/dist/backend/native/runtime-inputs.d.ts +1 -1
- package/dist/backend/native/runtime-inputs.js +2 -0
- package/dist/backend/native/runtime-inputs.js.map +1 -1
- package/dist/backend/native-codegen-core.d.ts +4 -4
- package/dist/backend/native-codegen-core.js +4 -6
- package/dist/backend/native-codegen-core.js.map +1 -1
- package/dist/backend/native-codegen.test.js +7 -8
- package/dist/backend/native-codegen.test.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +3 -0
- package/dist/backend/native-link-info-core.js.map +1 -1
- package/dist/backend/native-toolchain.test.js +1 -1
- package/dist/backend/native-toolchain.test.js.map +1 -1
- package/dist/backend/publication.js +3 -1
- package/dist/backend/publication.js.map +1 -1
- package/dist/backend/runtime-abi.d.ts +2 -2
- package/dist/backend/runtime-abi.js +2 -2
- package/dist/backend/runtime-pack-targets.test.js +2 -1
- package/dist/backend/runtime-pack-targets.test.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +2 -1
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/backend/target-diagnostics.js +11 -1
- package/dist/backend/target-diagnostics.js.map +1 -1
- package/dist/backend/target-diagnostics.test.js +4 -1
- package/dist/backend/target-diagnostics.test.js.map +1 -1
- package/dist/backend/warm-cache.js +1 -0
- package/dist/backend/warm-cache.js.map +1 -1
- package/dist/compat/fetch-profile.js +4 -4
- package/dist/compat/fetch-profile.js.map +1 -1
- package/dist/contracts/check.js +2 -0
- package/dist/contracts/check.js.map +1 -1
- package/dist/coverage/report.js +1 -1
- package/dist/coverage/report.js.map +1 -1
- package/dist/diagnostics/diagnostic.d.ts +6 -5
- package/dist/diagnostics/diagnostic.js +7 -6
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +1 -0
- package/dist/executable/executable-cache.js +1 -0
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +1 -0
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/frontend/builtin-modules.d.ts +1 -1
- package/dist/frontend/builtin-modules.js +1 -0
- package/dist/frontend/builtin-modules.js.map +1 -1
- package/dist/frontend/comptime-node.js +2 -2
- package/dist/frontend/comptime-node.js.map +1 -1
- package/dist/frontend/experimental-import.d.ts +5 -1
- package/dist/frontend/experimental-import.js +28 -3
- package/dist/frontend/experimental-import.js.map +1 -1
- package/dist/frontend/lowering/assert-instances.d.ts +38 -0
- package/dist/frontend/lowering/assert-instances.js +269 -0
- package/dist/frontend/lowering/assert-instances.js.map +1 -0
- package/dist/frontend/lowering/binding-analysis.d.ts +1 -1
- package/dist/frontend/lowering/binding-analysis.js +1 -1
- package/dist/frontend/lowering/builtins/arguments.d.ts +4 -0
- package/dist/frontend/lowering/builtins/arguments.js +8 -4
- package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
- package/dist/frontend/lowering/builtins/blob.d.ts +20 -0
- package/dist/frontend/lowering/builtins/blob.js +167 -0
- package/dist/frontend/lowering/builtins/blob.js.map +1 -0
- package/dist/frontend/lowering/builtins/child-process-async.d.ts +2 -2
- package/dist/frontend/lowering/builtins/child-process-async.js +2 -2
- package/dist/frontend/lowering/builtins/child-process-methods.js +1 -1
- package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process-sync.js +1 -1
- package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -1
- package/dist/frontend/lowering/builtins/compression.d.ts +18 -0
- package/dist/frontend/lowering/builtins/compression.js +178 -4
- package/dist/frontend/lowering/builtins/compression.js.map +1 -1
- package/dist/frontend/lowering/builtins/constants.js +7 -2
- package/dist/frontend/lowering/builtins/constants.js.map +1 -1
- package/dist/frontend/lowering/builtins/crypto.d.ts +6 -0
- package/dist/frontend/lowering/builtins/crypto.js +526 -121
- package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
- package/dist/frontend/lowering/builtins/errors.js +23 -0
- package/dist/frontend/lowering/builtins/errors.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +10 -0
- package/dist/frontend/lowering/builtins/filesystem-calls.js +89 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem.d.ts +16 -7
- package/dist/frontend/lowering/builtins/filesystem.js +97 -15
- package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
- package/dist/frontend/lowering/builtins/fs-glob.d.ts +23 -0
- package/dist/frontend/lowering/builtins/fs-glob.js +224 -0
- package/dist/frontend/lowering/builtins/fs-glob.js.map +1 -0
- package/dist/frontend/lowering/builtins/key-object.d.ts +13 -0
- package/dist/frontend/lowering/builtins/key-object.js +56 -0
- package/dist/frontend/lowering/builtins/key-object.js.map +1 -0
- package/dist/frontend/lowering/builtins/module-calls.js +44 -11
- package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/performance.d.ts +25 -3
- package/dist/frontend/lowering/builtins/performance.js +340 -5
- package/dist/frontend/lowering/builtins/performance.js.map +1 -1
- package/dist/frontend/lowering/builtins/process.d.ts +2 -2
- package/dist/frontend/lowering/builtins/process.js +107 -14
- package/dist/frontend/lowering/builtins/process.js.map +1 -1
- package/dist/frontend/lowering/builtins/properties.d.ts +0 -7
- package/dist/frontend/lowering/builtins/properties.js +39 -11
- package/dist/frontend/lowering/builtins/properties.js.map +1 -1
- package/dist/frontend/lowering/builtins/readline.d.ts +23 -8
- package/dist/frontend/lowering/builtins/readline.js +266 -90
- package/dist/frontend/lowering/builtins/readline.js.map +1 -1
- package/dist/frontend/lowering/builtins/timers.d.ts +3 -0
- package/dist/frontend/lowering/builtins/timers.js +109 -23
- package/dist/frontend/lowering/builtins/timers.js.map +1 -1
- package/dist/frontend/lowering/builtins/url.d.ts +8 -0
- package/dist/frontend/lowering/builtins/url.js +36 -0
- package/dist/frontend/lowering/builtins/url.js.map +1 -1
- package/dist/frontend/lowering/call-arguments.js +1 -1
- package/dist/frontend/lowering/call-arguments.js.map +1 -1
- package/dist/frontend/lowering/call-signatures.js +26 -2
- package/dist/frontend/lowering/call-signatures.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +2 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.js +171 -13
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js +1 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
- package/dist/frontend/lowering/class-protocol-dispatch.d.ts +45 -0
- package/dist/frontend/lowering/class-protocol-dispatch.js +516 -0
- package/dist/frontend/lowering/class-protocol-dispatch.js.map +1 -0
- package/dist/frontend/lowering/coercions/structural-plans.js +2 -1
- package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural.js +3 -3
- package/dist/frontend/lowering/coercions/structural.js.map +1 -1
- package/dist/frontend/lowering/collation-repertoire.js +6 -5
- package/dist/frontend/lowering/collation-repertoire.js.map +1 -1
- package/dist/frontend/lowering/containers/array-callbacks.js +4 -7
- package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
- package/dist/frontend/lowering/containers/array-methods.d.ts +0 -7
- package/dist/frontend/lowering/containers/array-methods.js +43 -2
- package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/bytes.js +38 -26
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/containers/for-of.d.ts +1 -1
- package/dist/frontend/lowering/containers/for-of.js +5 -1
- package/dist/frontend/lowering/containers/for-of.js.map +1 -1
- package/dist/frontend/lowering/containers/indexed-objects.js +1 -1
- package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
- package/dist/frontend/lowering/crypto-tables.d.ts +3 -3
- package/dist/frontend/lowering/crypto-tables.js +77 -12
- package/dist/frontend/lowering/crypto-tables.js.map +1 -1
- package/dist/frontend/lowering/expressions/nullish-assignment.js +10 -0
- package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
- package/dist/frontend/lowering/expressions/object-literals.js +16 -12
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/generic-functions.d.ts +2 -2
- package/dist/frontend/lowering/generic-functions.js +2 -2
- package/dist/frontend/lowering/generic-functions.js.map +1 -1
- package/dist/frontend/lowering/http2-constants.js +1 -1
- package/dist/frontend/lowering/intern-tables.d.ts +13 -0
- package/dist/frontend/lowering/intern-tables.js +536 -0
- package/dist/frontend/lowering/intern-tables.js.map +1 -0
- package/dist/frontend/lowering/lower-array-sort.d.ts +12 -1
- package/dist/frontend/lowering/lower-array-sort.js +561 -191
- package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
- package/dist/frontend/lowering/lower-array-sort.test.js +4 -2
- package/dist/frontend/lowering/lower-array-sort.test.js.map +1 -1
- package/dist/frontend/lowering/lower-assert.js +702 -63
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-async-iteration.d.ts +6 -3
- package/dist/frontend/lowering/lower-async-iteration.js +259 -4
- package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.js +118 -12
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +11 -2
- package/dist/frontend/lowering/lower-classes.js +76 -9
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-comptime.d.ts +1 -1
- package/dist/frontend/lowering/lower-comptime.js +4 -4
- package/dist/frontend/lowering/lower-comptime.js.map +1 -1
- package/dist/frontend/lowering/lower-dgram.js +77 -52
- package/dist/frontend/lowering/lower-dgram.js.map +1 -1
- package/dist/frontend/lowering/lower-event-target.d.ts +63 -0
- package/dist/frontend/lowering/lower-event-target.js +362 -0
- package/dist/frontend/lowering/lower-event-target.js.map +1 -0
- package/dist/frontend/lowering/lower-expando.js +2 -2
- package/dist/frontend/lowering/lower-exprs.js +124 -22
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.d.ts +6 -0
- package/dist/frontend/lowering/lower-inspect.js +240 -49
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-mixins.js +1 -1
- package/dist/frontend/lowering/lower-mock.d.ts +11 -0
- package/dist/frontend/lowering/lower-mock.js +504 -0
- package/dist/frontend/lowering/lower-mock.js.map +1 -0
- package/dist/frontend/lowering/lower-modules.d.ts +1 -1
- package/dist/frontend/lowering/lower-modules.js +14 -3
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-namespaces.d.ts +2 -2
- package/dist/frontend/lowering/lower-namespaces.js +2 -2
- package/dist/frontend/lowering/lower-server.d.ts +3 -0
- package/dist/frontend/lowering/lower-server.js +419 -44
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-stdlib.d.ts +7 -1
- package/dist/frontend/lowering/lower-stdlib.js +10 -3
- package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.d.ts +2 -2
- package/dist/frontend/lowering/lower-stmts.js +69 -14
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.d.ts +10 -6
- package/dist/frontend/lowering/lower-stream.js +1020 -49
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lower-test.js +86 -8
- package/dist/frontend/lowering/lower-test.js.map +1 -1
- package/dist/frontend/lowering/lower-timers.js +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +45 -5
- package/dist/frontend/lowering/lowerer.js +317 -48
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/native-ffi.js +2 -2
- package/dist/frontend/lowering/native-ffi.js.map +1 -1
- package/dist/frontend/lowering/pairs-snapshot.d.ts +6 -0
- package/dist/frontend/lowering/pairs-snapshot.js +49 -0
- package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-records.d.ts +115 -0
- package/dist/frontend/lowering/runtime-optional-records.js +715 -0
- package/dist/frontend/lowering/runtime-optional-records.js.map +1 -0
- package/dist/frontend/lowering/runtime-optional-records.test.d.ts +1 -0
- package/dist/frontend/lowering/runtime-optional-records.test.js +175 -0
- package/dist/frontend/lowering/runtime-optional-records.test.js.map +1 -0
- package/dist/frontend/lowering/surfaces.d.ts +11 -3
- package/dist/frontend/lowering/surfaces.js +334 -37
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/zlib-constants.d.ts +1 -0
- package/dist/frontend/lowering/zlib-constants.js +181 -0
- package/dist/frontend/lowering/zlib-constants.js.map +1 -0
- package/dist/frontend/mock-shapes.d.ts +10 -0
- package/dist/frontend/mock-shapes.js +76 -0
- package/dist/frontend/mock-shapes.js.map +1 -0
- package/dist/frontend/module-syntax.d.ts +1 -1
- package/dist/frontend/module-syntax.js +1 -1
- package/dist/frontend/npm-static-prune.js +1 -1
- package/dist/frontend/npm-static-prune.js.map +1 -1
- package/dist/frontend/npm-static-rewrite-syntax.js +4 -3
- package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
- package/dist/frontend/pipeline.js +6 -4
- package/dist/frontend/pipeline.js.map +1 -1
- package/dist/frontend/program.d.ts +3 -3
- package/dist/frontend/program.js +25 -18
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/resolve.d.ts +4 -0
- package/dist/frontend/resolve.js +15 -1
- package/dist/frontend/resolve.js.map +1 -1
- package/dist/frontend/ts7/adapter.js +1 -1
- package/dist/frontend/ts7/ast-bytes.d.ts +1 -1
- package/dist/frontend/ts7/ast-bytes.js +1 -1
- package/dist/frontend/ts7/semantic-json.d.ts +1 -1
- package/dist/frontend/ts7/semantic-json.js +1 -1
- package/dist/frontend/ts7/semantic-json.js.map +1 -1
- package/dist/frontend/ts7/world-check.js +1 -1
- package/dist/frontend/tsc-codes.js +3 -2
- package/dist/frontend/tsc-codes.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +21 -1
- package/dist/frontend/type-mapper.js +245 -27
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/index.js +7 -5
- package/dist/index.js.map +1 -1
- package/dist/ir/analysis.d.ts +12 -6
- package/dist/ir/analysis.js +26 -10
- package/dist/ir/analysis.js.map +1 -1
- package/dist/ir/analysis.test.js +15 -3
- package/dist/ir/analysis.test.js.map +1 -1
- package/dist/ir/builtin-effects.js +115 -0
- package/dist/ir/builtin-effects.js.map +1 -1
- package/dist/ir/builtin-signatures.d.ts +1 -1
- package/dist/ir/builtin-signatures.js +438 -46
- package/dist/ir/builtin-signatures.js.map +1 -1
- package/dist/ir/int32-slots.js +1 -0
- package/dist/ir/int32-slots.js.map +1 -1
- package/dist/ir/ir.d.ts +84 -17
- package/dist/ir/ir.js +54 -1
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/runtime-features.d.ts +1 -0
- package/dist/ir/runtime-features.js +111 -7
- package/dist/ir/runtime-features.js.map +1 -1
- package/dist/ir/serialize.js +1 -1
- package/dist/ir/serialize.js.map +1 -1
- package/dist/ir/traverse.js +1 -0
- package/dist/ir/traverse.js.map +1 -1
- package/dist/ir/validate.js +295 -14
- package/dist/ir/validate.js.map +1 -1
- package/dist/ir/validate.test.js +60 -0
- package/dist/ir/validate.test.js.map +1 -1
- package/dist/library/fence-eval.d.ts +1 -1
- package/dist/library/fence-eval.js +5 -4
- package/dist/library/fence-eval.js.map +1 -1
- package/dist/library/ir-policy.js +11 -4
- package/dist/library/ir-policy.js.map +1 -1
- package/dist/library/library-profile.js +13 -13
- package/dist/library/library-profile.js.map +1 -1
- package/dist/library/prepare.js +1 -1
- package/dist/library/prepare.js.map +1 -1
- package/dist/library/sidecar.js +3 -3
- package/dist/library/sidecar.js.map +1 -1
- package/dist/native/cli.js +1 -0
- package/dist/native/cli.js.map +1 -1
- package/dist/native/compiler.js +1 -3
- package/dist/native/compiler.js.map +1 -1
- package/dist/native/prepare.js +4 -2
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/sanitizer.test.js +1 -0
- package/dist/native/sanitizer.test.js.map +1 -1
- package/package.json +20 -20
- 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 (
|
|
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
|
-
|
|
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
|
|
1511
|
-
//
|
|
1512
|
-
//
|
|
1513
|
-
//
|
|
1514
|
-
//
|
|
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, "
|
|
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
|
|
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
|
-
: "
|
|
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,
|
|
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
|
|
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
|
|
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,
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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),
|
|
5177
|
-
// the
|
|
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.
|
|
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
|
|
5278
|
-
//
|
|
5279
|
-
//
|
|
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
|
-
|
|
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.
|
|
5662
|
+
fn: "http.resGetHeaderDyn",
|
|
5292
5663
|
args: [receiver, header],
|
|
5293
|
-
type:
|
|
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
|