@openclaw/discord 2026.6.33 → 2026.6.35

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.
Files changed (179) hide show
  1. package/dist/action-runtime-api.js +1 -1
  2. package/dist/{api-CjnGBhM3.js → api-1GXlSrYP.js} +42 -21
  3. package/dist/api.js +14 -14
  4. package/dist/{approval-handler.runtime-BWPQrzpP.js → approval-handler.runtime-Dv4p7REU.js} +3 -3
  5. package/dist/{audit-BwJ_2OjL.js → audit-DEVi9nIs.js} +3 -3
  6. package/dist/{channel-Ddnonoy4.js → channel-CQIRiosn.js} +15 -15
  7. package/dist/{channel-actions-CwmIqnYN.js → channel-actions-JziPEcBU.js} +2 -2
  8. package/dist/{channel-actions.runtime-DvpTfaJ4.js → channel-actions.runtime-D7L47LY3.js} +5 -5
  9. package/dist/channel-plugin-api.js +1 -1
  10. package/dist/{channel.setup-glZ5Y98a.js → channel.setup-oMeR19Cc.js} +2 -2
  11. package/dist/{components-j6lTZBsT.js → components-_s5UPJqU.js} +1 -1
  12. package/dist/{conversation-identity-36FFBwm5.js → conversation-identity-B0k94-bz.js} +2 -2
  13. package/dist/{directory-config-BYMFzL29.js → directory-config-CD1svkyN.js} +1 -1
  14. package/dist/directory-contract-api.js +1 -1
  15. package/dist/{directory-live-9JtJCiu8.js → directory-live-DBTsSRxl.js} +5 -5
  16. package/dist/{handle-action.guild-admin-xxGYrp-I.js → handle-action.guild-admin-CYIFMxh-.js} +2 -2
  17. package/dist/index.js +1 -1
  18. package/dist/{manager.runtime-BK6cf2Zu.js → manager.runtime-BZVdGX2d.js} +17 -9
  19. package/dist/{message-handler-BqpJIavO.js → message-handler-DZd9Bpq8.js} +7 -6
  20. package/dist/{message-handler.preflight-C90MxCcv.js → message-handler.preflight-Axv9J9EO.js} +12 -11
  21. package/dist/{message-handler.process-CeQ7Bd_3.js → message-handler.process-CG0zFS-Z.js} +10 -10
  22. package/dist/{message-utils-CJeAoISH.js → message-utils-Dbuw27gd.js} +1 -1
  23. package/dist/{outbound-adapter-Dxs6iKEq.js → outbound-adapter-CKC_kmUN.js} +6 -6
  24. package/dist/pluralkit-CfTReLl3.js +40 -0
  25. package/dist/{probe-esE_Oqdm.js → probe-DcgZIpyF.js} +3 -2
  26. package/dist/{probe.runtime-C3Atgpvr.js → probe.runtime-CVwM9L5E.js} +1 -1
  27. package/dist/{provider-C7376XFH.js → provider-CwwSXIIj.js} +102 -37
  28. package/dist/{provider-session.runtime-CCdqogGf.js → provider-session.runtime-reBWkqHZ.js} +3 -3
  29. package/dist/provider.runtime-BsmTLYS_.js +2 -0
  30. package/dist/{resolve-allowlist-common-3gB2Gpmm.js → resolve-allowlist-common-D7bZqAw3.js} +3 -3
  31. package/dist/{resolve-channels-B3gQf8QL.js → resolve-channels--oE-RnO6.js} +6 -6
  32. package/dist/{resolve-users-BO10y5fJ.js → resolve-users-QXo8CXBU.js} +5 -5
  33. package/dist/{runtime-CFlR3L9X.js → runtime-CF7ramAs.js} +7 -7
  34. package/dist/runtime-api.actions.js +2 -2
  35. package/dist/runtime-api.js +19 -19
  36. package/dist/runtime-api.lookup.js +5 -5
  37. package/dist/runtime-api.monitor-CzF8MUl_.js +6 -0
  38. package/dist/runtime-api.monitor.js +5 -5
  39. package/dist/runtime-api.send.js +5 -5
  40. package/dist/runtime-api.threads.js +3 -3
  41. package/dist/{send-JHxfT4Pk.js → send-Bb295iHT.js} +5 -5
  42. package/dist/{send.components-CN35E2Ck.js → send.components-COkDUO3B.js} +4 -4
  43. package/dist/{send.outbound-B-cA1Esv.js → send.outbound-B_sk0hNe.js} +3 -3
  44. package/dist/{send.receipt-CGecJDin.js → send.receipt-Cli6_9Sn.js} +19 -7
  45. package/dist/{send.shared-vcbfThdy.js → send.shared-BCG7MWnP.js} +2 -2
  46. package/dist/session-binding-contract-api.js +1 -1
  47. package/dist/setup-plugin-api.js +1 -1
  48. package/dist/{subagent-hooks-20wXhVzZ.js → subagent-hooks-CtqoWK4x.js} +2 -2
  49. package/dist/subagent-hooks-api.js +1 -1
  50. package/dist/{system-events-DR27TE7p.js → system-events-BxGNk_wE.js} +1 -1
  51. package/dist/{target-resolver-CDi1gI90.js → target-resolver-BcoK6b0g.js} +2 -2
  52. package/dist/targets-Q-ZoP7K4.js +3 -0
  53. package/dist/{thread-bindings-DU4T6nDo.js → thread-bindings-DJ_HT6GJ.js} +4 -4
  54. package/dist/{thread-bindings.discord-api-CYkr-3Gj.js → thread-bindings.discord-api-OPyjvgyz.js} +4 -4
  55. package/dist/{thread-bindings.manager-BqWs1UE2.js → thread-bindings.manager-Cd2HAVw_.js} +3 -3
  56. package/dist/{transcripts-source-D-lBI5ZD.js → transcripts-source-CPf5gURy.js} +1 -1
  57. package/dist/transcripts-source-api.js +1 -1
  58. package/dist/{typing-xr05bL-r.js → typing-DY0cwLdg.js} +1 -1
  59. package/node_modules/undici/README.md +8 -2
  60. package/node_modules/undici/docs/docs/api/Agent.md +248 -44
  61. package/node_modules/undici/docs/docs/api/BalancedPool.md +246 -48
  62. package/node_modules/undici/docs/docs/api/CacheStorage.md +171 -13
  63. package/node_modules/undici/docs/docs/api/CacheStore.md +294 -98
  64. package/node_modules/undici/docs/docs/api/Client.md +386 -179
  65. package/node_modules/undici/docs/docs/api/ClientStats.md +80 -14
  66. package/node_modules/undici/docs/docs/api/Connector.md +118 -36
  67. package/node_modules/undici/docs/docs/api/ContentType.md +65 -25
  68. package/node_modules/undici/docs/docs/api/Cookies.md +122 -71
  69. package/node_modules/undici/docs/docs/api/Debug.md +34 -18
  70. package/node_modules/undici/docs/docs/api/DiagnosticsChannel.md +364 -164
  71. package/node_modules/undici/docs/docs/api/Dispatcher.md +485 -1102
  72. package/node_modules/undici/docs/docs/api/EnvHttpProxyAgent.md +102 -87
  73. package/node_modules/undici/docs/docs/api/Errors.md +503 -40
  74. package/node_modules/undici/docs/docs/api/EventSource.md +298 -32
  75. package/node_modules/undici/docs/docs/api/Fetch.md +680 -31
  76. package/node_modules/undici/docs/docs/api/GlobalInstallation.md +78 -98
  77. package/node_modules/undici/docs/docs/api/H2CClient.md +298 -176
  78. package/node_modules/undici/docs/docs/api/Interceptors.md +418 -0
  79. package/node_modules/undici/docs/docs/api/MockAgent.md +333 -314
  80. package/node_modules/undici/docs/docs/api/MockCallHistory.md +272 -98
  81. package/node_modules/undici/docs/docs/api/MockCallHistoryLog.md +189 -26
  82. package/node_modules/undici/docs/docs/api/MockClient.md +151 -33
  83. package/node_modules/undici/docs/docs/api/MockErrors.md +56 -5
  84. package/node_modules/undici/docs/docs/api/MockPool.md +321 -258
  85. package/node_modules/undici/docs/docs/api/Pool.md +235 -43
  86. package/node_modules/undici/docs/docs/api/PoolStats.md +119 -13
  87. package/node_modules/undici/docs/docs/api/ProxyAgent.md +179 -160
  88. package/node_modules/undici/docs/docs/api/RedirectHandler.md +238 -63
  89. package/node_modules/undici/docs/docs/api/RetryAgent.md +113 -26
  90. package/node_modules/undici/docs/docs/api/RetryHandler.md +161 -77
  91. package/node_modules/undici/docs/docs/api/RoundRobinPool.md +166 -72
  92. package/node_modules/undici/docs/docs/api/SnapshotAgent.md +264 -542
  93. package/node_modules/undici/docs/docs/api/Socks5ProxyAgent.md +177 -196
  94. package/node_modules/undici/docs/docs/api/Util.md +68 -11
  95. package/node_modules/undici/docs/docs/api/WebSocket.md +475 -80
  96. package/node_modules/undici/docs/docs/api/api-lifecycle.md +100 -32
  97. package/node_modules/undici/docs/docs/best-practices/client-certificate.md +2 -0
  98. package/node_modules/undici/docs/docs/best-practices/crawling.md +3 -1
  99. package/node_modules/undici/docs/docs/best-practices/migrating-from-v7-to-v8.md +6 -4
  100. package/node_modules/undici/docs/docs/best-practices/mocking-request.md +9 -7
  101. package/node_modules/undici/docs/docs/best-practices/proxy.md +3 -1
  102. package/node_modules/undici/docs/docs/best-practices/undici-vs-builtin-fetch.md +10 -8
  103. package/node_modules/undici/docs/docs/best-practices/writing-tests.md +2 -0
  104. package/node_modules/undici/docs/docs/{GettingStarted.md → getting-started.md} +22 -19
  105. package/node_modules/undici/docs/docs/index.md +784 -0
  106. package/node_modules/undici/docs/docs/site.json +125 -0
  107. package/node_modules/undici/docs/docs/type-map.json +79 -0
  108. package/node_modules/undici/lib/api/api-request.js +7 -1
  109. package/node_modules/undici/lib/api/readable.js +42 -7
  110. package/node_modules/undici/lib/cache/memory-cache-store.js +56 -11
  111. package/node_modules/undici/lib/cache/sqlite-cache-store.js +7 -1
  112. package/node_modules/undici/lib/core/connect.js +16 -2
  113. package/node_modules/undici/lib/core/errors.js +20 -0
  114. package/node_modules/undici/lib/core/request.js +14 -3
  115. package/node_modules/undici/lib/core/symbols.js +3 -0
  116. package/node_modules/undici/lib/core/util.js +30 -2
  117. package/node_modules/undici/lib/dispatcher/agent.js +10 -5
  118. package/node_modules/undici/lib/dispatcher/balanced-pool.js +7 -4
  119. package/node_modules/undici/lib/dispatcher/client-h1.js +74 -9
  120. package/node_modules/undici/lib/dispatcher/client-h2.js +483 -151
  121. package/node_modules/undici/lib/dispatcher/client.js +76 -30
  122. package/node_modules/undici/lib/dispatcher/dispatcher-base.js +13 -1
  123. package/node_modules/undici/lib/dispatcher/dispatcher.js +15 -1
  124. package/node_modules/undici/lib/dispatcher/dispatcher1-wrapper.js +3 -0
  125. package/node_modules/undici/lib/dispatcher/env-http-proxy-agent.js +37 -8
  126. package/node_modules/undici/lib/dispatcher/proxy-agent.js +58 -7
  127. package/node_modules/undici/lib/dispatcher/retry-agent.js +3 -0
  128. package/node_modules/undici/lib/dispatcher/round-robin-pool.js +1 -1
  129. package/node_modules/undici/lib/dispatcher/socks5-proxy-agent.js +106 -22
  130. package/node_modules/undici/lib/global.js +36 -16
  131. package/node_modules/undici/lib/handler/cache-handler.js +297 -65
  132. package/node_modules/undici/lib/handler/cache-revalidation-handler.js +13 -3
  133. package/node_modules/undici/lib/handler/decorator-handler.js +7 -1
  134. package/node_modules/undici/lib/handler/deduplication-handler.js +12 -6
  135. package/node_modules/undici/lib/handler/redirect-handler.js +26 -5
  136. package/node_modules/undici/lib/handler/retry-handler.js +238 -51
  137. package/node_modules/undici/lib/interceptor/cache.js +221 -58
  138. package/node_modules/undici/lib/interceptor/decompress.js +124 -15
  139. package/node_modules/undici/lib/interceptor/deduplicate.js +5 -4
  140. package/node_modules/undici/lib/interceptor/dns.js +7 -0
  141. package/node_modules/undici/lib/interceptor/dump.js +10 -23
  142. package/node_modules/undici/lib/mock/mock-agent.js +13 -1
  143. package/node_modules/undici/lib/mock/mock-interceptor.js +25 -7
  144. package/node_modules/undici/lib/mock/mock-utils.js +246 -27
  145. package/node_modules/undici/lib/util/cache.js +415 -71
  146. package/node_modules/undici/lib/util/date.js +23 -6
  147. package/node_modules/undici/lib/web/cookies/parse.js +150 -146
  148. package/node_modules/undici/lib/web/cookies/util.js +79 -9
  149. package/node_modules/undici/lib/web/eventsource/eventsource-stream.js +28 -1
  150. package/node_modules/undici/lib/web/eventsource/eventsource.js +13 -3
  151. package/node_modules/undici/lib/web/eventsource/util.js +1 -1
  152. package/node_modules/undici/lib/web/fetch/body.js +2 -1
  153. package/node_modules/undici/lib/web/fetch/constants.js +1 -1
  154. package/node_modules/undici/lib/web/fetch/index.js +17 -2
  155. package/node_modules/undici/lib/web/fetch/request.js +2 -3
  156. package/node_modules/undici/lib/web/fetch/response.js +1 -3
  157. package/node_modules/undici/lib/web/fetch/util.js +10 -2
  158. package/node_modules/undici/lib/web/webidl/index.js +3 -3
  159. package/node_modules/undici/lib/web/websocket/connection.js +1 -1
  160. package/node_modules/undici/lib/web/websocket/permessage-deflate.js +5 -0
  161. package/node_modules/undici/lib/web/websocket/stream/websocketstream.js +8 -10
  162. package/node_modules/undici/lib/web/websocket/websocket.js +22 -0
  163. package/node_modules/undici/package.json +4 -4
  164. package/node_modules/undici/types/client.d.ts +53 -3
  165. package/node_modules/undici/types/cookies.d.ts +1 -1
  166. package/node_modules/undici/types/dispatcher.d.ts +3 -3
  167. package/node_modules/undici/types/errors.d.ts +10 -0
  168. package/node_modules/undici/types/handlers.d.ts +2 -0
  169. package/node_modules/undici/types/interceptors.d.ts +2 -0
  170. package/node_modules/undici/types/mock-agent.d.ts +11 -10
  171. package/node_modules/undici/types/mock-interceptor.d.ts +5 -1
  172. package/node_modules/undici/types/proxy-agent.d.ts +7 -0
  173. package/node_modules/undici/types/socks5-proxy-agent.d.ts +2 -0
  174. package/npm-shrinkwrap.json +7 -7
  175. package/package.json +6 -5
  176. package/dist/pluralkit-DI6RYaVj.js +0 -24
  177. package/dist/provider.runtime-D1m66kDS.js +0 -2
  178. package/dist/runtime-api.monitor-4oc58TSk.js +0 -6
  179. package/dist/targets-C6yd3y8R.js +0 -3
