@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
|
@@ -8,7 +8,9 @@ const {
|
|
|
8
8
|
RequestAbortedError,
|
|
9
9
|
SocketError,
|
|
10
10
|
InformationalError,
|
|
11
|
-
InvalidArgumentError
|
|
11
|
+
InvalidArgumentError,
|
|
12
|
+
HeadersTimeoutError,
|
|
13
|
+
BodyTimeoutError
|
|
12
14
|
} = require('../core/errors.js')
|
|
13
15
|
const {
|
|
14
16
|
kUrl,
|
|
@@ -33,6 +35,7 @@ const {
|
|
|
33
35
|
kHTTPContext,
|
|
34
36
|
kClosed,
|
|
35
37
|
kBodyTimeout,
|
|
38
|
+
kHeadersTimeout,
|
|
36
39
|
kEnableConnectProtocol,
|
|
37
40
|
kRemoteSettings,
|
|
38
41
|
kHTTP2Stream,
|
|
@@ -219,7 +222,11 @@ function resumeH2 (client) {
|
|
|
219
222
|
const socket = client[kSocket]
|
|
220
223
|
|
|
221
224
|
if (socket?.destroyed === false) {
|
|
222
|
-
|
|
225
|
+
// Only let the process exit when there is genuinely nothing outstanding.
|
|
226
|
+
// Unreffing because the peer advertised MAX_CONCURRENT_STREAMS = 0 left
|
|
227
|
+
// queued requests with nothing holding the event loop open, so the process
|
|
228
|
+
// could exit with status 0 while an awaited request never settled.
|
|
229
|
+
if (client[kSize] === 0) {
|
|
223
230
|
socket.unref()
|
|
224
231
|
client[kHTTP2Session].unref()
|
|
225
232
|
} else {
|
|
@@ -314,6 +321,36 @@ function onHttp2SessionEnd () {
|
|
|
314
321
|
* @this {import('http2').ClientHttp2Session}
|
|
315
322
|
* @param {number} errorCode
|
|
316
323
|
*/
|
|
324
|
+
// Backport of #5410 and #5569. HTTP/2 multiplexes, so requests complete out of
|
|
325
|
+
// order; advancing kRunningIdx blindly retired whichever request happened to
|
|
326
|
+
// sit at the head instead of the one that actually finished, which both lost
|
|
327
|
+
// requests and left phantom running slots behind.
|
|
328
|
+
function completeRequest (client, request, resetPendingIdx = false) {
|
|
329
|
+
const queue = client[kQueue]
|
|
330
|
+
const runningIdx = client[kRunningIdx]
|
|
331
|
+
|
|
332
|
+
// In-order completion: clear the request and advance without splicing.
|
|
333
|
+
// The client's resume loop compacts cleared slots once the index grows.
|
|
334
|
+
if (runningIdx < client[kPendingIdx] && queue[runningIdx] === request) {
|
|
335
|
+
queue[runningIdx] = null
|
|
336
|
+
client[kRunningIdx] = runningIdx + 1
|
|
337
|
+
return
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
const index = queue.indexOf(request, runningIdx)
|
|
341
|
+
|
|
342
|
+
if (index === -1 || index >= client[kPendingIdx]) {
|
|
343
|
+
return
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
queue.splice(index, 1)
|
|
347
|
+
client[kPendingIdx]--
|
|
348
|
+
|
|
349
|
+
if (resetPendingIdx && client[kPendingIdx] < client[kRunningIdx]) {
|
|
350
|
+
client[kPendingIdx] = client[kRunningIdx]
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
|
|
317
354
|
function onHttp2SessionGoAway (errorCode) {
|
|
318
355
|
// TODO(mcollina): Verify if GOAWAY implements the spec correctly:
|
|
319
356
|
// https://datatracker.ietf.org/doc/html/rfc7540#section-6.8
|
|
@@ -335,7 +372,9 @@ function onHttp2SessionGoAway (errorCode) {
|
|
|
335
372
|
if (client[kRunningIdx] < client[kQueue].length) {
|
|
336
373
|
const request = client[kQueue][client[kRunningIdx]]
|
|
337
374
|
client[kQueue][client[kRunningIdx]++] = null
|
|
338
|
-
|
|
375
|
+
if (request != null) {
|
|
376
|
+
util.errorRequest(client, request, err)
|
|
377
|
+
}
|
|
339
378
|
client[kPendingIdx] = client[kRunningIdx]
|
|
340
379
|
}
|
|
341
380
|
|
|
@@ -368,7 +407,9 @@ function onHttp2SessionClose () {
|
|
|
368
407
|
const requests = client[kQueue].splice(client[kRunningIdx])
|
|
369
408
|
for (let i = 0; i < requests.length; i++) {
|
|
370
409
|
const request = requests[i]
|
|
371
|
-
|
|
410
|
+
if (request != null) {
|
|
411
|
+
util.errorRequest(client, request, err)
|
|
412
|
+
}
|
|
372
413
|
}
|
|
373
414
|
}
|
|
374
415
|
}
|
|
@@ -416,7 +457,10 @@ function shouldSendContentLength (method) {
|
|
|
416
457
|
}
|
|
417
458
|
|
|
418
459
|
function writeH2 (client, request) {
|
|
419
|
-
|
|
460
|
+
// Time to the response headers, then time between body chunks. Using
|
|
461
|
+
// bodyTimeout for both made headersTimeout a no-op over HTTP/2.
|
|
462
|
+
const headersTimeout = request.headersTimeout ?? client[kHeadersTimeout]
|
|
463
|
+
const bodyTimeout = request.bodyTimeout ?? client[kBodyTimeout]
|
|
420
464
|
const session = client[kHTTP2Session]
|
|
421
465
|
const { method, path, host, upgrade, expectContinue, signal, protocol, headers: reqHeaders } = request
|
|
422
466
|
let { body } = request
|
|
@@ -483,6 +527,7 @@ function writeH2 (client, request) {
|
|
|
483
527
|
|
|
484
528
|
// We move the running index to the next request
|
|
485
529
|
client[kOnError](err)
|
|
530
|
+
completeRequest(client, request)
|
|
486
531
|
client[kResume]()
|
|
487
532
|
}
|
|
488
533
|
|
|
@@ -537,7 +582,7 @@ function writeH2 (client, request) {
|
|
|
537
582
|
request.onUpgrade(statusCode, parseH2Headers(realHeaders), stream)
|
|
538
583
|
|
|
539
584
|
++session[kOpenStreams]
|
|
540
|
-
client
|
|
585
|
+
completeRequest(client, request)
|
|
541
586
|
})
|
|
542
587
|
|
|
543
588
|
stream.on('error', () => {
|
|
@@ -554,7 +599,7 @@ function writeH2 (client, request) {
|
|
|
554
599
|
if (session[kOpenStreams] === 0) session.unref()
|
|
555
600
|
})
|
|
556
601
|
|
|
557
|
-
stream.setTimeout(
|
|
602
|
+
stream.setTimeout(headersTimeout)
|
|
558
603
|
return true
|
|
559
604
|
}
|
|
560
605
|
|
|
@@ -570,13 +615,14 @@ function writeH2 (client, request) {
|
|
|
570
615
|
|
|
571
616
|
request.onUpgrade(statusCode, parseH2Headers(realHeaders), stream)
|
|
572
617
|
++session[kOpenStreams]
|
|
573
|
-
client
|
|
618
|
+
completeRequest(client, request)
|
|
574
619
|
})
|
|
620
|
+
stream.on('error', abort)
|
|
575
621
|
stream.once('close', () => {
|
|
576
622
|
session[kOpenStreams] -= 1
|
|
577
623
|
if (session[kOpenStreams] === 0) session.unref()
|
|
578
624
|
})
|
|
579
|
-
stream.setTimeout(
|
|
625
|
+
stream.setTimeout(headersTimeout)
|
|
580
626
|
|
|
581
627
|
return true
|
|
582
628
|
}
|
|
@@ -677,7 +723,7 @@ function writeH2 (client, request) {
|
|
|
677
723
|
|
|
678
724
|
// Increment counter as we have new streams open
|
|
679
725
|
++session[kOpenStreams]
|
|
680
|
-
stream.setTimeout(
|
|
726
|
+
stream.setTimeout(headersTimeout)
|
|
681
727
|
|
|
682
728
|
// Track whether we received a response (headers)
|
|
683
729
|
let responseReceived = false
|
|
@@ -686,6 +732,7 @@ function writeH2 (client, request) {
|
|
|
686
732
|
const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers
|
|
687
733
|
request.onResponseStarted()
|
|
688
734
|
responseReceived = true
|
|
735
|
+
stream.setTimeout(bodyTimeout)
|
|
689
736
|
|
|
690
737
|
// Due to the stream nature, it is possible we face a race condition
|
|
691
738
|
// where the stream has been assigned, but the request has been aborted
|
|
@@ -720,14 +767,13 @@ function writeH2 (client, request) {
|
|
|
720
767
|
request.onComplete({})
|
|
721
768
|
}
|
|
722
769
|
|
|
723
|
-
client
|
|
770
|
+
completeRequest(client, request)
|
|
724
771
|
client[kResume]()
|
|
725
772
|
} else {
|
|
726
773
|
// Stream ended without receiving a response - this is an error
|
|
727
774
|
// (e.g., server destroyed the stream before sending headers)
|
|
728
775
|
abort(new InformationalError('HTTP/2: stream half-closed (remote)'))
|
|
729
|
-
client
|
|
730
|
-
client[kPendingIdx] = client[kRunningIdx]
|
|
776
|
+
completeRequest(client, request, true)
|
|
731
777
|
client[kResume]()
|
|
732
778
|
}
|
|
733
779
|
})
|
|
@@ -738,6 +784,14 @@ function writeH2 (client, request) {
|
|
|
738
784
|
if (session[kOpenStreams] === 0) {
|
|
739
785
|
session.unref()
|
|
740
786
|
}
|
|
787
|
+
|
|
788
|
+
// A stream can close without ever emitting 'end' or 'error': a peer's
|
|
789
|
+
// RST_STREAM(CANCEL) received before the response is reported by Node as a
|
|
790
|
+
// bare 'close', and destroying the stream unenrolls its timeout, so no
|
|
791
|
+
// 'timeout' follows either. Nothing else would ever settle this request.
|
|
792
|
+
if (!request.aborted && !request.completed) {
|
|
793
|
+
abort(new InformationalError('HTTP/2: stream closed before the response was complete'))
|
|
794
|
+
}
|
|
741
795
|
})
|
|
742
796
|
|
|
743
797
|
stream.once('error', function (err) {
|
|
@@ -755,7 +809,9 @@ function writeH2 (client, request) {
|
|
|
755
809
|
})
|
|
756
810
|
|
|
757
811
|
stream.on('timeout', () => {
|
|
758
|
-
const err =
|
|
812
|
+
const err = responseReceived
|
|
813
|
+
? new BodyTimeoutError(`HTTP/2: "body timeout after ${bodyTimeout}"`)
|
|
814
|
+
: new HeadersTimeoutError(`HTTP/2: "headers timeout after ${headersTimeout}"`)
|
|
759
815
|
stream.removeAllListeners('data')
|
|
760
816
|
session[kOpenStreams] -= 1
|
|
761
817
|
|
|
@@ -374,7 +374,9 @@ class Client extends DispatcherBase {
|
|
|
374
374
|
const requests = this[kQueue].splice(this[kPendingIdx])
|
|
375
375
|
for (let i = 0; i < requests.length; i++) {
|
|
376
376
|
const request = requests[i]
|
|
377
|
-
|
|
377
|
+
if (request != null) {
|
|
378
|
+
util.errorRequest(this, request, err)
|
|
379
|
+
}
|
|
378
380
|
}
|
|
379
381
|
|
|
380
382
|
const callback = () => {
|
|
@@ -413,7 +415,9 @@ function onError (client, err) {
|
|
|
413
415
|
|
|
414
416
|
for (let i = 0; i < requests.length; i++) {
|
|
415
417
|
const request = requests[i]
|
|
416
|
-
|
|
418
|
+
if (request != null) {
|
|
419
|
+
util.errorRequest(client, request, err)
|
|
420
|
+
}
|
|
417
421
|
}
|
|
418
422
|
assert(client[kSize] === 0)
|
|
419
423
|
}
|
|
@@ -207,6 +207,13 @@ class CacheHandler {
|
|
|
207
207
|
}
|
|
208
208
|
|
|
209
209
|
const cacheControlHeader = resHeaders['cache-control']
|
|
210
|
+
const cacheControlDirectives = cacheControlHeader ? parseCacheControlHeader(cacheControlHeader) : {}
|
|
211
|
+
|
|
212
|
+
if (revalidationResponseDisallowsCachedReuse(this.#cacheType, resHeaders, cacheControlDirectives)) {
|
|
213
|
+
deleteCachedValue(this.#store, this.#cacheKey)
|
|
214
|
+
return downstreamOnHeaders()
|
|
215
|
+
}
|
|
216
|
+
|
|
210
217
|
const heuristicallyCacheable = resHeaders['last-modified'] && arrayIncludes(HEURISTICALLY_CACHEABLE_STATUS_CODES, statusCode)
|
|
211
218
|
if (
|
|
212
219
|
!cacheControlHeader &&
|
|
@@ -223,8 +230,7 @@ class CacheHandler {
|
|
|
223
230
|
return downstreamOnHeaders()
|
|
224
231
|
}
|
|
225
232
|
|
|
226
|
-
|
|
227
|
-
if (!canCacheResponse(this.#cacheType, statusCode, resHeaders, cacheControlDirectives, this.#cacheKey.headers)) {
|
|
233
|
+
if (!canCacheResponse(this.#cacheType, this.#cacheKey.method, statusCode, resHeaders, cacheControlDirectives, this.#cacheKey.headers)) {
|
|
228
234
|
if (statusCode === 304 && (cacheControlHeader || revalidationResponseDisallowsCachedReuse(this.#cacheType, resHeaders, cacheControlDirectives))) {
|
|
229
235
|
deleteCachedValue(this.#store, this.#cacheKey)
|
|
230
236
|
}
|
|
@@ -465,7 +471,10 @@ function deleteCachedValueIfNotModified (statusCode, store, cacheKey) {
|
|
|
465
471
|
*/
|
|
466
472
|
function revalidationResponseDisallowsCachedReuse (cacheType, resHeaders, cacheControlDirectives) {
|
|
467
473
|
return cacheControlDirectives['no-store'] === true ||
|
|
468
|
-
(cacheType === 'shared' &&
|
|
474
|
+
(cacheType === 'shared' && (
|
|
475
|
+
cacheControlDirectives.private === true ||
|
|
476
|
+
Object.hasOwn(resHeaders, 'set-cookie')
|
|
477
|
+
)) ||
|
|
469
478
|
(resHeaders.vary ? isInvalidOrWildcardVaryHeader(resHeaders.vary) : false)
|
|
470
479
|
}
|
|
471
480
|
|
|
@@ -473,12 +482,16 @@ function revalidationResponseDisallowsCachedReuse (cacheType, resHeaders, cacheC
|
|
|
473
482
|
* @see https://www.rfc-editor.org/rfc/rfc9111.html#name-storing-responses-to-authen
|
|
474
483
|
*
|
|
475
484
|
* @param {import('../../types/cache-interceptor.d.ts').default.CacheOptions['type']} cacheType
|
|
485
|
+
* @param {string} method
|
|
476
486
|
* @param {number} statusCode
|
|
477
487
|
* @param {import('../../types/header.d.ts').IncomingHttpHeaders} resHeaders
|
|
478
488
|
* @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives} cacheControlDirectives
|
|
479
489
|
* @param {import('../../types/header.d.ts').IncomingHttpHeaders} [reqHeaders]
|
|
480
490
|
*/
|
|
481
|
-
function canCacheResponse (cacheType, statusCode, resHeaders, cacheControlDirectives, reqHeaders) {
|
|
491
|
+
function canCacheResponse (cacheType, method, statusCode, resHeaders, cacheControlDirectives, reqHeaders) {
|
|
492
|
+
if (!arrayIncludes(util.safeHTTPMethods, method)) {
|
|
493
|
+
return false
|
|
494
|
+
}
|
|
482
495
|
// Status code must be final and understood.
|
|
483
496
|
if (statusCode < 200 || arrayIncludes(NOT_UNDERSTOOD_STATUS_CODES, statusCode)) {
|
|
484
497
|
return false
|
|
@@ -499,7 +512,10 @@ function canCacheResponse (cacheType, statusCode, resHeaders, cacheControlDirect
|
|
|
499
512
|
return false
|
|
500
513
|
}
|
|
501
514
|
|
|
502
|
-
if (cacheType === 'shared' &&
|
|
515
|
+
if (cacheType === 'shared' && (
|
|
516
|
+
cacheControlDirectives.private === true ||
|
|
517
|
+
Object.hasOwn(resHeaders, 'set-cookie')
|
|
518
|
+
)) {
|
|
503
519
|
return false
|
|
504
520
|
}
|
|
505
521
|
|
|
@@ -95,8 +95,16 @@ class RetryHandler {
|
|
|
95
95
|
if (this.retryOpts.throwOnError) {
|
|
96
96
|
// Preserve old behavior for status codes that are not eligible for retry
|
|
97
97
|
if (this.retryOpts.statusCodes.includes(statusCode) === false) {
|
|
98
|
-
this.headersSent
|
|
99
|
-
|
|
98
|
+
if (this.headersSent) {
|
|
99
|
+
// The downstream handler already received the response from an
|
|
100
|
+
// earlier attempt. Forwarding this response would replace the
|
|
101
|
+
// downstream body and leave the original body pending forever.
|
|
102
|
+
this.handler.onResponseError?.(controller, err)
|
|
103
|
+
} else {
|
|
104
|
+
this.headersSent = true
|
|
105
|
+
this.checkpointResponseEnd(headers)
|
|
106
|
+
this.handler.onResponseStart?.(controller, statusCode, headers, statusMessage)
|
|
107
|
+
}
|
|
100
108
|
} else {
|
|
101
109
|
this.error = err
|
|
102
110
|
}
|
|
@@ -106,14 +114,23 @@ class RetryHandler {
|
|
|
106
114
|
|
|
107
115
|
if (isDisturbed(this.opts.body)) {
|
|
108
116
|
this.headersSent = true
|
|
117
|
+
this.checkpointResponseEnd(headers)
|
|
109
118
|
this.handler.onResponseStart?.(controller, statusCode, headers, statusMessage)
|
|
110
119
|
return
|
|
111
120
|
}
|
|
112
121
|
|
|
113
122
|
function shouldRetry (passedErr) {
|
|
114
123
|
if (passedErr) {
|
|
115
|
-
this.headersSent
|
|
116
|
-
|
|
124
|
+
if (this.headersSent) {
|
|
125
|
+
// The downstream handler already received the response from an
|
|
126
|
+
// earlier attempt. Forwarding this response would replace the
|
|
127
|
+
// downstream body and leave the original body pending forever.
|
|
128
|
+
this.handler.onResponseError?.(controller, passedErr)
|
|
129
|
+
} else {
|
|
130
|
+
this.headersSent = true
|
|
131
|
+
this.checkpointResponseEnd(headers)
|
|
132
|
+
this.handler.onResponseStart?.(controller, statusCode, headers, statusMessage)
|
|
133
|
+
}
|
|
117
134
|
controller.resume()
|
|
118
135
|
return
|
|
119
136
|
}
|
|
@@ -133,6 +150,20 @@ class RetryHandler {
|
|
|
133
150
|
)
|
|
134
151
|
}
|
|
135
152
|
|
|
153
|
+
checkpointResponseEnd (headers) {
|
|
154
|
+
if (this.end == null && this.opts.method !== 'HEAD') {
|
|
155
|
+
const contentLength = headers['content-length']
|
|
156
|
+
this.end = contentLength != null ? Number(contentLength) - 1 : null
|
|
157
|
+
|
|
158
|
+
assert(
|
|
159
|
+
this.end == null || Number.isFinite(this.end),
|
|
160
|
+
'invalid content-length'
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
this.resume = this.end != null
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
136
167
|
onRequestStart (controller, context) {
|
|
137
168
|
if (!this.headersSent) {
|
|
138
169
|
this.handler.onRequestStart?.(controller, context)
|
|
@@ -253,8 +284,12 @@ class RetryHandler {
|
|
|
253
284
|
|
|
254
285
|
const { start, size, end = size ? size - 1 : null } = contentRange
|
|
255
286
|
|
|
256
|
-
|
|
257
|
-
|
|
287
|
+
if (this.start !== start || (this.end != null && this.end !== end)) {
|
|
288
|
+
throw new RequestRetryError('Content-Range mismatch', statusCode, {
|
|
289
|
+
headers,
|
|
290
|
+
data: { count: this.retryCount }
|
|
291
|
+
})
|
|
292
|
+
}
|
|
258
293
|
|
|
259
294
|
return
|
|
260
295
|
}
|
|
@@ -379,7 +414,7 @@ class RetryHandler {
|
|
|
379
414
|
}
|
|
380
415
|
|
|
381
416
|
onResponseError (controller, err) {
|
|
382
|
-
if (controller?.aborted || isDisturbed(this.opts.body)) {
|
|
417
|
+
if (controller?.aborted || isDisturbed(this.opts.body) || (this.headersSent && !this.resume)) {
|
|
383
418
|
this.handler.onResponseError?.(controller, err)
|
|
384
419
|
return
|
|
385
420
|
}
|
|
@@ -117,7 +117,10 @@ function staleResponseRequiresRevalidation (result, cacheType) {
|
|
|
117
117
|
* @returns {boolean}
|
|
118
118
|
*/
|
|
119
119
|
function revalidationResponseDisallowsCachedReuse (cacheType, headers) {
|
|
120
|
-
if (
|
|
120
|
+
if (
|
|
121
|
+
(headers.vary && isInvalidOrWildcardVaryHeader(headers.vary)) ||
|
|
122
|
+
(cacheType === 'shared' && Object.hasOwn(headers, 'set-cookie'))
|
|
123
|
+
) {
|
|
121
124
|
return true
|
|
122
125
|
}
|
|
123
126
|
|
|
@@ -376,6 +379,17 @@ function handleResult (
|
|
|
376
379
|
return handleUncachedResponse(dispatch, globalOpts, cacheKey, handler, opts, reqCacheControl)
|
|
377
380
|
}
|
|
378
381
|
|
|
382
|
+
// Shared stores may outlive the Undici version that wrote them. Do not
|
|
383
|
+
// re-serve a Set-Cookie header from an existing shared-cache entry.
|
|
384
|
+
if (globalOpts.type === 'shared' && Object.hasOwn(result.headers, 'set-cookie')) {
|
|
385
|
+
if (util.isStream(result.body)) {
|
|
386
|
+
result.body.on('error', nop).destroy()
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
deleteCachedValue(globalOpts.store, cacheKey)
|
|
390
|
+
return handleUncachedResponse(dispatch, globalOpts, cacheKey, handler, opts, reqCacheControl)
|
|
391
|
+
}
|
|
392
|
+
|
|
379
393
|
const now = Date.now()
|
|
380
394
|
if (now > result.deleteAt) {
|
|
381
395
|
// Response is expired, cache store shouldn't have given this to us
|
|
@@ -574,6 +588,11 @@ module.exports = (opts = {}) => {
|
|
|
574
588
|
* @type {import('../../types/cache-interceptor.d.ts').default.CacheKey}
|
|
575
589
|
*/
|
|
576
590
|
const cacheKey = makeCacheKey(opts)
|
|
591
|
+
|
|
592
|
+
if (!arrayIncludes(util.safeHTTPMethods, opts.method)) {
|
|
593
|
+
return dispatch(opts, new CacheHandler(globalOpts, cacheKey, handler))
|
|
594
|
+
}
|
|
595
|
+
|
|
577
596
|
const result = store.get(cacheKey)
|
|
578
597
|
|
|
579
598
|
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
|
const { runtimeFeatures } = require('../util/runtime-features')
|
|
7
8
|
|
|
@@ -21,6 +22,31 @@ const supportedEncodings = {
|
|
|
21
22
|
}
|
|
22
23
|
|
|
23
24
|
const defaultSkipStatusCodes = /** @type {const} */ ([204, 304])
|
|
25
|
+
const defaultMaxSize = 64 * 1024 * 1024
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Limits the output of one stage in a decompression chain.
|
|
29
|
+
* @param {number} maxSize - Maximum output size in bytes
|
|
30
|
+
* @returns {Transform}
|
|
31
|
+
*/
|
|
32
|
+
function createMaxSizeLimiter (maxSize) {
|
|
33
|
+
let size = 0
|
|
34
|
+
|
|
35
|
+
return new TransformStream({
|
|
36
|
+
transform (chunk, _encoding, callback) {
|
|
37
|
+
const decompressedSize = size + chunk.length
|
|
38
|
+
if (decompressedSize > maxSize) {
|
|
39
|
+
callback(new ResponseExceededMaxSizeError(
|
|
40
|
+
`Decompressed response size (${decompressedSize}) exceeded maxSize (${maxSize})`
|
|
41
|
+
))
|
|
42
|
+
return
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
size = decompressedSize
|
|
46
|
+
callback(null, chunk)
|
|
47
|
+
}
|
|
48
|
+
})
|
|
49
|
+
}
|
|
24
50
|
|
|
25
51
|
let warningEmitted = /** @type {boolean} */ (false)
|
|
26
52
|
|
|
@@ -28,20 +54,36 @@ let warningEmitted = /** @type {boolean} */ (false)
|
|
|
28
54
|
* @typedef {Object} DecompressHandlerOptions
|
|
29
55
|
* @property {number[]|Readonly<number[]>} [skipStatusCodes=[204, 304]] - List of status codes to skip decompression for
|
|
30
56
|
* @property {boolean} [skipErrorResponses] - Whether to skip decompression for error responses (status codes >= 400)
|
|
57
|
+
* @property {number} [maxSize=67108864] - Maximum decompressed response size in bytes
|
|
31
58
|
*/
|
|
32
59
|
|
|
33
60
|
class DecompressHandler extends DecoratorHandler {
|
|
34
61
|
/** @type {Transform[]} */
|
|
35
62
|
#decompressors = []
|
|
63
|
+
/** @type {Record<string, string | string[]> | undefined} */
|
|
64
|
+
#trailers
|
|
36
65
|
/** @type {Readonly<number[]>} */
|
|
37
66
|
#skipStatusCodes
|
|
38
67
|
/** @type {boolean} */
|
|
39
68
|
#skipErrorResponses
|
|
69
|
+
/** @type {number} */
|
|
70
|
+
#maxSize
|
|
71
|
+
/** @type {number} */
|
|
72
|
+
#decompressedSize = 0
|
|
73
|
+
/** @type {boolean} */
|
|
74
|
+
#terminated = false
|
|
75
|
+
/** @type {boolean} */
|
|
76
|
+
#inputEnded = false
|
|
77
|
+
|
|
78
|
+
constructor (handler, { skipStatusCodes = defaultSkipStatusCodes, skipErrorResponses = true, maxSize = defaultMaxSize } = {}) {
|
|
79
|
+
if (!Number.isSafeInteger(maxSize) || maxSize < 1) {
|
|
80
|
+
throw new InvalidArgumentError('maxSize must be a positive integer')
|
|
81
|
+
}
|
|
40
82
|
|
|
41
|
-
constructor (handler, { skipStatusCodes = defaultSkipStatusCodes, skipErrorResponses = true } = {}) {
|
|
42
83
|
super(handler)
|
|
43
84
|
this.#skipStatusCodes = skipStatusCodes
|
|
44
85
|
this.#skipErrorResponses = skipErrorResponses
|
|
86
|
+
this.#maxSize = maxSize
|
|
45
87
|
}
|
|
46
88
|
|
|
47
89
|
/**
|
|
@@ -61,7 +103,7 @@ class DecompressHandler extends DecoratorHandler {
|
|
|
61
103
|
* Creates a chain of decompressors for multiple content encodings
|
|
62
104
|
*
|
|
63
105
|
* @param {string} encodings - Comma-separated list of content encodings
|
|
64
|
-
* @returns {Array<
|
|
106
|
+
* @returns {Array<Transform>} - Array of decompressor and limiting streams
|
|
65
107
|
* @throws {Error} - If the number of content-encodings exceeds the maximum allowed
|
|
66
108
|
*/
|
|
67
109
|
#createDecompressionChain (encodings) {
|
|
@@ -89,7 +131,40 @@ class DecompressHandler extends DecoratorHandler {
|
|
|
89
131
|
decompressors.push(supportedEncodings[encoding]())
|
|
90
132
|
}
|
|
91
133
|
|
|
92
|
-
|
|
134
|
+
if (decompressors.length < 2) {
|
|
135
|
+
return decompressors
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/** @type {Transform[]} */
|
|
139
|
+
const streams = []
|
|
140
|
+
for (let i = 0; i < decompressors.length; i++) {
|
|
141
|
+
streams.push(decompressors[i])
|
|
142
|
+
if (i < decompressors.length - 1) {
|
|
143
|
+
streams.push(createMaxSizeLimiter(this.#maxSize))
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
return streams
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Stops decompression and reports an error.
|
|
152
|
+
* @param {Controller} controller - The controller to coordinate with
|
|
153
|
+
* @param {Error} error - The decompression error
|
|
154
|
+
* @returns {void}
|
|
155
|
+
*/
|
|
156
|
+
#fail (controller, error) {
|
|
157
|
+
if (this.#terminated) {
|
|
158
|
+
return
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
if (this.#inputEnded) {
|
|
162
|
+
// The request is already marked complete once the compressed input ends,
|
|
163
|
+
// so controller.abort() can no longer propagate decoder flush errors.
|
|
164
|
+
this.onResponseError(controller, error)
|
|
165
|
+
} else {
|
|
166
|
+
controller.abort(error)
|
|
167
|
+
}
|
|
93
168
|
}
|
|
94
169
|
|
|
95
170
|
/**
|
|
@@ -100,8 +175,21 @@ class DecompressHandler extends DecoratorHandler {
|
|
|
100
175
|
*/
|
|
101
176
|
#setupDecompressorEvents (decompressor, controller) {
|
|
102
177
|
decompressor.on('readable', () => {
|
|
178
|
+
if (this.#terminated) {
|
|
179
|
+
return
|
|
180
|
+
}
|
|
181
|
+
|
|
103
182
|
let chunk
|
|
104
183
|
while ((chunk = decompressor.read()) !== null) {
|
|
184
|
+
const decompressedSize = this.#decompressedSize + chunk.length
|
|
185
|
+
if (decompressedSize > this.#maxSize) {
|
|
186
|
+
this.#fail(controller, new ResponseExceededMaxSizeError(
|
|
187
|
+
`Decompressed response size (${decompressedSize}) exceeded maxSize (${this.#maxSize})`
|
|
188
|
+
))
|
|
189
|
+
return
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
this.#decompressedSize = decompressedSize
|
|
105
193
|
const result = super.onResponseData(controller, chunk)
|
|
106
194
|
if (result === false) {
|
|
107
195
|
break
|
|
@@ -110,7 +198,7 @@ class DecompressHandler extends DecoratorHandler {
|
|
|
110
198
|
})
|
|
111
199
|
|
|
112
200
|
decompressor.on('error', (error) => {
|
|
113
|
-
|
|
201
|
+
this.#fail(controller, error)
|
|
114
202
|
})
|
|
115
203
|
}
|
|
116
204
|
|
|
@@ -124,7 +212,13 @@ class DecompressHandler extends DecoratorHandler {
|
|
|
124
212
|
this.#setupDecompressorEvents(decompressor, controller)
|
|
125
213
|
|
|
126
214
|
decompressor.on('end', () => {
|
|
127
|
-
|
|
215
|
+
if (this.#terminated) {
|
|
216
|
+
return
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
this.#terminated = true
|
|
220
|
+
this.#cleanupDecompressors()
|
|
221
|
+
super.onResponseEnd(controller, this.#trailers)
|
|
128
222
|
})
|
|
129
223
|
}
|
|
130
224
|
|
|
@@ -138,11 +232,18 @@ class DecompressHandler extends DecoratorHandler {
|
|
|
138
232
|
this.#setupDecompressorEvents(lastDecompressor, controller)
|
|
139
233
|
|
|
140
234
|
pipeline(this.#decompressors, (err) => {
|
|
235
|
+
if (this.#terminated) {
|
|
236
|
+
return
|
|
237
|
+
}
|
|
238
|
+
|
|
141
239
|
if (err) {
|
|
142
|
-
|
|
240
|
+
this.#fail(controller, err)
|
|
143
241
|
return
|
|
144
242
|
}
|
|
145
|
-
|
|
243
|
+
|
|
244
|
+
this.#terminated = true
|
|
245
|
+
this.#cleanupDecompressors()
|
|
246
|
+
super.onResponseEnd(controller, this.#trailers)
|
|
146
247
|
})
|
|
147
248
|
}
|
|
148
249
|
|
|
@@ -181,6 +282,33 @@ class DecompressHandler extends DecoratorHandler {
|
|
|
181
282
|
// Remove compression headers since we're decompressing
|
|
182
283
|
const { 'content-encoding': _, 'content-length': __, ...newHeaders } = headers
|
|
183
284
|
|
|
285
|
+
if (controller?.rawHeaders) {
|
|
286
|
+
const rawHeaders = controller.rawHeaders
|
|
287
|
+
|
|
288
|
+
if (Array.isArray(rawHeaders)) {
|
|
289
|
+
const filteredHeaders = []
|
|
290
|
+
for (let i = 0; i < rawHeaders.length; i += 2) {
|
|
291
|
+
const headerName = rawHeaders[i]
|
|
292
|
+
const name = Buffer.isBuffer(headerName) ? headerName.toString('latin1') : `${headerName}`
|
|
293
|
+
const lowerName = name.toLowerCase()
|
|
294
|
+
|
|
295
|
+
if (lowerName === 'content-encoding' || lowerName === 'content-length') {
|
|
296
|
+
continue
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
filteredHeaders.push(rawHeaders[i], rawHeaders[i + 1])
|
|
300
|
+
}
|
|
301
|
+
rawHeaders.splice(0, rawHeaders.length, ...filteredHeaders)
|
|
302
|
+
} else if (typeof rawHeaders === 'object') {
|
|
303
|
+
for (const name of Object.keys(rawHeaders)) {
|
|
304
|
+
const lowerName = name.toLowerCase()
|
|
305
|
+
if (lowerName === 'content-encoding' || lowerName === 'content-length') {
|
|
306
|
+
delete rawHeaders[name]
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
|
|
184
312
|
if (this.#decompressors.length === 1) {
|
|
185
313
|
this.#setupSingleDecompressor(controller)
|
|
186
314
|
} else {
|
|
@@ -210,8 +338,9 @@ class DecompressHandler extends DecoratorHandler {
|
|
|
210
338
|
*/
|
|
211
339
|
onResponseEnd (controller, trailers) {
|
|
212
340
|
if (this.#decompressors.length > 0) {
|
|
341
|
+
this.#inputEnded = true
|
|
342
|
+
this.#trailers = trailers
|
|
213
343
|
this.#decompressors[0].end()
|
|
214
|
-
this.#cleanupDecompressors()
|
|
215
344
|
return
|
|
216
345
|
}
|
|
217
346
|
super.onResponseEnd(controller, trailers)
|
|
@@ -223,12 +352,15 @@ class DecompressHandler extends DecoratorHandler {
|
|
|
223
352
|
* @returns {void}
|
|
224
353
|
*/
|
|
225
354
|
onResponseError (controller, err) {
|
|
226
|
-
if (this.#
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
355
|
+
if (this.#terminated) {
|
|
356
|
+
return
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
this.#terminated = true
|
|
360
|
+
for (const decompressor of this.#decompressors) {
|
|
361
|
+
decompressor.destroy()
|
|
231
362
|
}
|
|
363
|
+
this.#cleanupDecompressors()
|
|
232
364
|
super.onResponseError(controller, err)
|
|
233
365
|
}
|
|
234
366
|
}
|