@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,40 +1,84 @@
|
|
|
1
|
-
#
|
|
1
|
+
# MockAgent
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
<!--introduced_in=v4.0.0-->
|
|
4
|
+
<!--type=module-->
|
|
5
|
+
<!-- source_link=lib/mock/mock-agent.js -->
|
|
4
6
|
|
|
5
|
-
|
|
7
|
+
> Stability: 2 - Stable
|
|
6
8
|
|
|
7
|
-
|
|
9
|
+
A `MockAgent` is a {Dispatcher} that intercepts HTTP requests made through
|
|
10
|
+
undici and replies with programmed mock responses instead of contacting the
|
|
11
|
+
network. It is useful for testing code that performs HTTP requests without
|
|
12
|
+
relying on a live server.
|
|
8
13
|
|
|
9
|
-
|
|
14
|
+
A `MockAgent` does not intercept requests on its own. Mock responses are
|
|
15
|
+
registered on the {MockClient} or {MockPool} instances returned by
|
|
16
|
+
[`mockAgent.get(origin)`][], and requests are routed through them once the
|
|
17
|
+
`MockAgent` is set as the dispatcher (for example through
|
|
18
|
+
[`setGlobalDispatcher()`][] or a per-request `dispatcher` option).
|
|
10
19
|
|
|
11
|
-
|
|
20
|
+
> [!NOTE]
|
|
21
|
+
> [`setGlobalDispatcher()`][] only affects undici APIs that use the global
|
|
22
|
+
> dispatcher, such as `request()` and `fetch()`. It does not replace or
|
|
23
|
+
> monkeypatch {Pool} or {Client} instances that were created separately. To test
|
|
24
|
+
> code that accepts or creates a pool/client directly, pass the {MockPool} or
|
|
25
|
+
> {MockClient} returned by [`mockAgent.get(origin)`][] into that code.
|
|
12
26
|
|
|
13
|
-
|
|
27
|
+
```mjs
|
|
28
|
+
import { MockAgent } from 'undici'
|
|
29
|
+
|
|
30
|
+
const mockAgent = new MockAgent()
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Class: `MockAgent`
|
|
34
|
+
|
|
35
|
+
<!-- YAML
|
|
36
|
+
added: v4.0.0
|
|
37
|
+
-->
|
|
38
|
+
|
|
39
|
+
* Extends: {Dispatcher}
|
|
14
40
|
|
|
15
|
-
|
|
41
|
+
Intercepts HTTP requests made through undici and returns mocked responses.
|
|
16
42
|
|
|
17
|
-
|
|
43
|
+
### `new MockAgent([options])`
|
|
18
44
|
|
|
19
|
-
|
|
45
|
+
<!-- YAML
|
|
46
|
+
added: v4.0.0
|
|
47
|
+
changes:
|
|
48
|
+
- version: v7.16.0
|
|
49
|
+
pr-url: https://github.com/nodejs/undici/pull/4479
|
|
50
|
+
description: Mock options are always normalized to an object internally.
|
|
51
|
+
-->
|
|
20
52
|
|
|
21
|
-
*
|
|
53
|
+
* `options` {MockAgentOptions} (optional)
|
|
54
|
+
* Returns: {MockAgent}
|
|
22
55
|
|
|
23
|
-
|
|
56
|
+
When instantiated, a `MockAgent` is automatically activated. It does not
|
|
57
|
+
intercept any request until mock interceptors are registered on the dispatchers
|
|
58
|
+
returned by [`mockAgent.get(origin)`][].
|
|
24
59
|
|
|
25
|
-
|
|
60
|
+
#### Parameter: `MockAgentOptions`
|
|
26
61
|
|
|
27
|
-
|
|
62
|
+
* Extends: {AgentOptions}
|
|
63
|
+
* `agent` {Dispatcher} (optional) A custom agent to be encapsulated by the
|
|
64
|
+
`MockAgent`. It must implement the `Agent` API (that is, expose a `dispatch`
|
|
65
|
+
function). **Default:** a new {Agent} constructed from `options`.
|
|
66
|
+
* `ignoreTrailingSlash` {boolean} (optional) Whether trailing slashes in the
|
|
67
|
+
request path are ignored when matching interceptors. **Default:** `false`.
|
|
68
|
+
* `acceptNonStandardSearchParameters` {boolean} (optional) Whether the matcher
|
|
69
|
+
also accepts URLs using non-standard search-parameter syntaxes, such as
|
|
70
|
+
multi-value items written with `[]` (for example `param[]=1¶m[]=2`) or
|
|
71
|
+
comma-separated values (for example `param=1,2,3`). **Default:** `false`.
|
|
72
|
+
* `enableCallHistory` {boolean} (optional) Whether call history recording is
|
|
73
|
+
enabled. See [`mockAgent.getCallHistory()`][]. **Default:** `false`.
|
|
28
74
|
|
|
29
|
-
```
|
|
75
|
+
```mjs displayName="Basic instantiation"
|
|
30
76
|
import { MockAgent } from 'undici'
|
|
31
77
|
|
|
32
78
|
const mockAgent = new MockAgent()
|
|
33
79
|
```
|
|
34
80
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
```js
|
|
81
|
+
```mjs displayName="Instantiation with a custom agent"
|
|
38
82
|
import { Agent, MockAgent } from 'undici'
|
|
39
83
|
|
|
40
84
|
const agent = new Agent()
|
|
@@ -42,34 +86,30 @@ const agent = new Agent()
|
|
|
42
86
|
const mockAgent = new MockAgent({ agent })
|
|
43
87
|
```
|
|
44
88
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
### `MockAgent.get(origin)`
|
|
48
|
-
|
|
49
|
-
This method creates and retrieves MockPool or MockClient instances which can then be used to intercept HTTP requests. If the number of connections on the mock agent is set to 1, a MockClient instance is returned. Otherwise a MockPool instance is returned.
|
|
89
|
+
### `mockAgent.get(origin)`
|
|
50
90
|
|
|
51
|
-
|
|
91
|
+
<!-- YAML
|
|
92
|
+
added: v4.0.0
|
|
93
|
+
-->
|
|
52
94
|
|
|
53
|
-
|
|
95
|
+
* `origin` {string|RegExp|Function} A matcher for the origin to retrieve. The
|
|
96
|
+
function form has the signature `(origin) => boolean`.
|
|
97
|
+
* Returns: {MockClient|MockPool}
|
|
54
98
|
|
|
55
|
-
|
|
99
|
+
Creates and retrieves the mock dispatcher used to intercept requests for the
|
|
100
|
+
given origin. When the `connections` option of the `MockAgent` is `1`, a
|
|
101
|
+
{MockClient} is returned; otherwise a {MockPool} is returned. Subsequent calls
|
|
102
|
+
with the same origin return the same instance.
|
|
56
103
|
|
|
57
|
-
|
|
58
|
-
|:------------:| -------------------------- |
|
|
59
|
-
| `string` | Exact match against string |
|
|
60
|
-
| `RegExp` | Regex must pass |
|
|
61
|
-
| `Function` | Function must return true |
|
|
104
|
+
The way `origin` is matched against incoming requests depends on its type:
|
|
62
105
|
|
|
63
|
-
|
|
106
|
+
| Matcher type | Condition to pass |
|
|
107
|
+
| :----------: | ---------------------------- |
|
|
108
|
+
| `string` | Exact match against the value |
|
|
109
|
+
| `RegExp` | The regular expression matches |
|
|
110
|
+
| `Function` | The function returns `true` |
|
|
64
111
|
|
|
65
|
-
|
|
66
|
-
| -------------------- | ---------------------- |
|
|
67
|
-
| `connections === 1` | `MockClient` |
|
|
68
|
-
| `connections` > `1` | `MockPool` |
|
|
69
|
-
|
|
70
|
-
#### Example - Basic Mocked Request
|
|
71
|
-
|
|
72
|
-
```js
|
|
112
|
+
```mjs displayName="Basic mocked request"
|
|
73
113
|
import { MockAgent, setGlobalDispatcher, request } from 'undici'
|
|
74
114
|
|
|
75
115
|
const mockAgent = new MockAgent()
|
|
@@ -87,9 +127,7 @@ for await (const data of body) {
|
|
|
87
127
|
}
|
|
88
128
|
```
|
|
89
129
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
```js
|
|
130
|
+
```mjs displayName="Mocked request using a local dispatcher"
|
|
93
131
|
import { MockAgent, request } from 'undici'
|
|
94
132
|
|
|
95
133
|
const mockAgent = new MockAgent()
|
|
@@ -97,10 +135,9 @@ const mockAgent = new MockAgent()
|
|
|
97
135
|
const mockPool = mockAgent.get('http://localhost:3000')
|
|
98
136
|
mockPool.intercept({ path: '/foo' }).reply(200, 'foo')
|
|
99
137
|
|
|
100
|
-
const {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
} = await request('http://localhost:3000/foo', { dispatcher: mockAgent })
|
|
138
|
+
const { statusCode, body } = await request('http://localhost:3000/foo', {
|
|
139
|
+
dispatcher: mockAgent
|
|
140
|
+
})
|
|
104
141
|
|
|
105
142
|
console.log('response received', statusCode) // response received 200
|
|
106
143
|
|
|
@@ -109,31 +146,27 @@ for await (const data of body) {
|
|
|
109
146
|
}
|
|
110
147
|
```
|
|
111
148
|
|
|
112
|
-
|
|
149
|
+
```mjs displayName="Testing code that accepts a pool"
|
|
150
|
+
import { MockAgent } from 'undici'
|
|
113
151
|
|
|
114
|
-
|
|
115
|
-
|
|
152
|
+
async function getStatus (pool) {
|
|
153
|
+
const { statusCode } = await pool.request({
|
|
154
|
+
path: '/foo',
|
|
155
|
+
method: 'GET'
|
|
156
|
+
})
|
|
116
157
|
|
|
117
|
-
|
|
158
|
+
return statusCode
|
|
159
|
+
}
|
|
118
160
|
|
|
161
|
+
const mockAgent = new MockAgent()
|
|
119
162
|
const mockPool = mockAgent.get('http://localhost:3000')
|
|
120
|
-
mockPool.intercept({ path: '/foo' }).reply(200, 'foo')
|
|
121
|
-
|
|
122
|
-
const {
|
|
123
|
-
statusCode,
|
|
124
|
-
body
|
|
125
|
-
} = await request('http://localhost:3000/foo', { dispatcher: mockPool })
|
|
126
163
|
|
|
127
|
-
|
|
164
|
+
mockPool.intercept({ path: '/foo', method: 'GET' }).reply(200)
|
|
128
165
|
|
|
129
|
-
|
|
130
|
-
console.log('data', data.toString('utf8')) // data foo
|
|
131
|
-
}
|
|
166
|
+
console.log(await getStatus(mockPool)) // 200
|
|
132
167
|
```
|
|
133
168
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
```js
|
|
169
|
+
```mjs displayName="Returning a MockClient"
|
|
137
170
|
import { MockAgent, request } from 'undici'
|
|
138
171
|
|
|
139
172
|
const mockAgent = new MockAgent({ connections: 1 })
|
|
@@ -141,10 +174,9 @@ const mockAgent = new MockAgent({ connections: 1 })
|
|
|
141
174
|
const mockClient = mockAgent.get('http://localhost:3000')
|
|
142
175
|
mockClient.intercept({ path: '/foo' }).reply(200, 'foo')
|
|
143
176
|
|
|
144
|
-
const {
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
} = await request('http://localhost:3000/foo', { dispatcher: mockClient })
|
|
177
|
+
const { statusCode, body } = await request('http://localhost:3000/foo', {
|
|
178
|
+
dispatcher: mockClient
|
|
179
|
+
})
|
|
148
180
|
|
|
149
181
|
console.log('response received', statusCode) // response received 200
|
|
150
182
|
|
|
@@ -153,131 +185,64 @@ for await (const data of body) {
|
|
|
153
185
|
}
|
|
154
186
|
```
|
|
155
187
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
```js
|
|
188
|
+
```mjs displayName="Matching the origin with a regular expression"
|
|
159
189
|
import { MockAgent, setGlobalDispatcher, request } from 'undici'
|
|
160
190
|
|
|
161
191
|
const mockAgent = new MockAgent()
|
|
162
192
|
setGlobalDispatcher(mockAgent)
|
|
163
193
|
|
|
164
|
-
const mockPool = mockAgent.get('http://localhost:3000')
|
|
194
|
+
const mockPool = mockAgent.get(new RegExp('http://localhost:3000'))
|
|
165
195
|
mockPool.intercept({ path: '/foo' }).reply(200, 'foo')
|
|
166
|
-
mockPool.intercept({ path: '/hello'}).reply(200, 'hello')
|
|
167
|
-
|
|
168
|
-
const result1 = await request('http://localhost:3000/foo')
|
|
169
196
|
|
|
170
|
-
|
|
197
|
+
const { statusCode } = await request('http://localhost:3000/foo')
|
|
171
198
|
|
|
172
|
-
|
|
173
|
-
console.log('data', data.toString('utf8')) // data foo
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
const result2 = await request('http://localhost:3000/hello')
|
|
177
|
-
|
|
178
|
-
console.log('response received', result2.statusCode) // response received 200
|
|
179
|
-
|
|
180
|
-
for await (const data of result2.body) {
|
|
181
|
-
console.log('data', data.toString('utf8')) // data hello
|
|
182
|
-
}
|
|
183
|
-
```
|
|
184
|
-
|
|
185
|
-
#### Example - Mock different requests within the same file
|
|
186
|
-
|
|
187
|
-
```js
|
|
188
|
-
const { MockAgent, setGlobalDispatcher } = require('undici');
|
|
189
|
-
const agent = new MockAgent();
|
|
190
|
-
agent.disableNetConnect();
|
|
191
|
-
setGlobalDispatcher(agent);
|
|
192
|
-
describe('Test', () => {
|
|
193
|
-
it('200', async () => {
|
|
194
|
-
const mockAgent = agent.get('http://test.com');
|
|
195
|
-
// your test
|
|
196
|
-
});
|
|
197
|
-
it('200', async () => {
|
|
198
|
-
const mockAgent = agent.get('http://testing.com');
|
|
199
|
-
// your test
|
|
200
|
-
});
|
|
201
|
-
});
|
|
199
|
+
console.log('response received', statusCode) // response received 200
|
|
202
200
|
```
|
|
203
201
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
```js
|
|
202
|
+
```mjs displayName="Matching the origin with a function"
|
|
207
203
|
import { MockAgent, setGlobalDispatcher, request } from 'undici'
|
|
208
204
|
|
|
209
205
|
const mockAgent = new MockAgent()
|
|
210
206
|
setGlobalDispatcher(mockAgent)
|
|
211
207
|
|
|
212
|
-
const mockPool = mockAgent.get('http://localhost:3000')
|
|
213
|
-
|
|
214
|
-
mockPool.intercept({
|
|
215
|
-
path: '/foo?hello=there&see=ya',
|
|
216
|
-
method: 'POST',
|
|
217
|
-
body: 'form1=data1&form2=data2'
|
|
218
|
-
}).reply(200, { foo: 'bar' }, {
|
|
219
|
-
headers: { 'content-type': 'application/json' },
|
|
220
|
-
trailers: { 'Content-MD5': 'test' }
|
|
221
|
-
})
|
|
208
|
+
const mockPool = mockAgent.get((origin) => origin === 'http://localhost:3000')
|
|
209
|
+
mockPool.intercept({ path: '/foo' }).reply(200, 'foo')
|
|
222
210
|
|
|
223
|
-
const {
|
|
224
|
-
statusCode,
|
|
225
|
-
headers,
|
|
226
|
-
trailers,
|
|
227
|
-
body
|
|
228
|
-
} = await request('http://localhost:3000/foo?hello=there&see=ya', {
|
|
229
|
-
method: 'POST',
|
|
230
|
-
body: 'form1=data1&form2=data2'
|
|
231
|
-
})
|
|
211
|
+
const { statusCode } = await request('http://localhost:3000/foo')
|
|
232
212
|
|
|
233
213
|
console.log('response received', statusCode) // response received 200
|
|
234
|
-
console.log('headers', headers) // { 'content-type': 'application/json' }
|
|
235
|
-
|
|
236
|
-
for await (const data of body) {
|
|
237
|
-
console.log('data', data.toString('utf8')) // '{"foo":"bar"}'
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
console.log('trailers', trailers) // { 'content-md5': 'test' }
|
|
241
214
|
```
|
|
242
215
|
|
|
243
|
-
|
|
216
|
+
### `mockAgent.dispatch(options, handler)`
|
|
244
217
|
|
|
245
|
-
|
|
246
|
-
|
|
218
|
+
<!-- YAML
|
|
219
|
+
added: v4.0.0
|
|
220
|
+
-->
|
|
247
221
|
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
const mockPool = mockAgent.get(new RegExp('http://localhost:3000'))
|
|
252
|
-
mockPool.intercept({ path: '/foo' }).reply(200, 'foo')
|
|
222
|
+
* `options` {AgentDispatchOptions}
|
|
223
|
+
* `handler` {DispatchHandler}
|
|
224
|
+
* Returns: {boolean}
|
|
253
225
|
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
226
|
+
Dispatches a mocked request. This implements
|
|
227
|
+
[`Dispatcher.dispatch()`][] for the encapsulated agent: it ensures the mock
|
|
228
|
+
dispatcher for `options.origin` exists, records the call in the call history
|
|
229
|
+
when enabled, and forwards the request to the underlying agent. It is normally
|
|
230
|
+
invoked indirectly through higher-level methods such as
|
|
231
|
+
[`mockAgent.request()`][].
|
|
258
232
|
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
for await (const data of body) {
|
|
262
|
-
console.log('data', data.toString('utf8')) // data foo
|
|
263
|
-
}
|
|
264
|
-
```
|
|
265
|
-
|
|
266
|
-
#### Example - Mocked request with origin function
|
|
267
|
-
|
|
268
|
-
```js
|
|
269
|
-
import { MockAgent, setGlobalDispatcher, request } from 'undici'
|
|
233
|
+
```mjs displayName="Using mockAgent.request()"
|
|
234
|
+
import { MockAgent } from 'undici'
|
|
270
235
|
|
|
271
236
|
const mockAgent = new MockAgent()
|
|
272
|
-
setGlobalDispatcher(mockAgent)
|
|
273
237
|
|
|
274
|
-
const mockPool = mockAgent.get(
|
|
238
|
+
const mockPool = mockAgent.get('http://localhost:3000')
|
|
275
239
|
mockPool.intercept({ path: '/foo' }).reply(200, 'foo')
|
|
276
240
|
|
|
277
|
-
const {
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
241
|
+
const { statusCode, body } = await mockAgent.request({
|
|
242
|
+
origin: 'http://localhost:3000',
|
|
243
|
+
path: '/foo',
|
|
244
|
+
method: 'GET'
|
|
245
|
+
})
|
|
281
246
|
|
|
282
247
|
console.log('response received', statusCode) // response received 200
|
|
283
248
|
|
|
@@ -286,15 +251,19 @@ for await (const data of body) {
|
|
|
286
251
|
}
|
|
287
252
|
```
|
|
288
253
|
|
|
289
|
-
### `
|
|
254
|
+
### `mockAgent.close()`
|
|
290
255
|
|
|
291
|
-
|
|
256
|
+
<!-- YAML
|
|
257
|
+
added: v4.0.0
|
|
258
|
+
-->
|
|
292
259
|
|
|
293
|
-
Returns:
|
|
260
|
+
* Returns: {Promise<void>} Resolves once the agent and its registered mock pools
|
|
261
|
+
and clients have closed.
|
|
294
262
|
|
|
295
|
-
|
|
263
|
+
Clears the call history, closes the encapsulated agent, and waits for all
|
|
264
|
+
registered mock pools and clients to close.
|
|
296
265
|
|
|
297
|
-
```
|
|
266
|
+
```mjs displayName="Clean up after tests"
|
|
298
267
|
import { MockAgent, setGlobalDispatcher } from 'undici'
|
|
299
268
|
|
|
300
269
|
const mockAgent = new MockAgent()
|
|
@@ -303,49 +272,18 @@ setGlobalDispatcher(mockAgent)
|
|
|
303
272
|
await mockAgent.close()
|
|
304
273
|
```
|
|
305
274
|
|
|
306
|
-
### `
|
|
307
|
-
|
|
308
|
-
Implements [`Agent.dispatch(options, handlers)`](/docs/docs/api/Agent.md#parameter-agentdispatchoptions).
|
|
275
|
+
### `mockAgent.deactivate()`
|
|
309
276
|
|
|
310
|
-
|
|
277
|
+
<!-- YAML
|
|
278
|
+
added: v4.0.0
|
|
279
|
+
-->
|
|
311
280
|
|
|
312
|
-
|
|
281
|
+
* Returns: {undefined}
|
|
313
282
|
|
|
314
|
-
|
|
283
|
+
Disables mocking on the `MockAgent`. While deactivated, requests are no longer
|
|
284
|
+
intercepted.
|
|
315
285
|
|
|
316
|
-
```
|
|
317
|
-
import { MockAgent } from 'undici'
|
|
318
|
-
|
|
319
|
-
const mockAgent = new MockAgent()
|
|
320
|
-
|
|
321
|
-
const mockPool = mockAgent.get('http://localhost:3000')
|
|
322
|
-
mockPool.intercept({ path: '/foo' }).reply(200, 'foo')
|
|
323
|
-
|
|
324
|
-
const {
|
|
325
|
-
statusCode,
|
|
326
|
-
body
|
|
327
|
-
} = await mockAgent.request({
|
|
328
|
-
origin: 'http://localhost:3000',
|
|
329
|
-
path: '/foo',
|
|
330
|
-
method: 'GET'
|
|
331
|
-
})
|
|
332
|
-
|
|
333
|
-
console.log('response received', statusCode) // response received 200
|
|
334
|
-
|
|
335
|
-
for await (const data of body) {
|
|
336
|
-
console.log('data', data.toString('utf8')) // data foo
|
|
337
|
-
}
|
|
338
|
-
```
|
|
339
|
-
|
|
340
|
-
### `MockAgent.deactivate()`
|
|
341
|
-
|
|
342
|
-
This method disables mocking in MockAgent.
|
|
343
|
-
|
|
344
|
-
Returns: `void`
|
|
345
|
-
|
|
346
|
-
#### Example - Deactivate Mocking
|
|
347
|
-
|
|
348
|
-
```js
|
|
286
|
+
```mjs displayName="Deactivate mocking"
|
|
349
287
|
import { MockAgent, setGlobalDispatcher } from 'undici'
|
|
350
288
|
|
|
351
289
|
const mockAgent = new MockAgent()
|
|
@@ -354,15 +292,19 @@ setGlobalDispatcher(mockAgent)
|
|
|
354
292
|
mockAgent.deactivate()
|
|
355
293
|
```
|
|
356
294
|
|
|
357
|
-
### `
|
|
295
|
+
### `mockAgent.activate()`
|
|
358
296
|
|
|
359
|
-
|
|
297
|
+
<!-- YAML
|
|
298
|
+
added: v4.0.0
|
|
299
|
+
-->
|
|
360
300
|
|
|
361
|
-
Returns:
|
|
301
|
+
* Returns: {undefined}
|
|
362
302
|
|
|
363
|
-
|
|
303
|
+
Enables mocking on the `MockAgent`. A `MockAgent` is activated automatically
|
|
304
|
+
when instantiated, so this method is only required after
|
|
305
|
+
[`mockAgent.deactivate()`][] has been called.
|
|
364
306
|
|
|
365
|
-
```
|
|
307
|
+
```mjs displayName="Re-activate mocking"
|
|
366
308
|
import { MockAgent, setGlobalDispatcher } from 'undici'
|
|
367
309
|
|
|
368
310
|
const mockAgent = new MockAgent()
|
|
@@ -375,21 +317,23 @@ mockAgent.deactivate()
|
|
|
375
317
|
mockAgent.activate()
|
|
376
318
|
```
|
|
377
319
|
|
|
378
|
-
### `
|
|
379
|
-
|
|
380
|
-
When requests are not matched in a MockAgent intercept, a real HTTP request is attempted. We can control this further through the use of `enableNetConnect`. This is achieved by defining host matchers so only matching requests will be attempted.
|
|
320
|
+
### `mockAgent.enableNetConnect([matcher])`
|
|
381
321
|
|
|
382
|
-
|
|
322
|
+
<!-- YAML
|
|
323
|
+
added: v4.0.0
|
|
324
|
+
-->
|
|
383
325
|
|
|
384
|
-
|
|
326
|
+
* `matcher` {string|RegExp|Function} (optional) A host matcher. When a string is
|
|
327
|
+
used it should only contain the hostname and, optionally, the port. The
|
|
328
|
+
function form has the signature `(host) => boolean`. When omitted, all
|
|
329
|
+
non-matching requests are allowed to perform a real request.
|
|
330
|
+
* Returns: {undefined}
|
|
385
331
|
|
|
386
|
-
|
|
332
|
+
Defines host matchers so that requests that are not intercepted by a mock
|
|
333
|
+
dispatcher are allowed to perform a real HTTP request. Calling this method
|
|
334
|
+
multiple times with a string appends each value to the list of allowed hosts.
|
|
387
335
|
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
#### Example - Allow all non-matching urls to be dispatched in a real HTTP request
|
|
391
|
-
|
|
392
|
-
```js
|
|
336
|
+
```mjs displayName="Allow all non-matching requests"
|
|
393
337
|
import { MockAgent, setGlobalDispatcher, request } from 'undici'
|
|
394
338
|
|
|
395
339
|
const mockAgent = new MockAgent()
|
|
@@ -401,9 +345,7 @@ await request('http://example.com')
|
|
|
401
345
|
// A real request is made
|
|
402
346
|
```
|
|
403
347
|
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
```js
|
|
348
|
+
```mjs displayName="Allow requests matching specific hosts"
|
|
407
349
|
import { MockAgent, setGlobalDispatcher, request } from 'undici'
|
|
408
350
|
|
|
409
351
|
const mockAgent = new MockAgent()
|
|
@@ -422,75 +364,167 @@ await request('http://example-3.com')
|
|
|
422
364
|
// Will throw
|
|
423
365
|
```
|
|
424
366
|
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
```js
|
|
367
|
+
```mjs displayName="Allow requests matching a regular expression or function"
|
|
428
368
|
import { MockAgent, setGlobalDispatcher, request } from 'undici'
|
|
429
369
|
|
|
430
370
|
const mockAgent = new MockAgent()
|
|
431
371
|
setGlobalDispatcher(mockAgent)
|
|
432
372
|
|
|
433
373
|
mockAgent.enableNetConnect(new RegExp('example.com'))
|
|
374
|
+
mockAgent.enableNetConnect((host) => host === 'example.org')
|
|
434
375
|
|
|
435
376
|
await request('http://example.com')
|
|
436
377
|
// A real request is made
|
|
437
378
|
```
|
|
438
379
|
|
|
439
|
-
|
|
380
|
+
### `mockAgent.disableNetConnect()`
|
|
440
381
|
|
|
441
|
-
|
|
442
|
-
|
|
382
|
+
<!-- YAML
|
|
383
|
+
added: v4.0.0
|
|
384
|
+
-->
|
|
385
|
+
|
|
386
|
+
* Returns: {undefined}
|
|
387
|
+
|
|
388
|
+
Causes every request that is not matched by a mock interceptor to throw,
|
|
389
|
+
disallowing real HTTP requests.
|
|
390
|
+
|
|
391
|
+
```mjs displayName="Throw on every non-matching request"
|
|
392
|
+
import { MockAgent, request } from 'undici'
|
|
443
393
|
|
|
444
394
|
const mockAgent = new MockAgent()
|
|
445
|
-
setGlobalDispatcher(mockAgent)
|
|
446
395
|
|
|
447
|
-
mockAgent.
|
|
396
|
+
mockAgent.disableNetConnect()
|
|
448
397
|
|
|
449
398
|
await request('http://example.com')
|
|
450
|
-
//
|
|
399
|
+
// Will throw
|
|
451
400
|
```
|
|
452
401
|
|
|
453
|
-
### `
|
|
402
|
+
### `mockAgent.enableCallHistory()`
|
|
454
403
|
|
|
455
|
-
|
|
404
|
+
<!-- YAML
|
|
405
|
+
added: v7.5.0
|
|
406
|
+
-->
|
|
456
407
|
|
|
457
|
-
Returns: `
|
|
408
|
+
* Returns: {MockAgent} The same `MockAgent` instance, for chaining.
|
|
458
409
|
|
|
459
|
-
|
|
410
|
+
Enables call history recording. Once enabled, subsequent calls are registered
|
|
411
|
+
and can be retrieved through [`mockAgent.getCallHistory()`][]. Call history can
|
|
412
|
+
also be enabled at construction time with the `enableCallHistory` option.
|
|
460
413
|
|
|
461
|
-
```
|
|
462
|
-
import { MockAgent
|
|
414
|
+
```mjs
|
|
415
|
+
import { MockAgent } from 'undici'
|
|
463
416
|
|
|
464
417
|
const mockAgent = new MockAgent()
|
|
465
418
|
|
|
466
|
-
mockAgent.
|
|
419
|
+
mockAgent.enableCallHistory()
|
|
420
|
+
```
|
|
467
421
|
|
|
468
|
-
|
|
469
|
-
|
|
422
|
+
### `mockAgent.disableCallHistory()`
|
|
423
|
+
|
|
424
|
+
<!-- YAML
|
|
425
|
+
added: v7.5.0
|
|
426
|
+
-->
|
|
427
|
+
|
|
428
|
+
* Returns: {MockAgent} The same `MockAgent` instance, for chaining.
|
|
429
|
+
|
|
430
|
+
Disables call history recording. Subsequent calls are no longer registered.
|
|
431
|
+
|
|
432
|
+
```mjs
|
|
433
|
+
import { MockAgent } from 'undici'
|
|
434
|
+
|
|
435
|
+
const mockAgent = new MockAgent({ enableCallHistory: true })
|
|
436
|
+
|
|
437
|
+
mockAgent.disableCallHistory()
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
### `mockAgent.getCallHistory()`
|
|
441
|
+
|
|
442
|
+
<!-- YAML
|
|
443
|
+
added: v7.5.0
|
|
444
|
+
-->
|
|
445
|
+
|
|
446
|
+
* Returns: {MockCallHistory|undefined} The {MockCallHistory} instance, or
|
|
447
|
+
`undefined` when call history is not enabled.
|
|
448
|
+
|
|
449
|
+
Returns the call history instance, which records every request made through the
|
|
450
|
+
`MockAgent` (whether intercepted or not). Call history is not enabled by
|
|
451
|
+
default; enable it with the `enableCallHistory` option or
|
|
452
|
+
[`mockAgent.enableCallHistory()`][].
|
|
453
|
+
|
|
454
|
+
```mjs displayName="Inspect recorded calls"
|
|
455
|
+
import { MockAgent, setGlobalDispatcher, request } from 'undici'
|
|
456
|
+
|
|
457
|
+
const mockAgent = new MockAgent({ enableCallHistory: true })
|
|
458
|
+
setGlobalDispatcher(mockAgent)
|
|
459
|
+
|
|
460
|
+
await request('http://example.com', { query: { item: 1 } })
|
|
461
|
+
|
|
462
|
+
mockAgent.getCallHistory()?.firstCall()
|
|
463
|
+
// Returns
|
|
464
|
+
// MockCallHistoryLog {
|
|
465
|
+
// body: undefined,
|
|
466
|
+
// headers: undefined,
|
|
467
|
+
// method: 'GET',
|
|
468
|
+
// origin: 'http://example.com',
|
|
469
|
+
// fullUrl: 'http://example.com/?item=1',
|
|
470
|
+
// path: '/',
|
|
471
|
+
// searchParams: { item: '1' },
|
|
472
|
+
// protocol: 'http:',
|
|
473
|
+
// host: 'example.com',
|
|
474
|
+
// port: ''
|
|
475
|
+
// }
|
|
470
476
|
```
|
|
471
477
|
|
|
472
|
-
### `
|
|
478
|
+
### `mockAgent.clearCallHistory()`
|
|
479
|
+
|
|
480
|
+
<!-- YAML
|
|
481
|
+
added: v7.5.0
|
|
482
|
+
-->
|
|
483
|
+
|
|
484
|
+
* Returns: {undefined}
|
|
485
|
+
|
|
486
|
+
Clears the call history, deleting every recorded {MockCallHistoryLog} on the
|
|
487
|
+
{MockCallHistory} instance. It is a no-op when call history has never been
|
|
488
|
+
enabled.
|
|
489
|
+
|
|
490
|
+
```mjs
|
|
491
|
+
import { MockAgent } from 'undici'
|
|
492
|
+
|
|
493
|
+
const mockAgent = new MockAgent({ enableCallHistory: true })
|
|
494
|
+
|
|
495
|
+
mockAgent.clearCallHistory()
|
|
496
|
+
```
|
|
473
497
|
|
|
474
|
-
|
|
498
|
+
### `mockAgent.pendingInterceptors()`
|
|
475
499
|
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
500
|
+
<!-- YAML
|
|
501
|
+
added: v5.1.0
|
|
502
|
+
-->
|
|
479
503
|
|
|
480
|
-
Returns:
|
|
504
|
+
* Returns: {PendingInterceptor[]} A `PendingInterceptor` is a `MockDispatch`
|
|
505
|
+
with an additional `origin` {string} property.
|
|
481
506
|
|
|
482
|
-
|
|
507
|
+
Returns the interceptors registered on the `MockAgent` that are still pending.
|
|
508
|
+
An interceptor is pending when it meets one of the following criteria:
|
|
483
509
|
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
510
|
+
* It is registered with neither `.times(<number>)` nor `.persist()` and has not
|
|
511
|
+
been invoked.
|
|
512
|
+
* It is persistent (registered with `.persist()`) and has not been invoked.
|
|
513
|
+
* It is registered with `.times(<number>)` and has not been invoked `<number>`
|
|
514
|
+
times.
|
|
487
515
|
|
|
488
|
-
|
|
516
|
+
```mjs displayName="List pending interceptors"
|
|
517
|
+
import { MockAgent } from 'undici'
|
|
518
|
+
|
|
519
|
+
const mockAgent = new MockAgent()
|
|
520
|
+
mockAgent.disableNetConnect()
|
|
521
|
+
|
|
522
|
+
mockAgent
|
|
489
523
|
.get('https://example.com')
|
|
490
524
|
.intercept({ method: 'GET', path: '/' })
|
|
491
525
|
.reply(200)
|
|
492
526
|
|
|
493
|
-
const pendingInterceptors =
|
|
527
|
+
const pendingInterceptors = mockAgent.pendingInterceptors()
|
|
494
528
|
// Returns [
|
|
495
529
|
// {
|
|
496
530
|
// timesInvoked: 0,
|
|
@@ -514,26 +548,35 @@ const pendingInterceptors = agent.pendingInterceptors()
|
|
|
514
548
|
// ]
|
|
515
549
|
```
|
|
516
550
|
|
|
517
|
-
### `
|
|
551
|
+
### `mockAgent.assertNoPendingInterceptors([options])`
|
|
552
|
+
|
|
553
|
+
<!-- YAML
|
|
554
|
+
added: v5.1.0
|
|
555
|
+
-->
|
|
518
556
|
|
|
519
|
-
|
|
557
|
+
* `options` {Object} (optional)
|
|
558
|
+
* `pendingInterceptorsFormatter` {Object} An object exposing a
|
|
559
|
+
`format(pendingInterceptors)` method used to render the pending interceptors
|
|
560
|
+
in the thrown error message. **Default:** a built-in formatter that prints a
|
|
561
|
+
table.
|
|
562
|
+
* Returns: {undefined}
|
|
520
563
|
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
564
|
+
Throws an {UndiciError} when the `MockAgent` has any pending interceptors. The
|
|
565
|
+
criteria for an interceptor being pending are the same as for
|
|
566
|
+
[`mockAgent.pendingInterceptors()`][].
|
|
524
567
|
|
|
525
|
-
|
|
568
|
+
```mjs displayName="Assert there are no pending interceptors"
|
|
569
|
+
import { MockAgent } from 'undici'
|
|
526
570
|
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
agent.disableNetConnect()
|
|
571
|
+
const mockAgent = new MockAgent()
|
|
572
|
+
mockAgent.disableNetConnect()
|
|
530
573
|
|
|
531
|
-
|
|
574
|
+
mockAgent
|
|
532
575
|
.get('https://example.com')
|
|
533
576
|
.intercept({ method: 'GET', path: '/' })
|
|
534
577
|
.reply(200)
|
|
535
578
|
|
|
536
|
-
|
|
579
|
+
mockAgent.assertNoPendingInterceptors()
|
|
537
580
|
// Throws an UndiciError with the following message:
|
|
538
581
|
//
|
|
539
582
|
// 1 interceptor is pending:
|
|
@@ -545,59 +588,35 @@ agent.assertNoPendingInterceptors()
|
|
|
545
588
|
// └─────────┴────────┴───────────────────────┴──────┴─────────────┴────────────┴─────────────┴───────────┘
|
|
546
589
|
```
|
|
547
590
|
|
|
548
|
-
|
|
591
|
+
### `mockAgent.isMockActive`
|
|
549
592
|
|
|
550
|
-
|
|
593
|
+
<!-- YAML
|
|
594
|
+
added: v5.3.0
|
|
595
|
+
-->
|
|
551
596
|
|
|
552
|
-
|
|
597
|
+
* Type: {boolean} `true` while mocking is active, `false` after
|
|
598
|
+
[`mockAgent.deactivate()`][] has been called.
|
|
553
599
|
|
|
554
|
-
|
|
555
|
-
|
|
600
|
+
A read-only property indicating whether mocking is currently active on the
|
|
601
|
+
`MockAgent`.
|
|
556
602
|
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
await request('http://example.com', { query: { item: 1 }})
|
|
561
|
-
|
|
562
|
-
mockAgent.getCallHistory()?.firstCall()
|
|
563
|
-
// Returns
|
|
564
|
-
// MockCallHistoryLog {
|
|
565
|
-
// body: undefined,
|
|
566
|
-
// headers: undefined,
|
|
567
|
-
// method: 'GET',
|
|
568
|
-
// origin: 'http://example.com',
|
|
569
|
-
// fullUrl: 'http://example.com/?item=1',
|
|
570
|
-
// path: '/',
|
|
571
|
-
// searchParams: { item: '1' },
|
|
572
|
-
// protocol: 'http:',
|
|
573
|
-
// host: 'example.com',
|
|
574
|
-
// port: ''
|
|
575
|
-
// }
|
|
576
|
-
```
|
|
577
|
-
|
|
578
|
-
#### Example - clear call history
|
|
603
|
+
```mjs
|
|
604
|
+
import { MockAgent } from 'undici'
|
|
579
605
|
|
|
580
|
-
```js
|
|
581
606
|
const mockAgent = new MockAgent()
|
|
582
607
|
|
|
583
|
-
mockAgent.
|
|
584
|
-
```
|
|
585
|
-
|
|
586
|
-
#### Example - call history instance class method
|
|
608
|
+
console.log(mockAgent.isMockActive) // true
|
|
587
609
|
|
|
588
|
-
|
|
589
|
-
const mockAgent = new MockAgent()
|
|
610
|
+
mockAgent.deactivate()
|
|
590
611
|
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
mockAgentHistory?.calls() // returns an array of MockCallHistoryLogs
|
|
594
|
-
mockAgentHistory?.firstCall() // returns the first MockCallHistoryLogs or undefined
|
|
595
|
-
mockAgentHistory?.lastCall() // returns the last MockCallHistoryLogs or undefined
|
|
596
|
-
mockAgentHistory?.nthCall(3) // returns the third MockCallHistoryLogs or undefined
|
|
597
|
-
mockAgentHistory?.filterCalls({ path: '/endpoint', hash: '#hash-value' }) // returns an Array of MockCallHistoryLogs WHERE path === /endpoint OR hash === #hash-value
|
|
598
|
-
mockAgentHistory?.filterCalls({ path: '/endpoint', hash: '#hash-value' }, { operator: 'AND' }) // returns an Array of MockCallHistoryLogs WHERE path === /endpoint AND hash === #hash-value
|
|
599
|
-
mockAgentHistory?.filterCalls(/"data": "{}"/) // returns an Array of MockCallHistoryLogs where any value match regexp
|
|
600
|
-
mockAgentHistory?.filterCalls('application/json') // returns an Array of MockCallHistoryLogs where any value === 'application/json'
|
|
601
|
-
mockAgentHistory?.filterCalls((log) => log.path === '/endpoint') // returns an Array of MockCallHistoryLogs when given function returns true
|
|
602
|
-
mockAgentHistory?.clear() // clear the history
|
|
612
|
+
console.log(mockAgent.isMockActive) // false
|
|
603
613
|
```
|
|
614
|
+
|
|
615
|
+
[`Dispatcher.dispatch()`]: Dispatcher.md#dispatcherdispatchoptions-handler
|
|
616
|
+
[`mockAgent.deactivate()`]: #mockagentdeactivate
|
|
617
|
+
[`mockAgent.enableCallHistory()`]: #mockagentenablecallhistory
|
|
618
|
+
[`mockAgent.get(origin)`]: #mockagentgetorigin
|
|
619
|
+
[`mockAgent.getCallHistory()`]: #mockagentgetcallhistory
|
|
620
|
+
[`mockAgent.pendingInterceptors()`]: #mockagentpendinginterceptors
|
|
621
|
+
[`mockAgent.request()`]: Dispatcher.md#dispatcherrequestoptions-callback
|
|
622
|
+
[`setGlobalDispatcher()`]: Dispatcher.md#setglobaldispatcherdispatcher
|