@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,109 +1,210 @@
|
|
|
1
|
-
#
|
|
1
|
+
# MockPool
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
<!--introduced_in=v4.0.0-->
|
|
4
|
+
<!--type=module-->
|
|
5
|
+
<!-- source_link=lib/mock/mock-pool.js -->
|
|
4
6
|
|
|
5
|
-
|
|
7
|
+
> Stability: 2 - Stable
|
|
6
8
|
|
|
7
|
-
|
|
9
|
+
A `MockPool` is a [`Pool`][] that intercepts requests matching registered routes
|
|
10
|
+
and replies with mocked responses instead of contacting the network. It is
|
|
11
|
+
created by a [`MockAgent`][] and exposes the same interception API as
|
|
12
|
+
[`MockClient`][].
|
|
8
13
|
|
|
9
|
-
|
|
14
|
+
A `MockPool` is not constructed directly in most cases; instead it is obtained
|
|
15
|
+
through [`mockAgent.get(origin)`][]. Once registered as the global dispatcher,
|
|
16
|
+
any request whose origin matches the pool is matched against the mocks it holds.
|
|
10
17
|
|
|
11
|
-
|
|
12
|
-
* **options** `MockPoolOptions` - It extends the `Pool` options.
|
|
13
|
-
|
|
14
|
-
Returns: `MockPool`
|
|
15
|
-
|
|
16
|
-
### Parameter: `MockPoolOptions`
|
|
17
|
-
|
|
18
|
-
Extends: `PoolOptions`
|
|
19
|
-
|
|
20
|
-
* **agent** `Agent` - the agent to associate this MockPool with.
|
|
21
|
-
|
|
22
|
-
### Example - Basic MockPool instantiation
|
|
23
|
-
|
|
24
|
-
We can use MockAgent to instantiate a MockPool ready to be used to intercept specified requests. It will not do anything until registered as the agent to use and any mock request are registered.
|
|
25
|
-
|
|
26
|
-
```js
|
|
18
|
+
```mjs
|
|
27
19
|
import { MockAgent } from 'undici'
|
|
28
20
|
|
|
29
21
|
const mockAgent = new MockAgent()
|
|
30
|
-
|
|
31
22
|
const mockPool = mockAgent.get('http://localhost:3000')
|
|
32
23
|
```
|
|
33
24
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
### `MockPool.intercept(options)`
|
|
37
|
-
|
|
38
|
-
This method defines the interception rules for matching against requests for a MockPool or MockPool. We can intercept multiple times on a single instance, but each intercept is only used once. For example if you expect to make 2 requests inside a test, you need to call `intercept()` twice. Assuming you use `disableNetConnect()` you will get `MockNotMatchedError` on the second request when you only call `intercept()` once.
|
|
39
|
-
|
|
40
|
-
When defining interception rules, all the rules must pass for a request to be intercepted. If a request is not intercepted, a real request will be attempted.
|
|
41
|
-
|
|
42
|
-
| Matcher type | Condition to pass |
|
|
43
|
-
|:------------:| -------------------------- |
|
|
44
|
-
| `string` | Exact match against string |
|
|
45
|
-
| `RegExp` | Regex must pass |
|
|
46
|
-
| `Function` | Function must return true |
|
|
47
|
-
|
|
48
|
-
Arguments:
|
|
49
|
-
|
|
50
|
-
* **options** `MockPoolInterceptOptions` - Interception options.
|
|
51
|
-
|
|
52
|
-
Returns: `MockInterceptor` corresponding to the input options.
|
|
53
|
-
|
|
54
|
-
### Parameter: `MockPoolInterceptOptions`
|
|
25
|
+
```cjs
|
|
26
|
+
const { MockAgent } = require('undici')
|
|
55
27
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
* **headers** `Record<string, string | RegExp | (body: string) => boolean`> - (optional) - a matcher for the HTTP request headers. To be intercepted, a request must match all defined headers. Extra headers not defined here may (or may not) be included in the request and do not affect the interception in any way.
|
|
60
|
-
* **query** `Record<string, any> | null` - (optional) - a matcher for the HTTP request query string params. Only applies when a `string` was provided for `MockPoolInterceptOptions.path`.
|
|
61
|
-
* **ignoreTrailingSlash** `boolean` - (optional) - set to `true` if the matcher should also match by ignoring potential trailing slashes in `MockPoolInterceptOptions.path`.
|
|
62
|
-
|
|
63
|
-
### Return: `MockInterceptor`
|
|
28
|
+
const mockAgent = new MockAgent()
|
|
29
|
+
const mockPool = mockAgent.get('http://localhost:3000')
|
|
30
|
+
```
|
|
64
31
|
|
|
65
|
-
|
|
32
|
+
## Class: `MockPool`
|
|
66
33
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
* **defaultReplyHeaders** `(headers: Record<string, string>) => MockInterceptor` - define default headers to be included in subsequent replies. These are in addition to headers on a specific reply.
|
|
71
|
-
* **defaultReplyTrailers** `(trailers: Record<string, string>) => MockInterceptor` - define default trailers to be included in subsequent replies. These are in addition to trailers on a specific reply.
|
|
72
|
-
* **replyContentLength** `() => MockInterceptor` - define automatically calculated `content-length` headers to be included in subsequent replies.
|
|
34
|
+
<!-- YAML
|
|
35
|
+
added: v4.0.0
|
|
36
|
+
-->
|
|
73
37
|
|
|
74
|
-
|
|
38
|
+
* Extends: {Pool}
|
|
75
39
|
|
|
76
|
-
|
|
40
|
+
Extends [`Pool`][] and implements the `Interceptable` interface, allowing
|
|
41
|
+
requests made through it to be matched against registered mocks.
|
|
77
42
|
|
|
78
|
-
###
|
|
43
|
+
### `new MockPool(origin[, options])`
|
|
79
44
|
|
|
80
|
-
|
|
81
|
-
|
|
45
|
+
<!-- YAML
|
|
46
|
+
added: v4.0.0
|
|
47
|
+
-->
|
|
82
48
|
|
|
83
|
-
|
|
49
|
+
* `origin` {string} The origin to associate this mock pool with. It should only
|
|
50
|
+
include the protocol, hostname, and port.
|
|
51
|
+
* `options` {MockPoolOptions} Extends the [`Pool`][] options.
|
|
52
|
+
* Returns: {MockPool}
|
|
84
53
|
|
|
85
|
-
|
|
54
|
+
The `agent` option is required and must implement the `Agent` interface;
|
|
55
|
+
otherwise an `InvalidArgumentError` is thrown.
|
|
86
56
|
|
|
87
|
-
|
|
88
|
-
* **persist** `() => MockScope` - any matching request will always reply with the defined response indefinitely.
|
|
89
|
-
* **times** `(repeatTimes: number) => MockScope` - any matching request will reply with the defined response a fixed amount of times. This is overridden by **persist**.
|
|
57
|
+
#### Parameter: `MockPoolOptions`
|
|
90
58
|
|
|
91
|
-
|
|
59
|
+
Extends: `PoolOptions`
|
|
92
60
|
|
|
93
|
-
|
|
61
|
+
* `agent` {MockAgent} The agent to associate this mock pool with.
|
|
62
|
+
* `ignoreTrailingSlash` {boolean} Whether trailing slashes should be ignored
|
|
63
|
+
when matching the path of intercepted requests. **Default:** `false`.
|
|
64
|
+
|
|
65
|
+
### `mockPool.intercept(options)`
|
|
66
|
+
|
|
67
|
+
<!-- YAML
|
|
68
|
+
added: v4.0.0
|
|
69
|
+
-->
|
|
70
|
+
|
|
71
|
+
* `options` {MockPoolInterceptOptions} The matching criteria for the requests to
|
|
72
|
+
intercept.
|
|
73
|
+
* Returns: {MockInterceptor} The interceptor used to define the mocked reply.
|
|
74
|
+
|
|
75
|
+
Registers a route on the mock pool and returns a [`MockInterceptor`][] for any
|
|
76
|
+
matching request that uses the same origin as this mock pool. The interceptor is
|
|
77
|
+
then used to define the reply, for example with `reply()` or `replyWithError()`.
|
|
78
|
+
|
|
79
|
+
Each `intercept()` call is consumed by a single matching request. To match more
|
|
80
|
+
than one request, call `intercept()` once per expected request, or use
|
|
81
|
+
`persist()` or `times()` on the returned [`MockScope`][]. When no registered
|
|
82
|
+
mock matches a request, a real request is attempted unless network connections
|
|
83
|
+
have been disabled on the [`MockAgent`][], in which case a `MockNotMatchedError`
|
|
84
|
+
is thrown.
|
|
85
|
+
|
|
86
|
+
A request is intercepted only when every defined matcher passes. The accepted
|
|
87
|
+
matcher forms behave as follows:
|
|
88
|
+
|
|
89
|
+
| Matcher type | Condition to pass |
|
|
90
|
+
| :----------: | ---------------------------- |
|
|
91
|
+
| `string` | Exact match against the value |
|
|
92
|
+
| `RegExp` | The expression must match |
|
|
93
|
+
| `Function` | The function must return `true` |
|
|
94
|
+
|
|
95
|
+
#### Parameter: `MockPoolInterceptOptions`
|
|
96
|
+
|
|
97
|
+
* `path` {string|RegExp|Function} A matcher for the HTTP request path. The
|
|
98
|
+
function form has the signature `(path: string) => boolean`. When a `RegExp`
|
|
99
|
+
or function is used, it matches against the request path including all query
|
|
100
|
+
parameters in alphabetical order. When a `string` is used, query parameters
|
|
101
|
+
can instead be supplied through `query`.
|
|
102
|
+
* `method` {string|RegExp|Function} A matcher for the HTTP request method. The
|
|
103
|
+
function form has the signature `(method: string) => boolean`.
|
|
104
|
+
**Default:** `'GET'`.
|
|
105
|
+
* `body` {string|RegExp|Function} A matcher for the HTTP request body. The
|
|
106
|
+
function form has the signature `(body: string) => boolean`.
|
|
107
|
+
* `headers` {Object|Function} A matcher for the HTTP request headers, given
|
|
108
|
+
either as a map of header name to a `string`, `RegExp`, or
|
|
109
|
+
`(value: string) => boolean` matcher, or as a single function that receives
|
|
110
|
+
all headers and returns a `boolean`. When a map is used, the request must
|
|
111
|
+
match every defined header; extra headers not listed here do not affect
|
|
112
|
+
matching.
|
|
113
|
+
* `query` {Object} A matcher for the HTTP request query string parameters. Only
|
|
114
|
+
applies when a `string` was provided for `path`.
|
|
115
|
+
* `ignoreTrailingSlash` {boolean} Whether a trailing slash on `path` is ignored
|
|
116
|
+
when matching. Inherited from the mock pool's `ignoreTrailingSlash` option
|
|
117
|
+
when not set.
|
|
118
|
+
|
|
119
|
+
#### Return: `MockInterceptor`
|
|
120
|
+
|
|
121
|
+
The reply behaviour of a matching request is defined through the returned
|
|
122
|
+
`MockInterceptor`.
|
|
123
|
+
|
|
124
|
+
* `reply(statusCode[, data[, responseOptions]])` {Function} Defines the reply
|
|
125
|
+
for a matching request.
|
|
126
|
+
* `statusCode` {number} The status code of the mocked reply.
|
|
127
|
+
* `data` {string|Buffer|Object|Function} The body of the mocked reply.
|
|
128
|
+
Objects are serialized to JSON; strings and `Buffer`s are sent as-is. The
|
|
129
|
+
function form has the signature
|
|
130
|
+
`(opts: MockResponseCallbackOptions) => string | Buffer | Object` and is
|
|
131
|
+
invoked with the incoming request to compute the reply body.
|
|
132
|
+
* `responseOptions` {MockResponseOptions} Additional reply options.
|
|
133
|
+
**Default:** `{}`.
|
|
134
|
+
* Returns: {MockScope}
|
|
135
|
+
* `reply(callback)` {Function} Defines the reply for a matching request,
|
|
136
|
+
computing all reply options dynamically rather than just the body.
|
|
137
|
+
* `callback` {Function} A `(opts: MockResponseCallbackOptions) =>
|
|
138
|
+
{ statusCode, data, responseOptions }` function invoked with the incoming
|
|
139
|
+
request. The callback may be asynchronous; a returned promise is awaited
|
|
140
|
+
and must resolve to the same shape.
|
|
141
|
+
* Returns: {MockScope}
|
|
142
|
+
* `replyWithError(error)` {Function} Defines an error for a matching request to
|
|
143
|
+
throw.
|
|
144
|
+
* `error` {Error} The error thrown when a request matches.
|
|
145
|
+
* Returns: {MockScope}
|
|
146
|
+
* `defaultReplyHeaders(headers)` {Function} Sets default headers included on
|
|
147
|
+
every subsequent reply defined on this interceptor, in addition to any headers
|
|
148
|
+
set on a specific reply.
|
|
149
|
+
* `headers` {Object} A map of header name to value.
|
|
150
|
+
* Returns: {MockInterceptor}
|
|
151
|
+
* `defaultReplyTrailers(trailers)` {Function} Sets default trailers included on
|
|
152
|
+
every subsequent reply defined on this interceptor, in addition to any
|
|
153
|
+
trailers set on a specific reply.
|
|
154
|
+
* `trailers` {Object} A map of trailer name to value.
|
|
155
|
+
* Returns: {MockInterceptor}
|
|
156
|
+
* `replyContentLength()` {Function} Sets an automatically calculated
|
|
157
|
+
`content-length` header on every subsequent reply defined on this interceptor.
|
|
158
|
+
* Returns: {MockInterceptor}
|
|
159
|
+
|
|
160
|
+
By default, `reply()` and `replyWithError()` define the behaviour for the first
|
|
161
|
+
matching request only; subsequent requests are not affected unless `persist()`
|
|
162
|
+
or `times()` is used on the returned [`MockScope`][].
|
|
163
|
+
|
|
164
|
+
#### Parameter: `MockResponseCallbackOptions`
|
|
165
|
+
|
|
166
|
+
The argument passed to the `reply()` data and options callbacks.
|
|
167
|
+
|
|
168
|
+
* `path` {string} The path of the intercepted request.
|
|
169
|
+
* `method` {string} The method of the intercepted request.
|
|
170
|
+
* `headers` {Object|Headers} The headers of the intercepted request.
|
|
171
|
+
* `origin` {string} The origin of the intercepted request.
|
|
172
|
+
* `body` {string|null} The body of the intercepted request.
|
|
173
|
+
|
|
174
|
+
#### Parameter: `MockResponseOptions`
|
|
175
|
+
|
|
176
|
+
* `headers` {Object} Headers to include on the mocked reply.
|
|
177
|
+
* `trailers` {Object} Trailers to include on the mocked reply.
|
|
178
|
+
|
|
179
|
+
#### Return: `MockScope`
|
|
180
|
+
|
|
181
|
+
A `MockScope` is associated with a single [`MockInterceptor`][] and configures
|
|
182
|
+
how many times the defined reply is used.
|
|
183
|
+
|
|
184
|
+
* `delay(waitInMs)` {Function} Delays the associated reply by a set amount of
|
|
185
|
+
time.
|
|
186
|
+
* `waitInMs` {number} The delay in milliseconds.
|
|
187
|
+
* Returns: {MockScope}
|
|
188
|
+
* `persist()` {Function} Makes the associated reply match indefinitely, so every
|
|
189
|
+
matching request receives the defined response.
|
|
190
|
+
* Returns: {MockScope}
|
|
191
|
+
* `times(repeatTimes)` {Function} Makes the associated reply match a fixed number
|
|
192
|
+
of times. This is overridden by `persist()`.
|
|
193
|
+
* `repeatTimes` {number} The number of matching requests the reply applies to.
|
|
194
|
+
* Returns: {MockScope}
|
|
195
|
+
|
|
196
|
+
The following examples show common interception patterns.
|
|
197
|
+
|
|
198
|
+
```mjs displayName="Basic mocked request"
|
|
94
199
|
import { MockAgent, setGlobalDispatcher, request } from 'undici'
|
|
95
200
|
|
|
96
201
|
const mockAgent = new MockAgent()
|
|
97
202
|
setGlobalDispatcher(mockAgent)
|
|
98
203
|
|
|
99
|
-
// MockPool
|
|
100
204
|
const mockPool = mockAgent.get('http://localhost:3000')
|
|
101
205
|
mockPool.intercept({ path: '/foo' }).reply(200, 'foo')
|
|
102
206
|
|
|
103
|
-
const {
|
|
104
|
-
statusCode,
|
|
105
|
-
body
|
|
106
|
-
} = await request('http://localhost:3000/foo')
|
|
207
|
+
const { statusCode, body } = await request('http://localhost:3000/foo')
|
|
107
208
|
|
|
108
209
|
console.log('response received', statusCode) // response received 200
|
|
109
210
|
|
|
@@ -112,9 +213,7 @@ for await (const data of body) {
|
|
|
112
213
|
}
|
|
113
214
|
```
|
|
114
215
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
```js
|
|
216
|
+
```mjs displayName="Reply with a data callback"
|
|
118
217
|
import { MockAgent, setGlobalDispatcher, request } from 'undici'
|
|
119
218
|
|
|
120
219
|
const mockAgent = new MockAgent()
|
|
@@ -124,30 +223,21 @@ const mockPool = mockAgent.get('http://localhost:3000')
|
|
|
124
223
|
|
|
125
224
|
mockPool.intercept({
|
|
126
225
|
path: '/echo',
|
|
127
|
-
method: 'GET'
|
|
128
|
-
|
|
129
|
-
'User-Agent': 'undici',
|
|
130
|
-
Host: 'example.com'
|
|
131
|
-
}
|
|
132
|
-
}).reply(200, ({ headers }) => ({ message: headers.get('message') }))
|
|
226
|
+
method: 'GET'
|
|
227
|
+
}).reply(200, ({ headers }) => ({ message: headers.message }))
|
|
133
228
|
|
|
134
|
-
const { statusCode, body
|
|
135
|
-
headers: {
|
|
136
|
-
message: 'hello world!'
|
|
137
|
-
}
|
|
229
|
+
const { statusCode, body } = await request('http://localhost:3000/echo', {
|
|
230
|
+
headers: { message: 'hello world!' }
|
|
138
231
|
})
|
|
139
232
|
|
|
140
233
|
console.log('response received', statusCode) // response received 200
|
|
141
|
-
console.log('headers', headers) // { 'content-type': 'application/json' }
|
|
142
234
|
|
|
143
235
|
for await (const data of body) {
|
|
144
|
-
console.log('data', data.toString('utf8')) // {
|
|
236
|
+
console.log('data', data.toString('utf8')) // {"message":"hello world!"}
|
|
145
237
|
}
|
|
146
238
|
```
|
|
147
239
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
```js
|
|
240
|
+
```mjs displayName="Reply with an options callback"
|
|
151
241
|
import { MockAgent, setGlobalDispatcher, request } from 'undici'
|
|
152
242
|
|
|
153
243
|
const mockAgent = new MockAgent()
|
|
@@ -157,30 +247,25 @@ const mockPool = mockAgent.get('http://localhost:3000')
|
|
|
157
247
|
|
|
158
248
|
mockPool.intercept({
|
|
159
249
|
path: '/echo',
|
|
160
|
-
method: 'GET'
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
}).reply(({ headers }) => ({ statusCode: 200, data: { message: headers.get('message') }})))
|
|
250
|
+
method: 'GET'
|
|
251
|
+
}).reply(({ headers }) => ({
|
|
252
|
+
statusCode: 200,
|
|
253
|
+
data: { message: headers.message }
|
|
254
|
+
}))
|
|
166
255
|
|
|
167
|
-
const { statusCode, body
|
|
168
|
-
headers: {
|
|
169
|
-
message: 'hello world!'
|
|
170
|
-
}
|
|
256
|
+
const { statusCode, body } = await request('http://localhost:3000/echo', {
|
|
257
|
+
headers: { message: 'hello world!' }
|
|
171
258
|
})
|
|
172
259
|
|
|
173
260
|
console.log('response received', statusCode) // response received 200
|
|
174
|
-
console.log('headers', headers) // { 'content-type': 'application/json' }
|
|
175
261
|
|
|
176
262
|
for await (const data of body) {
|
|
177
|
-
console.log('data', data.toString('utf8')) // {
|
|
263
|
+
console.log('data', data.toString('utf8')) // {"message":"hello world!"}
|
|
178
264
|
}
|
|
179
265
|
```
|
|
180
266
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
```js
|
|
267
|
+
```mjs displayName="Reply with an asynchronous options callback"
|
|
268
|
+
import { readFile } from 'node:fs/promises'
|
|
184
269
|
import { MockAgent, setGlobalDispatcher, request } from 'undici'
|
|
185
270
|
|
|
186
271
|
const mockAgent = new MockAgent()
|
|
@@ -189,35 +274,45 @@ setGlobalDispatcher(mockAgent)
|
|
|
189
274
|
const mockPool = mockAgent.get('http://localhost:3000')
|
|
190
275
|
|
|
191
276
|
mockPool.intercept({
|
|
192
|
-
path: '/
|
|
277
|
+
path: '/fixture',
|
|
193
278
|
method: 'GET'
|
|
194
|
-
}).reply(
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
method: 'GET',
|
|
199
|
-
}).reply(200, 'hello')
|
|
279
|
+
}).reply(async ({ path }) => ({
|
|
280
|
+
statusCode: 200,
|
|
281
|
+
data: await readFile(new URL('./fixture.json', import.meta.url))
|
|
282
|
+
}))
|
|
200
283
|
|
|
201
|
-
const
|
|
284
|
+
const { statusCode, body } = await request('http://localhost:3000/fixture')
|
|
202
285
|
|
|
203
|
-
console.log('response received',
|
|
286
|
+
console.log('response received', statusCode) // response received 200
|
|
204
287
|
|
|
205
|
-
for await (const data of
|
|
206
|
-
console.log('data', data.toString('utf8')) //
|
|
288
|
+
for await (const data of body) {
|
|
289
|
+
console.log('data', data.toString('utf8')) // contents of fixture.json
|
|
207
290
|
}
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
```mjs displayName="Multiple intercepts"
|
|
294
|
+
import { MockAgent, setGlobalDispatcher, request } from 'undici'
|
|
295
|
+
|
|
296
|
+
const mockAgent = new MockAgent()
|
|
297
|
+
setGlobalDispatcher(mockAgent)
|
|
298
|
+
|
|
299
|
+
const mockPool = mockAgent.get('http://localhost:3000')
|
|
208
300
|
|
|
209
|
-
|
|
301
|
+
mockPool.intercept({ path: '/foo', method: 'GET' }).reply(200, 'foo')
|
|
302
|
+
mockPool.intercept({ path: '/hello', method: 'GET' }).reply(200, 'hello')
|
|
210
303
|
|
|
211
|
-
|
|
304
|
+
const fooResult = await request('http://localhost:3000/foo')
|
|
305
|
+
for await (const data of fooResult.body) {
|
|
306
|
+
console.log('data', data.toString('utf8')) // data foo
|
|
307
|
+
}
|
|
212
308
|
|
|
213
|
-
|
|
309
|
+
const helloResult = await request('http://localhost:3000/hello')
|
|
310
|
+
for await (const data of helloResult.body) {
|
|
214
311
|
console.log('data', data.toString('utf8')) // data hello
|
|
215
312
|
}
|
|
216
313
|
```
|
|
217
314
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
```js
|
|
315
|
+
```mjs displayName="Match query, body, request headers; reply with headers and trailers"
|
|
221
316
|
import { MockAgent, setGlobalDispatcher, request } from 'undici'
|
|
222
317
|
|
|
223
318
|
const mockAgent = new MockAgent()
|
|
@@ -238,12 +333,9 @@ mockPool.intercept({
|
|
|
238
333
|
trailers: { 'Content-MD5': 'test' }
|
|
239
334
|
})
|
|
240
335
|
|
|
241
|
-
const {
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
trailers,
|
|
245
|
-
body
|
|
246
|
-
} = await request('http://localhost:3000/foo?hello=there&see=ya', {
|
|
336
|
+
const { statusCode, headers, trailers, body } = await request(
|
|
337
|
+
'http://localhost:3000/foo?hello=there&see=ya',
|
|
338
|
+
{
|
|
247
339
|
method: 'POST',
|
|
248
340
|
body: 'form1=data1&form2=data2',
|
|
249
341
|
headers: {
|
|
@@ -251,21 +343,20 @@ const {
|
|
|
251
343
|
'User-Agent': 'undici',
|
|
252
344
|
Host: 'example.com'
|
|
253
345
|
}
|
|
254
|
-
}
|
|
346
|
+
}
|
|
347
|
+
)
|
|
255
348
|
|
|
256
349
|
console.log('response received', statusCode) // response received 200
|
|
257
350
|
console.log('headers', headers) // { 'content-type': 'application/json' }
|
|
258
351
|
|
|
259
352
|
for await (const data of body) {
|
|
260
|
-
console.log('data', data.toString('utf8')) //
|
|
353
|
+
console.log('data', data.toString('utf8')) // {"foo":"bar"}
|
|
261
354
|
}
|
|
262
355
|
|
|
263
356
|
console.log('trailers', trailers) // { 'content-md5': 'test' }
|
|
264
357
|
```
|
|
265
358
|
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
```js
|
|
359
|
+
```mjs displayName="Different matcher forms"
|
|
269
360
|
import { MockAgent, setGlobalDispatcher, request } from 'undici'
|
|
270
361
|
|
|
271
362
|
const mockAgent = new MockAgent()
|
|
@@ -279,14 +370,11 @@ mockPool.intercept({
|
|
|
279
370
|
body: (value) => value === 'form=data',
|
|
280
371
|
headers: {
|
|
281
372
|
'User-Agent': 'undici',
|
|
282
|
-
Host: /^example
|
|
373
|
+
Host: /^example\.com$/
|
|
283
374
|
}
|
|
284
375
|
}).reply(200, 'foo')
|
|
285
376
|
|
|
286
|
-
const {
|
|
287
|
-
statusCode,
|
|
288
|
-
body
|
|
289
|
-
} = await request('http://localhost:3000/foo', {
|
|
377
|
+
const { statusCode, body } = await request('http://localhost:3000/foo', {
|
|
290
378
|
method: 'GET',
|
|
291
379
|
body: 'form=data',
|
|
292
380
|
headers: {
|
|
@@ -303,9 +391,7 @@ for await (const data of body) {
|
|
|
303
391
|
}
|
|
304
392
|
```
|
|
305
393
|
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
```js
|
|
394
|
+
```mjs displayName="Reply with an error"
|
|
309
395
|
import { MockAgent, setGlobalDispatcher, request } from 'undici'
|
|
310
396
|
|
|
311
397
|
const mockAgent = new MockAgent()
|
|
@@ -319,18 +405,13 @@ mockPool.intercept({
|
|
|
319
405
|
}).replyWithError(new Error('kaboom'))
|
|
320
406
|
|
|
321
407
|
try {
|
|
322
|
-
await request('http://localhost:3000/foo', {
|
|
323
|
-
method: 'GET'
|
|
324
|
-
})
|
|
408
|
+
await request('http://localhost:3000/foo', { method: 'GET' })
|
|
325
409
|
} catch (error) {
|
|
326
|
-
console.error(error) //
|
|
327
|
-
console.error(error.cause) // Error: kaboom
|
|
410
|
+
console.error(error.message) // kaboom
|
|
328
411
|
}
|
|
329
412
|
```
|
|
330
413
|
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
```js
|
|
414
|
+
```mjs displayName="Default reply headers"
|
|
334
415
|
import { MockAgent, setGlobalDispatcher, request } from 'undici'
|
|
335
416
|
|
|
336
417
|
const mockAgent = new MockAgent()
|
|
@@ -338,10 +419,8 @@ setGlobalDispatcher(mockAgent)
|
|
|
338
419
|
|
|
339
420
|
const mockPool = mockAgent.get('http://localhost:3000')
|
|
340
421
|
|
|
341
|
-
mockPool.intercept({
|
|
342
|
-
|
|
343
|
-
method: 'GET'
|
|
344
|
-
}).defaultReplyHeaders({ foo: 'bar' })
|
|
422
|
+
mockPool.intercept({ path: '/foo', method: 'GET' })
|
|
423
|
+
.defaultReplyHeaders({ foo: 'bar' })
|
|
345
424
|
.reply(200, 'foo')
|
|
346
425
|
|
|
347
426
|
const { headers } = await request('http://localhost:3000/foo')
|
|
@@ -349,9 +428,7 @@ const { headers } = await request('http://localhost:3000/foo')
|
|
|
349
428
|
console.log('headers', headers) // headers { foo: 'bar' }
|
|
350
429
|
```
|
|
351
430
|
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
```js
|
|
431
|
+
```mjs displayName="Default reply trailers"
|
|
355
432
|
import { MockAgent, setGlobalDispatcher, request } from 'undici'
|
|
356
433
|
|
|
357
434
|
const mockAgent = new MockAgent()
|
|
@@ -359,10 +436,8 @@ setGlobalDispatcher(mockAgent)
|
|
|
359
436
|
|
|
360
437
|
const mockPool = mockAgent.get('http://localhost:3000')
|
|
361
438
|
|
|
362
|
-
mockPool.intercept({
|
|
363
|
-
|
|
364
|
-
method: 'GET'
|
|
365
|
-
}).defaultReplyTrailers({ foo: 'bar' })
|
|
439
|
+
mockPool.intercept({ path: '/foo', method: 'GET' })
|
|
440
|
+
.defaultReplyTrailers({ foo: 'bar' })
|
|
366
441
|
.reply(200, 'foo')
|
|
367
442
|
|
|
368
443
|
const { trailers } = await request('http://localhost:3000/foo')
|
|
@@ -370,9 +445,7 @@ const { trailers } = await request('http://localhost:3000/foo')
|
|
|
370
445
|
console.log('trailers', trailers) // trailers { foo: 'bar' }
|
|
371
446
|
```
|
|
372
447
|
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
```js
|
|
448
|
+
```mjs displayName="Automatic content-length"
|
|
376
449
|
import { MockAgent, setGlobalDispatcher, request } from 'undici'
|
|
377
450
|
|
|
378
451
|
const mockAgent = new MockAgent()
|
|
@@ -380,19 +453,16 @@ setGlobalDispatcher(mockAgent)
|
|
|
380
453
|
|
|
381
454
|
const mockPool = mockAgent.get('http://localhost:3000')
|
|
382
455
|
|
|
383
|
-
mockPool.intercept({
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
}).replyContentLength().reply(200, 'foo')
|
|
456
|
+
mockPool.intercept({ path: '/foo', method: 'GET' })
|
|
457
|
+
.replyContentLength()
|
|
458
|
+
.reply(200, 'foo')
|
|
387
459
|
|
|
388
460
|
const { headers } = await request('http://localhost:3000/foo')
|
|
389
461
|
|
|
390
462
|
console.log('headers', headers) // headers { 'content-length': '3' }
|
|
391
463
|
```
|
|
392
464
|
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
```js
|
|
465
|
+
```mjs displayName="Persisted reply"
|
|
396
466
|
import { MockAgent, setGlobalDispatcher, request } from 'undici'
|
|
397
467
|
|
|
398
468
|
const mockAgent = new MockAgent()
|
|
@@ -400,19 +470,13 @@ setGlobalDispatcher(mockAgent)
|
|
|
400
470
|
|
|
401
471
|
const mockPool = mockAgent.get('http://localhost:3000')
|
|
402
472
|
|
|
403
|
-
mockPool.intercept({
|
|
404
|
-
path: '/foo',
|
|
405
|
-
method: 'GET'
|
|
406
|
-
}).replyContentLength().reply(200, { foo: 'bar' })
|
|
473
|
+
mockPool.intercept({ path: '/foo', method: 'GET' }).reply(200, 'foo').persist()
|
|
407
474
|
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
console.log('headers', headers) // headers { 'content-length': '13' }
|
|
475
|
+
await request('http://localhost:3000/foo') // Matches and returns the mock
|
|
476
|
+
await request('http://localhost:3000/foo') // Matches again, indefinitely
|
|
411
477
|
```
|
|
412
478
|
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
```js
|
|
479
|
+
```mjs displayName="Reply a fixed number of times"
|
|
416
480
|
import { MockAgent, setGlobalDispatcher, request } from 'undici'
|
|
417
481
|
|
|
418
482
|
const mockAgent = new MockAgent()
|
|
@@ -420,57 +484,23 @@ setGlobalDispatcher(mockAgent)
|
|
|
420
484
|
|
|
421
485
|
const mockPool = mockAgent.get('http://localhost:3000')
|
|
422
486
|
|
|
423
|
-
mockPool.intercept({
|
|
424
|
-
path: '/foo',
|
|
425
|
-
method: 'GET'
|
|
426
|
-
}).reply(200, 'foo').persist()
|
|
427
|
-
|
|
428
|
-
const result1 = await request('http://localhost:3000/foo')
|
|
429
|
-
// Will match and return mocked data
|
|
487
|
+
mockPool.intercept({ path: '/foo', method: 'GET' }).reply(200, 'foo').times(2)
|
|
430
488
|
|
|
431
|
-
|
|
432
|
-
//
|
|
433
|
-
|
|
434
|
-
// Etc
|
|
489
|
+
await request('http://localhost:3000/foo') // Matches and returns the mock
|
|
490
|
+
await request('http://localhost:3000/foo') // Matches and returns the mock
|
|
491
|
+
await request('http://localhost:3000/foo') // No match; a real request is attempted
|
|
435
492
|
```
|
|
436
493
|
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
```js
|
|
494
|
+
```mjs displayName="Match the path with a function"
|
|
440
495
|
import { MockAgent, setGlobalDispatcher, request } from 'undici'
|
|
496
|
+
import querystring from 'node:querystring'
|
|
441
497
|
|
|
442
498
|
const mockAgent = new MockAgent()
|
|
443
499
|
setGlobalDispatcher(mockAgent)
|
|
444
500
|
|
|
445
501
|
const mockPool = mockAgent.get('http://localhost:3000')
|
|
446
502
|
|
|
447
|
-
|
|
448
|
-
path: '/foo',
|
|
449
|
-
method: 'GET'
|
|
450
|
-
}).reply(200, 'foo').times(2)
|
|
451
|
-
|
|
452
|
-
const result1 = await request('http://localhost:3000/foo')
|
|
453
|
-
// Will match and return mocked data
|
|
454
|
-
|
|
455
|
-
const result2 = await request('http://localhost:3000/foo')
|
|
456
|
-
// Will match and return mocked data
|
|
457
|
-
|
|
458
|
-
const result3 = await request('http://localhost:3000/foo')
|
|
459
|
-
// Will not match and make attempt a real request
|
|
460
|
-
```
|
|
461
|
-
|
|
462
|
-
#### Example - Mocked request with path callback
|
|
463
|
-
|
|
464
|
-
```js
|
|
465
|
-
import { MockAgent, setGlobalDispatcher, request } from 'undici'
|
|
466
|
-
import querystring from 'querystring'
|
|
467
|
-
|
|
468
|
-
const mockAgent = new MockAgent()
|
|
469
|
-
setGlobalDispatcher(mockAgent)
|
|
470
|
-
|
|
471
|
-
const mockPool = mockAgent.get('http://localhost:3000')
|
|
472
|
-
|
|
473
|
-
const matchPath = requestPath => {
|
|
503
|
+
const matchPath = (requestPath) => {
|
|
474
504
|
const [pathname, search] = requestPath.split('?')
|
|
475
505
|
const requestQuery = querystring.parse(search)
|
|
476
506
|
|
|
@@ -478,31 +508,26 @@ const matchPath = requestPath => {
|
|
|
478
508
|
return false
|
|
479
509
|
}
|
|
480
510
|
|
|
481
|
-
|
|
482
|
-
return false
|
|
483
|
-
}
|
|
484
|
-
|
|
485
|
-
return true
|
|
511
|
+
return requestQuery.foo === 'bar'
|
|
486
512
|
}
|
|
487
513
|
|
|
488
|
-
mockPool.intercept({
|
|
489
|
-
path: matchPath,
|
|
490
|
-
method: 'GET'
|
|
491
|
-
}).reply(200, 'foo')
|
|
514
|
+
mockPool.intercept({ path: matchPath, method: 'GET' }).reply(200, 'foo')
|
|
492
515
|
|
|
493
|
-
|
|
494
|
-
// Will match and return mocked data
|
|
516
|
+
await request('http://localhost:3000/foo?foo=bar') // Matches and returns the mock
|
|
495
517
|
```
|
|
496
518
|
|
|
497
|
-
### `
|
|
519
|
+
### `mockPool.close()`
|
|
498
520
|
|
|
499
|
-
|
|
521
|
+
<!-- YAML
|
|
522
|
+
added: v4.0.0
|
|
523
|
+
-->
|
|
500
524
|
|
|
501
|
-
Returns: `
|
|
525
|
+
* Returns: {Promise} Fulfills with `undefined` once the mock pool is closed.
|
|
502
526
|
|
|
503
|
-
|
|
527
|
+
Closes the mock pool, gracefully waiting for any enqueued requests to complete,
|
|
528
|
+
and removes it from the associated [`MockAgent`][].
|
|
504
529
|
|
|
505
|
-
```
|
|
530
|
+
```mjs
|
|
506
531
|
import { MockAgent } from 'undici'
|
|
507
532
|
|
|
508
533
|
const mockAgent = new MockAgent()
|
|
@@ -511,31 +536,45 @@ const mockPool = mockAgent.get('http://localhost:3000')
|
|
|
511
536
|
await mockPool.close()
|
|
512
537
|
```
|
|
513
538
|
|
|
514
|
-
### `
|
|
539
|
+
### `mockPool.dispatch(options, handlers)`
|
|
540
|
+
|
|
541
|
+
<!-- YAML
|
|
542
|
+
added: v4.0.0
|
|
543
|
+
-->
|
|
544
|
+
|
|
545
|
+
* `options` {DispatchOptions} The request options.
|
|
546
|
+
* `handlers` {DispatchHandler} The handlers invoked over the request lifecycle.
|
|
547
|
+
* Returns: {boolean} `false` if the dispatcher is busy and the caller should
|
|
548
|
+
wait before dispatching further requests, otherwise `true`.
|
|
515
549
|
|
|
516
|
-
|
|
550
|
+
Dispatches a request, matching it against the registered mocks. This override of
|
|
551
|
+
[`dispatcher.dispatch(options, handlers)`][] is what drives the mocking
|
|
552
|
+
behaviour for every higher-level method such as `request`.
|
|
517
553
|
|
|
518
|
-
### `
|
|
554
|
+
### `mockPool.request(options[, callback])`
|
|
519
555
|
|
|
520
|
-
|
|
556
|
+
<!-- YAML
|
|
557
|
+
added: v4.0.0
|
|
558
|
+
-->
|
|
521
559
|
|
|
522
|
-
|
|
560
|
+
* `options` {DispatchOptions}
|
|
561
|
+
* `callback` {Function} (optional) Invoked with the response when no `Promise`
|
|
562
|
+
is requested.
|
|
563
|
+
* Returns: {Promise} Fulfills with the mocked response when no `callback` is
|
|
564
|
+
provided.
|
|
523
565
|
|
|
524
|
-
|
|
566
|
+
Performs a request and resolves it against the registered mocks. Inherited from
|
|
567
|
+
[`Pool`][]; see [`dispatcher.request(options[, callback])`][] for the full
|
|
568
|
+
parameter and return value documentation.
|
|
569
|
+
|
|
570
|
+
```mjs
|
|
525
571
|
import { MockAgent } from 'undici'
|
|
526
572
|
|
|
527
573
|
const mockAgent = new MockAgent()
|
|
528
|
-
|
|
529
574
|
const mockPool = mockAgent.get('http://localhost:3000')
|
|
530
|
-
mockPool.intercept({
|
|
531
|
-
path: '/foo',
|
|
532
|
-
method: 'GET',
|
|
533
|
-
}).reply(200, 'foo')
|
|
575
|
+
mockPool.intercept({ path: '/foo', method: 'GET' }).reply(200, 'foo')
|
|
534
576
|
|
|
535
|
-
const {
|
|
536
|
-
statusCode,
|
|
537
|
-
body
|
|
538
|
-
} = await mockPool.request({
|
|
577
|
+
const { statusCode, body } = await mockPool.request({
|
|
539
578
|
origin: 'http://localhost:3000',
|
|
540
579
|
path: '/foo',
|
|
541
580
|
method: 'GET'
|
|
@@ -548,8 +587,32 @@ for await (const data of body) {
|
|
|
548
587
|
}
|
|
549
588
|
```
|
|
550
589
|
|
|
551
|
-
### `
|
|
590
|
+
### `mockPool.cleanMocks()`
|
|
591
|
+
|
|
592
|
+
<!-- YAML
|
|
593
|
+
added: v7.11.0
|
|
594
|
+
-->
|
|
595
|
+
|
|
596
|
+
* Returns: {undefined}
|
|
552
597
|
|
|
553
|
-
|
|
598
|
+
Removes all registered interceptors from the mock pool. Pending mocks defined
|
|
599
|
+
before this call no longer match incoming requests.
|
|
600
|
+
|
|
601
|
+
```mjs
|
|
602
|
+
import { MockAgent } from 'undici'
|
|
603
|
+
|
|
604
|
+
const mockAgent = new MockAgent()
|
|
605
|
+
const mockPool = mockAgent.get('http://localhost:3000')
|
|
606
|
+
|
|
607
|
+
mockPool.intercept({ path: '/foo' }).reply(200, 'foo')
|
|
608
|
+
mockPool.cleanMocks()
|
|
609
|
+
```
|
|
554
610
|
|
|
555
|
-
|
|
611
|
+
[`MockAgent`]: MockAgent.md#class-mockagent
|
|
612
|
+
[`MockClient`]: MockClient.md#class-mockclient
|
|
613
|
+
[`MockInterceptor`]: MockPool.md#return-mockinterceptor
|
|
614
|
+
[`MockScope`]: MockPool.md#return-mockscope
|
|
615
|
+
[`Pool`]: Pool.md#class-pool
|
|
616
|
+
[`dispatcher.dispatch(options, handlers)`]: Dispatcher.md#dispatcherdispatchoptions-handler
|
|
617
|
+
[`dispatcher.request(options[, callback])`]: Dispatcher.md#dispatcherrequestoptions-callback
|
|
618
|
+
[`mockAgent.get(origin)`]: MockAgent.md#mockagentgetorigin
|