Skip to content

Commit eb1a5b4

Browse files
targosmarco-ippolito
authored andcommitted
deps: update undici to 6.6.2
This commit is the result of reverting the v5.28.3 security update and then cleanly cherry-picking all 6.x updates from `main` until 6.6.2, which also includes the security fix.
1 parent 71a809b commit eb1a5b4

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

84 files changed

+9874
-4912
lines changed

deps/undici/src/README.md

+18-33
Original file line numberDiff line numberDiff line change
@@ -18,34 +18,23 @@ npm i undici
1818
## Benchmarks
1919

2020
The benchmark is a simple `hello world` [example](benchmarks/benchmark.js) using a
21-
number of unix sockets (connections) with a pipelining depth of 10 running on Node 20.6.0.
22-
23-
### Connections 1
24-
25-
26-
| Tests | Samples | Result | Tolerance | Difference with slowest |
27-
|---------------------|---------|---------------|-----------|-------------------------|
28-
| http - no keepalive | 15 | 5.32 req/sec | ± 2.61 % | - |
29-
| http - keepalive | 10 | 5.35 req/sec | ± 2.47 % | + 0.44 % |
30-
| undici - fetch | 15 | 41.85 req/sec | ± 2.49 % | + 686.04 % |
31-
| undici - pipeline | 40 | 50.36 req/sec | ± 2.77 % | + 845.92 % |
32-
| undici - stream | 15 | 60.58 req/sec | ± 2.75 % | + 1037.72 % |
33-
| undici - request | 10 | 61.19 req/sec | ± 2.60 % | + 1049.24 % |
34-
| undici - dispatch | 20 | 64.84 req/sec | ± 2.81 % | + 1117.81 % |
35-
36-
37-
### Connections 50
38-
39-
| Tests | Samples | Result | Tolerance | Difference with slowest |
40-
|---------------------|---------|------------------|-----------|-------------------------|
41-
| undici - fetch | 30 | 2107.19 req/sec | ± 2.69 % | - |
42-
| http - no keepalive | 10 | 2698.90 req/sec | ± 2.68 % | + 28.08 % |
43-
| http - keepalive | 10 | 4639.49 req/sec | ± 2.55 % | + 120.17 % |
44-
| undici - pipeline | 40 | 6123.33 req/sec | ± 2.97 % | + 190.59 % |
45-
| undici - stream | 50 | 9426.51 req/sec | ± 2.92 % | + 347.35 % |
46-
| undici - request | 10 | 10162.88 req/sec | ± 2.13 % | + 382.29 % |
47-
| undici - dispatch | 50 | 11191.11 req/sec | ± 2.98 % | + 431.09 % |
21+
50 TCP connections with a pipelining depth of 10 running on Node 20.10.0.
4822

23+
```
24+
│ Tests │ Samples │ Result │ Tolerance │ Difference with slowest │
25+
|─────────────────────|─────────|─────────────────|───────────|─────────────────────────|
26+
│ got │ 45 │ 1661.71 req/sec │ ± 2.93 % │ - │
27+
│ node-fetch │ 20 │ 2164.81 req/sec │ ± 2.63 % │ + 30.28 % │
28+
│ undici - fetch │ 35 │ 2274.27 req/sec │ ± 2.70 % │ + 36.86 % │
29+
│ http - no keepalive │ 15 │ 2376.04 req/sec │ ± 2.99 % │ + 42.99 % │
30+
│ axios │ 25 │ 2612.93 req/sec │ ± 2.89 % │ + 57.24 % │
31+
│ request │ 40 │ 2712.19 req/sec │ ± 2.92 % │ + 63.22 % │
32+
│ http - keepalive │ 45 │ 4393.25 req/sec │ ± 2.86 % │ + 164.38 % │
33+
│ undici - pipeline │ 45 │ 5484.69 req/sec │ ± 2.87 % │ + 230.06 % │
34+
│ undici - request │ 55 │ 7773.98 req/sec │ ± 2.93 % │ + 367.83 % │
35+
│ undici - stream │ 70 │ 8425.96 req/sec │ ± 2.91 % │ + 407.07 % │
36+
│ undici - dispatch │ 50 │ 9488.99 req/sec │ ± 2.85 % │ + 471.04 % │
37+
```
4938

5039
## Quick Start
5140

