undici 6.5.0 → 6.6.0

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 (54) hide show
  1. package/docs/best-practices/client-certificate.md +3 -3
  2. package/lib/agent.js +5 -7
  3. package/lib/api/api-connect.js +2 -2
  4. package/lib/api/api-pipeline.js +4 -4
  5. package/lib/api/api-request.js +2 -2
  6. package/lib/api/api-stream.js +4 -4
  7. package/lib/api/api-upgrade.js +3 -3
  8. package/lib/api/readable.js +2 -2
  9. package/lib/api/util.js +1 -1
  10. package/lib/balanced-pool.js +1 -1
  11. package/lib/cache/cache.js +4 -10
  12. package/lib/cache/util.js +1 -1
  13. package/lib/client.js +14 -14
  14. package/lib/cookies/parse.js +1 -1
  15. package/lib/cookies/util.js +1 -1
  16. package/lib/core/connect.js +3 -3
  17. package/lib/core/diagnostics.js +2 -2
  18. package/lib/core/request.js +18 -13
  19. package/lib/core/tree.js +3 -5
  20. package/lib/core/util.js +15 -15
  21. package/lib/dispatcher.js +1 -1
  22. package/lib/eventsource/eventsource-stream.js +1 -1
  23. package/lib/eventsource/eventsource.js +2 -2
  24. package/lib/eventsource/util.js +9 -1
  25. package/lib/fetch/body.js +29 -21
  26. package/lib/fetch/dataURL.js +97 -17
  27. package/lib/fetch/file.js +5 -5
  28. package/lib/fetch/formdata.js +1 -1
  29. package/lib/fetch/headers.js +1 -1
  30. package/lib/fetch/index.js +28 -37
  31. package/lib/fetch/request.js +3 -2
  32. package/lib/fetch/response.js +31 -39
  33. package/lib/fetch/util.js +196 -36
  34. package/lib/fetch/webidl.js +1 -1
  35. package/lib/fileapi/util.js +2 -2
  36. package/lib/handler/RedirectHandler.js +2 -2
  37. package/lib/handler/RetryHandler.js +3 -3
  38. package/lib/llhttp/llhttp-wasm.js +3 -1
  39. package/lib/llhttp/llhttp_simd-wasm.js +3 -1
  40. package/lib/mock/mock-agent.js +2 -2
  41. package/lib/mock/mock-client.js +1 -1
  42. package/lib/mock/mock-pool.js +1 -1
  43. package/lib/mock/mock-utils.js +2 -2
  44. package/lib/mock/pending-interceptors-formatter.js +2 -2
  45. package/lib/pool.js +7 -8
  46. package/lib/proxy-agent.js +2 -2
  47. package/lib/timers.js +1 -1
  48. package/lib/websocket/connection.js +1 -1
  49. package/lib/websocket/events.js +1 -1
  50. package/lib/websocket/frame.js +1 -1
  51. package/lib/websocket/receiver.js +7 -6
  52. package/lib/websocket/util.js +1 -1
  53. package/lib/websocket/websocket.js +1 -1
  54. package/package.json +4 -7
@@ -11,9 +11,9 @@ The server option `rejectUnauthorized: false` allows us to handle any invalid ce
11
11
  ### Client Certificate Authentication
12
12
 