@@ -1,103 +1,189 @@
1
- # Class: Client
2
-
3
- Extends: `undici.Dispatcher`
4
-
5
- A basic HTTP/1.1 client, mapped on top a single TCP/TLS connection. Pipelining is disabled by default.
6
-
7
- Requests are not guaranteed to be dispatched in order of invocation.
8
-
9
- ## `new Client(url[, options])`
10
-
11
- Arguments:
12
-
13
- * **url** `URL | string` - Should only include the **protocol, hostname, and port**.
14
- * **options** `ClientOptions` (optional)
15
-
16
- Returns: `Client`
17
-
18
- ### Parameter: `ClientOptions`
19
-
20
- * **bodyTimeout** `number | null` (optional) - Default: `300e3` - The timeout after which a request will time out, in milliseconds. Monitors time between receiving body data. Use `0` to disable it entirely. Defaults to 300 seconds. Please note the `timeout` will be reset if you keep writing data to the socket everytime.
21
- * **headersTimeout** `number | null` (optional) - Default: `300e3` - The amount of time, in milliseconds, the parser will wait to receive the complete HTTP headers while not sending the request. Defaults to 300 seconds.
22
- * **keepAliveMaxTimeout** `number | null` (optional) - Default: `600e3` - The maximum allowed `keepAliveTimeout`, in milliseconds, when overridden by *keep-alive* hints from the server. Defaults to 10 minutes.
23
- * **keepAliveTimeout** `number | null` (optional) - Default: `4e3` - The timeout, in milliseconds, after which a socket without active requests will time out. Monitors time between activity on a connected socket. This value may be overridden by *keep-alive* hints from the server. See [MDN: HTTP - Headers - Keep-Alive directives](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Keep-Alive#directives) for more details. Defaults to 4 seconds.
24
- * **keepAliveTimeoutThreshold** `number | null` (optional) - Default: `2e3` - A number of milliseconds subtracted from server *keep-alive* hints when overriding `keepAliveTimeout` to account for timing inaccuracies caused by e.g. transport latency. Defaults to 2 seconds.
25
- * **maxHeaderSize** `number | null` (optional) - Default: `--max-http-header-size` or `16384` - The maximum length of request headers in bytes. Defaults to Node.js' --max-http-header-size or 16KiB.
26
- * **maxResponseSize** `number | null` (optional) - Default: `-1` - The maximum length of response body in bytes. Set to `-1` to disable.
27
- * **webSocket** `WebSocketOptions` (optional) - WebSocket-specific configuration options.
28
- * **maxFragments** `number` (optional) - Default: `131072` - Maximum number of fragments in a message. Set to 0 to disable the limit.
29
- * **maxPayloadSize** `number` (optional) - Default: `134217728` (128 MB) - Maximum allowed payload size in bytes for WebSocket messages. Applied to uncompressed messages, compressed frame payloads, and decompressed (permessage-deflate) messages. Set to 0 to disable the limit.
30
- * **pipelining** `number | null` (optional) - Default: `1` - The amount of concurrent requests to be sent over the single TCP/TLS connection according to [RFC7230](https://tools.ietf.org/html/rfc7230#section-6.3.2). Carefully consider your workload and environment before enabling concurrent requests as pipelining may reduce performance if used incorrectly. Pipelining is sensitive to network stack settings as well as head of line blocking caused by e.g. long running requests. Set to `0` to disable keep-alive connections. This option has no effect once HTTP/2 is negotiated — see `maxConcurrentStreams` for the h2 dispatch ceiling.
31
- * **connect** `ConnectOptions | Function | null` (optional) - Default: `null` - Configures how undici establishes TCP/TLS connections. Accepts two forms:
32
- * **Object (`ConnectOptions`)**: Options passed directly to the internal [`buildConnector()`](/docs/docs/api/Connector.md). This is the simplest way to customize TLS or socket behavior (e.g., setting `rejectUnauthorized`, `ca`, `socketPath`). See [`ConnectOptions`](#parameter-connectoptions) for available fields.
33
- * **Function**: A custom connector with the signature `(options, callback)`, where `options` contains `{ hostname, host, protocol, port, servername, localAddress, httpSocket }` and `callback` follows `(error, socket)`. Useful when you need full control over socket creation, such as adding custom validation or proxy logic. When a function is provided, undici wraps it to automatically inject `socketPath` and `allowH2` into the `options` argument if those values are set on the client.
34
- * **strictContentLength** `Boolean` (optional) - Default: `true` - Whether to treat request content length mismatches as errors. If true, an error is thrown when the request content-length header doesn't match the length of the request body. **Security Warning:** Disabling this option can expose your application to HTTP Request Smuggling attacks, where mismatched content-length headers cause servers and proxies to interpret request boundaries differently. This can lead to cache poisoning, credential hijacking, and bypassing security controls. Only disable this in controlled environments where you fully trust the request source.
35
- * **autoSelectFamily**: `boolean` (optional) - Default: depends on local Node version, on Node 18.13.0 and above is `false`. Enables a family autodetection algorithm that loosely implements section 5 of [RFC 8305](https://tools.ietf.org/html/rfc8305#section-5). See [here](https://nodejs.org/api/net.html#socketconnectoptions-connectlistener) for more details. This option is ignored if not supported by the current Node version.
36
- * **autoSelectFamilyAttemptTimeout**: `number` - Default: depends on local Node version, on Node 18.13.0 and above is `250`. The amount of time in milliseconds to wait for a connection attempt to finish before trying the next address when using the `autoSelectFamily` option. See [here](https://nodejs.org/api/net.html#socketconnectoptions-connectlistener) for more details.
37
- * **allowH2**: `boolean` - Default: `true`. Enables support for H2 if the server has assigned bigger priority to it through ALPN negotiation.
38
- * **useH2c**: `boolean` - Default: `false`. Enforces h2c for non-https connections.
39
- * **maxConcurrentStreams**: `number` - Default: `100`. The maximum number of concurrent HTTP/2 streams per session. When `allowH2` negotiates h2, this — not `pipelining` (which is HTTP/1.1 only, per [RFC7230](https://tools.ietf.org/html/rfc7230#section-6.3.2)) — is the ceiling the Client uses to dispatch in-flight requests on a shared session. The same value is advertised to the server as `peerMaxConcurrentStreams`, capping how many streams the server may push back. The initial value is replaced by the server's `SETTINGS_MAX_CONCURRENT_STREAMS` whenever the server sends one, so a user-supplied value acts as a pre-`SETTINGS` default rather than a hard cap.
40
- * **initialWindowSize**: `number` (optional) - Default: `262144` (256KB). Sets the HTTP/2 stream-level flow-control window size (SETTINGS_INITIAL_WINDOW_SIZE). Must be a positive integer greater than 0. This default is higher than Node.js core's default (65535 bytes) to improve throughput, Node's choice is very conservative for current high-bandwith networks. See [RFC 7540 Section 6.9.2](https://datatracker.ietf.org/doc/html/rfc7540#section-6.9.2) for more details.
41
- * **connectionWindowSize**: `number` (optional) - Default `524288` (512KB). Sets the HTTP/2 connection-level flow-control window size using `ClientHttp2Session.setLocalWindowSize()`. Must be a positive integer greater than 0. This provides better flow control for the entire connection across multiple streams. See [Node.js HTTP/2 documentation](https://nodejs.org/api/http2.html#clienthttp2sessionsetlocalwindowsize) for more details.
42
- * **pingInterval**: `number` - Default: `60e3`. The time interval in milliseconds between PING frames sent to the server. Set to `0` to disable PING frames. This is only applicable for HTTP/2 connections. This will emit a `ping` event on the client with the duration of the ping in milliseconds.
43
-
44
- > **Notes about HTTP/2**
45
- > - It only works under TLS connections. h2c is not supported.
46
- > - The server must support HTTP/2 and choose it as the protocol during the ALPN negotiation.
47
- > - The server must not have a bigger priority for HTTP/1.1 than HTTP/2.
48
- > - Pseudo headers are automatically attached to the request. If you try to set them, they will be overwritten.
49
- > - The `:path` header is automatically set to the request path.
50
- > - The `:method` header is automatically set to the request method.
51
- > - The `:scheme` header is automatically set to the request scheme.
52
- > - The `:authority` header is automatically set to the request `host[:port]`.
53
- > - `PUSH` frames are yet not supported.
54
-
55
- #### Parameter: `ConnectOptions`
56
-
57
- Every Tls option, see [here](https://nodejs.org/api/tls.html#tls_tls_connect_options_callback).
58
- Furthermore, the following options can be passed:
59
-
60
- * **socketPath** `string | null` (optional) - Default: `null` - An IPC endpoint, either Unix domain socket or Windows named pipe.
61
- * **maxCachedSessions** `number | null` (optional) - Default: `100` - Maximum number of TLS cached sessions. Use 0 to disable TLS session caching. Default: 100.
62
- * **timeout** `number | null` (optional) - In milliseconds, Default `10e3`.
63
- * **servername** `string | null` (optional)
64
- * **keepAlive** `boolean | null` (optional) - Default: `true` - TCP keep-alive enabled
65
- * **keepAliveInitialDelay** `number | null` (optional) - Default: `60000` - TCP keep-alive interval for the socket in milliseconds
66
-
67
- ### Example - Basic Client instantiation
68
-
69
- This will instantiate the undici Client, but it will not connect to the origin until something is queued. Consider using `client.connect` to prematurely connect to the origin, or just call `client.request`.
70
-
71
- ```js
72
- 'use strict'
1
+ # Client
2
+
3
+ <!--introduced_in=v1.0.0-->
4
+
5
+ <!--type=module-->
6
+
7
+ <!-- source_link=lib/dispatcher/client.js -->
8
+
9
+ > Stability: 2 - Stable
10
+
11
+ A basic HTTP/1.1 client mapped on top of a single TCP/TLS connection. When the
12
+ server supports HTTP/2 and selects it during ALPN negotiation, the same
13
+ connection is used for HTTP/2. Pipelining is disabled by default.
14
+
15
+ `Client` extends [`Dispatcher`][] and is the lowest-level dispatcher in undici:
16
+ it manages exactly one origin over one connection. For pooling across multiple
17
+ connections use [`Pool`][], and for routing across multiple origins use
18
+ [`Agent`][]. Requests are not guaranteed to be dispatched in the order in which
19
+ they are invoked.
20
+
21
+ ```mjs
73
22
  import { Client } from 'undici'
74
23
 
75
24
  const client = new Client('http://localhost:3000')
25
+ const { statusCode, body } = await client.request({ path: '/', method: 'GET' })
76
26
  ```
77
27
 
78
- ### Example - Connect with TLS options (object form)
28
+ ## Class: `Client`
29
+
30
+ <!-- YAML
31
+ added: v1.0.0
32
+ -->
33
+
34
+ * Extends: {Dispatcher}
35
+
36
+ ### `new Client(url[, options])`
37
+
38
+ <!-- YAML
39
+ added: v1.0.0
40
+ -->
41
+
42
+ * `url` {URL|string} The origin to connect to. Only the protocol, hostname, and
43
+ port are used.
44
+ * `options` {Object} (optional)
45
+ * `bodyTimeout` {number|null} The timeout, in milliseconds, after which a
46
+ request times out while receiving body data. Monitors the time between
47
+ consecutive body chunks. Use `0` to disable it entirely. **Default:**
48
+ `300e3`.
49
+ * `headersTimeout` {number|null} The timeout, in milliseconds, the parser
50
+ waits to receive the complete HTTP headers before the request times out. Use
51
+ `0` to disable it entirely. **Default:** `300e3`.
52
+ HTTP/1.1 headers/body parser timeouts are not guaranteed to fire with exact
53
+ millisecond precision: delays up to 1000ms use native timers, while larger
54
+ delays use undici's lower-overhead fast timers with a target resolution
55
+ around 500ms.
56
+ * `connectTimeout` {number|null} The timeout, in milliseconds, for
57
+ establishing a socket connection. Use `0` to disable it entirely.
58
+ **Default:** `10e3`.
59
+ * `keepAliveTimeout` {number|null} The timeout, in milliseconds, after which a
60
+ socket with no active requests times out. Monitors the time between activity
61
+ on a connected socket. This value may be overridden by *keep-alive* hints
62
+ from the server. **Default:** `4e3`.
63
+ * `keepAliveMaxTimeout` {number|null} The maximum allowed `keepAliveTimeout`,
64
+ in milliseconds, when overridden by *keep-alive* hints from the server.
65
+ **Default:** `600e3`.
66
+ * `keepAliveTimeoutThreshold` {number|null} A number of milliseconds
67
+ subtracted from server *keep-alive* hints when overriding `keepAliveTimeout`,
68
+ to account for timing inaccuracies caused by e.g. transport latency.
69
+ **Default:** `2e3`.
70
+ * `maxHeaderSize` {number|null} The maximum length of request headers, in
71
+ bytes. **Default:** the value of Node.js' `--max-http-header-size` or
72
+ `16384` (16 KiB).
73
+ * `maxResponseSize` {number|null} The maximum length of a response body, in
74
+ bytes. Set to `-1` to disable it. **Default:** `-1`.
75
+ * `maxRequestsPerClient` {number|null} The maximum number of requests to send
76
+ over a single connection before the socket is reset. Use `0` to disable this
77
+ limit. **Default:** `null`.
78
+ * `localAddress` {string|null} The local IP address the socket should connect
79
+ from. **Default:** `null`.
80
+ * `pipelining` {number|null} The number of concurrent requests sent over the
81
+ single connection, per [RFC 7230, section 6.3.2][]. Only enable values
82
+ greater than `1` when the remote server is trusted. Set to `0` to disable
83
+ keep-alive connections. Has no effect once HTTP/2 is negotiated; see
84
+ `maxConcurrentStreams` for the HTTP/2 dispatch ceiling. **Default:** `1`.
85
+ * `connect` {Object|Function|null} Configures how connections are established.
86
+ Either a `ConnectOptions` object passed to the built-in
87
+ [`buildConnector`][] (every [`tls.connect()`][] option is accepted, plus the
88
+ fields below), or a custom connector function with the signature
89
+ `(options, callback)`. **Default:** `null`.
90
+ * `socketPath` {string|null} An IPC endpoint, either a Unix domain socket or
91
+ a Windows named pipe. **Default:** `null`.
92
+ * `maxCachedSessions` {number|null} The maximum number of cached TLS
93
+ sessions. Use `0` to disable TLS session caching. **Default:** `100`.
94
+ * `timeout` {number|null} The connection timeout, in milliseconds.
95
+ **Default:** `10e3`.
96
+ * `servername` {string|null} The TLS server name used for SNI.
97
+ * `keepAlive` {boolean|null} Whether TCP keep-alive is enabled on the socket.
98
+ **Default:** `true`.
99
+ * `keepAliveInitialDelay` {number|null} The TCP keep-alive interval for the
100
+ socket, in milliseconds. **Default:** `60000`.
101
+ * `strictContentLength` {boolean} Whether to throw when the request
102
+ `content-length` header does not match the length of the request body.
103
+ Disabling this exposes the application to HTTP request smuggling; only do so
104
+ in controlled environments where the request source is fully trusted.
105
+ **Default:** `true`.
106
+ * `autoSelectFamily` {boolean} Enables a family autodetection algorithm that
107
+ loosely implements section 5 of [RFC 8305][]. Ignored if unsupported by the
108
+ current Node.js version. **Default:** `false`.
109
+ * `autoSelectFamilyAttemptTimeout` {number} The time, in milliseconds, to wait
110
+ for a connection attempt to finish before trying the next address when
111
+ `autoSelectFamily` is enabled. **Default:** `250`.
112
+ * `allowH2` {boolean} Enables HTTP/2 support when the server assigns it a
113
+ higher priority through ALPN negotiation. **Default:** `true`.
114
+ * `useH2c` {boolean} _Deprecated: use h2Options.useH2c instead_ Enforces h2c (HTTP/2 cleartext) for non-HTTPS
115
+ connections. **Default:** `false`.
116
+ * `maxConcurrentStreams` {number} _Deprecated: use h2Options.useH2c instead_ The maximum number of concurrent HTTP/2
117
+ streams for a single session. Once h2 is negotiated this — not `pipelining`,
118
+ which is HTTP/1.1 only — is the ceiling used to dispatch in-flight requests.
119
+ It may be overridden by the server's `SETTINGS_MAX_CONCURRENT_STREAMS`
120
+ frame. **Default:** `100`.
121
+ * `connectionWindowSize` {number} _Deprecated: use h2Options.connectionWindowSize instead_ The HTTP/2 connection-level flow-control
122
+ window size set via `ClientHttp2Session.setLocalWindowSize()`. Must be a
123
+ positive integer. **Default:** `524288`.
124
+ * `pingInterval` {number} _Deprecated: use h2Options.pingInterval instead_ The time interval, in milliseconds, between HTTP/2
125
+ PING frames. Set to `0` to disable PING frames. Applies only to HTTP/2
126
+ connections and emits a `ping` event on the client. **Default:** `60e3`.
127
+ * `h2Options` {object} Set of options for HTTP/2 sessions
128
+ * `useH2c` {boolean} Enforces h2c (HTTP/2 cleartext) for non-HTTPS
129
+ connections. **Default:** `false`.
130
+ * `maxConcurrentStreams` {number} The maximum number of concurrent HTTP/2
131
+ streams for a single session. Once h2 is negotiated this — not `pipelining`,
132
+ which is HTTP/1.1 only — is the ceiling used to dispatch in-flight requests.
133
+ It may be overridden by the server's `SETTINGS_MAX_CONCURRENT_STREAMS`
134
+ frame. **Default:** `100`.
135
+ * `connectionWindowSize` {number} The HTTP/2 connection-level flow-control
136
+ window size set via `ClientHttp2Session.setLocalWindowSize()`. Must be a
137
+ positive integer. **Default:** `524288`.
138
+ * `pingInterval` {number} The time interval, in milliseconds, between HTTP/2
139
+ PING frames. Set to `0` to disable PING frames. Applies only to HTTP/2
140
+ connections and emits a `ping` event on the client. **Default:** `60e3`.
141
+ * `settings` {object} `SETTINGS` frame options. For full reference, take a
142
+ look to [HTTP/2#Settings Object](https://nodejs.org/api/http2.html#settings-object)
143
+ * `webSocket` {Object} (optional) WebSocket-specific configuration.
144
+ * `maxFragments` {number} The maximum number of fragments in a message. Set
145
+ to `0` to disable the limit. **Default:** `131072`.
146
+ * `maxPayloadSize` {number} The maximum allowed payload size, in bytes, for
147
+ WebSocket messages. Applied to uncompressed messages, compressed frame
148
+ payloads, and decompressed (`permessage-deflate`) messages. Set to `0` to
149
+ disable the limit. **Default:** `134217728`.
150
+ * `eventSource` {Object} (optional) EventSource-specific configuration.
151
+ * `maxEventSize` {number} The maximum allowed event size, in bytes, for
152
+ EventSource messages. Set to `0` to disable the limit.
153
+ **Default:** `buffer.kStringMaxLength`.
154
+ * Returns: {Client}
155
+
156
+ Instantiating a `Client` does not open a connection; the connection is
157
+ established lazily once a request is queued. Call `client.connect()` to connect
158
+ eagerly.
159
+
160
+ > Notes about HTTP/2:
161
+ >
162
+ > * Pseudo headers (`:path`, `:method`, `:scheme`, `:authority`) are attached
163
+ > automatically and overwrite any user-provided values.
164
+ > * The server must support HTTP/2 and select it during ALPN negotiation, and
165
+ > must not give HTTP/1.1 a higher priority than HTTP/2.
166
+ > * `PUSH` frames are not supported.
167
+
168
+ ```mjs displayName="Basic instantiation"
169
+ import { Client } from 'undici'
79
170
 
80
- Pass a `ConnectOptions` object to customize the TLS connection. The options are forwarded to the internal `buildConnector()`.
171
+ const client = new Client('http://localhost:3000')
172
+ ```
81
173
 
82
- ```js
83
- 'use strict'
174
+ ```mjs displayName="TLS options (object connector)"
84
175
  import { Client } from 'undici'
85
- import fs from 'node:fs'
176
+ import { readFileSync } from 'node:fs'
86
177
 
87
178
  const client = new Client('https://localhost:3000', {
88
179
  connect: {
89
180
  rejectUnauthorized: false,
90
- ca: fs.readFileSync('./ca-cert.pem')
181
+ ca: readFileSync('./ca-cert.pem')
91
182
  }
92
183
  })
93
184
  ```
94
185
 
95
- ### Example - Connect via Unix domain socket
96
-
97
- Use the `socketPath` option to connect through an IPC endpoint instead of a TCP connection.
98
-
99
- ```js
100
- 'use strict'
186
+ ```mjs displayName="Unix domain socket"
101
187
  import { Client } from 'undici'
102
188
 
103
189
  const client = new Client('http://localhost:3000', {
@@ -107,14 +193,20 @@ const client = new Client('http://localhost:3000', {
107
193
  })
108
194
  ```
109
195
 
110
- ### Example - Custom connector (function form)
111
-
112
- Pass a function for full control over socket creation. This allows you to perform additional checks on the socket, use a proxy, or implement custom connection logic.
196
+ ```mjs displayName="Custom DNS lookup"
197
+ import { Client } from 'undici'
198
+ import dns from 'node:dns'
113
199
 
114
- > **Note:** When a function is provided, undici wraps it to automatically inject `socketPath` and `allowH2` into the first argument (`options`) when those values are set on the client.
200
+ const client = new Client('https://example.com', {
201
+ connect: {
202
+ lookup (hostname, options, callback) {
203
+ dns.lookup(hostname, { ...options, family: 4 }, callback)
204
+ }
205
+ }
206
+ })
207
+ ```
115
208
 
116
- ```js
117
- 'use strict'
209
+ ```mjs displayName="Custom connector (function)"
118
210
  import { Client, buildConnector } from 'undici'
119
211
 
120
212
  const connector = buildConnector({ rejectUnauthorized: false })
@@ -123,9 +215,6 @@ const client = new Client('https://localhost:3000', {
123
215
  connector(opts, (err, socket) => {
124
216
  if (err) {
125
217
  cb(err)
126
- } else if (/* assertion */) {
127
- socket.destroy()
128
- cb(new Error('kaboom'))
129
218
  } else {
130
219
  cb(null, socket)
131
220
  }
@@ -134,83 +223,180 @@ const client = new Client('https://localhost:3000', {
134
223
  })
135
224
  ```
136
225
 
137
- For more details on building custom connectors, see [Connector](/docs/docs/api/Connector.md).
226
+ When a connector function is provided, undici wraps it to automatically inject
227
+ `socketPath` and `allowH2` into the `options` argument when those values are set
228
+ on the client. See [`Connector`][] for details on building custom connectors.
229
+
230
+ ### `client.close([callback])`
231
+
232
+ <!-- YAML
233
+ added: v1.0.0
234
+ -->
235
+
236
+ Implements [`dispatcher.close([callback])`][]. Closes the client gracefully,
237
+ waiting for enqueued requests to complete before resolving.
238
+
239
+ ### `client.destroy([error[, callback]])`
240
+
241
+ <!-- YAML
242
+ added: v1.0.0
243
+ -->
244
+
245
+ Implements [`dispatcher.destroy([error[, callback]])`][]. Destroys the client
246
+ abruptly, aborting all pending and running requests, and waits until the socket
247
+ is closed before invoking `callback` (or resolving the returned promise).
248
+
249
+ ### `client.connect(options[, callback])`
250
+
251
+ <!-- YAML
252
+ added: v1.0.0
253
+ -->
254
+
255
+ * `options` {Object} The connect options, identical to
256
+ [`dispatcher.connect()`][] except that `origin` is omitted because the client
257
+ is bound to a single origin.
258
+ * `callback` {Function} (optional)
259
+ * Returns: {Promise|void} A promise when `callback` is not provided.
260
+
261
+ Starts a connection to the client's origin and tunnels a connection through it,
262
+ as defined by [`dispatcher.connect()`][].
138
263
 
139
- ## Instance Methods
264
+ ### `client.dispatch(options, handlers)`
140
265
 
141
- ### `Client.close([callback])`
266
+ <!-- YAML
267
+ added: v1.0.0
268
+ -->
142
269
 
143
- Implements [`Dispatcher.close([callback])`](/docs/docs/api/Dispatcher.md#dispatcherclosecallback-promise).
270
+ Implements [`dispatcher.dispatch(options, handler)`][]. This is the lowest-level
271
+ API used by all other request methods; prefer `client.request()` for most use
272
+ cases.
144
273
 
145
- ### `Client.destroy([error, callback])`
274
+ ### `client.pipeline(options, handler)`
146
275
 
147
- Implements [`Dispatcher.destroy([error, callback])`](/docs/docs/api/Dispatcher.md#dispatcherdestroyerror-callback-promise).
276
+ <!-- YAML
277
+ added: v1.0.0
278
+ -->
148
279
 
149
- Waits until socket is closed before invoking the callback (or returning a promise if no callback is provided).
280
+ See [`dispatcher.pipeline(options, handler)`][]. Sends a request and returns a
281
+ {Duplex} stream that the request body is written to and the response body is
282
+ read from.
150
283
 
151
- ### `Client.connect(options[, callback])`
284
+ ### `client.request(options[, callback])`
152
285
 
153
- See [`Dispatcher.connect(options[, callback])`](/docs/docs/api/Dispatcher.md#dispatcherconnectoptions-callback).
286
+ <!-- YAML
287
+ added: v1.0.0
288
+ -->
154
289
 
155
- ### `Client.dispatch(options, handlers)`
290
+ * `options` {Object}
291
+ * `callback` {Function} (optional)
292
+ * Returns: {Promise|void} A promise resolving to the response data when
293
+ `callback` is not provided.
156
294
 
157
- Implements [`Dispatcher.dispatch(options, handlers)`](/docs/docs/api/Dispatcher.md#dispatcherdispatchoptions-handler).
295
+ See [`dispatcher.request(options[, callback])`][]. Performs an HTTP request and
296
+ returns its status code, headers, trailers, and a readable body stream.
158
297
 
159
- ### `Client.pipeline(options, handler)`
298
+ ```mjs
299
+ import { Client } from 'undici'
300
+
301
+ const client = new Client('http://localhost:3000')
302
+ const { statusCode, headers, body } = await client.request({
303
+ path: '/',
304
+ method: 'GET'
305
+ })
306
+
307
+ console.log(statusCode)
308
+ for await (const chunk of body) {
309
+ console.log(chunk.toString())
310
+ }
311
+ ```
160
312
 
161
- See [`Dispatcher.pipeline(options, handler)`](/docs/docs/api/Dispatcher.md#dispatcherpipelineoptions-handler).
313
+ ### `client.stream(options, factory[, callback])`
162
314
 
163
- ### `Client.request(options[, callback])`
315
+ <!-- YAML
316
+ added: v1.0.0
317
+ -->
164
318
 
165
- See [`Dispatcher.request(options [, callback])`](/docs/docs/api/Dispatcher.md#dispatcherrequestoptions-callback).
319
+ * `options` {Object}
320
+ * `factory` {Function} Returns a {Writable} the response body is piped into.
321
+ * `callback` {Function} (optional)
322
+ * Returns: {Promise|void} A promise when `callback` is not provided.
166
323
 
167
- ### `Client.stream(options, factory[, callback])`
324
+ See [`dispatcher.stream(options, factory[, callback])`][]. A faster alternative
325
+ to `client.request()` when the destination of the response body is known in
326
+ advance.
168
327
 
169
- See [`Dispatcher.stream(options, factory[, callback])`](/docs/docs/api/Dispatcher.md#dispatcherstreamoptions-factory-callback).
328
+ ### `client.upgrade(options[, callback])`
170
329
 
171
- ### `Client.upgrade(options[, callback])`
330
+ <!-- YAML
331
+ added: v1.0.0
332
+ -->
172
333
 
173
- See [`Dispatcher.upgrade(options[, callback])`](/docs/docs/api/Dispatcher.md#dispatcherupgradeoptions-callback).
334
+ * `options` {Object}
335
+ * `callback` {Function} (optional)
336
+ * Returns: {Promise|void} A promise when `callback` is not provided.
174
337
 
175
- ## Instance Properties
338
+ See [`dispatcher.upgrade(options[, callback])`][]. Upgrades a connection to a
339
+ different protocol, such as for WebSocket or HTTP `CONNECT`.
176
340
 
177
- ### `Client.closed`
341
+ ### `client.closed`
178
342
 
179
- * `boolean`
343
+ <!-- YAML
344
+ added: v1.0.0
345
+ -->
346
+
347
+ * Type: {boolean}
180
348
 
181
349
  `true` after `client.close()` has been called.
182
350
 
183
- ### `Client.destroyed`
351
+ ### `client.destroyed`
184
352
 
185
- * `boolean`
353
+ <!-- YAML
354
+ added: v1.0.0
355
+ -->
186
356
 
187
- `true` after `client.destroyed()` has been called or `client.close()` has been called and the client shutdown has completed.
357
+ * Type: {boolean}
188
358
 
189
- ### `Client.pipelining`
359
+ `true` after `client.destroy()` has been called, or after `client.close()` has
360
+ been called and the client shutdown has completed.
190
361
 
191
- * `number`
362
+ ### `client.pipelining`
192
363
 
193
- Property to get and set the pipelining factor.
364
+ <!-- YAML
365
+ added: v1.0.0
366
+ -->
194
367
 
195
- ## Instance Events
368
+ * Type: {number}
196
369
 
197
- ### Event: `'connect'`
370
+ The pipelining factor. This property can be read and written to adjust the
371
+ number of concurrent requests sent over the connection. Only enable pipelining
372
+ with trusted remote servers.
198
373
 
199
- See [Dispatcher Event: `'connect'`](/docs/docs/api/Dispatcher.md#event-connect).
374
+ ### `client.stats`
200
375
 
201
- Parameters:
376
+ <!-- YAML
377
+ added: v7.9.0
378
+ -->
202
379
 
203
- * **origin** `URL`
204
- * **targets** `Array<Dispatcher>`
380
+ * Type: {ClientStats}
205
381
 
206
- Emitted when a socket has been created and connected. The client will connect once `client.size > 0`.
382
+ Aggregate statistics for the client. See [`ClientStats`][].
383
+
384
+ ### Event: `'connect'`
207
385
 
208
- #### Example - Client connect event
386
+ <!-- YAML
387
+ added: v1.0.0
388
+ -->
209
389
 
210
- ```js
211
- import { createServer } from 'http'
390
+ * `origin` {URL}
391
+ * `targets` {Array<Dispatcher>}
392
+
393
+ Emitted when a socket has been created and connected. The client connects once
394
+ `client.size > 0`. See [`Dispatcher` Event: `'connect'`][].
395
+
396
+ ```mjs
397
+ import { createServer } from 'node:http'
212
398
  import { Client } from 'undici'
213
- import { once } from 'events'
399
+ import { once } from 'node:events'
214
400
 
215
401
  const server = createServer((request, response) => {
216
402
  response.end('Hello, World!')
@@ -221,43 +407,40 @@ await once(server, 'listening')
221
407
  const client = new Client(`http://localhost:${server.address().port}`)
222
408
 
223
409
  client.on('connect', (origin) => {
224
- console.log(`Connected to ${origin}`) // should print before the request body statement
410
+ console.log(`Connected to ${origin}`)
225
411
  })
226
412
 
227
- try {
228
- const { body } = await client.request({
229
- path: '/',
230
- method: 'GET'
231
- })
232
- body.setEncoding('utf-8')
233
- body.on('data', console.log)
234
- client.close()
235
- server.close()
236
- } catch (error) {
237
- console.error(error)
238
- client.close()
239
- server.close()
240
- }
413
+ const { body } = await client.request({ path: '/', method: 'GET' })
414
+ body.setEncoding('utf8')
415
+ body.on('data', console.log)
416
+
417
+ client.close()
418
+ server.close()
241
419
  ```
242
420
 
243
421
  ### Event: `'disconnect'`
244
422
 
245
- See [Dispatcher Event: `'disconnect'`](/docs/docs/api/Dispatcher.md#event-disconnect).
246
-
247
- Parameters:
248
-
249
- * **origin** `URL`
250
- * **targets** `Array<Dispatcher>`
251
- * **error** `Error`
252
-
253
- Emitted when socket has disconnected. The error argument of the event is the error which caused the socket to disconnect. The client will reconnect if or once `client.size > 0`.
254
-
255
- #### Example - Client disconnect event
256
-
257
- ```js
258
- import { createServer } from 'http'
423
+ <!-- YAML
424
+ added: v1.0.0
425
+ changes:
426
+ - version: v4.0.0
427
+ pr-url: https://github.com/nodejs/undici/pull/771
428
+ description: The event is only emitted if the client had previously
429
+ connected.
430
+ -->
431
+
432
+ * `origin` {URL}
433
+ * `targets` {Array<Dispatcher>}
434
+ * `error` {Error}
435
+
436
+ Emitted when a socket has disconnected. The `error` argument is the error that
437
+ caused the disconnection. The client reconnects if or once `client.size > 0`.
438
+ See [`Dispatcher` Event: `'disconnect'`][].
439
+
440
+ ```mjs
441
+ import { createServer } from 'node:http'
259
442
  import { Client } from 'undici'
260
- import { once } from 'events'
443
+ import { once } from 'node:events'
261
444
 
262
445
  const server = createServer((request, response) => {
263
446
  response.destroy()
@@ -272,12 +455,10 @@ client.on('disconnect', (origin) => {
272
455
  })
273
456
 
274
457
  try {
275
- await client.request({
276
- path: '/',
277
- method: 'GET'
278
- })
458
+ await client.request({ path: '/', method: 'GET' })
279
459
  } catch (error) {
280
460
  console.error(error.message)
461
+ } finally {
281
462
  client.close()
282
463
  server.close()
283
464
  }
@@ -285,16 +466,19 @@ try {
285
466
 
286
467
  ### Event: `'drain'`
287
468
 
288
- Emitted when pipeline is no longer busy.
469
+ <!-- YAML
470
+ added: v1.0.0
471
+ -->
289
472
 
290
- See [Dispatcher Event: `'drain'`](/docs/docs/api/Dispatcher.md#event-drain).
473
+ * `origin` {URL}
291
474
 
292
- #### Example - Client drain event
475
+ Emitted when the pipeline is no longer busy. See
476
+ [`Dispatcher` Event: `'drain'`][].
293
477
 
294
- ```js
295
- import { createServer } from 'http'
478
+ ```mjs
479
+ import { createServer } from 'node:http'
296
480
  import { Client } from 'undici'
297
- import { once } from 'events'
481
+ import { once } from 'node:events'
298
482
 
299
483
  const server = createServer((request, response) => {
300
484
  response.end('Hello, World!')
@@ -310,17 +494,40 @@ client.on('drain', () => {
310
494
  server.close()
311
495
  })
312
496
 
313
- const requests = [
497
+ await Promise.all([
314
498
  client.request({ path: '/', method: 'GET' }),
315
499
  client.request({ path: '/', method: 'GET' }),
316
500
  client.request({ path: '/', method: 'GET' })
317
- ]
318
-
319
- await Promise.all(requests)
320
-
321
- console.log('requests completed')
501
+ ])
322
502
  ```
323
503
 
324
504
  ### Event: `'error'`
325
505
 
326
- Invoked for user errors such as throwing in the `onResponseError` handler.
506
+ <!-- YAML
507
+ added: v1.0.0
508
+ -->
509
+
510
+ * `error` {Error}
511
+
512
+ Emitted for user errors, such as throwing inside an `onResponseError` handler.
513
+
514
+ [RFC 7230, section 6.3.2]: https://tools.ietf.org/html/rfc7230#section-6.3.2
515
+ [RFC 8305]: https://tools.ietf.org/html/rfc8305#section-5
516
+ [`Agent`]: Agent.md#class-agent
517
+ [`ClientStats`]: ClientStats.md
518
+ [`Connector`]: Connector.md
519
+ [`Dispatcher` Event: `'connect'`]: Dispatcher.md#event-connect
520
+ [`Dispatcher` Event: `'disconnect'`]: Dispatcher.md#event-disconnect
521
+ [`Dispatcher` Event: `'drain'`]: Dispatcher.md#event-drain
522
+ [`Dispatcher`]: Dispatcher.md#class-dispatcher
523
+ [`Pool`]: Pool.md#class-pool
524
+ [`buildConnector`]: Connector.md
525
+ [`dispatcher.close([callback])`]: Dispatcher.md#dispatcherclosecallback
526
+ [`dispatcher.connect()`]: Dispatcher.md#dispatcherconnectoptions-callback
527
+ [`dispatcher.destroy([error[, callback]])`]: Dispatcher.md#dispatcherdestroyerror-callback
528
+ [`dispatcher.dispatch(options, handler)`]: Dispatcher.md#dispatcherdispatchoptions-handler
529
+ [`dispatcher.pipeline(options, handler)`]: Dispatcher.md#dispatcherpipelineoptions-handler
530
+ [`dispatcher.request(options[, callback])`]: Dispatcher.md#dispatcherrequestoptions-callback
531
+ [`dispatcher.stream(options, factory[, callback])`]: Dispatcher.md#dispatcherstreamoptions-factory-callback
532
+ [`dispatcher.upgrade(options[, callback])`]: Dispatcher.md#dispatcherupgradeoptions-callback
533
+ [`tls.connect()`]: https://nodejs.org/api/tls.html#tlsconnectoptions-callback