@@ -62,9 +51,7 @@ const {
6251
console.log('response received', statusCode)
6352
console.log('headers', headers)
6453

65-
for await (const data of body) {
66-
console.log('data', data)
67-
}
54+
for await (const data of body) { console.log('data', data) }
6855

6956
console.log('trailers', trailers)
7057
```
@@ -119,7 +106,7 @@ Returns a promise with the result of the `Dispatcher.request` method.
119106

120107
Calls `options.dispatcher.request(options)`.
121108

122-
See [Dispatcher.request](./docs/api/Dispatcher.md#dispatcherrequestoptions-callback) for more details.
109+
See [Dispatcher.request](./docs/api/Dispatcher.md#dispatcherrequestoptions-callback) for more details, and [request examples](./examples/README.md) for examples.
123110

124111
### `undici.stream([url, options, ]factory): Promise`
125112

@@ -180,8 +167,6 @@ Implements [fetch](https://fetch.spec.whatwg.org/#fetch-method).
180167
* https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch
181168
* https://fetch.spec.whatwg.org/#fetch-method
182169

183-
Only supported on Node 16.8+.
184-
185170
Basic usage example:
186171

187172
```js

deps/undici/src/docs/api/BalancedPool.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ Arguments:
5050

5151
### `BalancedPool.removeUpstream(upstream)`
5252

53-
Removes an upstream that was previously addded.
53+
Removes an upstream that was previously added.
5454

5555
### `BalancedPool.close([callback])`
5656

deps/undici/src/docs/api/Debug.md

+62
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
# Debug
2+
3+
Undici (and subsenquently `fetch` and `websocket`) exposes a debug statement that can be enabled by setting `NODE_DEBUG` within the environment.
4+
5+
The flags availabile are:
6+
7+
## `undici`
8+
9+
This flag enables debug statements for the core undici library.
10+
11+
```sh
12+
NODE_DEBUG=undici node script.js
13+
14+
UNDICI 16241: connecting to nodejs.org using https:h1
15+
UNDICI 16241: connecting to nodejs.org using https:h1
16+
UNDICI 16241: connected to nodejs.org using https:h1
17+
UNDICI 16241: sending request to GET https://nodejs.org//
18+
UNDICI 16241: received response to GET https://nodejs.org// - HTTP 307
19+
UNDICI 16241: connecting to nodejs.org using https:h1
20+
UNDICI 16241: trailers received from GET https://nodejs.org//
21+
UNDICI 16241: connected to nodejs.org using https:h1
22+
UNDICI 16241: sending request to GET https://nodejs.org//en
23+
UNDICI 16241: received response to GET https://nodejs.org//en - HTTP 200
24+
UNDICI 16241: trailers received from GET https://nodejs.org//en
25+
```
26+
27+
## `fetch`
28+
29+
This flag enables debug statements for the `fetch` API.
30+
31+
> **Note**: statements are pretty similar to the ones in the `undici` flag, but scoped to `fetch`
32+
33+
```sh
34+
NODE_DEBUG=fetch node script.js
35+
36+
FETCH 16241: connecting to nodejs.org using https:h1
37+
FETCH 16241: connecting to nodejs.org using https:h1
38+
FETCH 16241: connected to nodejs.org using https:h1
39+
FETCH 16241: sending request to GET https://nodejs.org//
40+
FETCH 16241: received response to GET https://nodejs.org// - HTTP 307
41+
FETCH 16241: connecting to nodejs.org using https:h1
42+
FETCH 16241: trailers received from GET https://nodejs.org//
43+
FETCH 16241: connected to nodejs.org using https:h1
44+
FETCH 16241: sending request to GET https://nodejs.org//en
45+
FETCH 16241: received response to GET https://nodejs.org//en - HTTP 200
46+
FETCH 16241: trailers received from GET https://nodejs.org//en
47+
```
48+
49+
## `websocket`
50+
51+
This flag enables debug statements for the `Websocket` API.
52+
53+
> **Note**: statements can overlap with `UNDICI` ones if `undici` or `fetch` flag has been enabled as well.
54+
55+
```sh
56+
NODE_DEBUG=websocket node script.js
57+
58+
WEBSOCKET 18309: connecting to echo.websocket.org using https:h1
59+
WEBSOCKET 18309: connected to echo.websocket.org using https:h1
60+
WEBSOCKET 18309: sending request to GET https://echo.websocket.org//
61+
WEBSOCKET 18309: connection opened <ip_address>
62+
```

deps/undici/src/docs/api/DiagnosticsChannel.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ You can not assume that this event is related to any specific request.
105105
import diagnosticsChannel from 'diagnostics_channel'
106106

107107
diagnosticsChannel.channel('undici:client:beforeConnect').subscribe(({ connectParams, connector }) => {
108-
// const { host, hostname, protocol, port, servername } = connectParams
108+
// const { host, hostname, protocol, port, servername, version } = connectParams
109109
// connector is a function that creates the socket
110110
})
111111
```
@@ -118,7 +118,7 @@ This message is published after a connection is established.
118118
import diagnosticsChannel from 'diagnostics_channel'
119119

120120
diagnosticsChannel.channel('undici:client:connected').subscribe(({ socket, connectParams, connector }) => {
121-
// const { host, hostname, protocol, port, servername } = connectParams
121+
// const { host, hostname, protocol, port, servername, version } = connectParams
122122
// connector is a function that creates the socket
123123
})
124124
```
@@ -131,7 +131,7 @@ This message is published if it did not succeed to create new connection
131131
import diagnosticsChannel from 'diagnostics_channel'
132132

133133
diagnosticsChannel.channel('undici:client:connectError').subscribe(({ error, socket, connectParams, connector }) => {
134-
// const { host, hostname, protocol, port, servername } = connectParams
134+
// const { host, hostname, protocol, port, servername, version } = connectParams
135135
// connector is a function that creates the socket
136136
console.log(`Connect failed with ${error.message}`)
137137
})

deps/undici/src/docs/api/Dispatcher.md

+1
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@ Returns: `Boolean` - `false` if dispatcher is busy and further dispatch calls wo
209209
* **onConnect** `(abort: () => void, context: object) => void` - Invoked before request is dispatched on socket. May be invoked multiple times when a request is retried when the request at the head of the pipeline fails.
210210
* **onError** `(error: Error) => void` - Invoked when an error has occurred. May not throw.
211211
* **onUpgrade** `(statusCode: number, headers: Buffer[], socket: Duplex) => void` (optional) - Invoked when request is upgraded. Required if `DispatchOptions.upgrade` is defined or `DispatchOptions.method === 'CONNECT'`.
212+
* **onResponseStarted** `() => void` (optional) - Invoked when response is received, before headers have been read.
212213
* **onHeaders** `(statusCode: number, headers: Buffer[], resume: () => void, statusText: string) => boolean` - Invoked when statusCode and headers have been received. May be invoked multiple times due to 1xx informational headers. Not required for `upgrade` requests.
213214
* **onData** `(chunk: Buffer) => boolean` - Invoked when response payload data is received. Not required for `upgrade` requests.
214215
* **onComplete** `(trailers: Buffer[]) => void` - Invoked when response payload and trailers have been received and the request has completed. Not required for `upgrade` requests.
+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# EventSource
2+
3+
Undici exposes a WHATWG spec-compliant implementation of [EventSource](https://developer.mozilla.org/en-US/docs/Web/API/EventSource)
4+
for [Server-Sent Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events).
5+
6+
## Instantiating EventSource
7+
8+
Undici exports a EventSource class. You can instantiate the EventSource as
9+
follows:
10+
11+
```mjs
12+
import { EventSource } from 'undici'
13+
14+
const evenSource = new EventSource('http://localhost:3000')
15+
evenSource.onmessage = (event) => {
16+
console.log(event.data)
17+
}
18+
```
19+
20+
More information about the EventSource API can be found on
21+
[MDN](https://developer.mozilla.org/en-US/docs/Web/API/EventSource).
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
# Class: RedirectHandler
2+
3+
A class that handles redirection logic for HTTP requests.
4+
5+
## `new RedirectHandler(dispatch, maxRedirections, opts, handler, redirectionLimitReached)`
6+
7+
Arguments:
8+
9+
- **dispatch** `function` - The dispatch function to be called after every retry.
10+
- **maxRedirections** `number` - Maximum number of redirections allowed.
11+
- **opts** `object` - Options for handling redirection.
12+
- **handler** `object` - An object containing handlers for different stages of the request lifecycle.
13+
- **redirectionLimitReached** `boolean` (default: `false`) - A flag that the implementer can provide to enable or disable the feature. If set to `false`, it indicates that the caller doesn't want to use the feature and prefers the old behavior.
14+
15+
Returns: `RedirectHandler`
16+
17+
### Parameters
18+
19+
- **dispatch** `(options: Dispatch.DispatchOptions, handlers: Dispatch.DispatchHandlers) => Promise<Dispatch.DispatchResponse>` (required) - Dispatch function to be called after every redirection.
20+
- **maxRedirections** `number` (required) - Maximum number of redirections allowed.
21+
- **opts** `object` (required) - Options for handling redirection.
22+
- **handler** `object` (required) - Handlers for different stages of the request lifecycle.
23+
- **redirectionLimitReached** `boolean` (default: `false`) - A flag that the implementer can provide to enable or disable the feature. If set to `false`, it indicates that the caller doesn't want to use the feature and prefers the old behavior.
24+
25+
### Properties
26+
27+
- **location** `string` - The current redirection location.
28+
- **abort** `function` - The abort function.
29+
- **opts** `object` - The options for handling redirection.
30+
- **maxRedirections** `number` - Maximum number of redirections allowed.
31+
- **handler** `object` - Handlers for different stages of the request lifecycle.
32+
- **history** `Array` - An array representing the history of URLs during redirection.
33+
- **redirectionLimitReached** `boolean` - Indicates whether the redirection limit has been reached.
34+
35+
### Methods
36+
37+
#### `onConnect(abort)`
38+
39+
Called when the connection is established.
40+
41+
Parameters:
42+
43+
- **abort** `function` - The abort function.
44+
45+
#### `onUpgrade(statusCode, headers, socket)`
46+
47+
Called when an upgrade is requested.
48+
49+
Parameters:
50+
51+
- **statusCode** `number` - The HTTP status code.
52+
- **headers** `object` - The headers received in the response.
53+
- **socket** `object` - The socket object.
54+
55+
#### `onError(error)`
56+
57+
Called when an error occurs.
58+
59+
Parameters:
60+
61+
- **error** `Error` - The error that occurred.
62+
63+
#### `onHeaders(statusCode, headers, resume, statusText)`
64+
65+
Called when headers are received.
66+
67+
Parameters:
68+
69+
- **statusCode** `number` - The HTTP status code.
70+
- **headers** `object` - The headers received in the response.
71+
- **resume** `function` - The resume function.
72+
- **statusText** `string` - The status text.
73+
74+
#### `onData(chunk)`
75+
76+
Called when data is received.
77+
78+
Parameters:
79+
80+
- **chunk** `Buffer` - The data chunk received.
81+
82+
#### `onComplete(trailers)`
83+
84+
Called when the request is complete.
85+
86+
Parameters:
87+
88+
- **trailers** `object` - The trailers received.
89+
90+
#### `onBodySent(chunk)`
91+
92+
Called when the request body is sent.
93+
94+
Parameters:
95+
96+
- **chunk** `Buffer` - The chunk of the request body sent.

deps/undici/src/docs/api/Util.md

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# Util
2+
3+
Utility API for third-party implementations of the dispatcher API.
4+
5+
## `parseHeaders(headers, [obj])`
6+
7+
Receives a header object and returns the parsed value.
8+
9+
Arguments:
10+
11+
- **headers** `Record<string, string | string[]> | (Buffer | string | (Buffer | string)[])[]` (required) - Header object.
12+
13+
- **obj** `Record<string, string | string[]>` (optional) - Object to specify a proxy object. The parsed value is assigned to this object. But, if **headers** is an object, it is not used.
14+
15+
Returns: `Record<string, string | string[]>` If **headers** is an object, it is **headers**. Otherwise, if **obj** is specified, it is equivalent to **obj**.
16+
17+
## `headerNameToString(value)`
18+
19+
Retrieves a header name and returns its lowercase value.
20+
21+
Arguments:
22+
23+
- **value** `string | Buffer` (required) - Header name.
24+
25+
Returns: `string`

deps/undici/src/docs/best-practices/client-certificate.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ The server option `rejectUnauthorized: false` allows us to handle any invalid ce
1111
### Client Certificate Authentication
1212

1313
```js
14-
const { readFileSync } = require('fs')
15-
const { join } = require('path')
16-
const { createServer } = require('https')
14+
const { readFileSync } = require('node:fs')
15+
const { join } = require('node:path')
16+
const { createServer } = require('node:https')
1717
const { Client } = require('undici')
1818

1919
const serverOptions = {

deps/undici/src/index-fetch.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,17 @@ const fetchImpl = require('./lib/fetch').fetch
44

55
module.exports.fetch = function fetch (resource, init = undefined) {
66
return fetchImpl(resource, init).catch((err) => {
7-
Error.captureStackTrace(err, this)
7+
if (typeof err === 'object') {
8+
Error.captureStackTrace(err, this)
9+
}
810
throw err
911
})
1012
}
1113
module.exports.FormData = require('./lib/fetch/formdata').FormData
1214
module.exports.Headers = require('./lib/fetch/headers').Headers
1315
module.exports.Response = require('./lib/fetch/response').Response
1416
module.exports.Request = require('./lib/fetch/request').Request
17+
1518
module.exports.WebSocket = require('./lib/websocket/websocket').WebSocket
19+
20+
module.exports.EventSource = require('./lib/eventsource/eventsource').EventSource

0 commit comments

Comments
 (0)