13
13
  ```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')
17
17
  const { Client } = require('undici')
18
18
 
19
19
  const serverOptions = {
package/lib/agent.js CHANGED
@@ -42,7 +42,7 @@ class Agent extends DispatcherBase {
42
42
  connect = { ...connect }
43
43
  }
44
44
 
45
- this[kInterceptors] = options.interceptors && options.interceptors.Agent && Array.isArray(options.interceptors.Agent)
45
+ this[kInterceptors] = options.interceptors?.Agent && Array.isArray(options.interceptors.Agent)
46
46
  ? options.interceptors.Agent
47
47
  : [createRedirectInterceptor({ maxRedirections })]
48
48
 
@@ -54,22 +54,20 @@ class Agent extends DispatcherBase {
54
54
  this[kFactory] = factory
55
55
  this[kClients] = new Map()
56
56
 
57
- const agent = this
58
-
59
57
  this[kOnDrain] = (origin, targets) => {
60
- agent.emit('drain', origin, [agent, ...targets])
58
+ this.emit('drain', origin, [this, ...targets])
61
59
  }
62
60
 
63
61
  this[kOnConnect] = (origin, targets) => {
64
- agent.emit('connect', origin, [agent, ...targets])
62
+ this.emit('connect', origin, [this, ...targets])
65
63
  }
66
64
 
67
65
  this[kOnDisconnect] = (origin, targets, err) => {
68
- agent.emit('disconnect', origin, [agent, ...targets], err)
66
+ this.emit('disconnect', origin, [this, ...targets], err)
69
67
  }
70
68
 
71
69
  this[kOnConnectionError] = (origin, targets, err) => {
72
- agent.emit('connectionError', origin, [agent, ...targets], err)
70
+ this.emit('connectionError', origin, [this, ...targets], err)
73
71
  }
74
72
  }
75
73
 
@@ -1,6 +1,6 @@
1
1
  'use strict'
2
2
 
3
- const { AsyncResource } = require('async_hooks')
3
+ const { AsyncResource } = require('node:async_hooks')
4
4
  const { InvalidArgumentError, RequestAbortedError, SocketError } = require('../core/errors')
5
5
  const util = require('../core/util')
6
6
  const { addSignal, removeSignal } = require('./abort-signal')
@@ -96,7 +96,7 @@ function connect (opts, callback) {
96
96
  if (typeof callback !== 'function') {
97
97
  throw err
98
98
  }
99
- const opaque = opts && opts.opaque
99
+ const opaque = opts?.opaque
100
100
  queueMicrotask(() => callback(err, { opaque }))
101
101
  }
102
102
  }
@@ -4,16 +4,16 @@ const {
4
4
  Readable,
5
5
  Duplex,
6
6
  PassThrough
7
- } = require('stream')
7
+ } = require('node:stream')
8
8
  const {
9
9
  InvalidArgumentError,
10
10
  InvalidReturnValueError,
11
11
  RequestAbortedError
12
12
  } = require('../core/errors')
13
13
  const util = require('../core/util')
14
- const { AsyncResource } = require('async_hooks')
14
+ const { AsyncResource } = require('node:async_hooks')
15
15
  const { addSignal, removeSignal } = require('./abort-signal')
16
- const assert = require('assert')
16
+ const assert = require('node:assert')
17
17
 
18
18
  const kResume = Symbol('resume')
19
19
 
@@ -100,7 +100,7 @@ class PipelineHandler extends AsyncResource {
100
100
  read: () => {
101
101
  const { body } = this
102
102
 
103
- if (body && body.resume) {
103
+ if (body?.resume) {
104
104
  body.resume()
105
105
  }
106
106
  },
@@ -7,7 +7,7 @@ const {
7
7
  } = require('../core/errors')
8
8
  const util = require('../core/util')
9
9
  const { getResolveErrorBodyCallback } = require('./util')
10
- const { AsyncResource } = require('async_hooks')
10
+ const { AsyncResource } = require('node:async_hooks')
11
11
  const { addSignal, removeSignal } = require('./abort-signal')
12
12
 
13
13
  class RequestHandler extends AsyncResource {
@@ -171,7 +171,7 @@ function request (opts, callback) {
171
171
  if (typeof callback !== 'function') {
172
172
  throw err
173
173
  }
174
- const opaque = opts && opts.opaque
174
+ const opaque = opts?.opaque
175
175
  queueMicrotask(() => callback(err, { opaque }))
176
176
  }
177
177
  }
@@ -1,6 +1,6 @@
1
1
  'use strict'
2
2
 
3
- const { finished, PassThrough } = require('stream')
3
+ const { finished, PassThrough } = require('node:stream')
4
4
  const {
5
5
  InvalidArgumentError,
6
6
  InvalidReturnValueError,
@@ -8,7 +8,7 @@ const {
8
8
  } = require('../core/errors')
9
9
  const util = require('../core/util')
10
10
  const { getResolveErrorBodyCallback } = require('./util')
11
- const { AsyncResource } = require('async_hooks')
11
+ const { AsyncResource } = require('node:async_hooks')
12
12
  const { addSignal, removeSignal } = require('./abort-signal')
13
13
 
14
14
  class StreamHandler extends AsyncResource {
@@ -148,7 +148,7 @@ class StreamHandler extends AsyncResource {
148
148
 
149
149
  const needDrain = res.writableNeedDrain !== undefined
150
150
  ? res.writableNeedDrain
151
- : res._writableState && res._writableState.needDrain
151
+ : res._writableState?.needDrain
152
152
 
153
153
  return needDrain !== true
154
154
  }
@@ -212,7 +212,7 @@ function stream (opts, factory, callback) {
212
212
  if (typeof callback !== 'function') {
213
213
  throw err
214
214
  }
215
- const opaque = opts && opts.opaque
215
+ const opaque = opts?.opaque
216
216
  queueMicrotask(() => callback(err, { opaque }))
217
217
  }
218
218
  }
@@ -1,10 +1,10 @@
1
1
  'use strict'
2
2
 
3
3
  const { InvalidArgumentError, RequestAbortedError, SocketError } = require('../core/errors')
4
- const { AsyncResource } = require('async_hooks')
4
+ const { AsyncResource } = require('node:async_hooks')
5
5
  const util = require('../core/util')
6
6
  const { addSignal, removeSignal } = require('./abort-signal')
7
- const assert = require('assert')
7
+ const assert = require('node:assert')
8
8
 
9
9
  class UpgradeHandler extends AsyncResource {
10
10
  constructor (opts, callback) {
@@ -97,7 +97,7 @@ function upgrade (opts, callback) {
97
97
  if (typeof callback !== 'function') {
98
98
  throw err
99
99
  }
100
- const opaque = opts && opts.opaque
100
+ const opaque = opts?.opaque
101
101
  queueMicrotask(() => callback(err, { opaque }))
102
102
  }
103
103
  }
@@ -2,8 +2,8 @@
2
2
 
3
3
  'use strict'
4
4
 
5
- const assert = require('assert')
6
- const { Readable } = require('stream')
5
+ const assert = require('node:assert')
6
+ const { Readable } = require('node:stream')
7
7
  const { RequestAbortedError, NotSupportedError, InvalidArgumentError, AbortError } = require('../core/errors')
8
8
  const util = require('../core/util')
9
9
  const { ReadableStreamFrom } = require('../core/util')
package/lib/api/util.js CHANGED
@@ -1,4 +1,4 @@
1
- const assert = require('assert')
1
+ const assert = require('node:assert')
2
2
  const {
3
3
  ResponseStatusCodeError
4
4
  } = require('../core/errors')
@@ -53,7 +53,7 @@ class BalancedPool extends PoolBase {
53
53
  throw new InvalidArgumentError('factory must be a function.')
54
54
  }
55
55
 
56
- this[kInterceptors] = opts.interceptors && opts.interceptors.BalancedPool && Array.isArray(opts.interceptors.BalancedPool)
56
+ this[kInterceptors] = opts.interceptors?.BalancedPool && Array.isArray(opts.interceptors.BalancedPool)
57
57
  ? opts.interceptors.BalancedPool
58
58
  : []
59
59
  this[kFactory] = factory
@@ -3,15 +3,13 @@
3
3
  const { kConstruct } = require('./symbols')
4
4
  const { urlEquals, fieldValues: getFieldValues } = require('./util')
5
5
  const { kEnumerableProperty, isDisturbed } = require('../core/util')
6
- const { kHeadersList } = require('../core/symbols')
7
6
  const { webidl } = require('../fetch/webidl')
8
- const { Response, cloneResponse } = require('../fetch/response')
7
+ const { Response, cloneResponse, fromInnerResponse } = require('../fetch/response')
9
8
  const { Request, fromInnerRequest } = require('../fetch/request')
10
- const { Headers } = require('../fetch/headers')
11
- const { kState, kHeaders, kGuard } = require('../fetch/symbols')
9
+ const { kState } = require('../fetch/symbols')
12
10
  const { fetching } = require('../fetch/index')
13
11
  const { urlIsHttpHttpsScheme, createDeferredPromise, readAllBytes } = require('../fetch/util')
14
- const assert = require('assert')
12
+ const assert = require('node:assert')
15
13
  const { getGlobalDispatcher } = require('../global')
16
14
 
17
15
  /**
@@ -783,11 +781,7 @@ class Cache {
783
781
  // 5.5.2
784
782
  for (const response of responses) {
785
783
  // 5.5.2.1
786
- const responseObject = new Response(kConstruct)
787
- responseObject[kState] = response
788
- responseObject[kHeaders] = new Headers(kConstruct)
789
- responseObject[kHeaders][kHeadersList] = response.headersList
790
- responseObject[kHeaders][kGuard] = 'immutable'
784
+ const responseObject = fromInnerResponse(response, 'immutable', { settingsObject: {} })
791
785
 
792
786
  responseList.push(responseObject.clone())
793
787
 
package/lib/cache/util.js CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict'
2
2
 
3
- const assert = require('assert')
3
+ const assert = require('node:assert')
4
4
  const { URLSerializer } = require('../fetch/dataURL')
5
5
  const { isValidHeaderName } = require('../fetch/util')
6
6
 
package/lib/client.js CHANGED
@@ -4,10 +4,10 @@
4
4
 
5
5
  /* global WebAssembly */
6
6
 
7
- const assert = require('assert')
8
- const net = require('net')
9
- const http = require('http')
10
- const { pipeline } = require('stream')
7
+ const assert = require('node:assert')
8
+ const net = require('node:net')
9
+ const http = require('node:http')
10
+ const { pipeline } = require('node:stream')
11
11
  const util = require('./core/util')
12
12
  const { channels } = require('./core/diagnostics')
13
13
  const timers = require('./timers')
@@ -84,7 +84,7 @@ const {
84
84
  /** @type {import('http2')} */
85
85
  let http2
86
86
  try {
87
- http2 = require('http2')
87
+ http2 = require('node:http2')
88
88
  } catch {
89
89
  // @ts-ignore
90
90
  http2 = { constants: {} }
@@ -250,7 +250,7 @@ class Client extends DispatcherBase {
250
250
  })
251
251
  }
252
252
 
253
- this[kInterceptors] = interceptors && interceptors.Client && Array.isArray(interceptors.Client)
253
+ this[kInterceptors] = interceptors?.Client && Array.isArray(interceptors.Client)
254
254
  ? interceptors.Client
255
255
  : [createRedirectInterceptor({ maxRedirections })]
256
256
  this[kUrl] = util.parseOrigin(url)
@@ -370,10 +370,10 @@ class Client extends DispatcherBase {
370
370
  // TODO: for H2 we need to gracefully flush the remaining enqueued
371
371
  // request and close each stream.
372
372
  return new Promise((resolve) => {
373
- if (!this[kSize]) {
374
- resolve(null)
375
- } else {
373
+ if (this[kSize]) {
376
374
  this[kClosedResolve] = resolve
375
+ } else {
376
+ resolve(null)
377
377
  }
378
378
  })
379
379
  }
@@ -401,10 +401,10 @@ class Client extends DispatcherBase {
401
401
  this[kHTTP2SessionState] = null
402
402
  }
403
403
 
404
- if (!this[kSocket]) {
405
- queueMicrotask(callback)
406
- } else {
404
+ if (this[kSocket]) {
407
405
  util.destroy(this[kSocket].on('close', callback), err)
406
+ } else {
407
+ queueMicrotask(callback)
408
408
  }
409
409
 
410
410
  resume(this)
@@ -479,7 +479,7 @@ async function lazyllhttp () {
479
479
 
480
480
  let mod
481
481
  try {
482
- mod = await WebAssembly.compile(Buffer.from(require('./llhttp/llhttp_simd-wasm.js'), 'base64'))
482
+ mod = await WebAssembly.compile(require('./llhttp/llhttp_simd-wasm.js'))
483
483
  } catch (e) {
484
484
  /* istanbul ignore next */
485
485
 
@@ -487,7 +487,7 @@ async function lazyllhttp () {
487
487
  // being enabled, but the occurring of this other error
488
488
  // * https://github.com/emscripten-core/emscripten/issues/11495
489
489
  // got me to remove that check to avoid breaking Node 12.
490
- mod = await WebAssembly.compile(Buffer.from(llhttpWasmData || require('./llhttp/llhttp-wasm.js'), 'base64'))
490
+ mod = await WebAssembly.compile(llhttpWasmData || require('./llhttp/llhttp-wasm.js'))
491
491
  }
492
492
 
493
493
  return await WebAssembly.instantiate(mod, {
@@ -3,7 +3,7 @@
3
3
  const { maxNameValuePairSize, maxAttributeValueSize } = require('./constants')
4
4
  const { isCTLExcludingHtab } = require('./util')
5
5
  const { collectASequenceOfCodePointsFast } = require('../fetch/dataURL')
6
- const assert = require('assert')
6
+ const assert = require('node:assert')
7
7
 
8
8
  /**
9
9
  * @description Parses the field-value attributes of a set-cookie header string.
@@ -1,6 +1,6 @@
1
1
  'use strict'
2
2
 
3
- const assert = require('assert')
3
+ const assert = require('node:assert')
4
4
  const { kHeadersList } = require('../core/symbols')
5
5
 
6
6
  function isCTLExcludingHtab (value) {
@@ -1,7 +1,7 @@
1
1
  'use strict'
2
2
 
3
- const net = require('net')
4
- const assert = require('assert')
3
+ const net = require('node:net')
4
+ const assert = require('node:assert')
5
5
  const util = require('./util')
6
6
  const { InvalidArgumentError, ConnectTimeoutError } = require('./errors')
7
7
 
@@ -86,7 +86,7 @@ function buildConnector ({ allowH2, maxCachedSessions, socketPath, timeout, ...o
86
86
  let socket
87
87
  if (protocol === 'https:') {
88
88
  if (!tls) {
89
- tls = require('tls')
89
+ tls = require('node:tls')
90
90
  }
91
91
  servername = servername || options.servername || util.getServerName(host) || null
92
92
 
@@ -1,6 +1,6 @@
1
1
  'use strict'
2
- const diagnosticsChannel = require('diagnostics_channel')
3
- const util = require('util')
2
+ const diagnosticsChannel = require('node:diagnostics_channel')
3
+ const util = require('node:util')
4
4
 
5
5
  const undiciDebugLog = util.debuglog('undici')
6
6
  const fetchDebuglog = util.debuglog('fetch')
@@ -4,7 +4,7 @@ const {
4
4
  InvalidArgumentError,
5
5
  NotSupportedError
6
6
  } = require('./errors')
7
- const assert = require('assert')
7
+ const assert = require('node:assert')
8
8
  const { kHTTP2BuildRequest, kHTTP2CopyHeaders, kHTTP1BuildRequest } = require('./symbols')
9
9
  const util = require('./util')
10
10
  const { channels } = require('./diagnostics.js')
@@ -369,8 +369,11 @@ class Request {
369
369
 
370
370
  if (value == null || value.length === 0) continue
371
371
 
372
- if (headers[key]) headers[key] += `,${value}`
373
- else headers[key] = value
372
+ if (headers[key]) {
373
+ headers[key] += `,${value}`
374
+ } else {
375
+ headers[key] = value
376
+ }
374
377
  }
375
378
 
376
379
  return headers
@@ -433,20 +436,22 @@ function processHeader (request, key, val, skipAppend = false) {
433
436
  }
434
437
  } else if (headerName === 'expect') {
435
438
  throw new NotSupportedError('expect header not supported')
436
- } else {
437
- if (Array.isArray(val)) {
438
- for (let i = 0; i < val.length; i++) {
439
- if (skipAppend) {
440
- if (request.headers[key]) request.headers[key] += `,${processHeaderValue(key, val[i], skipAppend)}`
441
- else request.headers[key] = processHeaderValue(key, val[i], skipAppend)
439
+ } else if (Array.isArray(val)) {
440
+ for (let i = 0; i < val.length; i++) {
441
+ if (skipAppend) {
442
+ if (request.headers[key]) {
443
+ request.headers[key] += `,${processHeaderValue(key, val[i], skipAppend)}`
442
444
  } else {
443
- request.headers += processHeaderValue(key, val[i])
445
+ request.headers[key] = processHeaderValue(key, val[i], skipAppend)
444
446
  }
447
+ } else {
448
+ request.headers += processHeaderValue(key, val[i])
445
449
  }
446
- } else {
447
- if (skipAppend) request.headers[key] = processHeaderValue(key, val, skipAppend)
448
- else request.headers += processHeaderValue(key, val)
449
450
  }
451
+ } else if (skipAppend) {
452
+ request.headers[key] = processHeaderValue(key, val, skipAppend)
453
+ } else {
454
+ request.headers += processHeaderValue(key, val)
450
455
  }
451
456
  }
452
457
 
package/lib/core/tree.js CHANGED
@@ -57,12 +57,10 @@ class TstNode {
57
57
  } else {
58
58
  this.left = new TstNode(key, value, index)
59
59
  }
60
+ } else if (this.right !== null) {
61
+ this.right.add(key, value, index)
60
62
  } else {
61
- if (this.right !== null) {
62
- this.right.add(key, value, index)
63
- } else {
64
- this.right = new TstNode(key, value, index)
65
- }
63
+ this.right = new TstNode(key, value, index)
66
64
  }
67
65
  }
68
66
 
package/lib/core/util.js CHANGED
@@ -1,14 +1,14 @@
1
1
  'use strict'
2
2
 
3
- const assert = require('assert')
3
+ const assert = require('node:assert')
4
4
  const { kDestroyed, kBodyUsed } = require('./symbols')
5
- const { IncomingMessage } = require('http')
6
- const stream = require('stream')
7
- const net = require('net')
5
+ const { IncomingMessage } = require('node:http')
6
+ const stream = require('node:stream')
7
+ const net = require('node:net')
8
8
  const { InvalidArgumentError } = require('./errors')
9
- const { Blob } = require('buffer')
10
- const nodeUtil = require('util')
11
- const { stringify } = require('querystring')
9
+ const { Blob } = require('node:buffer')
10
+ const nodeUtil = require('node:util')
11
+ const { stringify } = require('node:querystring')
12
12
  const { headerNameLowerCasedRecord } = require('./constants')
13
13
  const { tree } = require('./tree')
14
14
 
@@ -187,7 +187,7 @@ function isDestroyed (stream) {
187
187
  }
188
188
 
189
189
  function isReadableAborted (stream) {
190
- const state = stream && stream._readableState
190
+ const state = stream?._readableState
191
191
  return isDestroyed(stream) && state && !state.endEmitted
192
192
  }
193
193
 
@@ -254,19 +254,19 @@ function parseHeaders (headers, obj) {
254
254
  const key = headerNameToString(headers[i])
255
255
  let val = obj[key]
256
256
 
257
- if (!val) {
257
+ if (val) {
258
+ if (typeof val === 'string') {
259
+ val = [val]
260
+ obj[key] = val
261
+ }
262
+ val.push(headers[i + 1].toString('utf8'))
263
+ } else {
258
264
  const headersValue = headers[i + 1]
259
265
  if (typeof headersValue === 'string') {
260
266
  obj[key] = headersValue
261
267
  } else {
262
268
  obj[key] = Array.isArray(headersValue) ? headersValue.map(x => x.toString('utf8')) : headersValue.toString('utf8')
263
269
  }
264
- } else {
265
- if (typeof val === 'string') {
266
- val = [val]
267
- obj[key] = val
268
- }
269
- val.push(headers[i + 1].toString('utf8'))
270
270
  }
271
271
  }
272
272
 
package/lib/dispatcher.js CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict'
2
2
 
3
- const EventEmitter = require('events')
3
+ const EventEmitter = require('node:events')
4
4
 
5
5
  class Dispatcher extends EventEmitter {
6
6
  dispatch () {
@@ -337,7 +337,7 @@ class EventSourceStream extends Transform {
337
337
  if (event[field] === undefined) {
338
338
  event[field] = value
339
339
  } else {
340
- event[field] += '\n' + value
340
+ event[field] += `\n${value}`
341
341
  }
342
342
  break
343
343
  case 'retry':
@@ -1,6 +1,5 @@
1
1
  'use strict'
2
2
 
3
- const { setTimeout } = require('node:timers/promises')
4
3
  const { pipeline } = require('node:stream')
5
4
  const { fetching } = require('../fetch')
6
5
  const { makeRequest } = require('../fetch/request')
@@ -11,6 +10,7 @@ const { parseMIMEType } = require('../fetch/dataURL')
11
10
  const { MessageEvent } = require('../websocket/events')
12
11
  const { isNetworkError } = require('../fetch/response')
13
12
  const { getGlobalDispatcher } = require('../global')
13
+ const { delay } = require('./util')
14
14
 
15
15
  let experimentalWarned = false
16
16
 
@@ -344,7 +344,7 @@ class EventSource extends EventTarget {
344
344
  this.dispatchEvent(new Event('error'))
345
345
 
346
346
  // 2. Wait a delay equal to the reconnection time of the event source.
347
- await setTimeout(this.#settings.reconnectionTime, { ref: false })
347
+ await delay(this.#settings.reconnectionTime)
348
348
 
349
349
  // 5. Queue a task to run the following steps:
350
350
 
@@ -23,7 +23,15 @@ function isASCIINumber (value) {
23
23
  return true
24
24
  }
25
25
 
26
+ // https://github.com/nodejs/undici/issues/2664
27
+ function delay (ms) {
28
+ return new Promise((resolve) => {
29
+ setTimeout(resolve, ms).unref()
30
+ })
31
+ }
32
+
26
33
  module.exports = {
27
34
  isValidLastEventId,
28
- isASCIINumber
35
+ isASCIINumber,
36
+ delay
29
37
  }