@wirebench/engine 2.2.0 → 3.1.0-rc.1
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/README.md +134 -1
- package/dist/account/schema.d.ts +34 -0
- package/dist/account/schema.js +29 -0
- package/dist/assert/callback.d.ts +76 -0
- package/dist/assert/callback.js +320 -0
- package/dist/assert/capture-source.d.ts +50 -0
- package/dist/assert/capture-source.js +89 -0
- package/dist/assert/check.d.ts +8 -0
- package/dist/assert/check.js +18 -0
- package/dist/assert/header.d.ts +5 -0
- package/dist/assert/header.js +48 -0
- package/dist/assert/index.d.ts +2 -2
- package/dist/assert/index.js +12 -0
- package/dist/assert/match.d.ts +6 -0
- package/dist/assert/match.js +13 -4
- package/dist/assert/model.d.ts +110 -3
- package/dist/assert/model.js +16 -1
- package/dist/assert/schema.d.ts +194 -1
- package/dist/assert/schema.js +154 -12
- package/dist/assert/status-names.d.ts +9 -0
- package/dist/assert/status-names.js +27 -0
- package/dist/assert/status.d.ts +4 -1
- package/dist/assert/status.js +27 -3
- package/dist/asyncapi/browser.d.ts +7 -0
- package/dist/asyncapi/browser.js +6 -0
- package/dist/asyncapi/frame-check-worker-host.d.ts +44 -0
- package/dist/asyncapi/frame-check-worker-host.js +175 -0
- package/dist/asyncapi/frame-check-worker.d.ts +12 -0
- package/dist/asyncapi/frame-check-worker.js +25 -0
- package/dist/asyncapi/frame-check.d.ts +25 -0
- package/dist/asyncapi/frame-check.js +78 -0
- package/dist/asyncapi/import.d.ts +25 -0
- package/dist/asyncapi/import.js +34 -0
- package/dist/asyncapi/map.d.ts +40 -0
- package/dist/asyncapi/map.js +230 -0
- package/dist/asyncapi/model.d.ts +84 -0
- package/dist/asyncapi/model.js +7 -0
- package/dist/asyncapi/normalise-2.d.ts +13 -0
- package/dist/asyncapi/normalise-2.js +113 -0
- package/dist/asyncapi/normalise-3.d.ts +14 -0
- package/dist/asyncapi/normalise-3.js +133 -0
- package/dist/asyncapi/parse.d.ts +31 -0
- package/dist/asyncapi/parse.js +85 -0
- package/dist/asyncapi/read.d.ts +35 -0
- package/dist/asyncapi/read.js +186 -0
- package/dist/asyncapi/security.d.ts +14 -0
- package/dist/asyncapi/security.js +55 -0
- package/dist/asyncapi/update.d.ts +53 -0
- package/dist/asyncapi/update.js +220 -0
- package/dist/errors.d.ts +16 -0
- package/dist/errors.js +22 -0
- package/dist/grpc/events.d.ts +22 -0
- package/dist/grpc/events.js +1 -0
- package/dist/grpc/expand.d.ts +1 -1
- package/dist/grpc/expand.js +15 -5
- package/dist/grpc/files.d.ts +271 -0
- package/dist/grpc/files.js +62 -0
- package/dist/grpc/model.d.ts +11 -1
- package/dist/grpc/module.d.ts +2 -0
- package/dist/grpc/module.js +13 -0
- package/dist/grpc/run.d.ts +73 -0
- package/dist/grpc/run.js +407 -0
- package/dist/grpc/script-types.d.ts +8 -0
- package/dist/grpc/script-types.js +149 -0
- package/dist/grpc/scripting.d.ts +34 -0
- package/dist/grpc/scripting.js +147 -0
- package/dist/grpc/send-input.d.ts +46 -0
- package/dist/grpc/send-input.js +42 -0
- package/dist/grpc/send.d.ts +2 -2
- package/dist/grpc/status.d.ts +9 -2
- package/dist/grpc/status.js +11 -24
- package/dist/grpc/storage.d.ts +9 -0
- package/dist/grpc/storage.js +167 -0
- package/dist/{rest/auth.d.ts → http/auth/apply-auth.d.ts} +4 -4
- package/dist/{rest/auth.js → http/auth/apply-auth.js} +1 -1
- package/dist/http/auth/apply.d.ts +1 -1
- package/dist/{rest → http/auth}/oauth2.d.ts +2 -2
- package/dist/{rest → http/auth}/oauth2.js +1 -1
- package/dist/http/auth/send-auth.d.ts +57 -0
- package/dist/http/auth/send-auth.js +7 -0
- package/dist/http/client.js +150 -8
- package/dist/http/cookies.d.ts +79 -0
- package/dist/http/cookies.js +81 -0
- package/dist/http/curl.d.ts +4 -14
- package/dist/http/curl.js +4 -154
- package/dist/http/decompress.d.ts +7 -0
- package/dist/http/decompress.js +23 -1
- package/dist/http/document-fetch.d.ts +42 -0
- package/dist/http/document-fetch.js +207 -0
- package/dist/http/entries.d.ts +27 -0
- package/dist/http/entries.js +16 -0
- package/dist/http/escape.d.ts +18 -0
- package/dist/http/escape.js +30 -0
- package/dist/http/fetch-document.d.ts +28 -0
- package/dist/{wsdl/fetch.js → http/fetch-document.js} +8 -16
- package/dist/http/media-type.d.ts +9 -0
- package/dist/http/media-type.js +12 -0
- package/dist/http/transcript-cap.d.ts +26 -0
- package/dist/http/transcript-cap.js +36 -0
- package/dist/http/types.d.ts +59 -0
- package/dist/http/webhook-signature.d.ts +81 -0
- package/dist/http/webhook-signature.js +227 -0
- package/dist/import-detect.d.ts +2 -2
- package/dist/import-detect.js +10 -1
- package/dist/index.d.ts +207 -55
- package/dist/index.js +129 -32
- package/dist/json/cursor.d.ts +2 -0
- package/dist/json/cursor.js +1 -0
- package/dist/json/pointer-range.d.ts +18 -0
- package/dist/json/pointer-range.js +157 -0
- package/dist/json/schema/model.d.ts +59 -0
- package/dist/json/schema/model.js +8 -0
- package/dist/json/schema/parse-text.d.ts +16 -0
- package/dist/json/schema/parse-text.js +37 -0
- package/dist/{rest/openapi → json/schema}/refs.d.ts +2 -2
- package/dist/{rest/openapi → json/schema}/refs.js +3 -3
- package/dist/{rest/openapi → json/schema}/sample.d.ts +4 -0
- package/dist/{rest/openapi → json/schema}/sample.js +2 -2
- package/dist/json/schema/source.d.ts +21 -0
- package/dist/json/schema/source.js +8 -0
- package/dist/json/schema-validate.d.ts +49 -0
- package/dist/json/schema-validate.js +557 -0
- package/dist/{wss/keystore → keystore}/index.js +1 -1
- package/dist/{wss/keystore → keystore}/pem.js +1 -1
- package/dist/{wss/keystore → keystore}/pkcs12.js +1 -1
- package/dist/project/attachments-cache.d.ts +3 -1
- package/dist/{wsdl → project}/cache-naming.js +1 -1
- package/dist/project/endpoints.d.ts +18 -8
- package/dist/project/endpoints.js +21 -6
- package/dist/project/environments.d.ts +7 -5
- package/dist/project/history.d.ts +105 -9
- package/dist/project/history.js +195 -23
- package/dist/project/inherit.d.ts +7 -0
- package/dist/project/inherit.js +9 -0
- package/dist/project/keystores.d.ts +1 -1
- package/dist/project/load-helpers.d.ts +89 -0
- package/dist/project/load-helpers.js +177 -0
- package/dist/project/load.d.ts +30 -4
- package/dist/project/load.js +168 -545
- package/dist/project/managed-files.d.ts +36 -0
- package/dist/project/managed-files.js +97 -0
- package/dist/project/migrate.d.ts +2 -2
- package/dist/project/migrate.js +2 -2
- package/dist/project/model.d.ts +92 -14
- package/dist/project/model.js +50 -4
- package/dist/project/paths.d.ts +10 -1
- package/dist/project/paths.js +10 -1
- package/dist/project/preferences.d.ts +11 -2
- package/dist/project/preferences.js +5 -1
- package/dist/project/properties.d.ts +31 -17
- package/dist/project/properties.js +89 -70
- package/dist/project/request-location.d.ts +20 -0
- package/dist/project/request-location.js +62 -0
- package/dist/project/save.d.ts +12 -2
- package/dist/project/save.js +186 -141
- package/dist/project/schema-parts.d.ts +337 -0
- package/dist/project/schema-parts.js +248 -0
- package/dist/project/schema.d.ts +72 -928
- package/dist/project/schema.js +17 -466
- package/dist/project/sequence-guards.d.ts +43 -0
- package/dist/project/sequence-guards.js +109 -0
- package/dist/project/serialize-helpers.d.ts +60 -0
- package/dist/project/serialize-helpers.js +108 -0
- package/dist/project/serialize.d.ts +7 -8
- package/dist/project/serialize.js +34 -293
- package/dist/protocol/features.d.ts +51 -0
- package/dist/protocol/features.js +64 -0
- package/dist/protocol/index.d.ts +7 -0
- package/dist/protocol/index.js +4 -0
- package/dist/protocol/module.d.ts +247 -0
- package/dist/protocol/module.js +48 -0
- package/dist/protocol/registry.d.ts +42 -0
- package/dist/protocol/registry.js +47 -0
- package/dist/protocols.d.ts +77 -0
- package/dist/protocols.js +40 -0
- package/dist/redact/index.d.ts +12 -1
- package/dist/redact/index.js +55 -7
- package/dist/redact/literal.d.ts +10 -0
- package/dist/redact/literal.js +110 -12
- package/dist/rest/body.d.ts +2 -10
- package/dist/rest/body.js +3 -25
- package/dist/rest/browser.d.ts +4 -0
- package/dist/rest/browser.js +5 -0
- package/dist/rest/contract-check-worker-host.d.ts +36 -0
- package/dist/rest/contract-check-worker-host.js +158 -0
- package/dist/rest/contract-check-worker.d.ts +7 -0
- package/dist/rest/contract-check-worker.js +28 -0
- package/dist/rest/contract-check.d.ts +43 -0
- package/dist/rest/contract-check.js +217 -0
- package/dist/rest/cookie-jar.d.ts +62 -0
- package/dist/rest/cookie-jar.js +262 -0
- package/dist/rest/cookies.d.ts +6 -22
- package/dist/rest/cookies.js +6 -42
- package/dist/rest/curl.js +5 -1
- package/dist/rest/events.d.ts +12 -0
- package/dist/rest/events.js +1 -0
- package/dist/rest/expand.d.ts +6 -1
- package/dist/rest/expand.js +29 -11
- package/dist/rest/files.d.ts +439 -0
- package/dist/rest/files.js +107 -0
- package/dist/rest/json-form.d.ts +97 -0
- package/dist/rest/json-form.js +396 -0
- package/dist/rest/model.d.ts +35 -24
- package/dist/rest/model.js +6 -9
- package/dist/rest/module.d.ts +2 -0
- package/dist/rest/module.js +13 -0
- package/dist/rest/openapi/cache.d.ts +7 -2
- package/dist/rest/openapi/cache.js +2 -2
- package/dist/rest/openapi/import.d.ts +11 -16
- package/dist/rest/openapi/import.js +6 -2
- package/dist/rest/openapi/map.d.ts +38 -1
- package/dist/rest/openapi/map.js +151 -41
- package/dist/rest/openapi/match.d.ts +20 -0
- package/dist/rest/openapi/match.js +117 -0
- package/dist/rest/openapi/model.d.ts +33 -45
- package/dist/rest/openapi/parse.d.ts +3 -12
- package/dist/rest/openapi/parse.js +138 -67
- package/dist/rest/openapi/responses.d.ts +23 -0
- package/dist/rest/openapi/responses.js +59 -0
- package/dist/rest/openapi/runtime-expression.d.ts +69 -0
- package/dist/rest/openapi/runtime-expression.js +213 -0
- package/dist/rest/openapi/update.d.ts +116 -0
- package/dist/rest/openapi/update.js +456 -0
- package/dist/rest/postman/map.d.ts +1 -0
- package/dist/rest/postman/map.js +66 -4
- package/dist/rest/postman/model.d.ts +9 -0
- package/dist/rest/postman/parse.js +33 -10
- package/dist/rest/response.d.ts +2 -23
- package/dist/rest/response.js +3 -75
- package/dist/rest/run.d.ts +56 -0
- package/dist/rest/run.js +395 -0
- package/dist/rest/script-types.d.ts +7 -0
- package/dist/rest/script-types.js +83 -0
- package/dist/rest/scripting.d.ts +38 -0
- package/dist/rest/scripting.js +282 -0
- package/dist/rest/send-input.d.ts +54 -0
- package/dist/rest/send-input.js +73 -0
- package/dist/rest/send.d.ts +77 -4
- package/dist/rest/send.js +128 -7
- package/dist/rest/sse-transcript.d.ts +25 -0
- package/dist/rest/sse-transcript.js +95 -0
- package/dist/rest/sse.d.ts +43 -0
- package/dist/rest/sse.js +195 -0
- package/dist/rest/storage.d.ts +26 -0
- package/dist/rest/storage.js +262 -0
- package/dist/rest/url.d.ts +10 -4
- package/dist/rest/url.js +38 -5
- package/dist/run/baseline-update.d.ts +35 -0
- package/dist/run/baseline-update.js +97 -0
- package/dist/run/baseline.d.ts +42 -0
- package/dist/run/baseline.js +93 -0
- package/dist/run/context.d.ts +86 -0
- package/dist/run/context.js +31 -0
- package/dist/run/current-values.d.ts +32 -0
- package/dist/run/current-values.js +43 -0
- package/dist/run/event-queue.d.ts +14 -0
- package/dist/run/event-queue.js +46 -0
- package/dist/run/exchange.d.ts +62 -0
- package/dist/run/exchange.js +65 -0
- package/dist/run/host.d.ts +89 -0
- package/dist/run/host.js +1 -0
- package/dist/run/index.d.ts +20 -7
- package/dist/run/index.js +12 -4
- package/dist/run/oauth2-token.d.ts +42 -0
- package/dist/run/oauth2-token.js +92 -0
- package/dist/run/open.d.ts +12 -0
- package/dist/run/open.js +16 -0
- package/dist/run/run.d.ts +124 -4
- package/dist/run/run.js +293 -134
- package/dist/run/scope.d.ts +11 -0
- package/dist/run/scope.js +26 -0
- package/dist/run/script-support.d.ts +53 -0
- package/dist/run/script-support.js +68 -0
- package/dist/run/secret-needs.d.ts +11 -4
- package/dist/run/secret-needs.js +48 -96
- package/dist/run/select.d.ts +34 -25
- package/dist/run/select.js +45 -54
- package/dist/run/send-helpers.d.ts +93 -0
- package/dist/run/send-helpers.js +255 -0
- package/dist/run/tree.d.ts +50 -0
- package/dist/run/tree.js +54 -0
- package/dist/script/api/postman.d.ts +10 -0
- package/dist/script/api/postman.js +264 -0
- package/dist/script/api/prelude.d.ts +20 -0
- package/dist/script/api/prelude.js +215 -0
- package/dist/script/apply.d.ts +44 -0
- package/dist/script/apply.js +120 -0
- package/dist/script/check/host.d.ts +41 -0
- package/dist/script/check/host.js +143 -0
- package/dist/script/check/service.d.ts +52 -0
- package/dist/script/check/service.js +195 -0
- package/dist/script/check/worker.d.ts +1 -0
- package/dist/script/check/worker.js +40 -0
- package/dist/script/index.d.ts +16 -0
- package/dist/script/index.js +10 -0
- package/dist/script/lookup.d.ts +10 -0
- package/dist/script/lookup.js +23 -0
- package/dist/script/model.d.ts +82 -0
- package/dist/script/model.js +18 -0
- package/dist/script/props.d.ts +8 -0
- package/dist/script/props.js +28 -0
- package/dist/script/request-scripts.d.ts +83 -0
- package/dist/script/request-scripts.js +160 -0
- package/dist/script/run.d.ts +47 -0
- package/dist/script/run.js +146 -0
- package/dist/script/sandbox/execute.d.ts +26 -0
- package/dist/script/sandbox/execute.js +212 -0
- package/dist/script/sandbox/host-api.d.ts +27 -0
- package/dist/script/sandbox/host-api.js +101 -0
- package/dist/script/sandbox/host.d.ts +18 -0
- package/dist/script/sandbox/host.js +172 -0
- package/dist/script/sandbox/model.d.ts +69 -0
- package/dist/script/sandbox/model.js +24 -0
- package/dist/script/sandbox/worker.d.ts +1 -0
- package/dist/script/sandbox/worker.js +20 -0
- package/dist/script/send.d.ts +27 -0
- package/dist/script/send.js +76 -0
- package/dist/script/strip.d.ts +5 -0
- package/dist/script/strip.js +43 -0
- package/dist/script/types/api.d.ts +38 -0
- package/dist/script/types/api.js +113 -0
- package/dist/script/types/json-schema.d.ts +26 -0
- package/dist/script/types/json-schema.js +206 -0
- package/dist/secrets/env-names.d.ts +9 -1
- package/dist/secrets/env-names.js +17 -1
- package/dist/secrets/resolve.d.ts +44 -4
- package/dist/secrets/resolve.js +58 -1
- package/dist/secrets/scan/apply.d.ts +36 -0
- package/dist/secrets/scan/apply.js +194 -0
- package/dist/secrets/scan/rules.d.ts +32 -0
- package/dist/secrets/scan/rules.js +346 -0
- package/dist/secrets/scan/scan.d.ts +6 -0
- package/dist/secrets/scan/scan.js +57 -0
- package/dist/secrets/scan/walk.d.ts +70 -0
- package/dist/secrets/scan/walk.js +156 -0
- package/dist/secrets/secret-refs.d.ts +8 -0
- package/dist/secrets/secret-refs.js +25 -0
- package/dist/secrets/secret-token.d.ts +17 -0
- package/dist/secrets/secret-token.js +25 -0
- package/dist/sequence/file.d.ts +169 -0
- package/dist/sequence/file.js +237 -0
- package/dist/sequence/index.d.ts +7 -0
- package/dist/sequence/index.js +5 -0
- package/dist/sequence/load.d.ts +32 -0
- package/dist/sequence/load.js +56 -0
- package/dist/sequence/model.d.ts +115 -0
- package/dist/sequence/model.js +53 -0
- package/dist/sequence/run.d.ts +131 -0
- package/dist/sequence/run.js +191 -0
- package/dist/sequence/transfer.d.ts +24 -0
- package/dist/sequence/transfer.js +75 -0
- package/dist/server-api/audit.d.ts +455 -0
- package/dist/server-api/audit.js +186 -0
- package/dist/server-api/ci-tokens.d.ts +50 -0
- package/dist/server-api/ci-tokens.js +35 -0
- package/dist/server-api/hooks.d.ts +337 -0
- package/dist/server-api/hooks.js +152 -0
- package/dist/server-api/identity.d.ts +210 -0
- package/dist/server-api/identity.js +115 -0
- package/dist/server-api/licensing.d.ts +80 -0
- package/dist/server-api/licensing.js +53 -0
- package/dist/server-api/live.d.ts +132 -0
- package/dist/server-api/live.js +102 -0
- package/dist/server-api/meta.d.ts +31 -0
- package/dist/server-api/meta.js +21 -0
- package/dist/server-api/sync.d.ts +179 -0
- package/dist/server-api/sync.js +124 -0
- package/dist/server-api/teams.d.ts +306 -0
- package/dist/server-api/teams.js +113 -0
- package/dist/snapshot/diff.d.ts +30 -0
- package/dist/snapshot/diff.js +75 -0
- package/dist/snapshot/format.d.ts +17 -0
- package/dist/snapshot/format.js +40 -0
- package/dist/snapshot/golden-file.d.ts +45 -0
- package/dist/snapshot/golden-file.js +173 -0
- package/dist/snapshot/ignore.d.ts +14 -0
- package/dist/snapshot/ignore.js +79 -0
- package/dist/snapshot/index.d.ts +9 -0
- package/dist/snapshot/index.js +9 -0
- package/dist/snapshot/json-diff.d.ts +3 -0
- package/dist/snapshot/json-diff.js +93 -0
- package/dist/snapshot/xml-diff.d.ts +10 -0
- package/dist/snapshot/xml-diff.js +194 -0
- package/dist/soap/auth.d.ts +26 -0
- package/dist/soap/auth.js +54 -0
- package/dist/soap/curl.d.ts +20 -0
- package/dist/soap/curl.js +161 -0
- package/dist/soap/expand.d.ts +24 -0
- package/dist/soap/expand.js +95 -0
- package/dist/soap/files.d.ts +384 -0
- package/dist/soap/files.js +114 -0
- package/dist/soap/form-request.d.ts +13 -0
- package/dist/soap/form-request.js +2 -2
- package/dist/soap/generate.d.ts +12 -0
- package/dist/{generate.js → soap/generate.js} +4 -4
- package/dist/{import.d.ts → soap/import.d.ts} +4 -4
- package/dist/{import.js → soap/import.js} +13 -13
- package/dist/soap/json-operation.d.ts +35 -0
- package/dist/soap/json-operation.js +225 -0
- package/dist/soap/legacy-project/env-refs.d.ts +19 -0
- package/dist/soap/legacy-project/env-refs.js +105 -0
- package/dist/soap/legacy-project/map.d.ts +2 -2
- package/dist/soap/legacy-project/map.js +6 -0
- package/dist/soap/mime/multipart.d.ts +2 -2
- package/dist/soap/mime/multipart.js +2 -5
- package/dist/soap/mime/send-pipeline.d.ts +1 -1
- package/dist/soap/mime/send-pipeline.js +1 -1
- package/dist/soap/mime/types.d.ts +1 -3
- package/dist/soap/module.d.ts +2 -0
- package/dist/soap/module.js +13 -0
- package/dist/soap/namespace-scope.js +1 -1
- package/dist/soap/operations.d.ts +12 -0
- package/dist/{operations.js → soap/operations.js} +4 -4
- package/dist/soap/run.d.ts +70 -0
- package/dist/soap/run.js +549 -0
- package/dist/soap/script-types.d.ts +65 -0
- package/dist/soap/script-types.js +379 -0
- package/dist/soap/scripting.d.ts +45 -0
- package/dist/soap/scripting.js +221 -0
- package/dist/soap/send-input.d.ts +61 -0
- package/dist/{send-options.js → soap/send-input.js} +5 -109
- package/dist/{send.d.ts → soap/send.d.ts} +1 -1
- package/dist/{send.js → soap/send.js} +28 -12
- package/dist/soap/storage.d.ts +9 -0
- package/dist/soap/storage.js +237 -0
- package/dist/soap/transforms.d.ts +3 -12
- package/dist/soap/transforms.js +3 -14
- package/dist/{types.d.ts → soap/types.d.ts} +34 -84
- package/dist/sync/git-cli.d.ts +202 -0
- package/dist/sync/git-cli.js +684 -0
- package/dist/sync/three-way-merge.d.ts +41 -0
- package/dist/sync/three-way-merge.js +85 -0
- package/dist/sync/tree-paths.d.ts +34 -0
- package/dist/sync/tree-paths.js +131 -0
- package/dist/team-secrets/envelope.d.ts +10 -0
- package/dist/team-secrets/envelope.js +121 -0
- package/dist/team-secrets/errors.d.ts +26 -0
- package/dist/team-secrets/errors.js +27 -0
- package/dist/team-secrets/index.d.ts +14 -0
- package/dist/team-secrets/index.js +8 -0
- package/dist/team-secrets/keys.d.ts +52 -0
- package/dist/team-secrets/keys.js +158 -0
- package/dist/team-secrets/log.d.ts +48 -0
- package/dist/team-secrets/log.js +175 -0
- package/dist/team-secrets/resolve-conflict.d.ts +7 -0
- package/dist/team-secrets/resolve-conflict.js +14 -0
- package/dist/team-secrets/schema.d.ts +97 -0
- package/dist/team-secrets/schema.js +157 -0
- package/dist/team-secrets/sign.d.ts +24 -0
- package/dist/team-secrets/sign.js +71 -0
- package/dist/team-secrets/vault.d.ts +49 -0
- package/dist/team-secrets/vault.js +148 -0
- package/dist/validate/wsi/run-message.d.ts +2 -2
- package/dist/validate/wsi/run-message.js +1 -1
- package/dist/validate/wsi/run-wsdl.d.ts +2 -2
- package/dist/validate/wsi/run-wsdl.js +1 -1
- package/dist/validate/wsi/types.d.ts +1 -1
- package/dist/webhooks/model.d.ts +138 -0
- package/dist/webhooks/model.js +150 -0
- package/dist/workspace/commit-message.d.ts +1 -1
- package/dist/workspace/commit-message.js +6 -1
- package/dist/workspace/environments.d.ts +11 -4
- package/dist/workspace/environments.js +12 -0
- package/dist/workspace/index.d.ts +3 -3
- package/dist/workspace/index.js +2 -2
- package/dist/workspace/paths.d.ts +5 -2
- package/dist/workspace/paths.js +5 -2
- package/dist/workspace/schema.d.ts +7 -3
- package/dist/workspace/schema.js +24 -3
- package/dist/workspace/share.d.ts +30 -11
- package/dist/workspace/share.js +32 -6
- package/dist/ws/call.d.ts +1 -1
- package/dist/ws/call.js +2 -2
- package/dist/ws/connect.d.ts +60 -0
- package/dist/ws/connect.js +131 -0
- package/dist/ws/events.d.ts +17 -0
- package/dist/ws/events.js +1 -0
- package/dist/ws/expand.d.ts +1 -1
- package/dist/ws/expand.js +1 -1
- package/dist/ws/files.d.ts +284 -0
- package/dist/ws/files.js +71 -0
- package/dist/ws/history-entry.d.ts +44 -0
- package/dist/ws/history-entry.js +93 -0
- package/dist/ws/model.d.ts +44 -3
- package/dist/ws/model.js +3 -0
- package/dist/ws/module.d.ts +2 -0
- package/dist/ws/module.js +11 -0
- package/dist/ws/run.d.ts +63 -0
- package/dist/ws/run.js +470 -0
- package/dist/ws/session.d.ts +18 -0
- package/dist/ws/session.js +52 -25
- package/dist/ws/storage.d.ts +9 -0
- package/dist/ws/storage.js +176 -0
- package/dist/ws/transcript.d.ts +3 -4
- package/dist/ws/transcript.js +26 -17
- package/dist/ws/url.d.ts +1 -1
- package/dist/wsdl/cache.js +1 -1
- package/dist/wsdl/docs-generator.d.ts +3 -3
- package/dist/wsdl/docs-generator.js +1 -1
- package/dist/wsdl/export-definition.js +1 -1
- package/dist/wsdl/qname.d.ts +2 -5
- package/dist/wsdl/resolver.d.ts +4 -11
- package/dist/wsdl/resolver.js +3 -3
- package/dist/wsdl/update-definition.d.ts +5 -5
- package/dist/wsdl/update-definition.js +6 -6
- package/dist/wss/apply.js +1 -1
- package/dist/{project/wss-configs.d.ts → wss/configs.d.ts} +2 -2
- package/dist/{project/wss-configs.js → wss/configs.js} +2 -2
- package/dist/wss/incoming/decrypt.d.ts +1 -1
- package/dist/wss/incoming/index.js +1 -1
- package/dist/wss/incoming/verify.d.ts +1 -1
- package/dist/wss/incoming/verify.js +1 -1
- package/dist/wss/key-identifiers.js +1 -1
- package/dist/wss/model.d.ts +1 -1
- package/dist/wss/outgoing/encryption.d.ts +1 -1
- package/dist/wss/outgoing/signature.d.ts +1 -1
- package/dist/xml/decode.d.ts +15 -0
- package/dist/xml/decode.js +22 -0
- package/dist/xml/entitize.d.ts +17 -0
- package/dist/xml/entitize.js +19 -0
- package/dist/xml/index.d.ts +1 -1
- package/dist/xml/index.js +1 -1
- package/dist/xml/locate.d.ts +39 -0
- package/dist/xml/locate.js +117 -0
- package/dist/xml/qname.d.ts +12 -0
- package/dist/xml/qname.js +8 -0
- package/dist/xpath/evaluate-async.d.ts +19 -0
- package/dist/xpath/evaluate-async.js +31 -11
- package/dist/xpath/evaluate.d.ts +1 -1
- package/dist/xpath/namespaces.js +1 -1
- package/dist/xpath/worker.d.ts +11 -5
- package/dist/xpath/worker.js +24 -7
- package/dist/xsd/form-model.d.ts +19 -2
- package/dist/xsd/form-model.js +14 -2
- package/dist/xsd/json-bridge.d.ts +152 -0
- package/dist/xsd/json-bridge.js +1213 -0
- package/dist/xsd/locate.d.ts +2 -30
- package/dist/xsd/locate.js +1 -109
- package/dist/xsd/xml-scan.d.ts +2 -0
- package/dist/xsd/xml-scan.js +1 -1
- package/dist/xsd/xml-writer.d.ts +2 -0
- package/dist/xsd/xml-writer.js +4 -0
- package/package.json +12 -1
- package/dist/generate.d.ts +0 -12
- package/dist/operations.d.ts +0 -12
- package/dist/run/effective-auth.d.ts +0 -10
- package/dist/run/effective-auth.js +0 -19
- package/dist/run/prepare.d.ts +0 -43
- package/dist/run/prepare.js +0 -280
- package/dist/send-options.d.ts +0 -141
- package/dist/wsdl/fetch.d.ts +0 -13
- /package/dist/{soap → http}/charset.d.ts +0 -0
- /package/dist/{soap → http}/charset.js +0 -0
- /package/dist/{wsdl → http}/ref-policy.d.ts +0 -0
- /package/dist/{wsdl → http}/ref-policy.js +0 -0
- /package/dist/{wss/keystore → keystore}/certificate.d.ts +0 -0
- /package/dist/{wss/keystore → keystore}/certificate.js +0 -0
- /package/dist/{wss/keystore → keystore}/index.d.ts +0 -0
- /package/dist/{wss/keystore → keystore}/model.d.ts +0 -0
- /package/dist/{wss/keystore → keystore}/model.js +0 -0
- /package/dist/{wss/keystore → keystore}/pem.d.ts +0 -0
- /package/dist/{wss/keystore → keystore}/pkcs12.d.ts +0 -0
- /package/dist/{wsdl → project}/cache-naming.d.ts +0 -0
- /package/dist/{types.js → soap/types.js} +0 -0
- /package/dist/{soap → xml}/prefixes.d.ts +0 -0
- /package/dist/{soap → xml}/prefixes.js +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Working out which credentials a
|
|
2
|
+
* Working out which credentials a request uses, and turning them into what goes on the wire.
|
|
3
3
|
*
|
|
4
4
|
* Two halves, both pure. {@link resolveAuthChain} walks the inheritance chain — request, then each
|
|
5
5
|
* folder outwards, then the API — and answers with the first configuration that is not `inherit`.
|
|
@@ -9,9 +9,9 @@
|
|
|
9
9
|
* Basic and NTLM are deliberately *not* applied here: they may need a challenge round trip, which
|
|
10
10
|
* is the transport's job (`http/auth/*`), and this module never touches the network.
|
|
11
11
|
*/
|
|
12
|
-
import type { AuthConfig } from '
|
|
13
|
-
import type { SendAuth } from '
|
|
14
|
-
import type { KeyValueEntry } from '
|
|
12
|
+
import type { AuthConfig } from '../../project/model.js';
|
|
13
|
+
import type { SendAuth } from './send-auth.js';
|
|
14
|
+
import type { KeyValueEntry } from '../entries.js';
|
|
15
15
|
/**
|
|
16
16
|
* The credentials that actually apply, given a request's own configuration followed by its
|
|
17
17
|
* folders from the inside out and finally its API's.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Working out which credentials a
|
|
2
|
+
* Working out which credentials a request uses, and turning them into what goes on the wire.
|
|
3
3
|
*
|
|
4
4
|
* Two halves, both pure. {@link resolveAuthChain} walks the inheritance chain — request, then each
|
|
5
5
|
* folder outwards, then the API — and answers with the first configuration that is not `inherit`.
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import type { Dispatcher } from 'undici';
|
|
12
12
|
import type { HttpExchange, HttpRequest } from '../types.js';
|
|
13
|
-
import type { AuthSummary, SendAuth } from '
|
|
13
|
+
import type { AuthSummary, SendAuth } from './send-auth.js';
|
|
14
14
|
/** Options for {@link sendWithAuth}: the same hooks `sendHttp` takes, for tests. */
|
|
15
15
|
export interface SendWithAuthOptions {
|
|
16
16
|
readonly dispatcher?: Dispatcher;
|
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
* No access token is ever written to a project file or returned to a renderer by this module; it
|
|
11
11
|
* hands back a {@link TokenSet} and the host decides where it lives (ADR-0004).
|
|
12
12
|
*/
|
|
13
|
-
import type { OAuth2Auth } from '
|
|
14
|
-
import type { HttpRequest } from '../
|
|
13
|
+
import type { OAuth2Auth } from '../../project/model.js';
|
|
14
|
+
import type { HttpRequest } from '../types.js';
|
|
15
15
|
/** The credential values the host resolved for one OAuth2 configuration. */
|
|
16
16
|
export interface OAuth2Secrets {
|
|
17
17
|
/** The client secret, when the configuration references one. */
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* hands back a {@link TokenSet} and the host decides where it lives (ADR-0004).
|
|
12
12
|
*/
|
|
13
13
|
import { createHash, randomBytes } from 'node:crypto';
|
|
14
|
-
import { WirebenchError } from '
|
|
14
|
+
import { WirebenchError } from '../../errors.js';
|
|
15
15
|
/** Base64url without padding, the encoding every OAuth2 extension uses. */
|
|
16
16
|
function base64url(bytes) {
|
|
17
17
|
return Buffer.from(bytes).toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The credentials of one send, and what authentication did with them.
|
|
3
|
+
*
|
|
4
|
+
* In `http/auth/` because every protocol's send takes a {@link SendAuth} and a protocol folder
|
|
5
|
+
* imports core and itself, never another protocol (protocol modules spec §7.2).
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Credentials for one send, already resolved to plaintext: the desktop app looks a
|
|
9
|
+
* `passwordRef` up in its secret store before calling the engine, so the engine never
|
|
10
|
+
* sees a secret reference (and never persists or logs the password).
|
|
11
|
+
*/
|
|
12
|
+
export type SendAuth = {
|
|
13
|
+
readonly type: 'basic';
|
|
14
|
+
readonly username: string;
|
|
15
|
+
readonly password: string;
|
|
16
|
+
/** Send the `Authorization` header on the first attempt instead of waiting for a 401. */
|
|
17
|
+
readonly preemptive: boolean;
|
|
18
|
+
} | {
|
|
19
|
+
readonly type: 'ntlm';
|
|
20
|
+
readonly username: string;
|
|
21
|
+
readonly password: string;
|
|
22
|
+
readonly domain?: string;
|
|
23
|
+
readonly workstation?: string;
|
|
24
|
+
}
|
|
25
|
+
/** A token in an `Authorization` header. `scheme` defaults to `Bearer`. */
|
|
26
|
+
| {
|
|
27
|
+
readonly type: 'bearer';
|
|
28
|
+
readonly token: string;
|
|
29
|
+
readonly scheme?: string;
|
|
30
|
+
}
|
|
31
|
+
/** A key in one header or one query parameter. */
|
|
32
|
+
| {
|
|
33
|
+
readonly type: 'api-key';
|
|
34
|
+
readonly name: string;
|
|
35
|
+
readonly value: string;
|
|
36
|
+
readonly in: 'header' | 'query';
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* An OAuth2 access token the host already obtained. The engine never runs a grant during a send:
|
|
40
|
+
* the token is fetched (and cached, and refreshed) by the host, so a send is one exchange and
|
|
41
|
+
* the browser is never opened behind it. On the wire it is a Bearer token.
|
|
42
|
+
*/
|
|
43
|
+
| {
|
|
44
|
+
readonly type: 'oauth2';
|
|
45
|
+
readonly accessToken: string;
|
|
46
|
+
};
|
|
47
|
+
/** What authentication actually did during one send, for the UI to explain the exchange. */
|
|
48
|
+
export interface AuthSummary {
|
|
49
|
+
readonly scheme: SendAuth['type'];
|
|
50
|
+
/** True when the server answered the first attempt with a 401 challenge. */
|
|
51
|
+
readonly challenged: boolean;
|
|
52
|
+
/**
|
|
53
|
+
* How many HTTP attempts the send made: 1 preemptive/unchallenged, 2 after a Basic
|
|
54
|
+
* challenge, 3 for a full NTLM handshake (bare, Type 1, Type 3).
|
|
55
|
+
*/
|
|
56
|
+
readonly attempts: 1 | 2 | 3;
|
|
57
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The credentials of one send, and what authentication did with them.
|
|
3
|
+
*
|
|
4
|
+
* In `http/auth/` because every protocol's send takes a {@link SendAuth} and a protocol folder
|
|
5
|
+
* imports core and itself, never another protocol (protocol modules spec §7.2).
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
package/dist/http/client.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Agent, ProxyAgent, request as undiciRequest } from 'undici';
|
|
2
|
-
import {
|
|
2
|
+
import { pipeline } from 'node:stream';
|
|
3
|
+
import { createDecompressStream, decompressBody } from './decompress.js';
|
|
3
4
|
import { failedRequestFor, withFailedRequest } from './failed-request.js';
|
|
4
5
|
import { invalidUrlError, toHttpError, tooManyRedirectsError } from './errors.js';
|
|
5
6
|
import { buildRawRequest, buildRawResponse } from './raw-capture.js';
|
|
@@ -155,6 +156,59 @@ function scopeHeadersToOrigin(headers, fromUrl, toUrl) {
|
|
|
155
156
|
}
|
|
156
157
|
return scoped;
|
|
157
158
|
}
|
|
159
|
+
/**
|
|
160
|
+
* Applies a request's {@link OriginCredentials} to the next hop of a redirect: removed from a hop to
|
|
161
|
+
* any origin but the request's own, applied again on a hop back to it.
|
|
162
|
+
*
|
|
163
|
+
* A query key is stripped by name and value rather than by name alone, so a parameter the target
|
|
164
|
+
* uses for its own purposes survives; only the key's exact value is a secret. The URL is only
|
|
165
|
+
* re-serialised when something changes, so a `Location` otherwise reaches the wire as the server
|
|
166
|
+
* wrote it.
|
|
167
|
+
*/
|
|
168
|
+
function scopeCredentialsToOrigin(credentials, original, headers, toUrl) {
|
|
169
|
+
const names = new Set((credentials.headers ?? []).map((name) => name.toLowerCase()));
|
|
170
|
+
const sameOrigin = originOf(toUrl) === originOf(original.url);
|
|
171
|
+
const scoped = {};
|
|
172
|
+
for (const [name, value] of Object.entries(headers)) {
|
|
173
|
+
if (!names.has(name.toLowerCase()))
|
|
174
|
+
scoped[name] = value;
|
|
175
|
+
}
|
|
176
|
+
if (sameOrigin) {
|
|
177
|
+
for (const [name, value] of Object.entries(original.headers)) {
|
|
178
|
+
if (names.has(name.toLowerCase()))
|
|
179
|
+
scoped[name] = value;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
const url = new URL(toUrl);
|
|
183
|
+
let changed = false;
|
|
184
|
+
for (const { name, value } of credentials.query ?? []) {
|
|
185
|
+
const present = url.searchParams.getAll(name).includes(value);
|
|
186
|
+
if (sameOrigin && !present) {
|
|
187
|
+
url.searchParams.append(name, value);
|
|
188
|
+
changed = true;
|
|
189
|
+
}
|
|
190
|
+
else if (!sameOrigin && present) {
|
|
191
|
+
url.searchParams.delete(name, value);
|
|
192
|
+
changed = true;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return { headers: scoped, url: changed ? url : toUrl };
|
|
196
|
+
}
|
|
197
|
+
/** `headers` with its `Cookie` header replaced by what `hook` sends to `url`, given the hand-set one. */
|
|
198
|
+
function withJarCookies(headers, hook, url) {
|
|
199
|
+
let handSet;
|
|
200
|
+
const rest = {};
|
|
201
|
+
for (const [name, value] of Object.entries(headers)) {
|
|
202
|
+
if (name.toLowerCase() === 'cookie') {
|
|
203
|
+
handSet = value;
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
rest[name] = value;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
const cookie = hook.header(url.toString(), handSet);
|
|
210
|
+
return cookie === undefined ? rest : { ...rest, Cookie: cookie };
|
|
211
|
+
}
|
|
158
212
|
/** Joins undici's raw header shape (string | string[] per name) into our lower-cased map. */
|
|
159
213
|
function joinHeaders(raw) {
|
|
160
214
|
const headers = {};
|
|
@@ -228,6 +282,31 @@ async function drainBody(body) {
|
|
|
228
282
|
void chunk; // discard; just drives the stream to completion
|
|
229
283
|
}
|
|
230
284
|
}
|
|
285
|
+
/**
|
|
286
|
+
* Forwards an accepted stream's body to the sink until it ends, decoding it on the way when asked.
|
|
287
|
+
* Never throws: how the stream ended is the result. With the deadline cleared, the only abort left
|
|
288
|
+
* is the caller's own, so an abort reads as the client ending it and anything else as an error.
|
|
289
|
+
*/
|
|
290
|
+
async function pumpStream(body, contentEncoding, decompress, sink, signal) {
|
|
291
|
+
const decoder = decompress ? createDecompressStream(contentEncoding) : undefined;
|
|
292
|
+
const source = decoder === undefined ? body : pipeline(body, decoder, () => undefined);
|
|
293
|
+
try {
|
|
294
|
+
for await (const chunk of source) {
|
|
295
|
+
sink.onChunk(chunk);
|
|
296
|
+
}
|
|
297
|
+
return { by: 'server' };
|
|
298
|
+
}
|
|
299
|
+
catch (err) {
|
|
300
|
+
// Only the caller's signal can abort here: the deadline timer is cleared before streaming starts.
|
|
301
|
+
if (signal?.aborted === true)
|
|
302
|
+
return { by: 'client' };
|
|
303
|
+
return { by: 'error', error: err instanceof Error ? err.message : String(err) };
|
|
304
|
+
}
|
|
305
|
+
finally {
|
|
306
|
+
body.destroy();
|
|
307
|
+
decoder?.destroy();
|
|
308
|
+
}
|
|
309
|
+
}
|
|
231
310
|
/**
|
|
232
311
|
* Sends one HTTP request and returns the full {@link HttpExchange}, including
|
|
233
312
|
* reconstructed raw wire bytes and best-effort timings. Redirects (301/302/
|
|
@@ -275,13 +354,19 @@ export async function sendHttp(req, options) {
|
|
|
275
354
|
let currentMethod = req.method;
|
|
276
355
|
let currentBody = req.body;
|
|
277
356
|
let currentHeaders = { ...req.headers };
|
|
357
|
+
// What the last attempt sent: with a cookie hook, its `Cookie` header is the jar's.
|
|
358
|
+
let sentHeaders = req.headers;
|
|
278
359
|
let result;
|
|
279
360
|
for (let attempt = 0; attempt <= maxRedirects; attempt++) {
|
|
280
361
|
// Tells the tracker which origin the TLS events it is about to see belong to.
|
|
281
362
|
tracker.setOrigin(currentUrl.origin);
|
|
282
|
-
|
|
363
|
+
// The jar is matched afresh for every hop's URL (cookie jar spec §1.4). `currentHeaders` holds
|
|
364
|
+
// only the hand-set `Cookie`, which a cross-origin hop has already dropped.
|
|
365
|
+
const attemptHeaders = req.cookies === undefined ? currentHeaders : withJarCookies(currentHeaders, req.cookies, currentUrl);
|
|
366
|
+
sentHeaders = attemptHeaders;
|
|
367
|
+
const finalHeaders = buildFinalHeaders({ ...req, headers: attemptHeaders, method: currentMethod }, currentUrl, currentBody);
|
|
283
368
|
lastAttempt = failedRequestFor(currentUrl.toString(), currentMethod, finalHeaders, currentBody);
|
|
284
|
-
const rawRequest = buildRawRequest({ ...req, url: currentUrl.toString(), method: currentMethod, headers:
|
|
369
|
+
const rawRequest = buildRawRequest({ ...req, url: currentUrl.toString(), method: currentMethod, headers: attemptHeaders }, finalHeaders, currentBody);
|
|
285
370
|
let response;
|
|
286
371
|
try {
|
|
287
372
|
// Wraps the call itself (not its result) so the tracker can capture the exact
|
|
@@ -290,12 +375,14 @@ export async function sendHttp(req, options) {
|
|
|
290
375
|
// promise — see `TimingTracker.captureRequestFor`.
|
|
291
376
|
response = await tracker.captureRequestFor(() => undiciRequest(currentUrl, {
|
|
292
377
|
method: currentMethod,
|
|
293
|
-
headers:
|
|
378
|
+
headers: attemptHeaders,
|
|
294
379
|
...(currentBody !== undefined ? { body: currentBody } : {}),
|
|
295
380
|
dispatcher,
|
|
296
381
|
signal: combinedSignal ?? null,
|
|
297
382
|
headersTimeout: req.timeoutMs,
|
|
298
|
-
|
|
383
|
+
// An accepted stream may sit idle between events for as long as the server likes; a
|
|
384
|
+
// buffered response stays bounded by the overall deadline, always the tighter limit.
|
|
385
|
+
bodyTimeout: req.stream !== undefined ? 0 : req.timeoutMs,
|
|
299
386
|
}));
|
|
300
387
|
}
|
|
301
388
|
catch (err) {
|
|
@@ -308,6 +395,8 @@ export async function sendHttp(req, options) {
|
|
|
308
395
|
}
|
|
309
396
|
tracker.markHeaders();
|
|
310
397
|
const { headers, rawHeaders } = joinHeaders(response.headers);
|
|
398
|
+
// Every hop's Set-Cookie is stored against that hop's URL, before a redirect is followed.
|
|
399
|
+
req.cookies?.received(currentUrl.toString(), rawHeaders);
|
|
311
400
|
const isRedirect = req.followRedirects && REDIRECT_STATUSES.has(response.statusCode) && headers['location'] !== undefined;
|
|
312
401
|
if (isRedirect) {
|
|
313
402
|
if (attempt === maxRedirects) {
|
|
@@ -335,10 +424,58 @@ export async function sendHttp(req, options) {
|
|
|
335
424
|
// Drop credential headers (Authorization/Proxy-Authorization/Cookie)
|
|
336
425
|
// when the redirect crosses to a different origin.
|
|
337
426
|
currentHeaders = scopeHeadersToOrigin(currentHeaders, currentUrl, nextUrl);
|
|
338
|
-
|
|
427
|
+
if (req.originCredentials === undefined) {
|
|
428
|
+
currentUrl = nextUrl;
|
|
429
|
+
}
|
|
430
|
+
else {
|
|
431
|
+
// The caller's own credentials go to the request's origin only, on every hop.
|
|
432
|
+
const scoped = scopeCredentialsToOrigin(req.originCredentials, { url: parsedUrl, headers: req.headers }, currentHeaders, nextUrl);
|
|
433
|
+
currentHeaders = scoped.headers;
|
|
434
|
+
currentUrl = scoped.url;
|
|
435
|
+
}
|
|
339
436
|
continue;
|
|
340
437
|
}
|
|
341
|
-
|
|
438
|
+
let sink;
|
|
439
|
+
try {
|
|
440
|
+
sink = req.stream?.accept(response.statusCode, headers);
|
|
441
|
+
}
|
|
442
|
+
catch (err) {
|
|
443
|
+
// The body is never read now, so release its connection rather than leave it checked out.
|
|
444
|
+
response.body.destroy();
|
|
445
|
+
throw err;
|
|
446
|
+
}
|
|
447
|
+
if (sink !== undefined) {
|
|
448
|
+
// From here the stream runs until the server, the caller, or the network ends it.
|
|
449
|
+
clearTimeout(timer);
|
|
450
|
+
const streamEnd = await pumpStream(response.body, headers['content-encoding'], req.decompress ?? true, sink, req.signal);
|
|
451
|
+
result = {
|
|
452
|
+
status: response.statusCode,
|
|
453
|
+
headers,
|
|
454
|
+
rawHeaders,
|
|
455
|
+
rawBody: new Uint8Array(),
|
|
456
|
+
body: new Uint8Array(),
|
|
457
|
+
truncated: false,
|
|
458
|
+
rawRequest,
|
|
459
|
+
finalUrl: currentUrl.toString(),
|
|
460
|
+
finalMethod: currentMethod,
|
|
461
|
+
streamEnd,
|
|
462
|
+
};
|
|
463
|
+
break;
|
|
464
|
+
}
|
|
465
|
+
let read;
|
|
466
|
+
try {
|
|
467
|
+
read = await readBody(response.body, req.maxSizeBytes);
|
|
468
|
+
}
|
|
469
|
+
catch (err) {
|
|
470
|
+
// A body the deadline or the caller cuts short fails as the request would have.
|
|
471
|
+
throw toHttpError(err, {
|
|
472
|
+
userAborted: req.signal?.aborted === true,
|
|
473
|
+
deadlineHit: deadlineController.signal.aborted,
|
|
474
|
+
hadProxy: req.proxy !== undefined,
|
|
475
|
+
host: currentUrl.host,
|
|
476
|
+
});
|
|
477
|
+
}
|
|
478
|
+
const { data: rawBodyRaw, truncated } = read;
|
|
342
479
|
const decompress = req.decompress ?? true;
|
|
343
480
|
let body = rawBodyRaw;
|
|
344
481
|
let decodeError;
|
|
@@ -374,7 +511,11 @@ export async function sendHttp(req, options) {
|
|
|
374
511
|
const rawResponse = buildRawResponse(result.status, statusText(result.status), result.rawHeaders, result.rawBody, httpVersion);
|
|
375
512
|
const timings = tracker.finish();
|
|
376
513
|
return {
|
|
377
|
-
request: {
|
|
514
|
+
request: {
|
|
515
|
+
url: result.finalUrl,
|
|
516
|
+
method: result.finalMethod,
|
|
517
|
+
headers: req.cookies === undefined ? req.headers : sentHeaders,
|
|
518
|
+
},
|
|
378
519
|
status: result.status,
|
|
379
520
|
statusText: statusText(result.status),
|
|
380
521
|
headers: result.headers,
|
|
@@ -389,6 +530,7 @@ export async function sendHttp(req, options) {
|
|
|
389
530
|
rawResponse,
|
|
390
531
|
redirects,
|
|
391
532
|
...(tlsInfo !== undefined ? { tls: tlsInfo } : {}),
|
|
533
|
+
...(result.streamEnd !== undefined ? { streamEnd: result.streamEnd } : {}),
|
|
392
534
|
};
|
|
393
535
|
}
|
|
394
536
|
catch (err) {
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The cookies a response sets: what one is, and how every `Set-Cookie` header is read.
|
|
3
|
+
*
|
|
4
|
+
* In `http/` because a sequence's transfers read a response's cookies whatever protocol sent the
|
|
5
|
+
* request, and core imports no protocol folder (protocol modules spec §7.2). `rest/response.ts`
|
|
6
|
+
* re-exports both names. The jar's types live here for the same reason; the jar itself is
|
|
7
|
+
* `rest/cookie-jar.ts`.
|
|
8
|
+
*/
|
|
9
|
+
/** One cookie a response set, with the attributes it declared. */
|
|
10
|
+
export interface Cookie {
|
|
11
|
+
readonly name: string;
|
|
12
|
+
readonly value: string;
|
|
13
|
+
readonly domain?: string;
|
|
14
|
+
readonly path?: string;
|
|
15
|
+
/** As declared, in ISO form when it could be parsed; absent for a session cookie. */
|
|
16
|
+
readonly expires?: string;
|
|
17
|
+
readonly maxAge?: number;
|
|
18
|
+
readonly secure?: boolean;
|
|
19
|
+
readonly httpOnly?: boolean;
|
|
20
|
+
readonly sameSite?: 'Strict' | 'Lax' | 'None';
|
|
21
|
+
/** Set when the header could not be parsed as a cookie; `name` then holds the whole line. */
|
|
22
|
+
readonly malformed?: boolean;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* One cookie the jar holds (cookie jar spec §1.1). Its identity is `(name, domain, path)`; the
|
|
26
|
+
* response-side {@link Cookie} becomes one only when the jar stores it, because only then is the
|
|
27
|
+
* request URL known.
|
|
28
|
+
*/
|
|
29
|
+
export interface StoredCookie {
|
|
30
|
+
readonly name: string;
|
|
31
|
+
readonly value: string;
|
|
32
|
+
/** The Domain attribute (no leading dot), or the request host for a host-only cookie. */
|
|
33
|
+
readonly domain: string;
|
|
34
|
+
/** True when the response gave no Domain: the cookie goes back to that exact host only. */
|
|
35
|
+
readonly hostOnly: boolean;
|
|
36
|
+
/** The Path attribute, or the default path of the URL that set it (RFC 6265 §5.1.4). */
|
|
37
|
+
readonly path: string;
|
|
38
|
+
/** Absolute expiry in epoch ms, from Max-Age first and then Expires; absent for a session cookie. */
|
|
39
|
+
readonly expiresAt?: number;
|
|
40
|
+
readonly secure: boolean;
|
|
41
|
+
readonly httpOnly: boolean;
|
|
42
|
+
readonly sameSite?: 'Strict' | 'Lax' | 'None';
|
|
43
|
+
/** Epoch ms when first stored; kept when a later response replaces the value (§5.3 step 11). */
|
|
44
|
+
readonly createdAt: number;
|
|
45
|
+
}
|
|
46
|
+
/** What names one stored cookie. */
|
|
47
|
+
export interface CookieKey {
|
|
48
|
+
readonly name: string;
|
|
49
|
+
readonly domain: string;
|
|
50
|
+
readonly path: string;
|
|
51
|
+
}
|
|
52
|
+
/** Why the jar did not store a cookie a response set. */
|
|
53
|
+
export type CookieRejection = 'deleted' | 'domain-mismatch' | 'domain-not-allowed' | 'secure-over-http' | 'too-large' | 'malformed';
|
|
54
|
+
/** The jar's verdict on one cookie a response set. */
|
|
55
|
+
export type CookieVerdict = {
|
|
56
|
+
readonly stored: true;
|
|
57
|
+
} | {
|
|
58
|
+
readonly stored: false;
|
|
59
|
+
readonly reason: CookieRejection;
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* What a host lends a send for its cookies (cookie jar spec §1.4): every REST send reports what each
|
|
63
|
+
* response set, redirect hops included, and a request whose `sendCookies` is on carries what the jar
|
|
64
|
+
* matches for each hop's URL. Here, in core, so `run/host.ts` can name it without importing `rest/`.
|
|
65
|
+
*/
|
|
66
|
+
export interface CookieJarHost {
|
|
67
|
+
/** The jar cookies a request to `url` would carry, in RFC 6265 §5.4 order. */
|
|
68
|
+
cookiesFor(url: string): readonly StoredCookie[];
|
|
69
|
+
/** Stores what a response to `url` set; one verdict per cookie, in order. */
|
|
70
|
+
remember(url: string, cookies: readonly Cookie[]): readonly CookieVerdict[];
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Parses every `Set-Cookie` header of a response (RFC 6265 §5.2).
|
|
74
|
+
*
|
|
75
|
+
* `rawHeaders` rather than the merged map, because several cookies arrive as several headers and
|
|
76
|
+
* joining them with `, ` — which is what merging does — makes them unparseable. A line that is not
|
|
77
|
+
* a cookie at all is kept as `malformed` instead of dropped: it is evidence about the server.
|
|
78
|
+
*/
|
|
79
|
+
export declare function parseSetCookie(rawHeaders: readonly (readonly [string, string])[]): Cookie[];
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The cookies a response sets: what one is, and how every `Set-Cookie` header is read.
|
|
3
|
+
*
|
|
4
|
+
* In `http/` because a sequence's transfers read a response's cookies whatever protocol sent the
|
|
5
|
+
* request, and core imports no protocol folder (protocol modules spec §7.2). `rest/response.ts`
|
|
6
|
+
* re-exports both names. The jar's types live here for the same reason; the jar itself is
|
|
7
|
+
* `rest/cookie-jar.ts`.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Parses every `Set-Cookie` header of a response (RFC 6265 §5.2).
|
|
11
|
+
*
|
|
12
|
+
* `rawHeaders` rather than the merged map, because several cookies arrive as several headers and
|
|
13
|
+
* joining them with `, ` — which is what merging does — makes them unparseable. A line that is not
|
|
14
|
+
* a cookie at all is kept as `malformed` instead of dropped: it is evidence about the server.
|
|
15
|
+
*/
|
|
16
|
+
export function parseSetCookie(rawHeaders) {
|
|
17
|
+
const cookies = [];
|
|
18
|
+
for (const [name, value] of rawHeaders) {
|
|
19
|
+
if (name.toLowerCase() !== 'set-cookie') {
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
cookies.push(parseOne(value));
|
|
23
|
+
}
|
|
24
|
+
return cookies;
|
|
25
|
+
}
|
|
26
|
+
function parseOne(header) {
|
|
27
|
+
const parts = header.split(';');
|
|
28
|
+
const pair = parts[0] ?? '';
|
|
29
|
+
const equals = pair.indexOf('=');
|
|
30
|
+
if (equals <= 0) {
|
|
31
|
+
return { name: header.trim(), value: '', malformed: true };
|
|
32
|
+
}
|
|
33
|
+
const cookie = {
|
|
34
|
+
name: pair.slice(0, equals).trim(),
|
|
35
|
+
value: unquote(pair.slice(equals + 1).trim()),
|
|
36
|
+
};
|
|
37
|
+
for (const attribute of parts.slice(1)) {
|
|
38
|
+
const split = attribute.indexOf('=');
|
|
39
|
+
const key = (split === -1 ? attribute : attribute.slice(0, split)).trim().toLowerCase();
|
|
40
|
+
const attributeValue = split === -1 ? '' : attribute.slice(split + 1).trim();
|
|
41
|
+
switch (key) {
|
|
42
|
+
case 'domain':
|
|
43
|
+
// A leading dot is legal and means the same as its absence (RFC 6265 §5.2.3).
|
|
44
|
+
cookie.domain = attributeValue.replace(/^\./, '').toLowerCase();
|
|
45
|
+
break;
|
|
46
|
+
case 'path':
|
|
47
|
+
cookie.path = attributeValue;
|
|
48
|
+
break;
|
|
49
|
+
case 'expires': {
|
|
50
|
+
const date = new Date(attributeValue);
|
|
51
|
+
cookie.expires = Number.isNaN(date.getTime()) ? attributeValue : date.toISOString();
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
case 'max-age': {
|
|
55
|
+
const seconds = Number.parseInt(attributeValue, 10);
|
|
56
|
+
if (!Number.isNaN(seconds)) {
|
|
57
|
+
cookie.maxAge = seconds;
|
|
58
|
+
}
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
case 'secure':
|
|
62
|
+
cookie.secure = true;
|
|
63
|
+
break;
|
|
64
|
+
case 'httponly':
|
|
65
|
+
cookie.httpOnly = true;
|
|
66
|
+
break;
|
|
67
|
+
case 'samesite': {
|
|
68
|
+
const normalized = attributeValue.toLowerCase();
|
|
69
|
+
cookie.sameSite = normalized === 'strict' ? 'Strict' : normalized === 'none' ? 'None' : 'Lax';
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
default:
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return cookie;
|
|
77
|
+
}
|
|
78
|
+
/** Strips one layer of double quotes from a cookie value, which some servers add. */
|
|
79
|
+
function unquote(value) {
|
|
80
|
+
return value.length > 1 && value.startsWith('"') && value.endsWith('"') ? value.slice(1, -1) : value;
|
|
81
|
+
}
|
package/dist/http/curl.d.ts
CHANGED
|
@@ -4,10 +4,9 @@
|
|
|
4
4
|
*
|
|
5
5
|
* {@link toCurl} describes a request in `curl`'s own terms — a method, a URL, headers and one of the
|
|
6
6
|
* body shapes `curl` has a flag for — and knows nothing about SOAP or REST. Each protocol builds that
|
|
7
|
-
* description from its own send input (
|
|
7
|
+
* description from its own send input (`soapToCurl` in `soap/curl.ts`, `restToCurl` in `rest/curl.ts`), so the
|
|
8
8
|
* quoting, the line continuations and the two shells have one implementation rather than two.
|
|
9
9
|
*/
|
|
10
|
-
import type { SoapSendInput } from '../types.js';
|
|
11
10
|
/** One header of an exported command, in the order the user wrote it. */
|
|
12
11
|
export interface CurlHeader {
|
|
13
12
|
readonly name: string;
|
|
@@ -65,8 +64,10 @@ export interface CurlCommand {
|
|
|
65
64
|
/** `-L`, with `--max-redirs` when a limit is set. */
|
|
66
65
|
readonly followRedirects?: boolean;
|
|
67
66
|
readonly maxRedirects?: number;
|
|
67
|
+
/** `-N`/`--no-buffer`: don't hold output back waiting for a full buffer, for a streamed response. */
|
|
68
|
+
readonly noBuffer?: boolean;
|
|
68
69
|
}
|
|
69
|
-
/** Options for {@link toCurl} and
|
|
70
|
+
/** Options for {@link toCurl} and for `soapToCurl` in `soap/curl.ts`. */
|
|
70
71
|
export interface ToCurlOptions {
|
|
71
72
|
/** Target shell for line continuations and quoting. Default 'posix'. */
|
|
72
73
|
readonly shell?: 'posix' | 'powershell';
|
|
@@ -81,14 +82,3 @@ export declare function quoteForShell(value: string, shell: 'posix' | 'powershel
|
|
|
81
82
|
* carries all of it unchanged — which is also what {@link fromCurl} reads back.
|
|
82
83
|
*/
|
|
83
84
|
export declare function toCurl(command: CurlCommand, options?: ToCurlOptions): string;
|
|
84
|
-
/** Builds a `curl` command reproducing a SOAP send — headers, envelope and all. */
|
|
85
|
-
export declare function soapToCurl(input: SoapSendInput & {
|
|
86
|
-
readonly contentType?: string;
|
|
87
|
-
}, options?: ToCurlOptions): string;
|
|
88
|
-
/** Result of {@link fromCurl}. */
|
|
89
|
-
export interface FromCurlResult {
|
|
90
|
-
readonly input: Partial<SoapSendInput>;
|
|
91
|
-
readonly problems: readonly string[];
|
|
92
|
-
}
|
|
93
|
-
/** Parses a pasted `curl` command back into a partial {@link SoapSendInput}. */
|
|
94
|
-
export declare function fromCurl(text: string): FromCurlResult;
|