@openclaw/slack 2026.9.6 → 2026.9.8
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/assets/icon.png +0 -0
- package/dist/.setup/{account-inspect-DP1Bcwj4.mjs → account-inspect-DWBXpER6.mjs} +1 -1
- package/dist/.setup/{accounts-BBHvg0pY.mjs → accounts-D_N9IqNA.mjs} +23 -1
- package/dist/.setup/{action-runtime-B01d85zt.mjs → action-runtime-DfWvuiZd.mjs} +26 -41
- package/dist/.setup/action-runtime.runtime-Ck4bAWOX.mjs +2 -0
- package/dist/.setup/{actions-DKCtBgCI.mjs → actions-Df0CzcDl.mjs} +88 -175
- package/dist/.setup/{approval-handler.runtime-DMszKn_7.mjs → approval-handler.runtime-Ed6Sw5VK.mjs} +37 -47
- package/dist/.setup/{approval-message-updates-Tb_qRokK.mjs → approval-message-updates-BadvtA7R.mjs} +1 -2
- package/dist/.setup/{channel-CErYZ5zw.mjs → channel-C7bgPSTE.mjs} +181 -273
- package/dist/.setup/channel-meta-C443t-lI.mjs +27 -0
- package/dist/.setup/{channel-type-Dxk8VJUb.mjs → channel-type-ClOttrZ5.mjs} +13 -21
- package/dist/.setup/{channel.setup-BVoUtdPn.mjs → channel.setup-Dh2jzAjN.mjs} +35 -42
- package/dist/.setup/{config-schema-CyL279e7.mjs → config-schema-BZCxmHKG.mjs} +24 -21
- package/dist/.setup/{directory-config-CQTSH45W.mjs → directory-config-BOUWH3hR.mjs} +7 -10
- package/dist/.setup/{directory-live-BCcj89QV.mjs → directory-live-B2O4B_Ho.mjs} +9 -21
- package/dist/.setup/doctor-contract-CRN1Z_c7.mjs +342 -0
- package/dist/.setup/{message-tool-api-C0PTFaNV.mjs → message-tool-api-Cu4lwlGy.mjs} +34 -48
- package/dist/.setup/{provider-C-jPaGt2.mjs → monitor-BPVfkumU.mjs} +2181 -2693
- package/dist/.setup/{outbound-adapter-A7Wdn8ZT.mjs → outbound-adapter-Bv48XUjq.mjs} +10 -21
- package/dist/.setup/{pipeline.runtime-BlPOexmJ.mjs → pipeline.runtime-B1H63Frf.mjs} +311 -457
- package/dist/.setup/{plugin-routes-C3X0eVaK.mjs → plugin-routes-B8tooDLj.mjs} +1 -1
- package/dist/.setup/{policy-BApW53pI.mjs → policy-D-jfM174.mjs} +5 -5
- package/dist/.setup/{probe-DiYIMPJo.mjs → probe-B2Y9qc_z.mjs} +101 -39
- package/dist/.setup/{registry-bbjH7IHX.mjs → registry-CIbMfuf8.mjs} +6 -2
- package/dist/.setup/{relay-source-DfOnjJTE.mjs → relay-source-BpKdjsll.mjs} +10 -12
- package/dist/.setup/{replies-BBAJxUOQ.mjs → replies-BAnUtr2f.mjs} +16 -76
- package/dist/.setup/{reply-blocks-Bm8kf6mK.mjs → reply-blocks-SE1kTE3I.mjs} +27 -154
- package/dist/.setup/{resolve-channels-BXbMBbJD.mjs → resolve-channels-XXBn8UU_.mjs} +4 -5
- package/dist/.setup/{resolve-users-65WqvIqD.mjs → resolve-users-DW0ngD03.mjs} +20 -22
- package/dist/.setup/{scopes-h3YB-mMs.mjs → scopes-CasuDvaa.mjs} +6 -17
- package/dist/.setup/{secret-contract-DxmvbxBF.mjs → secret-contract-BaZcu6P_.mjs} +15 -20
- package/dist/.setup/{secret-contract-api-D9UfYujm.mjs → secret-contract-api-Dp6290Vg.mjs} +1 -1
- package/dist/.setup/{security-audit-BypHqcq5.mjs → security-audit-BqDc-6VL.mjs} +1 -1
- package/dist/.setup/{send-Cp6omkOg.mjs → send-BOVLQi3n.mjs} +84 -171
- package/dist/.setup/{session-status-Cf7AvWOt.mjs → session-status-DscajIsd.mjs} +315 -238
- package/dist/.setup/{setup-plugin-api-dLPkL06L.mjs → setup-plugin-api-DTtbTKNk.mjs} +1 -1
- package/dist/.setup/{setup-surface-D3DLcCxu.mjs → setup-surface-Dn7QgWRE.mjs} +24 -56
- package/dist/.setup/{shared-CJ3arAFL.mjs → shared-qau-uDGl.mjs} +30 -56
- package/dist/.setup/{slash-dispatch.runtime-HFy_XvyO.mjs → slash-dispatch.runtime--AEzLVBF.mjs} +1 -1
- package/dist/.setup/{streaming-compat-B-e0mqM0.mjs → streaming-compat-C5Wut626.mjs} +31 -8
- package/dist/.setup/{target-parsing-DEsPjngB.mjs → target-parsing-FFE26kOV.mjs} +1 -7
- package/dist/.setup/{targets-Cku2KCvg.mjs → targets-C6LZQL1Q.mjs} +1 -1
- package/dist/.setup/{thread-ts-CukseRVL.mjs → thread-ts-Cvt7WD6B.mjs} +0 -1
- package/dist/account-inspect-api.js +1 -1
- package/dist/api.js +18 -17
- package/dist/channel-config-api.js +1 -1
- package/dist/channel-plugin-api.js +1 -1
- package/dist/directory-contract-api.js +1 -1
- package/dist/doctor-contract-api.js +1 -1
- package/dist/http-routes-api.js +1 -1
- package/dist/index.js +1 -1
- package/dist/message-tool-api.js +1 -1
- package/dist/runtime-api.js +11 -12
- package/dist/secret-contract-api.js +1 -1
- package/dist/security-contract-api.js +1 -1
- package/dist/setup-entry.js +2 -2
- package/dist/setup-plugin-api.js +1 -1
- package/node_modules/@slack/bolt/node_modules/@types/node/README.md +1 -1
- package/node_modules/@slack/bolt/node_modules/@types/node/child_process.d.ts +1 -1
- package/node_modules/@slack/bolt/node_modules/@types/node/crypto.d.ts +20 -8
- package/node_modules/@slack/bolt/node_modules/@types/node/ffi.d.ts +14 -0
- package/node_modules/@slack/bolt/node_modules/@types/node/http2.d.ts +3 -2
- package/node_modules/@slack/bolt/node_modules/@types/node/net.d.ts +16 -4
- package/node_modules/@slack/bolt/node_modules/@types/node/package.json +2 -2
- package/node_modules/@slack/bolt/node_modules/@types/node/process.d.ts +1 -0
- package/node_modules/@slack/bolt/node_modules/@types/node/quic.d.ts +39 -1
- package/node_modules/@slack/bolt/node_modules/@types/node/stream/iter.d.ts +9 -12
- package/node_modules/@slack/bolt/node_modules/@types/node/test/reporters.d.ts +1 -0
- package/node_modules/@slack/bolt/node_modules/@types/node/test.d.ts +72 -0
- package/node_modules/@slack/bolt/node_modules/@types/node/tls.d.ts +14 -10
- package/node_modules/@slack/bolt/node_modules/@types/node/vm.d.ts +2 -1
- package/node_modules/@slack/bolt/node_modules/@types/node/worker_threads.d.ts +4 -1
- package/node_modules/@slack/web-api/node_modules/@types/node/README.md +1 -1
- package/node_modules/@slack/web-api/node_modules/@types/node/child_process.d.ts +1 -1
- package/node_modules/@slack/web-api/node_modules/@types/node/crypto.d.ts +20 -8
- package/node_modules/@slack/web-api/node_modules/@types/node/ffi.d.ts +14 -0
- package/node_modules/@slack/web-api/node_modules/@types/node/http2.d.ts +3 -2
- package/node_modules/@slack/web-api/node_modules/@types/node/net.d.ts +16 -4
- package/node_modules/@slack/web-api/node_modules/@types/node/package.json +2 -2
- package/node_modules/@slack/web-api/node_modules/@types/node/process.d.ts +1 -0
- package/node_modules/@slack/web-api/node_modules/@types/node/quic.d.ts +39 -1
- package/node_modules/@slack/web-api/node_modules/@types/node/stream/iter.d.ts +9 -12
- package/node_modules/@slack/web-api/node_modules/@types/node/test/reporters.d.ts +1 -0
- package/node_modules/@slack/web-api/node_modules/@types/node/test.d.ts +72 -0
- package/node_modules/@slack/web-api/node_modules/@types/node/tls.d.ts +14 -10
- package/node_modules/@slack/web-api/node_modules/@types/node/vm.d.ts +2 -1
- package/node_modules/@slack/web-api/node_modules/@types/node/worker_threads.d.ts +4 -1
- package/node_modules/get-east-asian-width/index.js +8 -3
- package/node_modules/get-east-asian-width/lookup-data.js +1 -1
- package/node_modules/get-east-asian-width/lookup.js +4 -4
- package/node_modules/get-east-asian-width/package.json +1 -1
- package/node_modules/typebox/build/compile/code.mjs +1 -2
- package/node_modules/typebox/build/compile/validator.mjs +5 -1
- package/node_modules/typebox/build/format/iri.mjs +16 -9
- package/node_modules/typebox/build/guard/emit.mjs +2 -2
- package/node_modules/typebox/build/guard/guard.d.mts +7 -5
- package/node_modules/typebox/build/guard/guard.mjs +14 -9
- package/node_modules/typebox/build/guard/index.mjs +6 -0
- package/node_modules/typebox/build/guard/unicode/unicode.d.mts +6 -0
- package/node_modules/typebox/build/guard/unicode/unicode.mjs +35 -0
- package/node_modules/typebox/build/guard/{string.mjs → unicode/unicode_segment.mjs} +16 -19
- package/node_modules/typebox/build/schema/build.mjs +2 -3
- package/node_modules/typebox/build/schema/engine/_pathing.d.mts +1 -0
- package/node_modules/typebox/build/schema/engine/_pathing.mjs +11 -0
- package/node_modules/typebox/build/schema/engine/_refine.mjs +13 -5
- package/node_modules/typebox/build/schema/engine/additionalProperties.mjs +2 -1
- package/node_modules/typebox/build/schema/engine/dependencies.mjs +2 -1
- package/node_modules/typebox/build/schema/engine/dependentSchemas.mjs +2 -1
- package/node_modules/typebox/build/schema/engine/dynamicRef.d.mts +1 -1
- package/node_modules/typebox/build/schema/engine/dynamicRef.mjs +2 -2
- package/node_modules/typebox/build/schema/engine/format.mjs +9 -2
- package/node_modules/typebox/build/schema/engine/patternProperties.mjs +3 -2
- package/node_modules/typebox/build/schema/engine/properties.mjs +3 -2
- package/node_modules/typebox/build/schema/engine/propertyNames.mjs +2 -1
- package/node_modules/typebox/build/schema/engine/recursiveRef.d.mts +1 -1
- package/node_modules/typebox/build/schema/engine/recursiveRef.mjs +2 -2
- package/node_modules/typebox/build/schema/engine/ref.d.mts +1 -1
- package/node_modules/typebox/build/schema/engine/ref.mjs +2 -2
- package/node_modules/typebox/build/schema/engine/schema.mjs +24 -24
- package/node_modules/typebox/build/schema/parse.mjs +3 -0
- package/node_modules/typebox/build/schema/pointer/pointer.d.mts +1 -6
- package/node_modules/typebox/build/schema/pointer/pointer.mjs +47 -64
- package/node_modules/typebox/build/system/settings/internal.d.mts +2 -0
- package/node_modules/typebox/build/system/settings/internal.mjs +20 -0
- package/node_modules/typebox/build/system/settings/settings.d.mts +11 -0
- package/node_modules/typebox/build/system/settings/settings.mjs +14 -0
- package/node_modules/typebox/build/type/extends/inference.d.mts +1 -1
- package/node_modules/typebox/build/type/extends/inference.mjs +15 -2
- package/node_modules/typebox/build/type/extends/tuple.d.mts +2 -1
- package/node_modules/typebox/build/type/extends/tuple.mjs +21 -1
- package/node_modules/typebox/build/value/parse/parse.mjs +10 -4
- package/node_modules/typebox/package.json +1 -1
- package/node_modules/typebox/readme.md +3 -1
- package/node_modules/undici/README.md +81 -25
- package/node_modules/undici/docs/docs/api/Agent.md +249 -42
- package/node_modules/undici/docs/docs/api/BalancedPool.md +246 -48
- package/node_modules/undici/docs/docs/api/CacheStorage.md +171 -13
- package/node_modules/undici/docs/docs/api/CacheStore.md +294 -98
- package/node_modules/undici/docs/docs/api/Client.md +407 -162
- package/node_modules/undici/docs/docs/api/ClientStats.md +80 -14
- package/node_modules/undici/docs/docs/api/Connector.md +118 -35
- package/node_modules/undici/docs/docs/api/ContentType.md +65 -25
- package/node_modules/undici/docs/docs/api/Cookies.md +122 -71
- package/node_modules/undici/docs/docs/api/Debug.md +34 -18
- package/node_modules/undici/docs/docs/api/DiagnosticsChannel.md +364 -164
- package/node_modules/undici/docs/docs/api/Dispatcher.md +490 -1055
- package/node_modules/undici/docs/docs/api/EnvHttpProxyAgent.md +105 -93
- package/node_modules/undici/docs/docs/api/Errors.md +503 -28
- package/node_modules/undici/docs/docs/api/EventSource.md +326 -13
- package/node_modules/undici/docs/docs/api/Fetch.md +681 -30
- package/node_modules/undici/docs/docs/api/GlobalInstallation.md +78 -96
- package/node_modules/undici/docs/docs/api/H2CClient.md +298 -176
- package/node_modules/undici/docs/docs/api/Interceptors.md +418 -0
- package/node_modules/undici/docs/docs/api/MockAgent.md +333 -314
- package/node_modules/undici/docs/docs/api/MockCallHistory.md +272 -98
- package/node_modules/undici/docs/docs/api/MockCallHistoryLog.md +189 -26
- package/node_modules/undici/docs/docs/api/MockClient.md +151 -33
- package/node_modules/undici/docs/docs/api/MockErrors.md +56 -5
- package/node_modules/undici/docs/docs/api/MockPool.md +321 -258
- package/node_modules/undici/docs/docs/api/Pool.md +236 -41
- package/node_modules/undici/docs/docs/api/PoolStats.md +119 -13
- package/node_modules/undici/docs/docs/api/ProxyAgent.md +179 -160
- package/node_modules/undici/docs/docs/api/RedirectHandler.md +238 -55
- package/node_modules/undici/docs/docs/api/RetryAgent.md +113 -27
- package/node_modules/undici/docs/docs/api/RetryHandler.md +161 -79
- package/node_modules/undici/docs/docs/api/RoundRobinPool.md +166 -72
- package/node_modules/undici/docs/docs/api/SnapshotAgent.md +262 -517
- package/node_modules/undici/docs/docs/api/Socks5ProxyAgent.md +177 -196
- package/node_modules/undici/docs/docs/api/Util.md +68 -11
- package/node_modules/undici/docs/docs/api/WebSocket.md +475 -80
- package/node_modules/undici/docs/docs/api/api-lifecycle.md +100 -32
- package/node_modules/undici/docs/docs/best-practices/client-certificate.md +2 -0
- package/node_modules/undici/docs/docs/best-practices/crawling.md +3 -1
- package/node_modules/undici/docs/docs/best-practices/migrating-from-v7-to-v8.md +233 -0
- package/node_modules/undici/docs/docs/best-practices/mocking-request.md +9 -7
- package/node_modules/undici/docs/docs/best-practices/proxy.md +3 -1
- package/node_modules/undici/docs/docs/best-practices/undici-vs-builtin-fetch.md +10 -8
- package/node_modules/undici/docs/docs/best-practices/writing-tests.md +2 -0
- package/node_modules/undici/docs/docs/getting-started.md +281 -0
- package/node_modules/undici/docs/docs/index.md +784 -0
- package/node_modules/undici/docs/docs/site.json +125 -0
- package/node_modules/undici/docs/docs/type-map.json +79 -0
- package/node_modules/undici/index.js +4 -2
- package/node_modules/undici/lib/api/api-connect.js +13 -11
- package/node_modules/undici/lib/api/api-pipeline.js +26 -13
- package/node_modules/undici/lib/api/api-request.js +51 -21
- package/node_modules/undici/lib/api/api-stream.js +81 -20
- package/node_modules/undici/lib/api/api-upgrade.js +21 -11
- package/node_modules/undici/lib/api/readable.js +45 -9
- package/node_modules/undici/lib/cache/memory-cache-store.js +3 -3
- package/node_modules/undici/lib/cache/sqlite-cache-store.js +3 -1
- package/node_modules/undici/lib/core/connect.js +46 -7
- package/node_modules/undici/lib/core/constants.js +1 -24
- package/node_modules/undici/lib/core/errors.js +22 -2
- package/node_modules/undici/lib/core/request.js +100 -18
- package/node_modules/undici/lib/core/symbols.js +4 -0
- package/node_modules/undici/lib/core/util.js +105 -48
- package/node_modules/undici/lib/dispatcher/agent.js +51 -32
- package/node_modules/undici/lib/dispatcher/balanced-pool.js +23 -27
- package/node_modules/undici/lib/dispatcher/client-h1.js +86 -24
- package/node_modules/undici/lib/dispatcher/client-h2.js +1091 -361
- package/node_modules/undici/lib/dispatcher/client.js +109 -36
- package/node_modules/undici/lib/dispatcher/dispatcher-base.js +19 -6
- package/node_modules/undici/lib/dispatcher/dispatcher.js +15 -5
- package/node_modules/undici/lib/dispatcher/dispatcher1-wrapper.js +110 -0
- package/node_modules/undici/lib/dispatcher/env-http-proxy-agent.js +37 -8
- package/node_modules/undici/lib/dispatcher/h2c-client.js +4 -4
- package/node_modules/undici/lib/dispatcher/pool-base.js +28 -10
- package/node_modules/undici/lib/dispatcher/pool.js +30 -5
- package/node_modules/undici/lib/dispatcher/proxy-agent.js +95 -19
- package/node_modules/undici/lib/dispatcher/retry-agent.js +3 -0
- package/node_modules/undici/lib/dispatcher/round-robin-pool.js +32 -10
- package/node_modules/undici/lib/dispatcher/socks5-proxy-agent.js +153 -63
- package/node_modules/undici/lib/global.js +37 -14
- package/node_modules/undici/lib/handler/cache-handler.js +49 -7
- package/node_modules/undici/lib/handler/cache-revalidation-handler.js +10 -0
- package/node_modules/undici/lib/handler/decorator-handler.js +8 -3
- package/node_modules/undici/lib/handler/deduplication-handler.js +12 -6
- package/node_modules/undici/lib/handler/redirect-handler.js +66 -66
- package/node_modules/undici/lib/handler/retry-handler.js +191 -50
- package/node_modules/undici/lib/interceptor/cache.js +75 -25
- package/node_modules/undici/lib/interceptor/decompress.js +5 -2
- package/node_modules/undici/lib/interceptor/deduplicate.js +5 -4
- package/node_modules/undici/lib/interceptor/dns.js +12 -1
- package/node_modules/undici/lib/interceptor/redirect.js +3 -3
- package/node_modules/undici/lib/llhttp/llhttp-wasm.js +1 -1
- package/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js +1 -1
- package/node_modules/undici/lib/mock/mock-agent.js +21 -9
- package/node_modules/undici/lib/mock/mock-call-history.js +1 -1
- package/node_modules/undici/lib/mock/mock-interceptor.js +25 -7
- package/node_modules/undici/lib/mock/mock-utils.js +281 -47
- package/node_modules/undici/lib/mock/snapshot-agent.js +25 -7
- package/node_modules/undici/lib/mock/snapshot-recorder.js +38 -3
- package/node_modules/undici/lib/util/cache.js +92 -10
- package/node_modules/undici/lib/util/runtime-features.js +3 -34
- package/node_modules/undici/lib/web/cache/cache.js +6 -8
- package/node_modules/undici/lib/web/cookies/parse.js +150 -146
- package/node_modules/undici/lib/web/cookies/util.js +1 -1
- package/node_modules/undici/lib/web/eventsource/eventsource-stream.js +28 -1
- package/node_modules/undici/lib/web/eventsource/eventsource.js +20 -21
- package/node_modules/undici/lib/web/eventsource/util.js +32 -1
- package/node_modules/undici/lib/web/fetch/body.js +48 -10
- package/node_modules/undici/lib/web/fetch/constants.js +1 -1
- package/node_modules/undici/lib/web/fetch/formdata.js +21 -2
- package/node_modules/undici/lib/web/fetch/index.js +242 -223
- package/node_modules/undici/lib/web/fetch/request.js +35 -6
- package/node_modules/undici/lib/web/fetch/response.js +1 -3
- package/node_modules/undici/lib/web/fetch/util.js +10 -2
- package/node_modules/undici/lib/web/webidl/index.js +5 -7
- package/node_modules/undici/lib/web/websocket/frame.js +1 -7
- package/node_modules/undici/lib/web/websocket/receiver.js +1 -1
- package/node_modules/undici/lib/web/websocket/stream/websocketstream.js +10 -10
- package/node_modules/undici/lib/web/websocket/websocket.js +25 -3
- package/node_modules/undici/package.json +10 -10
- package/node_modules/undici/types/agent.d.ts +0 -2
- package/node_modules/undici/types/client.d.ts +69 -24
- 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 +8 -30
- package/node_modules/undici/types/dispatcher1-wrapper.d.ts +7 -0
- 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/formdata.d.ts +0 -6
- package/node_modules/undici/types/h2c-client.d.ts +6 -6
- package/node_modules/undici/types/handlers.d.ts +2 -0
- package/node_modules/undici/types/header.d.ts +5 -0
- package/node_modules/undici/types/index.d.ts +3 -1
- package/node_modules/undici/types/interceptors.d.ts +1 -1
- package/node_modules/undici/types/mock-agent.d.ts +11 -10
- package/node_modules/undici/types/mock-interceptor.d.ts +5 -1
- package/node_modules/undici/types/pool.d.ts +0 -2
- package/node_modules/undici/types/proxy-agent.d.ts +9 -2
- package/node_modules/undici/types/round-robin-pool.d.ts +0 -2
- package/node_modules/undici/types/snapshot-agent.d.ts +4 -0
- package/node_modules/undici/types/socks5-proxy-agent.d.ts +4 -2
- package/node_modules/undici/types/webidl.d.ts +0 -1
- package/openclaw.plugin.json +31 -3
- package/package.json +7 -7
- package/dist/.setup/accounts.runtime-DN-PPocC.mjs +0 -2
- package/dist/.setup/action-runtime.runtime-C8R8CUan.mjs +0 -2
- package/dist/.setup/doctor-contract-CtMUqjvk.mjs +0 -186
- package/dist/.setup/monitor-_Sht7Dqy.mjs +0 -13
- package/dist/.setup/rolldown-runtime-D7D4PA-g.mjs +0 -13
- package/dist/.setup/send.runtime-B4caZU6T.mjs +0 -2
- package/dist/.setup/slash-commands.runtime-BpSH0b3q.mjs +0 -2
- package/dist/.setup/slash-skill-commands.runtime-Bi1JWZHY.mjs +0 -2
- package/node_modules/undici/lib/handler/unwrap-handler.js +0 -106
- package/node_modules/undici/lib/handler/wrap-handler.js +0 -105
- package/node_modules/undici/lib/llhttp/.gitkeep +0 -0
- package/node_modules/undici/lib/util/promise.js +0 -28
- /package/node_modules/typebox/build/guard/{string.d.mts → unicode/unicode_segment.d.mts} +0 -0
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
3
|
const assert = require('node:assert')
|
|
4
|
-
const { finished } = require('node:stream')
|
|
5
4
|
const { AsyncResource } = require('node:async_hooks')
|
|
6
5
|
const { InvalidArgumentError, InvalidReturnValueError } = require('../core/errors')
|
|
7
6
|
const util = require('../core/util')
|
|
@@ -9,6 +8,54 @@ const { addSignal, removeSignal } = require('./abort-signal')
|
|
|
9
8
|
|
|
10
9
|
function noop () {}
|
|
11
10
|
|
|
11
|
+
function getWritableError (stream) {
|
|
12
|
+
return stream.errored ?? stream.writableErrored ?? stream._writableState?.errored
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function createPrematureCloseError () {
|
|
16
|
+
const err = new Error('Premature close')
|
|
17
|
+
err.code = 'ERR_STREAM_PREMATURE_CLOSE'
|
|
18
|
+
return err
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function trackWritableLifecycle (stream, callback) {
|
|
22
|
+
let done = false
|
|
23
|
+
|
|
24
|
+
const cleanup = () => {
|
|
25
|
+
stream.removeListener('close', onClose)
|
|
26
|
+
stream.removeListener('error', onError)
|
|
27
|
+
stream.removeListener('finish', onFinish)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const finish = (err, fromErrorEvent = false) => {
|
|
31
|
+
if (done) {
|
|
32
|
+
return
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
done = true
|
|
36
|
+
cleanup()
|
|
37
|
+
callback(err, fromErrorEvent)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const onClose = () => {
|
|
41
|
+
const err = getWritableError(stream)
|
|
42
|
+
finish(err ?? (!stream.writableFinished ? createPrematureCloseError() : undefined))
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const onError = (err) => finish(err, true)
|
|
46
|
+
const onFinish = () => finish()
|
|
47
|
+
|
|
48
|
+
stream.on('close', onClose)
|
|
49
|
+
stream.on('error', onError)
|
|
50
|
+
stream.on('finish', onFinish)
|
|
51
|
+
|
|
52
|
+
if (stream.closed) {
|
|
53
|
+
process.nextTick(onClose)
|
|
54
|
+
} else if (stream.writableFinished) {
|
|
55
|
+
process.nextTick(onFinish)
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
12
59
|
class StreamHandler extends AsyncResource {
|
|
13
60
|
constructor (opts, factory, callback) {
|
|
14
61
|
if (!opts || typeof opts !== 'object') {
|
|
@@ -53,39 +100,44 @@ class StreamHandler extends AsyncResource {
|
|
|
53
100
|
this.res = null
|
|
54
101
|
this.abort = null
|
|
55
102
|
this.context = null
|
|
103
|
+
this.controller = null
|
|
56
104
|
this.trailers = null
|
|
57
105
|
this.body = body
|
|
58
106
|
this.onInfo = onInfo || null
|
|
59
107
|
|
|
60
108
|
if (util.isStream(body)) {
|
|
61
109
|
body.on('error', (err) => {
|
|
62
|
-
this.
|
|
110
|
+
this.onResponseError(this.controller, err)
|
|
63
111
|
})
|
|
64
112
|
}
|
|
65
113
|
|
|
66
114
|
addSignal(this, signal)
|
|
67
115
|
}
|
|
68
116
|
|
|
69
|
-
|
|
117
|
+
onRequestStart (controller, context) {
|
|
70
118
|
if (this.reason) {
|
|
71
|
-
abort(this.reason)
|
|
119
|
+
controller.abort(this.reason)
|
|
72
120
|
return
|
|
73
121
|
}
|
|
74
122
|
|
|
75
123
|
assert(this.callback)
|
|
76
124
|
|
|
77
|
-
this.
|
|
125
|
+
this.controller = controller
|
|
126
|
+
this.abort = (reason) => controller.abort(reason)
|
|
78
127
|
this.context = context
|
|
79
128
|
}
|
|
80
129
|
|
|
81
|
-
|
|
130
|
+
onResponseStart (controller, statusCode, headers, _statusMessage) {
|
|
82
131
|
const { factory, opaque, context, responseHeaders } = this
|
|
83
132
|
|
|
84
|
-
const
|
|
133
|
+
const rawHeaders = controller?.rawHeaders
|
|
134
|
+
const responseHeaderData = responseHeaders === 'raw'
|
|
135
|
+
? util.parseRawHeaders(rawHeaders)
|
|
136
|
+
: headers
|
|
85
137
|
|
|
86
138
|
if (statusCode < 200) {
|
|
87
139
|
if (this.onInfo) {
|
|
88
|
-
this.onInfo({ statusCode, headers })
|
|
140
|
+
this.onInfo({ statusCode, headers: responseHeaderData })
|
|
89
141
|
}
|
|
90
142
|
return
|
|
91
143
|
}
|
|
@@ -98,7 +150,7 @@ class StreamHandler extends AsyncResource {
|
|
|
98
150
|
|
|
99
151
|
const res = this.runInAsyncScope(factory, null, {
|
|
100
152
|
statusCode,
|
|
101
|
-
headers,
|
|
153
|
+
headers: responseHeaderData,
|
|
102
154
|
opaque,
|
|
103
155
|
context
|
|
104
156
|
})
|
|
@@ -112,24 +164,23 @@ class StreamHandler extends AsyncResource {
|
|
|
112
164
|
throw new InvalidReturnValueError('expected Writable')
|
|
113
165
|
}
|
|
114
166
|
|
|
115
|
-
|
|
116
|
-
finished(res, { readable: false }, (err) => {
|
|
167
|
+
trackWritableLifecycle(res, (err, fromErrorEvent) => {
|
|
117
168
|
const { callback, res, opaque, trailers, abort } = this
|
|
118
169
|
|
|
119
170
|
this.res = null
|
|
120
171
|
if (err || !res?.readable) {
|
|
121
|
-
util.destroy(res, err)
|
|
172
|
+
util.destroy(res, fromErrorEvent ? undefined : err)
|
|
122
173
|
}
|
|
123
174
|
|
|
124
175
|
this.callback = null
|
|
125
176
|
this.runInAsyncScope(callback, null, err || null, { opaque, trailers })
|
|
126
177
|
|
|
127
178
|
if (err) {
|
|
128
|
-
abort()
|
|
179
|
+
abort(err)
|
|
129
180
|
}
|
|
130
181
|
})
|
|
131
182
|
|
|
132
|
-
res.on('drain', resume)
|
|
183
|
+
res.on('drain', () => controller.resume())
|
|
133
184
|
|
|
134
185
|
this.res = res
|
|
135
186
|
|
|
@@ -137,16 +188,24 @@ class StreamHandler extends AsyncResource {
|
|
|
137
188
|
? res.writableNeedDrain
|
|
138
189
|
: res._writableState?.needDrain
|
|
139
190
|
|
|
140
|
-
|
|
191
|
+
if (needDrain === true) {
|
|
192
|
+
controller.pause()
|
|
193
|
+
}
|
|
141
194
|
}
|
|
142
195
|
|
|
143
|
-
|
|
196
|
+
onResponseData (controller, chunk) {
|
|
144
197
|
const { res } = this
|
|
145
198
|
|
|
146
|
-
|
|
199
|
+
if (!res) {
|
|
200
|
+
return
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
if (res.write(chunk) === false) {
|
|
204
|
+
controller.pause()
|
|
205
|
+
}
|
|
147
206
|
}
|
|
148
207
|
|
|
149
|
-
|
|
208
|
+
onResponseEnd (_controller, trailers) {
|
|
150
209
|
const { res } = this
|
|
151
210
|
|
|
152
211
|
removeSignal(this)
|
|
@@ -155,12 +214,14 @@ class StreamHandler extends AsyncResource {
|
|
|
155
214
|
return
|
|
156
215
|
}
|
|
157
216
|
|
|
158
|
-
|
|
217
|
+
if (trailers && typeof trailers === 'object') {
|
|
218
|
+
this.trailers = trailers
|
|
219
|
+
}
|
|
159
220
|
|
|
160
221
|
res.end()
|
|
161
222
|
}
|
|
162
223
|
|
|
163
|
-
|
|
224
|
+
onResponseError (_controller, err) {
|
|
164
225
|
const { res, callback, opaque, body } = this
|
|
165
226
|
|
|
166
227
|
removeSignal(this)
|
|
@@ -34,40 +34,51 @@ class UpgradeHandler extends AsyncResource {
|
|
|
34
34
|
addSignal(this, signal)
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
onRequestStart (controller, context) {
|
|
38
38
|
if (this.reason) {
|
|
39
|
-
abort(this.reason)
|
|
39
|
+
controller.abort(this.reason)
|
|
40
40
|
return
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
assert(this.callback)
|
|
44
44
|
|
|
45
|
-
this.abort = abort
|
|
46
|
-
this.context =
|
|
45
|
+
this.abort = (reason) => controller.abort(reason)
|
|
46
|
+
this.context = context
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
onResponseStart () {
|
|
50
50
|
throw new SocketError('bad upgrade', null)
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
-
|
|
54
|
-
|
|
53
|
+
onRequestUpgrade (controller, statusCode, headers, socket) {
|
|
54
|
+
const expectedStatusCode = socket[kHTTP2Stream] === true ? 200 : 101
|
|
55
|
+
|
|
56
|
+
if (statusCode !== expectedStatusCode) {
|
|
57
|
+
const socketInfo = socket[kHTTP2Stream] === true ? null : util.getSocketInfo(socket)
|
|
58
|
+
controller.abort(new SocketError('bad upgrade', socketInfo))
|
|
59
|
+
return
|
|
60
|
+
}
|
|
55
61
|
|
|
56
62
|
const { callback, opaque, context } = this
|
|
57
63
|
|
|
58
64
|
removeSignal(this)
|
|
59
65
|
|
|
60
66
|
this.callback = null
|
|
61
|
-
|
|
67
|
+
|
|
68
|
+
const rawHeaders = controller?.rawHeaders
|
|
69
|
+
const responseHeaders = this.responseHeaders === 'raw'
|
|
70
|
+
? util.parseRawHeaders(rawHeaders)
|
|
71
|
+
: headers
|
|
72
|
+
|
|
62
73
|
this.runInAsyncScope(callback, null, null, {
|
|
63
|
-
headers,
|
|
74
|
+
headers: responseHeaders,
|
|
64
75
|
socket,
|
|
65
76
|
opaque,
|
|
66
77
|
context
|
|
67
78
|
})
|
|
68
79
|
}
|
|
69
80
|
|
|
70
|
-
|
|
81
|
+
onResponseError (_controller, err) {
|
|
71
82
|
const { callback, opaque } = this
|
|
72
83
|
|
|
73
84
|
removeSignal(this)
|
|
@@ -97,7 +108,6 @@ function upgrade (opts, callback) {
|
|
|
97
108
|
method: opts.method || 'GET',
|
|
98
109
|
upgrade: opts.protocol || 'Websocket'
|
|
99
110
|
}
|
|
100
|
-
|
|
101
111
|
this.dispatch(upgradeOpts, upgradeHandler)
|
|
102
112
|
} catch (err) {
|
|
103
113
|
if (typeof callback !== 'function') {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
3
|
const assert = require('node:assert')
|
|
4
|
+
const { addAbortListener } = require('node:events')
|
|
4
5
|
const { Readable } = require('node:stream')
|
|
5
6
|
const { RequestAbortedError, NotSupportedError, InvalidArgumentError, AbortError } = require('../core/errors')
|
|
6
7
|
const util = require('../core/util')
|
|
@@ -293,10 +294,10 @@ class BodyReadable extends Readable {
|
|
|
293
294
|
const onAbort = () => {
|
|
294
295
|
this.destroy(signal.reason ?? new AbortError())
|
|
295
296
|
}
|
|
296
|
-
signal
|
|
297
|
+
const abortListener = addAbortListener(signal, onAbort)
|
|
297
298
|
this
|
|
298
299
|
.on('close', function () {
|
|
299
|
-
|
|
300
|
+
abortListener[Symbol.dispose]()
|
|
300
301
|
if (signal.aborted) {
|
|
301
302
|
reject(signal.reason ?? new AbortError())
|
|
302
303
|
} else {
|
|
@@ -324,7 +325,15 @@ class BodyReadable extends Readable {
|
|
|
324
325
|
*/
|
|
325
326
|
setEncoding (encoding) {
|
|
326
327
|
if (Buffer.isEncoding(encoding)) {
|
|
327
|
-
|
|
328
|
+
// Delegate to Node.js Readable.setEncoding() which initializes a
|
|
329
|
+
// StringDecoder and re-encodes already-buffered chunks. This properly
|
|
330
|
+
// handles multi-byte sequences split at chunk boundaries for the
|
|
331
|
+
// for-await / on('data') paths. Without this, Node.js uses
|
|
332
|
+
// buf.toString(encoding) on each chunk, producing U+FFFD for split chars.
|
|
333
|
+
//
|
|
334
|
+
// The consume path (body.text(), body.json(), ...) copes with the
|
|
335
|
+
// decoded strings this leaves in state.buffer, see consumeStart().
|
|
336
|
+
super.setEncoding(encoding)
|
|
328
337
|
}
|
|
329
338
|
return this
|
|
330
339
|
}
|
|
@@ -444,14 +453,29 @@ function consumeStart (consume) {
|
|
|
444
453
|
}
|
|
445
454
|
}
|
|
446
455
|
|
|
456
|
+
// If setEncoding() was called, state.buffer holds decoded strings, which
|
|
457
|
+
// consumePush() turns back into bytes. The trailing bytes of a multi-byte
|
|
458
|
+
// sequence split across a chunk boundary are not part of any of those
|
|
459
|
+
// strings, they are held inside the decoder until the rest arrives, so
|
|
460
|
+
// take them from there.
|
|
461
|
+
const decoder = state.decoder
|
|
462
|
+
if (decoder != null && decoder.lastNeed > 0) {
|
|
463
|
+
consumePush(consume, Buffer.from(decoder.lastChar.subarray(0, decoder.lastTotal - decoder.lastNeed)))
|
|
464
|
+
}
|
|
465
|
+
|
|
447
466
|
if (state.endEmitted) {
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
467
|
+
// No `this` to read the consume off here: consumeStart is a free function, called from
|
|
468
|
+
// the queueMicrotask above. The callback below does have one, because the emitter passes
|
|
469
|
+
// the stream as its receiver. Returning matters too - consumeEnd() clears consume.stream,
|
|
470
|
+
// which the resume() below would then dereference.
|
|
471
|
+
consumeEnd(consume, state.encoding)
|
|
472
|
+
return
|
|
453
473
|
}
|
|
454
474
|
|
|
475
|
+
consume.stream.on('end', function () {
|
|
476
|
+
consumeEnd(this[kConsume], this._readableState.encoding)
|
|
477
|
+
})
|
|
478
|
+
|
|
455
479
|
consume.stream.resume()
|
|
456
480
|
|
|
457
481
|
while (consume.stream.read() != null) {
|
|
@@ -541,10 +565,22 @@ function consumeEnd (consume, encoding) {
|
|
|
541
565
|
|
|
542
566
|
/**
|
|
543
567
|
* @param {Consume} consume
|
|
544
|
-
* @param {Buffer} chunk
|
|
568
|
+
* @param {Buffer|string} chunk
|
|
545
569
|
* @returns {void}
|
|
546
570
|
*/
|
|
547
571
|
function consumePush (consume, chunk) {
|
|
572
|
+
if (consume.body === null) {
|
|
573
|
+
return
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
if (typeof chunk === 'string') {
|
|
577
|
+
// Buffered before the consume started, while an encoding was set.
|
|
578
|
+
// consume.length has to stay a byte count and chunksDecode()/chunksConcat()
|
|
579
|
+
// only work on bytes, so re-encode. A string's own length is in UTF-16 code
|
|
580
|
+
// units and Uint8Array.prototype.set() ignores a string argument entirely.
|
|
581
|
+
chunk = Buffer.from(chunk, consume.stream._readableState.encoding)
|
|
582
|
+
}
|
|
583
|
+
|
|
548
584
|
consume.length += chunk.length
|
|
549
585
|
consume.body.push(chunk)
|
|
550
586
|
}
|
|
@@ -87,7 +87,7 @@ class MemoryCacheStore extends EventEmitter {
|
|
|
87
87
|
}
|
|
88
88
|
|
|
89
89
|
/**
|
|
90
|
-
* @param {import('../../types/cache-interceptor.d.ts').default.CacheKey}
|
|
90
|
+
* @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key
|
|
91
91
|
* @returns {import('../../types/cache-interceptor.d.ts').default.GetResult | undefined}
|
|
92
92
|
*/
|
|
93
93
|
get (key) {
|
|
@@ -138,7 +138,7 @@ class MemoryCacheStore extends EventEmitter {
|
|
|
138
138
|
|
|
139
139
|
entry.size += chunk.byteLength
|
|
140
140
|
|
|
141
|
-
if (entry.size
|
|
141
|
+
if (entry.size > store.#maxEntrySize) {
|
|
142
142
|
this.destroy()
|
|
143
143
|
} else {
|
|
144
144
|
entry.body.push(chunk)
|
|
@@ -179,7 +179,7 @@ class MemoryCacheStore extends EventEmitter {
|
|
|
179
179
|
|
|
180
180
|
// Perform eviction
|
|
181
181
|
for (const [key, entries] of store.#entries) {
|
|
182
|
-
for (const entry of entries.splice(0, entries.length / 2)) {
|
|
182
|
+
for (const entry of entries.splice(0, Math.ceil(entries.length / 2))) {
|
|
183
183
|
store.#size -= entry.size
|
|
184
184
|
store.#count -= 1
|
|
185
185
|
}
|
|
@@ -173,6 +173,7 @@ module.exports = class SqliteCacheStore {
|
|
|
173
173
|
headers = ?,
|
|
174
174
|
etag = ?,
|
|
175
175
|
cacheControlDirectives = ?,
|
|
176
|
+
vary = ?,
|
|
176
177
|
cachedAt = ?,
|
|
177
178
|
staleAt = ?
|
|
178
179
|
WHERE
|
|
@@ -278,6 +279,7 @@ module.exports = class SqliteCacheStore {
|
|
|
278
279
|
value.headers ? JSON.stringify(value.headers) : null,
|
|
279
280
|
value.etag ? value.etag : null,
|
|
280
281
|
value.cacheControlDirectives ? JSON.stringify(value.cacheControlDirectives) : null,
|
|
282
|
+
value.vary ? JSON.stringify(value.vary) : null,
|
|
281
283
|
value.cachedAt,
|
|
282
284
|
value.staleAt,
|
|
283
285
|
existingValue.id
|
|
@@ -323,7 +325,7 @@ module.exports = class SqliteCacheStore {
|
|
|
323
325
|
write (chunk, encoding, callback) {
|
|
324
326
|
size += chunk.byteLength
|
|
325
327
|
|
|
326
|
-
if (size
|
|
328
|
+
if (size <= store.#maxEntrySize) {
|
|
327
329
|
body.push(chunk)
|
|
328
330
|
} else {
|
|
329
331
|
this.destroy()
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
const net = require('node:net')
|
|
4
4
|
const assert = require('node:assert')
|
|
5
5
|
const util = require('./util')
|
|
6
|
-
const { InvalidArgumentError } = require('./errors')
|
|
6
|
+
const { InvalidArgumentError, ConnectTimeoutError } = require('./errors')
|
|
7
7
|
|
|
8
8
|
let tls // include tls conditionally since it is not always available
|
|
9
9
|
|
|
@@ -59,7 +59,7 @@ const SessionCache = class WeakSessionCache {
|
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
-
function buildConnector ({ allowH2, useH2c, maxCachedSessions, socketPath, timeout, session: customSession, ...opts }) {
|
|
62
|
+
function buildConnector ({ allowH2, preferH2, useH2c, maxCachedSessions, socketPath, timeout, session: customSession, ...opts }) {
|
|
63
63
|
if (maxCachedSessions != null && (!Number.isInteger(maxCachedSessions) || maxCachedSessions < 0)) {
|
|
64
64
|
throw new InvalidArgumentError('maxCachedSessions must be a positive integer or zero')
|
|
65
65
|
}
|
|
@@ -67,7 +67,7 @@ function buildConnector ({ allowH2, useH2c, maxCachedSessions, socketPath, timeo
|
|
|
67
67
|
const options = { path: socketPath, ...opts }
|
|
68
68
|
const sessionCache = new SessionCache(maxCachedSessions == null ? 100 : maxCachedSessions)
|
|
69
69
|
timeout = timeout == null ? 10e3 : timeout
|
|
70
|
-
allowH2 = allowH2 != null ? allowH2 :
|
|
70
|
+
allowH2 = allowH2 != null ? allowH2 : true
|
|
71
71
|
return function connect ({ hostname, host, protocol, port, servername, localAddress, httpSocket }, callback) {
|
|
72
72
|
let socket
|
|
73
73
|
if (protocol === 'https:') {
|
|
@@ -89,7 +89,7 @@ function buildConnector ({ allowH2, useH2c, maxCachedSessions, socketPath, timeo
|
|
|
89
89
|
servername,
|
|
90
90
|
session,
|
|
91
91
|
localAddress,
|
|
92
|
-
ALPNProtocols: allowH2 ? ['http/1.1', 'h2'] : ['http/1.1'],
|
|
92
|
+
ALPNProtocols: allowH2 ? (preferH2 ? ['h2', 'http/1.1'] : ['http/1.1', 'h2']) : ['http/1.1'],
|
|
93
93
|
socket: httpSocket, // upgrade socket connection
|
|
94
94
|
port,
|
|
95
95
|
host: hostname
|
|
@@ -105,13 +105,27 @@ function buildConnector ({ allowH2, useH2c, maxCachedSessions, socketPath, timeo
|
|
|
105
105
|
|
|
106
106
|
port = port || 80
|
|
107
107
|
|
|
108
|
-
|
|
108
|
+
const connectOptions = {
|
|
109
109
|
highWaterMark: 64 * 1024, // Same as nodejs fs streams.
|
|
110
110
|
...options,
|
|
111
111
|
localAddress,
|
|
112
112
|
port,
|
|
113
113
|
host: hostname
|
|
114
|
-
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const family = net.isIP(hostname)
|
|
117
|
+
if (family !== 0 && servername && servername !== hostname) {
|
|
118
|
+
connectOptions.host = servername
|
|
119
|
+
connectOptions.lookup = (_hostname, lookupOptions, cb) => {
|
|
120
|
+
if (lookupOptions.all) {
|
|
121
|
+
cb(null, [{ address: hostname, family }])
|
|
122
|
+
} else {
|
|
123
|
+
cb(null, hostname, family)
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
socket = net.connect(connectOptions)
|
|
115
129
|
if (useH2c === true) {
|
|
116
130
|
socket.alpnProtocol = 'h2'
|
|
117
131
|
}
|
|
@@ -142,7 +156,7 @@ function buildConnector ({ allowH2, useH2c, maxCachedSessions, socketPath, timeo
|
|
|
142
156
|
if (callback) {
|
|
143
157
|
const cb = callback
|
|
144
158
|
callback = null
|
|
145
|
-
cb(err)
|
|
159
|
+
cb(maybeNormalizeConnectError(err, this, { timeout, hostname, port }))
|
|
146
160
|
}
|
|
147
161
|
})
|
|
148
162
|
|
|
@@ -150,4 +164,29 @@ function buildConnector ({ allowH2, useH2c, maxCachedSessions, socketPath, timeo
|
|
|
150
164
|
}
|
|
151
165
|
}
|
|
152
166
|
|
|
167
|
+
// `net.connect` with `autoSelectFamily` raises an `AggregateError` when every
|
|
168
|
+
// attempted address fails. If any of those failures is a timeout, surface the
|
|
169
|
+
// error as a `ConnectTimeoutError` so callers see the same error regardless of
|
|
170
|
+
// which timer (Node's internal one or undici's `connectTimeout`) wins the race.
|
|
171
|
+
// The original `AggregateError` is preserved on `.cause`.
|
|
172
|
+
function maybeNormalizeConnectError (err, socket, opts) {
|
|
173
|
+
if (
|
|
174
|
+
err instanceof AggregateError &&
|
|
175
|
+
(err.code === 'ETIMEDOUT' || err.errors.some((e) => e != null && e.code === 'ETIMEDOUT'))
|
|
176
|
+
) {
|
|
177
|
+
let message = 'Connect Timeout Error'
|
|
178
|
+
if (Array.isArray(socket.autoSelectFamilyAttemptedAddresses)) {
|
|
179
|
+
message += ` (attempted addresses: ${socket.autoSelectFamilyAttemptedAddresses.join(', ')},`
|
|
180
|
+
} else {
|
|
181
|
+
message += ` (attempted address: ${opts.hostname}:${opts.port},`
|
|
182
|
+
}
|
|
183
|
+
message += ` timeout: ${opts.timeout}ms)`
|
|
184
|
+
|
|
185
|
+
const wrapped = new ConnectTimeoutError(message)
|
|
186
|
+
wrapped.cause = err
|
|
187
|
+
return wrapped
|
|
188
|
+
}
|
|
189
|
+
return err
|
|
190
|
+
}
|
|
191
|
+
|
|
153
192
|
module.exports = buildConnector
|
|
@@ -107,28 +107,6 @@ const headerNameLowerCasedRecord = {}
|
|
|
107
107
|
// Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`.
|
|
108
108
|
Object.setPrototypeOf(headerNameLowerCasedRecord, null)
|
|
109
109
|
|
|
110
|
-
/**
|
|
111
|
-
* @type {Record<Lowercase<typeof wellknownHeaderNames[number]>, Buffer>}
|
|
112
|
-
*/
|
|
113
|
-
const wellknownHeaderNameBuffers = {}
|
|
114
|
-
|
|
115
|
-
// Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`.
|
|
116
|
-
Object.setPrototypeOf(wellknownHeaderNameBuffers, null)
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* @param {string} header Lowercased header
|
|
120
|
-
* @returns {Buffer}
|
|
121
|
-
*/
|
|
122
|
-
function getHeaderNameAsBuffer (header) {
|
|
123
|
-
let buffer = wellknownHeaderNameBuffers[header]
|
|
124
|
-
|
|
125
|
-
if (buffer === undefined) {
|
|
126
|
-
buffer = Buffer.from(header)
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
return buffer
|
|
130
|
-
}
|
|
131
|
-
|
|
132
110
|
for (let i = 0; i < wellknownHeaderNames.length; ++i) {
|
|
133
111
|
const key = wellknownHeaderNames[i]
|
|
134
112
|
const lowerCasedKey = key.toLowerCase()
|
|
@@ -138,6 +116,5 @@ for (let i = 0; i < wellknownHeaderNames.length; ++i) {
|
|
|
138
116
|
|
|
139
117
|
module.exports = {
|
|
140
118
|
wellknownHeaderNames,
|
|
141
|
-
headerNameLowerCasedRecord
|
|
142
|
-
getHeaderNameAsBuffer
|
|
119
|
+
headerNameLowerCasedRecord
|
|
143
120
|
}
|
|
@@ -163,8 +163,8 @@ class RequestAbortedError extends AbortError {
|
|
|
163
163
|
|
|
164
164
|
const kInformationalError = Symbol.for('undici.error.UND_ERR_INFO')
|
|
165
165
|
class InformationalError extends UndiciError {
|
|
166
|
-
constructor (message) {
|
|
167
|
-
super(message)
|
|
166
|
+
constructor (message, options) {
|
|
167
|
+
super(message, options)
|
|
168
168
|
this.name = 'InformationalError'
|
|
169
169
|
this.message = message || 'Request information'
|
|
170
170
|
this.code = 'UND_ERR_INFO'
|
|
@@ -403,6 +403,25 @@ class SecureProxyConnectionError extends UndiciError {
|
|
|
403
403
|
}
|
|
404
404
|
}
|
|
405
405
|
|
|
406
|
+
const kProxyConnectionError = Symbol.for('undici.error.UND_ERR_PRX_CONN')
|
|
407
|
+
class ProxyConnectionError extends UndiciError {
|
|
408
|
+
constructor (cause, message, options = {}) {
|
|
409
|
+
super(message, { cause, ...options })
|
|
410
|
+
this.name = 'ProxyConnectionError'
|
|
411
|
+
this.message = message || 'Proxy Connection failed'
|
|
412
|
+
this.code = 'UND_ERR_PRX_CONN'
|
|
413
|
+
this.cause = cause
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
static [Symbol.hasInstance] (instance) {
|
|
417
|
+
return instance && instance[kProxyConnectionError] === true
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
get [kProxyConnectionError] () {
|
|
421
|
+
return true
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
|
|
406
425
|
const kMaxOriginsReachedError = Symbol.for('undici.error.UND_ERR_MAX_ORIGINS_REACHED')
|
|
407
426
|
class MaxOriginsReachedError extends UndiciError {
|
|
408
427
|
constructor (message) {
|
|
@@ -471,6 +490,7 @@ module.exports = {
|
|
|
471
490
|
RequestRetryError,
|
|
472
491
|
ResponseError,
|
|
473
492
|
SecureProxyConnectionError,
|
|
493
|
+
ProxyConnectionError,
|
|
474
494
|
MaxOriginsReachedError,
|
|
475
495
|
Socks5ProxyError,
|
|
476
496
|
MessageSizeExceededError
|