Description
Bug Description
When importing undici
(from node_modules) after using fetch
(nodejs built-in), then globalDispatcher
is filled by built-in undici.
Therefore using instanceof errors.UndiciError
is unreliable
Reproducible By
Promise.resolve().then(async () => {
fetch('http://httpstat.us/200') // if fetch is commented out, then it works properly
require('net').createServer((c) => {
setTimeout(() => c.destroy(), 100)
}).listen(8888)
const { request, errors } = require('undici')
try {
await request('http://127.0.0.1:8888/')
} catch (err) {
console.info(err instanceof errors.UndiciError)
}
process.exit(0)
})
Expected Behavior
true
would be printed, as error should be instance of SocketError
that inherits UndiciError
Logs & Screenshots
Environment
Checked on Node v20.13.1 and v23.5.0 using undici 7.2.0 and 5.28.4, on ubuntu 22.04 and in node:20.13-alpine3.19 container
Context
It seems natural to use instanceof
, because error classes are exported. npm
allows to have multiple versions of undici
exported, so it's easy to have built-in undici, node_modules/undici
and undici nested inside node_modules libraries.
To make it worse: ResponseStatusCodeError (which is easiest to test) is thrown outside dispatcher, so when I checked it, instanceof
worked properly.