@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
|
@@ -11,7 +11,7 @@ const {
|
|
|
11
11
|
getResponseState
|
|
12
12
|
} = require('./response')
|
|
13
13
|
const { HeadersList } = require('./headers')
|
|
14
|
-
const { Request, cloneRequest, getRequestDispatcher, getRequestState } = require('./request')
|
|
14
|
+
const { Request, cloneRequest, getRequestDispatcher, getRequestState, removeRequestAbortListener } = require('./request')
|
|
15
15
|
const zlib = require('node:zlib')
|
|
16
16
|
const {
|
|
17
17
|
makePolicyContainer,
|
|
@@ -59,17 +59,13 @@ const {
|
|
|
59
59
|
const EE = require('node:events')
|
|
60
60
|
const { Readable, pipeline, finished, isErrored, isReadable } = require('node:stream')
|
|
61
61
|
const { addAbortListener, bufferToLowerCasedHeaderName } = require('../../core/util')
|
|
62
|
+
const { SocketError } = require('../../core/errors')
|
|
62
63
|
const { dataURLProcessor, serializeAMimeType, minimizeSupportedMimeType } = require('./data-url')
|
|
63
64
|
const { getGlobalDispatcher } = require('../../global')
|
|
64
65
|
const { webidl } = require('../webidl')
|
|
65
66
|
const { STATUS_CODES } = require('node:http')
|
|
66
67
|
const { bytesMatch } = require('../subresource-integrity/subresource-integrity')
|
|
67
|
-
const { createDeferredPromise } = require('../../util/promise')
|
|
68
68
|
const { isomorphicEncode } = require('../infra')
|
|
69
|
-
const { runtimeFeatures } = require('../../util/runtime-features')
|
|
70
|
-
|
|
71
|
-
// Node.js v23.8.0+ and v22.15.0+ supports Zstandard
|
|
72
|
-
const hasZstd = runtimeFeatures.has('zstd')
|
|
73
69
|
|
|
74
70
|
const GET_OR_HEAD = ['GET', 'HEAD']
|
|
75
71
|
|
|
@@ -80,6 +76,35 @@ const defaultUserAgent = typeof __UNDICI_IS_NODE__ !== 'undefined' || typeof esb
|
|
|
80
76
|
/** @type {import('buffer').resolveObjectURL} */
|
|
81
77
|
let resolveObjectURL
|
|
82
78
|
|
|
79
|
+
function appendHeadersListFromResponseHeaders (headersList, headers, rawHeaders) {
|
|
80
|
+
if (Array.isArray(rawHeaders)) {
|
|
81
|
+
for (let i = 0; i < rawHeaders.length; i += 2) {
|
|
82
|
+
const nameStr = bufferToLowerCasedHeaderName(rawHeaders[i])
|
|
83
|
+
const value = rawHeaders[i + 1]
|
|
84
|
+
|
|
85
|
+
if (Array.isArray(value) && !Buffer.isBuffer(value)) {
|
|
86
|
+
for (const val of value) {
|
|
87
|
+
headersList.append(nameStr, val.toString('latin1'), true)
|
|
88
|
+
}
|
|
89
|
+
} else {
|
|
90
|
+
headersList.append(nameStr, value.toString('latin1'), true)
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
for (const [name, value] of Object.entries(headers ?? {})) {
|
|
98
|
+
if (Array.isArray(value)) {
|
|
99
|
+
for (const entry of value) {
|
|
100
|
+
headersList.append(name, `${entry}`, true)
|
|
101
|
+
}
|
|
102
|
+
} else {
|
|
103
|
+
headersList.append(name, `${value}`, true)
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
83
108
|
class Fetch extends EE {
|
|
84
109
|
constructor (dispatcher) {
|
|
85
110
|
super()
|
|
@@ -136,7 +161,7 @@ function fetch (input, init = undefined) {
|
|
|
136
161
|
webidl.argumentLengthCheck(arguments, 1, 'globalThis.fetch')
|
|
137
162
|
|
|
138
163
|
// 1. Let p be a new promise.
|
|
139
|
-
let p =
|
|
164
|
+
let p = Promise.withResolvers()
|
|
140
165
|
|
|
141
166
|
// 2. Let requestObject be the result of invoking the initial value of
|
|
142
167
|
// Request as constructor with input and init as arguments. If this throws
|
|
@@ -184,7 +209,7 @@ function fetch (input, init = undefined) {
|
|
|
184
209
|
let controller = null
|
|
185
210
|
|
|
186
211
|
// 11. Add the following abort steps to requestObject’s signal:
|
|
187
|
-
addAbortListener(
|
|
212
|
+
const removeAbortListener = addAbortListener(
|
|
188
213
|
requestObject.signal,
|
|
189
214
|
() => {
|
|
190
215
|
// 1. Set locallyAborted to true.
|
|
@@ -204,6 +229,15 @@ function fetch (input, init = undefined) {
|
|
|
204
229
|
}
|
|
205
230
|
)
|
|
206
231
|
|
|
232
|
+
// Remove the `abort` listeners registered above and in the Request
|
|
233
|
+
// constructor once the fetch has settled. Without this, reusing a single
|
|
234
|
+
// signal across many requests leaks listeners and Node.js emits a
|
|
235
|
+
// MaxListenersExceededWarning. See https://github.com/nodejs/undici/issues/5285
|
|
236
|
+
const cleanupAbortListeners = () => {
|
|
237
|
+
removeAbortListener()
|
|
238
|
+
removeRequestAbortListener(requestObject)
|
|
239
|
+
}
|
|
240
|
+
|
|
207
241
|
// 12. Let handleFetchDone given response response be to finalize and
|
|
208
242
|
// report timing with response, globalObject, and "fetch".
|
|
209
243
|
// see function handleFetchDone
|
|
@@ -228,6 +262,7 @@ function fetch (input, init = undefined) {
|
|
|
228
262
|
// deserializedError.
|
|
229
263
|
|
|
230
264
|
abortFetch(p, request, responseObject, controller.serializedAbortReason, controller.controller)
|
|
265
|
+
cleanupAbortListeners()
|
|
231
266
|
return
|
|
232
267
|
}
|
|
233
268
|
|
|
@@ -235,6 +270,7 @@ function fetch (input, init = undefined) {
|
|
|
235
270
|
// and terminate these substeps.
|
|
236
271
|
if (response.type === 'error') {
|
|
237
272
|
p.reject(new TypeError('fetch failed', { cause: response.error }))
|
|
273
|
+
cleanupAbortListeners()
|
|
238
274
|
return
|
|
239
275
|
}
|
|
240
276
|
|
|
@@ -249,7 +285,10 @@ function fetch (input, init = undefined) {
|
|
|
249
285
|
|
|
250
286
|
controller = fetching({
|
|
251
287
|
request,
|
|
252
|
-
processResponseEndOfBody:
|
|
288
|
+
processResponseEndOfBody: (response) => {
|
|
289
|
+
handleFetchDone(response)
|
|
290
|
+
cleanupAbortListeners()
|
|
291
|
+
},
|
|
253
292
|
processResponse,
|
|
254
293
|
dispatcher: getRequestDispatcher(requestObject), // undici
|
|
255
294
|
// Keep requestObject alive to prevent its AbortController from being GC'd
|
|
@@ -1393,7 +1432,16 @@ async function httpNetworkOrCacheFetch (
|
|
|
1393
1432
|
// Otherwise:
|
|
1394
1433
|
|
|
1395
1434
|
// 1. Set httpRequest to a clone of request.
|
|
1396
|
-
|
|
1435
|
+
// Implementations are encouraged to avoid teeing request’s body’s stream
|
|
1436
|
+
// when request’s body’s source is null as only a single body is needed in
|
|
1437
|
+
// that case. E.g., when request’s body’s source is null, redirects and
|
|
1438
|
+
// authentication will end up failing the fetch.
|
|
1439
|
+
if (request.body?.source != null) {
|
|
1440
|
+
httpRequest = cloneRequest(request)
|
|
1441
|
+
} else {
|
|
1442
|
+
httpRequest = cloneRequest({ ...request, body: null })
|
|
1443
|
+
httpRequest.body = request.body
|
|
1444
|
+
}
|
|
1397
1445
|
|
|
1398
1446
|
// 2. Set httpFetchParams to a copy of fetchParams.
|
|
1399
1447
|
httpFetchParams = { ...fetchParams }
|
|
@@ -1522,7 +1570,7 @@ async function httpNetworkOrCacheFetch (
|
|
|
1522
1570
|
// TODO: https://github.com/whatwg/fetch/issues/1285#issuecomment-896560129
|
|
1523
1571
|
if (!httpRequest.headersList.contains('accept-encoding', true)) {
|
|
1524
1572
|
if (urlHasHttpsScheme(requestCurrentURL(httpRequest))) {
|
|
1525
|
-
httpRequest.headersList.append('accept-encoding', 'br, gzip, deflate', true)
|
|
1573
|
+
httpRequest.headersList.append('accept-encoding', 'br, gzip, deflate, zstd', true)
|
|
1526
1574
|
} else {
|
|
1527
1575
|
httpRequest.headersList.append('accept-encoding', 'gzip, deflate', true)
|
|
1528
1576
|
}
|
|
@@ -2151,257 +2199,228 @@ async function httpNetworkFetch (
|
|
|
2151
2199
|
const path = url.pathname + url.search
|
|
2152
2200
|
const hasTrailingQuestionMark = url.search.length === 0 && url.href[url.href.length - url.hash.length - 1] === '?'
|
|
2153
2201
|
|
|
2154
|
-
return
|
|
2155
|
-
|
|
2156
|
-
|
|
2157
|
-
|
|
2158
|
-
|
|
2159
|
-
|
|
2160
|
-
|
|
2161
|
-
|
|
2162
|
-
|
|
2163
|
-
|
|
2164
|
-
|
|
2165
|
-
|
|
2166
|
-
|
|
2167
|
-
|
|
2168
|
-
|
|
2169
|
-
// TODO (fix): Do we need connection here?
|
|
2170
|
-
const { connection } = fetchParams.controller
|
|
2171
|
-
|
|
2172
|
-
// Set timingInfo’s final connection timing info to the result of calling clamp and coarsen
|
|
2173
|
-
// connection timing info with connection’s timing info, timingInfo’s post-redirect start
|
|
2174
|
-
// time, and fetchParams’s cross-origin isolated capability.
|
|
2175
|
-
// TODO: implement connection timing
|
|
2176
|
-
timingInfo.finalConnectionTimingInfo = clampAndCoarsenConnectionTimingInfo(undefined, timingInfo.postRedirectStartTime, fetchParams.crossOriginIsolatedCapability)
|
|
2177
|
-
|
|
2178
|
-
if (connection.destroyed) {
|
|
2179
|
-
abort(new DOMException('The operation was aborted.', 'AbortError'))
|
|
2180
|
-
} else {
|
|
2181
|
-
fetchParams.controller.on('terminated', abort)
|
|
2182
|
-
this.abort = connection.abort = abort
|
|
2183
|
-
}
|
|
2184
|
-
|
|
2185
|
-
// Set timingInfo’s final network-request start time to the coarsened shared current time given
|
|
2186
|
-
// fetchParams’s cross-origin isolated capability.
|
|
2187
|
-
timingInfo.finalNetworkRequestStartTime = coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability)
|
|
2202
|
+
return dispatchWithProtocolPreference(body)
|
|
2203
|
+
|
|
2204
|
+
function dispatchWithProtocolPreference (body, allowH2) {
|
|
2205
|
+
return new Promise((resolve, reject) => agent.dispatch(
|
|
2206
|
+
{
|
|
2207
|
+
path: hasTrailingQuestionMark ? `${path}?` : path,
|
|
2208
|
+
origin: url.origin,
|
|
2209
|
+
method: request.method,
|
|
2210
|
+
body: agent.isMockActive ? request.body && (request.body.source || request.body.stream) : body,
|
|
2211
|
+
// Preserve the serialized fetch body for MockAgent net-connect fallthroughs.
|
|
2212
|
+
__mockAgentBodyForDispatch: body,
|
|
2213
|
+
headers: request.headersList.entries,
|
|
2214
|
+
maxRedirections: 0,
|
|
2215
|
+
upgrade: request.mode === 'websocket' ? 'websocket' : undefined,
|
|
2216
|
+
...(allowH2 === false ? { allowH2 } : null)
|
|
2188
2217
|
},
|
|
2218
|
+
{
|
|
2219
|
+
body: null,
|
|
2220
|
+
abort: null,
|
|
2189
2221
|
|
|
2190
|
-
|
|
2191
|
-
|
|
2192
|
-
|
|
2193
|
-
// user agent’s HTTP parser receives the first byte of the response (e.g., frame header
|
|
2194
|
-
// bytes for HTTP/2 or response status line for HTTP/1.x).
|
|
2195
|
-
timingInfo.finalNetworkResponseStartTime = coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability)
|
|
2196
|
-
},
|
|
2222
|
+
onRequestStart (controller) {
|
|
2223
|
+
// TODO (fix): Do we need connection here?
|
|
2224
|
+
const { connection } = fetchParams.controller
|
|
2197
2225
|
|
|
2198
|
-
|
|
2199
|
-
|
|
2200
|
-
|
|
2201
|
-
|
|
2226
|
+
// Set timingInfo’s final connection timing info to the result of calling clamp and coarsen
|
|
2227
|
+
// connection timing info with connection’s timing info, timingInfo’s post-redirect start
|
|
2228
|
+
// time, and fetchParams’s cross-origin isolated capability.
|
|
2229
|
+
// TODO: implement connection timing
|
|
2230
|
+
timingInfo.finalConnectionTimingInfo = clampAndCoarsenConnectionTimingInfo(undefined, timingInfo.postRedirectStartTime, fetchParams.crossOriginIsolatedCapability)
|
|
2202
2231
|
|
|
2203
|
-
|
|
2232
|
+
const abort = (reason) => controller.abort(reason)
|
|
2204
2233
|
|
|
2205
|
-
|
|
2206
|
-
|
|
2207
|
-
const value = rawHeaders[i + 1]
|
|
2208
|
-
if (Array.isArray(value) && !Buffer.isBuffer(rawHeaders[i + 1])) {
|
|
2209
|
-
for (const val of value) {
|
|
2210
|
-
headersList.append(nameStr, val.toString('latin1'), true)
|
|
2211
|
-
}
|
|
2234
|
+
if (connection.destroyed) {
|
|
2235
|
+
abort(new DOMException('The operation was aborted.', 'AbortError'))
|
|
2212
2236
|
} else {
|
|
2213
|
-
|
|
2237
|
+
fetchParams.controller.on('terminated', abort)
|
|
2238
|
+
this.abort = connection.abort = abort
|
|
2214
2239
|
}
|
|
2215
|
-
}
|
|
2216
|
-
const location = headersList.get('location', true)
|
|
2217
|
-
|
|
2218
|
-
this.body = new Readable({ read: resume })
|
|
2219
|
-
|
|
2220
|
-
const willFollow = location && request.redirect === 'follow' &&
|
|
2221
|
-
redirectStatusSet.has(status)
|
|
2222
|
-
|
|
2223
|
-
const decoders = []
|
|
2224
2240
|
|
|
2225
|
-
|
|
2226
|
-
|
|
2227
|
-
|
|
2228
|
-
|
|
2229
|
-
|
|
2230
|
-
|
|
2231
|
-
|
|
2232
|
-
|
|
2233
|
-
//
|
|
2234
|
-
//
|
|
2235
|
-
|
|
2236
|
-
|
|
2237
|
-
|
|
2238
|
-
|
|
2241
|
+
// Set timingInfo’s final network-request start time to the coarsened shared current time given
|
|
2242
|
+
// fetchParams’s cross-origin isolated capability.
|
|
2243
|
+
timingInfo.finalNetworkRequestStartTime = coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability)
|
|
2244
|
+
},
|
|
2245
|
+
|
|
2246
|
+
onResponseStarted () {
|
|
2247
|
+
// Set timingInfo’s final network-response start time to the coarsened shared current
|
|
2248
|
+
// time given fetchParams’s cross-origin isolated capability, immediately after the
|
|
2249
|
+
// user agent’s HTTP parser receives the first byte of the response (e.g., frame header
|
|
2250
|
+
// bytes for HTTP/2 or response status line for HTTP/1.x).
|
|
2251
|
+
timingInfo.finalNetworkResponseStartTime = coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability)
|
|
2252
|
+
},
|
|
2253
|
+
|
|
2254
|
+
onResponseStart (controller, status, headers, statusText) {
|
|
2255
|
+
if (status < 200) {
|
|
2256
|
+
return
|
|
2239
2257
|
}
|
|
2240
2258
|
|
|
2241
|
-
|
|
2242
|
-
|
|
2243
|
-
|
|
2244
|
-
|
|
2245
|
-
decoders.push(zlib.createGunzip({
|
|
2246
|
-
// Be less strict when decoding compressed responses, since sometimes
|
|
2247
|
-
// servers send slightly invalid responses that are still accepted
|
|
2248
|
-
// by common browsers.
|
|
2249
|
-
// Always using Z_SYNC_FLUSH is what cURL does.
|
|
2250
|
-
flush: zlib.constants.Z_SYNC_FLUSH,
|
|
2251
|
-
finishFlush: zlib.constants.Z_SYNC_FLUSH
|
|
2252
|
-
}))
|
|
2253
|
-
} else if (coding === 'deflate') {
|
|
2254
|
-
decoders.push(createInflate({
|
|
2255
|
-
flush: zlib.constants.Z_SYNC_FLUSH,
|
|
2256
|
-
finishFlush: zlib.constants.Z_SYNC_FLUSH
|
|
2257
|
-
}))
|
|
2258
|
-
} else if (coding === 'br') {
|
|
2259
|
-
decoders.push(zlib.createBrotliDecompress({
|
|
2260
|
-
flush: zlib.constants.BROTLI_OPERATION_FLUSH,
|
|
2261
|
-
finishFlush: zlib.constants.BROTLI_OPERATION_FLUSH
|
|
2262
|
-
}))
|
|
2263
|
-
} else if (coding === 'zstd' && hasZstd) {
|
|
2264
|
-
decoders.push(zlib.createZstdDecompress({
|
|
2265
|
-
flush: zlib.constants.ZSTD_e_continue,
|
|
2266
|
-
finishFlush: zlib.constants.ZSTD_e_end
|
|
2267
|
-
}))
|
|
2268
|
-
} else {
|
|
2269
|
-
decoders.length = 0
|
|
2270
|
-
break
|
|
2271
|
-
}
|
|
2272
|
-
}
|
|
2273
|
-
}
|
|
2259
|
+
const rawHeaders = controller?.rawHeaders ?? []
|
|
2260
|
+
const headersList = new HeadersList()
|
|
2261
|
+
appendHeadersListFromResponseHeaders(headersList, headers, rawHeaders)
|
|
2262
|
+
const location = headersList.get('location', true)
|
|
2274
2263
|
|
|
2275
|
-
|
|
2264
|
+
this.body = new Readable({ read: () => controller.resume() })
|
|
2276
2265
|
|
|
2277
|
-
|
|
2278
|
-
|
|
2279
|
-
statusText,
|
|
2280
|
-
headersList,
|
|
2281
|
-
body: decoders.length
|
|
2282
|
-
? pipeline(this.body, ...decoders, (err) => {
|
|
2283
|
-
if (err) {
|
|
2284
|
-
this.onError(err)
|
|
2285
|
-
}
|
|
2286
|
-
}).on('error', onError)
|
|
2287
|
-
: this.body.on('error', onError)
|
|
2288
|
-
})
|
|
2289
|
-
|
|
2290
|
-
return true
|
|
2291
|
-
},
|
|
2292
|
-
|
|
2293
|
-
onData (chunk) {
|
|
2294
|
-
if (fetchParams.controller.dump) {
|
|
2295
|
-
return
|
|
2296
|
-
}
|
|
2266
|
+
const willFollow = location && request.redirect === 'follow' &&
|
|
2267
|
+
redirectStatusSet.has(status)
|
|
2297
2268
|
|
|
2298
|
-
|
|
2299
|
-
// message body, then:
|
|
2269
|
+
const decoders = []
|
|
2300
2270
|
|
|
2301
|
-
|
|
2302
|
-
|
|
2271
|
+
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding
|
|
2272
|
+
if (request.method !== 'HEAD' && request.method !== 'CONNECT' && !nullBodyStatus.includes(status) && !willFollow) {
|
|
2273
|
+
// https://www.rfc-editor.org/rfc/rfc7231#section-3.1.2.1
|
|
2274
|
+
const contentEncoding = headersList.get('content-encoding', true)
|
|
2275
|
+
// "All content-coding values are case-insensitive..."
|
|
2276
|
+
/** @type {string[]} */
|
|
2277
|
+
const codings = contentEncoding ? contentEncoding.toLowerCase().split(',') : []
|
|
2303
2278
|
|
|
2304
|
-
|
|
2305
|
-
|
|
2306
|
-
|
|
2307
|
-
|
|
2308
|
-
|
|
2309
|
-
|
|
2279
|
+
// Limit the number of content-encodings to prevent resource exhaustion.
|
|
2280
|
+
// CVE fix similar to urllib3 (GHSA-gm62-xv2j-4w53) and curl (CVE-2022-32206).
|
|
2281
|
+
const maxContentEncodings = 5
|
|
2282
|
+
if (codings.length > maxContentEncodings) {
|
|
2283
|
+
reject(new Error(`too many content-encodings in response: ${codings.length}, maximum allowed is ${maxContentEncodings}`))
|
|
2284
|
+
return
|
|
2285
|
+
}
|
|
2310
2286
|
|
|
2311
|
-
|
|
2287
|
+
for (let i = codings.length - 1; i >= 0; --i) {
|
|
2288
|
+
const coding = codings[i].trim()
|
|
2289
|
+
// https://www.rfc-editor.org/rfc/rfc9112.html#section-7.2
|
|
2290
|
+
if (coding === 'x-gzip' || coding === 'gzip') {
|
|
2291
|
+
decoders.push(zlib.createGunzip({
|
|
2292
|
+
// Be less strict when decoding compressed responses, since sometimes
|
|
2293
|
+
// servers send slightly invalid responses that are still accepted
|
|
2294
|
+
// by common browsers.
|
|
2295
|
+
// Always using Z_SYNC_FLUSH is what cURL does.
|
|
2296
|
+
flush: zlib.constants.Z_SYNC_FLUSH,
|
|
2297
|
+
finishFlush: zlib.constants.Z_SYNC_FLUSH
|
|
2298
|
+
}))
|
|
2299
|
+
} else if (coding === 'deflate') {
|
|
2300
|
+
decoders.push(createInflate({
|
|
2301
|
+
flush: zlib.constants.Z_SYNC_FLUSH,
|
|
2302
|
+
finishFlush: zlib.constants.Z_SYNC_FLUSH
|
|
2303
|
+
}))
|
|
2304
|
+
} else if (coding === 'br') {
|
|
2305
|
+
decoders.push(zlib.createBrotliDecompress({
|
|
2306
|
+
flush: zlib.constants.BROTLI_OPERATION_FLUSH,
|
|
2307
|
+
finishFlush: zlib.constants.BROTLI_OPERATION_FLUSH
|
|
2308
|
+
}))
|
|
2309
|
+
} else if (coding === 'zstd') {
|
|
2310
|
+
decoders.push(zlib.createZstdDecompress({
|
|
2311
|
+
flush: zlib.constants.ZSTD_e_continue,
|
|
2312
|
+
finishFlush: zlib.constants.ZSTD_e_end
|
|
2313
|
+
}))
|
|
2314
|
+
} else {
|
|
2315
|
+
decoders.length = 0
|
|
2316
|
+
break
|
|
2317
|
+
}
|
|
2318
|
+
}
|
|
2319
|
+
}
|
|
2312
2320
|
|
|
2313
|
-
|
|
2314
|
-
|
|
2321
|
+
const onError = (err) => this.onResponseError(controller, err)
|
|
2322
|
+
|
|
2323
|
+
resolve({
|
|
2324
|
+
status,
|
|
2325
|
+
statusText,
|
|
2326
|
+
headersList,
|
|
2327
|
+
body: decoders.length
|
|
2328
|
+
? pipeline(this.body, ...decoders, (err) => {
|
|
2329
|
+
if (err) {
|
|
2330
|
+
this.onResponseError(controller, err)
|
|
2331
|
+
}
|
|
2332
|
+
}).on('error', onError)
|
|
2333
|
+
: this.body.on('error', onError)
|
|
2334
|
+
})
|
|
2335
|
+
},
|
|
2336
|
+
|
|
2337
|
+
onResponseData (controller, chunk) {
|
|
2338
|
+
if (fetchParams.controller.dump) {
|
|
2339
|
+
return
|
|
2340
|
+
}
|
|
2315
2341
|
|
|
2316
|
-
|
|
2317
|
-
|
|
2318
|
-
fetchParams.controller.off('terminated', this.abort)
|
|
2319
|
-
}
|
|
2342
|
+
// 1. If one or more bytes have been transmitted from response’s
|
|
2343
|
+
// message body, then:
|
|
2320
2344
|
|
|
2321
|
-
|
|
2345
|
+
// 1. Let bytes be the transmitted bytes.
|
|
2346
|
+
const bytes = chunk
|
|
2322
2347
|
|
|
2323
|
-
|
|
2324
|
-
|
|
2348
|
+
// 2. Let codings be the result of extracting header list values
|
|
2349
|
+
// given `Content-Encoding` and response’s header list.
|
|
2350
|
+
// See pullAlgorithm.
|
|
2325
2351
|
|
|
2326
|
-
|
|
2327
|
-
|
|
2328
|
-
fetchParams.controller.off('terminated', this.abort)
|
|
2329
|
-
}
|
|
2352
|
+
// 3. Increase timingInfo’s encoded body size by bytes’s length.
|
|
2353
|
+
timingInfo.encodedBodySize += bytes.byteLength
|
|
2330
2354
|
|
|
2331
|
-
|
|
2355
|
+
// 4. See pullAlgorithm...
|
|
2332
2356
|
|
|
2333
|
-
|
|
2357
|
+
if (this.body.push(bytes) === false) {
|
|
2358
|
+
controller.pause()
|
|
2359
|
+
}
|
|
2360
|
+
},
|
|
2334
2361
|
|
|
2335
|
-
|
|
2336
|
-
|
|
2362
|
+
onResponseEnd () {
|
|
2363
|
+
if (this.abort) {
|
|
2364
|
+
fetchParams.controller.off('terminated', this.abort)
|
|
2365
|
+
}
|
|
2337
2366
|
|
|
2338
|
-
|
|
2339
|
-
// We need to support 200 for websocket over h2 as per RFC-8441
|
|
2340
|
-
// Absence of session means H1
|
|
2341
|
-
if ((socket.session != null && status !== 200) || (socket.session == null && status !== 101)) {
|
|
2342
|
-
return false
|
|
2343
|
-
}
|
|
2367
|
+
fetchParams.controller.ended = true
|
|
2344
2368
|
|
|
2345
|
-
|
|
2369
|
+
this.body?.push(null)
|
|
2370
|
+
},
|
|
2346
2371
|
|
|
2347
|
-
|
|
2348
|
-
if (
|
|
2349
|
-
|
|
2372
|
+
onResponseError (_controller, error) {
|
|
2373
|
+
if (this.abort) {
|
|
2374
|
+
fetchParams.controller.off('terminated', this.abort)
|
|
2350
2375
|
}
|
|
2351
2376
|
|
|
2352
|
-
|
|
2353
|
-
|
|
2354
|
-
|
|
2355
|
-
|
|
2356
|
-
|
|
2357
|
-
|
|
2358
|
-
|
|
2359
|
-
|
|
2377
|
+
if (
|
|
2378
|
+
request.mode === 'websocket' &&
|
|
2379
|
+
allowH2 !== false &&
|
|
2380
|
+
error?.code === 'UND_ERR_INFO' &&
|
|
2381
|
+
error?.message === 'HTTP/2: Extended CONNECT protocol not supported by server'
|
|
2382
|
+
) {
|
|
2383
|
+
// The origin negotiated H2, but RFC 8441 websocket support is unavailable.
|
|
2384
|
+
// Retry the opening handshake on a fresh HTTP/1.1-only connection instead.
|
|
2385
|
+
resolve(dispatchWithProtocolPreference(body, false))
|
|
2386
|
+
return
|
|
2360
2387
|
}
|
|
2361
|
-
}
|
|
2362
2388
|
|
|
2363
|
-
|
|
2364
|
-
status,
|
|
2365
|
-
statusText: STATUS_CODES[status],
|
|
2366
|
-
headersList,
|
|
2367
|
-
socket
|
|
2368
|
-
})
|
|
2369
|
-
|
|
2370
|
-
return true
|
|
2371
|
-
},
|
|
2389
|
+
this.body?.destroy(error)
|
|
2372
2390
|
|
|
2373
|
-
|
|
2374
|
-
// We need to support 200 for websocket over h2 as per RFC-8441
|
|
2375
|
-
// Absence of session means H1
|
|
2376
|
-
if ((socket.session != null && status !== 200) || (socket.session == null && status !== 101)) {
|
|
2377
|
-
return false
|
|
2378
|
-
}
|
|
2391
|
+
fetchParams.controller.terminate(error)
|
|
2379
2392
|
|
|
2380
|
-
|
|
2393
|
+
reject(error)
|
|
2394
|
+
},
|
|
2381
2395
|
|
|
2382
|
-
|
|
2383
|
-
|
|
2384
|
-
|
|
2385
|
-
if (
|
|
2386
|
-
|
|
2387
|
-
|
|
2396
|
+
onRequestUpgrade (controller, status, headers, socket) {
|
|
2397
|
+
// We need to support 200 for websocket over h2 as per RFC-8441
|
|
2398
|
+
// Absence of session means H1
|
|
2399
|
+
if ((socket.session != null && status !== 200) || (socket.session == null && status !== 101)) {
|
|
2400
|
+
if (socket.session != null) {
|
|
2401
|
+
// The server refused the extended CONNECT, and nothing further
|
|
2402
|
+
// will settle this request. Fail the opening handshake here.
|
|
2403
|
+
controller.abort(new SocketError('bad upgrade', null))
|
|
2388
2404
|
}
|
|
2389
|
-
|
|
2390
|
-
headersList.append(nameStr, value.toString('latin1'), true)
|
|
2405
|
+
return false
|
|
2391
2406
|
}
|
|
2392
|
-
}
|
|
2393
2407
|
|
|
2394
|
-
|
|
2395
|
-
|
|
2396
|
-
|
|
2397
|
-
|
|
2398
|
-
|
|
2399
|
-
|
|
2408
|
+
const rawHeaders = controller?.rawHeaders ?? []
|
|
2409
|
+
const headersList = new HeadersList()
|
|
2410
|
+
appendHeadersListFromResponseHeaders(headersList, headers, rawHeaders)
|
|
2411
|
+
|
|
2412
|
+
resolve({
|
|
2413
|
+
status,
|
|
2414
|
+
statusText: STATUS_CODES[status],
|
|
2415
|
+
headersList,
|
|
2416
|
+
socket
|
|
2417
|
+
})
|
|
2400
2418
|
|
|
2401
|
-
|
|
2419
|
+
return true
|
|
2420
|
+
}
|
|
2402
2421
|
}
|
|
2403
|
-
|
|
2404
|
-
|
|
2422
|
+
))
|
|
2423
|
+
}
|
|
2405
2424
|
}
|
|
2406
2425
|
}
|
|
2407
2426
|
|