@psnext/slingcli 3.1.20260904-1 → 3.3.20260914-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/node_modules/@aws-sdk/core/dist-cjs/submodules/util/index.js +5 -0
- package/node_modules/@aws-sdk/core/dist-es/submodules/util/hasOwn.js +3 -0
- package/node_modules/@aws-sdk/core/dist-es/submodules/util/index.js +1 -0
- package/node_modules/@aws-sdk/core/dist-types/submodules/util/hasOwn.d.ts +4 -0
- package/node_modules/@aws-sdk/core/dist-types/submodules/util/index.d.ts +1 -0
- package/node_modules/@aws-sdk/core/dist-types/ts3.4/submodules/util/hasOwn.d.ts +1 -0
- package/node_modules/@aws-sdk/core/dist-types/ts3.4/submodules/util/index.d.ts +1 -0
- package/node_modules/@aws-sdk/core/package.json +1 -1
- package/node_modules/@aws-sdk/credential-provider-env/package.json +2 -2
- package/node_modules/@aws-sdk/credential-provider-http/package.json +2 -2
- package/node_modules/@aws-sdk/credential-provider-ini/package.json +9 -9
- package/node_modules/@aws-sdk/credential-provider-login/package.json +3 -3
- package/node_modules/@aws-sdk/credential-provider-node/package.json +7 -7
- package/node_modules/@aws-sdk/credential-provider-process/package.json +2 -2
- package/node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/token-providers/package.json +3 -3
- package/node_modules/@aws-sdk/credential-provider-sso/package.json +4 -4
- package/node_modules/@aws-sdk/credential-provider-web-identity/package.json +3 -3
- package/node_modules/@aws-sdk/middleware-websocket/package.json +2 -2
- package/node_modules/@aws-sdk/nested-clients/dist-cjs/submodules/cognito-identity/index.js +1 -1
- package/node_modules/@aws-sdk/nested-clients/dist-cjs/submodules/signin/index.js +1 -1
- package/node_modules/@aws-sdk/nested-clients/dist-cjs/submodules/sso/index.js +1 -1
- package/node_modules/@aws-sdk/nested-clients/dist-cjs/submodules/sso-oidc/index.js +1 -1
- package/node_modules/@aws-sdk/nested-clients/dist-cjs/submodules/sts/index.js +1 -1
- package/node_modules/@aws-sdk/nested-clients/package.json +2 -2
- package/node_modules/@earendil-works/pi-coding-agent/dist/bundle/chunks/{chunk-PBNSMEG7.js → chunk-BRL3MDQL.js} +10 -10
- package/node_modules/@earendil-works/pi-coding-agent/dist/bundle/cli.js +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/bundle/index.js +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/bundle/rpc-entry.js +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/model-selector.js +79 -32
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/docs/docs/api/Client.md +25 -8
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/docs/docs/api/EnvHttpProxyAgent.md +3 -2
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/docs/docs/api/EventSource.md +4 -0
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/docs/docs/api/Interceptors.md +7 -3
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/docs/docs/api/Socks5ProxyAgent.md +7 -1
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/api/readable.js +33 -43
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/cache/memory-cache-store.js +2 -2
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/core/connect.js +16 -2
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/core/symbols.js +3 -0
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/dispatcher/agent.js +7 -2
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/dispatcher/balanced-pool.js +7 -4
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/dispatcher/client-h1.js +9 -1
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/dispatcher/client-h2.js +221 -12
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/dispatcher/client.js +76 -30
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/dispatcher/dispatcher-base.js +13 -1
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/dispatcher/dispatcher.js +15 -1
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/dispatcher/dispatcher1-wrapper.js +3 -0
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/dispatcher/env-http-proxy-agent.js +37 -8
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/dispatcher/proxy-agent.js +18 -1
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/dispatcher/retry-agent.js +3 -0
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/dispatcher/round-robin-pool.js +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/dispatcher/socks5-proxy-agent.js +106 -22
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/handler/cache-handler.js +29 -5
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/handler/decorator-handler.js +7 -1
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/handler/deduplication-handler.js +12 -6
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/handler/redirect-handler.js +21 -4
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/handler/retry-handler.js +155 -32
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/interceptor/cache.js +65 -9
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/interceptor/decompress.js +115 -13
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/interceptor/deduplicate.js +5 -4
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/interceptor/dns.js +7 -0
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/interceptor/dump.js +10 -23
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/mock/mock-agent.js +13 -1
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/mock/mock-utils.js +217 -27
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/util/cache.js +43 -3
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/web/cookies/parse.js +150 -147
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/web/eventsource/eventsource-stream.js +28 -1
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/web/eventsource/eventsource.js +13 -3
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/web/fetch/index.js +6 -0
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/web/fetch/request.js +2 -3
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/web/fetch/util.js +6 -1
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/web/webidl/index.js +3 -3
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/web/websocket/connection.js +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/web/websocket/permessage-deflate.js +5 -0
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/web/websocket/stream/websocketstream.js +8 -10
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/web/websocket/websocket.js +22 -0
- package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/package.json +3 -3
- package/node_modules/@earendil-works/pi-coding-agent/npm-shrinkwrap.json +4 -4
- package/node_modules/@earendil-works/pi-coding-agent/package.json +1 -1
- package/node_modules/@smithy/core/dist-cjs/submodules/errors/index.js +20 -0
- package/node_modules/@smithy/core/dist-cjs/submodules/retry/index.browser.js +11 -10
- package/node_modules/@smithy/core/dist-cjs/submodules/retry/index.js +11 -10
- package/node_modules/@smithy/core/dist-cjs/submodules/serde/index.browser.js +2 -0
- package/node_modules/@smithy/core/dist-cjs/submodules/serde/index.js +25 -8
- package/node_modules/@smithy/core/dist-cjs/submodules/serde/index.native.js +2 -0
- package/node_modules/@smithy/core/dist-es/submodules/errors/errors.js +18 -0
- package/node_modules/@smithy/core/dist-es/submodules/errors/index.js +1 -0
- package/node_modules/@smithy/core/dist-es/submodules/retry/service-error-classification/service-error-classification.js +11 -10
- package/node_modules/@smithy/core/dist-es/submodules/serde/util-stream/getAwsChunkedEncodingStream.browser.js +2 -0
- package/node_modules/@smithy/core/dist-es/submodules/serde/util-stream/getAwsChunkedEncodingStream.js +23 -8
- package/node_modules/@smithy/core/dist-types/submodules/errors/errors.d.ts +44 -0
- package/node_modules/@smithy/core/dist-types/submodules/errors/index.d.ts +1 -0
- package/node_modules/@smithy/core/dist-types/submodules/retry/service-error-classification/service-error-classification.d.ts +4 -0
- package/node_modules/@smithy/core/dist-types/ts3.4/submodules/errors/errors.d.ts +44 -0
- package/node_modules/@smithy/core/dist-types/ts3.4/submodules/errors/index.d.ts +1 -0
- package/node_modules/@smithy/core/dist-types/ts3.4/submodules/retry/service-error-classification/service-error-classification.d.ts +4 -0
- package/node_modules/@smithy/core/errors.d.ts +5 -0
- package/node_modules/@smithy/core/errors.js +5 -0
- package/node_modules/@smithy/core/package.json +11 -2
- package/node_modules/@types/node/README.md +1 -1
- package/node_modules/@types/node/buffer.d.ts +1 -0
- package/node_modules/@types/node/diagnostics_channel.d.ts +4 -4
- package/node_modules/@types/node/http.d.ts +1 -1
- package/node_modules/@types/node/package.json +3 -3
- package/node_modules/@types/node/perf_hooks.d.ts +31 -19
- package/node_modules/@types/node/quic.d.ts +6 -4
- package/node_modules/@types/node/stream/web.d.ts +20 -0
- package/node_modules/@types/node/tls.d.ts +26 -15
- package/node_modules/@types/node/vfs.d.ts +7 -6
- package/node_modules/@types/node/web-globals/streams.d.ts +4 -0
- package/node_modules/@types/node/zlib.d.ts +17 -0
- package/node_modules/hono/dist/cjs/client/client.js +4 -4
- package/node_modules/hono/dist/cjs/hono-base.js +7 -6
- package/node_modules/hono/dist/cjs/jsx/base.js +18 -1
- package/node_modules/hono/dist/cjs/jsx/components.js +25 -26
- package/node_modules/hono/dist/cjs/jsx/context.js +5 -5
- package/node_modules/hono/dist/cjs/jsx/dom/server.js +5 -1
- package/node_modules/hono/dist/cjs/jsx/intrinsic-element/components.js +2 -2
- package/node_modules/hono/dist/cjs/jsx/streaming.js +4 -5
- package/node_modules/hono/dist/client/client.js +4 -4
- package/node_modules/hono/dist/hono-base.js +7 -6
- package/node_modules/hono/dist/jsx/base.js +15 -1
- package/node_modules/hono/dist/jsx/components.js +26 -27
- package/node_modules/hono/dist/jsx/context.js +6 -6
- package/node_modules/hono/dist/jsx/dom/server.js +5 -1
- package/node_modules/hono/dist/jsx/intrinsic-element/components.js +3 -3
- package/node_modules/hono/dist/jsx/streaming.js +5 -6
- package/node_modules/hono/dist/types/context.d.ts +2 -2
- package/node_modules/hono/dist/types/jsx/base.d.ts +3 -0
- package/node_modules/hono/package.json +2 -2
- package/node_modules/jose/dist/types/index.d.ts +1 -2
- package/node_modules/jose/dist/types/jwe/compact/decrypt.d.ts +7 -11
- package/node_modules/jose/dist/types/jwe/compact/encrypt.d.ts +13 -16
- package/node_modules/jose/dist/types/jwe/flattened/decrypt.d.ts +7 -11
- package/node_modules/jose/dist/types/jwe/flattened/encrypt.d.ts +16 -19
- package/node_modules/jose/dist/types/jwe/general/decrypt.d.ts +10 -16
- package/node_modules/jose/dist/types/jwe/general/encrypt.d.ts +18 -21
- package/node_modules/jose/dist/types/jwk/embedded.d.ts +3 -1
- package/node_modules/jose/dist/types/jwk/thumbprint.d.ts +4 -6
- package/node_modules/jose/dist/types/jwks/local.d.ts +5 -4
- package/node_modules/jose/dist/types/jwks/remote.d.ts +20 -21
- package/node_modules/jose/dist/types/jws/compact/sign.d.ts +4 -4
- package/node_modules/jose/dist/types/jws/compact/verify.d.ts +8 -11
- package/node_modules/jose/dist/types/jws/flattened/sign.d.ts +5 -5
- package/node_modules/jose/dist/types/jws/flattened/verify.d.ts +8 -11
- package/node_modules/jose/dist/types/jws/general/sign.d.ts +10 -14
- package/node_modules/jose/dist/types/jws/general/verify.d.ts +11 -17
- package/node_modules/jose/dist/types/jwt/decrypt.d.ts +14 -11
- package/node_modules/jose/dist/types/jwt/encrypt.d.ts +24 -22
- package/node_modules/jose/dist/types/jwt/sign.d.ts +3 -7
- package/node_modules/jose/dist/types/jwt/unsecured.d.ts +2 -6
- package/node_modules/jose/dist/types/jwt/verify.d.ts +13 -6
- package/node_modules/jose/dist/types/key/export.d.ts +6 -6
- package/node_modules/jose/dist/types/key/generate_key_pair.d.ts +9 -14
- package/node_modules/jose/dist/types/key/generate_secret.d.ts +10 -10
- package/node_modules/jose/dist/types/key/import.d.ts +19 -18
- package/node_modules/jose/dist/types/types.d.ts +152 -247
- package/node_modules/jose/dist/types/util/base64url.d.ts +7 -7
- package/node_modules/jose/dist/types/util/decode_jwt.d.ts +6 -1
- package/node_modules/jose/dist/types/util/decode_protected_header.d.ts +4 -3
- package/node_modules/jose/dist/types/util/errors.d.ts +29 -40
- package/node_modules/jose/dist/webapi/jwe/compact/decrypt.js +1 -2
- package/node_modules/jose/dist/webapi/jwe/compact/encrypt.js +9 -26
- package/node_modules/jose/dist/webapi/jwe/flattened/decrypt.js +3 -3
- package/node_modules/jose/dist/webapi/jwe/flattened/encrypt.js +11 -30
- package/node_modules/jose/dist/webapi/jwe/general/decrypt.js +6 -6
- package/node_modules/jose/dist/webapi/jwe/general/encrypt.js +33 -57
- package/node_modules/jose/dist/webapi/jwk/embedded.js +3 -4
- package/node_modules/jose/dist/webapi/jwk/thumbprint.js +3 -6
- package/node_modules/jose/dist/webapi/jwks/local.js +16 -10
- package/node_modules/jose/dist/webapi/jwks/remote.js +2 -2
- package/node_modules/jose/dist/webapi/jws/compact/sign.js +2 -4
- package/node_modules/jose/dist/webapi/jws/compact/verify.js +2 -2
- package/node_modules/jose/dist/webapi/jws/flattened/sign.js +8 -15
- package/node_modules/jose/dist/webapi/jws/flattened/verify.js +4 -14
- package/node_modules/jose/dist/webapi/jws/general/sign.js +4 -11
- package/node_modules/jose/dist/webapi/jws/general/verify.js +5 -7
- package/node_modules/jose/dist/webapi/jwt/decrypt.js +2 -3
- package/node_modules/jose/dist/webapi/jwt/encrypt.js +11 -25
- package/node_modules/jose/dist/webapi/jwt/sign.js +1 -1
- package/node_modules/jose/dist/webapi/jwt/unsecured.js +1 -2
- package/node_modules/jose/dist/webapi/jwt/verify.js +4 -4
- package/node_modules/jose/dist/webapi/key/export.js +12 -16
- package/node_modules/jose/dist/webapi/key/generate_key_pair.js +4 -13
- package/node_modules/jose/dist/webapi/key/generate_secret.js +1 -1
- package/node_modules/jose/dist/webapi/key/import.js +5 -9
- package/node_modules/jose/dist/webapi/lib/asn1.js +2 -4
- package/node_modules/jose/dist/webapi/lib/buffer_utils.js +35 -0
- package/node_modules/jose/dist/webapi/lib/content_encryption.js +21 -29
- package/node_modules/jose/dist/webapi/lib/deflate.js +9 -19
- package/node_modules/jose/dist/webapi/lib/jwe_algorithms.js +0 -4
- package/node_modules/jose/dist/webapi/lib/jwe_decrypt.js +21 -54
- package/node_modules/jose/dist/webapi/lib/jwe_encrypt.js +26 -59
- package/node_modules/jose/dist/webapi/lib/jws_sign.js +29 -43
- package/node_modules/jose/dist/webapi/lib/jws_verify.js +37 -45
- package/node_modules/jose/dist/webapi/lib/jwt_claims_set.js +1 -1
- package/node_modules/jose/dist/webapi/lib/key.js +119 -59
- package/node_modules/jose/dist/webapi/lib/key_management.js +45 -80
- package/node_modules/jose/dist/webapi/lib/{options.js → validate.js} +64 -3
- package/node_modules/jose/dist/webapi/util/base64url.js +5 -19
- package/node_modules/jose/dist/webapi/util/decode_jwt.js +1 -1
- package/node_modules/jose/dist/webapi/util/decode_protected_header.js +1 -1
- package/node_modules/jose/package.json +1 -1
- package/node_modules/undici/lib/dispatcher/balanced-pool.js +4 -2
- package/node_modules/undici/lib/dispatcher/client-h1.js +12 -4
- package/node_modules/undici/lib/dispatcher/client-h2.js +70 -14
- package/node_modules/undici/lib/dispatcher/client.js +6 -2
- package/node_modules/undici/lib/handler/cache-handler.js +21 -5
- package/node_modules/undici/lib/handler/retry-handler.js +42 -7
- package/node_modules/undici/lib/interceptor/cache.js +20 -1
- package/node_modules/undici/lib/interceptor/decompress.js +146 -14
- package/node_modules/undici/lib/interceptor/dump.js +10 -23
- package/node_modules/undici/lib/web/eventsource/eventsource-stream.js +245 -150
- package/node_modules/undici/lib/web/websocket/connection.js +1 -1
- package/node_modules/undici/lib/web/websocket/permessage-deflate.js +5 -0
- package/node_modules/undici/lib/web/websocket/stream/websocketstream.js +8 -10
- package/node_modules/undici/package.json +1 -1
- package/node_modules/undici/types/interceptors.d.ts +2 -0
- package/node_modules/undici-types/client.d.ts +8 -3
- package/node_modules/undici-types/connector.d.ts +1 -0
- package/node_modules/undici-types/cookies.d.ts +1 -1
- package/node_modules/undici-types/dispatcher.d.ts +3 -3
- package/node_modules/undici-types/errors.d.ts +10 -0
- package/node_modules/undici-types/fetch.d.ts +5 -1
- package/node_modules/undici-types/handlers.d.ts +2 -0
- package/node_modules/undici-types/interceptors.d.ts +1 -1
- package/node_modules/undici-types/mock-interceptor.d.ts +5 -1
- package/node_modules/undici-types/package.json +1 -1
- package/node_modules/undici-types/proxy-agent.d.ts +7 -0
- package/node_modules/zod/README.md +2 -2
- package/node_modules/zod/compile.cjs +19 -0
- package/node_modules/zod/index.cjs +19 -0
- package/node_modules/zod/locales/index.cjs +19 -0
- package/node_modules/zod/mini/index.cjs +19 -0
- package/node_modules/zod/package.json +8 -7
- package/node_modules/zod/src/v3/helpers/errorUtil.ts +1 -1
- package/node_modules/zod/src/v4/classic/external.ts +2 -0
- package/node_modules/zod/src/v4/classic/from-json-schema.ts +248 -25
- package/node_modules/zod/src/v4/classic/schemas.ts +243 -168
- package/node_modules/zod/src/v4/classic/tests/assignability.test.ts +60 -9
- package/node_modules/zod/src/v4/classic/tests/bigint.test.ts +6 -0
- package/node_modules/zod/src/v4/classic/tests/continuability.test.ts +2 -2
- package/node_modules/zod/src/v4/classic/tests/cyclic-data.test.ts +265 -0
- package/node_modules/zod/src/v4/classic/tests/discriminated-unions.test.ts +112 -6
- package/node_modules/zod/src/v4/classic/tests/enum.test.ts +9 -0
- package/node_modules/zod/src/v4/classic/tests/error.test.ts +130 -1
- package/node_modules/zod/src/v4/classic/tests/from-json-schema.test.ts +157 -0
- package/node_modules/zod/src/v4/classic/tests/iban.test.ts +81 -0
- package/node_modules/zod/src/v4/classic/tests/instance-footprint.test.ts +40 -2
- package/node_modules/zod/src/v4/classic/tests/instanceof.test.ts +27 -7
- package/node_modules/zod/src/v4/classic/tests/issue-schema.test.ts +88 -56
- package/node_modules/zod/src/v4/classic/tests/number.test.ts +39 -0
- package/node_modules/zod/src/v4/classic/tests/object.test.ts +56 -0
- package/node_modules/zod/src/v4/classic/tests/optin-ladder.test.ts +3 -2
- package/node_modules/zod/src/v4/classic/tests/prefault.test.ts +70 -0
- package/node_modules/zod/src/v4/classic/tests/properties.test.ts +141 -0
- package/node_modules/zod/src/v4/classic/tests/recursive-types.test.ts +46 -1
- package/node_modules/zod/src/v4/classic/tests/standard-schema.test.ts +19 -0
- package/node_modules/zod/src/v4/classic/tests/string.test.ts +95 -1
- package/node_modules/zod/src/v4/classic/tests/template-literal.test.ts +33 -1
- package/node_modules/zod/src/v4/classic/tests/to-json-schema.test.ts +234 -38
- package/node_modules/zod/src/v4/classic/tests/validate.test.ts +569 -0
- package/node_modules/zod/src/v4/core/api.ts +44 -28
- package/node_modules/zod/src/v4/core/checks.ts +62 -102
- package/node_modules/zod/src/v4/core/compile.ts +218 -93
- package/node_modules/zod/src/v4/core/core.ts +1 -3
- package/node_modules/zod/src/v4/core/doc.ts +6 -2
- package/node_modules/zod/src/v4/core/errors.ts +3 -6
- package/node_modules/zod/src/v4/core/json-schema-generator.ts +2 -2
- package/node_modules/zod/src/v4/core/json-schema-processors.ts +185 -81
- package/node_modules/zod/src/v4/core/memoizer.ts +75 -28
- package/node_modules/zod/src/v4/core/parse.ts +37 -16
- package/node_modules/zod/src/v4/core/regexes.ts +14 -4
- package/node_modules/zod/src/v4/core/schemas.ts +296 -132
- package/node_modules/zod/src/v4/core/tests/cached.test.ts +54 -0
- package/node_modules/zod/src/v4/core/tests/compile-differential.test.ts +35 -0
- package/node_modules/zod/src/v4/core/tests/compile-generative.test.ts +445 -0
- package/node_modules/zod/src/v4/core/tests/compile.test.ts +399 -2
- package/node_modules/zod/src/v4/core/tests/email-regex.test.ts +140 -0
- package/node_modules/zod/src/v4/core/tests/locales/tg.test.ts +85 -0
- package/node_modules/zod/src/v4/core/tests/polyfill-collision.test.ts +46 -0
- package/node_modules/zod/src/v4/core/tests/url-no-canparse.test.ts +118 -16
- package/node_modules/zod/src/v4/core/to-json-schema.ts +9 -7
- package/node_modules/zod/src/v4/core/util.ts +218 -147
- package/node_modules/zod/src/v4/core/versions.ts +2 -2
- package/node_modules/zod/src/v4/locales/ar.ts +2 -0
- package/node_modules/zod/src/v4/locales/az.ts +2 -0
- package/node_modules/zod/src/v4/locales/be.ts +2 -0
- package/node_modules/zod/src/v4/locales/bg.ts +2 -0
- package/node_modules/zod/src/v4/locales/bn.ts +2 -0
- package/node_modules/zod/src/v4/locales/ca.ts +2 -0
- package/node_modules/zod/src/v4/locales/ckb.ts +2 -0
- package/node_modules/zod/src/v4/locales/cs.ts +2 -0
- package/node_modules/zod/src/v4/locales/da.ts +2 -0
- package/node_modules/zod/src/v4/locales/de.ts +2 -0
- package/node_modules/zod/src/v4/locales/el.ts +2 -0
- package/node_modules/zod/src/v4/locales/en.ts +2 -0
- package/node_modules/zod/src/v4/locales/eo.ts +2 -0
- package/node_modules/zod/src/v4/locales/es.ts +2 -0
- package/node_modules/zod/src/v4/locales/fa.ts +2 -0
- package/node_modules/zod/src/v4/locales/fi.ts +2 -0
- package/node_modules/zod/src/v4/locales/fr-CA.ts +2 -0
- package/node_modules/zod/src/v4/locales/fr.ts +2 -0
- package/node_modules/zod/src/v4/locales/gu.ts +2 -0
- package/node_modules/zod/src/v4/locales/he.ts +2 -0
- package/node_modules/zod/src/v4/locales/hi.ts +2 -0
- package/node_modules/zod/src/v4/locales/hr.ts +2 -0
- package/node_modules/zod/src/v4/locales/hu.ts +2 -0
- package/node_modules/zod/src/v4/locales/hy.ts +2 -0
- package/node_modules/zod/src/v4/locales/id.ts +2 -0
- package/node_modules/zod/src/v4/locales/index.ts +1 -0
- package/node_modules/zod/src/v4/locales/is.ts +2 -0
- package/node_modules/zod/src/v4/locales/it.ts +2 -0
- package/node_modules/zod/src/v4/locales/ja.ts +2 -0
- package/node_modules/zod/src/v4/locales/ka.ts +2 -0
- package/node_modules/zod/src/v4/locales/km.ts +2 -0
- package/node_modules/zod/src/v4/locales/kn.ts +2 -0
- package/node_modules/zod/src/v4/locales/ko.ts +2 -0
- package/node_modules/zod/src/v4/locales/lt.ts +2 -0
- package/node_modules/zod/src/v4/locales/mk.ts +2 -0
- package/node_modules/zod/src/v4/locales/ms.ts +2 -0
- package/node_modules/zod/src/v4/locales/ne.ts +2 -0
- package/node_modules/zod/src/v4/locales/nl.ts +2 -0
- package/node_modules/zod/src/v4/locales/nn.ts +2 -0
- package/node_modules/zod/src/v4/locales/no.ts +2 -0
- package/node_modules/zod/src/v4/locales/ota.ts +2 -0
- package/node_modules/zod/src/v4/locales/pl.ts +2 -0
- package/node_modules/zod/src/v4/locales/ps.ts +2 -0
- package/node_modules/zod/src/v4/locales/pt-BR.ts +2 -0
- package/node_modules/zod/src/v4/locales/pt.ts +2 -0
- package/node_modules/zod/src/v4/locales/ro.ts +2 -0
- package/node_modules/zod/src/v4/locales/ru.ts +2 -0
- package/node_modules/zod/src/v4/locales/sk.ts +2 -0
- package/node_modules/zod/src/v4/locales/sl.ts +2 -0
- package/node_modules/zod/src/v4/locales/sv.ts +2 -0
- package/node_modules/zod/src/v4/locales/ta.ts +2 -0
- package/node_modules/zod/src/v4/locales/tg.ts +135 -0
- package/node_modules/zod/src/v4/locales/th.ts +2 -0
- package/node_modules/zod/src/v4/locales/tk.ts +2 -0
- package/node_modules/zod/src/v4/locales/tr.ts +2 -0
- package/node_modules/zod/src/v4/locales/uk.ts +2 -0
- package/node_modules/zod/src/v4/locales/ur.ts +2 -0
- package/node_modules/zod/src/v4/locales/uz.ts +2 -0
- package/node_modules/zod/src/v4/locales/vi.ts +2 -0
- package/node_modules/zod/src/v4/locales/yo.ts +2 -0
- package/node_modules/zod/src/v4/locales/zh-CN.ts +2 -0
- package/node_modules/zod/src/v4/locales/zh-TW.ts +2 -0
- package/node_modules/zod/src/v4/mini/external.ts +2 -0
- package/node_modules/zod/src/v4/mini/schemas.ts +32 -7
- package/node_modules/zod/src/v4/mini/tests/checks.test.ts +1 -1
- package/node_modules/zod/src/v4/mini/tests/computed.test.ts +11 -17
- package/node_modules/zod/src/v4/mini/tests/index.test.ts +86 -0
- package/node_modules/zod/src/v4/mini/tests/recursive-types.test.ts +16 -0
- package/node_modules/zod/src/v4/mini/tests/string.test.ts +23 -0
- package/node_modules/zod/v3/ZodError.cjs +19 -0
- package/node_modules/zod/v3/errors.cjs +19 -0
- package/node_modules/zod/v3/external.cjs +19 -0
- package/node_modules/zod/v3/helpers/enumUtil.cjs +19 -0
- package/node_modules/zod/v3/helpers/errorUtil.cjs +20 -1
- package/node_modules/zod/v3/helpers/errorUtil.js +1 -1
- package/node_modules/zod/v3/helpers/parseUtil.cjs +19 -0
- package/node_modules/zod/v3/helpers/partialUtil.cjs +19 -0
- package/node_modules/zod/v3/helpers/typeAliases.cjs +19 -0
- package/node_modules/zod/v3/helpers/util.cjs +19 -0
- package/node_modules/zod/v3/index.cjs +19 -0
- package/node_modules/zod/v3/standard-schema.cjs +19 -0
- package/node_modules/zod/v3/types.cjs +19 -0
- package/node_modules/zod/v4/classic/checks.cjs +19 -0
- package/node_modules/zod/v4/classic/coerce.cjs +19 -0
- package/node_modules/zod/v4/classic/compat.cjs +19 -0
- package/node_modules/zod/v4/classic/deep-partial.cjs +19 -0
- package/node_modules/zod/v4/classic/errors.cjs +19 -0
- package/node_modules/zod/v4/classic/external.cjs +22 -1
- package/node_modules/zod/v4/classic/external.d.cts +1 -1
- package/node_modules/zod/v4/classic/external.d.ts +1 -1
- package/node_modules/zod/v4/classic/external.js +1 -1
- package/node_modules/zod/v4/classic/from-json-schema.cjs +264 -24
- package/node_modules/zod/v4/classic/from-json-schema.js +245 -24
- package/node_modules/zod/v4/classic/in-out.cjs +19 -0
- package/node_modules/zod/v4/classic/index.cjs +19 -0
- package/node_modules/zod/v4/classic/iso.cjs +19 -0
- package/node_modules/zod/v4/classic/parse.cjs +19 -0
- package/node_modules/zod/v4/classic/schemas.cjs +100 -35
- package/node_modules/zod/v4/classic/schemas.d.cts +15 -1
- package/node_modules/zod/v4/classic/schemas.d.ts +15 -1
- package/node_modules/zod/v4/classic/schemas.js +77 -33
- package/node_modules/zod/v4/core/api.cjs +45 -22
- package/node_modules/zod/v4/core/api.d.cts +12 -6
- package/node_modules/zod/v4/core/api.d.ts +12 -6
- package/node_modules/zod/v4/core/api.js +25 -22
- package/node_modules/zod/v4/core/checks.cjs +51 -97
- package/node_modules/zod/v4/core/checks.d.cts +17 -1
- package/node_modules/zod/v4/core/checks.d.ts +17 -1
- package/node_modules/zod/v4/core/checks.js +31 -96
- package/node_modules/zod/v4/core/compile.cjs +173 -78
- package/node_modules/zod/v4/core/compile.d.cts +18 -4
- package/node_modules/zod/v4/core/compile.d.ts +18 -4
- package/node_modules/zod/v4/core/compile.js +154 -79
- package/node_modules/zod/v4/core/core.cjs +20 -1
- package/node_modules/zod/v4/core/core.js +1 -1
- package/node_modules/zod/v4/core/doc.cjs +26 -2
- package/node_modules/zod/v4/core/doc.js +7 -2
- package/node_modules/zod/v4/core/errors.cjs +21 -5
- package/node_modules/zod/v4/core/errors.js +2 -5
- package/node_modules/zod/v4/core/index.cjs +19 -0
- package/node_modules/zod/v4/core/json-schema-generator.cjs +20 -1
- package/node_modules/zod/v4/core/json-schema-generator.js +2 -2
- package/node_modules/zod/v4/core/json-schema-processors.cjs +188 -72
- package/node_modules/zod/v4/core/json-schema-processors.d.cts +16 -0
- package/node_modules/zod/v4/core/json-schema-processors.d.ts +16 -0
- package/node_modules/zod/v4/core/json-schema-processors.js +170 -74
- package/node_modules/zod/v4/core/json-schema.cjs +19 -0
- package/node_modules/zod/v4/core/memoizer.cjs +111 -23
- package/node_modules/zod/v4/core/memoizer.js +69 -23
- package/node_modules/zod/v4/core/parse.cjs +56 -16
- package/node_modules/zod/v4/core/parse.js +37 -16
- package/node_modules/zod/v4/core/regexes.cjs +31 -6
- package/node_modules/zod/v4/core/regexes.d.cts +3 -0
- package/node_modules/zod/v4/core/regexes.d.ts +3 -0
- package/node_modules/zod/v4/core/regexes.js +10 -4
- package/node_modules/zod/v4/core/registries.cjs +19 -0
- package/node_modules/zod/v4/core/schemas.cjs +302 -114
- package/node_modules/zod/v4/core/schemas.d.cts +28 -8
- package/node_modules/zod/v4/core/schemas.d.ts +28 -8
- package/node_modules/zod/v4/core/schemas.js +279 -113
- package/node_modules/zod/v4/core/standard-schema.cjs +19 -0
- package/node_modules/zod/v4/core/to-json-schema.cjs +28 -7
- package/node_modules/zod/v4/core/to-json-schema.d.cts +4 -3
- package/node_modules/zod/v4/core/to-json-schema.d.ts +4 -3
- package/node_modules/zod/v4/core/to-json-schema.js +7 -6
- package/node_modules/zod/v4/core/util.cjs +177 -143
- package/node_modules/zod/v4/core/util.d.cts +25 -4
- package/node_modules/zod/v4/core/util.d.ts +25 -4
- package/node_modules/zod/v4/core/util.js +156 -143
- package/node_modules/zod/v4/core/versions.cjs +21 -2
- package/node_modules/zod/v4/core/versions.d.cts +1 -1
- package/node_modules/zod/v4/core/versions.d.ts +1 -1
- package/node_modules/zod/v4/core/versions.js +2 -2
- package/node_modules/zod/v4/core/visit.cjs +19 -0
- package/node_modules/zod/v4/index.cjs +19 -0
- package/node_modules/zod/v4/locales/ar.cjs +2 -0
- package/node_modules/zod/v4/locales/ar.js +2 -0
- package/node_modules/zod/v4/locales/az.cjs +2 -0
- package/node_modules/zod/v4/locales/az.js +2 -0
- package/node_modules/zod/v4/locales/be.cjs +2 -0
- package/node_modules/zod/v4/locales/be.js +2 -0
- package/node_modules/zod/v4/locales/bg.cjs +2 -0
- package/node_modules/zod/v4/locales/bg.js +2 -0
- package/node_modules/zod/v4/locales/bn.cjs +2 -0
- package/node_modules/zod/v4/locales/bn.js +2 -0
- package/node_modules/zod/v4/locales/ca.cjs +2 -0
- package/node_modules/zod/v4/locales/ca.js +2 -0
- package/node_modules/zod/v4/locales/ckb.cjs +2 -0
- package/node_modules/zod/v4/locales/ckb.js +2 -0
- package/node_modules/zod/v4/locales/cs.cjs +2 -0
- package/node_modules/zod/v4/locales/cs.js +2 -0
- package/node_modules/zod/v4/locales/da.cjs +2 -0
- package/node_modules/zod/v4/locales/da.js +2 -0
- package/node_modules/zod/v4/locales/de.cjs +2 -0
- package/node_modules/zod/v4/locales/de.js +2 -0
- package/node_modules/zod/v4/locales/el.cjs +2 -0
- package/node_modules/zod/v4/locales/el.js +2 -0
- package/node_modules/zod/v4/locales/en.cjs +2 -0
- package/node_modules/zod/v4/locales/en.js +2 -0
- package/node_modules/zod/v4/locales/eo.cjs +2 -0
- package/node_modules/zod/v4/locales/eo.js +2 -0
- package/node_modules/zod/v4/locales/es.cjs +2 -0
- package/node_modules/zod/v4/locales/es.js +2 -0
- package/node_modules/zod/v4/locales/fa.cjs +2 -0
- package/node_modules/zod/v4/locales/fa.js +2 -0
- package/node_modules/zod/v4/locales/fi.cjs +2 -0
- package/node_modules/zod/v4/locales/fi.js +2 -0
- package/node_modules/zod/v4/locales/fr-CA.cjs +2 -0
- package/node_modules/zod/v4/locales/fr-CA.js +2 -0
- package/node_modules/zod/v4/locales/fr.cjs +2 -0
- package/node_modules/zod/v4/locales/fr.js +2 -0
- package/node_modules/zod/v4/locales/gu.cjs +2 -0
- package/node_modules/zod/v4/locales/gu.js +2 -0
- package/node_modules/zod/v4/locales/he.cjs +2 -0
- package/node_modules/zod/v4/locales/he.js +2 -0
- package/node_modules/zod/v4/locales/hi.cjs +2 -0
- package/node_modules/zod/v4/locales/hi.js +2 -0
- package/node_modules/zod/v4/locales/hr.cjs +2 -0
- package/node_modules/zod/v4/locales/hr.js +2 -0
- package/node_modules/zod/v4/locales/hu.cjs +2 -0
- package/node_modules/zod/v4/locales/hu.js +2 -0
- package/node_modules/zod/v4/locales/hy.cjs +2 -0
- package/node_modules/zod/v4/locales/hy.js +2 -0
- package/node_modules/zod/v4/locales/id.cjs +2 -0
- package/node_modules/zod/v4/locales/id.js +2 -0
- package/node_modules/zod/v4/locales/index.cjs +22 -1
- package/node_modules/zod/v4/locales/index.d.cts +1 -0
- package/node_modules/zod/v4/locales/index.d.ts +1 -0
- package/node_modules/zod/v4/locales/index.js +1 -0
- package/node_modules/zod/v4/locales/is.cjs +2 -0
- package/node_modules/zod/v4/locales/is.js +2 -0
- package/node_modules/zod/v4/locales/it.cjs +2 -0
- package/node_modules/zod/v4/locales/it.js +2 -0
- package/node_modules/zod/v4/locales/ja.cjs +2 -0
- package/node_modules/zod/v4/locales/ja.js +2 -0
- package/node_modules/zod/v4/locales/ka.cjs +2 -0
- package/node_modules/zod/v4/locales/ka.js +2 -0
- package/node_modules/zod/v4/locales/km.cjs +2 -0
- package/node_modules/zod/v4/locales/km.js +2 -0
- package/node_modules/zod/v4/locales/kn.cjs +2 -0
- package/node_modules/zod/v4/locales/kn.js +2 -0
- package/node_modules/zod/v4/locales/ko.cjs +2 -0
- package/node_modules/zod/v4/locales/ko.js +2 -0
- package/node_modules/zod/v4/locales/lt.cjs +2 -0
- package/node_modules/zod/v4/locales/lt.js +2 -0
- package/node_modules/zod/v4/locales/mk.cjs +2 -0
- package/node_modules/zod/v4/locales/mk.js +2 -0
- package/node_modules/zod/v4/locales/ms.cjs +2 -0
- package/node_modules/zod/v4/locales/ms.js +2 -0
- package/node_modules/zod/v4/locales/ne.cjs +2 -0
- package/node_modules/zod/v4/locales/ne.js +2 -0
- package/node_modules/zod/v4/locales/nl.cjs +2 -0
- package/node_modules/zod/v4/locales/nl.js +2 -0
- package/node_modules/zod/v4/locales/nn.cjs +2 -0
- package/node_modules/zod/v4/locales/nn.js +2 -0
- package/node_modules/zod/v4/locales/no.cjs +2 -0
- package/node_modules/zod/v4/locales/no.js +2 -0
- package/node_modules/zod/v4/locales/ota.cjs +2 -0
- package/node_modules/zod/v4/locales/ota.js +2 -0
- package/node_modules/zod/v4/locales/pl.cjs +2 -0
- package/node_modules/zod/v4/locales/pl.js +2 -0
- package/node_modules/zod/v4/locales/ps.cjs +2 -0
- package/node_modules/zod/v4/locales/ps.js +2 -0
- package/node_modules/zod/v4/locales/pt-BR.cjs +2 -0
- package/node_modules/zod/v4/locales/pt-BR.js +2 -0
- package/node_modules/zod/v4/locales/pt.cjs +2 -0
- package/node_modules/zod/v4/locales/pt.js +2 -0
- package/node_modules/zod/v4/locales/ro.cjs +2 -0
- package/node_modules/zod/v4/locales/ro.js +2 -0
- package/node_modules/zod/v4/locales/ru.cjs +2 -0
- package/node_modules/zod/v4/locales/ru.js +2 -0
- package/node_modules/zod/v4/locales/sk.cjs +2 -0
- package/node_modules/zod/v4/locales/sk.js +2 -0
- package/node_modules/zod/v4/locales/sl.cjs +2 -0
- package/node_modules/zod/v4/locales/sl.js +2 -0
- package/node_modules/zod/v4/locales/sv.cjs +2 -0
- package/node_modules/zod/v4/locales/sv.js +2 -0
- package/node_modules/zod/v4/locales/ta.cjs +2 -0
- package/node_modules/zod/v4/locales/ta.js +2 -0
- package/node_modules/zod/v4/locales/tg.cjs +144 -0
- package/node_modules/zod/v4/locales/tg.d.cts +5 -0
- package/node_modules/zod/v4/locales/tg.d.ts +4 -0
- package/node_modules/zod/v4/locales/tg.js +117 -0
- package/node_modules/zod/v4/locales/th.cjs +2 -0
- package/node_modules/zod/v4/locales/th.js +2 -0
- package/node_modules/zod/v4/locales/tk.cjs +2 -0
- package/node_modules/zod/v4/locales/tk.js +2 -0
- package/node_modules/zod/v4/locales/tr.cjs +2 -0
- package/node_modules/zod/v4/locales/tr.js +2 -0
- package/node_modules/zod/v4/locales/uk.cjs +2 -0
- package/node_modules/zod/v4/locales/uk.js +2 -0
- package/node_modules/zod/v4/locales/ur.cjs +2 -0
- package/node_modules/zod/v4/locales/ur.js +2 -0
- package/node_modules/zod/v4/locales/uz.cjs +2 -0
- package/node_modules/zod/v4/locales/uz.js +2 -0
- package/node_modules/zod/v4/locales/vi.cjs +2 -0
- package/node_modules/zod/v4/locales/vi.js +2 -0
- package/node_modules/zod/v4/locales/yo.cjs +2 -0
- package/node_modules/zod/v4/locales/yo.js +2 -0
- package/node_modules/zod/v4/locales/zh-CN.cjs +2 -0
- package/node_modules/zod/v4/locales/zh-CN.js +2 -0
- package/node_modules/zod/v4/locales/zh-TW.cjs +2 -0
- package/node_modules/zod/v4/locales/zh-TW.js +2 -0
- package/node_modules/zod/v4/mini/checks.cjs +19 -0
- package/node_modules/zod/v4/mini/coerce.cjs +19 -0
- package/node_modules/zod/v4/mini/deep-partial.cjs +19 -0
- package/node_modules/zod/v4/mini/external.cjs +22 -1
- package/node_modules/zod/v4/mini/external.d.cts +1 -1
- package/node_modules/zod/v4/mini/external.d.ts +1 -1
- package/node_modules/zod/v4/mini/external.js +1 -1
- package/node_modules/zod/v4/mini/in-out.cjs +19 -0
- package/node_modules/zod/v4/mini/index.cjs +19 -0
- package/node_modules/zod/v4/mini/iso.cjs +19 -0
- package/node_modules/zod/v4/mini/parse.cjs +19 -0
- package/node_modules/zod/v4/mini/schemas.cjs +44 -8
- package/node_modules/zod/v4/mini/schemas.d.cts +6 -1
- package/node_modules/zod/v4/mini/schemas.d.ts +6 -1
- package/node_modules/zod/v4/mini/schemas.js +21 -6
- package/node_modules/zod/v4-mini/index.cjs +19 -0
- package/package.json +2 -2
- package/slingshot/index.js +201 -198
- package/node_modules/jose/dist/webapi/lib/base64.js +0 -20
- package/node_modules/jose/dist/webapi/lib/crypto_key.js +0 -27
- package/node_modules/jose/dist/webapi/lib/helpers.js +0 -45
- package/node_modules/jose/dist/webapi/lib/invalid_key_input.js +0 -12
- package/node_modules/jose/dist/webapi/lib/is_key_like.js +0 -19
- package/node_modules/jose/dist/webapi/lib/jwk_metadata.js +0 -19
- package/node_modules/jose/dist/webapi/lib/jwk_to_key.js +0 -10
- package/node_modules/jose/dist/webapi/lib/key_options.js +0 -8
- package/node_modules/jose/dist/webapi/lib/signing.js +0 -22
- package/node_modules/jose/dist/webapi/lib/type_checks.js +0 -30
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
const assert = require('node:assert')
|
|
3
3
|
|
|
4
4
|
const { kRetryHandlerDefaultRetry } = require('../core/symbols')
|
|
5
|
-
const { RequestRetryError } = require('../core/errors')
|
|
5
|
+
const { RequestRetryError, RequestAbortedError } = require('../core/errors')
|
|
6
6
|
const {
|
|
7
7
|
isDisturbed,
|
|
8
8
|
parseRangeHeader,
|
|
@@ -41,19 +41,42 @@ function validatePartialResponseContentLength (headers, range, statusCode, retry
|
|
|
41
41
|
// new one: backpressure pauses the new connection's controller, but the
|
|
42
42
|
// consumer's resume() targets the old one, so the resumed body stalls forever.
|
|
43
43
|
// The proxy always forwards to the controller of the currently active connection.
|
|
44
|
+
// An abort is additionally reported to the handler so it can cancel a pending
|
|
45
|
+
// retry backoff instead of letting the request hang until the backoff elapses.
|
|
46
|
+
// The notification is a private callback the handler hands over on construction,
|
|
47
|
+
// so nothing outside the handler can trigger it.
|
|
44
48
|
class RetryController {
|
|
45
|
-
|
|
49
|
+
#onAbort
|
|
50
|
+
|
|
51
|
+
constructor (onAbort) {
|
|
52
|
+
this.#onAbort = onAbort
|
|
46
53
|
this.target = null
|
|
47
54
|
}
|
|
48
55
|
|
|
49
56
|
pause () { this.target?.pause() }
|
|
50
57
|
resume () { this.target?.resume() }
|
|
51
|
-
|
|
58
|
+
|
|
59
|
+
abort (reason) {
|
|
60
|
+
this.target?.abort(reason)
|
|
61
|
+
this.#onAbort(reason)
|
|
62
|
+
}
|
|
63
|
+
|
|
52
64
|
get paused () { return this.target?.paused ?? false }
|
|
53
65
|
get aborted () { return this.target?.aborted ?? false }
|
|
54
66
|
get reason () { return this.target?.reason ?? null }
|
|
55
67
|
get rawHeaders () { return this.target?.rawHeaders ?? null }
|
|
68
|
+
set rawHeaders (value) {
|
|
69
|
+
if (this.target) {
|
|
70
|
+
this.target.rawHeaders = value
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
56
74
|
get rawTrailers () { return this.target?.rawTrailers ?? null }
|
|
75
|
+
set rawTrailers (value) {
|
|
76
|
+
if (this.target) {
|
|
77
|
+
this.target.rawTrailers = value
|
|
78
|
+
}
|
|
79
|
+
}
|
|
57
80
|
}
|
|
58
81
|
|
|
59
82
|
class RetryHandler {
|
|
@@ -112,15 +135,32 @@ class RetryHandler {
|
|
|
112
135
|
this.etag = null
|
|
113
136
|
this.statusCode = null
|
|
114
137
|
this.headers = null
|
|
115
|
-
this.controllerProxy = new RetryController()
|
|
138
|
+
this.controllerProxy = new RetryController(reason => this.#onAbort(reason))
|
|
139
|
+
// A retry decision is in flight (the policy may be holding a backoff
|
|
140
|
+
// timer). While pending, a consumer abort cancels the wait.
|
|
141
|
+
this.retryPending = false
|
|
142
|
+
// Backoff timer returned by the retry policy, so #onAbort can cancel it.
|
|
143
|
+
// Null for custom policies that do not return their timer.
|
|
144
|
+
this.retryTimer = null
|
|
145
|
+
// Set once an abort during the backoff delivered the terminal error
|
|
146
|
+
// downstream; late policy callbacks and connection errors are then moot.
|
|
147
|
+
this.aborted = false
|
|
116
148
|
}
|
|
117
149
|
|
|
118
150
|
onResponseStartWithRetry (controller, statusCode, headers, statusMessage, err) {
|
|
119
151
|
if (this.retryOpts.throwOnError) {
|
|
120
152
|
// Preserve old behavior for status codes that are not eligible for retry
|
|
121
153
|
if (this.retryOpts.statusCodes.includes(statusCode) === false) {
|
|
122
|
-
this.headersSent
|
|
123
|
-
|
|
154
|
+
if (this.headersSent) {
|
|
155
|
+
// The downstream handler already received the response from an
|
|
156
|
+
// earlier attempt. Forwarding this response would replace the
|
|
157
|
+
// downstream body and leave the original body pending forever.
|
|
158
|
+
this.handler.onResponseError?.(this.controllerProxy, err)
|
|
159
|
+
} else {
|
|
160
|
+
this.headersSent = true
|
|
161
|
+
this.checkpointResponseEnd(headers)
|
|
162
|
+
this.handler.onResponseStart?.(this.controllerProxy, statusCode, headers, statusMessage)
|
|
163
|
+
}
|
|
124
164
|
} else {
|
|
125
165
|
this.error = err
|
|
126
166
|
}
|
|
@@ -130,14 +170,30 @@ class RetryHandler {
|
|
|
130
170
|
|
|
131
171
|
if (isDisturbed(this.opts.body)) {
|
|
132
172
|
this.headersSent = true
|
|
173
|
+
this.checkpointResponseEnd(headers)
|
|
133
174
|
this.handler.onResponseStart?.(this.controllerProxy, statusCode, headers, statusMessage)
|
|
134
175
|
return
|
|
135
176
|
}
|
|
136
177
|
|
|
137
178
|
function shouldRetry (passedErr) {
|
|
179
|
+
if (this.aborted) {
|
|
180
|
+
// Aborted while the policy was deciding; the decision is moot.
|
|
181
|
+
return
|
|
182
|
+
}
|
|
183
|
+
this.retryPending = false
|
|
184
|
+
this.retryTimer = null
|
|
185
|
+
|
|
138
186
|
if (passedErr) {
|
|
139
|
-
this.headersSent
|
|
140
|
-
|
|
187
|
+
if (this.headersSent) {
|
|
188
|
+
// The downstream handler already received the response from an
|
|
189
|
+
// earlier attempt. Forwarding this response would replace the
|
|
190
|
+
// downstream body and leave the original body pending forever.
|
|
191
|
+
this.handler.onResponseError?.(this.controllerProxy, passedErr)
|
|
192
|
+
} else {
|
|
193
|
+
this.headersSent = true
|
|
194
|
+
this.checkpointResponseEnd(headers)
|
|
195
|
+
this.handler.onResponseStart?.(this.controllerProxy, statusCode, headers, statusMessage)
|
|
196
|
+
}
|
|
141
197
|
controller.resume()
|
|
142
198
|
return
|
|
143
199
|
}
|
|
@@ -154,14 +210,31 @@ class RetryHandler {
|
|
|
154
210
|
// between, leaving this one paused forever -- the very stall the proxy exists
|
|
155
211
|
// to prevent.
|
|
156
212
|
controller.pause()
|
|
157
|
-
|
|
213
|
+
// The default policy returns its backoff timer so an abort can cancel it;
|
|
214
|
+
// a custom policy may return anything (or nothing), which is ignored.
|
|
215
|
+
this.retryPending = true
|
|
216
|
+
this.retryTimer = this.retryOpts.retry(
|
|
158
217
|
err,
|
|
159
218
|
{
|
|
160
219
|
state: { counter: this.retryCount },
|
|
161
220
|
opts: { retryOptions: this.retryOpts, ...this.opts }
|
|
162
221
|
},
|
|
163
222
|
shouldRetry.bind(this)
|
|
164
|
-
)
|
|
223
|
+
) ?? null
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
checkpointResponseEnd (headers) {
|
|
227
|
+
if (this.end == null && this.opts.method !== 'HEAD') {
|
|
228
|
+
const contentLength = headers['content-length']
|
|
229
|
+
this.end = contentLength != null ? Number(contentLength) - 1 : null
|
|
230
|
+
|
|
231
|
+
assert(
|
|
232
|
+
this.end == null || Number.isFinite(this.end),
|
|
233
|
+
'invalid content-length'
|
|
234
|
+
)
|
|
235
|
+
|
|
236
|
+
this.resume = this.end != null
|
|
237
|
+
}
|
|
165
238
|
}
|
|
166
239
|
|
|
167
240
|
onRequestStart (controller, context) {
|
|
@@ -176,6 +249,14 @@ class RetryHandler {
|
|
|
176
249
|
}
|
|
177
250
|
}
|
|
178
251
|
|
|
252
|
+
onBodySent (chunk) {
|
|
253
|
+
this.handler.onBodySent?.(chunk)
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
onRequestSent () {
|
|
257
|
+
this.handler.onRequestSent?.()
|
|
258
|
+
}
|
|
259
|
+
|
|
179
260
|
onRequestUpgrade (_controller, statusCode, headers, socket) {
|
|
180
261
|
this.handler.onRequestUpgrade?.(this.controllerProxy, statusCode, headers, socket)
|
|
181
262
|
}
|
|
@@ -190,7 +271,8 @@ class RetryHandler {
|
|
|
190
271
|
timeoutFactor,
|
|
191
272
|
statusCodes,
|
|
192
273
|
errorCodes,
|
|
193
|
-
methods
|
|
274
|
+
methods,
|
|
275
|
+
retryAfter
|
|
194
276
|
} = retryOptions
|
|
195
277
|
const { counter } = state
|
|
196
278
|
|
|
@@ -222,7 +304,7 @@ class RetryHandler {
|
|
|
222
304
|
return
|
|
223
305
|
}
|
|
224
306
|
|
|
225
|
-
let retryAfterHeader = headers?.['retry-after']
|
|
307
|
+
let retryAfterHeader = retryAfter === false ? undefined : headers?.['retry-after']
|
|
226
308
|
if (retryAfterHeader) {
|
|
227
309
|
retryAfterHeader = Number(retryAfterHeader)
|
|
228
310
|
retryAfterHeader = Number.isNaN(retryAfterHeader)
|
|
@@ -237,27 +319,22 @@ class RetryHandler {
|
|
|
237
319
|
? Math.min(retryAfterHeader, maxTimeout)
|
|
238
320
|
: Math.min(minTimeout * timeoutFactor ** (counter - 1), maxTimeout)
|
|
239
321
|
|
|
240
|
-
|
|
322
|
+
// Return the backoff timer so the handler can cancel it when the
|
|
323
|
+
// consumer aborts while the retry decision is pending.
|
|
324
|
+
return setTimeout(() => cb(null), retryTimeout)
|
|
241
325
|
}
|
|
242
326
|
|
|
243
327
|
onResponseStart (controller, statusCode, headers, statusMessage) {
|
|
328
|
+
if (statusCode < 200) {
|
|
329
|
+
this.handler.onResponseStart?.(this.controllerProxy, statusCode, headers, statusMessage)
|
|
330
|
+
return
|
|
331
|
+
}
|
|
332
|
+
|
|
244
333
|
this.error = null
|
|
245
334
|
this.retryCount += 1
|
|
246
335
|
this.statusCode = statusCode
|
|
247
336
|
this.headers = headers
|
|
248
337
|
|
|
249
|
-
if (statusCode >= 300) {
|
|
250
|
-
const err = new RequestRetryError('Request failed', statusCode, {
|
|
251
|
-
headers,
|
|
252
|
-
data: {
|
|
253
|
-
count: this.retryCount
|
|
254
|
-
}
|
|
255
|
-
})
|
|
256
|
-
|
|
257
|
-
this.onResponseStartWithRetry(controller, statusCode, headers, statusMessage, err)
|
|
258
|
-
return
|
|
259
|
-
}
|
|
260
|
-
|
|
261
338
|
// Checkpoint for resume from where we left it
|
|
262
339
|
if (this.headersSent) {
|
|
263
340
|
// Only Partial Content 206 supposed to provide Content-Range,
|
|
@@ -294,18 +371,34 @@ class RetryHandler {
|
|
|
294
371
|
|
|
295
372
|
const { start, size, end = size ? size - 1 : null } = contentRange
|
|
296
373
|
|
|
297
|
-
|
|
298
|
-
|
|
374
|
+
if (this.start !== start || (this.end != null && this.end !== end)) {
|
|
375
|
+
throw new RequestRetryError('Content-Range mismatch', statusCode, {
|
|
376
|
+
headers,
|
|
377
|
+
data: { count: this.retryCount }
|
|
378
|
+
})
|
|
379
|
+
}
|
|
299
380
|
|
|
300
381
|
return
|
|
301
382
|
}
|
|
302
383
|
|
|
384
|
+
if (statusCode >= 300) {
|
|
385
|
+
const err = new RequestRetryError('Request failed', statusCode, {
|
|
386
|
+
headers,
|
|
387
|
+
data: {
|
|
388
|
+
count: this.retryCount
|
|
389
|
+
}
|
|
390
|
+
})
|
|
391
|
+
|
|
392
|
+
this.onResponseStartWithRetry(controller, statusCode, headers, statusMessage, err)
|
|
393
|
+
return
|
|
394
|
+
}
|
|
395
|
+
|
|
303
396
|
if (this.end == null) {
|
|
304
397
|
if (statusCode === 206) {
|
|
305
398
|
// First time we receive 206
|
|
306
399
|
const range = parseRangeHeader(headers['content-range'])
|
|
307
400
|
|
|
308
|
-
if (range == null) {
|
|
401
|
+
if (range == null || range.end == null) {
|
|
309
402
|
this.headersSent = true
|
|
310
403
|
this.handler.onResponseStart?.(
|
|
311
404
|
this.controllerProxy,
|
|
@@ -330,7 +423,7 @@ class RetryHandler {
|
|
|
330
423
|
}
|
|
331
424
|
|
|
332
425
|
// We make our best to checkpoint the body for further range headers
|
|
333
|
-
if (this.end == null) {
|
|
426
|
+
if (this.end == null && this.opts.method !== 'HEAD') {
|
|
334
427
|
const contentLength = headers['content-length']
|
|
335
428
|
this.end = contentLength != null ? Number(contentLength) - 1 : null
|
|
336
429
|
}
|
|
@@ -430,14 +523,27 @@ class RetryHandler {
|
|
|
430
523
|
}
|
|
431
524
|
|
|
432
525
|
onResponseError (controller, err) {
|
|
526
|
+
if (this.aborted) {
|
|
527
|
+
// #onAbort already delivered the terminal error downstream; the late
|
|
528
|
+
// error of the torn-down connection must not be forwarded twice.
|
|
529
|
+
return
|
|
530
|
+
}
|
|
531
|
+
|
|
433
532
|
// controller is THIS failed connection (not the proxy): we inspect whether
|
|
434
533
|
// the consumer aborted it to decide retry-vs-propagate.
|
|
435
|
-
if (controller?.aborted || isDisturbed(this.opts.body)) {
|
|
534
|
+
if (controller?.aborted || isDisturbed(this.opts.body) || (this.headersSent && !this.resume)) {
|
|
436
535
|
this.handler.onResponseError?.(this.controllerProxy, err)
|
|
437
536
|
return
|
|
438
537
|
}
|
|
439
538
|
|
|
440
539
|
function shouldRetry (returnedErr) {
|
|
540
|
+
if (this.aborted) {
|
|
541
|
+
// Aborted while the policy was deciding; the decision is moot.
|
|
542
|
+
return
|
|
543
|
+
}
|
|
544
|
+
this.retryPending = false
|
|
545
|
+
this.retryTimer = null
|
|
546
|
+
|
|
441
547
|
if (!returnedErr) {
|
|
442
548
|
this.retry()
|
|
443
549
|
return
|
|
@@ -457,14 +563,31 @@ class RetryHandler {
|
|
|
457
563
|
this.retryCount += 1
|
|
458
564
|
}
|
|
459
565
|
|
|
460
|
-
this.
|
|
566
|
+
this.retryPending = true
|
|
567
|
+
this.retryTimer = this.retryOpts.retry(
|
|
461
568
|
err,
|
|
462
569
|
{
|
|
463
570
|
state: { counter: this.retryCount },
|
|
464
571
|
opts: { retryOptions: this.retryOpts, ...this.opts }
|
|
465
572
|
},
|
|
466
573
|
shouldRetry.bind(this)
|
|
467
|
-
)
|
|
574
|
+
) ?? null
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
#onAbort (reason) {
|
|
578
|
+
// A consumer abort lands on the controller proxy. If the retry policy is
|
|
579
|
+
// still deciding (typically holding a backoff timer), cancel the wait and
|
|
580
|
+
// surface the abort immediately instead of letting the request hang until
|
|
581
|
+
// the backoff elapses.
|
|
582
|
+
if (!this.retryPending) {
|
|
583
|
+
return
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
this.aborted = true
|
|
587
|
+
this.retryPending = false
|
|
588
|
+
clearTimeout(this.retryTimer)
|
|
589
|
+
this.retryTimer = null
|
|
590
|
+
this.handler.onResponseError?.(this.controllerProxy, reason ?? new RequestAbortedError())
|
|
468
591
|
}
|
|
469
592
|
}
|
|
470
593
|
|
package/node_modules/@earendil-works/pi-coding-agent/node_modules/undici/lib/interceptor/cache.js
CHANGED
|
@@ -6,7 +6,16 @@ const util = require('../core/util')
|
|
|
6
6
|
const CacheHandler = require('../handler/cache-handler')
|
|
7
7
|
const MemoryCacheStore = require('../cache/memory-cache-store')
|
|
8
8
|
const CacheRevalidationHandler = require('../handler/cache-revalidation-handler')
|
|
9
|
-
const {
|
|
9
|
+
const {
|
|
10
|
+
assertCacheStore,
|
|
11
|
+
assertCacheMethods,
|
|
12
|
+
getInterceptorOrigin,
|
|
13
|
+
makeCacheKey,
|
|
14
|
+
normalizeHeaders,
|
|
15
|
+
parseCacheControlHeader,
|
|
16
|
+
isInvalidOrWildcardVaryHeader,
|
|
17
|
+
parseVaryHeader
|
|
18
|
+
} = require('../util/cache.js')
|
|
10
19
|
const { AbortError } = require('../core/errors.js')
|
|
11
20
|
const { parseHttpDate } = require('../util/date.js')
|
|
12
21
|
|
|
@@ -117,7 +126,10 @@ function staleResponseRequiresRevalidation (result, cacheType) {
|
|
|
117
126
|
* @returns {boolean}
|
|
118
127
|
*/
|
|
119
128
|
function revalidationResponseDisallowsCachedReuse (cacheType, headers) {
|
|
120
|
-
if (
|
|
129
|
+
if (
|
|
130
|
+
(headers.vary && isInvalidOrWildcardVaryHeader(headers.vary)) ||
|
|
131
|
+
(cacheType === 'shared' && Object.hasOwn(headers, 'set-cookie'))
|
|
132
|
+
) {
|
|
121
133
|
return true
|
|
122
134
|
}
|
|
123
135
|
|
|
@@ -135,6 +147,25 @@ function revalidationResponseUpdatesCacheControl (headers) {
|
|
|
135
147
|
return headers['cache-control'] !== undefined
|
|
136
148
|
}
|
|
137
149
|
|
|
150
|
+
/**
|
|
151
|
+
* @param {import('../../types/cache-interceptor.d.ts').default.GetResult} result
|
|
152
|
+
* @param {Record<string, string | string[] | null> | undefined} varyDirectives
|
|
153
|
+
* @returns {boolean}
|
|
154
|
+
*/
|
|
155
|
+
function revalidationResponseAddsVary (result, varyDirectives) {
|
|
156
|
+
if (!varyDirectives) {
|
|
157
|
+
return false
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
for (const key in varyDirectives) {
|
|
161
|
+
if (result.vary == null || !Object.hasOwn(result.vary, key)) {
|
|
162
|
+
return true
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
return false
|
|
167
|
+
}
|
|
168
|
+
|
|
138
169
|
function deleteCachedValue (store, cacheKey) {
|
|
139
170
|
try {
|
|
140
171
|
store.delete(cacheKey)?.catch?.(nop)
|
|
@@ -389,6 +420,17 @@ function handleResult (
|
|
|
389
420
|
return handleUncachedResponse(dispatch, globalOpts, cacheKey, handler, opts, reqCacheControl)
|
|
390
421
|
}
|
|
391
422
|
|
|
423
|
+
// Shared stores may outlive the Undici version that wrote them. Do not
|
|
424
|
+
// re-serve a Set-Cookie header from an existing shared-cache entry.
|
|
425
|
+
if (globalOpts.type === 'shared' && Object.hasOwn(result.headers, 'set-cookie')) {
|
|
426
|
+
if (util.isStream(result.body)) {
|
|
427
|
+
result.body.on('error', nop).destroy()
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
deleteCachedValue(globalOpts.store, cacheKey)
|
|
431
|
+
return handleUncachedResponse(dispatch, globalOpts, cacheKey, handler, opts, reqCacheControl)
|
|
432
|
+
}
|
|
433
|
+
|
|
392
434
|
const now = Date.now()
|
|
393
435
|
if (now > result.deleteAt) {
|
|
394
436
|
// Response is expired, cache store shouldn't have given this to us
|
|
@@ -471,6 +513,13 @@ function handleResult (
|
|
|
471
513
|
|
|
472
514
|
if (revalidationResponseUpdatesCacheControl(headers)) {
|
|
473
515
|
deleteCachedValue(globalOpts.store, cacheKey)
|
|
516
|
+
} else if (revalidationResponseAddsVary(result, headers.vary ? parseVaryHeader(headers.vary, opts.headers) : undefined)) {
|
|
517
|
+
if (util.isStream(result.body)) {
|
|
518
|
+
result.body.on('error', nop).destroy()
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
deleteCachedValue(globalOpts.store, cacheKey)
|
|
522
|
+
return dispatch(opts, new CacheHandler(globalOpts, cacheKey, handler))
|
|
474
523
|
}
|
|
475
524
|
}
|
|
476
525
|
|
|
@@ -538,26 +587,28 @@ module.exports = (opts = {}) => {
|
|
|
538
587
|
}
|
|
539
588
|
}
|
|
540
589
|
|
|
541
|
-
return dispatch => {
|
|
590
|
+
return (dispatch, interceptorOrigin) => {
|
|
542
591
|
return (opts, handler) => {
|
|
543
|
-
|
|
544
|
-
|
|
592
|
+
const requestOrigin = getInterceptorOrigin(opts, interceptorOrigin)
|
|
593
|
+
if (!requestOrigin || arrayIncludes(safeMethodsToNotCache, opts.method)) {
|
|
594
|
+
// We cannot safely cache without an authoritative origin, or this is
|
|
595
|
+
// not a method we want to cache.
|
|
545
596
|
return dispatch(opts, handler)
|
|
546
597
|
}
|
|
547
598
|
|
|
548
599
|
// Check if origin is in whitelist
|
|
549
600
|
if (origins !== undefined) {
|
|
550
|
-
const
|
|
601
|
+
const normalizedRequestOrigin = requestOrigin.toString().toLowerCase()
|
|
551
602
|
let isAllowed = false
|
|
552
603
|
|
|
553
604
|
for (let i = 0; i < origins.length; i++) {
|
|
554
605
|
const allowed = origins[i]
|
|
555
606
|
if (typeof allowed === 'string') {
|
|
556
|
-
if (allowed.toLowerCase() ===
|
|
607
|
+
if (allowed.toLowerCase() === normalizedRequestOrigin) {
|
|
557
608
|
isAllowed = true
|
|
558
609
|
break
|
|
559
610
|
}
|
|
560
|
-
} else if (allowed.test(
|
|
611
|
+
} else if (allowed.test(normalizedRequestOrigin)) {
|
|
561
612
|
isAllowed = true
|
|
562
613
|
break
|
|
563
614
|
}
|
|
@@ -586,7 +637,12 @@ module.exports = (opts = {}) => {
|
|
|
586
637
|
/**
|
|
587
638
|
* @type {import('../../types/cache-interceptor.d.ts').default.CacheKey}
|
|
588
639
|
*/
|
|
589
|
-
const cacheKey = makeCacheKey(opts)
|
|
640
|
+
const cacheKey = makeCacheKey(opts, requestOrigin)
|
|
641
|
+
|
|
642
|
+
if (!arrayIncludes(util.safeHTTPMethods, opts.method)) {
|
|
643
|
+
return dispatch(opts, new CacheHandler(globalOpts, cacheKey, handler))
|
|
644
|
+
}
|
|
645
|
+
|
|
590
646
|
const result = store.get(cacheKey)
|
|
591
647
|
|
|
592
648
|
if (result && typeof result.then === 'function') {
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
3
|
const { createInflate, createGunzip, createBrotliDecompress, createZstdDecompress } = require('node:zlib')
|
|
4
|
-
const { pipeline } = require('node:stream')
|
|
4
|
+
const { pipeline, Transform: TransformStream } = require('node:stream')
|
|
5
|
+
const { InvalidArgumentError, ResponseExceededMaxSizeError } = require('../core/errors')
|
|
5
6
|
const DecoratorHandler = require('../handler/decorator-handler')
|
|
6
7
|
|
|
7
8
|
/** @typedef {import('node:stream').Transform} Transform */
|
|
@@ -20,6 +21,31 @@ const supportedEncodings = {
|
|
|
20
21
|
}
|
|
21
22
|
|
|
22
23
|
const defaultSkipStatusCodes = /** @type {const} */ ([204, 304])
|
|
24
|
+
const defaultMaxSize = 64 * 1024 * 1024
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Limits the output of one stage in a decompression chain.
|
|
28
|
+
* @param {number} maxSize - Maximum output size in bytes
|
|
29
|
+
* @returns {Transform}
|
|
30
|
+
*/
|
|
31
|
+
function createMaxSizeLimiter (maxSize) {
|
|
32
|
+
let size = 0
|
|
33
|
+
|
|
34
|
+
return new TransformStream({
|
|
35
|
+
transform (chunk, _encoding, callback) {
|
|
36
|
+
const decompressedSize = size + chunk.length
|
|
37
|
+
if (decompressedSize > maxSize) {
|
|
38
|
+
callback(new ResponseExceededMaxSizeError(
|
|
39
|
+
`Decompressed response size (${decompressedSize}) exceeded maxSize (${maxSize})`
|
|
40
|
+
))
|
|
41
|
+
return
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
size = decompressedSize
|
|
45
|
+
callback(null, chunk)
|
|
46
|
+
}
|
|
47
|
+
})
|
|
48
|
+
}
|
|
23
49
|
|
|
24
50
|
let warningEmitted = /** @type {boolean} */ (false)
|
|
25
51
|
|
|
@@ -27,6 +53,7 @@ let warningEmitted = /** @type {boolean} */ (false)
|
|
|
27
53
|
* @typedef {Object} DecompressHandlerOptions
|
|
28
54
|
* @property {number[]|Readonly<number[]>} [skipStatusCodes=[204, 304]] - List of status codes to skip decompression for
|
|
29
55
|
* @property {boolean} [skipErrorResponses] - Whether to skip decompression for error responses (status codes >= 400)
|
|
56
|
+
* @property {number} [maxSize=67108864] - Maximum decompressed response size in bytes
|
|
30
57
|
*/
|
|
31
58
|
|
|
32
59
|
class DecompressHandler extends DecoratorHandler {
|
|
@@ -38,11 +65,24 @@ class DecompressHandler extends DecoratorHandler {
|
|
|
38
65
|
#skipStatusCodes
|
|
39
66
|
/** @type {boolean} */
|
|
40
67
|
#skipErrorResponses
|
|
68
|
+
/** @type {number} */
|
|
69
|
+
#maxSize
|
|
70
|
+
/** @type {number} */
|
|
71
|
+
#decompressedSize = 0
|
|
72
|
+
/** @type {boolean} */
|
|
73
|
+
#terminated = false
|
|
74
|
+
/** @type {boolean} */
|
|
75
|
+
#inputEnded = false
|
|
76
|
+
|
|
77
|
+
constructor (handler, { skipStatusCodes = defaultSkipStatusCodes, skipErrorResponses = true, maxSize = defaultMaxSize } = {}) {
|
|
78
|
+
if (!Number.isSafeInteger(maxSize) || maxSize < 1) {
|
|
79
|
+
throw new InvalidArgumentError('maxSize must be a positive integer')
|
|
80
|
+
}
|
|
41
81
|
|
|
42
|
-
constructor (handler, { skipStatusCodes = defaultSkipStatusCodes, skipErrorResponses = true } = {}) {
|
|
43
82
|
super(handler)
|
|
44
83
|
this.#skipStatusCodes = skipStatusCodes
|
|
45
84
|
this.#skipErrorResponses = skipErrorResponses
|
|
85
|
+
this.#maxSize = maxSize
|
|
46
86
|
}
|
|
47
87
|
|
|
48
88
|
/**
|
|
@@ -62,7 +102,7 @@ class DecompressHandler extends DecoratorHandler {
|
|
|
62
102
|
* Creates a chain of decompressors for multiple content encodings
|
|
63
103
|
*
|
|
64
104
|
* @param {string} encodings - Comma-separated list of content encodings
|
|
65
|
-
* @returns {Array<
|
|
105
|
+
* @returns {Array<Transform>} - Array of decompressor and limiting streams
|
|
66
106
|
* @throws {Error} - If the number of content-encodings exceeds the maximum allowed
|
|
67
107
|
*/
|
|
68
108
|
#createDecompressionChain (encodings) {
|
|
@@ -90,7 +130,40 @@ class DecompressHandler extends DecoratorHandler {
|
|
|
90
130
|
decompressors.push(supportedEncodings[encoding]())
|
|
91
131
|
}
|
|
92
132
|
|
|
93
|
-
|
|
133
|
+
if (decompressors.length < 2) {
|
|
134
|
+
return decompressors
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/** @type {Transform[]} */
|
|
138
|
+
const streams = []
|
|
139
|
+
for (let i = 0; i < decompressors.length; i++) {
|
|
140
|
+
streams.push(decompressors[i])
|
|
141
|
+
if (i < decompressors.length - 1) {
|
|
142
|
+
streams.push(createMaxSizeLimiter(this.#maxSize))
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
return streams
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Stops decompression and reports an error.
|
|
151
|
+
* @param {Controller} controller - The controller to coordinate with
|
|
152
|
+
* @param {Error} error - The decompression error
|
|
153
|
+
* @returns {void}
|
|
154
|
+
*/
|
|
155
|
+
#fail (controller, error) {
|
|
156
|
+
if (this.#terminated) {
|
|
157
|
+
return
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
if (this.#inputEnded) {
|
|
161
|
+
// The request is already marked complete once the compressed input ends,
|
|
162
|
+
// so controller.abort() can no longer propagate decoder flush errors.
|
|
163
|
+
this.onResponseError(controller, error)
|
|
164
|
+
} else {
|
|
165
|
+
controller.abort(error)
|
|
166
|
+
}
|
|
94
167
|
}
|
|
95
168
|
|
|
96
169
|
/**
|
|
@@ -101,8 +174,21 @@ class DecompressHandler extends DecoratorHandler {
|
|
|
101
174
|
*/
|
|
102
175
|
#setupDecompressorEvents (decompressor, controller) {
|
|
103
176
|
decompressor.on('readable', () => {
|
|
177
|
+
if (this.#terminated) {
|
|
178
|
+
return
|
|
179
|
+
}
|
|
180
|
+
|
|
104
181
|
let chunk
|
|
105
182
|
while ((chunk = decompressor.read()) !== null) {
|
|
183
|
+
const decompressedSize = this.#decompressedSize + chunk.length
|
|
184
|
+
if (decompressedSize > this.#maxSize) {
|
|
185
|
+
this.#fail(controller, new ResponseExceededMaxSizeError(
|
|
186
|
+
`Decompressed response size (${decompressedSize}) exceeded maxSize (${this.#maxSize})`
|
|
187
|
+
))
|
|
188
|
+
return
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
this.#decompressedSize = decompressedSize
|
|
106
192
|
const result = super.onResponseData(controller, chunk)
|
|
107
193
|
if (result === false) {
|
|
108
194
|
break
|
|
@@ -111,7 +197,7 @@ class DecompressHandler extends DecoratorHandler {
|
|
|
111
197
|
})
|
|
112
198
|
|
|
113
199
|
decompressor.on('error', (error) => {
|
|
114
|
-
|
|
200
|
+
this.#fail(controller, error)
|
|
115
201
|
})
|
|
116
202
|
}
|
|
117
203
|
|
|
@@ -125,6 +211,12 @@ class DecompressHandler extends DecoratorHandler {
|
|
|
125
211
|
this.#setupDecompressorEvents(decompressor, controller)
|
|
126
212
|
|
|
127
213
|
decompressor.on('end', () => {
|
|
214
|
+
if (this.#terminated) {
|
|
215
|
+
return
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
this.#terminated = true
|
|
219
|
+
this.#cleanupDecompressors()
|
|
128
220
|
super.onResponseEnd(controller, this.#trailers)
|
|
129
221
|
})
|
|
130
222
|
}
|
|
@@ -139,10 +231,17 @@ class DecompressHandler extends DecoratorHandler {
|
|
|
139
231
|
this.#setupDecompressorEvents(lastDecompressor, controller)
|
|
140
232
|
|
|
141
233
|
pipeline(this.#decompressors, (err) => {
|
|
234
|
+
if (this.#terminated) {
|
|
235
|
+
return
|
|
236
|
+
}
|
|
237
|
+
|
|
142
238
|
if (err) {
|
|
143
|
-
|
|
239
|
+
this.#fail(controller, err)
|
|
144
240
|
return
|
|
145
241
|
}
|
|
242
|
+
|
|
243
|
+
this.#terminated = true
|
|
244
|
+
this.#cleanupDecompressors()
|
|
146
245
|
super.onResponseEnd(controller, this.#trailers)
|
|
147
246
|
})
|
|
148
247
|
}
|
|
@@ -198,7 +297,7 @@ class DecompressHandler extends DecoratorHandler {
|
|
|
198
297
|
|
|
199
298
|
filteredHeaders.push(rawHeaders[i], rawHeaders[i + 1])
|
|
200
299
|
}
|
|
201
|
-
|
|
300
|
+
rawHeaders.splice(0, rawHeaders.length, ...filteredHeaders)
|
|
202
301
|
} else if (typeof rawHeaders === 'object') {
|
|
203
302
|
for (const name of Object.keys(rawHeaders)) {
|
|
204
303
|
const lowerName = name.toLowerCase()
|
|
@@ -238,9 +337,9 @@ class DecompressHandler extends DecoratorHandler {
|
|
|
238
337
|
*/
|
|
239
338
|
onResponseEnd (controller, trailers) {
|
|
240
339
|
if (this.#decompressors.length > 0) {
|
|
340
|
+
this.#inputEnded = true
|
|
241
341
|
this.#trailers = trailers
|
|
242
342
|
this.#decompressors[0].end()
|
|
243
|
-
this.#cleanupDecompressors()
|
|
244
343
|
return
|
|
245
344
|
}
|
|
246
345
|
super.onResponseEnd(controller, trailers)
|
|
@@ -252,12 +351,15 @@ class DecompressHandler extends DecoratorHandler {
|
|
|
252
351
|
* @returns {void}
|
|
253
352
|
*/
|
|
254
353
|
onResponseError (controller, err) {
|
|
255
|
-
if (this.#
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
354
|
+
if (this.#terminated) {
|
|
355
|
+
return
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
this.#terminated = true
|
|
359
|
+
for (const decompressor of this.#decompressors) {
|
|
360
|
+
decompressor.destroy()
|
|
260
361
|
}
|
|
362
|
+
this.#cleanupDecompressors()
|
|
261
363
|
super.onResponseError(controller, err)
|
|
262
364
|
}
|
|
263
365
|
}
|