@scriptc/compiler 0.2.4 → 0.2.5
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 +915 -215
- package/ambient/scriptc-overrides.d.ts +5 -1
- package/ambient/scriptc.d.ts +22 -2
- package/dist/backend/build-cache.d.ts +4 -0
- package/dist/backend/build-cache.js +16 -2
- package/dist/backend/build-cache.js.map +1 -1
- package/dist/backend/cycle-analysis.js +17 -5
- package/dist/backend/cycle-analysis.js.map +1 -1
- package/dist/backend/cycle-analysis.test.js +50 -11
- package/dist/backend/cycle-analysis.test.js.map +1 -1
- package/dist/backend/debug-symbols.js.map +1 -1
- package/dist/backend/executable-features.js +2 -1
- package/dist/backend/executable-features.js.map +1 -1
- package/dist/backend/external-c.d.ts +13 -6
- package/dist/backend/external-c.js +15 -3
- package/dist/backend/external-c.js.map +1 -1
- package/dist/backend/ffi-callbacks.js +6 -9
- package/dist/backend/ffi-callbacks.js.map +1 -1
- package/dist/backend/library-identity-markers.js.map +1 -1
- package/dist/backend/library-pack.d.ts +1 -1
- package/dist/backend/library-pack.js +81 -24
- package/dist/backend/library-pack.js.map +1 -1
- package/dist/backend/link-plan-core.js +9 -2
- package/dist/backend/link-plan-core.js.map +1 -1
- package/dist/backend/link-plan.d.ts +1 -1
- package/dist/backend/link-plan.js +4 -5
- package/dist/backend/link-plan.js.map +1 -1
- package/dist/backend/linker.d.ts +1 -1
- package/dist/backend/linker.js +42 -23
- package/dist/backend/linker.js.map +1 -1
- package/dist/backend/literals.js +5 -4
- package/dist/backend/literals.js.map +1 -1
- package/dist/backend/literals.test.js +30 -5
- package/dist/backend/literals.test.js.map +1 -1
- package/dist/backend/llvm/blocks.test.js +5 -2
- package/dist/backend/llvm/blocks.test.js.map +1 -1
- package/dist/backend/llvm/borrowed-inputs.js.map +1 -1
- package/dist/backend/llvm/borrowed-receivers.js +43 -19
- package/dist/backend/llvm/borrowed-receivers.js.map +1 -1
- package/dist/backend/llvm/byte-numbers.js +6 -1
- package/dist/backend/llvm/byte-numbers.js.map +1 -1
- package/dist/backend/llvm/bytes-bounds.js +73 -22
- package/dist/backend/llvm/bytes-bounds.js.map +1 -1
- package/dist/backend/llvm/call-lifetimes.d.ts +3 -0
- package/dist/backend/llvm/call-lifetimes.js +60 -17
- package/dist/backend/llvm/call-lifetimes.js.map +1 -1
- package/dist/backend/llvm/call-lifetimes.test.js +159 -28
- package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/checked-value-lifetimes.d.ts +4 -0
- package/dist/backend/llvm/checked-value-lifetimes.js +14 -4
- package/dist/backend/llvm/checked-value-lifetimes.js.map +1 -1
- package/dist/backend/llvm/classes.js +16 -12
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/common.js +4 -1
- package/dist/backend/llvm/common.js.map +1 -1
- package/dist/backend/llvm/counted-loops.js +10 -3
- package/dist/backend/llvm/counted-loops.js.map +1 -1
- package/dist/backend/llvm/debug-info.js +33 -13
- package/dist/backend/llvm/debug-info.js.map +1 -1
- package/dist/backend/llvm/debug-info.test.js +28 -6
- package/dist/backend/llvm/debug-info.test.js.map +1 -1
- package/dist/backend/llvm/dyn.js +68 -22
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +9 -3
- package/dist/backend/llvm/emitter.js +238 -105
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/emitter.test.js +233 -42
- package/dist/backend/llvm/emitter.test.js.map +1 -1
- package/dist/backend/llvm/expr-async.js +25 -6
- package/dist/backend/llvm/expr-async.js.map +1 -1
- package/dist/backend/llvm/expr-bytes.js +13 -4
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-callbacks.js +10 -4
- package/dist/backend/llvm/expr-callbacks.js.map +1 -1
- package/dist/backend/llvm/expr-calls.js +20 -9
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-containers.d.ts +2 -0
- package/dist/backend/llvm/expr-containers.js +92 -33
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-control.js +1 -3
- package/dist/backend/llvm/expr-control.js.map +1 -1
- package/dist/backend/llvm/expr-dispatch.js +3 -1
- package/dist/backend/llvm/expr-dispatch.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.js +19 -4
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-island.js +26 -6
- package/dist/backend/llvm/expr-island.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +88 -19
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.test.js +43 -1
- package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
- package/dist/backend/llvm/expr-records.js +10 -9
- package/dist/backend/llvm/expr-records.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.js +44 -26
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.test.js +51 -14
- package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -1
- package/dist/backend/llvm/expr-stream-callbacks.js +34 -14
- package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
- package/dist/backend/llvm/integer-values.js +15 -4
- package/dist/backend/llvm/integer-values.js.map +1 -1
- package/dist/backend/llvm/integer-views.js +23 -7
- package/dist/backend/llvm/integer-views.js.map +1 -1
- package/dist/backend/llvm/integer-views.test.js +42 -7
- package/dist/backend/llvm/integer-views.test.js.map +1 -1
- package/dist/backend/llvm/lib-abi.js +13 -4
- package/dist/backend/llvm/lib-abi.js.map +1 -1
- package/dist/backend/llvm/lib-connect.js +7 -1
- package/dist/backend/llvm/lib-connect.js.map +1 -1
- package/dist/backend/llvm/lib-datagram.js +35 -10
- package/dist/backend/llvm/lib-datagram.js.map +1 -1
- package/dist/backend/llvm/lib-dispatch.js +35 -16
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +33 -18
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-http2.js +60 -15
- package/dist/backend/llvm/lib-http2.js.map +1 -1
- package/dist/backend/llvm/lib-lookup.js +12 -5
- package/dist/backend/llvm/lib-lookup.js.map +1 -1
- package/dist/backend/llvm/lib-network.js +97 -31
- package/dist/backend/llvm/lib-network.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +57 -14
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +107 -31
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/lib-stream.js +33 -14
- package/dist/backend/llvm/lib-stream.js.map +1 -1
- package/dist/backend/llvm/lib-test.js +21 -7
- package/dist/backend/llvm/lib-test.js.map +1 -1
- package/dist/backend/llvm/lib-tls.js +69 -20
- package/dist/backend/llvm/lib-tls.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.d.ts +1 -0
- package/dist/backend/llvm/local-array-reads.js +96 -30
- package/dist/backend/llvm/local-array-reads.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.test.js +368 -60
- package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
- package/dist/backend/llvm/local-union-storage.d.ts +25 -0
- package/dist/backend/llvm/local-union-storage.js +109 -0
- package/dist/backend/llvm/local-union-storage.js.map +1 -0
- package/dist/backend/llvm/local-union-storage.test.d.ts +1 -0
- package/dist/backend/llvm/local-union-storage.test.js +210 -0
- package/dist/backend/llvm/local-union-storage.test.js.map +1 -0
- package/dist/backend/llvm/map-read-lifetimes.d.ts +6 -2
- package/dist/backend/llvm/map-read-lifetimes.js +44 -14
- package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
- package/dist/backend/llvm/map-read-lifetimes.test.js +89 -17
- package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/reference-effects.d.ts +3 -2
- package/dist/backend/llvm/reference-effects.js +67 -36
- package/dist/backend/llvm/reference-effects.js.map +1 -1
- package/dist/backend/llvm/reference-effects.test.js +92 -9
- package/dist/backend/llvm/reference-effects.test.js.map +1 -1
- package/dist/backend/llvm/shapes.js +60 -17
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/shapes.test.js +3 -1
- package/dist/backend/llvm/shapes.test.js.map +1 -1
- package/dist/backend/llvm/split.js +4 -4
- package/dist/backend/llvm/split.js.map +1 -1
- package/dist/backend/llvm/split.test.js +14 -6
- package/dist/backend/llvm/split.test.js.map +1 -1
- package/dist/backend/llvm/stack-unions.js +14 -5
- package/dist/backend/llvm/stack-unions.js.map +1 -1
- package/dist/backend/llvm/stack-unions.test.js +151 -32
- package/dist/backend/llvm/stack-unions.test.js.map +1 -1
- package/dist/backend/llvm/string-construction.js.map +1 -1
- package/dist/backend/llvm/string-construction.test.js +32 -7
- package/dist/backend/llvm/string-construction.test.js.map +1 -1
- package/dist/backend/llvm/string-lifetimes.js +14 -8
- package/dist/backend/llvm/string-lifetimes.js.map +1 -1
- package/dist/backend/llvm/string-lifetimes.test.js +112 -26
- package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/switch-dispatch.d.ts +9 -0
- package/dist/backend/llvm/switch-dispatch.js +114 -0
- package/dist/backend/llvm/switch-dispatch.js.map +1 -0
- package/dist/backend/llvm/switch-dispatch.test.d.ts +1 -0
- package/dist/backend/llvm/switch-dispatch.test.js +83 -0
- package/dist/backend/llvm/switch-dispatch.test.js.map +1 -0
- package/dist/backend/llvm/unsupported.js.map +1 -1
- package/dist/backend/llvm/walkers.js +6 -3
- package/dist/backend/llvm/walkers.js.map +1 -1
- package/dist/backend/mangle.js +9 -3
- package/dist/backend/mangle.js.map +1 -1
- package/dist/backend/may-throw.js +18 -8
- package/dist/backend/may-throw.js.map +1 -1
- package/dist/backend/may-throw.test.js +118 -22
- package/dist/backend/may-throw.test.js.map +1 -1
- package/dist/backend/native/artifact-stamps.d.ts +39 -0
- package/dist/backend/native/artifact-stamps.js +371 -0
- package/dist/backend/native/artifact-stamps.js.map +1 -0
- package/dist/backend/native/cache-warm.d.ts +24 -0
- package/dist/backend/native/cache-warm.js +80 -0
- package/dist/backend/native/cache-warm.js.map +1 -0
- package/dist/backend/native/compiler-fingerprint.d.ts +19 -0
- package/dist/backend/native/compiler-fingerprint.js +357 -0
- package/dist/backend/native/compiler-fingerprint.js.map +1 -0
- package/dist/backend/native/contracts.d.ts +314 -0
- package/dist/backend/native/contracts.js +2 -0
- package/dist/backend/native/contracts.js.map +1 -0
- package/dist/backend/native/dependency-files.d.ts +5 -0
- package/dist/backend/native/dependency-files.js +83 -0
- package/dist/backend/native/dependency-files.js.map +1 -0
- package/dist/backend/native/driver.d.ts +50 -0
- package/dist/backend/native/driver.js +294 -0
- package/dist/backend/native/driver.js.map +1 -0
- package/dist/backend/native/executable.d.ts +18 -0
- package/dist/backend/native/executable.js +1267 -0
- package/dist/backend/native/executable.js.map +1 -0
- package/dist/backend/native/library.d.ts +2 -0
- package/dist/backend/native/library.js +614 -0
- package/dist/backend/native/library.js.map +1 -0
- package/dist/backend/native/linker-fingerprint.d.ts +8 -0
- package/dist/backend/native/linker-fingerprint.js +174 -0
- package/dist/backend/native/linker-fingerprint.js.map +1 -0
- package/dist/backend/native/object-merge.d.ts +2 -0
- package/dist/backend/native/object-merge.js +154 -0
- package/dist/backend/native/object-merge.js.map +1 -0
- package/dist/backend/native/process.d.ts +17 -0
- package/dist/backend/native/process.js +42 -0
- package/dist/backend/native/process.js.map +1 -0
- package/dist/backend/native/program-shards.d.ts +21 -0
- package/dist/backend/native/program-shards.js +99 -0
- package/dist/backend/native/program-shards.js.map +1 -0
- package/dist/backend/native/runtime-inputs.d.ts +12 -0
- package/dist/backend/native/runtime-inputs.js +163 -0
- package/dist/backend/native/runtime-inputs.js.map +1 -0
- package/dist/backend/native/runtime-inputs.test.d.ts +1 -0
- package/dist/backend/native/runtime-inputs.test.js +64 -0
- package/dist/backend/native/runtime-inputs.test.js.map +1 -0
- package/dist/backend/native/runtime-objects.d.ts +16 -0
- package/dist/backend/native/runtime-objects.js +122 -0
- package/dist/backend/native/runtime-objects.js.map +1 -0
- package/dist/backend/native/session.d.ts +12 -0
- package/dist/backend/native/session.js +31 -0
- package/dist/backend/native/session.js.map +1 -0
- package/dist/backend/native/tool-identity.d.ts +37 -0
- package/dist/backend/native/tool-identity.js +310 -0
- package/dist/backend/native/tool-identity.js.map +1 -0
- package/dist/backend/native/trace-paths.d.ts +12 -0
- package/dist/backend/native/trace-paths.js +73 -0
- package/dist/backend/native/trace-paths.js.map +1 -0
- package/dist/backend/native/vendor.d.ts +1 -0
- package/dist/backend/native/vendor.js +12 -0
- package/dist/backend/native/vendor.js.map +1 -0
- package/dist/backend/native-codegen-core.js +2 -1
- package/dist/backend/native-codegen-core.js.map +1 -1
- package/dist/backend/native-codegen.d.ts +1 -1
- package/dist/backend/native-codegen.js +24 -13
- package/dist/backend/native-codegen.js.map +1 -1
- package/dist/backend/native-codegen.test.js +12 -9
- package/dist/backend/native-codegen.test.js.map +1 -1
- package/dist/backend/native-link-info-core.js +9 -5
- package/dist/backend/native-link-info-core.js.map +1 -1
- package/dist/backend/native-link-info.js +14 -5
- package/dist/backend/native-link-info.js.map +1 -1
- package/dist/backend/native-link-info.test.js +58 -13
- package/dist/backend/native-link-info.test.js.map +1 -1
- package/dist/backend/native-toolchain.d.ts +17 -450
- package/dist/backend/native-toolchain.js +17 -3971
- package/dist/backend/native-toolchain.js.map +1 -1
- package/dist/backend/native-toolchain.test.js +103 -72
- package/dist/backend/native-toolchain.test.js.map +1 -1
- package/dist/backend/native-tools.js +27 -8
- package/dist/backend/native-tools.js.map +1 -1
- package/dist/backend/object-localize.js +17 -14
- package/dist/backend/object-localize.js.map +1 -1
- package/dist/backend/object-localize.test.js +59 -12
- package/dist/backend/object-localize.test.js.map +1 -1
- package/dist/backend/runtime-pack-core.js +96 -49
- package/dist/backend/runtime-pack-core.js.map +1 -1
- package/dist/backend/runtime-pack-native.js +5 -3
- package/dist/backend/runtime-pack-native.js.map +1 -1
- package/dist/backend/runtime-pack-targets.test.js +87 -15
- package/dist/backend/runtime-pack-targets.test.js.map +1 -1
- package/dist/backend/runtime-pack.d.ts +1 -1
- package/dist/backend/runtime-pack.js +11 -12
- package/dist/backend/runtime-pack.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +40 -24
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/backend/source-locations.js.map +1 -1
- package/dist/backend/source-locations.test.js +7 -2
- package/dist/backend/source-locations.test.js.map +1 -1
- package/dist/backend/target-diagnostics.js +44 -14
- package/dist/backend/target-diagnostics.js.map +1 -1
- package/dist/backend/target-diagnostics.test.js +93 -20
- package/dist/backend/target-diagnostics.test.js.map +1 -1
- package/dist/backend/targets.js +230 -86
- package/dist/backend/targets.js.map +1 -1
- package/dist/backend/targets.test.js +32 -18
- package/dist/backend/targets.test.js.map +1 -1
- package/dist/backend/toolchain-environment.js +5 -1
- package/dist/backend/toolchain-environment.js.map +1 -1
- package/dist/backend/vendor-archives.d.ts +2 -2
- package/dist/backend/vendor-archives.js +84 -35
- package/dist/backend/vendor-archives.js.map +1 -1
- package/dist/backend/vendor-inputs.js +13 -1
- package/dist/backend/vendor-inputs.js.map +1 -1
- package/dist/backend/warm-cache.d.ts +1 -1
- package/dist/backend/warm-cache.js +33 -9
- package/dist/backend/warm-cache.js.map +1 -1
- package/dist/cli/command.js +39 -9
- package/dist/cli/command.js.map +1 -1
- package/dist/cli/output-options.js +14 -4
- package/dist/cli/output-options.js.map +1 -1
- package/dist/cli/paths.js.map +1 -1
- package/dist/cli/wasi-runner.js.map +1 -1
- package/dist/compat/fetch-profile.js +36 -35
- package/dist/compat/fetch-profile.js.map +1 -1
- package/dist/coverage/report.js +16 -17
- package/dist/coverage/report.js.map +1 -1
- package/dist/coverage/surface-manifest.js +112 -26
- package/dist/coverage/surface-manifest.js.map +1 -1
- package/dist/diagnostics/diagnostic.js +55 -16
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +1 -1
- package/dist/executable/executable-cache.js +78 -48
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +75 -26
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/executable/prepare.js +2 -2
- package/dist/executable/prepare.js.map +1 -1
- package/dist/ffi/ffi-manifest.js +78 -20
- package/dist/ffi/ffi-manifest.js.map +1 -1
- package/dist/ffi/ffi-manifest.test.js +96 -16
- package/dist/ffi/ffi-manifest.test.js.map +1 -1
- package/dist/format-integer.js.map +1 -1
- package/dist/frontend/analysis.js +12 -2
- package/dist/frontend/analysis.js.map +1 -1
- package/dist/frontend/arguments-usage.js.map +1 -1
- package/dist/frontend/binding-source.js +9 -3
- package/dist/frontend/binding-source.js.map +1 -1
- package/dist/frontend/builtin-modules.js +46 -2
- package/dist/frontend/builtin-modules.js.map +1 -1
- package/dist/frontend/cjs-resolve.js +40 -17
- package/dist/frontend/cjs-resolve.js.map +1 -1
- package/dist/frontend/cjs-syntax.js +31 -10
- package/dist/frontend/cjs-syntax.js.map +1 -1
- package/dist/frontend/comptime-node.test.js +10 -11
- package/dist/frontend/comptime-node.test.js.map +1 -1
- package/dist/frontend/dts-paths.js +7 -3
- package/dist/frontend/dts-paths.js.map +1 -1
- package/dist/frontend/fork-target.js +17 -12
- package/dist/frontend/fork-target.js.map +1 -1
- package/dist/frontend/function-completion.js +11 -6
- package/dist/frontend/function-completion.js.map +1 -1
- package/dist/frontend/helper-tokens.js +53 -6
- package/dist/frontend/helper-tokens.js.map +1 -1
- package/dist/frontend/helper-tokens.test.js +18 -2
- package/dist/frontend/helper-tokens.test.js.map +1 -1
- package/dist/frontend/inferred-js-diagnostics.js +32 -12
- package/dist/frontend/inferred-js-diagnostics.js.map +1 -1
- package/dist/frontend/inferred-js-diagnostics.test.js +11 -15
- package/dist/frontend/inferred-js-diagnostics.test.js.map +1 -1
- package/dist/frontend/input-tracker.js +11 -11
- package/dist/frontend/input-tracker.js.map +1 -1
- package/dist/frontend/input-tracker.test.js +4 -1
- package/dist/frontend/input-tracker.test.js.map +1 -1
- package/dist/frontend/lib-contract.js +38 -9
- package/dist/frontend/lib-contract.js.map +1 -1
- package/dist/frontend/literal-values.js.map +1 -1
- package/dist/frontend/literal-values.test.js +28 -8
- package/dist/frontend/literal-values.test.js.map +1 -1
- package/dist/frontend/lowering/abstract-equality.js +53 -10
- package/dist/frontend/lowering/abstract-equality.js.map +1 -1
- package/dist/frontend/lowering/array-indexed-mutation.d.ts +1 -1
- package/dist/frontend/lowering/array-indexed-mutation.js +108 -106
- package/dist/frontend/lowering/array-indexed-mutation.js.map +1 -1
- package/dist/frontend/lowering/array-values.js +37 -14
- package/dist/frontend/lowering/array-values.js.map +1 -1
- package/dist/frontend/lowering/binding-analysis.d.ts +50 -0
- package/dist/frontend/lowering/binding-analysis.js +376 -0
- package/dist/frontend/lowering/binding-analysis.js.map +1 -0
- package/dist/frontend/lowering/builtin-calls.d.ts +9 -0
- package/dist/frontend/lowering/builtin-calls.js +60 -0
- package/dist/frontend/lowering/builtin-calls.js.map +1 -0
- package/dist/frontend/lowering/builtins/arguments.d.ts +43 -0
- package/dist/frontend/lowering/builtins/arguments.js +247 -0
- package/dist/frontend/lowering/builtins/arguments.js.map +1 -0
- package/dist/frontend/lowering/builtins/async-context.d.ts +52 -0
- package/dist/frontend/lowering/builtins/async-context.js +436 -0
- package/dist/frontend/lowering/builtins/async-context.js.map +1 -0
- package/dist/frontend/lowering/builtins/atomics.d.ts +15 -0
- package/dist/frontend/lowering/builtins/atomics.js +46 -0
- package/dist/frontend/lowering/builtins/atomics.js.map +1 -0
- package/dist/frontend/lowering/builtins/callable-aliases.d.ts +13 -0
- package/dist/frontend/lowering/builtins/callable-aliases.js +87 -0
- package/dist/frontend/lowering/builtins/callable-aliases.js.map +1 -0
- package/dist/frontend/lowering/builtins/child-process-async.d.ts +18 -0
- package/dist/frontend/lowering/builtins/child-process-async.js +245 -0
- package/dist/frontend/lowering/builtins/child-process-async.js.map +1 -0
- package/dist/frontend/lowering/builtins/child-process-methods.d.ts +21 -0
- package/dist/frontend/lowering/builtins/child-process-methods.js +362 -0
- package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -0
- package/dist/frontend/lowering/builtins/child-process-sync.d.ts +4 -0
- package/dist/frontend/lowering/builtins/child-process-sync.js +639 -0
- package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -0
- package/dist/frontend/lowering/builtins/child-process.d.ts +55 -0
- package/dist/frontend/lowering/builtins/child-process.js +669 -0
- package/dist/frontend/lowering/builtins/child-process.js.map +1 -0
- package/dist/frontend/lowering/builtins/compression.d.ts +7 -0
- package/dist/frontend/lowering/builtins/compression.js +115 -0
- package/dist/frontend/lowering/builtins/compression.js.map +1 -0
- package/dist/frontend/lowering/builtins/console.d.ts +10 -0
- package/dist/frontend/lowering/builtins/console.js +38 -0
- package/dist/frontend/lowering/builtins/console.js.map +1 -0
- package/dist/frontend/lowering/builtins/constants.d.ts +24 -0
- package/dist/frontend/lowering/builtins/constants.js +141 -0
- package/dist/frontend/lowering/builtins/constants.js.map +1 -0
- package/dist/frontend/lowering/builtins/crypto.d.ts +22 -0
- package/dist/frontend/lowering/builtins/crypto.js +517 -0
- package/dist/frontend/lowering/builtins/crypto.js.map +1 -0
- package/dist/frontend/lowering/builtins/dates.d.ts +7 -0
- package/dist/frontend/lowering/builtins/dates.js +101 -0
- package/dist/frontend/lowering/builtins/dates.js.map +1 -0
- package/dist/frontend/lowering/builtins/environment.d.ts +34 -0
- package/dist/frontend/lowering/builtins/environment.js +95 -0
- package/dist/frontend/lowering/builtins/environment.js.map +1 -0
- package/dist/frontend/lowering/builtins/errors.d.ts +14 -0
- package/dist/frontend/lowering/builtins/errors.js +83 -0
- package/dist/frontend/lowering/builtins/errors.js.map +1 -0
- package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +32 -0
- package/dist/frontend/lowering/builtins/filesystem-calls.js +678 -0
- package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -0
- package/dist/frontend/lowering/builtins/filesystem.d.ts +108 -0
- package/dist/frontend/lowering/builtins/filesystem.js +1061 -0
- package/dist/frontend/lowering/builtins/filesystem.js.map +1 -0
- package/dist/frontend/lowering/builtins/ipc.d.ts +8 -0
- package/dist/frontend/lowering/builtins/ipc.js +76 -0
- package/dist/frontend/lowering/builtins/ipc.js.map +1 -0
- package/dist/frontend/lowering/builtins/json.d.ts +12 -0
- package/dist/frontend/lowering/builtins/json.js +387 -0
- package/dist/frontend/lowering/builtins/json.js.map +1 -0
- package/dist/frontend/lowering/builtins/module-bindings.d.ts +85 -0
- package/dist/frontend/lowering/builtins/module-bindings.js +346 -0
- package/dist/frontend/lowering/builtins/module-bindings.js.map +1 -0
- package/dist/frontend/lowering/builtins/module-calls.d.ts +8 -0
- package/dist/frontend/lowering/builtins/module-calls.js +303 -0
- package/dist/frontend/lowering/builtins/module-calls.js.map +1 -0
- package/dist/frontend/lowering/builtins/module-resolution.d.ts +38 -0
- package/dist/frontend/lowering/builtins/module-resolution.js +344 -0
- package/dist/frontend/lowering/builtins/module-resolution.js.map +1 -0
- package/dist/frontend/lowering/builtins/numbers.d.ts +15 -0
- package/dist/frontend/lowering/builtins/numbers.js +124 -0
- package/dist/frontend/lowering/builtins/numbers.js.map +1 -0
- package/dist/frontend/lowering/builtins/operating-system.d.ts +13 -0
- package/dist/frontend/lowering/builtins/operating-system.js +148 -0
- package/dist/frontend/lowering/builtins/operating-system.js.map +1 -0
- package/dist/frontend/lowering/builtins/performance.d.ts +13 -0
- package/dist/frontend/lowering/builtins/performance.js +100 -0
- package/dist/frontend/lowering/builtins/performance.js.map +1 -0
- package/dist/frontend/lowering/builtins/process.d.ts +50 -0
- package/dist/frontend/lowering/builtins/process.js +1138 -0
- package/dist/frontend/lowering/builtins/process.js.map +1 -0
- package/dist/frontend/lowering/builtins/promises.d.ts +14 -0
- package/dist/frontend/lowering/builtins/promises.js +356 -0
- package/dist/frontend/lowering/builtins/promises.js.map +1 -0
- package/dist/frontend/lowering/builtins/properties.d.ts +11 -0
- package/dist/frontend/lowering/builtins/properties.js +186 -0
- package/dist/frontend/lowering/builtins/properties.js.map +1 -0
- package/dist/frontend/lowering/builtins/querystring.d.ts +19 -0
- package/dist/frontend/lowering/builtins/querystring.js +150 -0
- package/dist/frontend/lowering/builtins/querystring.js.map +1 -0
- package/dist/frontend/lowering/builtins/readline.d.ts +13 -0
- package/dist/frontend/lowering/builtins/readline.js +138 -0
- package/dist/frontend/lowering/builtins/readline.js.map +1 -0
- package/dist/frontend/lowering/builtins/receiver-types.d.ts +5 -0
- package/dist/frontend/lowering/builtins/receiver-types.js +15 -0
- package/dist/frontend/lowering/builtins/receiver-types.js.map +1 -0
- package/dist/frontend/lowering/builtins/reflection.d.ts +13 -0
- package/dist/frontend/lowering/builtins/reflection.js +95 -0
- package/dist/frontend/lowering/builtins/reflection.js.map +1 -0
- package/dist/frontend/lowering/builtins/strings.d.ts +14 -0
- package/dist/frontend/lowering/builtins/strings.js +121 -0
- package/dist/frontend/lowering/builtins/strings.js.map +1 -0
- package/dist/frontend/lowering/builtins/text-codecs.d.ts +29 -0
- package/dist/frontend/lowering/builtins/text-codecs.js +590 -0
- package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -0
- package/dist/frontend/lowering/builtins/timers.d.ts +22 -0
- package/dist/frontend/lowering/builtins/timers.js +180 -0
- package/dist/frontend/lowering/builtins/timers.js.map +1 -0
- package/dist/frontend/lowering/builtins/url.d.ts +37 -0
- package/dist/frontend/lowering/builtins/url.js +596 -0
- package/dist/frontend/lowering/builtins/url.js.map +1 -0
- package/dist/frontend/lowering/builtins/util-types.d.ts +7 -0
- package/dist/frontend/lowering/builtins/util-types.js +31 -0
- package/dist/frontend/lowering/builtins/util-types.js.map +1 -0
- package/dist/frontend/lowering/call-arguments.d.ts +72 -0
- package/dist/frontend/lowering/call-arguments.js +618 -0
- package/dist/frontend/lowering/call-arguments.js.map +1 -0
- package/dist/frontend/lowering/call-signatures.d.ts +115 -0
- package/dist/frontend/lowering/call-signatures.js +719 -0
- package/dist/frontend/lowering/call-signatures.js.map +1 -0
- package/dist/frontend/lowering/callback-arg.js.map +1 -1
- package/dist/frontend/lowering/checked-iterable-spread.js +53 -10
- package/dist/frontend/lowering/checked-iterable-spread.js.map +1 -1
- package/dist/frontend/lowering/checked-promise-all.js +41 -9
- package/dist/frontend/lowering/checked-promise-all.js.map +1 -1
- package/dist/frontend/lowering/class-callbacks.d.ts +1 -1
- package/dist/frontend/lowering/class-callbacks.js +130 -27
- package/dist/frontend/lowering/class-callbacks.js.map +1 -1
- package/dist/frontend/lowering/class-construction.d.ts +1 -1
- package/dist/frontend/lowering/class-construction.js +247 -50
- package/dist/frontend/lowering/class-construction.js.map +1 -1
- package/dist/frontend/lowering/class-descriptors.js +109 -29
- package/dist/frontend/lowering/class-descriptors.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +6 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.js +2471 -465
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js +284 -44
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
- package/dist/frontend/lowering/class-instance-constructor.js +17 -5
- package/dist/frontend/lowering/class-instance-constructor.js.map +1 -1
- package/dist/frontend/lowering/class-method-values.js +199 -51
- package/dist/frontend/lowering/class-method-values.js.map +1 -1
- package/dist/frontend/lowering/class-prototypes.js +345 -86
- package/dist/frontend/lowering/class-prototypes.js.map +1 -1
- package/dist/frontend/lowering/class-runtime-statics.d.ts +1 -1
- package/dist/frontend/lowering/class-runtime-statics.js +80 -17
- package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
- package/dist/frontend/lowering/class-static-data.js +76 -16
- package/dist/frontend/lowering/class-static-data.js.map +1 -1
- package/dist/frontend/lowering/coercions/builders.d.ts +13 -0
- package/dist/frontend/lowering/coercions/builders.js +77 -0
- package/dist/frontend/lowering/coercions/builders.js.map +1 -0
- package/dist/frontend/lowering/coercions/function-adapters.d.ts +58 -0
- package/dist/frontend/lowering/coercions/function-adapters.js +430 -0
- package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -0
- package/dist/frontend/lowering/coercions/island.d.ts +37 -0
- package/dist/frontend/lowering/coercions/island.js +350 -0
- package/dist/frontend/lowering/coercions/island.js.map +1 -0
- package/dist/frontend/lowering/coercions/state.d.ts +14 -0
- package/dist/frontend/lowering/coercions/state.js +16 -0
- package/dist/frontend/lowering/coercions/state.js.map +1 -0
- package/dist/frontend/lowering/coercions/structural-plans.d.ts +40 -0
- package/dist/frontend/lowering/coercions/structural-plans.js +447 -0
- package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -0
- package/dist/frontend/lowering/coercions/structural.d.ts +63 -0
- package/dist/frontend/lowering/coercions/structural.js +616 -0
- package/dist/frontend/lowering/coercions/structural.js.map +1 -0
- package/dist/frontend/lowering/coercions/unions.d.ts +65 -0
- package/dist/frontend/lowering/coercions/unions.js +318 -0
- package/dist/frontend/lowering/coercions/unions.js.map +1 -0
- package/dist/frontend/lowering/collection-ingestion.js +355 -72
- package/dist/frontend/lowering/collection-ingestion.js.map +1 -1
- package/dist/frontend/lowering/containers/array-callbacks.d.ts +92 -0
- package/dist/frontend/lowering/containers/array-callbacks.js +1646 -0
- package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -0
- package/dist/frontend/lowering/containers/array-construction.d.ts +42 -0
- package/dist/frontend/lowering/containers/array-construction.js +1044 -0
- package/dist/frontend/lowering/containers/array-construction.js.map +1 -0
- package/dist/frontend/lowering/containers/array-iteration.d.ts +16 -0
- package/dist/frontend/lowering/containers/array-iteration.js +95 -0
- package/dist/frontend/lowering/containers/array-iteration.js.map +1 -0
- package/dist/frontend/lowering/containers/array-methods.d.ts +27 -0
- package/dist/frontend/lowering/containers/array-methods.js +1854 -0
- package/dist/frontend/lowering/containers/array-methods.js.map +1 -0
- package/dist/frontend/lowering/containers/bytes.d.ts +17 -17
- package/dist/frontend/lowering/containers/bytes.js +419 -105
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/containers/callback-arguments.d.ts +26 -0
- package/dist/frontend/lowering/containers/callback-arguments.js +179 -0
- package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -0
- package/dist/frontend/lowering/containers/collection-grouping.d.ts +19 -0
- package/dist/frontend/lowering/containers/collection-grouping.js +297 -0
- package/dist/frontend/lowering/containers/collection-grouping.js.map +1 -0
- package/dist/frontend/lowering/containers/collection-methods.d.ts +57 -0
- package/dist/frontend/lowering/containers/collection-methods.js +1314 -0
- package/dist/frontend/lowering/containers/collection-methods.js.map +1 -0
- package/dist/frontend/lowering/containers/dynamic-receivers.d.ts +18 -0
- package/dist/frontend/lowering/containers/dynamic-receivers.js +114 -0
- package/dist/frontend/lowering/containers/dynamic-receivers.js.map +1 -0
- package/dist/frontend/lowering/containers/for-of.d.ts +60 -0
- package/dist/frontend/lowering/containers/for-of.js +643 -0
- package/dist/frontend/lowering/containers/for-of.js.map +1 -0
- package/dist/frontend/lowering/containers/indexed-objects.d.ts +132 -0
- package/dist/frontend/lowering/containers/indexed-objects.js +1743 -0
- package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -0
- package/dist/frontend/lowering/containers/iterator-helpers.d.ts +20 -0
- package/dist/frontend/lowering/containers/iterator-helpers.js +809 -0
- package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -0
- package/dist/frontend/lowering/containers/string-and-regexp.js +580 -158
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/containers/string-replacement.js +213 -63
- package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
- package/dist/frontend/lowering/crypto-tables.js +263 -64
- package/dist/frontend/lowering/crypto-tables.js.map +1 -1
- package/dist/frontend/lowering/deferred-module-initializers.js +172 -68
- package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
- package/dist/frontend/lowering/deferred-module-initializers.test.js +41 -8
- package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -1
- package/dist/frontend/lowering/error-methods.js +339 -65
- package/dist/frontend/lowering/error-methods.js.map +1 -1
- package/dist/frontend/lowering/expressions/evaluation-safety.js +3 -2
- package/dist/frontend/lowering/expressions/evaluation-safety.js.map +1 -1
- package/dist/frontend/lowering/expressions/global-symbols.js +2 -1
- package/dist/frontend/lowering/expressions/global-symbols.js.map +1 -1
- package/dist/frontend/lowering/expressions/native-proxy.js +11 -5
- package/dist/frontend/lowering/expressions/native-proxy.js.map +1 -1
- package/dist/frontend/lowering/expressions/nullish-assignment.js +67 -13
- package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
- package/dist/frontend/lowering/expressions/object-literals.js +589 -162
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/optional-chains.d.ts +1 -1
- package/dist/frontend/lowering/expressions/optional-chains.js +68 -17
- package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
- package/dist/frontend/lowering/expressions/union-field-write.js +45 -18
- package/dist/frontend/lowering/expressions/union-field-write.js.map +1 -1
- package/dist/frontend/lowering/function-context.js +5 -1
- package/dist/frontend/lowering/function-context.js.map +1 -1
- package/dist/frontend/lowering/function-returns.d.ts +67 -0
- package/dist/frontend/lowering/function-returns.js +392 -0
- package/dist/frontend/lowering/function-returns.js.map +1 -0
- package/dist/frontend/lowering/generator-delegation.d.ts +1 -1
- package/dist/frontend/lowering/generator-delegation.js +171 -39
- package/dist/frontend/lowering/generator-delegation.js.map +1 -1
- package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +1 -1
- package/dist/frontend/lowering/generator-dynamic-dispatch.js +176 -36
- package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/generic-functions.d.ts +274 -0
- package/dist/frontend/lowering/generic-functions.js +1727 -0
- package/dist/frontend/lowering/generic-functions.js.map +1 -0
- package/dist/frontend/lowering/import-meta.d.ts +1 -1
- package/dist/frontend/lowering/import-meta.js +37 -14
- package/dist/frontend/lowering/import-meta.js.map +1 -1
- package/dist/frontend/lowering/indexed-comparison.js +6 -2
- package/dist/frontend/lowering/indexed-comparison.js.map +1 -1
- package/dist/frontend/lowering/iterator-consumption.d.ts +9 -0
- package/dist/frontend/lowering/iterator-consumption.js +91 -0
- package/dist/frontend/lowering/iterator-consumption.js.map +1 -0
- package/dist/frontend/lowering/lib-boundary.js +40 -17
- package/dist/frontend/lowering/lib-boundary.js.map +1 -1
- package/dist/frontend/lowering/lib-boundary.test.js +49 -11
- package/dist/frontend/lowering/lib-boundary.test.js.map +1 -1
- package/dist/frontend/lowering/lower-array-sort.d.ts +0 -19
- package/dist/frontend/lowering/lower-array-sort.js +331 -566
- package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
- package/dist/frontend/lowering/lower-assert.js +248 -43
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-async-iteration.js +71 -16
- package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
- package/dist/frontend/lowering/lower-builtin-values.js +420 -71
- package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +39 -558
- package/dist/frontend/lowering/lower-calls.js +2593 -5667
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +243 -242
- package/dist/frontend/lowering/lower-classes.js +1701 -724
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-comptime.d.ts +35 -35
- package/dist/frontend/lowering/lower-comptime.js +39 -37
- package/dist/frontend/lowering/lower-comptime.js.map +1 -1
- package/dist/frontend/lowering/lower-dgram.js +59 -31
- package/dist/frontend/lowering/lower-dgram.js.map +1 -1
- package/dist/frontend/lowering/lower-enums.js +5 -2
- package/dist/frontend/lowering/lower-enums.js.map +1 -1
- package/dist/frontend/lowering/lower-event-emitter.js +322 -85
- package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
- package/dist/frontend/lowering/lower-expando.js +19 -7
- package/dist/frontend/lowering/lower-expando.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +194 -194
- package/dist/frontend/lowering/lower-exprs.js +3446 -1154
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-functions.d.ts +23 -0
- package/dist/frontend/lowering/lower-functions.js +449 -0
- package/dist/frontend/lowering/lower-functions.js.map +1 -0
- package/dist/frontend/lowering/lower-generators.js +121 -32
- package/dist/frontend/lowering/lower-generators.js.map +1 -1
- package/dist/frontend/lowering/lower-global-value.js +15 -4
- package/dist/frontend/lowering/lower-global-value.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.js +479 -89
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-island.d.ts +79 -79
- package/dist/frontend/lowering/lower-island.js +365 -273
- package/dist/frontend/lowering/lower-island.js.map +1 -1
- package/dist/frontend/lowering/lower-island.test.js +7 -2
- package/dist/frontend/lowering/lower-island.test.js.map +1 -1
- package/dist/frontend/lowering/lower-mixins.js +17 -8
- package/dist/frontend/lowering/lower-mixins.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.d.ts +94 -94
- package/dist/frontend/lowering/lower-modules.js +612 -321
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.test.js +91 -20
- package/dist/frontend/lowering/lower-modules.test.js.map +1 -1
- package/dist/frontend/lowering/lower-namespaces.js +25 -8
- package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
- package/dist/frontend/lowering/lower-node-module.js +115 -34
- package/dist/frontend/lowering/lower-node-module.js.map +1 -1
- package/dist/frontend/lowering/lower-server.js +1210 -290
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.d.ts +148 -148
- package/dist/frontend/lowering/lower-stmts.js +2312 -984
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.test.js +13 -5
- package/dist/frontend/lowering/lower-stmts.test.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.js +362 -90
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lower-system-errors.js +30 -8
- package/dist/frontend/lowering/lower-system-errors.js.map +1 -1
- package/dist/frontend/lowering/lower-test.js +40 -13
- package/dist/frontend/lowering/lower-test.js.map +1 -1
- package/dist/frontend/lowering/lower-timers.d.ts +31 -0
- package/dist/frontend/lowering/lower-timers.js +336 -0
- package/dist/frontend/lowering/lower-timers.js.map +1 -0
- package/dist/frontend/lowering/lower-url.d.ts +1 -1
- package/dist/frontend/lowering/lower-url.js +46 -13
- package/dist/frontend/lowering/lower-url.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +21 -351
- package/dist/frontend/lowering/lowerer.js +1024 -2704
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/lowerer.test.js +85 -17
- package/dist/frontend/lowering/lowerer.test.js.map +1 -1
- package/dist/frontend/lowering/module-namespace-elements.js +43 -8
- package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
- package/dist/frontend/lowering/native-ffi.d.ts +21 -1
- package/dist/frontend/lowering/native-ffi.js +487 -18
- package/dist/frontend/lowering/native-ffi.js.map +1 -1
- package/dist/frontend/lowering/object-enumeration-receiver.js +55 -10
- package/dist/frontend/lowering/object-enumeration-receiver.js.map +1 -1
- package/dist/frontend/lowering/object-factory-new.d.ts +1 -1
- package/dist/frontend/lowering/object-factory-new.js +36 -11
- package/dist/frontend/lowering/object-factory-new.js.map +1 -1
- package/dist/frontend/lowering/optional-arguments.js +49 -20
- package/dist/frontend/lowering/optional-arguments.js.map +1 -1
- package/dist/frontend/lowering/pairs-snapshot.js +66 -14
- package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-locals.js +3 -1
- package/dist/frontend/lowering/runtime-optional-locals.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-locals.test.js.map +1 -1
- package/dist/frontend/lowering/sanitize-class-types.js +4 -1
- package/dist/frontend/lowering/sanitize-class-types.js.map +1 -1
- package/dist/frontend/lowering/sanitize-class-types.test.js +86 -18
- package/dist/frontend/lowering/sanitize-class-types.test.js.map +1 -1
- package/dist/frontend/lowering/static-this.js +13 -6
- package/dist/frontend/lowering/static-this.js.map +1 -1
- package/dist/frontend/lowering/string-index.js +32 -10
- package/dist/frontend/lowering/string-index.js.map +1 -1
- package/dist/frontend/lowering/surfaces.d.ts +42 -42
- package/dist/frontend/lowering/surfaces.js +1094 -249
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/symbol-fields.js +40 -15
- package/dist/frontend/lowering/symbol-fields.js.map +1 -1
- package/dist/frontend/lowering/symbol-methods.js.map +1 -1
- package/dist/frontend/lowering/text-decoder-encoding.js +236 -24
- package/dist/frontend/lowering/text-decoder-encoding.js.map +1 -1
- package/dist/frontend/lowering/text-decoder-encoding.test.js +84 -12
- package/dist/frontend/lowering/text-decoder-encoding.test.js.map +1 -1
- package/dist/frontend/lowering/union-narrow.js +59 -16
- package/dist/frontend/lowering/union-narrow.js.map +1 -1
- package/dist/frontend/lowering/union-narrow.test.js +24 -7
- package/dist/frontend/lowering/union-narrow.test.js.map +1 -1
- package/dist/frontend/lowering/union-retag.js +155 -40
- package/dist/frontend/lowering/union-retag.js.map +1 -1
- package/dist/frontend/lowering/union-retag.test.js +131 -33
- package/dist/frontend/lowering/union-retag.test.js.map +1 -1
- package/dist/frontend/lowering/unregistered-class-types.js.map +1 -1
- package/dist/frontend/lowering/unregistered-class-types.test.js +34 -8
- package/dist/frontend/lowering/unregistered-class-types.test.js.map +1 -1
- package/dist/frontend/module-syntax.js +21 -8
- package/dist/frontend/module-syntax.js.map +1 -1
- package/dist/frontend/module-syntax.test.js +37 -13
- package/dist/frontend/module-syntax.test.js.map +1 -1
- package/dist/frontend/npm-fetch-analysis.js +13 -4
- package/dist/frontend/npm-fetch-analysis.js.map +1 -1
- package/dist/frontend/npm-fetch-analysis.test.js +33 -10
- package/dist/frontend/npm-fetch-analysis.test.js.map +1 -1
- package/dist/frontend/npm-fetch-node.js.map +1 -1
- package/dist/frontend/npm-fetch-syntax.js +4 -9
- package/dist/frontend/npm-fetch-syntax.js.map +1 -1
- package/dist/frontend/npm-node.js +3 -1
- package/dist/frontend/npm-node.js.map +1 -1
- package/dist/frontend/npm-static-bundled-cjs.js +88 -29
- package/dist/frontend/npm-static-bundled-cjs.js.map +1 -1
- package/dist/frontend/npm-static-bundled-cjs.test.js +29 -10
- package/dist/frontend/npm-static-bundled-cjs.test.js.map +1 -1
- package/dist/frontend/npm-static-declaration-syntax.js +148 -56
- package/dist/frontend/npm-static-declaration-syntax.js.map +1 -1
- package/dist/frontend/npm-static-declarations.d.ts +1 -1
- package/dist/frontend/npm-static-declarations.js.map +1 -1
- package/dist/frontend/npm-static-declarations.test.js +33 -7
- package/dist/frontend/npm-static-declarations.test.js.map +1 -1
- package/dist/frontend/npm-static-prune.js +26 -12
- package/dist/frontend/npm-static-prune.js.map +1 -1
- package/dist/frontend/npm-static-prune.test.js +17 -3
- package/dist/frontend/npm-static-prune.test.js.map +1 -1
- package/dist/frontend/npm-static-rewrite-host.js +2 -3
- package/dist/frontend/npm-static-rewrite-host.js.map +1 -1
- package/dist/frontend/npm-static-rewrite-syntax.js +64 -21
- package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
- package/dist/frontend/npm-static-rewrite.js.map +1 -1
- package/dist/frontend/npm-static-subtyping.js +9 -4
- package/dist/frontend/npm-static-subtyping.js.map +1 -1
- package/dist/frontend/npm-static-subtyping.test.js +30 -6
- package/dist/frontend/npm-static-subtyping.test.js.map +1 -1
- package/dist/frontend/npm-static.js +15 -4
- package/dist/frontend/npm-static.js.map +1 -1
- package/dist/frontend/npm.js +122 -36
- package/dist/frontend/npm.js.map +1 -1
- package/dist/frontend/npm.test.js +30 -10
- package/dist/frontend/npm.test.js.map +1 -1
- package/dist/frontend/pipeline-native.js.map +1 -1
- package/dist/frontend/pipeline.js +25 -8
- package/dist/frontend/pipeline.js.map +1 -1
- package/dist/frontend/pipeline.test.js +21 -7
- package/dist/frontend/pipeline.test.js.map +1 -1
- package/dist/frontend/program-node.js +5 -3
- package/dist/frontend/program-node.js.map +1 -1
- package/dist/frontend/program.d.ts +2 -2
- package/dist/frontend/program.js +234 -101
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/program.test.js +27 -27
- package/dist/frontend/program.test.js.map +1 -1
- package/dist/frontend/provenance-core.js +8 -4
- package/dist/frontend/provenance-core.js.map +1 -1
- package/dist/frontend/provenance-registry.js +1 -4
- package/dist/frontend/provenance-registry.js.map +1 -1
- package/dist/frontend/resolve.js +32 -20
- package/dist/frontend/resolve.js.map +1 -1
- package/dist/frontend/resolve.test.js +1 -1
- package/dist/frontend/resolve.test.js.map +1 -1
- package/dist/frontend/runtime-resolve.js +13 -4
- package/dist/frontend/runtime-resolve.js.map +1 -1
- package/dist/frontend/runtime-resolve.test.js +25 -9
- package/dist/frontend/runtime-resolve.test.js.map +1 -1
- package/dist/frontend/services-node.js +6 -2
- package/dist/frontend/services-node.js.map +1 -1
- package/dist/frontend/services-node.test.js +18 -6
- package/dist/frontend/services-node.test.js.map +1 -1
- package/dist/frontend/services.js +8 -4
- package/dist/frontend/services.js.map +1 -1
- package/dist/frontend/services.test.js +6 -2
- package/dist/frontend/services.test.js.map +1 -1
- package/dist/frontend/ts7/api.js +12 -4
- package/dist/frontend/ts7/api.js.map +1 -1
- package/dist/frontend/ts7/ast-bytes.js +10 -3
- package/dist/frontend/ts7/ast-bytes.js.map +1 -1
- package/dist/frontend/ts7/ast-bytes.test.js +23 -4
- package/dist/frontend/ts7/ast-bytes.test.js.map +1 -1
- package/dist/frontend/ts7/ast-guards.test.js +14 -5
- package/dist/frontend/ts7/ast-guards.test.js.map +1 -1
- package/dist/frontend/ts7/ast-node.d.ts +6 -1
- package/dist/frontend/ts7/ast-node.js +484 -164
- package/dist/frontend/ts7/ast-node.js.map +1 -1
- package/dist/frontend/ts7/ast-node.test.js +109 -36
- package/dist/frontend/ts7/ast-node.test.js.map +1 -1
- package/dist/frontend/ts7/ast-text.js +13 -3
- package/dist/frontend/ts7/ast-text.js.map +1 -1
- package/dist/frontend/ts7/ast-text.test.js.map +1 -1
- package/dist/frontend/ts7/ast-types.js.map +1 -1
- package/dist/frontend/ts7/ast-wire.d.ts +1 -1
- package/dist/frontend/ts7/ast-wire.js +55 -20
- package/dist/frontend/ts7/ast-wire.js.map +1 -1
- package/dist/frontend/ts7/ast-wire.test.js +53 -8
- package/dist/frontend/ts7/ast-wire.test.js.map +1 -1
- package/dist/frontend/ts7/ast.js +47 -28
- package/dist/frontend/ts7/ast.js.map +1 -1
- package/dist/frontend/ts7/census-check.js +1 -1
- package/dist/frontend/ts7/census-check.js.map +1 -1
- package/dist/frontend/ts7/checker-cache.js.map +1 -1
- package/dist/frontend/ts7/checker.js +5 -3
- package/dist/frontend/ts7/checker.js.map +1 -1
- package/dist/frontend/ts7/checker.test.js +54 -17
- package/dist/frontend/ts7/checker.test.js.map +1 -1
- package/dist/frontend/ts7/enums.test.js +9 -4
- package/dist/frontend/ts7/enums.test.js.map +1 -1
- package/dist/frontend/ts7/native-api.js.map +1 -1
- package/dist/frontend/ts7/native-host.js.map +1 -1
- package/dist/frontend/ts7/native-process.js +9 -3
- package/dist/frontend/ts7/native-process.js.map +1 -1
- package/dist/frontend/ts7/program-adapter.js +1 -1
- package/dist/frontend/ts7/program-adapter.js.map +1 -1
- package/dist/frontend/ts7/program-host.js +7 -4
- package/dist/frontend/ts7/program-host.js.map +1 -1
- package/dist/frontend/ts7/program-host.test.js +43 -11
- package/dist/frontend/ts7/program-host.test.js.map +1 -1
- package/dist/frontend/ts7/rpc-api.js +3 -1
- package/dist/frontend/ts7/rpc-api.js.map +1 -1
- package/dist/frontend/ts7/rpc-client.js +15 -5
- package/dist/frontend/ts7/rpc-client.js.map +1 -1
- package/dist/frontend/ts7/rpc-client.test.js +26 -8
- package/dist/frontend/ts7/rpc-client.test.js.map +1 -1
- package/dist/frontend/ts7/rpc-filesystem.js.map +1 -1
- package/dist/frontend/ts7/rpc-filesystem.test.js +43 -10
- package/dist/frontend/ts7/rpc-filesystem.test.js.map +1 -1
- package/dist/frontend/ts7/rpc-process.js +16 -6
- package/dist/frontend/ts7/rpc-process.js.map +1 -1
- package/dist/frontend/ts7/rpc-process.test.js.map +1 -1
- package/dist/frontend/ts7/rpc-wire.d.ts +1 -0
- package/dist/frontend/ts7/rpc-wire.js +41 -14
- package/dist/frontend/ts7/rpc-wire.js.map +1 -1
- package/dist/frontend/ts7/rpc-wire.test.js +36 -6
- package/dist/frontend/ts7/rpc-wire.test.js.map +1 -1
- package/dist/frontend/ts7/semantic-checker.js +209 -68
- package/dist/frontend/ts7/semantic-checker.js.map +1 -1
- package/dist/frontend/ts7/semantic-checker.test.js +29 -14
- package/dist/frontend/ts7/semantic-checker.test.js.map +1 -1
- package/dist/frontend/ts7/semantic-json.js +7 -1
- package/dist/frontend/ts7/semantic-json.js.map +1 -1
- package/dist/frontend/ts7/semantic-json.test.js +17 -3
- package/dist/frontend/ts7/semantic-json.test.js.map +1 -1
- package/dist/frontend/ts7/semantic-model.js +147 -51
- package/dist/frontend/ts7/semantic-model.js.map +1 -1
- package/dist/frontend/ts7/semantic-model.test.js +72 -19
- package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
- package/dist/frontend/ts7/semantic-types.d.ts +2 -2
- package/dist/frontend/ts7/session-cache.js +10 -3
- package/dist/frontend/ts7/session-cache.js.map +1 -1
- package/dist/frontend/ts7/session-cache.test.js +13 -4
- package/dist/frontend/ts7/session-cache.test.js.map +1 -1
- package/dist/frontend/ts7/session-path.js +25 -10
- package/dist/frontend/ts7/session-path.js.map +1 -1
- package/dist/frontend/ts7/session-path.test.js +47 -4
- package/dist/frontend/ts7/session-path.test.js.map +1 -1
- package/dist/frontend/ts7/session-timing.js +22 -3
- package/dist/frontend/ts7/session-timing.js.map +1 -1
- package/dist/frontend/ts7/session-timing.test.js +12 -3
- package/dist/frontend/ts7/session-timing.test.js.map +1 -1
- package/dist/frontend/ts7/session.d.ts +1 -0
- package/dist/frontend/ts7/session.js +109 -35
- package/dist/frontend/ts7/session.js.map +1 -1
- package/dist/frontend/ts7/session.test.js +69 -15
- package/dist/frontend/ts7/session.test.js.map +1 -1
- package/dist/frontend/ts7/source-parser.js +17 -6
- package/dist/frontend/ts7/source-parser.js.map +1 -1
- package/dist/frontend/ts7/source-parser.test.js +32 -9
- package/dist/frontend/ts7/source-parser.test.js.map +1 -1
- package/dist/frontend/tsc-codes.js +56 -11
- package/dist/frontend/tsc-codes.js.map +1 -1
- package/dist/frontend/tsc-codes.test.d.ts +1 -0
- package/dist/frontend/tsc-codes.test.js +16 -0
- package/dist/frontend/tsc-codes.test.js.map +1 -0
- package/dist/frontend/type-mapper.js +545 -204
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/frontend/type-mapper.test.js +108 -33
- package/dist/frontend/type-mapper.test.js.map +1 -1
- package/dist/frontend/union-discriminants.js +8 -2
- package/dist/frontend/union-discriminants.js.map +1 -1
- package/dist/frontend/union-discriminants.test.js +77 -20
- package/dist/frontend/union-discriminants.test.js.map +1 -1
- package/dist/index.d.ts +9 -8
- package/dist/index.js +150 -81
- package/dist/index.js.map +1 -1
- package/dist/ir/analysis.js +95 -38
- package/dist/ir/analysis.js.map +1 -1
- package/dist/ir/analysis.test.js +91 -15
- package/dist/ir/analysis.test.js.map +1 -1
- package/dist/ir/api.d.ts +4 -0
- package/dist/ir/api.js +6 -0
- package/dist/ir/api.js.map +1 -0
- package/dist/ir/build.d.ts +7 -0
- package/dist/ir/build.js +27 -1
- package/dist/ir/build.js.map +1 -1
- package/dist/ir/builtin-effects.d.ts +9 -0
- package/dist/ir/builtin-effects.js +631 -0
- package/dist/ir/builtin-effects.js.map +1 -0
- package/dist/ir/builtin-signatures.d.ts +15 -0
- package/dist/ir/builtin-signatures.js +3396 -0
- package/dist/ir/builtin-signatures.js.map +1 -0
- package/dist/ir/byte-numbers.js +67 -16
- package/dist/ir/byte-numbers.js.map +1 -1
- package/dist/ir/byte-numbers.test.js +17 -4
- package/dist/ir/byte-numbers.test.js.map +1 -1
- package/dist/ir/constant-tables.js +13 -5
- package/dist/ir/constant-tables.js.map +1 -1
- package/dist/ir/constant-tables.test.js +47 -7
- package/dist/ir/constant-tables.test.js.map +1 -1
- package/dist/ir/control-flow.js +2 -1
- package/dist/ir/control-flow.js.map +1 -1
- package/dist/ir/control-flow.test.js +35 -11
- package/dist/ir/control-flow.test.js.map +1 -1
- package/dist/ir/initializer-bindings.d.ts +9 -0
- package/dist/ir/initializer-bindings.js +115 -0
- package/dist/ir/initializer-bindings.js.map +1 -0
- package/dist/ir/initializer-bindings.test.d.ts +1 -0
- package/dist/ir/initializer-bindings.test.js +118 -0
- package/dist/ir/initializer-bindings.test.js.map +1 -0
- package/dist/ir/integer-loop-facts.d.ts +12 -0
- package/dist/ir/integer-loop-facts.js +137 -0
- package/dist/ir/integer-loop-facts.js.map +1 -0
- package/dist/ir/integer-loops.js +85 -30
- package/dist/ir/integer-loops.js.map +1 -1
- package/dist/ir/integer-loops.test.js +76 -13
- package/dist/ir/integer-loops.test.js.map +1 -1
- package/dist/ir/integer-ranges.js +93 -21
- package/dist/ir/integer-ranges.js.map +1 -1
- package/dist/ir/integer-ranges.test.js +199 -21
- package/dist/ir/integer-ranges.test.js.map +1 -1
- package/dist/ir/intrinsic-signatures.d.ts +20 -0
- package/dist/ir/intrinsic-signatures.js +57 -0
- package/dist/ir/intrinsic-signatures.js.map +1 -0
- package/dist/ir/ir.d.ts +6 -2150
- package/dist/ir/ir.js +160 -1396
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/ir.test.js +98 -77
- package/dist/ir/ir.test.js.map +1 -1
- package/dist/ir/runtime-features.d.ts +221 -0
- package/dist/ir/runtime-features.js +551 -0
- package/dist/ir/runtime-features.js.map +1 -0
- package/dist/ir/runtime-features.test.d.ts +1 -0
- package/dist/ir/runtime-features.test.js +98 -0
- package/dist/ir/runtime-features.test.js.map +1 -0
- package/dist/ir/scalar-records.js +130 -40
- package/dist/ir/scalar-records.js.map +1 -1
- package/dist/ir/scalar-records.test.js +146 -27
- package/dist/ir/scalar-records.test.js.map +1 -1
- package/dist/ir/serialize.js +4 -2
- package/dist/ir/serialize.js.map +1 -1
- package/dist/ir/serialize.test.js +44 -9
- package/dist/ir/serialize.test.js.map +1 -1
- package/dist/ir/traverse.js +156 -43
- package/dist/ir/traverse.js.map +1 -1
- package/dist/ir/traverse.test.js +99 -24
- package/dist/ir/traverse.test.js.map +1 -1
- package/dist/ir/validate.d.ts +1 -31
- package/dist/ir/validate.js +782 -1889
- package/dist/ir/validate.js.map +1 -1
- package/dist/ir/validate.test.js +610 -114
- package/dist/ir/validate.test.js.map +1 -1
- package/dist/library/cache-primitives.js +9 -10
- package/dist/library/cache-primitives.js.map +1 -1
- package/dist/library/cache-reset.test.js +2 -1
- package/dist/library/cache-reset.test.js.map +1 -1
- package/dist/library/compiler-self-identity.js +11 -5
- package/dist/library/compiler-self-identity.js.map +1 -1
- package/dist/library/compiler-self-identity.test.js +10 -3
- package/dist/library/compiler-self-identity.test.js.map +1 -1
- package/dist/library/fence-eval.js +24 -7
- package/dist/library/fence-eval.js.map +1 -1
- package/dist/library/fence-eval.test.js +31 -7
- package/dist/library/fence-eval.test.js.map +1 -1
- package/dist/library/int-infer.js +199 -59
- package/dist/library/int-infer.js.map +1 -1
- package/dist/library/int-infer.test.js +133 -57
- package/dist/library/int-infer.test.js.map +1 -1
- package/dist/library/ir-policy.d.ts +27 -0
- package/dist/library/ir-policy.js +232 -0
- package/dist/library/ir-policy.js.map +1 -0
- package/dist/library/library-cache.js +40 -17
- package/dist/library/library-cache.js.map +1 -1
- package/dist/library/library-cache.test.js +24 -13
- package/dist/library/library-cache.test.js.map +1 -1
- package/dist/library/library-profile.js +68 -13
- package/dist/library/library-profile.js.map +1 -1
- package/dist/library/prepare.js +48 -20
- package/dist/library/prepare.js.map +1 -1
- package/dist/library/semantic-source.js +16 -14
- package/dist/library/semantic-source.js.map +1 -1
- package/dist/library/semantic-source.test.js +9 -14
- package/dist/library/semantic-source.test.js.map +1 -1
- package/dist/library/sidecar-validate.js +53 -12
- package/dist/library/sidecar-validate.js.map +1 -1
- package/dist/library/sidecar.js +85 -24
- package/dist/library/sidecar.js.map +1 -1
- package/dist/library/trap-teaching.js +11 -2
- package/dist/library/trap-teaching.js.map +1 -1
- package/dist/native/cache.js +10 -4
- package/dist/native/cache.js.map +1 -1
- package/dist/native/cli.js +34 -9
- package/dist/native/cli.js.map +1 -1
- package/dist/native/compiler.js +167 -43
- package/dist/native/compiler.js.map +1 -1
- package/dist/native/compiler.test.js +129 -32
- package/dist/native/compiler.test.js.map +1 -1
- package/dist/native/comptime.js +23 -7
- package/dist/native/comptime.js.map +1 -1
- package/dist/native/comptime.test.js +26 -6
- package/dist/native/comptime.test.js.map +1 -1
- package/dist/native/executable-cache.js +77 -27
- package/dist/native/executable-cache.js.map +1 -1
- package/dist/native/executable-cache.test.js +41 -6
- package/dist/native/executable-cache.test.js.map +1 -1
- package/dist/native/file-identity.js +9 -2
- package/dist/native/file-identity.js.map +1 -1
- package/dist/native/file-identity.test.js.map +1 -1
- package/dist/native/library.js +50 -12
- package/dist/native/library.js.map +1 -1
- package/dist/native/prepare.js +119 -34
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/prepare.test.js +22 -6
- package/dist/native/prepare.test.js.map +1 -1
- package/dist/native/runtime-typescript.js +24 -11
- package/dist/native/runtime-typescript.js.map +1 -1
- package/dist/native/runtime-typescript.test.js.map +1 -1
- package/dist/native/sanitizer.js +71 -18
- package/dist/native/sanitizer.js.map +1 -1
- package/dist/native/sanitizer.test.js +77 -20
- package/dist/native/sanitizer.test.js.map +1 -1
- package/dist/native/task.js.map +1 -1
- package/dist/native/task.test.js +7 -2
- package/dist/native/task.test.js.map +1 -1
- package/dist/native/toolchain.js +68 -26
- package/dist/native/toolchain.js.map +1 -1
- package/dist/native/toolchain.test.js +59 -20
- package/dist/native/toolchain.test.js.map +1 -1
- package/dist/startup-cache.d.ts +1 -1
- package/dist/startup-cache.js +1 -1
- package/dist/startup-cache.js.map +1 -1
- package/dist/timing.js.map +1 -1
- package/package.json +20 -20
- package/surface-manifest.json +1 -1
- package/dist/frontend/lowering/lower-builtins.d.ts +0 -601
- package/dist/frontend/lowering/lower-builtins.js +0 -8986
- package/dist/frontend/lowering/lower-builtins.js.map +0 -1
- package/dist/frontend/lowering/lower-containers.d.ts +0 -382
- package/dist/frontend/lowering/lower-containers.js +0 -7344
- package/dist/frontend/lowering/lower-containers.js.map +0 -1
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { dynUndefinedExpr, nodeThrowExpr, boolLit, numLit, strLit, varRef, } from "../../ir/build.js";
|
|
1
2
|
/* The server-surface lowering (node:net + node:http — the spoke-module
|
|
2
3
|
* pattern, like lower-island.ts): module-function calls (net
|
|
3
4
|
* createServer/connect/createConnection, http createServer/request/get —
|
|
@@ -9,27 +10,32 @@
|
|
|
9
10
|
* beyond these shapes fences member-qualified — never a generic
|
|
10
11
|
* rejection, never silence. */
|
|
11
12
|
import * as ts from "../ts7/adapter.js";
|
|
12
|
-
import { ladderFenceExpr
|
|
13
|
+
import { ladderFenceExpr } from "./lowerer.js";
|
|
13
14
|
import { isJsSourceFile, locOf } from "../program.js";
|
|
14
|
-
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";
|
|
15
|
+
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";
|
|
15
16
|
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";
|
|
16
17
|
import { conditionalSpreadOf } from "./expressions/object-literals.js";
|
|
17
|
-
import { boolLit, numLit, strLit, varRef } from "../../ir/build.js";
|
|
18
18
|
import { resultIsDiscarded } from "./call-position.js";
|
|
19
19
|
import { lowerCallbackArg as lowerCallbackArgShared } from "./callback-arg.js";
|
|
20
20
|
import { pairsSnapshotHelper } from "./pairs-snapshot.js";
|
|
21
|
-
const NARROW_DATA_HINT =
|
|
21
|
+
const NARROW_DATA_HINT = "write/end take one string or one Uint8Array/Buffer value (narrow unions first)";
|
|
22
22
|
/** The writable numeric http.Server timeout fields. The selector is an
|
|
23
23
|
* internal runtime ABI shared by the get/set libCalls (kept here beside
|
|
24
24
|
* the only two construction/lowering paths that can mint the accesses). */
|
|
25
25
|
function httpServerTimeoutField(name) {
|
|
26
26
|
switch (name) {
|
|
27
|
-
case "timeout":
|
|
28
|
-
|
|
29
|
-
case "
|
|
30
|
-
|
|
31
|
-
case "
|
|
32
|
-
|
|
27
|
+
case "timeout":
|
|
28
|
+
return 0;
|
|
29
|
+
case "keepAliveTimeout":
|
|
30
|
+
return 1;
|
|
31
|
+
case "headersTimeout":
|
|
32
|
+
return 2;
|
|
33
|
+
case "requestTimeout":
|
|
34
|
+
return 3;
|
|
35
|
+
case "keepAliveTimeoutBuffer":
|
|
36
|
+
return 4;
|
|
37
|
+
default:
|
|
38
|
+
return null;
|
|
33
39
|
}
|
|
34
40
|
}
|
|
35
41
|
/** VOID-result server/socket calls are usable as statements and as concise
|
|
@@ -168,7 +174,12 @@ export function voidizedCallback(lowerer, cb, loc) {
|
|
|
168
174
|
expr: {
|
|
169
175
|
kind: "callValue",
|
|
170
176
|
callee: { kind: "varRef", localId: "f.0", type: fromT, loc },
|
|
171
|
-
args: params.map((p) => ({
|
|
177
|
+
args: params.map((p) => ({
|
|
178
|
+
kind: "varRef",
|
|
179
|
+
localId: p.localId,
|
|
180
|
+
type: p.type,
|
|
181
|
+
loc,
|
|
182
|
+
})),
|
|
172
183
|
type: fromT.ret,
|
|
173
184
|
loc,
|
|
174
185
|
},
|
|
@@ -182,7 +193,13 @@ export function voidizedCallback(lowerer, cb, loc) {
|
|
|
182
193
|
params: [{ localId: "f.0", name: "f", type: fromT }],
|
|
183
194
|
returnType: toT,
|
|
184
195
|
locals: [{ id: "f.0", name: "f", type: fromT, mutable: false, boxed: true }],
|
|
185
|
-
body: [
|
|
196
|
+
body: [
|
|
197
|
+
{
|
|
198
|
+
kind: "return",
|
|
199
|
+
value: { kind: "closure", fnName: impl, captures: ["f.0"], type: toT, loc },
|
|
200
|
+
loc,
|
|
201
|
+
},
|
|
202
|
+
],
|
|
186
203
|
loc,
|
|
187
204
|
});
|
|
188
205
|
}
|
|
@@ -268,7 +285,11 @@ function isAddressInfoRecord(lowerer, t) {
|
|
|
268
285
|
const shape = lowerer.shapes.get(t.shapeId);
|
|
269
286
|
if (!shape || shape.tuple || shape.indexValue || shape.fields.length !== 3)
|
|
270
287
|
return false;
|
|
271
|
-
const want = [
|
|
288
|
+
const want = [
|
|
289
|
+
["address", "string"],
|
|
290
|
+
["family", "string"],
|
|
291
|
+
["port", "f64"],
|
|
292
|
+
];
|
|
272
293
|
return shape.fields.every((f, i) => f.name === want[i][0] && f.type.kind === want[i][1]);
|
|
273
294
|
}
|
|
274
295
|
function coerceToHandle(lowerer, node, want) {
|
|
@@ -301,25 +322,74 @@ function h2HeaderRecordStmts(lowerer, shapeId, pairsLocal, outLocal, statusLocal
|
|
|
301
322
|
const pairAt = (offset) => ({
|
|
302
323
|
kind: "arrayGet",
|
|
303
324
|
arr: varRef(pairsLocal, pairsT, loc),
|
|
304
|
-
index: offset === 0
|
|
325
|
+
index: offset === 0
|
|
326
|
+
? varRef("i.0", F64, loc)
|
|
327
|
+
: {
|
|
328
|
+
kind: "bin",
|
|
329
|
+
op: "+",
|
|
330
|
+
left: varRef("i.0", F64, loc),
|
|
331
|
+
right: numLit(offset, loc),
|
|
332
|
+
type: F64,
|
|
333
|
+
loc,
|
|
334
|
+
},
|
|
305
335
|
type: STRING,
|
|
306
336
|
loc,
|
|
307
337
|
});
|
|
308
338
|
const stmts = [
|
|
309
|
-
{
|
|
339
|
+
{
|
|
340
|
+
kind: "varDecl",
|
|
341
|
+
localId: outLocal,
|
|
342
|
+
init: { kind: "recordLit", fields: [], type: recT, loc },
|
|
343
|
+
loc,
|
|
344
|
+
},
|
|
310
345
|
{
|
|
311
346
|
kind: "for",
|
|
312
347
|
init: { kind: "varDecl", localId: "i.0", init: numLit(0, loc), loc },
|
|
313
348
|
cond: {
|
|
314
|
-
kind: "bin",
|
|
315
|
-
|
|
316
|
-
|
|
349
|
+
kind: "bin",
|
|
350
|
+
op: "<",
|
|
351
|
+
left: varRef("i.0", F64, loc),
|
|
352
|
+
right: {
|
|
353
|
+
kind: "arrIntrinsic",
|
|
354
|
+
method: "length",
|
|
355
|
+
receiver: varRef(pairsLocal, pairsT, loc),
|
|
356
|
+
args: [],
|
|
357
|
+
type: F64,
|
|
358
|
+
loc,
|
|
359
|
+
},
|
|
360
|
+
type: BOOL,
|
|
361
|
+
loc,
|
|
362
|
+
},
|
|
363
|
+
update: {
|
|
364
|
+
kind: "assign",
|
|
365
|
+
localId: "i.0",
|
|
366
|
+
value: {
|
|
367
|
+
kind: "bin",
|
|
368
|
+
op: "+",
|
|
369
|
+
left: varRef("i.0", F64, loc),
|
|
370
|
+
right: numLit(2, loc),
|
|
371
|
+
type: F64,
|
|
372
|
+
loc,
|
|
373
|
+
},
|
|
374
|
+
loc,
|
|
317
375
|
},
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
kind: "recordKeySet",
|
|
321
|
-
|
|
322
|
-
|
|
376
|
+
body: [
|
|
377
|
+
{
|
|
378
|
+
kind: "recordKeySet",
|
|
379
|
+
obj: varRef(outLocal, recT, loc),
|
|
380
|
+
shapeId,
|
|
381
|
+
key: pairAt(0),
|
|
382
|
+
value: {
|
|
383
|
+
kind: "unionWrap",
|
|
384
|
+
unionId: iv.unionId,
|
|
385
|
+
tag: strTag,
|
|
386
|
+
value: pairAt(1),
|
|
387
|
+
type: iv,
|
|
388
|
+
loc,
|
|
389
|
+
},
|
|
390
|
+
loc,
|
|
391
|
+
},
|
|
392
|
+
],
|
|
323
393
|
loc,
|
|
324
394
|
},
|
|
325
395
|
];
|
|
@@ -328,9 +398,19 @@ function h2HeaderRecordStmts(lowerer, shapeId, pairsLocal, outLocal, statusLocal
|
|
|
328
398
|
if (f64Tag < 0)
|
|
329
399
|
return null;
|
|
330
400
|
stmts.push({
|
|
331
|
-
kind: "recordKeySet",
|
|
401
|
+
kind: "recordKeySet",
|
|
402
|
+
obj: varRef(outLocal, recT, loc),
|
|
403
|
+
shapeId,
|
|
332
404
|
key: { kind: "strLit", value: ":status", type: STRING, loc },
|
|
333
|
-
value: {
|
|
405
|
+
value: {
|
|
406
|
+
kind: "unionWrap",
|
|
407
|
+
unionId: iv.unionId,
|
|
408
|
+
tag: f64Tag,
|
|
409
|
+
value: varRef(statusLocal, F64, loc),
|
|
410
|
+
type: iv,
|
|
411
|
+
loc,
|
|
412
|
+
},
|
|
413
|
+
loc,
|
|
334
414
|
});
|
|
335
415
|
}
|
|
336
416
|
return stmts;
|
|
@@ -365,7 +445,7 @@ function canonicalHeaderRecord(lowerer) {
|
|
|
365
445
|
}
|
|
366
446
|
function h2HeadersCallbackAdapter(lowerer, node, what, handleKind, withStatus, loc) {
|
|
367
447
|
let cb = lowerer.lowerExpr(node);
|
|
368
|
-
const maxParams = (handleKind ? 1 : 0) + 1 /* headers */ + 1 /* flags
|
|
448
|
+
const maxParams = (handleKind ? 1 : 0) + 1 /* headers */ + 1; /* flags */
|
|
369
449
|
// A checked-dynamic listener (test/common's mustCall wrapper — a dyn
|
|
370
450
|
// value or an arguments-reading rest function of dyn params): wrap it
|
|
371
451
|
// in a dynCheck to the CANONICAL event signature, then build the header
|
|
@@ -374,7 +454,8 @@ function h2HeadersCallbackAdapter(lowerer, node, what, handleKind, withStatus, l
|
|
|
374
454
|
// precedent). The synthesized record IS the shape the adapter builds.
|
|
375
455
|
const handleT = handleKind === "http2Stream" ? HTTP2STREAM_T : null;
|
|
376
456
|
const isDynCb = cb.type.kind === "dyn" ||
|
|
377
|
-
(cb.type.kind === "func" &&
|
|
457
|
+
(cb.type.kind === "func" &&
|
|
458
|
+
(cb.type.rest === true || cb.type.params.every((p) => p.kind === "dyn")) &&
|
|
378
459
|
canBoxFuncIntoDyn(cb.type, (id) => lowerer.shapes.get(id), (id) => lowerer.unions.get(id)));
|
|
379
460
|
if (isDynCb) {
|
|
380
461
|
const rec = canonicalHeaderRecord(lowerer);
|
|
@@ -428,8 +509,10 @@ function h2HeadersCallbackAdapter(lowerer, node, what, handleKind, withStatus, l
|
|
|
428
509
|
}
|
|
429
510
|
// Assemble the user-call arguments in the user's declared order.
|
|
430
511
|
const callArgs = [];
|
|
431
|
-
const push = (e) => {
|
|
432
|
-
callArgs.
|
|
512
|
+
const push = (e) => {
|
|
513
|
+
if (callArgs.length < fromT.params.length)
|
|
514
|
+
callArgs.push(e);
|
|
515
|
+
};
|
|
433
516
|
if (handleT)
|
|
434
517
|
push(varRef("h.0", handleT, loc));
|
|
435
518
|
if (recordRef)
|
|
@@ -439,14 +522,37 @@ function h2HeadersCallbackAdapter(lowerer, node, what, handleKind, withStatus, l
|
|
|
439
522
|
push(varRef("fl.0", F64, loc));
|
|
440
523
|
body.push({
|
|
441
524
|
kind: "exprStmt",
|
|
442
|
-
expr: {
|
|
525
|
+
expr: {
|
|
526
|
+
kind: "callValue",
|
|
527
|
+
callee: varRef("f.0", fromT, loc),
|
|
528
|
+
args: callArgs.slice(0, fromT.params.length),
|
|
529
|
+
type: fromT.ret,
|
|
530
|
+
loc,
|
|
531
|
+
},
|
|
443
532
|
loc,
|
|
444
533
|
});
|
|
445
|
-
lowerer.liftedFns.push({ name: impl, params: abiParams, returnType: VOID, captures: [{ localId: "f.0", name: "f", type: fromT }], locals, body, loc });
|
|
446
534
|
lowerer.liftedFns.push({
|
|
447
|
-
name
|
|
535
|
+
name: impl,
|
|
536
|
+
params: abiParams,
|
|
537
|
+
returnType: VOID,
|
|
538
|
+
captures: [{ localId: "f.0", name: "f", type: fromT }],
|
|
539
|
+
locals,
|
|
540
|
+
body,
|
|
541
|
+
loc,
|
|
542
|
+
});
|
|
543
|
+
lowerer.liftedFns.push({
|
|
544
|
+
name,
|
|
545
|
+
params: [{ localId: "f.0", name: "f", type: fromT }],
|
|
546
|
+
returnType: toT,
|
|
448
547
|
locals: [{ id: "f.0", name: "f", type: fromT, mutable: false, boxed: true }],
|
|
449
|
-
body: [
|
|
548
|
+
body: [
|
|
549
|
+
{
|
|
550
|
+
kind: "return",
|
|
551
|
+
value: { kind: "closure", fnName: impl, captures: ["f.0"], type: toT, loc },
|
|
552
|
+
loc,
|
|
553
|
+
},
|
|
554
|
+
],
|
|
555
|
+
loc,
|
|
450
556
|
});
|
|
451
557
|
}
|
|
452
558
|
return { kind: "call", callee: name, args: [cb], type: toT, loc };
|
|
@@ -552,7 +658,10 @@ export function lowerNetModuleCall(lowerer, expr, bi, loc) {
|
|
|
552
658
|
return {
|
|
553
659
|
kind: "libCall",
|
|
554
660
|
fn: "net.connectOptsChk",
|
|
555
|
-
args: [
|
|
661
|
+
args: [
|
|
662
|
+
bag,
|
|
663
|
+
ladderFenceExpr(lowerer, `${bi.member} with a runtime options record`, expr, "pass the options as an object literal — port, host, autoSelectFamily, autoSelectFamilyAttemptTimeout, and lookup are the supported options"),
|
|
664
|
+
],
|
|
556
665
|
type: NETSOCKET_T,
|
|
557
666
|
loc,
|
|
558
667
|
};
|
|
@@ -642,7 +751,9 @@ function lowerNetConnectOptions(lowerer, expr, member, loc) {
|
|
|
642
751
|
const needsBag = optsNode.properties.some((p) => (!ts.isPropertyAssignment(p) && !ts.isShorthandPropertyAssignment(p)) ||
|
|
643
752
|
(ts.isPropertyAssignment(p) && ts.isComputedPropertyName(p.name)) ||
|
|
644
753
|
["objectMode", "readableObjectMode", "writableObjectMode"].includes((ts.isPropertyAssignment(p) || ts.isShorthandPropertyAssignment(p)) &&
|
|
645
|
-
(ts.isIdentifier(p.name) || ts.isStringLiteral(p.name))
|
|
754
|
+
(ts.isIdentifier(p.name) || ts.isStringLiteral(p.name))
|
|
755
|
+
? p.name.text
|
|
756
|
+
: ""));
|
|
646
757
|
if (needsBag) {
|
|
647
758
|
const raw = lowerer.lowerExpr(optsNode);
|
|
648
759
|
if (raw.type.kind === "dyn" || lowerer.dynConvertible(raw.type)) {
|
|
@@ -650,7 +761,10 @@ function lowerNetConnectOptions(lowerer, expr, member, loc) {
|
|
|
650
761
|
return {
|
|
651
762
|
kind: "libCall",
|
|
652
763
|
fn: "net.connectOptsChk",
|
|
653
|
-
args: [
|
|
764
|
+
args: [
|
|
765
|
+
bag,
|
|
766
|
+
ladderFenceExpr(lowerer, `${member} with these options`, optsNode, "port, host, autoSelectFamily, autoSelectFamilyAttemptTimeout, and lookup are the supported options"),
|
|
767
|
+
],
|
|
654
768
|
type: NETSOCKET_T,
|
|
655
769
|
loc,
|
|
656
770
|
};
|
|
@@ -717,7 +831,8 @@ function lowerNetConnectOptions(lowerer, expr, member, loc) {
|
|
|
717
831
|
// A provably-non-boolean value throws Node's validateBoolean
|
|
718
832
|
// ladder instead of fencing.
|
|
719
833
|
const raw = initializer !== null && isJs ? lowerer.lowerExpr(initializer) : null;
|
|
720
|
-
if (raw !== null &&
|
|
834
|
+
if (raw !== null &&
|
|
835
|
+
raw.type.kind !== "bool" &&
|
|
721
836
|
(raw.type.kind === "dyn" || lowerer.dynConvertible(raw.type))) {
|
|
722
837
|
optionThrow ??= propThrow("options.autoSelectFamily", "of type boolean", raw);
|
|
723
838
|
continue;
|
|
@@ -762,7 +877,13 @@ function lowerNetConnectOptions(lowerer, expr, member, loc) {
|
|
|
762
877
|
if (lookup !== null || args.length !== 1) {
|
|
763
878
|
lowerer.noLowering(`${member} with an autoSelectFamilyAttemptTimeout beside a lookup or connect listener`, expr, "the validated-budget form is the bare options call — register listeners separately");
|
|
764
879
|
}
|
|
765
|
-
return {
|
|
880
|
+
return {
|
|
881
|
+
kind: "libCall",
|
|
882
|
+
fn: "net.connectAttempt",
|
|
883
|
+
args: [port, host, attempt],
|
|
884
|
+
type: NETSOCKET_T,
|
|
885
|
+
loc,
|
|
886
|
+
};
|
|
766
887
|
}
|
|
767
888
|
if (lookup !== null) {
|
|
768
889
|
if (!autoSelect) {
|
|
@@ -771,7 +892,13 @@ function lowerNetConnectOptions(lowerer, expr, member, loc) {
|
|
|
771
892
|
if (args.length !== 1) {
|
|
772
893
|
lowerer.noLowering(`${member} with a lookup and a connect listener`, expr, "register the listener separately: socket.once('connect', ...)");
|
|
773
894
|
}
|
|
774
|
-
return {
|
|
895
|
+
return {
|
|
896
|
+
kind: "libCall",
|
|
897
|
+
fn: "net.connectLookup",
|
|
898
|
+
args: [port, host, lookup],
|
|
899
|
+
type: NETSOCKET_T,
|
|
900
|
+
loc,
|
|
901
|
+
};
|
|
775
902
|
}
|
|
776
903
|
if (args.length === 1) {
|
|
777
904
|
return { kind: "libCall", fn: "net.connect", args: [port, host], type: NETSOCKET_T, loc };
|
|
@@ -849,7 +976,8 @@ export function lowerServerCloseOverrideAssignment(lowerer, left, right, loc) {
|
|
|
849
976
|
const t = value.type;
|
|
850
977
|
const cbUnion = t.kind === "func" && t.params.length === 1 ? t.params[0] : null;
|
|
851
978
|
const shapeOk = cbUnion?.kind === "union" &&
|
|
852
|
-
|
|
979
|
+
t.kind === "func" &&
|
|
980
|
+
(t.ret.kind === "netServer" || t.ret.kind === "void") &&
|
|
853
981
|
(() => {
|
|
854
982
|
const def = lowerer.unions.get(cbUnion.unionId);
|
|
855
983
|
return (!!def &&
|
|
@@ -861,7 +989,13 @@ export function lowerServerCloseOverrideAssignment(lowerer, left, right, loc) {
|
|
|
861
989
|
}
|
|
862
990
|
return {
|
|
863
991
|
kind: "exprStmt",
|
|
864
|
-
expr: {
|
|
992
|
+
expr: {
|
|
993
|
+
kind: "libCall",
|
|
994
|
+
fn: "net.serverSetCloseOverride",
|
|
995
|
+
args: [server, value],
|
|
996
|
+
type: VOID,
|
|
997
|
+
loc,
|
|
998
|
+
},
|
|
865
999
|
loc,
|
|
866
1000
|
};
|
|
867
1001
|
}
|
|
@@ -871,8 +1005,10 @@ export function lowerHttpResPropertyAssignment(lowerer, left, right, loc) {
|
|
|
871
1005
|
if (!ts.isPropertyAccessExpression(left) || left.questionDotToken)
|
|
872
1006
|
return null;
|
|
873
1007
|
const name = left.name.text;
|
|
874
|
-
if (name !== "statusCode" &&
|
|
875
|
-
name !== "
|
|
1008
|
+
if (name !== "statusCode" &&
|
|
1009
|
+
name !== "statusMessage" &&
|
|
1010
|
+
name !== "sendDate" &&
|
|
1011
|
+
name !== "strictContentLength")
|
|
876
1012
|
return null;
|
|
877
1013
|
if (lowerer.mapTypeOf(lowerer.typeOf(left.expression))?.kind !== "httpRes")
|
|
878
1014
|
return null;
|
|
@@ -882,9 +1018,13 @@ export function lowerHttpResPropertyAssignment(lowerer, left, right, loc) {
|
|
|
882
1018
|
const value = name === "statusCode"
|
|
883
1019
|
? lowerer.lowerExprExpecting(right, F64)
|
|
884
1020
|
: lowerer.lowerExprExpecting(right, name === "statusMessage" ? STRING : BOOL);
|
|
885
|
-
const fn = name === "statusCode"
|
|
886
|
-
|
|
887
|
-
|
|
1021
|
+
const fn = name === "statusCode"
|
|
1022
|
+
? "http.resStatusSet"
|
|
1023
|
+
: name === "statusMessage"
|
|
1024
|
+
? "http.resStatusMsgSet"
|
|
1025
|
+
: name === "sendDate"
|
|
1026
|
+
? "http.resSendDateSet"
|
|
1027
|
+
: "http.resStrictContentLengthSet";
|
|
888
1028
|
return {
|
|
889
1029
|
kind: "exprStmt",
|
|
890
1030
|
expr: { kind: "libCall", fn, args: [receiver, value], type: VOID, loc },
|
|
@@ -910,7 +1050,13 @@ export function lowerHttpServerTimeoutAssignment(lowerer, left, right, loc) {
|
|
|
910
1050
|
const value = lowerer.lowerExprExpecting(right, F64);
|
|
911
1051
|
return {
|
|
912
1052
|
kind: "exprStmt",
|
|
913
|
-
expr: {
|
|
1053
|
+
expr: {
|
|
1054
|
+
kind: "libCall",
|
|
1055
|
+
fn: "http.serverTimeoutSet",
|
|
1056
|
+
args: [receiver, selector, value],
|
|
1057
|
+
type: VOID,
|
|
1058
|
+
loc,
|
|
1059
|
+
},
|
|
914
1060
|
loc,
|
|
915
1061
|
};
|
|
916
1062
|
}
|
|
@@ -944,7 +1090,9 @@ function lowerNetServerMethodCall(lowerer, call, access) {
|
|
|
944
1090
|
if (args.length !== 0)
|
|
945
1091
|
lowerer.noLowering(`server.${name} arguments`, call, `${name}() takes no arguments`);
|
|
946
1092
|
const receiver = coerceToHandle(lowerer, access.expression, NETSERVER_T);
|
|
947
|
-
const fn = name === "closeAllConnections"
|
|
1093
|
+
const fn = name === "closeAllConnections"
|
|
1094
|
+
? "http.serverCloseAllConnections"
|
|
1095
|
+
: "http.serverCloseIdleConnections";
|
|
948
1096
|
return { kind: "libCall", fn, args: [receiver], type: VOID, loc };
|
|
949
1097
|
}
|
|
950
1098
|
if (name === "listen") {
|
|
@@ -990,24 +1138,27 @@ function lowerNetServerMethodCall(lowerer, call, access) {
|
|
|
990
1138
|
}
|
|
991
1139
|
const key = prop.name.text;
|
|
992
1140
|
if (key === "port") {
|
|
993
|
-
port =
|
|
994
|
-
|
|
995
|
-
|
|
1141
|
+
port =
|
|
1142
|
+
initializer !== null
|
|
1143
|
+
? lowerer.lowerExpr(initializer)
|
|
1144
|
+
: lowerer.lowerShorthandValue(prop);
|
|
996
1145
|
if (port.type.kind !== "f64") {
|
|
997
1146
|
lowerer.noLowering(`a listen 'port' option of '${lowerer.fmt(port.type)}' values`, prop, "the port is a number here");
|
|
998
1147
|
}
|
|
999
1148
|
}
|
|
1000
1149
|
else if (key === "host") {
|
|
1001
|
-
host =
|
|
1002
|
-
|
|
1003
|
-
|
|
1150
|
+
host =
|
|
1151
|
+
initializer !== null
|
|
1152
|
+
? lowerer.lowerExpr(initializer)
|
|
1153
|
+
: lowerer.lowerShorthandValue(prop);
|
|
1004
1154
|
if (host.type.kind !== "string") {
|
|
1005
1155
|
lowerer.noLowering(`a listen 'host' option of '${lowerer.fmt(host.type)}' values`, prop, "the host is an IP string here");
|
|
1006
1156
|
}
|
|
1007
1157
|
}
|
|
1008
1158
|
else if (key === "ipv6Only") {
|
|
1009
1159
|
if (initializer !== null) {
|
|
1010
|
-
v6only =
|
|
1160
|
+
v6only =
|
|
1161
|
+
lowerer.lowerCondition(initializer); /* truthiness: `boolean | undefined` flows */
|
|
1011
1162
|
}
|
|
1012
1163
|
else {
|
|
1013
1164
|
const v = lowerer.lowerShorthandValue(prop);
|
|
@@ -1029,15 +1180,19 @@ function lowerNetServerMethodCall(lowerer, call, access) {
|
|
|
1029
1180
|
reusePort = v;
|
|
1030
1181
|
}
|
|
1031
1182
|
}
|
|
1032
|
-
else if (key === "signal" &&
|
|
1183
|
+
else if (key === "signal" &&
|
|
1184
|
+
ts.isPropertyAssignment(prop) &&
|
|
1033
1185
|
isJsSourceFile(call.getSourceFile())) {
|
|
1034
1186
|
// A provably-non-AbortSignal signal (the invalid-input probes:
|
|
1035
1187
|
// strings, numbers, plain records) throws Node's
|
|
1036
1188
|
// validateAbortSignal ladder; plausible signal values keep the
|
|
1037
1189
|
// fence — abort-driven close has no lowering yet.
|
|
1038
1190
|
const raw = lowerer.lowerExpr(prop.initializer);
|
|
1039
|
-
const provablyNot = raw.type.kind === "string" ||
|
|
1040
|
-
raw.type.kind === "
|
|
1191
|
+
const provablyNot = raw.type.kind === "string" ||
|
|
1192
|
+
raw.type.kind === "f64" ||
|
|
1193
|
+
raw.type.kind === "bool" ||
|
|
1194
|
+
raw.type.kind === "record" ||
|
|
1195
|
+
raw.type.kind === "array";
|
|
1041
1196
|
if (provablyNot && lowerer.dynConvertible(raw.type)) {
|
|
1042
1197
|
return {
|
|
1043
1198
|
kind: "libCall",
|
|
@@ -1060,7 +1215,12 @@ function lowerNetServerMethodCall(lowerer, call, access) {
|
|
|
1060
1215
|
if (port === null) {
|
|
1061
1216
|
lowerer.noLowering("listen options without a port", args[0], "the supported options object is { port, host?, ipv6Only?, reusePort? } — port 0 binds an ephemeral port");
|
|
1062
1217
|
}
|
|
1063
|
-
host ??= {
|
|
1218
|
+
host ??= {
|
|
1219
|
+
kind: "strLit",
|
|
1220
|
+
value: "",
|
|
1221
|
+
type: STRING,
|
|
1222
|
+
loc,
|
|
1223
|
+
}; /* "" = the dual-stack any default */
|
|
1064
1224
|
v6only ??= boolLit(false, loc);
|
|
1065
1225
|
const listenOptsFn = reusePort === null ? "net.listenOpts" : "net.listenOptsReusePort";
|
|
1066
1226
|
const listenOptsCbFn = reusePort === null ? "net.listenOptsCb" : "net.listenOptsReusePortCb";
|
|
@@ -1157,22 +1317,46 @@ function lowerNetServerMethodCall(lowerer, call, access) {
|
|
|
1157
1317
|
}
|
|
1158
1318
|
if (event === "error") {
|
|
1159
1319
|
const { cb } = lowerCallbackArg(lowerer, args[1], "error listeners", 1, (p) => p.kind === "object" && p.className === "%Error", "use (err) or ()", [ERROR_T]);
|
|
1160
|
-
return {
|
|
1320
|
+
return {
|
|
1321
|
+
kind: "libCall",
|
|
1322
|
+
fn: "net.serverOnError",
|
|
1323
|
+
args: [receiver, cb, once],
|
|
1324
|
+
type: VOID,
|
|
1325
|
+
loc,
|
|
1326
|
+
};
|
|
1161
1327
|
}
|
|
1162
1328
|
if (event === "close") {
|
|
1163
1329
|
const { cb } = lowerCallbackArg(lowerer, args[1], "close listeners", 0, () => false, "use ()", []);
|
|
1164
|
-
return {
|
|
1330
|
+
return {
|
|
1331
|
+
kind: "libCall",
|
|
1332
|
+
fn: "net.serverOnClose",
|
|
1333
|
+
args: [receiver, cb, once],
|
|
1334
|
+
type: VOID,
|
|
1335
|
+
loc,
|
|
1336
|
+
};
|
|
1165
1337
|
}
|
|
1166
1338
|
if (event === "timeout") {
|
|
1167
1339
|
const { cb } = lowerCallbackArg(lowerer, args[1], "timeout listeners", 1, (p) => p.kind === "netSocket", "use (socket) or ()", [NETSOCKET_T]);
|
|
1168
|
-
return {
|
|
1340
|
+
return {
|
|
1341
|
+
kind: "libCall",
|
|
1342
|
+
fn: "http.serverOnTimeout",
|
|
1343
|
+
args: [receiver, cb, once],
|
|
1344
|
+
type: VOID,
|
|
1345
|
+
loc,
|
|
1346
|
+
};
|
|
1169
1347
|
}
|
|
1170
1348
|
if (event === "listening") {
|
|
1171
1349
|
// The deferred bind emit — listen(port, cb)'s event twin: fires
|
|
1172
1350
|
// once after a successful listen; late registrations on an
|
|
1173
1351
|
// already-listening server never fire (Node's once-per-listen).
|
|
1174
1352
|
const { cb } = lowerCallbackArg(lowerer, args[1], "listening listeners", 0, () => false, "use ()", []);
|
|
1175
|
-
return {
|
|
1353
|
+
return {
|
|
1354
|
+
kind: "libCall",
|
|
1355
|
+
fn: "net.serverOnListening",
|
|
1356
|
+
args: [receiver, cb, once],
|
|
1357
|
+
type: VOID,
|
|
1358
|
+
loc,
|
|
1359
|
+
};
|
|
1176
1360
|
}
|
|
1177
1361
|
if (event === "request") {
|
|
1178
1362
|
// The 'request' event — http.createServer(handler)'s event twin, and
|
|
@@ -1181,20 +1365,38 @@ function lowerNetServerMethodCall(lowerer, call, access) {
|
|
|
1181
1365
|
// server with no HTTP parser (net.createServer) the registration is
|
|
1182
1366
|
// Node-honest dead weight: the event never fires there either.
|
|
1183
1367
|
const cb = lowerRequestHandlerArg(lowerer, args[1]);
|
|
1184
|
-
return {
|
|
1368
|
+
return {
|
|
1369
|
+
kind: "libCall",
|
|
1370
|
+
fn: "http.serverOnRequest",
|
|
1371
|
+
args: [receiver, cb, once],
|
|
1372
|
+
type: VOID,
|
|
1373
|
+
loc,
|
|
1374
|
+
};
|
|
1185
1375
|
}
|
|
1186
1376
|
if (event === "stream") {
|
|
1187
1377
|
// The h2c server's request event: (stream, headers, flags). The
|
|
1188
1378
|
// adapter builds the headers record from the pairs the runtime
|
|
1189
1379
|
// hands over. Dead weight on a non-h2 server (never fires).
|
|
1190
1380
|
const cb = h2HeadersCallbackAdapter(lowerer, args[1], "stream listeners", "http2Stream", false, loc);
|
|
1191
|
-
return {
|
|
1381
|
+
return {
|
|
1382
|
+
kind: "libCall",
|
|
1383
|
+
fn: "http2.serverOnStream",
|
|
1384
|
+
args: [receiver, cb, once],
|
|
1385
|
+
type: VOID,
|
|
1386
|
+
loc,
|
|
1387
|
+
};
|
|
1192
1388
|
}
|
|
1193
1389
|
if (event === "session") {
|
|
1194
1390
|
// The h2c server's per-connection session event: (session). The
|
|
1195
1391
|
// result is voidized; the handle passes by reference.
|
|
1196
1392
|
const { cb } = lowerCallbackArg(lowerer, args[1], "session listeners", 1, (p) => p.kind === "http2Session", "use (session) or ()", [HTTP2SESSION_T]);
|
|
1197
|
-
return {
|
|
1393
|
+
return {
|
|
1394
|
+
kind: "libCall",
|
|
1395
|
+
fn: "http2.serverOnSession",
|
|
1396
|
+
args: [receiver, cb, once],
|
|
1397
|
+
type: VOID,
|
|
1398
|
+
loc,
|
|
1399
|
+
};
|
|
1198
1400
|
}
|
|
1199
1401
|
if (event === "connect") {
|
|
1200
1402
|
// HTTP CONNECT — the tunneling handover: (req, socket, head), fired
|
|
@@ -1225,7 +1427,13 @@ function lowerNetServerMethodCall(lowerer, call, access) {
|
|
|
1225
1427
|
(p2 !== undefined && !(p2.kind === "bytes" && p2.elem === "u8"))) {
|
|
1226
1428
|
lowerer.unsupported("SC1090", args[1], "connect listeners whose parameters are not (req: IncomingMessage, socket: Socket — or a union carrying the Socket arm, the h2 compat shape, head: Buffer)");
|
|
1227
1429
|
}
|
|
1228
|
-
return {
|
|
1430
|
+
return {
|
|
1431
|
+
kind: "libCall",
|
|
1432
|
+
fn: "http.serverOnConnect",
|
|
1433
|
+
args: [receiver, cb, once],
|
|
1434
|
+
type: VOID,
|
|
1435
|
+
loc,
|
|
1436
|
+
};
|
|
1229
1437
|
}
|
|
1230
1438
|
if (event === "upgrade") {
|
|
1231
1439
|
// The WebSocket handover: (req, socket, head) — Node fires it
|
|
@@ -1246,7 +1454,13 @@ function lowerNetServerMethodCall(lowerer, call, access) {
|
|
|
1246
1454
|
(p2 !== undefined && !(p2.kind === "bytes" && p2.elem === "u8"))) {
|
|
1247
1455
|
lowerer.unsupported("SC1090", args[1], "upgrade listeners whose parameters are not (req: IncomingMessage, socket: Socket, head: Buffer)");
|
|
1248
1456
|
}
|
|
1249
|
-
return {
|
|
1457
|
+
return {
|
|
1458
|
+
kind: "libCall",
|
|
1459
|
+
fn: "http.serverOnUpgrade",
|
|
1460
|
+
args: [receiver, cb, once],
|
|
1461
|
+
type: VOID,
|
|
1462
|
+
loc,
|
|
1463
|
+
};
|
|
1250
1464
|
}
|
|
1251
1465
|
if (event === "sessionError") {
|
|
1252
1466
|
const cb = lowerer.lowerExpr(args[1]);
|
|
@@ -1258,7 +1472,13 @@ function lowerNetServerMethodCall(lowerer, call, access) {
|
|
|
1258
1472
|
(session !== undefined && session.kind !== "http2Session")) {
|
|
1259
1473
|
lowerer.unsupported("SC1090", args[1], "sessionError listeners whose parameters are not (error: Error, session: ServerHttp2Session)");
|
|
1260
1474
|
}
|
|
1261
|
-
return {
|
|
1475
|
+
return {
|
|
1476
|
+
kind: "libCall",
|
|
1477
|
+
fn: "http2.serverOnSessionError",
|
|
1478
|
+
args: [receiver, cb, once],
|
|
1479
|
+
type: VOID,
|
|
1480
|
+
loc,
|
|
1481
|
+
};
|
|
1262
1482
|
}
|
|
1263
1483
|
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)');
|
|
1264
1484
|
}
|
|
@@ -1278,7 +1498,13 @@ function lowerNetServerMethodCall(lowerer, call, access) {
|
|
|
1278
1498
|
if (sock.type.kind !== "netSocket") {
|
|
1279
1499
|
lowerer.noLowering(`emit("connection", …) with a '${lowerer.fmt(sock.type)}' argument`, args[1], "the second argument must be a net socket");
|
|
1280
1500
|
}
|
|
1281
|
-
return {
|
|
1501
|
+
return {
|
|
1502
|
+
kind: "libCall",
|
|
1503
|
+
fn: "net.serverEmitConnection",
|
|
1504
|
+
args: [receiver, sock],
|
|
1505
|
+
type: VOID,
|
|
1506
|
+
loc,
|
|
1507
|
+
};
|
|
1282
1508
|
}
|
|
1283
1509
|
if (name === "address") {
|
|
1284
1510
|
// The full AddressInfo record (the dgram.address materialization).
|
|
@@ -1295,7 +1521,7 @@ function lowerNetServerMethodCall(lowerer, call, access) {
|
|
|
1295
1521
|
const receiver = coerceToHandle(lowerer, access.expression, NETSERVER_T);
|
|
1296
1522
|
return { kind: "libCall", fn: "net.serverAddress", args: [receiver], type: result, loc };
|
|
1297
1523
|
}
|
|
1298
|
-
lowerer.noLowering(`Server.${name}`, call,
|
|
1524
|
+
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));
|
|
1299
1525
|
}
|
|
1300
1526
|
/** Method calls on net.Socket receivers: write/end/destroy/pipe and
|
|
1301
1527
|
* on/once("data" | "end" | "close" | "error" | "connect"). Null for
|
|
@@ -1320,7 +1546,8 @@ function lowerNetSocketMethodCall(lowerer, call, access) {
|
|
|
1320
1546
|
const encT = lowerer.typeOf(args[1]);
|
|
1321
1547
|
const chunkT = lowerer.mapTypeOf(lowerer.typeOf(args[0]));
|
|
1322
1548
|
if (encT.isStringLiteralType() && chunkT !== null) {
|
|
1323
|
-
if (encT.value === "buffer" &&
|
|
1549
|
+
if (encT.value === "buffer" &&
|
|
1550
|
+
chunkT.kind === "string" &&
|
|
1324
1551
|
isJsSourceFile(call.getSourceFile())) {
|
|
1325
1552
|
lowerer.lowerExpr(args[0]); // evaluation order (effect-free in practice)
|
|
1326
1553
|
return nodeThrowExpr(1, "ERR_INVALID_ARG_TYPE", "Second argument must be a buffer", VOID, loc);
|
|
@@ -1409,10 +1636,14 @@ function lowerNetSocketMethodCall(lowerer, call, access) {
|
|
|
1409
1636
|
lowerer.noLowering(`setNoDelay with ${args.length} arguments`, call, "the form is setNoDelay(noDelay?)");
|
|
1410
1637
|
}
|
|
1411
1638
|
const receiver = coerceToHandle(lowerer, access.expression, NETSOCKET_T);
|
|
1412
|
-
const enable = args.length === 1
|
|
1413
|
-
|
|
1414
|
-
:
|
|
1415
|
-
|
|
1639
|
+
const enable = args.length === 1 ? lowerer.lowerExprExpecting(args[0], BOOL) : boolLit(true, loc);
|
|
1640
|
+
return {
|
|
1641
|
+
kind: "libCall",
|
|
1642
|
+
fn: "net.sockSetNoDelay",
|
|
1643
|
+
args: [receiver, enable],
|
|
1644
|
+
type: NETSOCKET_T,
|
|
1645
|
+
loc,
|
|
1646
|
+
};
|
|
1416
1647
|
}
|
|
1417
1648
|
if (name === "destroySoon") {
|
|
1418
1649
|
// end() now, destroy once the FIN actually flushed — Node's
|
|
@@ -1479,15 +1710,28 @@ function lowerNetSocketMethodCall(lowerer, call, access) {
|
|
|
1479
1710
|
}
|
|
1480
1711
|
if (event === "error") {
|
|
1481
1712
|
const { cb } = lowerCallbackArg(lowerer, args[1], "error listeners", 1, (p) => p.kind === "object" && p.className === "%Error", "use (err) or ()", [ERROR_T]);
|
|
1482
|
-
return {
|
|
1713
|
+
return {
|
|
1714
|
+
kind: "libCall",
|
|
1715
|
+
fn: "net.sockOnError",
|
|
1716
|
+
args: [receiver, cb, once],
|
|
1717
|
+
type: VOID,
|
|
1718
|
+
loc,
|
|
1719
|
+
};
|
|
1483
1720
|
}
|
|
1484
|
-
if (event === "end" ||
|
|
1721
|
+
if (event === "end" ||
|
|
1722
|
+
event === "close" ||
|
|
1723
|
+
event === "connect" ||
|
|
1724
|
+
event === "timeout" ||
|
|
1485
1725
|
event === "readable") {
|
|
1486
1726
|
const { cb } = lowerCallbackArg(lowerer, args[1], `${event} listeners`, 0, () => false, "use ()", []);
|
|
1487
|
-
const fn = event === "end"
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1727
|
+
const fn = event === "end"
|
|
1728
|
+
? "net.sockOnEnd"
|
|
1729
|
+
: event === "close"
|
|
1730
|
+
? "net.sockOnClose"
|
|
1731
|
+
: event === "timeout"
|
|
1732
|
+
? "net.sockOnTimeout"
|
|
1733
|
+
: event === "readable"
|
|
1734
|
+
? "net.sockOnReadable"
|
|
1491
1735
|
: "net.sockOnConnect";
|
|
1492
1736
|
return { kind: "libCall", fn, args: [receiver, cb, once], type: VOID, loc };
|
|
1493
1737
|
}
|
|
@@ -1503,13 +1747,25 @@ function lowerNetSocketMethodCall(lowerer, call, access) {
|
|
|
1503
1747
|
// transport pump); the runtime gates on the transport so a plain
|
|
1504
1748
|
// socket's registration never fires — Node's exact split.
|
|
1505
1749
|
const { cb } = lowerCallbackArg(lowerer, args[1], "secureConnect listeners", 0, () => false, "use ()", []);
|
|
1506
|
-
return {
|
|
1750
|
+
return {
|
|
1751
|
+
kind: "libCall",
|
|
1752
|
+
fn: "tls.sockOnSecureConnect",
|
|
1753
|
+
args: [receiver, cb, once],
|
|
1754
|
+
type: VOID,
|
|
1755
|
+
loc,
|
|
1756
|
+
};
|
|
1507
1757
|
}
|
|
1508
1758
|
if (event === "session") {
|
|
1509
1759
|
// The received-ticket event: fires once per TLS client socket with
|
|
1510
1760
|
// the serialized session (a Buffer); plain sockets never fire it.
|
|
1511
1761
|
const { cb } = lowerCallbackArg(lowerer, args[1], "session listeners", 1, (p) => p.kind === "bytes" && p.elem === "u8", "use (session: Buffer) or ()", [DYN]);
|
|
1512
|
-
return {
|
|
1762
|
+
return {
|
|
1763
|
+
kind: "libCall",
|
|
1764
|
+
fn: "tls.sockOnSession",
|
|
1765
|
+
args: [receiver, cb, once],
|
|
1766
|
+
type: VOID,
|
|
1767
|
+
loc,
|
|
1768
|
+
};
|
|
1513
1769
|
}
|
|
1514
1770
|
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)');
|
|
1515
1771
|
}
|
|
@@ -1603,13 +1859,27 @@ function lowerH2SessionMethodCall(lowerer, call, access) {
|
|
|
1603
1859
|
const receiver = () => coerceToHandle(lowerer, access.expression, HTTP2SESSION_T);
|
|
1604
1860
|
if (name === "request") {
|
|
1605
1861
|
const pairs = args.length >= 1 && !ts.isObjectLiteralExpression(args[0]) === false && args.length >= 1
|
|
1606
|
-
? null
|
|
1862
|
+
? null
|
|
1863
|
+
: null;
|
|
1607
1864
|
void pairs;
|
|
1608
1865
|
// arg0: headers (optional), arg1: options (optional).
|
|
1609
|
-
const headersArg = args.length >= 1
|
|
1866
|
+
const headersArg = args.length >= 1
|
|
1867
|
+
? lowerH2HeadersArg(lowerer, args[0])
|
|
1868
|
+
: { kind: "arrayLit", elems: [], type: arrayOf(STRING), loc };
|
|
1610
1869
|
const end = h2EndStreamOption(lowerer, args[1]);
|
|
1611
|
-
const endF64 = {
|
|
1612
|
-
|
|
1870
|
+
const endF64 = {
|
|
1871
|
+
kind: "numLit",
|
|
1872
|
+
value: end === undefined ? -1 : end ? 1 : 0,
|
|
1873
|
+
type: F64,
|
|
1874
|
+
loc,
|
|
1875
|
+
};
|
|
1876
|
+
return {
|
|
1877
|
+
kind: "libCall",
|
|
1878
|
+
fn: "http2.sessionRequest",
|
|
1879
|
+
args: [receiver(), headersArg, endF64],
|
|
1880
|
+
type: HTTP2STREAM_T,
|
|
1881
|
+
loc,
|
|
1882
|
+
};
|
|
1613
1883
|
}
|
|
1614
1884
|
if (name === "close") {
|
|
1615
1885
|
requireStatementPosition(lowerer, call, "session.close(...)");
|
|
@@ -1639,12 +1909,30 @@ function lowerH2SessionMethodCall(lowerer, call, access) {
|
|
|
1639
1909
|
if (cbV.type.kind === "dyn") {
|
|
1640
1910
|
// The dyn callback keeps Node's exact (err, settings, duration)
|
|
1641
1911
|
// shape — the runtime fires it through the checked-dynamic tree.
|
|
1642
|
-
return {
|
|
1912
|
+
return {
|
|
1913
|
+
kind: "libCall",
|
|
1914
|
+
fn: "http2.sessionSettingsDynCb",
|
|
1915
|
+
args: [receiver(), settingsArg, cbV],
|
|
1916
|
+
type: VOID,
|
|
1917
|
+
loc,
|
|
1918
|
+
};
|
|
1643
1919
|
}
|
|
1644
1920
|
const { cb } = lowerCallbackArg(lowerer, args[1], "settings callbacks", 0, () => false, "use () — or a dynamic (mustCall-wrapped) callback for the (err, settings, duration) shape", []);
|
|
1645
|
-
return {
|
|
1921
|
+
return {
|
|
1922
|
+
kind: "libCall",
|
|
1923
|
+
fn: "http2.sessionSettingsCb0",
|
|
1924
|
+
args: [receiver(), settingsArg, cb],
|
|
1925
|
+
type: VOID,
|
|
1926
|
+
loc,
|
|
1927
|
+
};
|
|
1646
1928
|
}
|
|
1647
|
-
return {
|
|
1929
|
+
return {
|
|
1930
|
+
kind: "libCall",
|
|
1931
|
+
fn: "http2.sessionSettings",
|
|
1932
|
+
args: [receiver(), settingsArg],
|
|
1933
|
+
type: VOID,
|
|
1934
|
+
loc,
|
|
1935
|
+
};
|
|
1648
1936
|
}
|
|
1649
1937
|
if ((name === "on" || name === "once" || name === "addListener") && args.length === 2) {
|
|
1650
1938
|
requireStatementPosition(lowerer, call, `session.${name}(...)`);
|
|
@@ -1658,26 +1946,62 @@ function lowerH2SessionMethodCall(lowerer, call, access) {
|
|
|
1658
1946
|
const local = boolLit(event === "localSettings", loc);
|
|
1659
1947
|
const cbV = lowerer.lowerExpr(args[1]);
|
|
1660
1948
|
if (cbV.type.kind === "dyn") {
|
|
1661
|
-
return {
|
|
1949
|
+
return {
|
|
1950
|
+
kind: "libCall",
|
|
1951
|
+
fn: "http2.sessionOnSettingsDyn",
|
|
1952
|
+
args: [receiver(), cbV, once, local],
|
|
1953
|
+
type: VOID,
|
|
1954
|
+
loc,
|
|
1955
|
+
};
|
|
1662
1956
|
}
|
|
1663
1957
|
const { cb } = lowerCallbackArg(lowerer, args[1], `${event} listeners`, 0, () => false, "use () — or a dynamic (mustCall-wrapped) listener for the (settings) payload", []);
|
|
1664
|
-
return {
|
|
1958
|
+
return {
|
|
1959
|
+
kind: "libCall",
|
|
1960
|
+
fn: "http2.sessionOnSettings0",
|
|
1961
|
+
args: [receiver(), cb, once, local],
|
|
1962
|
+
type: VOID,
|
|
1963
|
+
loc,
|
|
1964
|
+
};
|
|
1665
1965
|
}
|
|
1666
1966
|
if (event === "close") {
|
|
1667
1967
|
const { cb } = lowerCallbackArg(lowerer, args[1], "close listeners", 0, () => false, "use ()", []);
|
|
1668
|
-
return {
|
|
1968
|
+
return {
|
|
1969
|
+
kind: "libCall",
|
|
1970
|
+
fn: "http2.sessionOnClose",
|
|
1971
|
+
args: [receiver(), cb, once],
|
|
1972
|
+
type: VOID,
|
|
1973
|
+
loc,
|
|
1974
|
+
};
|
|
1669
1975
|
}
|
|
1670
1976
|
if (event === "error") {
|
|
1671
1977
|
const { cb } = lowerCallbackArg(lowerer, args[1], "error listeners", 1, (p) => p.kind === "object" && p.className === "%Error", "use (err) or ()", [ERROR_T]);
|
|
1672
|
-
return {
|
|
1978
|
+
return {
|
|
1979
|
+
kind: "libCall",
|
|
1980
|
+
fn: "http2.sessionOnError",
|
|
1981
|
+
args: [receiver(), cb, once],
|
|
1982
|
+
type: VOID,
|
|
1983
|
+
loc,
|
|
1984
|
+
};
|
|
1673
1985
|
}
|
|
1674
1986
|
if (event === "connect") {
|
|
1675
1987
|
const { cb } = lowerCallbackArg(lowerer, args[1], "connect listeners", 2, (p) => p.kind === "http2Session" || p.kind === "netSocket", "use (session, socket) or ()", [HTTP2SESSION_T, NETSOCKET_T]);
|
|
1676
|
-
return {
|
|
1988
|
+
return {
|
|
1989
|
+
kind: "libCall",
|
|
1990
|
+
fn: "http2.sessionOnConnect",
|
|
1991
|
+
args: [receiver(), cb, once],
|
|
1992
|
+
type: VOID,
|
|
1993
|
+
loc,
|
|
1994
|
+
};
|
|
1677
1995
|
}
|
|
1678
1996
|
if (event === "stream") {
|
|
1679
1997
|
const cb = h2HeadersCallbackAdapter(lowerer, args[1], "stream listeners", "http2Stream", false, loc);
|
|
1680
|
-
return {
|
|
1998
|
+
return {
|
|
1999
|
+
kind: "libCall",
|
|
2000
|
+
fn: "http2.sessionOnStream",
|
|
2001
|
+
args: [receiver(), cb, once],
|
|
2002
|
+
type: VOID,
|
|
2003
|
+
loc,
|
|
2004
|
+
};
|
|
1681
2005
|
}
|
|
1682
2006
|
if (event === "goaway") {
|
|
1683
2007
|
const cb = lowerer.lowerExpr(args[1]);
|
|
@@ -1687,18 +2011,25 @@ function lowerH2SessionMethodCall(lowerer, call, access) {
|
|
|
1687
2011
|
if (cb.type.params.some((p) => p.kind !== "f64" && p.kind !== "bytes")) {
|
|
1688
2012
|
lowerer.unsupported("SC1090", args[1], "goaway listeners whose parameters are not (errorCode, lastStreamID, opaqueData?)");
|
|
1689
2013
|
}
|
|
1690
|
-
return {
|
|
2014
|
+
return {
|
|
2015
|
+
kind: "libCall",
|
|
2016
|
+
fn: "http2.sessionOnGoaway",
|
|
2017
|
+
args: [receiver(), voidizedCallback(lowerer, cb, loc), once],
|
|
2018
|
+
type: VOID,
|
|
2019
|
+
loc,
|
|
2020
|
+
};
|
|
1691
2021
|
}
|
|
1692
2022
|
lowerer.noLowering(`session.${name}("${event ?? "?"}", ...)`, args[0], '"close", "error", "connect", "stream", and "goaway" are the supported session events');
|
|
1693
2023
|
}
|
|
1694
|
-
lowerer.noLowering(`session.${name}`, call,
|
|
2024
|
+
lowerer.noLowering(`session.${name}`, call, 'close/destroy/request and on("close"|"error"|"connect"|"stream"|"goaway") are the lowered session members');
|
|
1695
2025
|
}
|
|
1696
2026
|
/** Method calls on ClientHttp2Stream / ServerHttp2Stream receivers. */
|
|
1697
2027
|
function lowerH2StreamMethodCall(lowerer, call, access, receiverOverride) {
|
|
1698
2028
|
const compatReqStream = ts.isPropertyAccessExpression(access.expression) &&
|
|
1699
2029
|
access.expression.name.text === "stream" &&
|
|
1700
2030
|
lowerer.mapTypeOf(lowerer.typeOf(access.expression.expression))?.kind === "httpReq";
|
|
1701
|
-
if (lowerer.mapTypeOf(lowerer.typeOf(access.expression))?.kind !== "http2Stream" &&
|
|
2031
|
+
if (lowerer.mapTypeOf(lowerer.typeOf(access.expression))?.kind !== "http2Stream" &&
|
|
2032
|
+
!compatReqStream)
|
|
1702
2033
|
return null;
|
|
1703
2034
|
if (!lowerer.isStdlibMember(access) && !compatReqStream)
|
|
1704
2035
|
return null;
|
|
@@ -1712,7 +2043,13 @@ function lowerH2StreamMethodCall(lowerer, call, access, receiverOverride) {
|
|
|
1712
2043
|
? lowerH2HeadersArg(lowerer, args[0])
|
|
1713
2044
|
: { kind: "arrayLit", elems: [], type: arrayOf(STRING), loc };
|
|
1714
2045
|
const end = h2EndStreamOption(lowerer, args[1]);
|
|
1715
|
-
return {
|
|
2046
|
+
return {
|
|
2047
|
+
kind: "libCall",
|
|
2048
|
+
fn: "http2.streamRespond",
|
|
2049
|
+
args: [receiver(), headersArg, boolLit(end ?? false, loc)],
|
|
2050
|
+
type: VOID,
|
|
2051
|
+
loc,
|
|
2052
|
+
};
|
|
1716
2053
|
}
|
|
1717
2054
|
if (name === "write" || name === "end") {
|
|
1718
2055
|
requireStatementPosition(lowerer, call, `stream.${name}(...)`);
|
|
@@ -1734,8 +2071,12 @@ function lowerH2StreamMethodCall(lowerer, call, access, receiverOverride) {
|
|
|
1734
2071
|
lowerer.noLowering(`${name} with '${lowerer.fmt(data.type)}' data`, args[0], "the chunk is a string or a Uint8Array here");
|
|
1735
2072
|
}
|
|
1736
2073
|
const fn = name === "write"
|
|
1737
|
-
?
|
|
1738
|
-
|
|
2074
|
+
? isBytes
|
|
2075
|
+
? "http2.streamWriteBytes"
|
|
2076
|
+
: "http2.streamWrite"
|
|
2077
|
+
: isBytes
|
|
2078
|
+
? "http2.streamEndBytes"
|
|
2079
|
+
: "http2.streamEndStr";
|
|
1739
2080
|
return { kind: "libCall", fn, args: [receiver(), data], type: VOID, loc };
|
|
1740
2081
|
}
|
|
1741
2082
|
if (name === "close") {
|
|
@@ -1746,7 +2087,13 @@ function lowerH2StreamMethodCall(lowerer, call, access, receiverOverride) {
|
|
|
1746
2087
|
}
|
|
1747
2088
|
if (args.length >= 2) {
|
|
1748
2089
|
const { cb } = lowerCallbackArg(lowerer, args[1], "close callbacks", 0, () => false, "use ()", []);
|
|
1749
|
-
return {
|
|
2090
|
+
return {
|
|
2091
|
+
kind: "libCall",
|
|
2092
|
+
fn: "http2.streamCloseCb",
|
|
2093
|
+
args: [receiver(), code, cb],
|
|
2094
|
+
type: VOID,
|
|
2095
|
+
loc,
|
|
2096
|
+
};
|
|
1750
2097
|
}
|
|
1751
2098
|
return { kind: "libCall", fn: "http2.streamClose", args: [receiver(), code], type: VOID, loc };
|
|
1752
2099
|
}
|
|
@@ -1757,17 +2104,35 @@ function lowerH2StreamMethodCall(lowerer, call, access, receiverOverride) {
|
|
|
1757
2104
|
if (name === "setEncoding") {
|
|
1758
2105
|
const enc = lowerer.lowerExpr(args[0]);
|
|
1759
2106
|
if (enc.type.kind !== "string")
|
|
1760
|
-
lowerer.noLowering("setEncoding with a non-string encoding", args[0],
|
|
2107
|
+
lowerer.noLowering("setEncoding with a non-string encoding", args[0], 'pass "utf8"');
|
|
1761
2108
|
if (ts.isExpressionStatement(call.parent) || ts.isArrowFunction(call.parent)) {
|
|
1762
|
-
return {
|
|
2109
|
+
return {
|
|
2110
|
+
kind: "libCall",
|
|
2111
|
+
fn: "http2.streamSetEncoding",
|
|
2112
|
+
args: [receiver(), enc],
|
|
2113
|
+
type: VOID,
|
|
2114
|
+
loc,
|
|
2115
|
+
};
|
|
1763
2116
|
}
|
|
1764
2117
|
// The chaining spelling (`client.request(h).setEncoding("utf8")`):
|
|
1765
2118
|
// same write, the result is the receiver — Node's return-this.
|
|
1766
|
-
return {
|
|
2119
|
+
return {
|
|
2120
|
+
kind: "libCall",
|
|
2121
|
+
fn: "http2.streamSetEncodingRet",
|
|
2122
|
+
args: [receiver(), enc],
|
|
2123
|
+
type: HTTP2STREAM_T,
|
|
2124
|
+
loc,
|
|
2125
|
+
};
|
|
1767
2126
|
}
|
|
1768
2127
|
if (name === "resume" || name === "pause") {
|
|
1769
2128
|
requireStatementPosition(lowerer, call, `stream.${name}(...)`);
|
|
1770
|
-
return {
|
|
2129
|
+
return {
|
|
2130
|
+
kind: "libCall",
|
|
2131
|
+
fn: name === "resume" ? "http2.streamResume" : "http2.streamPause",
|
|
2132
|
+
args: [receiver()],
|
|
2133
|
+
type: VOID,
|
|
2134
|
+
loc,
|
|
2135
|
+
};
|
|
1771
2136
|
}
|
|
1772
2137
|
if ((name === "on" || name === "once" || name === "addListener") && args.length === 2) {
|
|
1773
2138
|
requireStatementPosition(lowerer, call, `stream.${name}(...)`);
|
|
@@ -1776,20 +2141,42 @@ function lowerH2StreamMethodCall(lowerer, call, access, receiverOverride) {
|
|
|
1776
2141
|
const event = evT.isStringLiteralType() ? evT.value : null;
|
|
1777
2142
|
if (event === "data") {
|
|
1778
2143
|
const { cb } = lowerCallbackArg(lowerer, args[1], "data listeners", 1, (p) => (p.kind === "bytes" && p.elem === "u8") || p.kind === "string" || p.kind === "dyn", "use (chunk) or ()", [BYTES_U8]);
|
|
1779
|
-
return {
|
|
2144
|
+
return {
|
|
2145
|
+
kind: "libCall",
|
|
2146
|
+
fn: "http2.streamOnData",
|
|
2147
|
+
args: [receiver(), cb, once],
|
|
2148
|
+
type: VOID,
|
|
2149
|
+
loc,
|
|
2150
|
+
};
|
|
1780
2151
|
}
|
|
1781
2152
|
if (event === "end" || event === "close" || event === "aborted") {
|
|
1782
2153
|
const { cb } = lowerCallbackArg(lowerer, args[1], `${event} listeners`, 0, () => false, "use ()", []);
|
|
1783
|
-
const fn = event === "end"
|
|
2154
|
+
const fn = event === "end"
|
|
2155
|
+
? "http2.streamOnEnd"
|
|
2156
|
+
: event === "close"
|
|
2157
|
+
? "http2.streamOnClose"
|
|
2158
|
+
: "http2.streamOnAborted";
|
|
1784
2159
|
return { kind: "libCall", fn, args: [receiver(), cb, once], type: VOID, loc };
|
|
1785
2160
|
}
|
|
1786
2161
|
if (event === "error") {
|
|
1787
2162
|
const { cb } = lowerCallbackArg(lowerer, args[1], "error listeners", 1, (p) => p.kind === "object" && p.className === "%Error", "use (err) or ()", [ERROR_T]);
|
|
1788
|
-
return {
|
|
2163
|
+
return {
|
|
2164
|
+
kind: "libCall",
|
|
2165
|
+
fn: "http2.streamOnError",
|
|
2166
|
+
args: [receiver(), cb, once],
|
|
2167
|
+
type: VOID,
|
|
2168
|
+
loc,
|
|
2169
|
+
};
|
|
1789
2170
|
}
|
|
1790
2171
|
if (event === "response") {
|
|
1791
2172
|
const cb = h2HeadersCallbackAdapter(lowerer, args[1], "response listeners", null, true, loc);
|
|
1792
|
-
return {
|
|
2173
|
+
return {
|
|
2174
|
+
kind: "libCall",
|
|
2175
|
+
fn: "http2.streamOnResponse",
|
|
2176
|
+
args: [receiver(), cb, once],
|
|
2177
|
+
type: VOID,
|
|
2178
|
+
loc,
|
|
2179
|
+
};
|
|
1793
2180
|
}
|
|
1794
2181
|
lowerer.noLowering(`stream.${name}("${event ?? "?"}", ...)`, args[0], '"data", "end", "close", "aborted", "error", and "response" are the supported stream events');
|
|
1795
2182
|
}
|
|
@@ -1803,11 +2190,15 @@ export function lowerCompatReqStreamOptionalCall(lowerer, call) {
|
|
|
1803
2190
|
if (!ts.isPropertyAccessExpression(call.expression) || !call.expression.questionDotToken)
|
|
1804
2191
|
return null;
|
|
1805
2192
|
const stream = call.expression.expression;
|
|
1806
|
-
if (!ts.isPropertyAccessExpression(stream) ||
|
|
2193
|
+
if (!ts.isPropertyAccessExpression(stream) ||
|
|
2194
|
+
stream.name.text !== "stream" ||
|
|
1807
2195
|
lowerer.mapTypeOf(lowerer.typeOf(stream.expression))?.kind !== "httpReq")
|
|
1808
2196
|
return null;
|
|
1809
2197
|
const loc = locOf(call);
|
|
1810
|
-
const unionT = {
|
|
2198
|
+
const unionT = {
|
|
2199
|
+
kind: "union",
|
|
2200
|
+
unionId: lowerer.unions.intern([HTTP2STREAM_T, UNDEFINED_T]),
|
|
2201
|
+
};
|
|
1811
2202
|
const guarded = {
|
|
1812
2203
|
kind: "libCall",
|
|
1813
2204
|
fn: "http.reqH2Stream",
|
|
@@ -1816,7 +2207,12 @@ export function lowerCompatReqStreamOptionalCall(lowerer, call) {
|
|
|
1816
2207
|
loc,
|
|
1817
2208
|
};
|
|
1818
2209
|
const id = `chain.${lowerer.chainCounter++}`;
|
|
1819
|
-
const body = lowerH2StreamMethodCall(lowerer, call, call.expression, {
|
|
2210
|
+
const body = lowerH2StreamMethodCall(lowerer, call, call.expression, {
|
|
2211
|
+
kind: "chainRecv",
|
|
2212
|
+
id,
|
|
2213
|
+
type: HTTP2STREAM_T,
|
|
2214
|
+
loc,
|
|
2215
|
+
});
|
|
1820
2216
|
if (body === null)
|
|
1821
2217
|
return null;
|
|
1822
2218
|
return { kind: "optChain", id, receiver: guarded, body, type: VOID, loc };
|
|
@@ -1841,7 +2237,13 @@ export function lowerServerProperty(lowerer, expr) {
|
|
|
1841
2237
|
if (field !== null) {
|
|
1842
2238
|
const receiver = coerceToHandle(lowerer, expr.expression, NETSERVER_T);
|
|
1843
2239
|
const selector = { kind: "numLit", value: field, type: F64, loc };
|
|
1844
|
-
return {
|
|
2240
|
+
return {
|
|
2241
|
+
kind: "libCall",
|
|
2242
|
+
fn: "http.serverTimeoutGet",
|
|
2243
|
+
args: [receiver, selector],
|
|
2244
|
+
type: F64,
|
|
2245
|
+
loc,
|
|
2246
|
+
};
|
|
1845
2247
|
}
|
|
1846
2248
|
}
|
|
1847
2249
|
if (recvKind === "httpReq" && lowerer.isStdlibMember(expr)) {
|
|
@@ -1855,7 +2257,13 @@ export function lowerServerProperty(lowerer, expr) {
|
|
|
1855
2257
|
// `number | undefined` — a real status on client responses, the
|
|
1856
2258
|
// undefined arm on server requests (Node's IncomingMessage split).
|
|
1857
2259
|
const receiver = coerceToHandle(lowerer, expr.expression, HTTPREQ_T);
|
|
1858
|
-
return {
|
|
2260
|
+
return {
|
|
2261
|
+
kind: "libCall",
|
|
2262
|
+
fn: "http.reqStatusCode",
|
|
2263
|
+
args: [receiver],
|
|
2264
|
+
type: lowerer.withUndefinedArm(F64),
|
|
2265
|
+
loc,
|
|
2266
|
+
};
|
|
1859
2267
|
}
|
|
1860
2268
|
if (name === "socket" || name === "connection") {
|
|
1861
2269
|
const receiver = coerceToHandle(lowerer, expr.expression, HTTPREQ_T);
|
|
@@ -1889,12 +2297,20 @@ export function lowerServerProperty(lowerer, expr) {
|
|
|
1889
2297
|
// when the status line carried none), undefined on server requests
|
|
1890
2298
|
// (the statusCode split).
|
|
1891
2299
|
const receiver = coerceToHandle(lowerer, expr.expression, HTTPREQ_T);
|
|
1892
|
-
return {
|
|
2300
|
+
return {
|
|
2301
|
+
kind: "libCall",
|
|
2302
|
+
fn: "http.reqStatusMessage",
|
|
2303
|
+
args: [receiver],
|
|
2304
|
+
type: lowerer.envValueType(),
|
|
2305
|
+
loc,
|
|
2306
|
+
};
|
|
1893
2307
|
}
|
|
1894
2308
|
if (name === "stream") {
|
|
1895
2309
|
const parent = expr.parent;
|
|
1896
|
-
if (ts.isPropertyAccessExpression(parent) &&
|
|
1897
|
-
|
|
2310
|
+
if (ts.isPropertyAccessExpression(parent) &&
|
|
2311
|
+
parent.expression === expr &&
|
|
2312
|
+
ts.isCallExpression(parent.parent) &&
|
|
2313
|
+
parent.parent.expression === parent) {
|
|
1898
2314
|
const receiver = coerceToHandle(lowerer, expr.expression, HTTPREQ_T);
|
|
1899
2315
|
if (parent.questionDotToken) {
|
|
1900
2316
|
const type = {
|
|
@@ -1919,14 +2335,18 @@ export function lowerServerProperty(lowerer, expr) {
|
|
|
1919
2335
|
// guarded-no-op / unguarded-TypeError stance; other reads fence.
|
|
1920
2336
|
lowerer.noLowering(`reading '${name}' (an HTTP/2-only member) from a request`, expr, "compatibility requests do not expose their backing h2 stream/session yet; guarded method calls no-op and other reads have no lowering");
|
|
1921
2337
|
}
|
|
1922
|
-
if (name === "headers" ||
|
|
2338
|
+
if (name === "headers" ||
|
|
2339
|
+
name === "trailers" ||
|
|
2340
|
+
name === "headersDistinct" ||
|
|
2341
|
+
name === "trailersDistinct") {
|
|
1923
2342
|
// Whole-object reads materialize a typed snapshot record. Per-name
|
|
1924
2343
|
// reads retain their direct lowerings.
|
|
1925
2344
|
const mapped = lowerer.mapTypeOf(lowerer.typeOf(expr));
|
|
1926
2345
|
if (mapped?.kind === "record") {
|
|
1927
2346
|
const helper = name === "headers"
|
|
1928
2347
|
? headersSnapshotHelper(lowerer, mapped.shapeId, loc)
|
|
1929
|
-
: name === "trailers"
|
|
2348
|
+
: name === "trailers"
|
|
2349
|
+
? trailersSnapshotHelper(lowerer, mapped.shapeId, loc)
|
|
1930
2350
|
: distinctSnapshotHelper(lowerer, mapped.shapeId, loc, name);
|
|
1931
2351
|
if (helper !== null) {
|
|
1932
2352
|
const receiver = coerceToHandle(lowerer, expr.expression, HTTPREQ_T);
|
|
@@ -1949,7 +2369,13 @@ export function lowerServerProperty(lowerer, expr) {
|
|
|
1949
2369
|
// KIND is a real socket either way, and `encrypted` on a socket has
|
|
1950
2370
|
// exactly one meaning.
|
|
1951
2371
|
const receiver = coerceToHandle(lowerer, expr.expression, NETSOCKET_T);
|
|
1952
|
-
return {
|
|
2372
|
+
return {
|
|
2373
|
+
kind: "libCall",
|
|
2374
|
+
fn: "net.sockEncrypted",
|
|
2375
|
+
args: [receiver],
|
|
2376
|
+
type: lowerer.withUndefinedArm(BOOL),
|
|
2377
|
+
loc,
|
|
2378
|
+
};
|
|
1953
2379
|
}
|
|
1954
2380
|
if (recvKind === "netSocket" && expr.name.text === "authorized") {
|
|
1955
2381
|
// TLSSocket.authorized — Node's verify verdict (false on plain
|
|
@@ -1980,7 +2406,9 @@ export function lowerServerProperty(lowerer, expr) {
|
|
|
1980
2406
|
const receiver = coerceToHandle(lowerer, expr.expression, NETSOCKET_T);
|
|
1981
2407
|
return { kind: "libCall", fn: "net.sockWritable", args: [receiver], type: BOOL, loc };
|
|
1982
2408
|
}
|
|
1983
|
-
if (recvKind === "netSocket" &&
|
|
2409
|
+
if (recvKind === "netSocket" &&
|
|
2410
|
+
lowerer.isStdlibMember(expr) &&
|
|
2411
|
+
expr.name.text === "bytesWritten") {
|
|
1984
2412
|
// Every byte the write paths accepted (buffered included — Node
|
|
1985
2413
|
// counts those too; plaintext on TLS sockets).
|
|
1986
2414
|
const receiver = coerceToHandle(lowerer, expr.expression, NETSOCKET_T);
|
|
@@ -1991,41 +2419,65 @@ export function lowerServerProperty(lowerer, expr) {
|
|
|
1991
2419
|
const receiver = coerceToHandle(lowerer, expr.expression, NETSOCKET_T);
|
|
1992
2420
|
return { kind: "libCall", fn: "net.sockReadable", args: [receiver], type: BOOL, loc };
|
|
1993
2421
|
}
|
|
1994
|
-
if (recvKind === "netSocket" &&
|
|
2422
|
+
if (recvKind === "netSocket" &&
|
|
2423
|
+
lowerer.isStdlibMember(expr) &&
|
|
2424
|
+
expr.name.text === "remoteAddress") {
|
|
1995
2425
|
// `string | undefined` — Node's read-time caching: a value read while
|
|
1996
2426
|
// connected survives destroy; never-read sockets answer undefined
|
|
1997
2427
|
// after close.
|
|
1998
2428
|
const receiver = coerceToHandle(lowerer, expr.expression, NETSOCKET_T);
|
|
1999
|
-
return {
|
|
2429
|
+
return {
|
|
2430
|
+
kind: "libCall",
|
|
2431
|
+
fn: "net.sockRemoteAddress",
|
|
2432
|
+
args: [receiver],
|
|
2433
|
+
type: lowerer.envValueType(),
|
|
2434
|
+
loc,
|
|
2435
|
+
};
|
|
2000
2436
|
}
|
|
2001
|
-
if (recvKind === "httpClientReq" &&
|
|
2437
|
+
if (recvKind === "httpClientReq" &&
|
|
2438
|
+
lowerer.isStdlibMember(expr) &&
|
|
2439
|
+
expr.name.text === "destroyed") {
|
|
2002
2440
|
const receiver = coerceToHandle(lowerer, expr.expression, HTTPCLIENTREQ_T);
|
|
2003
2441
|
return { kind: "libCall", fn: "http.clientDestroyed", args: [receiver], type: BOOL, loc };
|
|
2004
2442
|
}
|
|
2005
|
-
if (recvKind === "httpClientReq" &&
|
|
2443
|
+
if (recvKind === "httpClientReq" &&
|
|
2444
|
+
lowerer.isStdlibMember(expr) &&
|
|
2006
2445
|
(expr.name.text === "socket" || expr.name.text === "connection")) {
|
|
2007
2446
|
const receiver = coerceToHandle(lowerer, expr.expression, HTTPCLIENTREQ_T);
|
|
2008
2447
|
return { kind: "libCall", fn: "http.clientSocket", args: [receiver], type: NETSOCKET_T, loc };
|
|
2009
2448
|
}
|
|
2010
|
-
if (recvKind === "httpClientReq" &&
|
|
2449
|
+
if (recvKind === "httpClientReq" &&
|
|
2450
|
+
lowerer.isStdlibMember(expr) &&
|
|
2451
|
+
expr.name.text === "writableCorked") {
|
|
2011
2452
|
const receiver = coerceToHandle(lowerer, expr.expression, HTTPCLIENTREQ_T);
|
|
2012
2453
|
return { kind: "libCall", fn: "http.clientWritableCorked", args: [receiver], type: F64, loc };
|
|
2013
2454
|
}
|
|
2014
2455
|
if (recvKind === "httpClientReq" && lowerer.isStdlibMember(expr)) {
|
|
2015
2456
|
const name = expr.name.text;
|
|
2016
|
-
const strFn = name === "method"
|
|
2017
|
-
|
|
2018
|
-
|
|
2019
|
-
|
|
2457
|
+
const strFn = name === "method"
|
|
2458
|
+
? "http.clientMethod"
|
|
2459
|
+
: name === "path"
|
|
2460
|
+
? "http.clientPath"
|
|
2461
|
+
: name === "host"
|
|
2462
|
+
? "http.clientHost"
|
|
2463
|
+
: name === "protocol"
|
|
2464
|
+
? "http.clientProtocol"
|
|
2465
|
+
: null;
|
|
2020
2466
|
if (strFn !== null) {
|
|
2021
2467
|
const receiver = coerceToHandle(lowerer, expr.expression, HTTPCLIENTREQ_T);
|
|
2022
2468
|
return { kind: "libCall", fn: strFn, args: [receiver], type: STRING, loc };
|
|
2023
2469
|
}
|
|
2024
|
-
const boolFn = name === "aborted"
|
|
2025
|
-
|
|
2026
|
-
|
|
2027
|
-
|
|
2028
|
-
|
|
2470
|
+
const boolFn = name === "aborted"
|
|
2471
|
+
? "http.clientAborted"
|
|
2472
|
+
: name === "headersSent"
|
|
2473
|
+
? "http.clientHeadersSent"
|
|
2474
|
+
: name === "writableEnded" || name === "finished"
|
|
2475
|
+
? "http.clientWritableEnded"
|
|
2476
|
+
: name === "writableFinished"
|
|
2477
|
+
? "http.clientWritableFinished"
|
|
2478
|
+
: name === "reusedSocket"
|
|
2479
|
+
? "http.clientReusedSocket"
|
|
2480
|
+
: null;
|
|
2029
2481
|
if (boolFn !== null) {
|
|
2030
2482
|
const receiver = coerceToHandle(lowerer, expr.expression, HTTPCLIENTREQ_T);
|
|
2031
2483
|
return { kind: "libCall", fn: boolFn, args: [receiver], type: BOOL, loc };
|
|
@@ -2035,17 +2487,25 @@ export function lowerServerProperty(lowerer, expr) {
|
|
|
2035
2487
|
const collection = httpReqFieldCollection(lowerer, expr.expression);
|
|
2036
2488
|
const receiver = coerceToHandle(lowerer, expr.expression.expression, HTTPREQ_T);
|
|
2037
2489
|
const key = { kind: "strLit", value: expr.name.text, type: STRING, loc };
|
|
2038
|
-
const fn = collection === "headers"
|
|
2039
|
-
|
|
2040
|
-
|
|
2041
|
-
|
|
2490
|
+
const fn = collection === "headers"
|
|
2491
|
+
? "http.reqHeader"
|
|
2492
|
+
: collection === "trailers"
|
|
2493
|
+
? "http.reqTrailer"
|
|
2494
|
+
: collection === "headersDistinct"
|
|
2495
|
+
? "http.reqHeaderValues"
|
|
2496
|
+
: "http.reqTrailerValues";
|
|
2497
|
+
const type = collection.endsWith("Distinct")
|
|
2498
|
+
? lowerer.withUndefinedArm(arrayOf(STRING))
|
|
2499
|
+
: lowerer.envValueType();
|
|
2042
2500
|
return { kind: "libCall", fn, args: [receiver, key], type, loc };
|
|
2043
2501
|
}
|
|
2044
2502
|
if (recvKind === "httpRes" && lowerer.isStdlibMember(expr) && expr.name.text === "headersSent") {
|
|
2045
2503
|
const receiver = coerceToHandle(lowerer, expr.expression, HTTPRES_T);
|
|
2046
2504
|
return { kind: "libCall", fn: "http.resHeadersSent", args: [receiver], type: BOOL, loc };
|
|
2047
2505
|
}
|
|
2048
|
-
if (recvKind === "httpRes" &&
|
|
2506
|
+
if (recvKind === "httpRes" &&
|
|
2507
|
+
lowerer.isStdlibMember(expr) &&
|
|
2508
|
+
expr.name.text === "writableEnded") {
|
|
2049
2509
|
const receiver = coerceToHandle(lowerer, expr.expression, HTTPRES_T);
|
|
2050
2510
|
return { kind: "libCall", fn: "http.resWritableEnded", args: [receiver], type: BOOL, loc };
|
|
2051
2511
|
}
|
|
@@ -2053,7 +2513,9 @@ export function lowerServerProperty(lowerer, expr) {
|
|
|
2053
2513
|
const receiver = coerceToHandle(lowerer, expr.expression, HTTPRES_T);
|
|
2054
2514
|
return { kind: "libCall", fn: "http.resWritableEnded", args: [receiver], type: BOOL, loc };
|
|
2055
2515
|
}
|
|
2056
|
-
if (recvKind === "httpRes" &&
|
|
2516
|
+
if (recvKind === "httpRes" &&
|
|
2517
|
+
lowerer.isStdlibMember(expr) &&
|
|
2518
|
+
expr.name.text === "writableCorked") {
|
|
2057
2519
|
const receiver = coerceToHandle(lowerer, expr.expression, HTTPRES_T);
|
|
2058
2520
|
return { kind: "libCall", fn: "http.resWritableCorked", args: [receiver], type: F64, loc };
|
|
2059
2521
|
}
|
|
@@ -2063,10 +2525,18 @@ export function lowerServerProperty(lowerer, expr) {
|
|
|
2063
2525
|
const receiver = coerceToHandle(lowerer, expr.expression, HTTPRES_T);
|
|
2064
2526
|
return { kind: "libCall", fn: "http.resStatusGet", args: [receiver], type: F64, loc };
|
|
2065
2527
|
}
|
|
2066
|
-
if (recvKind === "httpRes" &&
|
|
2528
|
+
if (recvKind === "httpRes" &&
|
|
2529
|
+
lowerer.isStdlibMember(expr) &&
|
|
2530
|
+
expr.name.text === "statusMessage") {
|
|
2067
2531
|
// Unset until the head is sent; then the assigned or default reason.
|
|
2068
2532
|
const receiver = coerceToHandle(lowerer, expr.expression, HTTPRES_T);
|
|
2069
|
-
return {
|
|
2533
|
+
return {
|
|
2534
|
+
kind: "libCall",
|
|
2535
|
+
fn: "http.resStatusMsgGet",
|
|
2536
|
+
args: [receiver],
|
|
2537
|
+
type: lowerer.withUndefinedArm(STRING),
|
|
2538
|
+
loc,
|
|
2539
|
+
};
|
|
2070
2540
|
}
|
|
2071
2541
|
if (recvKind === "httpRes" && lowerer.isStdlibMember(expr)) {
|
|
2072
2542
|
const name = expr.name.text;
|
|
@@ -2105,13 +2575,22 @@ export function lowerServerProperty(lowerer, expr) {
|
|
|
2105
2575
|
if (m === "socket")
|
|
2106
2576
|
return { kind: "libCall", fn: "http2.sessionSocket", args: [recv()], type: NETSOCKET_T, loc };
|
|
2107
2577
|
if (m === "pendingSettingsAck")
|
|
2108
|
-
return {
|
|
2578
|
+
return {
|
|
2579
|
+
kind: "libCall",
|
|
2580
|
+
fn: "http2.sessionPendingSettingsAck",
|
|
2581
|
+
args: [recv()],
|
|
2582
|
+
type: BOOL,
|
|
2583
|
+
loc,
|
|
2584
|
+
};
|
|
2109
2585
|
if (m === "localSettings" || m === "remoteSettings") {
|
|
2110
2586
|
// The settings record crosses as a dyn value (the d.ts types it
|
|
2111
2587
|
// `any`): member reads ride the checked-dynamic keyed read.
|
|
2112
2588
|
return {
|
|
2113
|
-
kind: "libCall",
|
|
2114
|
-
|
|
2589
|
+
kind: "libCall",
|
|
2590
|
+
fn: "http2.sessionSettingsGet",
|
|
2591
|
+
args: [recv(), boolLit(m === "localSettings", loc)],
|
|
2592
|
+
type: DYN,
|
|
2593
|
+
loc,
|
|
2115
2594
|
};
|
|
2116
2595
|
}
|
|
2117
2596
|
}
|
|
@@ -2131,7 +2610,13 @@ export function lowerServerProperty(lowerer, expr) {
|
|
|
2131
2610
|
if (m === "pending")
|
|
2132
2611
|
return { kind: "libCall", fn: "http2.streamPending", args: [recv()], type: BOOL, loc };
|
|
2133
2612
|
if (m === "session")
|
|
2134
|
-
return {
|
|
2613
|
+
return {
|
|
2614
|
+
kind: "libCall",
|
|
2615
|
+
fn: "http2.streamSession",
|
|
2616
|
+
args: [recv()],
|
|
2617
|
+
type: HTTP2SESSION_T,
|
|
2618
|
+
loc,
|
|
2619
|
+
};
|
|
2135
2620
|
}
|
|
2136
2621
|
if (expr.name.text !== "port")
|
|
2137
2622
|
return null;
|
|
@@ -2166,7 +2651,12 @@ function lowerRequestHandlerArg(lowerer, node) {
|
|
|
2166
2651
|
// calls the wrapper through the checked-dynamic machinery; member
|
|
2167
2652
|
// uses inside the wrapped body dispatch back onto the same http
|
|
2168
2653
|
// entry points at runtime.
|
|
2169
|
-
return {
|
|
2654
|
+
return {
|
|
2655
|
+
kind: "dynCheck",
|
|
2656
|
+
value: cb,
|
|
2657
|
+
type: funcOf([HTTPREQ_T, HTTPRES_T], VOID),
|
|
2658
|
+
loc: locOf(node),
|
|
2659
|
+
};
|
|
2170
2660
|
}
|
|
2171
2661
|
if (cb.type.kind === "func" &&
|
|
2172
2662
|
(cb.type.rest === true ||
|
|
@@ -2178,7 +2668,12 @@ function lowerRequestHandlerArg(lowerer, node) {
|
|
|
2178
2668
|
// like the dyn case — req/res arrive as HANDLE boxes and the body's
|
|
2179
2669
|
// member uses dispatch at runtime.
|
|
2180
2670
|
const boxed = { kind: "dynFrom", value: cb, type: DYN, loc: locOf(node) };
|
|
2181
|
-
return {
|
|
2671
|
+
return {
|
|
2672
|
+
kind: "dynCheck",
|
|
2673
|
+
value: boxed,
|
|
2674
|
+
type: funcOf([HTTPREQ_T, HTTPRES_T], VOID),
|
|
2675
|
+
loc: locOf(node),
|
|
2676
|
+
};
|
|
2182
2677
|
}
|
|
2183
2678
|
if (cb.type.kind !== "func" || cb.type.params.length > 2) {
|
|
2184
2679
|
lowerer.unsupported("SC1090", node, "request handlers with more than two parameters (use (req, res))");
|
|
@@ -2238,7 +2733,7 @@ function lowerHttpServerOptions(lowerer, node, what) {
|
|
|
2238
2733
|
joinDup = false; /* Node's default: repeats keep the first value */
|
|
2239
2734
|
continue;
|
|
2240
2735
|
}
|
|
2241
|
-
lowerer.noLowering(`${what} with a non-literal joinDuplicateHeaders option`, prop,
|
|
2736
|
+
lowerer.noLowering(`${what} with a non-literal joinDuplicateHeaders option`, prop, 'the lowered forms are the literals joinDuplicateHeaders: true (repeats join ", ") and false (the keep-first default)');
|
|
2242
2737
|
}
|
|
2243
2738
|
if (key === "keepAliveTimeoutBuffer") {
|
|
2244
2739
|
if (keepAliveTimeoutBuffer !== null) {
|
|
@@ -2290,7 +2785,13 @@ function lowerHttpCreateServerForms(lowerer, expr, what, loc) {
|
|
|
2290
2785
|
? lowerHttpServerOptions(lowerer, optsNode, what)
|
|
2291
2786
|
: { joinDup: false, allowMissingHost: false, keepAliveTimeoutBuffer: null };
|
|
2292
2787
|
const server = handlerNode !== null
|
|
2293
|
-
? {
|
|
2788
|
+
? {
|
|
2789
|
+
kind: "libCall",
|
|
2790
|
+
fn: "http.createServer",
|
|
2791
|
+
args: [lowerRequestHandlerArg(lowerer, handlerNode)],
|
|
2792
|
+
type: NETSERVER_T,
|
|
2793
|
+
loc,
|
|
2794
|
+
}
|
|
2294
2795
|
: { kind: "libCall", fn: "http.createServerEmpty", args: [], type: NETSERVER_T, loc };
|
|
2295
2796
|
if (!opts.joinDup && !opts.allowMissingHost && opts.keepAliveTimeoutBuffer === null)
|
|
2296
2797
|
return server;
|
|
@@ -2315,7 +2816,13 @@ function lowerHttpCreateServerForms(lowerer, expr, what, loc) {
|
|
|
2315
2816
|
const value = { kind: "varRef", localId: "b.0", type: DYN, loc };
|
|
2316
2817
|
body.push({
|
|
2317
2818
|
kind: "exprStmt",
|
|
2318
|
-
expr: {
|
|
2819
|
+
expr: {
|
|
2820
|
+
kind: "libCall",
|
|
2821
|
+
fn: "http.serverTimeoutOptionSet",
|
|
2822
|
+
args: [ref, selector, value],
|
|
2823
|
+
type: VOID,
|
|
2824
|
+
loc,
|
|
2825
|
+
},
|
|
2319
2826
|
loc,
|
|
2320
2827
|
});
|
|
2321
2828
|
}
|
|
@@ -2329,7 +2836,13 @@ function lowerHttpCreateServerForms(lowerer, expr, what, loc) {
|
|
|
2329
2836
|
if (opts.allowMissingHost) {
|
|
2330
2837
|
body.push({
|
|
2331
2838
|
kind: "exprStmt",
|
|
2332
|
-
expr: {
|
|
2839
|
+
expr: {
|
|
2840
|
+
kind: "libCall",
|
|
2841
|
+
fn: "http.serverAllowMissingHostHeader",
|
|
2842
|
+
args: [ref],
|
|
2843
|
+
type: VOID,
|
|
2844
|
+
loc,
|
|
2845
|
+
},
|
|
2333
2846
|
loc,
|
|
2334
2847
|
});
|
|
2335
2848
|
}
|
|
@@ -2413,10 +2926,17 @@ export function lowerHttpAgentNew(lowerer, expr) {
|
|
|
2413
2926
|
? lowerer.lowerExpr(initializer)
|
|
2414
2927
|
: lowerer.lowerShorthandValue(prop);
|
|
2415
2928
|
if (v.type.kind === "dyn") {
|
|
2416
|
-
return {
|
|
2929
|
+
return {
|
|
2930
|
+
kind: "dynCheck",
|
|
2931
|
+
value: v,
|
|
2932
|
+
type: want === "bool" ? BOOL : F64,
|
|
2933
|
+
loc: locOf(prop),
|
|
2934
|
+
};
|
|
2417
2935
|
}
|
|
2418
2936
|
if (v.type.kind !== want) {
|
|
2419
|
-
lowerer.noLowering(`a ${api} '${key}' option of '${lowerer.fmt(v.type)}' values`, prop, want === "bool"
|
|
2937
|
+
lowerer.noLowering(`a ${api} '${key}' option of '${lowerer.fmt(v.type)}' values`, prop, want === "bool"
|
|
2938
|
+
? "the option value must be a boolean"
|
|
2939
|
+
: "the option value must be a number");
|
|
2420
2940
|
}
|
|
2421
2941
|
return v;
|
|
2422
2942
|
};
|
|
@@ -2455,7 +2975,15 @@ export function lowerHttpAgentNew(lowerer, expr) {
|
|
|
2455
2975
|
return {
|
|
2456
2976
|
kind: "libCall",
|
|
2457
2977
|
fn: "http.agentNew",
|
|
2458
|
-
args: [
|
|
2978
|
+
args: [
|
|
2979
|
+
boolLit(bi.module === "https", loc),
|
|
2980
|
+
keepAlive,
|
|
2981
|
+
kaMsecs,
|
|
2982
|
+
maxSockets,
|
|
2983
|
+
maxFree,
|
|
2984
|
+
timeout,
|
|
2985
|
+
port,
|
|
2986
|
+
],
|
|
2459
2987
|
type: DYN,
|
|
2460
2988
|
loc,
|
|
2461
2989
|
};
|
|
@@ -2480,7 +3008,9 @@ export function lowerHttpServerNew(lowerer, expr) {
|
|
|
2480
3008
|
function lowerHttpModuleCall(lowerer, expr, bi, loc) {
|
|
2481
3009
|
if (bi.member === "validateHeaderName") {
|
|
2482
3010
|
requireStatementPosition(lowerer, expr, "http.validateHeaderName(...)");
|
|
2483
|
-
if (expr.arguments.length < 1 ||
|
|
3011
|
+
if (expr.arguments.length < 1 ||
|
|
3012
|
+
expr.arguments.length > 2 ||
|
|
3013
|
+
expr.arguments.some(ts.isSpreadElement)) {
|
|
2484
3014
|
lowerer.noLowering("http.validateHeaderName arguments", expr, "pass a header name and an optional label");
|
|
2485
3015
|
}
|
|
2486
3016
|
const name = lowerer.lowerExprExpecting(expr.arguments[0], STRING);
|
|
@@ -2496,7 +3026,13 @@ function lowerHttpModuleCall(lowerer, expr, bi, loc) {
|
|
|
2496
3026
|
}
|
|
2497
3027
|
const name = lowerer.lowerExprExpecting(expr.arguments[0], STRING);
|
|
2498
3028
|
const value = lowerer.lowerExprExpecting(expr.arguments[1], DYN);
|
|
2499
|
-
return {
|
|
3029
|
+
return {
|
|
3030
|
+
kind: "libCall",
|
|
3031
|
+
fn: "http.validateHeaderValue",
|
|
3032
|
+
args: [name, value],
|
|
3033
|
+
type: VOID,
|
|
3034
|
+
loc,
|
|
3035
|
+
};
|
|
2500
3036
|
}
|
|
2501
3037
|
if (bi.member === "createServer" || bi.member === "Server") {
|
|
2502
3038
|
return lowerHttpCreateServerForms(lowerer, expr, `http.${bi.member}`, loc);
|
|
@@ -2542,8 +3078,7 @@ function lowerTlsServerOptions(lowerer, node, what) {
|
|
|
2542
3078
|
// the runtime walk's split (effectful values keep the fence).
|
|
2543
3079
|
continue;
|
|
2544
3080
|
}
|
|
2545
|
-
if (k === "requestCert" &&
|
|
2546
|
-
(init === null || init.kind === ts.SyntaxKind.FalseKeyword)) {
|
|
3081
|
+
if (k === "requestCert" && (init === null || init.kind === ts.SyntaxKind.FalseKeyword)) {
|
|
2547
3082
|
continue; // Node's false default, spelled out
|
|
2548
3083
|
}
|
|
2549
3084
|
fenceOrDropOptionKey(lowerer, prop, k, what, TLS_SERVER_DOCUMENTED_OPTIONS, "cert and key (PEM strings or Buffers) are the supported options", {
|
|
@@ -2556,7 +3091,8 @@ function lowerTlsServerOptions(lowerer, node, what) {
|
|
|
2556
3091
|
? lowerer.lowerExpr(initializer)
|
|
2557
3092
|
: lowerer.lowerShorthandValue(prop);
|
|
2558
3093
|
const isArrayOfPem = v.type.kind === "array" &&
|
|
2559
|
-
(v.type.elem.kind === "string" ||
|
|
3094
|
+
(v.type.elem.kind === "string" ||
|
|
3095
|
+
(v.type.elem.kind === "bytes" && v.type.elem.elem === "u8"));
|
|
2560
3096
|
if (v.type.kind === "dyn" || isArrayOfPem) {
|
|
2561
3097
|
// A runtime PEM value (fixtures.readKey(...) — the suite's shape) or
|
|
2562
3098
|
// the one-element-array multi-context spelling: the runtime
|
|
@@ -2596,10 +3132,19 @@ function lowerTlsServerOptions(lowerer, node, what) {
|
|
|
2596
3132
|
* rides WHOLE to the walker so the typed ladders run in Node's order
|
|
2597
3133
|
* (the static walk would fence them before validating). */
|
|
2598
3134
|
const TLS_VALIDATED_OPTIONS = new Set([
|
|
2599
|
-
"ciphers",
|
|
2600
|
-
"
|
|
2601
|
-
"
|
|
2602
|
-
"
|
|
3135
|
+
"ciphers",
|
|
3136
|
+
"passphrase",
|
|
3137
|
+
"ecdhCurve",
|
|
3138
|
+
"sessionIdContext",
|
|
3139
|
+
"clientCertEngine",
|
|
3140
|
+
"privateKeyEngine",
|
|
3141
|
+
"privateKeyIdentifier",
|
|
3142
|
+
"minVersion",
|
|
3143
|
+
"maxVersion",
|
|
3144
|
+
"handshakeTimeout",
|
|
3145
|
+
"keepAliveInitialDelay",
|
|
3146
|
+
"sessionTimeout",
|
|
3147
|
+
"ticketKeys",
|
|
2603
3148
|
]);
|
|
2604
3149
|
/** True when a literal options bag must ride the runtime walker: JS uses
|
|
2605
3150
|
* it for the typed TLS validation ladders, and HTTPS uses it for
|
|
@@ -2645,7 +3190,8 @@ function lowerTlsConnectCall(lowerer, expr, loc) {
|
|
|
2645
3190
|
if (args.length < 1 || args.length > 4 || args.some(ts.isSpreadElement)) {
|
|
2646
3191
|
lowerer.noLowering(`tls.connect with ${args.length} arguments`, expr, FORMS_HINT);
|
|
2647
3192
|
}
|
|
2648
|
-
const isFuncish = (a) => ts.isFunctionExpression(a) ||
|
|
3193
|
+
const isFuncish = (a) => ts.isFunctionExpression(a) ||
|
|
3194
|
+
ts.isArrowFunction(a) ||
|
|
2649
3195
|
lowerer.checker.getCallSignatures(lowerer.typeOf(a)).length > 0;
|
|
2650
3196
|
const isObjectish = (a) => {
|
|
2651
3197
|
if (ts.isObjectLiteralExpression(a))
|
|
@@ -2711,12 +3257,7 @@ function lowerTlsConnectCall(lowerer, expr, loc) {
|
|
|
2711
3257
|
}
|
|
2712
3258
|
// No options: Node's defaults (rejectUnauthorized: true) — the
|
|
2713
3259
|
// runtime walk reads an absent record (the dyn undefined).
|
|
2714
|
-
opts =
|
|
2715
|
-
kind: "dynFrom",
|
|
2716
|
-
value: { kind: "unitLit", unit: "undefined", type: UNDEFINED_T, loc },
|
|
2717
|
-
type: DYN,
|
|
2718
|
-
loc,
|
|
2719
|
-
};
|
|
3260
|
+
opts = dynUndefinedExpr(loc);
|
|
2720
3261
|
}
|
|
2721
3262
|
let cb = null;
|
|
2722
3263
|
if (i < args.length) {
|
|
@@ -2745,17 +3286,37 @@ function lowerTlsModuleCall(lowerer, expr, bi, loc) {
|
|
|
2745
3286
|
if (args.length === 1) {
|
|
2746
3287
|
return opts.dyn !== undefined
|
|
2747
3288
|
? { kind: "libCall", fn: "tls.createServerDyn", args: [opts.dyn], type: NETSERVER_T, loc }
|
|
2748
|
-
: {
|
|
3289
|
+
: {
|
|
3290
|
+
kind: "libCall",
|
|
3291
|
+
fn: "tls.createServer",
|
|
3292
|
+
args: [opts.cert, opts.key],
|
|
3293
|
+
type: NETSERVER_T,
|
|
3294
|
+
loc,
|
|
3295
|
+
};
|
|
2749
3296
|
}
|
|
2750
3297
|
const { cb } = lowerCallbackArg(lowerer, args[1], "secureConnection listeners", 1, (p) => p.kind === "netSocket", "use (socket) or ()", [NETSOCKET_T]);
|
|
2751
3298
|
return opts.dyn !== undefined
|
|
2752
|
-
? {
|
|
2753
|
-
|
|
3299
|
+
? {
|
|
3300
|
+
kind: "libCall",
|
|
3301
|
+
fn: "tls.createServerDynCb",
|
|
3302
|
+
args: [opts.dyn, cb],
|
|
3303
|
+
type: NETSERVER_T,
|
|
3304
|
+
loc,
|
|
3305
|
+
}
|
|
3306
|
+
: {
|
|
3307
|
+
kind: "libCall",
|
|
3308
|
+
fn: "tls.createServerCb",
|
|
3309
|
+
args: [opts.cert, opts.key, cb],
|
|
3310
|
+
type: NETSERVER_T,
|
|
3311
|
+
loc,
|
|
3312
|
+
};
|
|
2754
3313
|
}
|
|
2755
3314
|
if (bi.member === "connect") {
|
|
2756
3315
|
return lowerTlsConnectCall(lowerer, expr, loc);
|
|
2757
3316
|
}
|
|
2758
|
-
if (bi.member === "getCACertificates" &&
|
|
3317
|
+
if (bi.member === "getCACertificates" &&
|
|
3318
|
+
args.length === 1 &&
|
|
3319
|
+
!args.some(ts.isSpreadElement) &&
|
|
2759
3320
|
isJsSourceFile(expr.getSourceFile())) {
|
|
2760
3321
|
// The type-argument ladder (validateString + the documented name
|
|
2761
3322
|
// set); the real CA list has no lowering, so a valid name meets the
|
|
@@ -2782,9 +3343,21 @@ function lowerTlsModuleCall(lowerer, expr, bi, loc) {
|
|
|
2782
3343
|
}
|
|
2783
3344
|
const opts = lowerTlsServerOptionsOrDyn(lowerer, args[0], "tls.createSecureContext");
|
|
2784
3345
|
if (opts.dyn !== undefined) {
|
|
2785
|
-
return {
|
|
3346
|
+
return {
|
|
3347
|
+
kind: "libCall",
|
|
3348
|
+
fn: "tls.createSecureContextDyn",
|
|
3349
|
+
args: [opts.dyn],
|
|
3350
|
+
type: SECURECTX_T,
|
|
3351
|
+
loc,
|
|
3352
|
+
};
|
|
2786
3353
|
}
|
|
2787
|
-
return {
|
|
3354
|
+
return {
|
|
3355
|
+
kind: "libCall",
|
|
3356
|
+
fn: "tls.createSecureContext",
|
|
3357
|
+
args: [opts.cert, opts.key],
|
|
3358
|
+
type: SECURECTX_T,
|
|
3359
|
+
loc,
|
|
3360
|
+
};
|
|
2788
3361
|
}
|
|
2789
3362
|
// The CA-store introspection pair (scr_tls_ca.c — its own link gate, no
|
|
2790
3363
|
// mbedTLS): getCACertificates(type?) answers the per-type cached PEM
|
|
@@ -2840,7 +3413,8 @@ function clientFnRefOf(lowerer, node) {
|
|
|
2840
3413
|
: null;
|
|
2841
3414
|
if (!bi)
|
|
2842
3415
|
return null;
|
|
2843
|
-
if ((bi.module !== "http" && bi.module !== "https") ||
|
|
3416
|
+
if ((bi.module !== "http" && bi.module !== "https") ||
|
|
3417
|
+
(bi.member !== "request" && bi.member !== "get")) {
|
|
2844
3418
|
return null;
|
|
2845
3419
|
}
|
|
2846
3420
|
return { module: bi.module, member: bi.member };
|
|
@@ -2852,7 +3426,8 @@ function neverReassigned(lowerer, sym) {
|
|
|
2852
3426
|
const decl = lowerer.checker.declarationsOf(sym)[0];
|
|
2853
3427
|
if (!decl)
|
|
2854
3428
|
return false;
|
|
2855
|
-
if (ts.isVariableDeclaration(decl) &&
|
|
3429
|
+
if (ts.isVariableDeclaration(decl) &&
|
|
3430
|
+
(ts.getCombinedNodeFlags(decl) & ts.NodeFlags.Const) !== 0) {
|
|
2856
3431
|
return true;
|
|
2857
3432
|
}
|
|
2858
3433
|
if (!ts.isParameter(decl) && !ts.isVariableDeclaration(decl))
|
|
@@ -2861,7 +3436,9 @@ function neverReassigned(lowerer, sym) {
|
|
|
2861
3436
|
// source file for module-level bindings. Writes anywhere inside
|
|
2862
3437
|
// (nested closures included) disqualify.
|
|
2863
3438
|
let scope = decl;
|
|
2864
|
-
while (scope.parent !== undefined &&
|
|
3439
|
+
while (scope.parent !== undefined &&
|
|
3440
|
+
!ts.isFunctionLike(scope.parent) &&
|
|
3441
|
+
!ts.isSourceFile(scope.parent))
|
|
2865
3442
|
scope = scope.parent;
|
|
2866
3443
|
const root = scope.parent;
|
|
2867
3444
|
if (root === undefined)
|
|
@@ -2890,8 +3467,10 @@ function neverReassigned(lowerer, sym) {
|
|
|
2890
3467
|
}
|
|
2891
3468
|
}
|
|
2892
3469
|
if ((ts.isPrefixUnaryExpression(n) || ts.isPostfixUnaryExpression(n)) &&
|
|
2893
|
-
(n.operator === ts.SyntaxKind.PlusPlusToken ||
|
|
2894
|
-
|
|
3470
|
+
(n.operator === ts.SyntaxKind.PlusPlusToken ||
|
|
3471
|
+
n.operator === ts.SyntaxKind.MinusMinusToken) &&
|
|
3472
|
+
ts.isIdentifier(n.operand) &&
|
|
3473
|
+
lowerer.checker.getSymbolAtLocation(n.operand) === sym) {
|
|
2895
3474
|
written = true;
|
|
2896
3475
|
return;
|
|
2897
3476
|
}
|
|
@@ -2934,7 +3513,11 @@ export function registerHttpClientFnBinding(lowerer, nameNode, init) {
|
|
|
2934
3513
|
}
|
|
2935
3514
|
const symbol = lowerer.checker.getSymbolAtLocation(nameNode);
|
|
2936
3515
|
if (symbol) {
|
|
2937
|
-
lowerer.httpClientFnBindings.set(symbol, {
|
|
3516
|
+
lowerer.httpClientFnBindings.set(symbol, {
|
|
3517
|
+
cond,
|
|
3518
|
+
trueSecure: t.module === "https",
|
|
3519
|
+
member: t.member,
|
|
3520
|
+
});
|
|
2938
3521
|
}
|
|
2939
3522
|
return true;
|
|
2940
3523
|
}
|
|
@@ -2959,14 +3542,32 @@ function lowerHttpsModuleCall(lowerer, expr, bi, loc) {
|
|
|
2959
3542
|
// NULL-handler shape, here for the runtime-options record only
|
|
2960
3543
|
// (the literal path keeps its historical two-argument surface).
|
|
2961
3544
|
if (opts.dyn !== undefined) {
|
|
2962
|
-
return {
|
|
3545
|
+
return {
|
|
3546
|
+
kind: "libCall",
|
|
3547
|
+
fn: "https.createServerDyn",
|
|
3548
|
+
args: [opts.dyn],
|
|
3549
|
+
type: NETSERVER_T,
|
|
3550
|
+
loc,
|
|
3551
|
+
};
|
|
2963
3552
|
}
|
|
2964
3553
|
lowerer.noLowering("createServer with 1 arguments", expr, "the supported form is createServer({ cert, key }, (req, res) => ...)");
|
|
2965
3554
|
}
|
|
2966
3555
|
const cb = lowerRequestHandlerArg(lowerer, args[1]);
|
|
2967
3556
|
return opts.dyn !== undefined
|
|
2968
|
-
? {
|
|
2969
|
-
|
|
3557
|
+
? {
|
|
3558
|
+
kind: "libCall",
|
|
3559
|
+
fn: "https.createServerDynCb",
|
|
3560
|
+
args: [opts.dyn, cb],
|
|
3561
|
+
type: NETSERVER_T,
|
|
3562
|
+
loc,
|
|
3563
|
+
}
|
|
3564
|
+
: {
|
|
3565
|
+
kind: "libCall",
|
|
3566
|
+
fn: "https.createServer",
|
|
3567
|
+
args: [opts.cert, opts.key, cb],
|
|
3568
|
+
type: NETSERVER_T,
|
|
3569
|
+
loc,
|
|
3570
|
+
};
|
|
2970
3571
|
}
|
|
2971
3572
|
if (bi.member === "request" || bi.member === "get") {
|
|
2972
3573
|
return lowerHttpClientCall(lowerer, expr, bi.member, loc, true);
|
|
@@ -3053,7 +3654,7 @@ function lowerHttp2ModuleCall(lowerer, expr, bi, loc) {
|
|
|
3053
3654
|
}
|
|
3054
3655
|
const auth = lowerer.lowerExpr(args[0]);
|
|
3055
3656
|
if (auth.type.kind !== "string") {
|
|
3056
|
-
lowerer.noLowering(`http2.connect with a '${lowerer.fmt(auth.type)}' authority`, args[0],
|
|
3657
|
+
lowerer.noLowering(`http2.connect with a '${lowerer.fmt(auth.type)}' authority`, args[0], 'the authority is a string here ("http://host:port")');
|
|
3057
3658
|
}
|
|
3058
3659
|
// connect(authority, options[, listener]): session-tuning options
|
|
3059
3660
|
// are accepted and never evaluated (the core runs at defaults) —
|
|
@@ -3070,7 +3671,8 @@ function lowerHttp2ModuleCall(lowerer, expr, bi, loc) {
|
|
|
3070
3671
|
let ca = { kind: "strLit", value: "", type: STRING, loc };
|
|
3071
3672
|
const arg1IsDyn = args.length >= 2 &&
|
|
3072
3673
|
(lowerer.typeOf(args[1]).flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !== 0;
|
|
3073
|
-
if (args.length >= 2 &&
|
|
3674
|
+
if (args.length >= 2 &&
|
|
3675
|
+
!arg1IsDyn &&
|
|
3074
3676
|
lowerer.checker.getCallSignatures(lowerer.typeOf(args[1])).length === 0) {
|
|
3075
3677
|
if (ts.isObjectLiteralExpression(args[1])) {
|
|
3076
3678
|
for (const pr of args[1].properties) {
|
|
@@ -3109,7 +3711,10 @@ function lowerHttp2ModuleCall(lowerer, expr, bi, loc) {
|
|
|
3109
3711
|
ca = {
|
|
3110
3712
|
kind: "libCall",
|
|
3111
3713
|
fn: "tls.pemDyn",
|
|
3112
|
-
args: [
|
|
3714
|
+
args: [
|
|
3715
|
+
v,
|
|
3716
|
+
{ kind: "strLit", value: "an http2.connect 'ca' option", type: STRING, loc },
|
|
3717
|
+
],
|
|
3113
3718
|
type: BYTES_U8,
|
|
3114
3719
|
loc,
|
|
3115
3720
|
};
|
|
@@ -3129,9 +3734,21 @@ function lowerHttp2ModuleCall(lowerer, expr, bi, loc) {
|
|
|
3129
3734
|
// The listener is the 'connect' once-listener: (session, socket) or
|
|
3130
3735
|
// fewer. Its result is ignored (voidized); handles pass by ref.
|
|
3131
3736
|
const { cb } = lowerCallbackArg(lowerer, listenerNode, "connect listeners", 2, (p) => p.kind === "http2Session" || p.kind === "netSocket", "use (session, socket), (session), or ()", [HTTP2SESSION_T, NETSOCKET_T]);
|
|
3132
|
-
return {
|
|
3737
|
+
return {
|
|
3738
|
+
kind: "libCall",
|
|
3739
|
+
fn: "http2.connectCb",
|
|
3740
|
+
args: [auth, reject, ca, cb],
|
|
3741
|
+
type: HTTP2SESSION_T,
|
|
3742
|
+
loc,
|
|
3743
|
+
};
|
|
3133
3744
|
}
|
|
3134
|
-
return {
|
|
3745
|
+
return {
|
|
3746
|
+
kind: "libCall",
|
|
3747
|
+
fn: "http2.connect",
|
|
3748
|
+
args: [auth, reject, ca],
|
|
3749
|
+
type: HTTP2SESSION_T,
|
|
3750
|
+
loc,
|
|
3751
|
+
};
|
|
3135
3752
|
}
|
|
3136
3753
|
if (bi.member === "getDefaultSettings") {
|
|
3137
3754
|
// The constant defaults record, as a dyn value (the d.ts types it
|
|
@@ -3166,10 +3783,22 @@ function lowerHttp2ModuleCall(lowerer, expr, bi, loc) {
|
|
|
3166
3783
|
lowerer.noLowering("createSecureServer with a non-literal options argument", optsNode, "pass the options as an object literal ({ allowHTTP1: true, cert, key }) or a runtime record of those members");
|
|
3167
3784
|
}
|
|
3168
3785
|
if (handlerNode === null) {
|
|
3169
|
-
return {
|
|
3786
|
+
return {
|
|
3787
|
+
kind: "libCall",
|
|
3788
|
+
fn: "http2.createSecureServerDyn",
|
|
3789
|
+
args: [dynOpts],
|
|
3790
|
+
type: NETSERVER_T,
|
|
3791
|
+
loc,
|
|
3792
|
+
};
|
|
3170
3793
|
}
|
|
3171
3794
|
const cb = lowerRequestHandlerArg(lowerer, handlerNode);
|
|
3172
|
-
return {
|
|
3795
|
+
return {
|
|
3796
|
+
kind: "libCall",
|
|
3797
|
+
fn: "http2.createSecureServerDynCb",
|
|
3798
|
+
args: [dynOpts, cb],
|
|
3799
|
+
type: NETSERVER_T,
|
|
3800
|
+
loc,
|
|
3801
|
+
};
|
|
3173
3802
|
}
|
|
3174
3803
|
let cert = null;
|
|
3175
3804
|
let key = null;
|
|
@@ -3237,7 +3866,8 @@ function lowerHttp2ModuleCall(lowerer, expr, bi, loc) {
|
|
|
3237
3866
|
ts.isPropertyAssignment(whenTrue.properties[0]) &&
|
|
3238
3867
|
(ts.isIdentifier(whenTrue.properties[0].name) ||
|
|
3239
3868
|
ts.isStringLiteral(whenTrue.properties[0].name)) &&
|
|
3240
|
-
whenTrue.properties[0].name.text ===
|
|
3869
|
+
whenTrue.properties[0].name.text ===
|
|
3870
|
+
"SNICallback" &&
|
|
3241
3871
|
whenTrue.properties[0].initializer.getText() === condText;
|
|
3242
3872
|
if (!ok) {
|
|
3243
3873
|
lowerer.noLowering("createSecureServer options with a conditional spread", prop, "the lowered conditional spread is exactly ...(x ? { SNICallback: x } : {}) — the included value must BE the condition");
|
|
@@ -3286,7 +3916,10 @@ function lowerHttp2ModuleCall(lowerer, expr, bi, loc) {
|
|
|
3286
3916
|
v = {
|
|
3287
3917
|
kind: "libCall",
|
|
3288
3918
|
fn: "tls.pemDyn",
|
|
3289
|
-
args: [
|
|
3919
|
+
args: [
|
|
3920
|
+
v,
|
|
3921
|
+
{ kind: "strLit", value: `a createSecureServer '${k}' option`, type: STRING, loc },
|
|
3922
|
+
],
|
|
3290
3923
|
type: BYTES_U8,
|
|
3291
3924
|
loc,
|
|
3292
3925
|
};
|
|
@@ -3306,13 +3939,18 @@ function lowerHttp2ModuleCall(lowerer, expr, bi, loc) {
|
|
|
3306
3939
|
// true }` — the portless RFC 8441 advertisement): every member is
|
|
3307
3940
|
// itself inert h2-session state, so the same no-observable-skip
|
|
3308
3941
|
// argument covers the one level of nesting.
|
|
3309
|
-
const isScalarLiteral = (e) => ts.isNumericLiteral(e) ||
|
|
3310
|
-
|
|
3942
|
+
const isScalarLiteral = (e) => ts.isNumericLiteral(e) ||
|
|
3943
|
+
ts.isStringLiteralLike(e) ||
|
|
3944
|
+
e.kind === ts.SyntaxKind.TrueKeyword ||
|
|
3945
|
+
e.kind === ts.SyntaxKind.FalseKeyword;
|
|
3311
3946
|
const isLiteralObjectOfLiterals = (e) => ts.isObjectLiteralExpression(e) &&
|
|
3312
|
-
e.properties.every((p) => ts.isPropertyAssignment(p) &&
|
|
3947
|
+
e.properties.every((p) => ts.isPropertyAssignment(p) &&
|
|
3948
|
+
ts.isIdentifier(p.name) &&
|
|
3949
|
+
isScalarLiteral(p.initializer));
|
|
3313
3950
|
if (k === "settings" && initializer !== null && ts.isObjectLiteralExpression(initializer)) {
|
|
3314
3951
|
for (const setting of initializer.properties) {
|
|
3315
|
-
if (ts.isPropertyAssignment(setting) &&
|
|
3952
|
+
if (ts.isPropertyAssignment(setting) &&
|
|
3953
|
+
ts.isIdentifier(setting.name) &&
|
|
3316
3954
|
setting.name.text === "enableConnectProtocol") {
|
|
3317
3955
|
if (setting.initializer.kind !== ts.SyntaxKind.TrueKeyword &&
|
|
3318
3956
|
setting.initializer.kind !== ts.SyntaxKind.FalseKeyword) {
|
|
@@ -3344,7 +3982,7 @@ function lowerHttp2ModuleCall(lowerer, expr, bi, loc) {
|
|
|
3344
3982
|
lowerer.noLowering("createSecureServer without both cert and key", optsNode, "the supported options object is { allowHTTP1?, cert, key } (PEM strings or Buffers)");
|
|
3345
3983
|
}
|
|
3346
3984
|
if (sni !== null && handlerNode !== null) {
|
|
3347
|
-
lowerer.noLowering("createSecureServer with both an SNICallback and an eager handler", expr,
|
|
3985
|
+
lowerer.noLowering("createSecureServer with both an SNICallback and an eager handler", expr, 'register the handler separately: server.on("request", (req, res) => ...)');
|
|
3348
3986
|
}
|
|
3349
3987
|
if (!allowHttp1) {
|
|
3350
3988
|
// The REAL h2-over-TLS server (scr_http2.c + scr_tls.c): ALPN
|
|
@@ -3357,18 +3995,48 @@ function lowerHttp2ModuleCall(lowerer, expr, bi, loc) {
|
|
|
3357
3995
|
}
|
|
3358
3996
|
if (handlerNode !== null) {
|
|
3359
3997
|
const cb = lowerRequestHandlerArg(lowerer, handlerNode);
|
|
3360
|
-
return {
|
|
3998
|
+
return {
|
|
3999
|
+
kind: "libCall",
|
|
4000
|
+
fn: "http2.createSecureServerH2Req",
|
|
4001
|
+
args: [cert, key, cb, boolLit(enableConnectProtocol, loc)],
|
|
4002
|
+
type: NETSERVER_T,
|
|
4003
|
+
loc,
|
|
4004
|
+
};
|
|
3361
4005
|
}
|
|
3362
|
-
return {
|
|
4006
|
+
return {
|
|
4007
|
+
kind: "libCall",
|
|
4008
|
+
fn: "http2.createSecureServerH2",
|
|
4009
|
+
args: [cert, key, boolLit(enableConnectProtocol, loc)],
|
|
4010
|
+
type: NETSERVER_T,
|
|
4011
|
+
loc,
|
|
4012
|
+
};
|
|
3363
4013
|
}
|
|
3364
4014
|
if (sni !== null) {
|
|
3365
|
-
return {
|
|
4015
|
+
return {
|
|
4016
|
+
kind: "libCall",
|
|
4017
|
+
fn: "http2.createSecureServerSni",
|
|
4018
|
+
args: [cert, key, sni, boolLit(enableConnectProtocol, loc)],
|
|
4019
|
+
type: NETSERVER_T,
|
|
4020
|
+
loc,
|
|
4021
|
+
};
|
|
3366
4022
|
}
|
|
3367
4023
|
if (handlerNode !== null) {
|
|
3368
4024
|
const cb = lowerRequestHandlerArg(lowerer, handlerNode);
|
|
3369
|
-
return {
|
|
4025
|
+
return {
|
|
4026
|
+
kind: "libCall",
|
|
4027
|
+
fn: "http2.createSecureServerReq",
|
|
4028
|
+
args: [cert, key, cb, boolLit(enableConnectProtocol, loc)],
|
|
4029
|
+
type: NETSERVER_T,
|
|
4030
|
+
loc,
|
|
4031
|
+
};
|
|
3370
4032
|
}
|
|
3371
|
-
return {
|
|
4033
|
+
return {
|
|
4034
|
+
kind: "libCall",
|
|
4035
|
+
fn: "http2.createSecureServer",
|
|
4036
|
+
args: [cert, key, boolLit(enableConnectProtocol, loc)],
|
|
4037
|
+
type: NETSERVER_T,
|
|
4038
|
+
loc,
|
|
4039
|
+
};
|
|
3372
4040
|
}
|
|
3373
4041
|
lowerer.noLowering(`http2.${bi.member}`, expr, builtinFenceHintOf("http2", bi.member) ??
|
|
3374
4042
|
"createSecureServer({ allowHTTP1: true, cert, key }) and the h2-only form are lowered", lowerer.resolveValueSymbol(expr.expression));
|
|
@@ -3398,9 +4066,7 @@ function lowerHttpClientCall(lowerer, expr, member, loc, secure = false) {
|
|
|
3398
4066
|
* read — each use is its own IR). */
|
|
3399
4067
|
const secureExpr = () => {
|
|
3400
4068
|
const c = lowerer.lowerCondition(binding.cond);
|
|
3401
|
-
return binding.trueSecure
|
|
3402
|
-
? c
|
|
3403
|
-
: { kind: "unary", op: "!", operand: c, type: BOOL, loc };
|
|
4069
|
+
return binding.trueSecure ? c : { kind: "unary", op: "!", operand: c, type: BOOL, loc };
|
|
3404
4070
|
};
|
|
3405
4071
|
const args = expr.arguments;
|
|
3406
4072
|
if (args.length < 1 || args.length > 2) {
|
|
@@ -3421,7 +4087,13 @@ function lowerHttpClientCall(lowerer, expr, member, loc, secure = false) {
|
|
|
3421
4087
|
// A URL OBJECT is its href through the same parse — Node's own
|
|
3422
4088
|
// reading of the argument, and the serialization round-trips.
|
|
3423
4089
|
const url = t.kind === "url"
|
|
3424
|
-
? {
|
|
4090
|
+
? {
|
|
4091
|
+
kind: "libCall",
|
|
4092
|
+
fn: "url.href",
|
|
4093
|
+
args: [lowerer.lowerExpr(optsNode)],
|
|
4094
|
+
type: STRING,
|
|
4095
|
+
loc,
|
|
4096
|
+
}
|
|
3425
4097
|
: lowerer.lowerExprExpecting(optsNode, STRING);
|
|
3426
4098
|
const methodLit = { kind: "strLit", value: "GET", type: STRING, loc };
|
|
3427
4099
|
const autoEnd = boolLit(member === "get", loc);
|
|
@@ -3432,14 +4104,20 @@ function lowerHttpClientCall(lowerer, expr, member, loc, secure = false) {
|
|
|
3432
4104
|
}
|
|
3433
4105
|
const { cb } = lowerCallbackArg(lowerer, args[1], "response callbacks", 1, (p) => p.kind === "httpReq", "use (res) or ()", [HTTPREQ_T]);
|
|
3434
4106
|
const fn = isTls ? "https.requestUrlCb" : "http.requestUrlCb";
|
|
3435
|
-
return {
|
|
4107
|
+
return {
|
|
4108
|
+
kind: "libCall",
|
|
4109
|
+
fn,
|
|
4110
|
+
args: [url, methodLit, autoEnd, cb],
|
|
4111
|
+
type: HTTPCLIENTREQ_T,
|
|
4112
|
+
loc,
|
|
4113
|
+
};
|
|
3436
4114
|
}
|
|
3437
4115
|
lowerer.noLowering(t?.kind === "string"
|
|
3438
4116
|
? `a URL-string first argument through a request-function binding`
|
|
3439
4117
|
: `${member} with a non-literal options argument`, optsNode, t?.kind === "string"
|
|
3440
|
-
// Only the binding mode reaches here now: the scheme would have to
|
|
3441
|
-
|
|
3442
|
-
|
|
4118
|
+
? // Only the binding mode reaches here now: the scheme would have to
|
|
4119
|
+
// agree with a dial chosen at runtime.
|
|
4120
|
+
"call http.request / https.request directly for the URL-string form, or pass the options as an object literal"
|
|
3443
4121
|
: "pass the options as an object literal: { hostname, port, path, method, timeout?, headers? }");
|
|
3444
4122
|
}
|
|
3445
4123
|
let host = null;
|
|
@@ -3468,9 +4146,12 @@ function lowerHttpClientCall(lowerer, expr, member, loc, secure = false) {
|
|
|
3468
4146
|
// plain client has no TLS layer to configure).
|
|
3469
4147
|
if (ts.isSpreadAssignment(prop)) {
|
|
3470
4148
|
const cs = conditionalSpreadOf(prop.expression);
|
|
3471
|
-
if (cs !== null &&
|
|
4149
|
+
if (cs !== null &&
|
|
4150
|
+
cs !== "unsupported" &&
|
|
4151
|
+
cs.props.length === 1 &&
|
|
3472
4152
|
cs.props[0].name.text === "rejectUnauthorized" &&
|
|
3473
|
-
ts.isPropertyAssignment(cs.props[0]) &&
|
|
4153
|
+
ts.isPropertyAssignment(cs.props[0]) &&
|
|
4154
|
+
secureish) {
|
|
3474
4155
|
const cond = lowerer.lowerCondition(cs.cond);
|
|
3475
4156
|
const v = lowerer.lowerExpr(cs.props[0].initializer);
|
|
3476
4157
|
if (v.type.kind !== "bool") {
|
|
@@ -3512,10 +4193,17 @@ function lowerHttpClientCall(lowerer, expr, member, loc, secure = false) {
|
|
|
3512
4193
|
// option's type — a mismatch is the catchable path-annotated
|
|
3513
4194
|
// TypeError, the boundary's stance.
|
|
3514
4195
|
if (v.type.kind === "dyn") {
|
|
3515
|
-
return {
|
|
4196
|
+
return {
|
|
4197
|
+
kind: "dynCheck",
|
|
4198
|
+
value: v,
|
|
4199
|
+
type: want === "string" ? STRING : F64,
|
|
4200
|
+
loc: locOf(prop),
|
|
4201
|
+
};
|
|
3516
4202
|
}
|
|
3517
4203
|
if (v.type.kind !== want) {
|
|
3518
|
-
lowerer.noLowering(`a ${member} '${key}' option of '${lowerer.fmt(v.type)}' values`, prop, want === "string"
|
|
4204
|
+
lowerer.noLowering(`a ${member} '${key}' option of '${lowerer.fmt(v.type)}' values`, prop, want === "string"
|
|
4205
|
+
? "the option value must be a string"
|
|
4206
|
+
: "the option value must be a number");
|
|
3519
4207
|
}
|
|
3520
4208
|
return v;
|
|
3521
4209
|
};
|
|
@@ -3554,7 +4242,9 @@ function lowerHttpClientCall(lowerer, expr, member, loc, secure = false) {
|
|
|
3554
4242
|
lowerer.noLowering(`${member} with a shorthand createConnection option`, prop, "spell it out: createConnection: theDialer");
|
|
3555
4243
|
}
|
|
3556
4244
|
const v = lowerer.lowerExpr(initializer);
|
|
3557
|
-
if (v.type.kind !== "func" ||
|
|
4245
|
+
if (v.type.kind !== "func" ||
|
|
4246
|
+
v.type.params.length !== 0 ||
|
|
4247
|
+
v.type.ret.kind !== "netSocket") {
|
|
3558
4248
|
lowerer.noLowering(`a ${member} 'createConnection' option of '${lowerer.fmt(v.type)}' values`, prop, "the dialer is () => net.Socket — no arguments, returning the socket to use");
|
|
3559
4249
|
}
|
|
3560
4250
|
connCb = v;
|
|
@@ -3603,8 +4293,7 @@ function lowerHttpClientCall(lowerer, expr, member, loc, secure = false) {
|
|
|
3603
4293
|
break;
|
|
3604
4294
|
}
|
|
3605
4295
|
if (e !== null &&
|
|
3606
|
-
(e.kind === ts.SyntaxKind.NullKeyword ||
|
|
3607
|
-
(ts.isIdentifier(e) && e.text === "undefined"))) {
|
|
4296
|
+
(e.kind === ts.SyntaxKind.NullKeyword || (ts.isIdentifier(e) && e.text === "undefined"))) {
|
|
3608
4297
|
break; // the default agent: what the agent-free call compiles
|
|
3609
4298
|
}
|
|
3610
4299
|
const v = initializer !== null
|
|
@@ -3631,17 +4320,25 @@ function lowerHttpClientCall(lowerer, expr, member, loc, secure = false) {
|
|
|
3631
4320
|
// non-literal headers record cannot be checked for one, so the combo
|
|
3632
4321
|
// fences instead of double-sending.
|
|
3633
4322
|
if (headers === null) {
|
|
3634
|
-
headers = {
|
|
4323
|
+
headers = {
|
|
4324
|
+
kind: "arrayLit",
|
|
4325
|
+
elems: [strLit("Connection", loc), strLit("close", loc)],
|
|
4326
|
+
type: arrayOf(STRING),
|
|
4327
|
+
loc,
|
|
4328
|
+
};
|
|
3635
4329
|
}
|
|
3636
4330
|
else if (headers.kind === "arrayLit") {
|
|
3637
4331
|
const hasConnection = headers.elems.some((el, i) => i % 2 === 0 && el.kind === "strLit" && el.value.toLowerCase() === "connection");
|
|
3638
4332
|
if (!hasConnection) {
|
|
3639
|
-
headers = {
|
|
4333
|
+
headers = {
|
|
4334
|
+
...headers,
|
|
4335
|
+
elems: [...headers.elems, strLit("Connection", loc), strLit("close", loc)],
|
|
4336
|
+
};
|
|
3640
4337
|
}
|
|
3641
4338
|
}
|
|
3642
4339
|
else {
|
|
3643
4340
|
lowerer.noLowering(`${member} with agent: false and a non-literal headers record`, agentClose, "agent: false lowers by injecting Connection: close into a LITERAL headers object — " +
|
|
3644
|
-
|
|
4341
|
+
'add connection: "close" to the record instead, or write the headers inline');
|
|
3645
4342
|
}
|
|
3646
4343
|
}
|
|
3647
4344
|
if (connCb !== null && (host !== null || port !== null)) {
|
|
@@ -3660,10 +4357,19 @@ function lowerHttpClientCall(lowerer, expr, member, loc, secure = false) {
|
|
|
3660
4357
|
// TLS arm, 80 on the plain one — exactly each client's own default.
|
|
3661
4358
|
// With an AGENT the sentinel -1 says "no port option": the runtime
|
|
3662
4359
|
// consults the agent's (settable) defaultPort first, Node's merge.
|
|
3663
|
-
port ??=
|
|
3664
|
-
|
|
3665
|
-
|
|
3666
|
-
|
|
4360
|
+
port ??=
|
|
4361
|
+
binding !== null
|
|
4362
|
+
? {
|
|
4363
|
+
kind: "ternary",
|
|
4364
|
+
cond: secureExpr(),
|
|
4365
|
+
then: numLit(443, loc),
|
|
4366
|
+
else_: numLit(80, loc),
|
|
4367
|
+
type: F64,
|
|
4368
|
+
loc,
|
|
4369
|
+
}
|
|
4370
|
+
: agentVal !== null
|
|
4371
|
+
? numLit(-1, loc)
|
|
4372
|
+
: numLit(secure === true ? 443 : 80, loc);
|
|
3667
4373
|
path ??= strLit("/", loc);
|
|
3668
4374
|
method ??= strLit("GET", loc);
|
|
3669
4375
|
timeout ??= numLit(0, loc);
|
|
@@ -3675,7 +4381,13 @@ function lowerHttpClientCall(lowerer, expr, member, loc, secure = false) {
|
|
|
3675
4381
|
return { kind: "libCall", fn: "http.requestConn", args: base, type: HTTPCLIENTREQ_T, loc };
|
|
3676
4382
|
}
|
|
3677
4383
|
const { cb } = lowerCallbackArg(lowerer, args[1], "response callbacks", 1, (p) => p.kind === "httpReq", "use (res) or ()", [HTTPREQ_T]);
|
|
3678
|
-
return {
|
|
4384
|
+
return {
|
|
4385
|
+
kind: "libCall",
|
|
4386
|
+
fn: "http.requestConnCb",
|
|
4387
|
+
args: [...base, cb],
|
|
4388
|
+
type: HTTPCLIENTREQ_T,
|
|
4389
|
+
loc,
|
|
4390
|
+
};
|
|
3679
4391
|
}
|
|
3680
4392
|
const base = [host, port, path, method, timeout, headers, autoEnd];
|
|
3681
4393
|
if (secureish) {
|
|
@@ -3688,15 +4400,27 @@ function lowerHttpClientCall(lowerer, expr, member, loc, secure = false) {
|
|
|
3688
4400
|
if (binding !== null)
|
|
3689
4401
|
base.unshift(secureExpr());
|
|
3690
4402
|
if (args.length === 1) {
|
|
3691
|
-
const fn = binding !== null
|
|
3692
|
-
|
|
3693
|
-
|
|
4403
|
+
const fn = binding !== null
|
|
4404
|
+
? "https.requestFn"
|
|
4405
|
+
: secure === true
|
|
4406
|
+
? agentVal !== null
|
|
4407
|
+
? "https.requestAgent"
|
|
4408
|
+
: "https.request"
|
|
4409
|
+
: agentVal !== null
|
|
4410
|
+
? "http.requestAgent"
|
|
4411
|
+
: "http.request";
|
|
3694
4412
|
return { kind: "libCall", fn, args: base, type: HTTPCLIENTREQ_T, loc };
|
|
3695
4413
|
}
|
|
3696
4414
|
const { cb } = lowerCallbackArg(lowerer, args[1], "response callbacks", 1, (p) => p.kind === "httpReq", "use (res) or ()", [HTTPREQ_T]);
|
|
3697
|
-
const fn = binding !== null
|
|
3698
|
-
|
|
3699
|
-
|
|
4415
|
+
const fn = binding !== null
|
|
4416
|
+
? "https.requestFnCb"
|
|
4417
|
+
: secure === true
|
|
4418
|
+
? agentVal !== null
|
|
4419
|
+
? "https.requestAgentCb"
|
|
4420
|
+
: "https.requestCb"
|
|
4421
|
+
: agentVal !== null
|
|
4422
|
+
? "http.requestAgentCb"
|
|
4423
|
+
: "http.requestCb";
|
|
3700
4424
|
return { kind: "libCall", fn, args: [...base, cb], type: HTTPCLIENTREQ_T, loc };
|
|
3701
4425
|
}
|
|
3702
4426
|
/** The headers option of http.request: an object literal with literal
|
|
@@ -3776,7 +4500,13 @@ function lowerHttpClientMethodCall(lowerer, call, access) {
|
|
|
3776
4500
|
const receiver = coerceToHandle(lowerer, access.expression, HTTPCLIENTREQ_T);
|
|
3777
4501
|
const header = lowerer.lowerExprExpecting(args[0], STRING);
|
|
3778
4502
|
const value = lowerer.lowerExprExpecting(args[1], STRING);
|
|
3779
|
-
return {
|
|
4503
|
+
return {
|
|
4504
|
+
kind: "libCall",
|
|
4505
|
+
fn: "http.clientSetHeader",
|
|
4506
|
+
args: [receiver, header, value],
|
|
4507
|
+
type: VOID,
|
|
4508
|
+
loc,
|
|
4509
|
+
};
|
|
3780
4510
|
}
|
|
3781
4511
|
if (name === "getHeader" || name === "hasHeader" || name === "removeHeader") {
|
|
3782
4512
|
if (name === "removeHeader")
|
|
@@ -3785,8 +4515,11 @@ function lowerHttpClientMethodCall(lowerer, call, access) {
|
|
|
3785
4515
|
lowerer.noLowering(`request.${name} arguments`, call, `pass one header name`);
|
|
3786
4516
|
const receiver = coerceToHandle(lowerer, access.expression, HTTPCLIENTREQ_T);
|
|
3787
4517
|
const header = lowerer.lowerExprExpecting(args[0], STRING);
|
|
3788
|
-
const fn = name === "getHeader"
|
|
3789
|
-
|
|
4518
|
+
const fn = name === "getHeader"
|
|
4519
|
+
? "http.clientGetHeader"
|
|
4520
|
+
: name === "hasHeader"
|
|
4521
|
+
? "http.clientHasHeader"
|
|
4522
|
+
: "http.clientRemoveHeader";
|
|
3790
4523
|
const type = name === "getHeader" ? lowerer.envValueType() : name === "hasHeader" ? BOOL : VOID;
|
|
3791
4524
|
return { kind: "libCall", fn, args: [receiver, header], type, loc };
|
|
3792
4525
|
}
|
|
@@ -3794,17 +4527,29 @@ function lowerHttpClientMethodCall(lowerer, call, access) {
|
|
|
3794
4527
|
if (args.length !== 0)
|
|
3795
4528
|
lowerer.noLowering(`request.${name} arguments`, call, `${name}() takes no arguments`);
|
|
3796
4529
|
const receiver = coerceToHandle(lowerer, access.expression, HTTPCLIENTREQ_T);
|
|
3797
|
-
const fn = name === "getHeaderNames"
|
|
3798
|
-
|
|
3799
|
-
|
|
4530
|
+
const fn = name === "getHeaderNames"
|
|
4531
|
+
? "http.clientGetHeaderNames"
|
|
4532
|
+
: name === "getRawHeaderNames"
|
|
4533
|
+
? "http.clientGetRawHeaderNames"
|
|
4534
|
+
: "http.clientGetHeaders";
|
|
4535
|
+
return {
|
|
4536
|
+
kind: "libCall",
|
|
4537
|
+
fn,
|
|
4538
|
+
args: [receiver],
|
|
4539
|
+
type: name === "getHeaders" ? DYN : arrayOf(STRING),
|
|
4540
|
+
loc,
|
|
4541
|
+
};
|
|
3800
4542
|
}
|
|
3801
4543
|
if (name === "flushHeaders" || name === "cork" || name === "uncork") {
|
|
3802
4544
|
requireStatementPosition(lowerer, call, `request.${name}()`);
|
|
3803
4545
|
if (args.length !== 0)
|
|
3804
4546
|
lowerer.noLowering(`request.${name} with arguments`, call, `${name}() takes no arguments`);
|
|
3805
4547
|
const receiver = coerceToHandle(lowerer, access.expression, HTTPCLIENTREQ_T);
|
|
3806
|
-
const fn = name === "flushHeaders"
|
|
3807
|
-
|
|
4548
|
+
const fn = name === "flushHeaders"
|
|
4549
|
+
? "http.clientFlushHeaders"
|
|
4550
|
+
: name === "cork"
|
|
4551
|
+
? "http.clientCork"
|
|
4552
|
+
: "http.clientUncork";
|
|
3808
4553
|
return { kind: "libCall", fn, args: [receiver], type: VOID, loc };
|
|
3809
4554
|
}
|
|
3810
4555
|
if (name === "setNoDelay") {
|
|
@@ -3813,7 +4558,13 @@ function lowerHttpClientMethodCall(lowerer, call, access) {
|
|
|
3813
4558
|
lowerer.noLowering("request.setNoDelay arguments", call, "pass an optional boolean");
|
|
3814
4559
|
const receiver = coerceToHandle(lowerer, access.expression, HTTPCLIENTREQ_T);
|
|
3815
4560
|
const enable = args.length === 0 ? boolLit(true, loc) : lowerer.lowerExprExpecting(args[0], BOOL);
|
|
3816
|
-
return {
|
|
4561
|
+
return {
|
|
4562
|
+
kind: "libCall",
|
|
4563
|
+
fn: "http.clientSetNoDelay",
|
|
4564
|
+
args: [receiver, enable],
|
|
4565
|
+
type: VOID,
|
|
4566
|
+
loc,
|
|
4567
|
+
};
|
|
3817
4568
|
}
|
|
3818
4569
|
if (name === "setSocketKeepAlive") {
|
|
3819
4570
|
requireStatementPosition(lowerer, call, "request.setSocketKeepAlive(...)");
|
|
@@ -3822,7 +4573,13 @@ function lowerHttpClientMethodCall(lowerer, call, access) {
|
|
|
3822
4573
|
const receiver = coerceToHandle(lowerer, access.expression, HTTPCLIENTREQ_T);
|
|
3823
4574
|
const enable = args.length === 0 ? boolLit(true, loc) : lowerer.lowerExprExpecting(args[0], BOOL);
|
|
3824
4575
|
const delay = args.length < 2 ? numLit(0, loc) : lowerer.lowerExprExpecting(args[1], F64);
|
|
3825
|
-
return {
|
|
4576
|
+
return {
|
|
4577
|
+
kind: "libCall",
|
|
4578
|
+
fn: "http.clientSetSocketKeepAlive",
|
|
4579
|
+
args: [receiver, enable, delay],
|
|
4580
|
+
type: VOID,
|
|
4581
|
+
loc,
|
|
4582
|
+
};
|
|
3826
4583
|
}
|
|
3827
4584
|
if (name === "setTimeout") {
|
|
3828
4585
|
if (args.length < 1 || args.length > 2)
|
|
@@ -3844,13 +4601,21 @@ function lowerHttpClientMethodCall(lowerer, call, access) {
|
|
|
3844
4601
|
lowerer.noLowering("request.addTrailers argument count", call, "pass one trailer object or pair-list literal");
|
|
3845
4602
|
const receiver = coerceToHandle(lowerer, access.expression, HTTPCLIENTREQ_T);
|
|
3846
4603
|
const pairs = lowerHttpTrailersOption(lowerer, args[0]);
|
|
3847
|
-
return {
|
|
4604
|
+
return {
|
|
4605
|
+
kind: "libCall",
|
|
4606
|
+
fn: "http.clientAddTrailers",
|
|
4607
|
+
args: [receiver, pairs],
|
|
4608
|
+
type: VOID,
|
|
4609
|
+
loc,
|
|
4610
|
+
};
|
|
3848
4611
|
}
|
|
3849
4612
|
if (name === "write" || name === "end") {
|
|
3850
4613
|
requireStatementPosition(lowerer, call, `request.${name}(...)`);
|
|
3851
4614
|
const minArgs = name === "write" ? 1 : 0;
|
|
3852
4615
|
if (args.length < minArgs || args.length > 1) {
|
|
3853
|
-
lowerer.noLowering(`${name} with ${args.length} arguments`, call, name === "write"
|
|
4616
|
+
lowerer.noLowering(`${name} with ${args.length} arguments`, call, name === "write"
|
|
4617
|
+
? "the supported form is write(data)"
|
|
4618
|
+
: "the supported forms are end() and end(data)");
|
|
3854
4619
|
}
|
|
3855
4620
|
const receiver = lowerer.lowerExpr(access.expression);
|
|
3856
4621
|
if (args.length === 0) {
|
|
@@ -3878,7 +4643,13 @@ function lowerHttpClientMethodCall(lowerer, call, access) {
|
|
|
3878
4643
|
lowerer.noLowering(`${name} with ${args.length} arguments`, call, `${name}() takes no arguments here`);
|
|
3879
4644
|
}
|
|
3880
4645
|
const receiver = lowerer.lowerExpr(access.expression);
|
|
3881
|
-
return {
|
|
4646
|
+
return {
|
|
4647
|
+
kind: "libCall",
|
|
4648
|
+
fn: name === "destroy" ? "http.clientDestroy" : "http.clientAbort",
|
|
4649
|
+
args: [receiver],
|
|
4650
|
+
type: VOID,
|
|
4651
|
+
loc,
|
|
4652
|
+
};
|
|
3882
4653
|
}
|
|
3883
4654
|
if ((name === "on" || name === "once" || name === "addListener") && args.length === 2) {
|
|
3884
4655
|
requireStatementPosition(lowerer, call, `request.${name}(...)`);
|
|
@@ -3888,21 +4659,43 @@ function lowerHttpClientMethodCall(lowerer, call, access) {
|
|
|
3888
4659
|
const receiver = lowerer.lowerExpr(access.expression);
|
|
3889
4660
|
if (event === "response") {
|
|
3890
4661
|
const { cb } = lowerCallbackArg(lowerer, args[1], "response listeners", 1, (p) => p.kind === "httpReq", "use (res) or ()", [HTTPREQ_T]);
|
|
3891
|
-
return {
|
|
4662
|
+
return {
|
|
4663
|
+
kind: "libCall",
|
|
4664
|
+
fn: "http.clientOnResponse",
|
|
4665
|
+
args: [receiver, cb, once],
|
|
4666
|
+
type: VOID,
|
|
4667
|
+
loc,
|
|
4668
|
+
};
|
|
3892
4669
|
}
|
|
3893
4670
|
if (event === "socket") {
|
|
3894
4671
|
const { cb } = lowerCallbackArg(lowerer, args[1], "socket listeners", 1, (p) => p.kind === "netSocket", "use (socket) or ()", [NETSOCKET_T]);
|
|
3895
|
-
return {
|
|
4672
|
+
return {
|
|
4673
|
+
kind: "libCall",
|
|
4674
|
+
fn: "http.clientOnSocket",
|
|
4675
|
+
args: [receiver, cb, once],
|
|
4676
|
+
type: VOID,
|
|
4677
|
+
loc,
|
|
4678
|
+
};
|
|
3896
4679
|
}
|
|
3897
4680
|
if (event === "error") {
|
|
3898
4681
|
const { cb } = lowerCallbackArg(lowerer, args[1], "error listeners", 1, (p) => p.kind === "object" && p.className === "%Error", "use (err) or ()", [ERROR_T]);
|
|
3899
|
-
return {
|
|
4682
|
+
return {
|
|
4683
|
+
kind: "libCall",
|
|
4684
|
+
fn: "http.clientOnError",
|
|
4685
|
+
args: [receiver, cb, once],
|
|
4686
|
+
type: VOID,
|
|
4687
|
+
loc,
|
|
4688
|
+
};
|
|
3900
4689
|
}
|
|
3901
4690
|
if (event === "timeout" || event === "close" || event === "finish" || event === "abort") {
|
|
3902
4691
|
const { cb } = lowerCallbackArg(lowerer, args[1], `${event} listeners`, 0, () => false, "use ()", []);
|
|
3903
|
-
const fn = event === "timeout"
|
|
3904
|
-
|
|
3905
|
-
|
|
4692
|
+
const fn = event === "timeout"
|
|
4693
|
+
? "http.clientOnTimeout"
|
|
4694
|
+
: event === "close"
|
|
4695
|
+
? "http.clientOnClose"
|
|
4696
|
+
: event === "abort"
|
|
4697
|
+
? "http.clientOnAbort"
|
|
4698
|
+
: "http.clientOnFinish";
|
|
3906
4699
|
return { kind: "libCall", fn, args: [receiver, cb, once], type: VOID, loc };
|
|
3907
4700
|
}
|
|
3908
4701
|
if (event === "upgrade") {
|
|
@@ -3922,7 +4715,13 @@ function lowerHttpClientMethodCall(lowerer, call, access) {
|
|
|
3922
4715
|
(p2 !== undefined && !(p2.kind === "bytes" && p2.elem === "u8"))) {
|
|
3923
4716
|
lowerer.unsupported("SC1090", args[1], "upgrade listeners whose parameters are not (res: IncomingMessage, socket: Socket, head: Buffer)");
|
|
3924
4717
|
}
|
|
3925
|
-
return {
|
|
4718
|
+
return {
|
|
4719
|
+
kind: "libCall",
|
|
4720
|
+
fn: "http.clientOnUpgrade",
|
|
4721
|
+
args: [receiver, cb, once],
|
|
4722
|
+
type: VOID,
|
|
4723
|
+
loc,
|
|
4724
|
+
};
|
|
3926
4725
|
}
|
|
3927
4726
|
lowerer.noLowering(`request.${name}(${event === null ? "non-literal event" : `"${event}"`}, ...)`, args[0], '"response", "socket", "upgrade", "error", "timeout", "finish", "abort", and "close" are the supported request events (as literals)');
|
|
3928
4727
|
}
|
|
@@ -3958,7 +4757,8 @@ export function lowerSocketInstanceOf(lowerer, expr, loc) {
|
|
|
3958
4757
|
const isNetSocketRef = (ts.isPropertyAccessExpression(rhs) &&
|
|
3959
4758
|
rhs.name.text === "Socket" &&
|
|
3960
4759
|
lowerer.builtinMemberOf(rhs)?.module === "net") ||
|
|
3961
|
-
(ts.isIdentifier(rhs) &&
|
|
4760
|
+
(ts.isIdentifier(rhs) &&
|
|
4761
|
+
lowerer.builtinImportOf(rhs)?.module === "net" &&
|
|
3962
4762
|
lowerer.builtinImportOf(rhs)?.member === "Socket");
|
|
3963
4763
|
if (!isNetSocketRef)
|
|
3964
4764
|
return null;
|
|
@@ -3972,15 +4772,25 @@ export function lowerSocketInstanceOf(lowerer, expr, loc) {
|
|
|
3972
4772
|
const left = lowerer.lowerExpr(expr.left);
|
|
3973
4773
|
if (left.type.kind !== "union" || left.type.unionId !== leftT.unionId)
|
|
3974
4774
|
return null;
|
|
3975
|
-
return {
|
|
4775
|
+
return {
|
|
4776
|
+
kind: "unionIsTag",
|
|
4777
|
+
unionId: leftT.unionId,
|
|
4778
|
+
tag,
|
|
4779
|
+
negated: false,
|
|
4780
|
+
value: left,
|
|
4781
|
+
type: BOOL,
|
|
4782
|
+
loc,
|
|
4783
|
+
};
|
|
3976
4784
|
}
|
|
3977
4785
|
/** True when `node` reads `.headers` off an IncomingMessage — the
|
|
3978
4786
|
* receiver shape of both header-read forms. */
|
|
3979
4787
|
function httpReqFieldCollection(lowerer, node) {
|
|
3980
4788
|
if (ts.isPropertyAccessExpression(node) &&
|
|
3981
4789
|
!node.questionDotToken &&
|
|
3982
|
-
(node.name.text === "headers" ||
|
|
3983
|
-
node.name.text === "
|
|
4790
|
+
(node.name.text === "headers" ||
|
|
4791
|
+
node.name.text === "trailers" ||
|
|
4792
|
+
node.name.text === "headersDistinct" ||
|
|
4793
|
+
node.name.text === "trailersDistinct") &&
|
|
3984
4794
|
lowerer.mapTypeOf(lowerer.typeOf(node.expression))?.kind === "httpReq" &&
|
|
3985
4795
|
lowerer.isStdlibMember(node))
|
|
3986
4796
|
return node.name.text;
|
|
@@ -4002,11 +4812,17 @@ export function lowerHttpHeadersElement(lowerer, expr) {
|
|
|
4002
4812
|
const receiver = lowerer.lowerExpr(recv);
|
|
4003
4813
|
return {
|
|
4004
4814
|
kind: "libCall",
|
|
4005
|
-
fn: collection === "headers"
|
|
4006
|
-
|
|
4007
|
-
|
|
4815
|
+
fn: collection === "headers"
|
|
4816
|
+
? "http.reqHeader"
|
|
4817
|
+
: collection === "trailers"
|
|
4818
|
+
? "http.reqTrailer"
|
|
4819
|
+
: collection === "headersDistinct"
|
|
4820
|
+
? "http.reqHeaderValues"
|
|
4821
|
+
: "http.reqTrailerValues",
|
|
4008
4822
|
args: [receiver, key],
|
|
4009
|
-
type: collection.endsWith("Distinct")
|
|
4823
|
+
type: collection.endsWith("Distinct")
|
|
4824
|
+
? lowerer.withUndefinedArm(arrayOf(STRING))
|
|
4825
|
+
: lowerer.envValueType(),
|
|
4010
4826
|
loc: locOf(expr),
|
|
4011
4827
|
};
|
|
4012
4828
|
}
|
|
@@ -4029,7 +4845,13 @@ function lowerHttpReqMethodCall(lowerer, call, access) {
|
|
|
4029
4845
|
if (args.length === 1)
|
|
4030
4846
|
return { kind: "libCall", fn: "http.reqSetTimeout", args: [receiver, ms], type: VOID, loc };
|
|
4031
4847
|
const { cb } = lowerCallbackArg(lowerer, args[1], "message timeout callbacks", 0, () => false, "use ()", []);
|
|
4032
|
-
return {
|
|
4848
|
+
return {
|
|
4849
|
+
kind: "libCall",
|
|
4850
|
+
fn: "http.reqSetTimeoutCb",
|
|
4851
|
+
args: [receiver, ms, cb],
|
|
4852
|
+
type: VOID,
|
|
4853
|
+
loc,
|
|
4854
|
+
};
|
|
4033
4855
|
}
|
|
4034
4856
|
if (name === "resume" || name === "destroy") {
|
|
4035
4857
|
requireStatementPosition(lowerer, call, `req.${name}()`);
|
|
@@ -4062,9 +4884,12 @@ function lowerHttpReqMethodCall(lowerer, call, access) {
|
|
|
4062
4884
|
}
|
|
4063
4885
|
const receiver = coerceToHandle(lowerer, access.expression, HTTPREQ_T);
|
|
4064
4886
|
const dst = lowerer.lowerExpr(args[0]);
|
|
4065
|
-
const fn = dst.type.kind === "httpRes"
|
|
4066
|
-
|
|
4067
|
-
|
|
4887
|
+
const fn = dst.type.kind === "httpRes"
|
|
4888
|
+
? "http.reqPipeRes"
|
|
4889
|
+
: dst.type.kind === "httpClientReq"
|
|
4890
|
+
? "http.reqPipeClient"
|
|
4891
|
+
: dst.type.kind === "netSocket"
|
|
4892
|
+
? "http.reqPipeSock"
|
|
4068
4893
|
: null;
|
|
4069
4894
|
if (fn === null) {
|
|
4070
4895
|
lowerer.noLowering(`pipe into '${lowerer.fmt(dst.type)}' destinations`, args[0], "an IncomingMessage pipes into a ServerResponse, a ClientRequest, or a Socket");
|
|
@@ -4087,17 +4912,35 @@ function lowerHttpReqMethodCall(lowerer, call, access) {
|
|
|
4087
4912
|
}
|
|
4088
4913
|
if (event === "error") {
|
|
4089
4914
|
const { cb } = lowerCallbackArg(lowerer, args[1], "error listeners", 1, (p) => p.kind === "object" && p.className === "%Error", "use (err) or ()", [ERROR_T]);
|
|
4090
|
-
return {
|
|
4915
|
+
return {
|
|
4916
|
+
kind: "libCall",
|
|
4917
|
+
fn: "http.reqOnError",
|
|
4918
|
+
args: [receiver, cb, once],
|
|
4919
|
+
type: VOID,
|
|
4920
|
+
loc,
|
|
4921
|
+
};
|
|
4091
4922
|
}
|
|
4092
4923
|
if (event === "close") {
|
|
4093
4924
|
const { cb } = lowerCallbackArg(lowerer, args[1], "close listeners", 0, () => false, "use ()", []);
|
|
4094
|
-
return {
|
|
4925
|
+
return {
|
|
4926
|
+
kind: "libCall",
|
|
4927
|
+
fn: "http.reqOnClose",
|
|
4928
|
+
args: [receiver, cb, once],
|
|
4929
|
+
type: VOID,
|
|
4930
|
+
loc,
|
|
4931
|
+
};
|
|
4095
4932
|
}
|
|
4096
4933
|
if (event === "aborted") {
|
|
4097
4934
|
// The h2 compat event (Http2ServerRequest 'aborted'); an http/1
|
|
4098
4935
|
// request registers too and never fires — the parser lane's story.
|
|
4099
4936
|
const { cb } = lowerCallbackArg(lowerer, args[1], "aborted listeners", 0, () => false, "use ()", []);
|
|
4100
|
-
return {
|
|
4937
|
+
return {
|
|
4938
|
+
kind: "libCall",
|
|
4939
|
+
fn: "http.reqOnAborted",
|
|
4940
|
+
args: [receiver, cb, once],
|
|
4941
|
+
type: VOID,
|
|
4942
|
+
loc,
|
|
4943
|
+
};
|
|
4101
4944
|
}
|
|
4102
4945
|
lowerer.noLowering(`req.${name}(${event === null ? "non-literal event" : `"${event}"`}, ...)`, args[0], '"data", "end", "error", "close", and "aborted" are the supported request events (as literals)');
|
|
4103
4946
|
}
|
|
@@ -4137,7 +4980,13 @@ function lowerHttpResMethodCall(lowerer, call, access) {
|
|
|
4137
4980
|
if (name !== "writeEarlyHints") {
|
|
4138
4981
|
if (args.length !== 0)
|
|
4139
4982
|
lowerer.noLowering(`res.${name} callback`, call, `${name}() supports no callback here`);
|
|
4140
|
-
return {
|
|
4983
|
+
return {
|
|
4984
|
+
kind: "libCall",
|
|
4985
|
+
fn: name === "writeContinue" ? "http.resWriteContinue" : "http.resWriteProcessing",
|
|
4986
|
+
args: [receiver],
|
|
4987
|
+
type: VOID,
|
|
4988
|
+
loc,
|
|
4989
|
+
};
|
|
4141
4990
|
}
|
|
4142
4991
|
if (args.length !== 1)
|
|
4143
4992
|
lowerer.noLowering("res.writeEarlyHints arguments", call, "pass one header object or Record<string, string> without a callback");
|
|
@@ -4169,23 +5018,41 @@ function lowerHttpResMethodCall(lowerer, call, access) {
|
|
|
4169
5018
|
}
|
|
4170
5019
|
pairs = { kind: "call", callee: helper, args: [value], type: arrayOf(STRING), loc };
|
|
4171
5020
|
}
|
|
4172
|
-
return {
|
|
5021
|
+
return {
|
|
5022
|
+
kind: "libCall",
|
|
5023
|
+
fn: "http.resWriteEarlyHints",
|
|
5024
|
+
args: [receiver, pairs],
|
|
5025
|
+
type: VOID,
|
|
5026
|
+
loc,
|
|
5027
|
+
};
|
|
4173
5028
|
}
|
|
4174
5029
|
if (name === "getHeaderNames" || name === "getRawHeaderNames" || name === "getHeaders") {
|
|
4175
5030
|
if (args.length !== 0)
|
|
4176
5031
|
lowerer.noLowering(`res.${name} arguments`, call, `${name}() takes no arguments`);
|
|
4177
5032
|
const receiver = coerceToHandle(lowerer, access.expression, HTTPRES_T);
|
|
4178
|
-
const fn = name === "getHeaderNames"
|
|
4179
|
-
|
|
4180
|
-
|
|
5033
|
+
const fn = name === "getHeaderNames"
|
|
5034
|
+
? "http.resGetHeaderNames"
|
|
5035
|
+
: name === "getRawHeaderNames"
|
|
5036
|
+
? "http.resGetRawHeaderNames"
|
|
5037
|
+
: "http.resGetHeaders";
|
|
5038
|
+
return {
|
|
5039
|
+
kind: "libCall",
|
|
5040
|
+
fn,
|
|
5041
|
+
args: [receiver],
|
|
5042
|
+
type: name === "getHeaders" ? DYN : arrayOf(STRING),
|
|
5043
|
+
loc,
|
|
5044
|
+
};
|
|
4181
5045
|
}
|
|
4182
5046
|
if (name === "flushHeaders" || name === "cork" || name === "uncork") {
|
|
4183
5047
|
requireStatementPosition(lowerer, call, `res.${name}()`);
|
|
4184
5048
|
if (args.length !== 0)
|
|
4185
5049
|
lowerer.noLowering(`res.${name} with arguments`, call, `${name}() takes no arguments`);
|
|
4186
5050
|
const receiver = coerceToHandle(lowerer, access.expression, HTTPRES_T);
|
|
4187
|
-
const fn = name === "flushHeaders"
|
|
4188
|
-
|
|
5051
|
+
const fn = name === "flushHeaders"
|
|
5052
|
+
? "http.resFlushHeaders"
|
|
5053
|
+
: name === "cork"
|
|
5054
|
+
? "http.resCork"
|
|
5055
|
+
: "http.resUncork";
|
|
4189
5056
|
return { kind: "libCall", fn, args: [receiver], type: VOID, loc };
|
|
4190
5057
|
}
|
|
4191
5058
|
if (name === "addTrailers") {
|
|
@@ -4224,7 +5091,13 @@ function lowerHttpResMethodCall(lowerer, call, access) {
|
|
|
4224
5091
|
if (value.type.kind !== "string") {
|
|
4225
5092
|
lowerer.noLowering(`setHeader with a '${lowerer.fmt(value.type)}' value`, args[1], "header values are strings or numbers here");
|
|
4226
5093
|
}
|
|
4227
|
-
return {
|
|
5094
|
+
return {
|
|
5095
|
+
kind: "libCall",
|
|
5096
|
+
fn: "http.resSetHeader",
|
|
5097
|
+
args: [receiver, header, value],
|
|
5098
|
+
type: VOID,
|
|
5099
|
+
loc,
|
|
5100
|
+
};
|
|
4228
5101
|
}
|
|
4229
5102
|
if (name === "writeHead") {
|
|
4230
5103
|
if (args.length < 1 || args.length > 3) {
|
|
@@ -4339,11 +5212,14 @@ function lowerHttpResMethodCall(lowerer, call, access) {
|
|
|
4339
5212
|
const { cb } = lowerCallbackArg(lowerer, args[1], "end callbacks", 0, () => false, "use ()", []);
|
|
4340
5213
|
cbArg = cb;
|
|
4341
5214
|
}
|
|
4342
|
-
else if (name === "end" &&
|
|
5215
|
+
else if (name === "end" &&
|
|
5216
|
+
args.length === 1 &&
|
|
4343
5217
|
lowerer.mapTypeOf(lowerer.typeOf(args[0]))?.kind !== "string" &&
|
|
4344
5218
|
lowerer.mapTypeOf(lowerer.typeOf(args[0]))?.kind !== "bytes") {
|
|
4345
5219
|
const probe = lowerer.typeOf(args[0]);
|
|
4346
|
-
if (lowerer.mapTypeOf(probe)?.kind === "func" ||
|
|
5220
|
+
if (lowerer.mapTypeOf(probe)?.kind === "func" ||
|
|
5221
|
+
lowerer.mapTypeOf(probe) === null ||
|
|
5222
|
+
lowerer.mapTypeOf(probe)?.kind === "dyn") {
|
|
4347
5223
|
const { cb } = lowerCallbackArg(lowerer, args[0], "end callbacks", 0, () => false, "use ()", []);
|
|
4348
5224
|
cbArg = cb;
|
|
4349
5225
|
dataNode = undefined;
|
|
@@ -4361,16 +5237,36 @@ function lowerHttpResMethodCall(lowerer, call, access) {
|
|
|
4361
5237
|
name: helper,
|
|
4362
5238
|
params,
|
|
4363
5239
|
returnType: VOID,
|
|
4364
|
-
locals: params.map((p) => ({
|
|
5240
|
+
locals: params.map((p) => ({
|
|
5241
|
+
id: p.localId,
|
|
5242
|
+
name: p.name,
|
|
5243
|
+
type: p.type,
|
|
5244
|
+
mutable: false,
|
|
5245
|
+
})),
|
|
4365
5246
|
body: [
|
|
4366
5247
|
{
|
|
4367
5248
|
kind: "exprStmt",
|
|
4368
|
-
expr: {
|
|
5249
|
+
expr: {
|
|
5250
|
+
kind: "libCall",
|
|
5251
|
+
fn: "http.resOnFinish",
|
|
5252
|
+
args: [
|
|
5253
|
+
varRef(params[0].localId, params[0].type, loc),
|
|
5254
|
+
varRef(params[all.length - 1].localId, params[all.length - 1].type, loc),
|
|
5255
|
+
],
|
|
5256
|
+
type: VOID,
|
|
5257
|
+
loc,
|
|
5258
|
+
},
|
|
4369
5259
|
loc,
|
|
4370
5260
|
},
|
|
4371
5261
|
{
|
|
4372
5262
|
kind: "exprStmt",
|
|
4373
|
-
expr: {
|
|
5263
|
+
expr: {
|
|
5264
|
+
kind: "libCall",
|
|
5265
|
+
fn,
|
|
5266
|
+
args: callArgs.map((_, i) => varRef(params[i].localId, params[i].type, loc)),
|
|
5267
|
+
type: VOID,
|
|
5268
|
+
loc,
|
|
5269
|
+
},
|
|
4374
5270
|
loc,
|
|
4375
5271
|
},
|
|
4376
5272
|
],
|
|
@@ -4420,12 +5316,30 @@ function lowerHttpResMethodCall(lowerer, call, access) {
|
|
|
4420
5316
|
const receiver = coerceToHandle(lowerer, access.expression, HTTPRES_T);
|
|
4421
5317
|
const header = lowerer.lowerExprExpecting(args[0], STRING);
|
|
4422
5318
|
if (name === "getHeader") {
|
|
4423
|
-
return {
|
|
5319
|
+
return {
|
|
5320
|
+
kind: "libCall",
|
|
5321
|
+
fn: "http.resGetHeader",
|
|
5322
|
+
args: [receiver, header],
|
|
5323
|
+
type: lowerer.envValueType(),
|
|
5324
|
+
loc,
|
|
5325
|
+
};
|
|
4424
5326
|
}
|
|
4425
5327
|
if (name === "hasHeader") {
|
|
4426
|
-
return {
|
|
5328
|
+
return {
|
|
5329
|
+
kind: "libCall",
|
|
5330
|
+
fn: "http.resHasHeader",
|
|
5331
|
+
args: [receiver, header],
|
|
5332
|
+
type: BOOL,
|
|
5333
|
+
loc,
|
|
5334
|
+
};
|
|
4427
5335
|
}
|
|
4428
|
-
return {
|
|
5336
|
+
return {
|
|
5337
|
+
kind: "libCall",
|
|
5338
|
+
fn: "http.resRemoveHeader",
|
|
5339
|
+
args: [receiver, header],
|
|
5340
|
+
type: VOID,
|
|
5341
|
+
loc,
|
|
5342
|
+
};
|
|
4429
5343
|
}
|
|
4430
5344
|
if (name === "destroy") {
|
|
4431
5345
|
requireStatementPosition(lowerer, call, "res.destroy()");
|
|
@@ -4443,7 +5357,13 @@ function lowerHttpResMethodCall(lowerer, call, access) {
|
|
|
4443
5357
|
const receiver = coerceToHandle(lowerer, access.expression, HTTPRES_T);
|
|
4444
5358
|
if (event === "close") {
|
|
4445
5359
|
const { cb } = lowerCallbackArg(lowerer, args[1], "close listeners", 0, () => false, "use ()", []);
|
|
4446
|
-
return {
|
|
5360
|
+
return {
|
|
5361
|
+
kind: "libCall",
|
|
5362
|
+
fn: "http.resOnClose",
|
|
5363
|
+
args: [receiver, cb, once],
|
|
5364
|
+
type: VOID,
|
|
5365
|
+
loc,
|
|
5366
|
+
};
|
|
4447
5367
|
}
|
|
4448
5368
|
if (event === "finish") {
|
|
4449
5369
|
const { cb } = lowerCallbackArg(lowerer, args[1], "finish listeners", 0, () => false, "use ()", []);
|