@wirebench/engine 2.2.1 → 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
package/dist/ws/session.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* One WebSocket connection from handshake to close,
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
2
|
+
* One WebSocket connection from handshake to close, recorded frame by frame. It is one of the two
|
|
3
|
+
* files that touch undici's WebSocket: the other, `connect.ts`, hands a bare socket to a caller with
|
|
4
|
+
* its own protocol, and both build their dispatcher with `wsDispatcher`. It knows nothing about
|
|
5
|
+
* projects or containers: a saved WebSocket request opens one through `call.ts`, and anything else
|
|
6
|
+
* that needs a recorded socket (a subscription protocol layered on a subprotocol, a contract check
|
|
7
|
+
* wrapped around `onFrame`) opens one the same way.
|
|
6
8
|
*
|
|
7
9
|
* Whatever the server does is a result. `done` never rejects: a refused handshake, a dropped
|
|
8
10
|
* socket and a clean close all resolve with the exchange that records them. A bad *option* is
|
|
@@ -10,13 +12,23 @@
|
|
|
10
12
|
* whatever it had already built (subscriptions, an owned dispatcher) before doing so.
|
|
11
13
|
*/
|
|
12
14
|
import diagnosticsChannel from 'node:diagnostics_channel';
|
|
13
|
-
import {
|
|
15
|
+
import { WebSocket } from 'undici';
|
|
14
16
|
import { WsError } from '../errors.js';
|
|
15
|
-
import { createDispatcher, proxyAgentOptionsFor } from '../http/client.js';
|
|
16
17
|
import { sslInfoForSocket } from '../http/tls.js';
|
|
18
|
+
import { wsDispatcher } from './connect.js';
|
|
17
19
|
const DEFAULT_HANDSHAKE_TIMEOUT_MS = 30_000;
|
|
18
|
-
/**
|
|
19
|
-
|
|
20
|
+
/**
|
|
21
|
+
* How a handshake that timed out begins its `error`: the one failure a caller tells apart from a
|
|
22
|
+
* refusal (the run facet fails a run's send with `timeout` for it). Not part of the public surface.
|
|
23
|
+
*/
|
|
24
|
+
export const HANDSHAKE_TIMEOUT_ERROR = 'The server did not answer the handshake within';
|
|
25
|
+
/**
|
|
26
|
+
* RFC 6455 §7.4, as the WHATWG API enforces it: 1000, or the 3000–4999 range. Exported for the run
|
|
27
|
+
* facet, which refuses a bad code when it is asked to close rather than when the close goes out.
|
|
28
|
+
*
|
|
29
|
+
* @throws WsError `ws-bad-close`
|
|
30
|
+
*/
|
|
31
|
+
export function assertCloseCode(code) {
|
|
20
32
|
if (code !== 1000 && !(code >= 3000 && code <= 4999)) {
|
|
21
33
|
throw new WsError('ws-bad-close', `${code} is not a close code an application may send (1000, or 3000–4999)`, {
|
|
22
34
|
details: { code },
|
|
@@ -76,12 +88,9 @@ export function openWsSession(options, hooks = {}) {
|
|
|
76
88
|
details: { url: options.url },
|
|
77
89
|
});
|
|
78
90
|
}
|
|
79
|
-
//
|
|
80
|
-
// `
|
|
81
|
-
|
|
82
|
-
// an unproxied one owns a dispatcher only when it asked for TLS/bind-address options that
|
|
83
|
-
// `createDispatcher` would otherwise hand back the shared keep-alive agent for.
|
|
84
|
-
const ownsDispatcher = options.proxy !== undefined || options.tls !== undefined || options.localAddress !== undefined;
|
|
91
|
+
// Which dispatcher the handshake gets, and whether this session must close it, is `wsDispatcher`'s
|
|
92
|
+
// rule (`connect.ts`). It is assigned in the try block that builds the socket, below.
|
|
93
|
+
let ownsDispatcher = false;
|
|
85
94
|
const httpOrigin = `${target.protocol === 'wss:' ? 'https:' : 'http:'}//${target.host}`;
|
|
86
95
|
const frames = [];
|
|
87
96
|
const counts = { sent: 0, received: 0, bytesSent: 0, bytesReceived: 0 };
|
|
@@ -91,6 +100,9 @@ export function openWsSession(options, hooks = {}) {
|
|
|
91
100
|
let closedBy;
|
|
92
101
|
let failure;
|
|
93
102
|
let settled = false;
|
|
103
|
+
/** The upgrade's socket, which a close the server never answers tears down after `closeGraceMs`. */
|
|
104
|
+
let connection;
|
|
105
|
+
let closeTimer;
|
|
94
106
|
const record = (direction, opcode, payload, close) => {
|
|
95
107
|
const bytes = typeof payload === 'string' ? Buffer.from(payload, 'utf8') : Buffer.from(payload);
|
|
96
108
|
const binaryish = opcode === 'binary' || ((opcode === 'ping' || opcode === 'pong') && bytes.length > 0);
|
|
@@ -139,6 +151,7 @@ export function openWsSession(options, hooks = {}) {
|
|
|
139
151
|
if (!isUpgradeHeadFor(message, httpOrigin, `${target.pathname}${target.search}`))
|
|
140
152
|
return;
|
|
141
153
|
rawRequestHead = message.headers;
|
|
154
|
+
connection = message.socket;
|
|
142
155
|
if (message.socket?.encrypted === true)
|
|
143
156
|
tls = sslInfoForSocket(message.socket);
|
|
144
157
|
};
|
|
@@ -190,16 +203,7 @@ export function openWsSession(options, hooks = {}) {
|
|
|
190
203
|
// owned dispatcher if one got built, then report `ws-bad-options` instead of leaking either.
|
|
191
204
|
let dispatcher;
|
|
192
205
|
try {
|
|
193
|
-
dispatcher =
|
|
194
|
-
options.proxy !== undefined
|
|
195
|
-
? new ProxyAgent(proxyAgentOptionsFor(options.proxy, {
|
|
196
|
-
...(options.tls !== undefined ? { tls: options.tls } : {}),
|
|
197
|
-
...(options.localAddress !== undefined ? { localAddress: options.localAddress } : {}),
|
|
198
|
-
}, false, { proxyTunnel: true }))
|
|
199
|
-
: createDispatcher({
|
|
200
|
-
...(options.tls !== undefined ? { tls: options.tls } : {}),
|
|
201
|
-
...(options.localAddress !== undefined ? { localAddress: options.localAddress } : {}),
|
|
202
|
-
});
|
|
206
|
+
({ dispatcher, owned: ownsDispatcher } = wsDispatcher(options));
|
|
203
207
|
diagnosticsChannel.subscribe('undici:client:sendHeaders', onSendHeaders);
|
|
204
208
|
diagnosticsChannel.subscribe('undici:websocket:open', onOpenChannel);
|
|
205
209
|
diagnosticsChannel.subscribe('undici:websocket:ping', onPing);
|
|
@@ -236,6 +240,7 @@ export function openWsSession(options, hooks = {}) {
|
|
|
236
240
|
return;
|
|
237
241
|
settled = true;
|
|
238
242
|
clearTimeout(timer);
|
|
243
|
+
clearTimeout(closeTimer);
|
|
239
244
|
options.signal?.removeEventListener('abort', onAbort);
|
|
240
245
|
unsubscribeAll();
|
|
241
246
|
const clean = wasClean && handshake !== undefined;
|
|
@@ -262,16 +267,37 @@ export function openWsSession(options, hooks = {}) {
|
|
|
262
267
|
hooks.onClosed?.(exchange);
|
|
263
268
|
resolveDone(exchange);
|
|
264
269
|
};
|
|
270
|
+
/**
|
|
271
|
+
* Lets go of a connection whose close the server never answered: the socket is destroyed, and the
|
|
272
|
+
* session settles with 1006 on the next macrotask if undici reports nothing of it.
|
|
273
|
+
*/
|
|
274
|
+
const tearDown = () => {
|
|
275
|
+
if (settled)
|
|
276
|
+
return;
|
|
277
|
+
connection?.destroy?.();
|
|
278
|
+
setTimeout(() => settle(1006, '', false), 0);
|
|
279
|
+
};
|
|
280
|
+
/** Gives a close from this side `closeGraceMs` to be answered, when the options bound it. */
|
|
281
|
+
const boundClose = () => {
|
|
282
|
+
if (options.closeGraceMs === undefined || closeTimer !== undefined)
|
|
283
|
+
return;
|
|
284
|
+
closeTimer = setTimeout(tearDown, options.closeGraceMs);
|
|
285
|
+
};
|
|
265
286
|
/** Ends a session the server never ended: a timeout, or an abort. */
|
|
266
287
|
const fail = (message) => {
|
|
267
288
|
failure ??= message;
|
|
268
289
|
closedBy ??= 'error';
|
|
290
|
+
// A cancel while the close waits for its answer, when the wait is bounded, waits no more.
|
|
291
|
+
if (ws.readyState === WebSocket.CLOSING && options.closeGraceMs !== undefined) {
|
|
292
|
+
tearDown();
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
269
295
|
// There is no abort for a connecting socket; close() on one fails the handshake, which is the point.
|
|
270
296
|
ws.close();
|
|
271
297
|
};
|
|
272
298
|
const timer = setTimeout(() => {
|
|
273
299
|
if (handshake === undefined)
|
|
274
|
-
fail(
|
|
300
|
+
fail(`${HANDSHAKE_TIMEOUT_ERROR} ${timeoutMs} ms`);
|
|
275
301
|
}, timeoutMs);
|
|
276
302
|
const onAbort = () => fail('The connection was cancelled');
|
|
277
303
|
if (options.signal?.aborted === true)
|
|
@@ -328,6 +354,7 @@ export function openWsSession(options, hooks = {}) {
|
|
|
328
354
|
if (ws.readyState === WebSocket.OPEN)
|
|
329
355
|
record('sent', 'close', reason, { code, reason });
|
|
330
356
|
ws.close(code, reason);
|
|
357
|
+
boundClose();
|
|
331
358
|
},
|
|
332
359
|
};
|
|
333
360
|
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How WebSocket APIs are stored in a project folder (spec §3.2): `apis/<slug>/api.yaml` with
|
|
3
|
+
* `kind: websocket`, and a tree of folders and `*.request.yaml` files under `requests/`, each saved
|
|
4
|
+
* message in a sibling `<slug>.msg-<message slug>.<ext>`.
|
|
5
|
+
*/
|
|
6
|
+
import type { ProtocolStorage } from '../protocol/module.js';
|
|
7
|
+
import type { WsApi } from './model.js';
|
|
8
|
+
/** WebSocket's storage facet. */
|
|
9
|
+
export declare const wsStorage: ProtocolStorage<WsApi>;
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How WebSocket APIs are stored in a project folder (spec §3.2): `apis/<slug>/api.yaml` with
|
|
3
|
+
* `kind: websocket`, and a tree of folders and `*.request.yaml` files under `requests/`, each saved
|
|
4
|
+
* message in a sibling `<slug>.msg-<message slug>.<ext>`.
|
|
5
|
+
*/
|
|
6
|
+
import { toCallbackAssertion } from '../assert/schema.js';
|
|
7
|
+
import { ProjectError } from '../errors.js';
|
|
8
|
+
import { readFileIfExists } from '../project/fs.js';
|
|
9
|
+
import { abs, authConfig, definitionAuth, exact, keyValueEntries, loadFolderContents, optional, readYaml, } from '../project/load-helpers.js';
|
|
10
|
+
import { apiManagedFiles } from '../project/managed-files.js';
|
|
11
|
+
import { API_FILE, APIS_DIR, assertPathSegment, REQUEST_SUFFIX, REQUESTS_DIR } from '../project/paths.js';
|
|
12
|
+
import { assertSupportedKind, parseFile } from '../project/schema-parts.js';
|
|
13
|
+
import { addFolderFiles, authDocument, definitionDocument, keyValueDocuments } from '../project/serialize-helpers.js';
|
|
14
|
+
import { compact, stringifyYaml } from '../project/yaml.js';
|
|
15
|
+
import { wsApiFileSchema, wsRequestFileSchema } from './files.js';
|
|
16
|
+
import { wsMessageFileName } from './model.js';
|
|
17
|
+
/**
|
|
18
|
+
* Reads a WebSocket request and its saved messages, each in its own sibling file. A message whose
|
|
19
|
+
* file is gone loads with empty content and a `missing-body` problem, exactly as a gRPC message
|
|
20
|
+
* does; its slug is recovered from the file name between the `.msg-` marker and the extension.
|
|
21
|
+
*/
|
|
22
|
+
function wsRequestReader(fs, root, problems) {
|
|
23
|
+
return async (dir, fileName, unclaimed) => {
|
|
24
|
+
const relative = `${dir}/${fileName}`;
|
|
25
|
+
const document = await readYaml(fs, root, relative);
|
|
26
|
+
assertSupportedKind(document, relative);
|
|
27
|
+
const parsed = parseFile(wsRequestFileSchema, document, relative);
|
|
28
|
+
unclaimed.delete(fileName);
|
|
29
|
+
const requestSlug = fileName.slice(0, -REQUEST_SUFFIX.length);
|
|
30
|
+
const messages = [];
|
|
31
|
+
for (const entry of parsed.messages) {
|
|
32
|
+
assertPathSegment(entry.file);
|
|
33
|
+
unclaimed.delete(entry.file);
|
|
34
|
+
const messageRelative = `${dir}/${entry.file}`;
|
|
35
|
+
const text = await readFileIfExists(fs, abs(root, messageRelative));
|
|
36
|
+
if (text === undefined) {
|
|
37
|
+
problems.push({
|
|
38
|
+
code: 'missing-body',
|
|
39
|
+
message: `Request "${parsed.name}" has no message file; loaded with an empty message`,
|
|
40
|
+
file: messageRelative,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
const slug = entry.file.slice(`${requestSlug}.msg-`.length, entry.file.lastIndexOf('.'));
|
|
44
|
+
messages.push({
|
|
45
|
+
id: entry.id,
|
|
46
|
+
name: entry.name,
|
|
47
|
+
slug,
|
|
48
|
+
format: entry.format,
|
|
49
|
+
content: text === undefined ? '' : text.toString('utf8'),
|
|
50
|
+
...(entry.contract !== undefined
|
|
51
|
+
? { contract: { message: entry.contract.message, generated: entry.contract.generated } }
|
|
52
|
+
: {}),
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
kind: 'websocket',
|
|
57
|
+
id: parsed.id,
|
|
58
|
+
name: parsed.name,
|
|
59
|
+
slug: requestSlug,
|
|
60
|
+
order: parsed.order,
|
|
61
|
+
...optional('description', parsed.description),
|
|
62
|
+
url: parsed.url,
|
|
63
|
+
query: keyValueEntries(parsed.query),
|
|
64
|
+
headers: keyValueEntries(parsed.headers),
|
|
65
|
+
subprotocols: parsed.subprotocols,
|
|
66
|
+
auth: authConfig(parsed.auth),
|
|
67
|
+
settings: exact(parsed.settings),
|
|
68
|
+
messages,
|
|
69
|
+
assertions: parsed.assertions.map((a) => (a.type === 'callback' ? toCallbackAssertion(a) : exact(a))),
|
|
70
|
+
...(parsed.contract !== undefined ? { contract: { channel: parsed.contract.channel } } : {}),
|
|
71
|
+
...(parsed.orphaned === true ? { orphaned: true } : {}),
|
|
72
|
+
};
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* A WebSocket request as written: each saved message goes to a sibling file, so a JSON message is a
|
|
77
|
+
* JSON file in git. Siblings rather than a directory, because every directory here loads as a folder.
|
|
78
|
+
*
|
|
79
|
+
* @throws ProjectError `duplicate-slug` when two of the request's messages share a slug.
|
|
80
|
+
*/
|
|
81
|
+
const writeWsRequest = (files, dir, request) => {
|
|
82
|
+
const messages = request.messages.map((message) => {
|
|
83
|
+
const file = wsMessageFileName(request.slug, message);
|
|
84
|
+
assertPathSegment(file);
|
|
85
|
+
if (files.has(`${dir}/${file}`)) {
|
|
86
|
+
throw new ProjectError('duplicate-slug', `Request "${request.name}" has two messages named "${message.slug}"`, {
|
|
87
|
+
details: { file: `${dir}/${file}` },
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
files.set(`${dir}/${file}`, message.content);
|
|
91
|
+
return compact({
|
|
92
|
+
id: message.id,
|
|
93
|
+
name: message.name,
|
|
94
|
+
format: message.format === 'binary' ? 'binary' : undefined,
|
|
95
|
+
file,
|
|
96
|
+
contract: message.contract === undefined
|
|
97
|
+
? undefined
|
|
98
|
+
: { message: message.contract.message, generated: message.contract.generated },
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
files.set(`${dir}/${request.slug}${REQUEST_SUFFIX}`, stringifyYaml(compact({
|
|
102
|
+
kind: request.kind,
|
|
103
|
+
id: request.id,
|
|
104
|
+
name: request.name,
|
|
105
|
+
order: request.order,
|
|
106
|
+
description: request.description,
|
|
107
|
+
url: request.url,
|
|
108
|
+
query: request.query.length > 0 ? keyValueDocuments(request.query) : undefined,
|
|
109
|
+
headers: request.headers.length > 0 ? keyValueDocuments(request.headers) : undefined,
|
|
110
|
+
subprotocols: request.subprotocols.length > 0 ? [...request.subprotocols] : undefined,
|
|
111
|
+
auth: authDocument(request.auth),
|
|
112
|
+
settings: Object.keys(request.settings).length > 0 ? compact({ ...request.settings }) : undefined,
|
|
113
|
+
messages: messages.length > 0 ? messages : undefined,
|
|
114
|
+
assertions: request.assertions.length > 0 ? request.assertions.map((a) => compact({ ...a })) : undefined,
|
|
115
|
+
contract: request.contract === undefined ? undefined : { channel: request.contract.channel },
|
|
116
|
+
orphaned: request.orphaned === true ? true : undefined,
|
|
117
|
+
})));
|
|
118
|
+
};
|
|
119
|
+
/** Every file one WebSocket API occupies. It shares `apis/` with the others; its `kind` says which it is. */
|
|
120
|
+
function addWsApiFiles(files, api) {
|
|
121
|
+
assertPathSegment(api.slug);
|
|
122
|
+
const base = `${APIS_DIR}/${api.slug}`;
|
|
123
|
+
files.set(`${base}/${API_FILE}`, stringifyYaml(compact({
|
|
124
|
+
kind: api.kind,
|
|
125
|
+
id: api.id,
|
|
126
|
+
name: api.name,
|
|
127
|
+
order: api.order,
|
|
128
|
+
description: api.description,
|
|
129
|
+
url: api.url,
|
|
130
|
+
headers: api.headers.length > 0 ? keyValueDocuments(api.headers) : undefined,
|
|
131
|
+
auth: api.auth === undefined ? undefined : authDocument(api.auth),
|
|
132
|
+
definition: api.definition === undefined ? undefined : definitionDocument(api.definition),
|
|
133
|
+
})));
|
|
134
|
+
addFolderFiles(files, `${base}/${REQUESTS_DIR}`, api, 0, writeWsRequest);
|
|
135
|
+
}
|
|
136
|
+
/** WebSocket's storage facet. */
|
|
137
|
+
export const wsStorage = {
|
|
138
|
+
dir: APIS_DIR,
|
|
139
|
+
async load(ctx, slug, document) {
|
|
140
|
+
const { fs, root, problems } = ctx;
|
|
141
|
+
const parsed = parseFile(wsApiFileSchema, document, `${APIS_DIR}/${slug}/${API_FILE}`);
|
|
142
|
+
const contents = await loadFolderContents(fs, root, `${APIS_DIR}/${slug}/${REQUESTS_DIR}`, 0, problems, wsRequestReader(fs, root, problems));
|
|
143
|
+
return {
|
|
144
|
+
kind: 'websocket',
|
|
145
|
+
id: parsed.id,
|
|
146
|
+
name: parsed.name,
|
|
147
|
+
slug,
|
|
148
|
+
order: parsed.order,
|
|
149
|
+
...optional('description', parsed.description),
|
|
150
|
+
url: parsed.url,
|
|
151
|
+
headers: keyValueEntries(parsed.headers),
|
|
152
|
+
...(parsed.auth !== undefined ? { auth: authConfig(parsed.auth) } : {}),
|
|
153
|
+
...(parsed.definition !== undefined
|
|
154
|
+
? {
|
|
155
|
+
definition: {
|
|
156
|
+
kind: parsed.definition.kind,
|
|
157
|
+
source: parsed.definition.source,
|
|
158
|
+
cache: parsed.definition.cache,
|
|
159
|
+
...optional('server', parsed.definition.server),
|
|
160
|
+
...optional('auth', definitionAuth(parsed.definition.auth)),
|
|
161
|
+
},
|
|
162
|
+
}
|
|
163
|
+
: {}),
|
|
164
|
+
folders: contents.folders,
|
|
165
|
+
requests: contents.requests,
|
|
166
|
+
};
|
|
167
|
+
},
|
|
168
|
+
files(api) {
|
|
169
|
+
const files = new Map();
|
|
170
|
+
addWsApiFiles(files, api);
|
|
171
|
+
return files;
|
|
172
|
+
},
|
|
173
|
+
managed: (fs, root, slug) => apiManagedFiles(fs, root, slug),
|
|
174
|
+
containers: (project) => project.wsApis,
|
|
175
|
+
withContainers: (project, wsApis) => ({ ...project, wsApis }),
|
|
176
|
+
};
|
package/dist/ws/transcript.d.ts
CHANGED
|
@@ -2,13 +2,12 @@
|
|
|
2
2
|
* What History keeps of a session. Both ends, because the end — the last messages before an
|
|
3
3
|
* unexpected close — is what a person comes back for, and a first-N cap loses exactly that.
|
|
4
4
|
*/
|
|
5
|
+
import { WS_HISTORY_HEAD, WS_HISTORY_MAX_BYTES, WS_HISTORY_TAIL } from '../http/transcript-cap.js';
|
|
5
6
|
import type { WsFrame } from './model.js';
|
|
6
|
-
export
|
|
7
|
-
export declare const WS_HISTORY_TAIL = 100;
|
|
8
|
-
export declare const WS_HISTORY_MAX_BYTES = 1048576;
|
|
7
|
+
export { WS_HISTORY_HEAD, WS_HISTORY_MAX_BYTES, WS_HISTORY_TAIL };
|
|
9
8
|
export interface WsTranscript {
|
|
10
9
|
readonly frames: readonly WsFrame[];
|
|
11
10
|
readonly truncated: boolean;
|
|
12
11
|
readonly omittedFrames: number;
|
|
13
12
|
}
|
|
14
|
-
export declare function capFrames(
|
|
13
|
+
export declare function capFrames(input: readonly WsFrame[]): WsTranscript;
|
package/dist/ws/transcript.js
CHANGED
|
@@ -1,20 +1,28 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
1
|
+
/**
|
|
2
|
+
* What History keeps of a session. Both ends, because the end — the last messages before an
|
|
3
|
+
* unexpected close — is what a person comes back for, and a first-N cap loses exactly that.
|
|
4
|
+
*/
|
|
5
|
+
import { capByEnds, WS_HISTORY_HEAD, WS_HISTORY_MAX_BYTES, WS_HISTORY_TAIL } from '../http/transcript-cap.js';
|
|
6
|
+
export { WS_HISTORY_HEAD, WS_HISTORY_MAX_BYTES, WS_HISTORY_TAIL };
|
|
7
|
+
/** History keeps a frame's contract verdict but not its problem list: the list is for the live
|
|
8
|
+
* view, and re-checking a saved frame recomputes it. */
|
|
9
|
+
function withoutProblems(frame) {
|
|
10
|
+
if (frame.contract?.problems === undefined)
|
|
11
|
+
return frame;
|
|
12
|
+
const { status, message, reason } = frame.contract;
|
|
13
|
+
const contract = {
|
|
14
|
+
status,
|
|
15
|
+
...(message !== undefined ? { message } : {}),
|
|
16
|
+
...(reason !== undefined ? { reason } : {}),
|
|
17
|
+
};
|
|
18
|
+
return { ...frame, contract };
|
|
19
|
+
}
|
|
20
|
+
export function capFrames(input) {
|
|
21
|
+
const frames = input.map(withoutProblems);
|
|
22
|
+
const limits = { head: WS_HISTORY_HEAD, tail: WS_HISTORY_TAIL, maxBytes: WS_HISTORY_MAX_BYTES };
|
|
23
|
+
const r = capByEnds(frames, limits, (frame) => frame.size, (frame) => {
|
|
15
24
|
if (frame.text === undefined && frame.base64 === undefined)
|
|
16
|
-
return
|
|
17
|
-
stripped = true;
|
|
25
|
+
return undefined;
|
|
18
26
|
return {
|
|
19
27
|
index: frame.index,
|
|
20
28
|
direction: frame.direction,
|
|
@@ -22,8 +30,9 @@ export function capFrames(frames) {
|
|
|
22
30
|
at: frame.at,
|
|
23
31
|
size: frame.size,
|
|
24
32
|
...(frame.close !== undefined ? { close: frame.close } : {}),
|
|
33
|
+
...(frame.contract !== undefined ? { contract: frame.contract } : {}),
|
|
25
34
|
payloadTruncated: true,
|
|
26
35
|
};
|
|
27
36
|
});
|
|
28
|
-
return { frames:
|
|
37
|
+
return { frames: r.items, truncated: r.truncated, omittedFrames: r.omitted };
|
|
29
38
|
}
|
package/dist/ws/url.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type { KeyValueEntry } from '../
|
|
1
|
+
import type { KeyValueEntry } from '../http/entries.js';
|
|
2
2
|
/** The URL a session dials: the request's own when absolute, else its path under the server URL. */
|
|
3
3
|
export declare function resolveWsUrl(serverUrl: string, requestUrl: string, query: readonly KeyValueEntry[]): string;
|
package/dist/wsdl/cache.js
CHANGED
|
@@ -13,7 +13,7 @@ import { definitionCacheManifestSchema, parseFile } from '../project/schema.js';
|
|
|
13
13
|
import { nodeFs, readFileIfExists, readdirIfExists, writeFileAtomic } from '../project/fs.js';
|
|
14
14
|
import { parseYaml, stringifyYaml } from '../project/yaml.js';
|
|
15
15
|
import { parseXml } from '../xml/parse.js';
|
|
16
|
-
import { assignFileNames } from '
|
|
16
|
+
import { assignFileNames } from '../project/cache-naming.js';
|
|
17
17
|
const MANIFEST_FILE = 'manifest.yaml';
|
|
18
18
|
/** Hex-encoded SHA-256 digest of `bytes`, used to verify cached documents haven't been tampered with or corrupted. */
|
|
19
19
|
function sha256Hex(bytes) {
|
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
* single self-contained document — HTML (inline CSS, no scripts, everything
|
|
4
4
|
* escaped) or Markdown (with a table of contents).
|
|
5
5
|
*
|
|
6
|
-
* Pure and deterministic: the same {@link
|
|
6
|
+
* Pure and deterministic: the same {@link WsdlImportResult} always produces
|
|
7
7
|
* byte-identical output, so the golden tests are meaningful and a regenerated
|
|
8
8
|
* document is a clean diff. Nothing is fetched; every byte comes from the
|
|
9
9
|
* bundle the import already resolved.
|
|
10
10
|
*/
|
|
11
|
-
import type {
|
|
11
|
+
import type { WsdlImportResult } from '../soap/types.js';
|
|
12
12
|
/** Options accepted by {@link generateDocs}. */
|
|
13
13
|
export interface GenerateDocsOptions {
|
|
14
14
|
readonly format: 'html' | 'markdown';
|
|
@@ -44,4 +44,4 @@ export declare function sourceSnippet(text: string, line: number, maxLines?: num
|
|
|
44
44
|
* @param options output format and an optional title
|
|
45
45
|
* @returns the whole document as a string; the caller decides where it lands
|
|
46
46
|
*/
|
|
47
|
-
export declare function generateDocs(result:
|
|
47
|
+
export declare function generateDocs(result: WsdlImportResult, options: GenerateDocsOptions): string;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* single self-contained document — HTML (inline CSS, no scripts, everything
|
|
4
4
|
* escaped) or Markdown (with a table of contents).
|
|
5
5
|
*
|
|
6
|
-
* Pure and deterministic: the same {@link
|
|
6
|
+
* Pure and deterministic: the same {@link WsdlImportResult} always produces
|
|
7
7
|
* byte-identical output, so the golden tests are meaningful and a regenerated
|
|
8
8
|
* document is a clean diff. Nothing is fetched; every byte comes from the
|
|
9
9
|
* bundle the import already resolved.
|
|
@@ -13,7 +13,7 @@ import { writeFileAtomic } from '../project/fs.js';
|
|
|
13
13
|
import { NS } from '../xml/namespaces.js';
|
|
14
14
|
import { parseXml } from '../xml/parse.js';
|
|
15
15
|
import { serializeXml } from '../xml/serialize.js';
|
|
16
|
-
import { assignFileNames } from '
|
|
16
|
+
import { assignFileNames } from '../project/cache-naming.js';
|
|
17
17
|
import { childElements, firstChildElement, optionalAttribute } from './dom-utils.js';
|
|
18
18
|
/** Resolves `ref` (an import/include/redefine location) against `base` using the WHATWG `URL` class. */
|
|
19
19
|
function resolveUrl(ref, base) {
|
package/dist/wsdl/qname.d.ts
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
import type { Element } from '@xmldom/xmldom';
|
|
2
|
-
|
|
3
|
-
export
|
|
4
|
-
readonly namespaceUri: string;
|
|
5
|
-
readonly localName: string;
|
|
6
|
-
}
|
|
2
|
+
import type { QName } from '../xml/qname.js';
|
|
3
|
+
export type { QName };
|
|
7
4
|
/**
|
|
8
5
|
* Resolves a (possibly prefixed) QName string against the namespaces in
|
|
9
6
|
* scope at `contextElement`, walking ancestors via `lookupNamespaceURI`.
|
package/dist/wsdl/resolver.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Document } from '@xmldom/xmldom';
|
|
2
|
+
import type { FetchDocument, FetchedDocument } from '../http/fetch-document.js';
|
|
2
3
|
/** The root document to resolve, plus an optional pre-fetched body (avoids a redundant fetch of the root). */
|
|
3
4
|
export interface DefinitionSource {
|
|
4
5
|
/** Absolute URL (`http(s)://` or `file://`) identifying the root document. */
|
|
@@ -6,15 +7,7 @@ export interface DefinitionSource {
|
|
|
6
7
|
/** Pre-fetched root document text, when the caller already has it in hand. */
|
|
7
8
|
readonly text?: string;
|
|
8
9
|
}
|
|
9
|
-
|
|
10
|
-
export interface FetchedDocument {
|
|
11
|
-
/** The final absolute location after following any redirects. */
|
|
12
|
-
readonly location: string;
|
|
13
|
-
readonly bytes: Uint8Array;
|
|
14
|
-
readonly text: string;
|
|
15
|
-
}
|
|
16
|
-
/** Fetches a single document by absolute location, honouring an optional abort signal. */
|
|
17
|
-
export type FetchDocument = (location: string, signal?: AbortSignal) => Promise<FetchedDocument>;
|
|
10
|
+
export type { FetchDocument, FetchedDocument };
|
|
18
11
|
/** Options for {@link resolveDefinition}. */
|
|
19
12
|
export interface ResolveOptions {
|
|
20
13
|
readonly fetchDocument: FetchDocument;
|
|
@@ -40,7 +33,7 @@ export interface BundledDocument {
|
|
|
40
33
|
/** A non-fatal problem encountered while resolving an import graph. */
|
|
41
34
|
export interface ResolveProblem {
|
|
42
35
|
readonly code: 'unsupported-redefine' | 'fetch-failed' | 'unresolved-import' | 'not-xml'
|
|
43
|
-
/** A reference the {@link ReferencePolicy} refused; see `
|
|
36
|
+
/** A reference the {@link ReferencePolicy} refused; see `http/ref-policy.ts`. */
|
|
44
37
|
| 'import-ref-refused'
|
|
45
38
|
/** The graph hit the depth or document cap; everything resolved so far is still returned. */
|
|
46
39
|
| 'import-limit';
|
|
@@ -63,7 +56,7 @@ export interface DefinitionBundle {
|
|
|
63
56
|
* location) through the injected `fetchDocument`.
|
|
64
57
|
*
|
|
65
58
|
* Every nested reference is first judged against the root document's world (see
|
|
66
|
-
* `
|
|
59
|
+
* `http/ref-policy.ts`): a `file:` root may only reference `file:` documents inside its own
|
|
67
60
|
* folder, an `http(s):` root may only reference `http(s):` documents, and a pasted/dropped
|
|
68
61
|
* root may only reference `http(s):` documents. A refused reference becomes an
|
|
69
62
|
* `import-ref-refused` problem and the import continues with what did resolve — so a WSDL
|
package/dist/wsdl/resolver.js
CHANGED
|
@@ -2,7 +2,7 @@ import { WsdlParseError } from '../errors.js';
|
|
|
2
2
|
import { NS } from '../xml/namespaces.js';
|
|
3
3
|
import { getPosition, parseXml } from '../xml/parse.js';
|
|
4
4
|
import { childElements, firstChildElement, optionalAttribute } from './dom-utils.js';
|
|
5
|
-
import { MAX_IMPORT_DEPTH, MAX_IMPORT_DOCUMENTS, referencePolicyFor } from '
|
|
5
|
+
import { MAX_IMPORT_DEPTH, MAX_IMPORT_DOCUMENTS, referencePolicyFor } from '../http/ref-policy.js';
|
|
6
6
|
/**
|
|
7
7
|
* Queues `ref`, resolved against `base` with the WHATWG `URL` class (which handles both
|
|
8
8
|
* `http(s):` and `file:`).
|
|
@@ -159,7 +159,7 @@ function checkAborted(signal) {
|
|
|
159
159
|
* location) through the injected `fetchDocument`.
|
|
160
160
|
*
|
|
161
161
|
* Every nested reference is first judged against the root document's world (see
|
|
162
|
-
* `
|
|
162
|
+
* `http/ref-policy.ts`): a `file:` root may only reference `file:` documents inside its own
|
|
163
163
|
* folder, an `http(s):` root may only reference `http(s):` documents, and a pasted/dropped
|
|
164
164
|
* root may only reference `http(s):` documents. A refused reference becomes an
|
|
165
165
|
* `import-ref-refused` problem and the import continues with what did resolve — so a WSDL
|
|
@@ -199,7 +199,7 @@ export async function resolveDefinition(source, options) {
|
|
|
199
199
|
const rootDoc = buildBundledDocument(rootFetched, source.location, undefined, undefined, true);
|
|
200
200
|
canonicalDocs.set(rootFetched.location, rootDoc);
|
|
201
201
|
const documents = [rootDoc];
|
|
202
|
-
// Every nested reference is judged against the *root* document's world; see `ref-policy.ts`.
|
|
202
|
+
// Every nested reference is judged against the *root* document's world; see `http/ref-policy.ts`.
|
|
203
203
|
const policy = referencePolicyFor(rootFetched.location);
|
|
204
204
|
const queue = [];
|
|
205
205
|
collectImports(rootDoc, 1, queue, problems);
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* project against it.
|
|
4
4
|
*
|
|
5
5
|
* The two halves are deliberately separate. {@link planUpdate} is a pure diff of
|
|
6
|
-
* two {@link
|
|
6
|
+
* two {@link WsdlImportResult}s — what a preview dialog shows before the user commits
|
|
7
7
|
* to anything. {@link applyUpdate} then rewrites the project model per the
|
|
8
8
|
* options the user ticked, and is equally pure: it returns the next `Project`
|
|
9
9
|
* plus the relative paths of the `.xml.bak` backups the save layer should write
|
|
@@ -11,13 +11,13 @@
|
|
|
11
11
|
* itself.
|
|
12
12
|
*
|
|
13
13
|
* Nothing is ever deleted. Requests belonging to an operation the new definition
|
|
14
|
-
* no longer has are kept and flagged {@link
|
|
14
|
+
* no longer has are kept and flagged {@link SoapRequestDef.orphaned} rather than
|
|
15
15
|
* removed — the user decides whether a vanished operation means "clean
|
|
16
16
|
* this up" or "the new WSDL is wrong".
|
|
17
17
|
*/
|
|
18
18
|
import type { IdGenerator, Project } from '../project/model.js';
|
|
19
19
|
import type { OperationRef } from '../soap/request-builder.js';
|
|
20
|
-
import type {
|
|
20
|
+
import type { WsdlImportResult } from '../soap/types.js';
|
|
21
21
|
export type { OperationRef } from '../soap/request-builder.js';
|
|
22
22
|
/** Why {@link planUpdate} considers an operation changed; the first applicable reason wins. */
|
|
23
23
|
export type OperationChangeReason = 'input-schema' | 'output-schema' | 'soap-action' | 'style' | 'binding';
|
|
@@ -51,7 +51,7 @@ export interface UpdatePlan {
|
|
|
51
51
|
* @param oldImport the definition the project was built from
|
|
52
52
|
* @param newImport the freshly fetched definition
|
|
53
53
|
*/
|
|
54
|
-
export declare function planUpdate(oldImport:
|
|
54
|
+
export declare function planUpdate(oldImport: WsdlImportResult, newImport: WsdlImportResult): UpdatePlan;
|
|
55
55
|
/**
|
|
56
56
|
* What {@link applyUpdate} is allowed to do, named after the checkboxes of
|
|
57
57
|
* the Update Definition dialog.
|
|
@@ -103,4 +103,4 @@ export interface ApplyUpdateResult {
|
|
|
103
103
|
* @param options which of the update behaviours to perform
|
|
104
104
|
* @throws Error when `interfaceId` names no interface of `project`
|
|
105
105
|
*/
|
|
106
|
-
export declare function applyUpdate(project: Project, interfaceId: string, plan: UpdatePlan, newImport:
|
|
106
|
+
export declare function applyUpdate(project: Project, interfaceId: string, plan: UpdatePlan, newImport: WsdlImportResult, options: ApplyUpdateOptions): ApplyUpdateResult;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* project against it.
|
|
4
4
|
*
|
|
5
5
|
* The two halves are deliberately separate. {@link planUpdate} is a pure diff of
|
|
6
|
-
* two {@link
|
|
6
|
+
* two {@link WsdlImportResult}s — what a preview dialog shows before the user commits
|
|
7
7
|
* to anything. {@link applyUpdate} then rewrites the project model per the
|
|
8
8
|
* options the user ticked, and is equally pure: it returns the next `Project`
|
|
9
9
|
* plus the relative paths of the `.xml.bak` backups the save layer should write
|
|
@@ -11,11 +11,11 @@
|
|
|
11
11
|
* itself.
|
|
12
12
|
*
|
|
13
13
|
* Nothing is ever deleted. Requests belonging to an operation the new definition
|
|
14
|
-
* no longer has are kept and flagged {@link
|
|
14
|
+
* no longer has are kept and flagged {@link SoapRequestDef.orphaned} rather than
|
|
15
15
|
* removed — the user decides whether a vanished operation means "clean
|
|
16
16
|
* this up" or "the new WSDL is wrong".
|
|
17
17
|
*/
|
|
18
|
-
import {
|
|
18
|
+
import { generateSoapRequest } from '../soap/generate.js';
|
|
19
19
|
import { createRequest, generateId } from '../project/model.js';
|
|
20
20
|
import { INTERFACES_DIR, OPERATIONS_DIR, uniqueSlug } from '../project/paths.js';
|
|
21
21
|
import { recreateRequest } from '../soap/recreate.js';
|
|
@@ -51,7 +51,7 @@ function addressesOf(summary) {
|
|
|
51
51
|
/** The generated sample envelope for one operation, or `undefined` when it cannot be built. */
|
|
52
52
|
function envelopeOf(result, ref) {
|
|
53
53
|
try {
|
|
54
|
-
return
|
|
54
|
+
return generateSoapRequest(result, ref, DIFF_GENERATE_OPTIONS).envelopeXml;
|
|
55
55
|
}
|
|
56
56
|
catch {
|
|
57
57
|
return undefined;
|
|
@@ -236,7 +236,7 @@ export function applyUpdate(project, interfaceId, plan, newImport, options) {
|
|
|
236
236
|
if (recreate) {
|
|
237
237
|
const summary = summaryFor(newImport, key);
|
|
238
238
|
if (summary !== undefined) {
|
|
239
|
-
const generated =
|
|
239
|
+
const generated = generateSoapRequest(newImport, refOf(summary), generateOptions);
|
|
240
240
|
const merged = recreateRequest(next.envelopeXml, generated.envelopeXml, {
|
|
241
241
|
keepValues: options.keepExisting,
|
|
242
242
|
keepHeaders: options.keepSoapHeaders,
|
|
@@ -274,7 +274,7 @@ export function applyUpdate(project, interfaceId, plan, newImport, options) {
|
|
|
274
274
|
order: iface.operations.length,
|
|
275
275
|
requests: [],
|
|
276
276
|
};
|
|
277
|
-
const generated =
|
|
277
|
+
const generated = generateSoapRequest(newImport, ref, generateOptions);
|
|
278
278
|
const name = 'Request 1';
|
|
279
279
|
const request = createRequest(name, {
|
|
280
280
|
id: newId(),
|