@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
|
@@ -8,6 +8,7 @@ const {
|
|
|
8
8
|
} = require('../core/util')
|
|
9
9
|
|
|
10
10
|
const { serializePathWithQuery } = require('../core/util')
|
|
11
|
+
const { kRequestOrigin } = require('../core/symbols')
|
|
11
12
|
|
|
12
13
|
const MAX_DELTA_SECONDS = 2147483647
|
|
13
14
|
const RESTRICTIVE_DIRECTIVE_NAMES = ['no-store', 'private', 'no-cache']
|
|
@@ -147,8 +148,45 @@ function getMalformedRestrictiveDirectiveName (key) {
|
|
|
147
148
|
/**
|
|
148
149
|
* @param {import('../../types/dispatcher.d.ts').default.DispatchOptions} opts
|
|
149
150
|
*/
|
|
150
|
-
function
|
|
151
|
-
|
|
151
|
+
function getRequestOrigin (opts) {
|
|
152
|
+
const origin = opts[kRequestOrigin] === undefined
|
|
153
|
+
? opts.origin
|
|
154
|
+
: opts[kRequestOrigin]
|
|
155
|
+
return typeof origin === 'string' || origin instanceof URL
|
|
156
|
+
? origin
|
|
157
|
+
: null
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* @param {import('../../types/dispatcher.d.ts').default.DispatchOptions} opts
|
|
162
|
+
* @param {string|null|undefined} interceptorOrigin
|
|
163
|
+
*/
|
|
164
|
+
function getInterceptorOrigin (opts, interceptorOrigin) {
|
|
165
|
+
const requestOrigin = getRequestOrigin(opts)
|
|
166
|
+
if (interceptorOrigin === undefined) {
|
|
167
|
+
return requestOrigin
|
|
168
|
+
}
|
|
169
|
+
if (interceptorOrigin === null) {
|
|
170
|
+
return null
|
|
171
|
+
}
|
|
172
|
+
if (requestOrigin) {
|
|
173
|
+
try {
|
|
174
|
+
if (new URL(requestOrigin).origin !== interceptorOrigin) {
|
|
175
|
+
return null
|
|
176
|
+
}
|
|
177
|
+
} catch {
|
|
178
|
+
return interceptorOrigin
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return interceptorOrigin
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* @param {import('../../types/dispatcher.d.ts').default.DispatchOptions} opts
|
|
186
|
+
* @param {string|URL|null} [origin]
|
|
187
|
+
*/
|
|
188
|
+
function makeCacheKey (opts, origin = getRequestOrigin(opts)) {
|
|
189
|
+
if (!origin) {
|
|
152
190
|
throw new Error('opts.origin is undefined')
|
|
153
191
|
}
|
|
154
192
|
|
|
@@ -159,7 +197,7 @@ function makeCacheKey (opts) {
|
|
|
159
197
|
}
|
|
160
198
|
|
|
161
199
|
return {
|
|
162
|
-
origin:
|
|
200
|
+
origin: origin.toString(),
|
|
163
201
|
method: opts.method,
|
|
164
202
|
path: fullPath,
|
|
165
203
|
headers: opts.headers
|
|
@@ -192,15 +230,57 @@ function normalizeHeaders (opts) {
|
|
|
192
230
|
headers = {}
|
|
193
231
|
|
|
194
232
|
if (hasSafeIterator(opts.headers)) {
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
233
|
+
if (Array.isArray(opts.headers)) {
|
|
234
|
+
// Array format: could be flat alternating [k, v, k, v, ...]
|
|
235
|
+
// or array-of-pairs [[k, v], ...]
|
|
236
|
+
const first = opts.headers[0]
|
|
237
|
+
if (Array.isArray(first)) {
|
|
238
|
+
for (const x of opts.headers) {
|
|
239
|
+
if (!Array.isArray(x)) {
|
|
240
|
+
throw new Error('opts.headers is not a valid header map')
|
|
241
|
+
}
|
|
242
|
+
const [key, val] = x
|
|
243
|
+
if (typeof key !== 'string' || typeof val !== 'string') {
|
|
244
|
+
throw new Error('opts.headers is not a valid header map')
|
|
245
|
+
}
|
|
246
|
+
appendHeader(headers, key, val)
|
|
247
|
+
}
|
|
248
|
+
} else {
|
|
249
|
+
// Flat alternating array [k, v, k, v, ...]
|
|
250
|
+
const len = opts.headers.length
|
|
251
|
+
if (len % 2 !== 0) {
|
|
252
|
+
throw new Error('opts.headers is not a valid header map')
|
|
253
|
+
}
|
|
254
|
+
for (let i = 0; i < len; i += 2) {
|
|
255
|
+
const key = opts.headers[i]
|
|
256
|
+
const val = opts.headers[i + 1]
|
|
257
|
+
if (typeof key !== 'string' || (typeof val !== 'string' && !Array.isArray(val))) {
|
|
258
|
+
throw new Error('opts.headers is not a valid header map')
|
|
259
|
+
}
|
|
260
|
+
if (typeof val === 'string') {
|
|
261
|
+
appendHeader(headers, key, val)
|
|
262
|
+
} else {
|
|
263
|
+
const mapped = []
|
|
264
|
+
for (let j = 0; j < val.length; j++) {
|
|
265
|
+
const v = val[j]
|
|
266
|
+
mapped.push(typeof v === 'string' ? v : v.toString('latin1'))
|
|
267
|
+
}
|
|
268
|
+
appendHeader(headers, key, mapped)
|
|
269
|
+
}
|
|
270
|
+
}
|
|
198
271
|
}
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
272
|
+
} else {
|
|
273
|
+
// Non-array iterable (e.g. Map) — use original iteration logic
|
|
274
|
+
for (const x of opts.headers) {
|
|
275
|
+
if (!Array.isArray(x)) {
|
|
276
|
+
throw new Error('opts.headers is not a valid header map')
|
|
277
|
+
}
|
|
278
|
+
const [key, val] = x
|
|
279
|
+
if (typeof key !== 'string' || typeof val !== 'string') {
|
|
280
|
+
throw new Error('opts.headers is not a valid header map')
|
|
281
|
+
}
|
|
282
|
+
appendHeader(headers, key, val)
|
|
202
283
|
}
|
|
203
|
-
appendHeader(headers, key, val)
|
|
204
284
|
}
|
|
205
285
|
} else {
|
|
206
286
|
for (const key of Object.keys(opts.headers)) {
|
|
@@ -660,6 +740,8 @@ function makeDeduplicationKey (cacheKey, excludeHeaders) {
|
|
|
660
740
|
}
|
|
661
741
|
|
|
662
742
|
module.exports = {
|
|
743
|
+
getInterceptorOrigin,
|
|
744
|
+
getRequestOrigin,
|
|
663
745
|
makeCacheKey,
|
|
664
746
|
normalizeHeaders,
|
|
665
747
|
assertCacheKey,
|
|
@@ -6,9 +6,7 @@
|
|
|
6
6
|
const lazyLoaders = {
|
|
7
7
|
__proto__: null,
|
|
8
8
|
'node:crypto': () => require('node:crypto'),
|
|
9
|
-
'node:sqlite': () => require('node:sqlite')
|
|
10
|
-
'node:worker_threads': () => require('node:worker_threads'),
|
|
11
|
-
'node:zlib': () => require('node:zlib')
|
|
9
|
+
'node:sqlite': () => require('node:sqlite')
|
|
12
10
|
}
|
|
13
11
|
|
|
14
12
|
/**
|
|
@@ -27,35 +25,9 @@ function detectRuntimeFeatureByNodeModule (moduleName) {
|
|
|
27
25
|
}
|
|
28
26
|
}
|
|
29
27
|
|
|
30
|
-
/**
|
|
31
|
-
* @param {NodeModuleName} moduleName
|
|
32
|
-
* @param {string} property
|
|
33
|
-
* @returns {boolean}
|
|
34
|
-
*/
|
|
35
|
-
function detectRuntimeFeatureByExportedProperty (moduleName, property) {
|
|
36
|
-
const module = lazyLoaders[moduleName]()
|
|
37
|
-
return typeof module[property] !== 'undefined'
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
const runtimeFeaturesByExportedProperty = /** @type {const} */ (['markAsUncloneable', 'zstd'])
|
|
41
|
-
|
|
42
|
-
/** @type {Record<RuntimeFeatureByExportedProperty, [NodeModuleName, string]>} */
|
|
43
|
-
const exportedPropertyLookup = {
|
|
44
|
-
markAsUncloneable: ['node:worker_threads', 'markAsUncloneable'],
|
|
45
|
-
zstd: ['node:zlib', 'createZstdDecompress']
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/** @typedef {typeof runtimeFeaturesByExportedProperty[number]} RuntimeFeatureByExportedProperty */
|
|
49
|
-
|
|
50
28
|
const runtimeFeaturesAsNodeModule = /** @type {const} */ (['crypto', 'sqlite'])
|
|
51
29
|
/** @typedef {typeof runtimeFeaturesAsNodeModule[number]} RuntimeFeatureByNodeModule */
|
|
52
|
-
|
|
53
|
-
const features = /** @type {const} */ ([
|
|
54
|
-
...runtimeFeaturesAsNodeModule,
|
|
55
|
-
...runtimeFeaturesByExportedProperty
|
|
56
|
-
])
|
|
57
|
-
|
|
58
|
-
/** @typedef {typeof features[number]} Feature */
|
|
30
|
+
/** @typedef {RuntimeFeatureByNodeModule} Feature */
|
|
59
31
|
|
|
60
32
|
/**
|
|
61
33
|
* @param {Feature} feature
|
|
@@ -64,9 +36,6 @@ const features = /** @type {const} */ ([
|
|
|
64
36
|
function detectRuntimeFeature (feature) {
|
|
65
37
|
if (runtimeFeaturesAsNodeModule.includes(/** @type {RuntimeFeatureByNodeModule} */ (feature))) {
|
|
66
38
|
return detectRuntimeFeatureByNodeModule(`node:${feature}`)
|
|
67
|
-
} else if (runtimeFeaturesByExportedProperty.includes(/** @type {RuntimeFeatureByExportedProperty} */ (feature))) {
|
|
68
|
-
const [moduleName, property] = exportedPropertyLookup[feature]
|
|
69
|
-
return detectRuntimeFeatureByExportedProperty(moduleName, property)
|
|
70
39
|
}
|
|
71
40
|
throw new TypeError(`unknown feature: ${feature}`)
|
|
72
41
|
}
|
|
@@ -101,7 +70,7 @@ class RuntimeFeatures {
|
|
|
101
70
|
* @param {boolean} value
|
|
102
71
|
*/
|
|
103
72
|
set (feature, value) {
|
|
104
|
-
if (
|
|
73
|
+
if (runtimeFeaturesAsNodeModule.includes(feature) === false) {
|
|
105
74
|
throw new TypeError(`unknown feature: ${feature}`)
|
|
106
75
|
}
|
|
107
76
|
this.#map.set(feature, value)
|
|
@@ -10,8 +10,6 @@ const { cloneResponse, fromInnerResponse, getResponseState } = require('../fetch
|
|
|
10
10
|
const { Request, fromInnerRequest, getRequestState } = require('../fetch/request')
|
|
11
11
|
const { fetching } = require('../fetch/index')
|
|
12
12
|
const { urlIsHttpHttpsScheme, readAllBytes } = require('../fetch/util')
|
|
13
|
-
const { createDeferredPromise } = require('../../util/promise')
|
|
14
|
-
|
|
15
13
|
/**
|
|
16
14
|
* @see https://w3c.github.io/ServiceWorker/#dfn-cache-batch-operation
|
|
17
15
|
* @typedef {Object} CacheBatchOperation
|
|
@@ -153,7 +151,7 @@ class Cache {
|
|
|
153
151
|
requestList.push(r)
|
|
154
152
|
|
|
155
153
|
// 5.6
|
|
156
|
-
const responsePromise =
|
|
154
|
+
const responsePromise = Promise.withResolvers()
|
|
157
155
|
|
|
158
156
|
// 5.7
|
|
159
157
|
fetchControllers.push(fetching({
|
|
@@ -231,7 +229,7 @@ class Cache {
|
|
|
231
229
|
}
|
|
232
230
|
|
|
233
231
|
// 7.5
|
|
234
|
-
const cacheJobPromise =
|
|
232
|
+
const cacheJobPromise = Promise.withResolvers()
|
|
235
233
|
|
|
236
234
|
// 7.6.1
|
|
237
235
|
let errorData = null
|
|
@@ -325,7 +323,7 @@ class Cache {
|
|
|
325
323
|
const clonedResponse = cloneResponse(innerResponse)
|
|
326
324
|
|
|
327
325
|
// 10.
|
|
328
|
-
const bodyReadPromise =
|
|
326
|
+
const bodyReadPromise = Promise.withResolvers()
|
|
329
327
|
|
|
330
328
|
// 11.
|
|
331
329
|
if (innerResponse.body != null) {
|
|
@@ -364,7 +362,7 @@ class Cache {
|
|
|
364
362
|
}
|
|
365
363
|
|
|
366
364
|
// 19.1
|
|
367
|
-
const cacheJobPromise =
|
|
365
|
+
const cacheJobPromise = Promise.withResolvers()
|
|
368
366
|
|
|
369
367
|
// 19.2.1
|
|
370
368
|
let errorData = null
|
|
@@ -427,7 +425,7 @@ class Cache {
|
|
|
427
425
|
|
|
428
426
|
operations.push(operation)
|
|
429
427
|
|
|
430
|
-
const cacheJobPromise =
|
|
428
|
+
const cacheJobPromise = Promise.withResolvers()
|
|
431
429
|
|
|
432
430
|
let errorData = null
|
|
433
431
|
let requestResponses
|
|
@@ -483,7 +481,7 @@ class Cache {
|
|
|
483
481
|
}
|
|
484
482
|
|
|
485
483
|
// 4.
|
|
486
|
-
const promise =
|
|
484
|
+
const promise = Promise.withResolvers()
|
|
487
485
|
|
|
488
486
|
// 5.
|
|
489
487
|
// 5.1
|
|
@@ -92,220 +92,224 @@ function parseSetCookie (header) {
|
|
|
92
92
|
* @param {Object.<string, unknown>} [cookieAttributeList={}]
|
|
93
93
|
*/
|
|
94
94
|
function parseUnparsedAttributes (unparsedAttributes, cookieAttributeList = {}) {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
95
|
+
while (true) {
|
|
96
|
+
// 1. If the unparsed-attributes string is empty, skip the rest of
|
|
97
|
+
// these steps.
|
|
98
|
+
if (unparsedAttributes.length === 0) {
|
|
99
|
+
return cookieAttributeList
|
|
100
|
+
}
|
|
100
101
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
102
|
+
// 2. Discard the first character of the unparsed-attributes (which
|
|
103
|
+
// will be a %x3B (";") character).
|
|
104
|
+
assert(unparsedAttributes[0] === ';')
|
|
105
|
+
unparsedAttributes = unparsedAttributes.slice(1)
|
|
105
106
|
|
|
106
|
-
|
|
107
|
+
let cookieAv = ''
|
|
107
108
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
109
|
+
// 3. If the remaining unparsed-attributes contains a %x3B (";")
|
|
110
|
+
// character:
|
|
111
|
+
if (unparsedAttributes.includes(';')) {
|
|
111
112
|
// 1. Consume the characters of the unparsed-attributes up to, but
|
|
112
113
|
// not including, the first %x3B (";") character.
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
114
|
+
cookieAv = collectASequenceOfCodePointsFast(
|
|
115
|
+
';',
|
|
116
|
+
unparsedAttributes,
|
|
117
|
+
{ position: 0 }
|
|
118
|
+
)
|
|
119
|
+
unparsedAttributes = unparsedAttributes.slice(cookieAv.length)
|
|
120
|
+
} else {
|
|
120
121
|
// Otherwise:
|
|
121
122
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
123
|
+
// 1. Consume the remainder of the unparsed-attributes.
|
|
124
|
+
cookieAv = unparsedAttributes
|
|
125
|
+
unparsedAttributes = ''
|
|
126
|
+
}
|
|
126
127
|
|
|
127
|
-
|
|
128
|
+
// Let the cookie-av string be the characters consumed in this step.
|
|
128
129
|
|
|
129
|
-
|
|
130
|
-
|
|
130
|
+
let attributeName = ''
|
|
131
|
+
let attributeValue = ''
|
|
131
132
|
|
|
132
|
-
|
|
133
|
-
|
|
133
|
+
// 4. If the cookie-av string contains a %x3D ("=") character:
|
|
134
|
+
if (cookieAv.includes('=')) {
|
|
134
135
|
// 1. The (possibly empty) attribute-name string consists of the
|
|
135
136
|
// characters up to, but not including, the first %x3D ("=")
|
|
136
137
|
// character, and the (possibly empty) attribute-value string
|
|
137
138
|
// consists of the characters after the first %x3D ("=")
|
|
138
139
|
// character.
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
140
|
+
const position = { position: 0 }
|
|
141
|
+
|
|
142
|
+
attributeName = collectASequenceOfCodePointsFast(
|
|
143
|
+
'=',
|
|
144
|
+
cookieAv,
|
|
145
|
+
position
|
|
146
|
+
)
|
|
147
|
+
attributeValue = cookieAv.slice(position.position + 1)
|
|
148
|
+
} else {
|
|
148
149
|
// Otherwise:
|
|
149
150
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
151
|
+
// 1. The attribute-name string consists of the entire cookie-av
|
|
152
|
+
// string, and the attribute-value string is empty.
|
|
153
|
+
attributeName = cookieAv
|
|
154
|
+
}
|
|
154
155
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
156
|
+
// 5. Remove any leading or trailing WSP characters from the attribute-
|
|
157
|
+
// name string and the attribute-value string.
|
|
158
|
+
attributeName = attributeName.trim()
|
|
159
|
+
attributeValue = attributeValue.trim()
|
|
159
160
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
161
|
+
// 6. If the attribute-value is longer than 1024 octets, ignore the
|
|
162
|
+
// cookie-av string and return to Step 1 of this algorithm.
|
|
163
|
+
if (attributeValue.length > maxAttributeValueSize) {
|
|
164
|
+
continue
|
|
165
|
+
}
|
|
165
166
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
167
|
+
// 7. Process the attribute-name and attribute-value according to the
|
|
168
|
+
// requirements in the following subsections. (Notice that
|
|
169
|
+
// attributes with unrecognized attribute-names are ignored.)
|
|
170
|
+
const attributeNameLowercase = attributeName.toLowerCase()
|
|
170
171
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
172
|
+
// https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.1
|
|
173
|
+
// If the attribute-name case-insensitively matches the string
|
|
174
|
+
// "Expires", the user agent MUST process the cookie-av as follows.
|
|
175
|
+
if (attributeNameLowercase === 'expires') {
|
|
175
176
|
// 1. Let the expiry-time be the result of parsing the attribute-value
|
|
176
177
|
// as cookie-date (see Section 5.1.1).
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
178
|
+
const expiryTime = new Date(attributeValue)
|
|
179
|
+
|
|
180
|
+
// 2. If the attribute-value failed to parse as a cookie date, ignore
|
|
181
|
+
// the cookie-av.
|
|
182
|
+
if (!Number.isNaN(expiryTime.getTime())) {
|
|
183
|
+
cookieAttributeList.expires = expiryTime
|
|
184
|
+
}
|
|
185
|
+
} else if (attributeNameLowercase === 'max-age') {
|
|
184
186
|
// https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.2
|
|
185
187
|
// If the attribute-name case-insensitively matches the string "Max-
|
|
186
188
|
// Age", the user agent MUST process the cookie-av as follows.
|
|
187
189
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
190
|
+
// 1. If the first character of the attribute-value is not a DIGIT or a
|
|
191
|
+
// "-" character, ignore the cookie-av.
|
|
192
|
+
const charCode = attributeValue.charCodeAt(0)
|
|
193
|
+
const startsWithDigit = charCode >= 48 && charCode <= 57
|
|
194
|
+
const startsWithSignedDigit = attributeValue[0] === '-' && attributeValue.length > 1
|
|
195
|
+
|
|
196
|
+
if (!startsWithDigit && !startsWithSignedDigit) {
|
|
197
|
+
continue
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// 2. If the remainder of attribute-value contains a non-DIGIT
|
|
201
|
+
// character, ignore the cookie-av.
|
|
202
|
+
if (/[^\d]/.test(attributeValue.slice(1))) {
|
|
203
|
+
continue
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// 3. Let delta-seconds be the attribute-value converted to an integer.
|
|
207
|
+
const deltaSeconds = Number(attributeValue)
|
|
208
|
+
|
|
209
|
+
// 4. Let cookie-age-limit be the maximum age of the cookie (which
|
|
210
|
+
// SHOULD be 400 days or less, see Section 4.1.2.2).
|
|
211
|
+
|
|
212
|
+
// 5. Set delta-seconds to the smaller of its present value and cookie-
|
|
213
|
+
// age-limit.
|
|
214
|
+
// deltaSeconds = Math.min(deltaSeconds * 1000, maxExpiresMs)
|
|
215
|
+
|
|
216
|
+
// 6. If delta-seconds is less than or equal to zero (0), let expiry-
|
|
217
|
+
// time be the earliest representable date and time. Otherwise, let
|
|
218
|
+
// the expiry-time be the current date and time plus delta-seconds
|
|
219
|
+
// seconds.
|
|
220
|
+
// const expiryTime = deltaSeconds <= 0 ? Date.now() : Date.now() + deltaSeconds
|
|
221
|
+
|
|
222
|
+
// 7. Append an attribute to the cookie-attribute-list with an
|
|
223
|
+
// attribute-name of Max-Age and an attribute-value of expiry-time.
|
|
224
|
+
cookieAttributeList.maxAge = deltaSeconds
|
|
225
|
+
} else if (attributeNameLowercase === 'domain') {
|
|
222
226
|
// https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.3
|
|
223
227
|
// If the attribute-name case-insensitively matches the string "Domain",
|
|
224
228
|
// the user agent MUST process the cookie-av as follows.
|
|
225
229
|
|
|
226
|
-
|
|
227
|
-
|
|
230
|
+
// 1. Let cookie-domain be the attribute-value.
|
|
231
|
+
let cookieDomain = attributeValue
|
|
228
232
|
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
233
|
+
// 2. If cookie-domain starts with %x2E ("."), let cookie-domain be
|
|
234
|
+
// cookie-domain without its leading %x2E (".").
|
|
235
|
+
if (cookieDomain[0] === '.') {
|
|
236
|
+
cookieDomain = cookieDomain.slice(1)
|
|
237
|
+
}
|
|
234
238
|
|
|
235
|
-
|
|
236
|
-
|
|
239
|
+
// 3. Convert the cookie-domain to lower case.
|
|
240
|
+
cookieDomain = cookieDomain.toLowerCase()
|
|
237
241
|
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
+
// 4. Append an attribute to the cookie-attribute-list with an
|
|
243
|
+
// attribute-name of Domain and an attribute-value of cookie-domain.
|
|
244
|
+
cookieAttributeList.domain = cookieDomain
|
|
245
|
+
} else if (attributeNameLowercase === 'path') {
|
|
242
246
|
// https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.4
|
|
243
247
|
// If the attribute-name case-insensitively matches the string "Path",
|
|
244
248
|
// the user agent MUST process the cookie-av as follows.
|
|
245
249
|
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
+
// 1. If the attribute-value is empty or if the first character of the
|
|
251
|
+
// attribute-value is not %x2F ("/"):
|
|
252
|
+
let cookiePath = ''
|
|
253
|
+
if (attributeValue.length === 0 || attributeValue[0] !== '/') {
|
|
250
254
|
// 1. Let cookie-path be the default-path.
|
|
251
|
-
|
|
252
|
-
|
|
255
|
+
cookiePath = '/'
|
|
256
|
+
} else {
|
|
253
257
|
// Otherwise:
|
|
254
258
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
259
|
+
// 1. Let cookie-path be the attribute-value.
|
|
260
|
+
cookiePath = attributeValue
|
|
261
|
+
}
|
|
258
262
|
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
+
// 2. Append an attribute to the cookie-attribute-list with an
|
|
264
|
+
// attribute-name of Path and an attribute-value of cookie-path.
|
|
265
|
+
cookieAttributeList.path = cookiePath
|
|
266
|
+
} else if (attributeNameLowercase === 'secure') {
|
|
263
267
|
// https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.5
|
|
264
268
|
// If the attribute-name case-insensitively matches the string "Secure",
|
|
265
269
|
// the user agent MUST append an attribute to the cookie-attribute-list
|
|
266
270
|
// with an attribute-name of Secure and an empty attribute-value.
|
|
267
271
|
|
|
268
|
-
|
|
269
|
-
|
|
272
|
+
cookieAttributeList.secure = true
|
|
273
|
+
} else if (attributeNameLowercase === 'httponly') {
|
|
270
274
|
// https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.6
|
|
271
275
|
// If the attribute-name case-insensitively matches the string
|
|
272
276
|
// "HttpOnly", the user agent MUST append an attribute to the cookie-
|
|
273
277
|
// attribute-list with an attribute-name of HttpOnly and an empty
|
|
274
278
|
// attribute-value.
|
|
275
279
|
|
|
276
|
-
|
|
277
|
-
|
|
280
|
+
cookieAttributeList.httpOnly = true
|
|
281
|
+
} else if (attributeNameLowercase === 'samesite') {
|
|
278
282
|
// https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.7
|
|
279
283
|
// If the attribute-name case-insensitively matches the string
|
|
280
284
|
// "SameSite", the user agent MUST process the cookie-av as follows:
|
|
281
285
|
|
|
282
|
-
|
|
286
|
+
const attributeValueLowercase = attributeValue.toLowerCase()
|
|
283
287
|
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
288
|
+
// 1. If cookie-av's attribute-value is a case-insensitive match for
|
|
289
|
+
// "None", append an attribute to the cookie-attribute-list with an
|
|
290
|
+
// attribute-name of "SameSite" and an attribute-value of "None".
|
|
291
|
+
if (attributeValueLowercase === 'none') {
|
|
292
|
+
cookieAttributeList.sameSite = 'None'
|
|
293
|
+
} else if (attributeValueLowercase === 'strict') {
|
|
290
294
|
// 2. If cookie-av's attribute-value is a case-insensitive match for
|
|
291
295
|
// "Strict", append an attribute to the cookie-attribute-list with
|
|
292
296
|
// an attribute-name of "SameSite" and an attribute-value of
|
|
293
297
|
// "Strict".
|
|
294
|
-
|
|
295
|
-
|
|
298
|
+
cookieAttributeList.sameSite = 'Strict'
|
|
299
|
+
} else if (attributeValueLowercase === 'lax') {
|
|
296
300
|
// 3. If cookie-av's attribute-value is a case-insensitive match for
|
|
297
301
|
// "Lax", append an attribute to the cookie-attribute-list with an
|
|
298
302
|
// attribute-name of "SameSite" and an attribute-value of "Lax".
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
+
cookieAttributeList.sameSite = 'Lax'
|
|
304
|
+
}
|
|
305
|
+
} else {
|
|
306
|
+
cookieAttributeList.unparsed ??= []
|
|
303
307
|
|
|
304
|
-
|
|
305
|
-
|
|
308
|
+
cookieAttributeList.unparsed.push(`${attributeName}=${attributeValue}`)
|
|
309
|
+
}
|
|
306
310
|
|
|
307
311
|
// 8. Return to Step 1 of this algorithm.
|
|
308
|
-
|
|
312
|
+
}
|
|
309
313
|
}
|
|
310
314
|
|
|
311
315
|
module.exports = {
|
|
@@ -105,7 +105,7 @@ function validateCookiePath (path) {
|
|
|
105
105
|
|
|
106
106
|
if (
|
|
107
107
|
code < 0x20 || // exclude CTLs (0-31)
|
|
108
|
-
code > 0x7E || // exclude
|
|
108
|
+
code > 0x7E || // exclude non-ascii and DEL
|
|
109
109
|
code === 0x3B // ;
|
|
110
110
|
) {
|
|
111
111
|
throw new Error('Invalid cookie path')
|