@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.
- package/dist/action-runtime-api.js +1 -1
- package/dist/{api-CjnGBhM3.js → api-1GXlSrYP.js} +42 -21
- package/dist/api.js +14 -14
- package/dist/{approval-handler.runtime-BWPQrzpP.js → approval-handler.runtime-Dv4p7REU.js} +3 -3
- package/dist/{audit-BwJ_2OjL.js → audit-DEVi9nIs.js} +3 -3
- package/dist/{channel-Ddnonoy4.js → channel-CQIRiosn.js} +15 -15
- package/dist/{channel-actions-CwmIqnYN.js → channel-actions-JziPEcBU.js} +2 -2
- package/dist/{channel-actions.runtime-DvpTfaJ4.js → channel-actions.runtime-D7L47LY3.js} +5 -5
- package/dist/channel-plugin-api.js +1 -1
- package/dist/{channel.setup-glZ5Y98a.js → channel.setup-oMeR19Cc.js} +2 -2
- package/dist/{components-j6lTZBsT.js → components-_s5UPJqU.js} +1 -1
- package/dist/{conversation-identity-36FFBwm5.js → conversation-identity-B0k94-bz.js} +2 -2
- package/dist/{directory-config-BYMFzL29.js → directory-config-CD1svkyN.js} +1 -1
- package/dist/directory-contract-api.js +1 -1
- package/dist/{directory-live-9JtJCiu8.js → directory-live-DBTsSRxl.js} +5 -5
- package/dist/{handle-action.guild-admin-xxGYrp-I.js → handle-action.guild-admin-CYIFMxh-.js} +2 -2
- package/dist/index.js +1 -1
- package/dist/{manager.runtime-BK6cf2Zu.js → manager.runtime-BZVdGX2d.js} +17 -9
- package/dist/{message-handler-BqpJIavO.js → message-handler-DZd9Bpq8.js} +7 -6
- package/dist/{message-handler.preflight-C90MxCcv.js → message-handler.preflight-Axv9J9EO.js} +12 -11
- package/dist/{message-handler.process-CeQ7Bd_3.js → message-handler.process-CG0zFS-Z.js} +10 -10
- package/dist/{message-utils-CJeAoISH.js → message-utils-Dbuw27gd.js} +1 -1
- package/dist/{outbound-adapter-Dxs6iKEq.js → outbound-adapter-CKC_kmUN.js} +6 -6
- package/dist/pluralkit-CfTReLl3.js +40 -0
- package/dist/{probe-esE_Oqdm.js → probe-DcgZIpyF.js} +3 -2
- package/dist/{probe.runtime-C3Atgpvr.js → probe.runtime-CVwM9L5E.js} +1 -1
- package/dist/{provider-C7376XFH.js → provider-CwwSXIIj.js} +102 -37
- package/dist/{provider-session.runtime-CCdqogGf.js → provider-session.runtime-reBWkqHZ.js} +3 -3
- package/dist/provider.runtime-BsmTLYS_.js +2 -0
- package/dist/{resolve-allowlist-common-3gB2Gpmm.js → resolve-allowlist-common-D7bZqAw3.js} +3 -3
- package/dist/{resolve-channels-B3gQf8QL.js → resolve-channels--oE-RnO6.js} +6 -6
- package/dist/{resolve-users-BO10y5fJ.js → resolve-users-QXo8CXBU.js} +5 -5
- package/dist/{runtime-CFlR3L9X.js → runtime-CF7ramAs.js} +7 -7
- package/dist/runtime-api.actions.js +2 -2
- package/dist/runtime-api.js +19 -19
- package/dist/runtime-api.lookup.js +5 -5
- package/dist/runtime-api.monitor-CzF8MUl_.js +6 -0
- package/dist/runtime-api.monitor.js +5 -5
- package/dist/runtime-api.send.js +5 -5
- package/dist/runtime-api.threads.js +3 -3
- package/dist/{send-JHxfT4Pk.js → send-Bb295iHT.js} +5 -5
- package/dist/{send.components-CN35E2Ck.js → send.components-COkDUO3B.js} +4 -4
- package/dist/{send.outbound-B-cA1Esv.js → send.outbound-B_sk0hNe.js} +3 -3
- package/dist/{send.receipt-CGecJDin.js → send.receipt-Cli6_9Sn.js} +19 -7
- package/dist/{send.shared-vcbfThdy.js → send.shared-BCG7MWnP.js} +2 -2
- package/dist/session-binding-contract-api.js +1 -1
- package/dist/setup-plugin-api.js +1 -1
- package/dist/{subagent-hooks-20wXhVzZ.js → subagent-hooks-CtqoWK4x.js} +2 -2
- package/dist/subagent-hooks-api.js +1 -1
- package/dist/{system-events-DR27TE7p.js → system-events-BxGNk_wE.js} +1 -1
- package/dist/{target-resolver-CDi1gI90.js → target-resolver-BcoK6b0g.js} +2 -2
- package/dist/targets-Q-ZoP7K4.js +3 -0
- package/dist/{thread-bindings-DU4T6nDo.js → thread-bindings-DJ_HT6GJ.js} +4 -4
- package/dist/{thread-bindings.discord-api-CYkr-3Gj.js → thread-bindings.discord-api-OPyjvgyz.js} +4 -4
- package/dist/{thread-bindings.manager-BqWs1UE2.js → thread-bindings.manager-Cd2HAVw_.js} +3 -3
- package/dist/{transcripts-source-D-lBI5ZD.js → transcripts-source-CPf5gURy.js} +1 -1
- package/dist/transcripts-source-api.js +1 -1
- package/dist/{typing-xr05bL-r.js → typing-DY0cwLdg.js} +1 -1
- package/node_modules/undici/README.md +8 -2
- package/node_modules/undici/docs/docs/api/Agent.md +248 -44
- 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 +386 -179
- package/node_modules/undici/docs/docs/api/ClientStats.md +80 -14
- package/node_modules/undici/docs/docs/api/Connector.md +118 -36
- 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 +485 -1102
- package/node_modules/undici/docs/docs/api/EnvHttpProxyAgent.md +102 -87
- package/node_modules/undici/docs/docs/api/Errors.md +503 -40
- package/node_modules/undici/docs/docs/api/EventSource.md +298 -32
- package/node_modules/undici/docs/docs/api/Fetch.md +680 -31
- package/node_modules/undici/docs/docs/api/GlobalInstallation.md +78 -98
- 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 +235 -43
- 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 -63
- package/node_modules/undici/docs/docs/api/RetryAgent.md +113 -26
- package/node_modules/undici/docs/docs/api/RetryHandler.md +161 -77
- package/node_modules/undici/docs/docs/api/RoundRobinPool.md +166 -72
- package/node_modules/undici/docs/docs/api/SnapshotAgent.md +264 -542
- 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 +6 -4
- 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/{GettingStarted.md → getting-started.md} +22 -19
- 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/lib/api/api-request.js +7 -1
- package/node_modules/undici/lib/api/readable.js +42 -7
- package/node_modules/undici/lib/cache/memory-cache-store.js +56 -11
- package/node_modules/undici/lib/cache/sqlite-cache-store.js +7 -1
- package/node_modules/undici/lib/core/connect.js +16 -2
- package/node_modules/undici/lib/core/errors.js +20 -0
- package/node_modules/undici/lib/core/request.js +14 -3
- package/node_modules/undici/lib/core/symbols.js +3 -0
- package/node_modules/undici/lib/core/util.js +30 -2
- package/node_modules/undici/lib/dispatcher/agent.js +10 -5
- package/node_modules/undici/lib/dispatcher/balanced-pool.js +7 -4
- package/node_modules/undici/lib/dispatcher/client-h1.js +74 -9
- package/node_modules/undici/lib/dispatcher/client-h2.js +483 -151
- package/node_modules/undici/lib/dispatcher/client.js +76 -30
- package/node_modules/undici/lib/dispatcher/dispatcher-base.js +13 -1
- package/node_modules/undici/lib/dispatcher/dispatcher.js +15 -1
- package/node_modules/undici/lib/dispatcher/dispatcher1-wrapper.js +3 -0
- package/node_modules/undici/lib/dispatcher/env-http-proxy-agent.js +37 -8
- package/node_modules/undici/lib/dispatcher/proxy-agent.js +58 -7
- package/node_modules/undici/lib/dispatcher/retry-agent.js +3 -0
- package/node_modules/undici/lib/dispatcher/round-robin-pool.js +1 -1
- package/node_modules/undici/lib/dispatcher/socks5-proxy-agent.js +106 -22
- package/node_modules/undici/lib/global.js +36 -16
- package/node_modules/undici/lib/handler/cache-handler.js +297 -65
- package/node_modules/undici/lib/handler/cache-revalidation-handler.js +13 -3
- package/node_modules/undici/lib/handler/decorator-handler.js +7 -1
- package/node_modules/undici/lib/handler/deduplication-handler.js +12 -6
- package/node_modules/undici/lib/handler/redirect-handler.js +26 -5
- package/node_modules/undici/lib/handler/retry-handler.js +238 -51
- package/node_modules/undici/lib/interceptor/cache.js +221 -58
- package/node_modules/undici/lib/interceptor/decompress.js +124 -15
- package/node_modules/undici/lib/interceptor/deduplicate.js +5 -4
- package/node_modules/undici/lib/interceptor/dns.js +7 -0
- package/node_modules/undici/lib/interceptor/dump.js +10 -23
- package/node_modules/undici/lib/mock/mock-agent.js +13 -1
- package/node_modules/undici/lib/mock/mock-interceptor.js +25 -7
- package/node_modules/undici/lib/mock/mock-utils.js +246 -27
- package/node_modules/undici/lib/util/cache.js +415 -71
- package/node_modules/undici/lib/util/date.js +23 -6
- package/node_modules/undici/lib/web/cookies/parse.js +150 -146
- package/node_modules/undici/lib/web/cookies/util.js +79 -9
- package/node_modules/undici/lib/web/eventsource/eventsource-stream.js +28 -1
- package/node_modules/undici/lib/web/eventsource/eventsource.js +13 -3
- package/node_modules/undici/lib/web/eventsource/util.js +1 -1
- package/node_modules/undici/lib/web/fetch/body.js +2 -1
- package/node_modules/undici/lib/web/fetch/constants.js +1 -1
- package/node_modules/undici/lib/web/fetch/index.js +17 -2
- package/node_modules/undici/lib/web/fetch/request.js +2 -3
- 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 +3 -3
- package/node_modules/undici/lib/web/websocket/connection.js +1 -1
- package/node_modules/undici/lib/web/websocket/permessage-deflate.js +5 -0
- package/node_modules/undici/lib/web/websocket/stream/websocketstream.js +8 -10
- package/node_modules/undici/lib/web/websocket/websocket.js +22 -0
- package/node_modules/undici/package.json +4 -4
- package/node_modules/undici/types/client.d.ts +53 -3
- package/node_modules/undici/types/cookies.d.ts +1 -1
- package/node_modules/undici/types/dispatcher.d.ts +3 -3
- package/node_modules/undici/types/errors.d.ts +10 -0
- package/node_modules/undici/types/handlers.d.ts +2 -0
- package/node_modules/undici/types/interceptors.d.ts +2 -0
- 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/proxy-agent.d.ts +7 -0
- package/node_modules/undici/types/socks5-proxy-agent.d.ts +2 -0
- package/npm-shrinkwrap.json +7 -7
- package/package.json +6 -5
- package/dist/pluralkit-DI6RYaVj.js +0 -24
- package/dist/provider.runtime-D1m66kDS.js +0 -2
- package/dist/runtime-api.monitor-4oc58TSk.js +0 -6
- package/dist/targets-C6yd3y8R.js +0 -3
|
@@ -1,103 +1,189 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
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
|
-
|
|
171
|
+
const client = new Client('http://localhost:3000')
|
|
172
|
+
```
|
|
81
173
|
|
|
82
|
-
```
|
|
83
|
-
'use strict'
|
|
174
|
+
```mjs displayName="TLS options (object connector)"
|
|
84
175
|
import { Client } from 'undici'
|
|
85
|
-
import
|
|
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:
|
|
181
|
+
ca: readFileSync('./ca-cert.pem')
|
|
91
182
|
}
|
|
92
183
|
})
|
|
93
184
|
```
|
|
94
185
|
|
|
95
|
-
|
|
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
|
-
|
|
111
|
-
|
|
112
|
-
|
|
196
|
+
```mjs displayName="Custom DNS lookup"
|
|
197
|
+
import { Client } from 'undici'
|
|
198
|
+
import dns from 'node:dns'
|
|
113
199
|
|
|
114
|
-
|
|
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
|
-
```
|
|
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
|
-
|
|
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
|
-
|
|
264
|
+
### `client.dispatch(options, handlers)`
|
|
140
265
|
|
|
141
|
-
|
|
266
|
+
<!-- YAML
|
|
267
|
+
added: v1.0.0
|
|
268
|
+
-->
|
|
142
269
|
|
|
143
|
-
Implements [`
|
|
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
|
-
### `
|
|
274
|
+
### `client.pipeline(options, handler)`
|
|
146
275
|
|
|
147
|
-
|
|
276
|
+
<!-- YAML
|
|
277
|
+
added: v1.0.0
|
|
278
|
+
-->
|
|
148
279
|
|
|
149
|
-
|
|
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
|
-
### `
|
|
284
|
+
### `client.request(options[, callback])`
|
|
152
285
|
|
|
153
|
-
|
|
286
|
+
<!-- YAML
|
|
287
|
+
added: v1.0.0
|
|
288
|
+
-->
|
|
154
289
|
|
|
155
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
313
|
+
### `client.stream(options, factory[, callback])`
|
|
162
314
|
|
|
163
|
-
|
|
315
|
+
<!-- YAML
|
|
316
|
+
added: v1.0.0
|
|
317
|
+
-->
|
|
164
318
|
|
|
165
|
-
|
|
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
|
-
|
|
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
|
-
|
|
328
|
+
### `client.upgrade(options[, callback])`
|
|
170
329
|
|
|
171
|
-
|
|
330
|
+
<!-- YAML
|
|
331
|
+
added: v1.0.0
|
|
332
|
+
-->
|
|
172
333
|
|
|
173
|
-
|
|
334
|
+
* `options` {Object}
|
|
335
|
+
* `callback` {Function} (optional)
|
|
336
|
+
* Returns: {Promise|void} A promise when `callback` is not provided.
|
|
174
337
|
|
|
175
|
-
|
|
338
|
+
See [`dispatcher.upgrade(options[, callback])`][]. Upgrades a connection to a
|
|
339
|
+
different protocol, such as for WebSocket or HTTP `CONNECT`.
|
|
176
340
|
|
|
177
|
-
### `
|
|
341
|
+
### `client.closed`
|
|
178
342
|
|
|
179
|
-
|
|
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
|
-
### `
|
|
351
|
+
### `client.destroyed`
|
|
184
352
|
|
|
185
|
-
|
|
353
|
+
<!-- YAML
|
|
354
|
+
added: v1.0.0
|
|
355
|
+
-->
|
|
186
356
|
|
|
187
|
-
|
|
357
|
+
* Type: {boolean}
|
|
188
358
|
|
|
189
|
-
|
|
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
|
-
|
|
362
|
+
### `client.pipelining`
|
|
192
363
|
|
|
193
|
-
|
|
364
|
+
<!-- YAML
|
|
365
|
+
added: v1.0.0
|
|
366
|
+
-->
|
|
194
367
|
|
|
195
|
-
|
|
368
|
+
* Type: {number}
|
|
196
369
|
|
|
197
|
-
|
|
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
|
-
|
|
374
|
+
### `client.stats`
|
|
200
375
|
|
|
201
|
-
|
|
376
|
+
<!-- YAML
|
|
377
|
+
added: v7.9.0
|
|
378
|
+
-->
|
|
202
379
|
|
|
203
|
-
*
|
|
204
|
-
* **targets** `Array<Dispatcher>`
|
|
380
|
+
* Type: {ClientStats}
|
|
205
381
|
|
|
206
|
-
|
|
382
|
+
Aggregate statistics for the client. See [`ClientStats`][].
|
|
383
|
+
|
|
384
|
+
### Event: `'connect'`
|
|
207
385
|
|
|
208
|
-
|
|
386
|
+
<!-- YAML
|
|
387
|
+
added: v1.0.0
|
|
388
|
+
-->
|
|
209
389
|
|
|
210
|
-
|
|
211
|
-
|
|
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}`)
|
|
410
|
+
console.log(`Connected to ${origin}`)
|
|
225
411
|
})
|
|
226
412
|
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
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
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
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
|
-
|
|
469
|
+
<!-- YAML
|
|
470
|
+
added: v1.0.0
|
|
471
|
+
-->
|
|
289
472
|
|
|
290
|
-
|
|
473
|
+
* `origin` {URL}
|
|
291
474
|
|
|
292
|
-
|
|
475
|
+
Emitted when the pipeline is no longer busy. See
|
|
476
|
+
[`Dispatcher` Event: `'drain'`][].
|
|
293
477
|
|
|
294
|
-
```
|
|
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
|
-
|
|
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
|
-
|
|
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
|