Skip to content

Commit 06c6488

Browse files
authored
fix(fetch): third party abortcontrollers throwing errors (#2002)
1 parent 65eea9b commit 06c6488

File tree

3 files changed

+30
-3
lines changed

3 files changed

+30
-3
lines changed

lib/fetch/request.js

+7-3
Original file line numberDiff line numberDiff line change
@@ -358,9 +358,13 @@ class Request {
358358
ac.abort(this.reason)
359359
}
360360

361-
if (getEventListeners(signal, 'abort').length >= defaultMaxListeners) {
362-
setMaxListeners(100, signal)
363-
}
361+
// Third-party AbortControllers may not work with these.
362+
// See https://github.com/nodejs/undici/pull/1910#issuecomment-1464495619
363+
try {
364+
if (getEventListeners(signal, 'abort').length >= defaultMaxListeners) {
365+
setMaxListeners(100, signal)
366+
}
367+
} catch {}
364368

365369
signal.addEventListener('abort', abort, { once: true })
366370
requestFinalizer.register(this, { signal, abort })

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@
8686
"husky": "^8.0.1",
8787
"import-fresh": "^3.3.0",
8888
"jest": "^29.0.2",
89+
"jsdom": "^21.1.0",
8990
"jsfuzz": "^1.0.15",
9091
"mocha": "^10.0.0",
9192
"p-timeout": "^3.2.0",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
'use strict'
2+
3+
const { test } = require('tap')
4+
const { createServer } = require('http')
5+
const { once } = require('events')
6+
const { fetch } = require('../..')
7+
const { JSDOM } = require('jsdom')
8+
9+
// https://github.com/nodejs/undici/pull/1910#issuecomment-1464495619
10+
test('third party AbortControllers', async (t) => {
11+
const server = createServer((_, res) => res.end()).listen(0)
12+
13+
t.teardown(server.close.bind(server))
14+
await once(server, 'listening')
15+
16+
const { AbortController } = new JSDOM().window
17+
const controller = new AbortController()
18+
19+
await t.resolves(fetch(`http://localhost:${server.address().port}`, {
20+
signal: controller.signal
21+
}))
22+
})

0 commit comments

Comments
 (0)