@wirebench/engine 2.1.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/LICENSE +201 -0
- package/README.md +3 -0
- package/dist/assert/contract.d.ts +3 -0
- package/dist/assert/contract.js +17 -0
- package/dist/assert/index.d.ts +4 -0
- package/dist/assert/index.js +27 -0
- package/dist/assert/match.d.ts +3 -0
- package/dist/assert/match.js +58 -0
- package/dist/assert/model.d.ts +73 -0
- package/dist/assert/model.js +8 -0
- package/dist/assert/schema.d.ts +34 -0
- package/dist/assert/schema.js +46 -0
- package/dist/assert/sla.d.ts +3 -0
- package/dist/assert/sla.js +8 -0
- package/dist/assert/soap-fault.d.ts +3 -0
- package/dist/assert/soap-fault.js +20 -0
- package/dist/assert/status.d.ts +3 -0
- package/dist/assert/status.js +14 -0
- package/dist/errors.d.ts +77 -0
- package/dist/errors.js +121 -0
- package/dist/fs.d.ts +35 -0
- package/dist/fs.js +64 -0
- package/dist/generate.d.ts +12 -0
- package/dist/generate.js +14 -0
- package/dist/grpc/browser.d.ts +11 -0
- package/dist/grpc/browser.js +9 -0
- package/dist/grpc/cache.d.ts +113 -0
- package/dist/grpc/cache.js +244 -0
- package/dist/grpc/call.d.ts +64 -0
- package/dist/grpc/call.js +72 -0
- package/dist/grpc/codec.d.ts +29 -0
- package/dist/grpc/codec.js +416 -0
- package/dist/grpc/command.d.ts +23 -0
- package/dist/grpc/command.js +91 -0
- package/dist/grpc/expand.d.ts +25 -0
- package/dist/grpc/expand.js +52 -0
- package/dist/grpc/framing.d.ts +28 -0
- package/dist/grpc/framing.js +61 -0
- package/dist/grpc/import.d.ts +47 -0
- package/dist/grpc/import.js +88 -0
- package/dist/grpc/model.d.ts +179 -0
- package/dist/grpc/model.js +91 -0
- package/dist/grpc/proto/describe.d.ts +92 -0
- package/dist/grpc/proto/describe.js +205 -0
- package/dist/grpc/proto/load.d.ts +35 -0
- package/dist/grpc/proto/load.js +112 -0
- package/dist/grpc/proto/sample.d.ts +21 -0
- package/dist/grpc/proto/sample.js +79 -0
- package/dist/grpc/proto/well-known.d.ts +42 -0
- package/dist/grpc/proto/well-known.js +143 -0
- package/dist/grpc/reconcile.d.ts +42 -0
- package/dist/grpc/reconcile.js +153 -0
- package/dist/grpc/reflection/client.d.ts +70 -0
- package/dist/grpc/reflection/client.js +197 -0
- package/dist/grpc/reflection/descriptors.d.ts +69 -0
- package/dist/grpc/reflection/descriptors.js +140 -0
- package/dist/grpc/reflection/proto.d.ts +33 -0
- package/dist/grpc/reflection/proto.js +144 -0
- package/dist/grpc/send.d.ts +132 -0
- package/dist/grpc/send.js +435 -0
- package/dist/grpc/shape.d.ts +29 -0
- package/dist/grpc/shape.js +36 -0
- package/dist/grpc/status.d.ts +21 -0
- package/dist/grpc/status.js +62 -0
- package/dist/grpc/target.d.ts +21 -0
- package/dist/grpc/target.js +66 -0
- package/dist/http/auth/apply.d.ts +37 -0
- package/dist/http/auth/apply.js +74 -0
- package/dist/http/auth/basic.d.ts +36 -0
- package/dist/http/auth/basic.js +69 -0
- package/dist/http/auth/md4.d.ts +13 -0
- package/dist/http/auth/md4.js +81 -0
- package/dist/http/auth/ntlm-transport.d.ts +61 -0
- package/dist/http/auth/ntlm-transport.js +97 -0
- package/dist/http/auth/ntlm.d.ts +190 -0
- package/dist/http/auth/ntlm.js +377 -0
- package/dist/http/client.d.ts +73 -0
- package/dist/http/client.js +403 -0
- package/dist/http/curl-flags.d.ts +15 -0
- package/dist/http/curl-flags.js +95 -0
- package/dist/http/curl.d.ts +94 -0
- package/dist/http/curl.js +245 -0
- package/dist/http/decompress.d.ts +7 -0
- package/dist/http/decompress.js +22 -0
- package/dist/http/errors.d.ts +22 -0
- package/dist/http/errors.js +144 -0
- package/dist/http/failed-request.d.ts +27 -0
- package/dist/http/failed-request.js +48 -0
- package/dist/http/headers.d.ts +15 -0
- package/dist/http/headers.js +50 -0
- package/dist/http/heredoc.d.ts +25 -0
- package/dist/http/heredoc.js +74 -0
- package/dist/http/proxy.d.ts +103 -0
- package/dist/http/proxy.js +168 -0
- package/dist/http/raw-capture.d.ts +23 -0
- package/dist/http/raw-capture.js +57 -0
- package/dist/http/timings.d.ts +79 -0
- package/dist/http/timings.js +212 -0
- package/dist/http/tls.d.ts +111 -0
- package/dist/http/tls.js +167 -0
- package/dist/http/types.d.ts +125 -0
- package/dist/http/types.js +6 -0
- package/dist/import-detect.d.ts +26 -0
- package/dist/import-detect.js +169 -0
- package/dist/import.d.ts +20 -0
- package/dist/import.js +163 -0
- package/dist/index.d.ts +272 -0
- package/dist/index.js +157 -0
- package/dist/json/cursor.d.ts +43 -0
- package/dist/json/cursor.js +168 -0
- package/dist/operations.d.ts +12 -0
- package/dist/operations.js +52 -0
- package/dist/project/attachments-cache.d.ts +80 -0
- package/dist/project/attachments-cache.js +186 -0
- package/dist/project/endpoints.d.ts +23 -0
- package/dist/project/endpoints.js +47 -0
- package/dist/project/environments.d.ts +68 -0
- package/dist/project/environments.js +124 -0
- package/dist/project/fs.d.ts +45 -0
- package/dist/project/fs.js +78 -0
- package/dist/project/history.d.ts +171 -0
- package/dist/project/history.js +179 -0
- package/dist/project/keystores.d.ts +24 -0
- package/dist/project/keystores.js +66 -0
- package/dist/project/load.d.ts +44 -0
- package/dist/project/load.js +634 -0
- package/dist/project/migrate.d.ts +27 -0
- package/dist/project/migrate.js +46 -0
- package/dist/project/model.d.ts +401 -0
- package/dist/project/model.js +126 -0
- package/dist/project/paths.d.ts +134 -0
- package/dist/project/paths.js +259 -0
- package/dist/project/preferences.d.ts +318 -0
- package/dist/project/preferences.js +239 -0
- package/dist/project/properties.d.ts +97 -0
- package/dist/project/properties.js +356 -0
- package/dist/project/save.d.ts +65 -0
- package/dist/project/save.js +295 -0
- package/dist/project/schema.d.ts +1329 -0
- package/dist/project/schema.js +737 -0
- package/dist/project/serialize.d.ts +42 -0
- package/dist/project/serialize.js +385 -0
- package/dist/project/wss-configs.d.ts +40 -0
- package/dist/project/wss-configs.js +142 -0
- package/dist/project/yaml.d.ts +17 -0
- package/dist/project/yaml.js +39 -0
- package/dist/redact/index.d.ts +77 -0
- package/dist/redact/index.js +328 -0
- package/dist/redact/literal.d.ts +12 -0
- package/dist/redact/literal.js +68 -0
- package/dist/rest/auth.d.ts +53 -0
- package/dist/rest/auth.js +80 -0
- package/dist/rest/body.d.ts +61 -0
- package/dist/rest/body.js +184 -0
- package/dist/rest/browser.d.ts +12 -0
- package/dist/rest/browser.js +11 -0
- package/dist/rest/cookies.d.ts +41 -0
- package/dist/rest/cookies.js +102 -0
- package/dist/rest/curl.d.ts +75 -0
- package/dist/rest/curl.js +417 -0
- package/dist/rest/expand.d.ts +35 -0
- package/dist/rest/expand.js +104 -0
- package/dist/rest/model.d.ts +247 -0
- package/dist/rest/model.js +118 -0
- package/dist/rest/oauth2.d.ts +118 -0
- package/dist/rest/oauth2.js +212 -0
- package/dist/rest/openapi/cache.d.ts +54 -0
- package/dist/rest/openapi/cache.js +128 -0
- package/dist/rest/openapi/import.d.ts +67 -0
- package/dist/rest/openapi/import.js +91 -0
- package/dist/rest/openapi/map.d.ts +102 -0
- package/dist/rest/openapi/map.js +477 -0
- package/dist/rest/openapi/model.d.ts +203 -0
- package/dist/rest/openapi/model.js +37 -0
- package/dist/rest/openapi/parse.d.ts +44 -0
- package/dist/rest/openapi/parse.js +1530 -0
- package/dist/rest/openapi/refs.d.ts +63 -0
- package/dist/rest/openapi/refs.js +258 -0
- package/dist/rest/openapi/sample.d.ts +68 -0
- package/dist/rest/openapi/sample.js +336 -0
- package/dist/rest/postman/import.d.ts +21 -0
- package/dist/rest/postman/import.js +47 -0
- package/dist/rest/postman/index.d.ts +7 -0
- package/dist/rest/postman/index.js +7 -0
- package/dist/rest/postman/map.d.ts +28 -0
- package/dist/rest/postman/map.js +427 -0
- package/dist/rest/postman/model.d.ts +118 -0
- package/dist/rest/postman/model.js +7 -0
- package/dist/rest/postman/parse.d.ts +29 -0
- package/dist/rest/postman/parse.js +518 -0
- package/dist/rest/response.d.ts +72 -0
- package/dist/rest/response.js +221 -0
- package/dist/rest/send.d.ts +102 -0
- package/dist/rest/send.js +148 -0
- package/dist/rest/url.d.ts +92 -0
- package/dist/rest/url.js +213 -0
- package/dist/run/effective-auth.d.ts +10 -0
- package/dist/run/effective-auth.js +19 -0
- package/dist/run/index.d.ts +8 -0
- package/dist/run/index.js +4 -0
- package/dist/run/prepare.d.ts +43 -0
- package/dist/run/prepare.js +280 -0
- package/dist/run/run.d.ts +53 -0
- package/dist/run/run.js +223 -0
- package/dist/run/secret-needs.d.ts +13 -0
- package/dist/run/secret-needs.js +125 -0
- package/dist/run/select.d.ts +34 -0
- package/dist/run/select.js +76 -0
- package/dist/secrets/env-names.d.ts +27 -0
- package/dist/secrets/env-names.js +40 -0
- package/dist/secrets/resolve.d.ts +58 -0
- package/dist/secrets/resolve.js +136 -0
- package/dist/send-options.d.ts +141 -0
- package/dist/send-options.js +228 -0
- package/dist/send.d.ts +53 -0
- package/dist/send.js +210 -0
- package/dist/soap/body-builder.d.ts +38 -0
- package/dist/soap/body-builder.js +250 -0
- package/dist/soap/build-problems.d.ts +12 -0
- package/dist/soap/build-problems.js +2 -0
- package/dist/soap/charset.d.ts +23 -0
- package/dist/soap/charset.js +47 -0
- package/dist/soap/envelope.d.ts +44 -0
- package/dist/soap/envelope.js +76 -0
- package/dist/soap/fault.d.ts +46 -0
- package/dist/soap/fault.js +129 -0
- package/dist/soap/form-request.d.ts +34 -0
- package/dist/soap/form-request.js +251 -0
- package/dist/soap/legacy-project/definition-fetcher.d.ts +21 -0
- package/dist/soap/legacy-project/definition-fetcher.js +43 -0
- package/dist/soap/legacy-project/format.d.ts +18 -0
- package/dist/soap/legacy-project/format.js +24 -0
- package/dist/soap/legacy-project/import.d.ts +21 -0
- package/dist/soap/legacy-project/import.js +46 -0
- package/dist/soap/legacy-project/index.d.ts +9 -0
- package/dist/soap/legacy-project/index.js +5 -0
- package/dist/soap/legacy-project/map.d.ts +91 -0
- package/dist/soap/legacy-project/map.js +290 -0
- package/dist/soap/legacy-project/model.d.ts +98 -0
- package/dist/soap/legacy-project/model.js +5 -0
- package/dist/soap/legacy-project/parse.d.ts +16 -0
- package/dist/soap/legacy-project/parse.js +325 -0
- package/dist/soap/mime/cid-scan.d.ts +36 -0
- package/dist/soap/mime/cid-scan.js +52 -0
- package/dist/soap/mime/inline-files.d.ts +39 -0
- package/dist/soap/mime/inline-files.js +71 -0
- package/dist/soap/mime/mtom.d.ts +74 -0
- package/dist/soap/mime/mtom.js +134 -0
- package/dist/soap/mime/multipart.d.ts +66 -0
- package/dist/soap/mime/multipart.js +329 -0
- package/dist/soap/mime/send-pipeline.d.ts +61 -0
- package/dist/soap/mime/send-pipeline.js +145 -0
- package/dist/soap/mime/swa.d.ts +45 -0
- package/dist/soap/mime/swa.js +62 -0
- package/dist/soap/mime/types.d.ts +69 -0
- package/dist/soap/mime/types.js +10 -0
- package/dist/soap/namespace-scope.d.ts +32 -0
- package/dist/soap/namespace-scope.js +85 -0
- package/dist/soap/prefixes.d.ts +24 -0
- package/dist/soap/prefixes.js +70 -0
- package/dist/soap/recreate.d.ts +28 -0
- package/dist/soap/recreate.js +168 -0
- package/dist/soap/request-builder.d.ts +63 -0
- package/dist/soap/request-builder.js +161 -0
- package/dist/soap/response-parser.d.ts +29 -0
- package/dist/soap/response-parser.js +71 -0
- package/dist/soap/soap-action.d.ts +31 -0
- package/dist/soap/soap-action.js +28 -0
- package/dist/soap/transforms.d.ts +52 -0
- package/dist/soap/transforms.js +164 -0
- package/dist/types.d.ts +307 -0
- package/dist/types.js +6 -0
- package/dist/validate/index.d.ts +61 -0
- package/dist/validate/index.js +72 -0
- package/dist/validate/schema-file-set.d.ts +51 -0
- package/dist/validate/schema-file-set.js +288 -0
- package/dist/validate/schema-validator.d.ts +53 -0
- package/dist/validate/schema-validator.js +251 -0
- package/dist/validate/soap-structure.d.ts +34 -0
- package/dist/validate/soap-structure.js +255 -0
- package/dist/validate/types.d.ts +47 -0
- package/dist/validate/types.js +8 -0
- package/dist/validate/wsi/assertions/helpers.d.ts +145 -0
- package/dist/validate/wsi/assertions/helpers.js +387 -0
- package/dist/validate/wsi/assertions/index.d.ts +44 -0
- package/dist/validate/wsi/assertions/index.js +77 -0
- package/dist/validate/wsi/assertions/message/helpers.d.ts +63 -0
- package/dist/validate/wsi/assertions/message/helpers.js +168 -0
- package/dist/validate/wsi/assertions/message/index.d.ts +39 -0
- package/dist/validate/wsi/assertions/message/index.js +62 -0
- package/dist/validate/wsi/assertions/message/r1001.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1001.js +38 -0
- package/dist/validate/wsi/assertions/message/r1003.d.ts +14 -0
- package/dist/validate/wsi/assertions/message/r1003.js +45 -0
- package/dist/validate/wsi/assertions/message/r1005.d.ts +12 -0
- package/dist/validate/wsi/assertions/message/r1005.js +37 -0
- package/dist/validate/wsi/assertions/message/r1006.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1006.js +49 -0
- package/dist/validate/wsi/assertions/message/r1007.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1007.js +30 -0
- package/dist/validate/wsi/assertions/message/r1011.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1011.js +33 -0
- package/dist/validate/wsi/assertions/message/r1012.d.ts +13 -0
- package/dist/validate/wsi/assertions/message/r1012.js +37 -0
- package/dist/validate/wsi/assertions/message/r1013.d.ts +9 -0
- package/dist/validate/wsi/assertions/message/r1013.js +42 -0
- package/dist/validate/wsi/assertions/message/r1014.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1014.js +30 -0
- package/dist/validate/wsi/assertions/message/r1015.d.ts +12 -0
- package/dist/validate/wsi/assertions/message/r1015.js +36 -0
- package/dist/validate/wsi/assertions/message/r1017.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1017.js +30 -0
- package/dist/validate/wsi/assertions/message/r1100.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1100.js +39 -0
- package/dist/validate/wsi/assertions/message/r1101.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1101.js +37 -0
- package/dist/validate/wsi/assertions/message/r1102.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1102.js +41 -0
- package/dist/validate/wsi/assertions/message/r1103.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1103.js +28 -0
- package/dist/validate/wsi/assertions/message/r1107.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1107.js +38 -0
- package/dist/validate/wsi/assertions/message/r1109.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1109.js +32 -0
- package/dist/validate/wsi/assertions/message/r1124.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1124.js +31 -0
- package/dist/validate/wsi/assertions/message/r1132.d.ts +9 -0
- package/dist/validate/wsi/assertions/message/r1132.js +23 -0
- package/dist/validate/wsi/assertions/message/r1140.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1140.js +42 -0
- package/dist/validate/wsi/assertions/message/r1141.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1141.js +32 -0
- package/dist/validate/wsi/assertions/message/r2113.d.ts +11 -0
- package/dist/validate/wsi/assertions/message/r2113.js +33 -0
- package/dist/validate/wsi/assertions/message/r2211.d.ts +7 -0
- package/dist/validate/wsi/assertions/message/r2211.js +42 -0
- package/dist/validate/wsi/assertions/r2001.d.ts +15 -0
- package/dist/validate/wsi/assertions/r2001.js +47 -0
- package/dist/validate/wsi/assertions/r2002.d.ts +11 -0
- package/dist/validate/wsi/assertions/r2002.js +38 -0
- package/dist/validate/wsi/assertions/r2003.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2003.js +32 -0
- package/dist/validate/wsi/assertions/r2005.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2005.js +40 -0
- package/dist/validate/wsi/assertions/r2101.d.ts +14 -0
- package/dist/validate/wsi/assertions/r2101.js +65 -0
- package/dist/validate/wsi/assertions/r2102.d.ts +10 -0
- package/dist/validate/wsi/assertions/r2102.js +41 -0
- package/dist/validate/wsi/assertions/r2105.d.ts +8 -0
- package/dist/validate/wsi/assertions/r2105.js +39 -0
- package/dist/validate/wsi/assertions/r2110.d.ts +8 -0
- package/dist/validate/wsi/assertions/r2110.js +38 -0
- package/dist/validate/wsi/assertions/r2111.d.ts +6 -0
- package/dist/validate/wsi/assertions/r2111.js +30 -0
- package/dist/validate/wsi/assertions/r2112.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2112.js +35 -0
- package/dist/validate/wsi/assertions/r2201.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2201.js +28 -0
- package/dist/validate/wsi/assertions/r2203.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2203.js +30 -0
- package/dist/validate/wsi/assertions/r2204.d.ts +6 -0
- package/dist/validate/wsi/assertions/r2204.js +29 -0
- package/dist/validate/wsi/assertions/r2205.d.ts +8 -0
- package/dist/validate/wsi/assertions/r2205.js +46 -0
- package/dist/validate/wsi/assertions/r2206.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2206.js +36 -0
- package/dist/validate/wsi/assertions/r2209.d.ts +12 -0
- package/dist/validate/wsi/assertions/r2209.js +37 -0
- package/dist/validate/wsi/assertions/r2210.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2210.js +30 -0
- package/dist/validate/wsi/assertions/r2303.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2303.js +44 -0
- package/dist/validate/wsi/assertions/r2304.d.ts +6 -0
- package/dist/validate/wsi/assertions/r2304.js +32 -0
- package/dist/validate/wsi/assertions/r2401.d.ts +12 -0
- package/dist/validate/wsi/assertions/r2401.js +31 -0
- package/dist/validate/wsi/assertions/r2701.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2701.js +28 -0
- package/dist/validate/wsi/assertions/r2702.d.ts +6 -0
- package/dist/validate/wsi/assertions/r2702.js +26 -0
- package/dist/validate/wsi/assertions/r2705.d.ts +11 -0
- package/dist/validate/wsi/assertions/r2705.js +31 -0
- package/dist/validate/wsi/assertions/r2706.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2706.js +29 -0
- package/dist/validate/wsi/assertions/r2710.d.ts +13 -0
- package/dist/validate/wsi/assertions/r2710.js +37 -0
- package/dist/validate/wsi/assertions/r2716.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2716.js +29 -0
- package/dist/validate/wsi/assertions/r2717.d.ts +9 -0
- package/dist/validate/wsi/assertions/r2717.js +31 -0
- package/dist/validate/wsi/assertions/r2718.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2718.js +41 -0
- package/dist/validate/wsi/assertions/r2720.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2720.js +29 -0
- package/dist/validate/wsi/assertions/r2721.d.ts +6 -0
- package/dist/validate/wsi/assertions/r2721.js +27 -0
- package/dist/validate/wsi/assertions/r2722.d.ts +6 -0
- package/dist/validate/wsi/assertions/r2722.js +29 -0
- package/dist/validate/wsi/assertions/r2801.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2801.js +39 -0
- package/dist/validate/wsi/assertions/r2803.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2803.js +29 -0
- package/dist/validate/wsi/docs.d.ts +29 -0
- package/dist/validate/wsi/docs.js +167 -0
- package/dist/validate/wsi/index.d.ts +16 -0
- package/dist/validate/wsi/index.js +11 -0
- package/dist/validate/wsi/report-html.d.ts +36 -0
- package/dist/validate/wsi/report-html.js +135 -0
- package/dist/validate/wsi/run-message.d.ts +50 -0
- package/dist/validate/wsi/run-message.js +190 -0
- package/dist/validate/wsi/run-wsdl.d.ts +48 -0
- package/dist/validate/wsi/run-wsdl.js +99 -0
- package/dist/validate/wsi/types.d.ts +173 -0
- package/dist/validate/wsi/types.js +17 -0
- package/dist/workspace/commit-message.d.ts +47 -0
- package/dist/workspace/commit-message.js +195 -0
- package/dist/workspace/environments.d.ts +79 -0
- package/dist/workspace/environments.js +115 -0
- package/dist/workspace/index.d.ts +28 -0
- package/dist/workspace/index.js +19 -0
- package/dist/workspace/load.d.ts +45 -0
- package/dist/workspace/load.js +155 -0
- package/dist/workspace/local-state.d.ts +37 -0
- package/dist/workspace/local-state.js +59 -0
- package/dist/workspace/migrate.d.ts +38 -0
- package/dist/workspace/migrate.js +50 -0
- package/dist/workspace/model.d.ts +86 -0
- package/dist/workspace/model.js +54 -0
- package/dist/workspace/paths.d.ts +64 -0
- package/dist/workspace/paths.js +97 -0
- package/dist/workspace/reidentify.d.ts +22 -0
- package/dist/workspace/reidentify.js +122 -0
- package/dist/workspace/save.d.ts +31 -0
- package/dist/workspace/save.js +84 -0
- package/dist/workspace/schema.d.ts +93 -0
- package/dist/workspace/schema.js +115 -0
- package/dist/workspace/serialize.d.ts +24 -0
- package/dist/workspace/serialize.js +60 -0
- package/dist/workspace/share.d.ts +52 -0
- package/dist/workspace/share.js +89 -0
- package/dist/ws/browser.d.ts +13 -0
- package/dist/ws/browser.js +11 -0
- package/dist/ws/call.d.ts +53 -0
- package/dist/ws/call.js +106 -0
- package/dist/ws/command.d.ts +19 -0
- package/dist/ws/command.js +28 -0
- package/dist/ws/expand.d.ts +38 -0
- package/dist/ws/expand.js +76 -0
- package/dist/ws/model.d.ts +191 -0
- package/dist/ws/model.js +83 -0
- package/dist/ws/pretty.d.ts +12 -0
- package/dist/ws/pretty.js +25 -0
- package/dist/ws/session.d.ts +50 -0
- package/dist/ws/session.js +333 -0
- package/dist/ws/shape.d.ts +18 -0
- package/dist/ws/shape.js +28 -0
- package/dist/ws/transcript.d.ts +14 -0
- package/dist/ws/transcript.js +29 -0
- package/dist/ws/url.d.ts +3 -0
- package/dist/ws/url.js +44 -0
- package/dist/wsa/headers.d.ts +78 -0
- package/dist/wsa/headers.js +244 -0
- package/dist/wsa/model.d.ts +66 -0
- package/dist/wsa/model.js +52 -0
- package/dist/wsa/policy-detect.d.ts +81 -0
- package/dist/wsa/policy-detect.js +245 -0
- package/dist/wsdl/cache-naming.d.ts +39 -0
- package/dist/wsdl/cache-naming.js +90 -0
- package/dist/wsdl/cache.d.ts +48 -0
- package/dist/wsdl/cache.js +141 -0
- package/dist/wsdl/docs-generator.d.ts +47 -0
- package/dist/wsdl/docs-generator.js +439 -0
- package/dist/wsdl/dom-utils.d.ts +15 -0
- package/dist/wsdl/dom-utils.js +50 -0
- package/dist/wsdl/export-definition.d.ts +38 -0
- package/dist/wsdl/export-definition.js +100 -0
- package/dist/wsdl/fetch.d.ts +13 -0
- package/dist/wsdl/fetch.js +60 -0
- package/dist/wsdl/merge.d.ts +17 -0
- package/dist/wsdl/merge.js +57 -0
- package/dist/wsdl/model.d.ts +176 -0
- package/dist/wsdl/model.js +17 -0
- package/dist/wsdl/parse-binding.d.ts +6 -0
- package/dist/wsdl/parse-binding.js +150 -0
- package/dist/wsdl/parse-wsdl.d.ts +47 -0
- package/dist/wsdl/parse-wsdl.js +161 -0
- package/dist/wsdl/qname.d.ts +28 -0
- package/dist/wsdl/qname.js +41 -0
- package/dist/wsdl/ref-policy.d.ts +54 -0
- package/dist/wsdl/ref-policy.js +87 -0
- package/dist/wsdl/resolver.d.ts +81 -0
- package/dist/wsdl/resolver.js +276 -0
- package/dist/wsdl/update-definition.d.ts +106 -0
- package/dist/wsdl/update-definition.js +314 -0
- package/dist/wss/apply.d.ts +40 -0
- package/dist/wss/apply.js +212 -0
- package/dist/wss/c14n-prefixes.d.ts +27 -0
- package/dist/wss/c14n-prefixes.js +95 -0
- package/dist/wss/incoming/decrypt.d.ts +35 -0
- package/dist/wss/incoming/decrypt.js +57 -0
- package/dist/wss/incoming/index.d.ts +56 -0
- package/dist/wss/incoming/index.js +189 -0
- package/dist/wss/incoming/verify.d.ts +74 -0
- package/dist/wss/incoming/verify.js +440 -0
- package/dist/wss/key-identifiers.d.ts +76 -0
- package/dist/wss/key-identifiers.js +139 -0
- package/dist/wss/keystore/certificate.d.ts +45 -0
- package/dist/wss/keystore/certificate.js +134 -0
- package/dist/wss/keystore/index.d.ts +50 -0
- package/dist/wss/keystore/index.js +80 -0
- package/dist/wss/keystore/model.d.ts +83 -0
- package/dist/wss/keystore/model.js +27 -0
- package/dist/wss/keystore/pem.d.ts +21 -0
- package/dist/wss/keystore/pem.js +140 -0
- package/dist/wss/keystore/pkcs12.d.ts +21 -0
- package/dist/wss/keystore/pkcs12.js +125 -0
- package/dist/wss/model.d.ts +160 -0
- package/dist/wss/model.js +37 -0
- package/dist/wss/outgoing/encryption.d.ts +76 -0
- package/dist/wss/outgoing/encryption.js +618 -0
- package/dist/wss/outgoing/signature.d.ts +73 -0
- package/dist/wss/outgoing/signature.js +239 -0
- package/dist/wss/outgoing/timestamp.d.ts +29 -0
- package/dist/wss/outgoing/timestamp.js +39 -0
- package/dist/wss/outgoing/username-token.d.ts +36 -0
- package/dist/wss/outgoing/username-token.js +68 -0
- package/dist/wss/security-header.d.ts +31 -0
- package/dist/wss/security-header.js +83 -0
- package/dist/xml/index.d.ts +7 -0
- package/dist/xml/index.js +7 -0
- package/dist/xml/namespaces.d.ts +36 -0
- package/dist/xml/namespaces.js +60 -0
- package/dist/xml/parse.d.ts +79 -0
- package/dist/xml/parse.js +109 -0
- package/dist/xml/positions.d.ts +26 -0
- package/dist/xml/positions.js +71 -0
- package/dist/xml/pretty.d.ts +37 -0
- package/dist/xml/pretty.js +137 -0
- package/dist/xml/serialize.d.ts +6 -0
- package/dist/xml/serialize.js +8 -0
- package/dist/xml/tolerant-tree.d.ts +56 -0
- package/dist/xml/tolerant-tree.js +134 -0
- package/dist/xpath/evaluate-async.d.ts +31 -0
- package/dist/xpath/evaluate-async.js +81 -0
- package/dist/xpath/evaluate.d.ts +98 -0
- package/dist/xpath/evaluate.js +340 -0
- package/dist/xpath/jsonpath.d.ts +40 -0
- package/dist/xpath/jsonpath.js +109 -0
- package/dist/xpath/namespaces.d.ts +29 -0
- package/dist/xpath/namespaces.js +101 -0
- package/dist/xpath/worker.d.ts +7 -0
- package/dist/xpath/worker.js +26 -0
- package/dist/xsd/builtins.d.ts +36 -0
- package/dist/xsd/builtins.js +108 -0
- package/dist/xsd/check-references.d.ts +25 -0
- package/dist/xsd/check-references.js +145 -0
- package/dist/xsd/form-edits.d.ts +57 -0
- package/dist/xsd/form-edits.js +153 -0
- package/dist/xsd/form-model.d.ts +153 -0
- package/dist/xsd/form-model.js +691 -0
- package/dist/xsd/locate.d.ts +42 -0
- package/dist/xsd/locate.js +249 -0
- package/dist/xsd/model.d.ts +249 -0
- package/dist/xsd/model.js +1 -0
- package/dist/xsd/parse-particles.d.ts +48 -0
- package/dist/xsd/parse-particles.js +320 -0
- package/dist/xsd/parse-schema.d.ts +21 -0
- package/dist/xsd/parse-schema.js +143 -0
- package/dist/xsd/resolve-content.d.ts +18 -0
- package/dist/xsd/resolve-content.js +242 -0
- package/dist/xsd/sample-generator.d.ts +51 -0
- package/dist/xsd/sample-generator.js +291 -0
- package/dist/xsd/sample-types.d.ts +21 -0
- package/dist/xsd/sample-types.js +69 -0
- package/dist/xsd/sample-values.d.ts +54 -0
- package/dist/xsd/sample-values.js +267 -0
- package/dist/xsd/schema-set.d.ts +51 -0
- package/dist/xsd/schema-set.js +203 -0
- package/dist/xsd/xml-scan.d.ts +64 -0
- package/dist/xsd/xml-scan.js +286 -0
- package/dist/xsd/xml-writer.d.ts +56 -0
- package/dist/xsd/xml-writer.js +103 -0
- package/package.json +69 -0
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
import { Agent, ProxyAgent, request as undiciRequest } from 'undici';
|
|
2
|
+
import { decompressBody } from './decompress.js';
|
|
3
|
+
import { failedRequestFor, withFailedRequest } from './failed-request.js';
|
|
4
|
+
import { invalidUrlError, toHttpError, tooManyRedirectsError } from './errors.js';
|
|
5
|
+
import { buildRawRequest, buildRawResponse } from './raw-capture.js';
|
|
6
|
+
import { TimingTracker } from './timings.js';
|
|
7
|
+
const DEFAULT_MAX_REDIRECTS = 5;
|
|
8
|
+
const REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);
|
|
9
|
+
/** Standard reason phrases, used when undici doesn't surface one for us. */
|
|
10
|
+
const REASON_PHRASES = {
|
|
11
|
+
200: 'OK',
|
|
12
|
+
201: 'Created',
|
|
13
|
+
202: 'Accepted',
|
|
14
|
+
204: 'No Content',
|
|
15
|
+
301: 'Moved Permanently',
|
|
16
|
+
302: 'Found',
|
|
17
|
+
303: 'See Other',
|
|
18
|
+
304: 'Not Modified',
|
|
19
|
+
307: 'Temporary Redirect',
|
|
20
|
+
308: 'Permanent Redirect',
|
|
21
|
+
400: 'Bad Request',
|
|
22
|
+
401: 'Unauthorized',
|
|
23
|
+
403: 'Forbidden',
|
|
24
|
+
404: 'Not Found',
|
|
25
|
+
405: 'Method Not Allowed',
|
|
26
|
+
408: 'Request Timeout',
|
|
27
|
+
409: 'Conflict',
|
|
28
|
+
413: 'Payload Too Large',
|
|
29
|
+
429: 'Too Many Requests',
|
|
30
|
+
500: 'Internal Server Error',
|
|
31
|
+
501: 'Not Implemented',
|
|
32
|
+
502: 'Bad Gateway',
|
|
33
|
+
503: 'Service Unavailable',
|
|
34
|
+
504: 'Gateway Timeout',
|
|
35
|
+
};
|
|
36
|
+
function statusText(status) {
|
|
37
|
+
return REASON_PHRASES[status] ?? '';
|
|
38
|
+
}
|
|
39
|
+
/** A lazily-created, shared keep-alive Agent for requests with no custom TLS/proxy options. */
|
|
40
|
+
let defaultAgent;
|
|
41
|
+
function getDefaultAgent() {
|
|
42
|
+
defaultAgent ??= new Agent({ keepAliveTimeout: 4000, keepAliveMaxTimeout: 10000 });
|
|
43
|
+
return defaultAgent;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Builds a dispatcher for the given TLS/proxy options. Callers that pass
|
|
47
|
+
* custom `tls`/`proxy` own the returned dispatcher (it is not cached) and
|
|
48
|
+
* should close it when done; callers with no options get the shared default
|
|
49
|
+
* keep-alive agent.
|
|
50
|
+
*/
|
|
51
|
+
export function createDispatcher(opts) {
|
|
52
|
+
const connect = connectOptions(opts);
|
|
53
|
+
const h2 = opts.allowH2 === true ? { allowH2: true } : {};
|
|
54
|
+
if (opts.proxy !== undefined) {
|
|
55
|
+
return new ProxyAgent(proxyAgentOptionsFor(opts.proxy, opts, opts.allowH2 === true));
|
|
56
|
+
}
|
|
57
|
+
if (connect !== undefined || opts.allowH2 === true) {
|
|
58
|
+
return new Agent({ ...(connect !== undefined ? { connect } : {}), ...h2 });
|
|
59
|
+
}
|
|
60
|
+
return getDefaultAgent();
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* The `ProxyAgent` options for one proxied request.
|
|
64
|
+
*
|
|
65
|
+
* The split between `requestTls` and `proxyTls` is the whole point: undici applies the
|
|
66
|
+
* agent-level `connect` to the socket it opens *to the proxy*, never to the TLS session inside
|
|
67
|
+
* the CONNECT tunnel — so passing our TLS settings there would silently drop the user's trust
|
|
68
|
+
* anchors, client certificate and `minVersion` for every proxied HTTPS request. `requestTls`
|
|
69
|
+
* is the tunnelled origin handshake (where those belong) and `proxyTls` carries only what
|
|
70
|
+
* describes the hop to the proxy itself, i.e. the bind address.
|
|
71
|
+
*
|
|
72
|
+
* `allowH2` is stated on `requestTls` rather than left to the agent, because undici builds the
|
|
73
|
+
* tunnelled connector from `requestTls` alone and its `allowH2` *defaults to true* — so an
|
|
74
|
+
* unstated flag offered `h2` in the ALPN of every proxied HTTPS handshake, including the ones
|
|
75
|
+
* whose client only speaks HTTP/1.1. Exported for the unit test that pins exactly that; not
|
|
76
|
+
* part of the package's public API (`index.ts` does not re-export it).
|
|
77
|
+
*
|
|
78
|
+
* @param proxy the resolved proxy to dial
|
|
79
|
+
* @param opts the send's TLS options and bind address
|
|
80
|
+
* @param allowH2 whether HTTP/2 may be negotiated, on the tunnelled handshake and the agent
|
|
81
|
+
* @param extra agent-level options merged on top (connection pooling, keep-alive)
|
|
82
|
+
*/
|
|
83
|
+
export function proxyAgentOptionsFor(proxy, opts, allowH2, extra = {}) {
|
|
84
|
+
return {
|
|
85
|
+
uri: proxy.url,
|
|
86
|
+
...(proxy.auth !== undefined
|
|
87
|
+
? { token: `Basic ${Buffer.from(`${proxy.auth.username}:${proxy.auth.password}`).toString('base64')}` }
|
|
88
|
+
: {}),
|
|
89
|
+
requestTls: { ...(opts.tls !== undefined ? tlsConnectOptions(opts.tls) : {}), allowH2 },
|
|
90
|
+
// undici types `proxyTls` as `TcpNetConnectOpts & …`, which insists on a `port` a connector
|
|
91
|
+
// option set never carries; the narrow cast here replaces the one that used to swallow the
|
|
92
|
+
// whole options object (and with it every typo in it).
|
|
93
|
+
...(opts.localAddress !== undefined
|
|
94
|
+
? { proxyTls: { localAddress: opts.localAddress } }
|
|
95
|
+
: {}),
|
|
96
|
+
...(allowH2 ? { allowH2: true } : {}),
|
|
97
|
+
...extra,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Builds a dispatcher pinned to a single, non-pipelined connection per origin, using the
|
|
102
|
+
* same TLS/proxy/bind-address mapping as {@link createDispatcher}. NTLM authenticates the
|
|
103
|
+
* *connection*, not the request, so all three legs of its handshake have to travel over one
|
|
104
|
+
* socket; `connections: 1` plus keep-alive gives sequential requests exactly that. The caller
|
|
105
|
+
* owns the returned dispatcher and must close it.
|
|
106
|
+
*/
|
|
107
|
+
export function createSingleConnectionDispatcher(opts) {
|
|
108
|
+
const connect = connectOptions(opts);
|
|
109
|
+
const base = { connections: 1, pipelining: 1, keepAliveTimeout: 30_000, keepAliveMaxTimeout: 60_000 };
|
|
110
|
+
const shared = { ...base, ...(connect !== undefined ? { connect } : {}) };
|
|
111
|
+
if (opts.proxy !== undefined) {
|
|
112
|
+
// `base` (connections: 1, keep-alive) still applies: it reaches the per-origin client
|
|
113
|
+
// inside the tunnel, which is exactly the connection NTLM authenticates. NTLM is an
|
|
114
|
+
// HTTP/1.1 authentication scheme, so the tunnelled handshake stays pinned to HTTP/1.1.
|
|
115
|
+
return new ProxyAgent(proxyAgentOptionsFor(opts.proxy, opts, false, base));
|
|
116
|
+
}
|
|
117
|
+
return new Agent(shared);
|
|
118
|
+
}
|
|
119
|
+
/** The connector options for the given TLS/bind-address settings, or `undefined` when neither is set. */
|
|
120
|
+
function connectOptions(opts) {
|
|
121
|
+
if (opts.tls === undefined && opts.localAddress === undefined) {
|
|
122
|
+
return undefined;
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
...(opts.tls !== undefined ? tlsConnectOptions(opts.tls) : {}),
|
|
126
|
+
...(opts.localAddress !== undefined ? { localAddress: opts.localAddress } : {}),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
function tlsConnectOptions(tls) {
|
|
130
|
+
return {
|
|
131
|
+
rejectUnauthorized: tls.rejectUnauthorized,
|
|
132
|
+
ca: tls.ca !== undefined ? [...tls.ca] : undefined,
|
|
133
|
+
cert: tls.cert,
|
|
134
|
+
key: tls.key,
|
|
135
|
+
passphrase: tls.passphrase,
|
|
136
|
+
minVersion: tls.minVersion,
|
|
137
|
+
servername: tls.servername,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/** Headers dropped when a redirect crosses an origin, per fetch/undici's credential-scoping semantics. */
|
|
141
|
+
const CREDENTIAL_HEADERS = new Set(['authorization', 'proxy-authorization', 'cookie']);
|
|
142
|
+
/** Origin as scheme + host + port (host already includes a non-default port). */
|
|
143
|
+
function originOf(url) {
|
|
144
|
+
return `${url.protocol}//${url.host}`;
|
|
145
|
+
}
|
|
146
|
+
/** Drops credential headers (case-insensitive) when moving to a different origin. */
|
|
147
|
+
function scopeHeadersToOrigin(headers, fromUrl, toUrl) {
|
|
148
|
+
if (originOf(fromUrl) === originOf(toUrl))
|
|
149
|
+
return headers;
|
|
150
|
+
const scoped = {};
|
|
151
|
+
for (const [name, value] of Object.entries(headers)) {
|
|
152
|
+
if (CREDENTIAL_HEADERS.has(name.toLowerCase()))
|
|
153
|
+
continue;
|
|
154
|
+
scoped[name] = value;
|
|
155
|
+
}
|
|
156
|
+
return scoped;
|
|
157
|
+
}
|
|
158
|
+
/** Joins undici's raw header shape (string | string[] per name) into our lower-cased map. */
|
|
159
|
+
function joinHeaders(raw) {
|
|
160
|
+
const headers = {};
|
|
161
|
+
const rawHeaders = [];
|
|
162
|
+
for (const [name, value] of Object.entries(raw)) {
|
|
163
|
+
if (value === undefined)
|
|
164
|
+
continue;
|
|
165
|
+
const lower = name.toLowerCase();
|
|
166
|
+
if (Array.isArray(value)) {
|
|
167
|
+
for (const v of value)
|
|
168
|
+
rawHeaders.push([lower, v]);
|
|
169
|
+
headers[lower] = lower === 'set-cookie' ? (value[0] ?? '') : value.join(', ');
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
rawHeaders.push([lower, value]);
|
|
173
|
+
headers[lower] = value;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return { headers, rawHeaders };
|
|
177
|
+
}
|
|
178
|
+
/** Builds the header set as it will be sent, including the `Host` and `Content-Length` undici adds implicitly. */
|
|
179
|
+
function buildFinalHeaders(req, url, body) {
|
|
180
|
+
const final = { host: url.host };
|
|
181
|
+
for (const [name, value] of Object.entries(req.headers)) {
|
|
182
|
+
final[name] = value;
|
|
183
|
+
}
|
|
184
|
+
if (body !== undefined)
|
|
185
|
+
final['content-length'] = String(body.length);
|
|
186
|
+
return final;
|
|
187
|
+
}
|
|
188
|
+
async function readBody(body, maxSizeBytes) {
|
|
189
|
+
const chunks = [];
|
|
190
|
+
let total = 0;
|
|
191
|
+
let truncated = false;
|
|
192
|
+
for await (const chunk of body) {
|
|
193
|
+
if (maxSizeBytes !== undefined && total + chunk.length > maxSizeBytes) {
|
|
194
|
+
const remaining = maxSizeBytes - total;
|
|
195
|
+
if (remaining > 0)
|
|
196
|
+
chunks.push(chunk.subarray(0, remaining));
|
|
197
|
+
total = maxSizeBytes;
|
|
198
|
+
truncated = true;
|
|
199
|
+
// Tear the connection down explicitly rather than relying on the async
|
|
200
|
+
// iterator's implicit cleanup on `break` — that cleanup is not
|
|
201
|
+
// guaranteed to release the socket back to the pool promptly.
|
|
202
|
+
body.destroy?.();
|
|
203
|
+
break;
|
|
204
|
+
}
|
|
205
|
+
chunks.push(chunk);
|
|
206
|
+
total += chunk.length;
|
|
207
|
+
}
|
|
208
|
+
const data = new Uint8Array(total);
|
|
209
|
+
let offset = 0;
|
|
210
|
+
for (const chunk of chunks) {
|
|
211
|
+
data.set(chunk, offset);
|
|
212
|
+
offset += chunk.length;
|
|
213
|
+
}
|
|
214
|
+
return { data, truncated };
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Fully consumes a redirect response's body so the underlying connection is
|
|
218
|
+
* returned to the keep-alive pool, without buffering the bytes anywhere.
|
|
219
|
+
* Prefers undici's `dump()` (a body we're discarding, not size-capped);
|
|
220
|
+
* falls back to iterating to completion for any body lacking `dump`.
|
|
221
|
+
*/
|
|
222
|
+
async function drainBody(body) {
|
|
223
|
+
if (typeof body.dump === 'function') {
|
|
224
|
+
await body.dump();
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
for await (const chunk of body) {
|
|
228
|
+
void chunk; // discard; just drives the stream to completion
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Sends one HTTP request and returns the full {@link HttpExchange}, including
|
|
233
|
+
* reconstructed raw wire bytes and best-effort timings. Redirects (301/302/
|
|
234
|
+
* 303/307/308) are followed manually when `req.followRedirects` is set, so we
|
|
235
|
+
* can record the `redirects[]` trail and apply fetch's POST→GET downgrade on
|
|
236
|
+
* 301/302/303.
|
|
237
|
+
*
|
|
238
|
+
* Non-2xx responses are returned as a normal exchange, never thrown — only
|
|
239
|
+
* transport-level failures (timeout, abort, DNS, TLS, refused connection,
|
|
240
|
+
* too many redirects, invalid URL) throw {@link HttpError}.
|
|
241
|
+
*
|
|
242
|
+
* A response exceeding `req.maxSizeBytes` is *not* an error: the exchange is
|
|
243
|
+
* returned with `truncated: true` and `body` cut at the cap, per the product
|
|
244
|
+
* decision that "Max Size" (Task 30) should notify, not fail, the exchange.
|
|
245
|
+
*/
|
|
246
|
+
export async function sendHttp(req, options) {
|
|
247
|
+
let parsedUrl;
|
|
248
|
+
try {
|
|
249
|
+
parsedUrl = new URL(req.url);
|
|
250
|
+
}
|
|
251
|
+
catch (err) {
|
|
252
|
+
throw invalidUrlError(req.url, err);
|
|
253
|
+
}
|
|
254
|
+
const ownDispatcher = options?.dispatcher === undefined &&
|
|
255
|
+
(req.tls !== undefined || req.proxy !== undefined || req.localAddress !== undefined || req.allowH2 === true)
|
|
256
|
+
? createDispatcher({
|
|
257
|
+
...(req.tls !== undefined ? { tls: req.tls } : {}),
|
|
258
|
+
...(req.proxy !== undefined ? { proxy: req.proxy } : {}),
|
|
259
|
+
...(req.localAddress !== undefined ? { localAddress: req.localAddress } : {}),
|
|
260
|
+
...(req.allowH2 === true ? { allowH2: true } : {}),
|
|
261
|
+
})
|
|
262
|
+
: undefined;
|
|
263
|
+
const dispatcher = options?.dispatcher ?? ownDispatcher ?? getDefaultAgent();
|
|
264
|
+
const maxRedirects = req.maxRedirects ?? DEFAULT_MAX_REDIRECTS;
|
|
265
|
+
const redirects = [];
|
|
266
|
+
const tracker = new TimingTracker(options?.now);
|
|
267
|
+
const deadlineController = new AbortController();
|
|
268
|
+
const timer = setTimeout(() => deadlineController.abort(), req.timeoutMs);
|
|
269
|
+
const signals = [deadlineController.signal, req.signal].filter((s) => s !== undefined);
|
|
270
|
+
const combinedSignal = signals.length > 1 ? AbortSignal.any(signals) : signals[0];
|
|
271
|
+
// The last attempt made, so a transport error can say what was about to go on the wire.
|
|
272
|
+
let lastAttempt;
|
|
273
|
+
try {
|
|
274
|
+
let currentUrl = parsedUrl;
|
|
275
|
+
let currentMethod = req.method;
|
|
276
|
+
let currentBody = req.body;
|
|
277
|
+
let currentHeaders = { ...req.headers };
|
|
278
|
+
let result;
|
|
279
|
+
for (let attempt = 0; attempt <= maxRedirects; attempt++) {
|
|
280
|
+
// Tells the tracker which origin the TLS events it is about to see belong to.
|
|
281
|
+
tracker.setOrigin(currentUrl.origin);
|
|
282
|
+
const finalHeaders = buildFinalHeaders({ ...req, headers: currentHeaders, method: currentMethod }, currentUrl, currentBody);
|
|
283
|
+
lastAttempt = failedRequestFor(currentUrl.toString(), currentMethod, finalHeaders, currentBody);
|
|
284
|
+
const rawRequest = buildRawRequest({ ...req, url: currentUrl.toString(), method: currentMethod, headers: currentHeaders }, finalHeaders, currentBody);
|
|
285
|
+
let response;
|
|
286
|
+
try {
|
|
287
|
+
// Wraps the call itself (not its result) so the tracker can capture the exact
|
|
288
|
+
// undici `Request` object this attempt uses from `undici:request:create`, which
|
|
289
|
+
// fires synchronously inside `undiciRequest()` before it returns a pending
|
|
290
|
+
// promise — see `TimingTracker.captureRequestFor`.
|
|
291
|
+
response = await tracker.captureRequestFor(() => undiciRequest(currentUrl, {
|
|
292
|
+
method: currentMethod,
|
|
293
|
+
headers: currentHeaders,
|
|
294
|
+
...(currentBody !== undefined ? { body: currentBody } : {}),
|
|
295
|
+
dispatcher,
|
|
296
|
+
signal: combinedSignal ?? null,
|
|
297
|
+
headersTimeout: req.timeoutMs,
|
|
298
|
+
bodyTimeout: req.timeoutMs,
|
|
299
|
+
}));
|
|
300
|
+
}
|
|
301
|
+
catch (err) {
|
|
302
|
+
throw toHttpError(err, {
|
|
303
|
+
userAborted: req.signal?.aborted === true,
|
|
304
|
+
deadlineHit: deadlineController.signal.aborted,
|
|
305
|
+
hadProxy: req.proxy !== undefined,
|
|
306
|
+
host: currentUrl.host,
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
tracker.markHeaders();
|
|
310
|
+
const { headers, rawHeaders } = joinHeaders(response.headers);
|
|
311
|
+
const isRedirect = req.followRedirects && REDIRECT_STATUSES.has(response.statusCode) && headers['location'] !== undefined;
|
|
312
|
+
if (isRedirect) {
|
|
313
|
+
if (attempt === maxRedirects) {
|
|
314
|
+
// Fully drain the body so the socket returns to the keep-alive pool, then fail.
|
|
315
|
+
await drainBody(response.body).catch(() => undefined);
|
|
316
|
+
throw tooManyRedirectsError(maxRedirects);
|
|
317
|
+
}
|
|
318
|
+
redirects.push({ url: currentUrl.toString(), status: response.statusCode });
|
|
319
|
+
await drainBody(response.body).catch(() => undefined);
|
|
320
|
+
const nextUrl = new URL(headers['location'] ?? '', currentUrl);
|
|
321
|
+
// 303 always becomes a GET - that is what the status means. 301 and 302 do so only for a
|
|
322
|
+
// POST, which is the historical browser (and curl) behaviour RFC 9110 §15.4.3 records; a
|
|
323
|
+
// PUT or DELETE keeps its method, and `preserveMethodOnRedirect` keeps even a POST's.
|
|
324
|
+
const downgrade = response.statusCode === 303 ||
|
|
325
|
+
((response.statusCode === 301 || response.statusCode === 302) &&
|
|
326
|
+
currentMethod === 'POST' &&
|
|
327
|
+
req.preserveMethodOnRedirect !== true);
|
|
328
|
+
if (downgrade) {
|
|
329
|
+
currentMethod = 'GET';
|
|
330
|
+
currentBody = undefined;
|
|
331
|
+
const rest = { ...currentHeaders };
|
|
332
|
+
delete rest['content-type'];
|
|
333
|
+
currentHeaders = rest;
|
|
334
|
+
}
|
|
335
|
+
// Drop credential headers (Authorization/Proxy-Authorization/Cookie)
|
|
336
|
+
// when the redirect crosses to a different origin.
|
|
337
|
+
currentHeaders = scopeHeadersToOrigin(currentHeaders, currentUrl, nextUrl);
|
|
338
|
+
currentUrl = nextUrl;
|
|
339
|
+
continue;
|
|
340
|
+
}
|
|
341
|
+
const { data: rawBodyRaw, truncated } = await readBody(response.body, req.maxSizeBytes);
|
|
342
|
+
const decompress = req.decompress ?? true;
|
|
343
|
+
let body = rawBodyRaw;
|
|
344
|
+
let decodeError;
|
|
345
|
+
if (decompress) {
|
|
346
|
+
try {
|
|
347
|
+
body = await decompressBody(rawBodyRaw, headers['content-encoding']);
|
|
348
|
+
}
|
|
349
|
+
catch (err) {
|
|
350
|
+
body = rawBodyRaw;
|
|
351
|
+
decodeError = err instanceof Error ? err.message : String(err);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
result = {
|
|
355
|
+
status: response.statusCode,
|
|
356
|
+
headers,
|
|
357
|
+
rawHeaders,
|
|
358
|
+
rawBody: rawBodyRaw,
|
|
359
|
+
body,
|
|
360
|
+
truncated,
|
|
361
|
+
...(decodeError !== undefined ? { decodeError } : {}),
|
|
362
|
+
rawRequest,
|
|
363
|
+
finalUrl: currentUrl.toString(),
|
|
364
|
+
finalMethod: currentMethod,
|
|
365
|
+
};
|
|
366
|
+
break;
|
|
367
|
+
}
|
|
368
|
+
if (result === undefined)
|
|
369
|
+
throw tooManyRedirectsError(maxRedirects);
|
|
370
|
+
const tlsInfo = tracker.tlsInfo();
|
|
371
|
+
// ALPN is the only honest answer to "what did this actually speak": `allowH2` is an offer,
|
|
372
|
+
// and a server is free to stay on HTTP/1.1. Plain HTTP has no ALPN and is always 1.1.
|
|
373
|
+
const httpVersion = tlsInfo?.alpn === 'h2' ? '2' : '1.1';
|
|
374
|
+
const rawResponse = buildRawResponse(result.status, statusText(result.status), result.rawHeaders, result.rawBody, httpVersion);
|
|
375
|
+
const timings = tracker.finish();
|
|
376
|
+
return {
|
|
377
|
+
request: { url: result.finalUrl, method: result.finalMethod, headers: req.headers },
|
|
378
|
+
status: result.status,
|
|
379
|
+
statusText: statusText(result.status),
|
|
380
|
+
headers: result.headers,
|
|
381
|
+
rawHeaders: result.rawHeaders,
|
|
382
|
+
body: result.body,
|
|
383
|
+
rawBody: result.rawBody,
|
|
384
|
+
truncated: result.truncated,
|
|
385
|
+
httpVersion,
|
|
386
|
+
...(result.decodeError !== undefined ? { decodeError: result.decodeError } : {}),
|
|
387
|
+
timings,
|
|
388
|
+
rawRequest: result.rawRequest,
|
|
389
|
+
rawResponse,
|
|
390
|
+
redirects,
|
|
391
|
+
...(tlsInfo !== undefined ? { tls: tlsInfo } : {}),
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
catch (err) {
|
|
395
|
+
throw lastAttempt === undefined ? err : withFailedRequest(err, lastAttempt);
|
|
396
|
+
}
|
|
397
|
+
finally {
|
|
398
|
+
clearTimeout(timer);
|
|
399
|
+
tracker.dispose();
|
|
400
|
+
if (ownDispatcher !== undefined)
|
|
401
|
+
await ownDispatcher.close().catch(() => undefined);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The curl flags both command readers (SOAP in `curl.ts`, REST in `../rest/curl.ts`) need to agree
|
|
3
|
+
* on: which ones take no value. A reader that skips a flag it has no field for must also skip that
|
|
4
|
+
* flag's value, or the value is read as the URL; and it must not skip the token after a flag that
|
|
5
|
+
* has none, or the URL is swallowed instead.
|
|
6
|
+
*/
|
|
7
|
+
/** Flags that take no value, so a parser must not eat the token after them. */
|
|
8
|
+
export declare const VALUELESS_FLAGS: Set<string>;
|
|
9
|
+
/**
|
|
10
|
+
* Splits a bundle of short flags the way curl reads it: `-sSL` is three flags, and the first letter
|
|
11
|
+
* that takes a value ends the bundle, the rest being its value (`-XPUT`, `-sXPOST`, `-uada:pw`).
|
|
12
|
+
*/
|
|
13
|
+
export declare function expandBundles(tokens: readonly string[]): string[];
|
|
14
|
+
/** Whether a flag this reader does not handle stands alone: listed as value-less, or `--name=value`. */
|
|
15
|
+
export declare function takesNoValue(flag: string): boolean;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The curl flags both command readers (SOAP in `curl.ts`, REST in `../rest/curl.ts`) need to agree
|
|
3
|
+
* on: which ones take no value. A reader that skips a flag it has no field for must also skip that
|
|
4
|
+
* flag's value, or the value is read as the URL; and it must not skip the token after a flag that
|
|
5
|
+
* has none, or the URL is swallowed instead.
|
|
6
|
+
*/
|
|
7
|
+
/** Flags that take no value, so a parser must not eat the token after them. */
|
|
8
|
+
export const VALUELESS_FLAGS = new Set([
|
|
9
|
+
'-k',
|
|
10
|
+
'--insecure',
|
|
11
|
+
'-L',
|
|
12
|
+
'--location',
|
|
13
|
+
'-s',
|
|
14
|
+
'--silent',
|
|
15
|
+
'-v',
|
|
16
|
+
'--verbose',
|
|
17
|
+
'-i',
|
|
18
|
+
'--include',
|
|
19
|
+
'-f',
|
|
20
|
+
'--fail',
|
|
21
|
+
'-g',
|
|
22
|
+
'--globoff',
|
|
23
|
+
'--compressed',
|
|
24
|
+
'-4',
|
|
25
|
+
'-6',
|
|
26
|
+
'--http1.0',
|
|
27
|
+
'--http1.1',
|
|
28
|
+
'--http2',
|
|
29
|
+
'--http2-prior-knowledge',
|
|
30
|
+
'--http3',
|
|
31
|
+
'-G',
|
|
32
|
+
'--get',
|
|
33
|
+
'-I',
|
|
34
|
+
'--head',
|
|
35
|
+
'-O',
|
|
36
|
+
'--remote-name',
|
|
37
|
+
'-J',
|
|
38
|
+
'--remote-header-name',
|
|
39
|
+
'-S',
|
|
40
|
+
'--show-error',
|
|
41
|
+
'-N',
|
|
42
|
+
'--no-buffer',
|
|
43
|
+
'-#',
|
|
44
|
+
'--progress-bar',
|
|
45
|
+
'-n',
|
|
46
|
+
'--netrc',
|
|
47
|
+
'-j',
|
|
48
|
+
'--junk-session-cookies',
|
|
49
|
+
'--basic',
|
|
50
|
+
'--digest',
|
|
51
|
+
'--ntlm',
|
|
52
|
+
'--negotiate',
|
|
53
|
+
'--anyauth',
|
|
54
|
+
'--fail-with-body',
|
|
55
|
+
'--location-trusted',
|
|
56
|
+
'--path-as-is',
|
|
57
|
+
'--raw',
|
|
58
|
+
'--no-keepalive',
|
|
59
|
+
'--tcp-nodelay',
|
|
60
|
+
'--ssl',
|
|
61
|
+
'--ssl-reqd',
|
|
62
|
+
'--tlsv1',
|
|
63
|
+
'--tlsv1.0',
|
|
64
|
+
'--tlsv1.1',
|
|
65
|
+
'--tlsv1.2',
|
|
66
|
+
'--tlsv1.3',
|
|
67
|
+
]);
|
|
68
|
+
/**
|
|
69
|
+
* Splits a bundle of short flags the way curl reads it: `-sSL` is three flags, and the first letter
|
|
70
|
+
* that takes a value ends the bundle, the rest being its value (`-XPUT`, `-sXPOST`, `-uada:pw`).
|
|
71
|
+
*/
|
|
72
|
+
export function expandBundles(tokens) {
|
|
73
|
+
return tokens.flatMap((token) => {
|
|
74
|
+
if (!/^-[A-Za-z0-9#]./.test(token)) {
|
|
75
|
+
return [token];
|
|
76
|
+
}
|
|
77
|
+
const out = [];
|
|
78
|
+
for (let at = 1; at < token.length; at += 1) {
|
|
79
|
+
const flag = `-${token.charAt(at)}`;
|
|
80
|
+
out.push(flag);
|
|
81
|
+
if (!VALUELESS_FLAGS.has(flag)) {
|
|
82
|
+
const value = token.slice(at + 1);
|
|
83
|
+
if (value !== '') {
|
|
84
|
+
out.push(value);
|
|
85
|
+
}
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return out;
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
/** Whether a flag this reader does not handle stands alone: listed as value-less, or `--name=value`. */
|
|
93
|
+
export function takesNoValue(flag) {
|
|
94
|
+
return VALUELESS_FLAGS.has(flag) || flag.includes('=');
|
|
95
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interoperability convenience: export a send as a `curl` command, and parse a pasted `curl` command
|
|
3
|
+
* back into a partial send input.
|
|
4
|
+
*
|
|
5
|
+
* {@link toCurl} describes a request in `curl`'s own terms — a method, a URL, headers and one of the
|
|
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 ({@link soapToCurl} here, `restToCurl` in `rest/curl.ts`), so the
|
|
8
|
+
* quoting, the line continuations and the two shells have one implementation rather than two.
|
|
9
|
+
*/
|
|
10
|
+
import type { SoapSendInput } from '../types.js';
|
|
11
|
+
/** One header of an exported command, in the order the user wrote it. */
|
|
12
|
+
export interface CurlHeader {
|
|
13
|
+
readonly name: string;
|
|
14
|
+
readonly value: string;
|
|
15
|
+
}
|
|
16
|
+
/** One part of an exported `multipart/form-data` body. */
|
|
17
|
+
export type CurlPart = {
|
|
18
|
+
readonly kind: 'text';
|
|
19
|
+
readonly name: string;
|
|
20
|
+
readonly value: string;
|
|
21
|
+
readonly contentType?: string;
|
|
22
|
+
}
|
|
23
|
+
/** A file `curl` reads itself, as `-F name=@path`. An empty path is written as a placeholder. */
|
|
24
|
+
| {
|
|
25
|
+
readonly kind: 'file';
|
|
26
|
+
readonly name: string;
|
|
27
|
+
readonly path: string;
|
|
28
|
+
readonly contentType?: string;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* What the command sends.
|
|
32
|
+
*
|
|
33
|
+
* Each arm maps to the flag `curl` users expect for it, which is what makes an exported command worth
|
|
34
|
+
* pasting: `--data-urlencode` per form field rather than one pre-encoded blob, `-F` per part rather
|
|
35
|
+
* than a hand-built multipart body, and `@file` where the bytes live on disk rather than inline.
|
|
36
|
+
*/
|
|
37
|
+
export type CurlBody = {
|
|
38
|
+
readonly kind: 'none';
|
|
39
|
+
} | {
|
|
40
|
+
readonly kind: 'raw';
|
|
41
|
+
readonly text: string;
|
|
42
|
+
} | {
|
|
43
|
+
readonly kind: 'form';
|
|
44
|
+
readonly fields: readonly CurlHeader[];
|
|
45
|
+
} | {
|
|
46
|
+
readonly kind: 'multipart';
|
|
47
|
+
readonly parts: readonly CurlPart[];
|
|
48
|
+
} | {
|
|
49
|
+
readonly kind: 'binary';
|
|
50
|
+
readonly path: string;
|
|
51
|
+
};
|
|
52
|
+
/** A request as `curl` would describe it. */
|
|
53
|
+
export interface CurlCommand {
|
|
54
|
+
readonly method: string;
|
|
55
|
+
readonly url: string;
|
|
56
|
+
readonly headers: readonly CurlHeader[];
|
|
57
|
+
readonly body?: CurlBody;
|
|
58
|
+
/** `-u user:password`. The password is the caller's to redact before it gets here. */
|
|
59
|
+
readonly basic?: {
|
|
60
|
+
readonly username: string;
|
|
61
|
+
readonly password: string;
|
|
62
|
+
};
|
|
63
|
+
/** `-k`: send even when the certificate does not verify. */
|
|
64
|
+
readonly insecure?: boolean;
|
|
65
|
+
/** `-L`, with `--max-redirs` when a limit is set. */
|
|
66
|
+
readonly followRedirects?: boolean;
|
|
67
|
+
readonly maxRedirects?: number;
|
|
68
|
+
}
|
|
69
|
+
/** Options for {@link toCurl} and {@link soapToCurl}. */
|
|
70
|
+
export interface ToCurlOptions {
|
|
71
|
+
/** Target shell for line continuations and quoting. Default 'posix'. */
|
|
72
|
+
readonly shell?: 'posix' | 'powershell';
|
|
73
|
+
}
|
|
74
|
+
/** Quotes one argument for `shell`; shared with the gRPC command renderer so both quote alike. */
|
|
75
|
+
export declare function quoteForShell(value: string, shell: 'posix' | 'powershell'): string;
|
|
76
|
+
/**
|
|
77
|
+
* Builds a `curl` command from {@link CurlCommand}.
|
|
78
|
+
*
|
|
79
|
+
* A raw body travels as a heredoc (POSIX) or a here-string (PowerShell) rather than as a quoted
|
|
80
|
+
* argument: it may contain newlines, quotes and anything else, and a heredoc is the one form that
|
|
81
|
+
* carries all of it unchanged — which is also what {@link fromCurl} reads back.
|
|
82
|
+
*/
|
|
83
|
+
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;
|