Comparing version 6.0.0 to 6.0.1
@@ -65,2 +65,14 @@ // Ported from https://github.com/nodejs/undici/pull/907 | ||
_destroy (err, callback) { | ||
// Workaround for Node "bug". If the stream is destroyed in same | ||
// tick as it is created, then a user who is waiting for a | ||
// promise (i.e micro tick) for installing a 'error' listener will | ||
// never get a chance and will always encounter an unhandled exception. | ||
// - tick => process.nextTick(fn) | ||
// - micro tick => queueMicrotask(fn) | ||
queueMicrotask(() => { | ||
callback(err) | ||
}) | ||
} | ||
emit (ev, ...args) { | ||
@@ -170,3 +182,3 @@ if (ev === 'data') { | ||
if (this.closed) { | ||
if (this._readableState.closeEmitted) { | ||
return Promise.resolve(null) | ||
@@ -215,29 +227,40 @@ } | ||
async function consume (stream, type) { | ||
if (isUnusable(stream)) { | ||
throw new TypeError('unusable') | ||
} | ||
assert(!stream[kConsume]) | ||
return new Promise((resolve, reject) => { | ||
stream[kConsume] = { | ||
type, | ||
stream, | ||
resolve, | ||
reject, | ||
length: 0, | ||
body: [] | ||
} | ||
if (isUnusable(stream)) { | ||
const rState = stream._readableState | ||
if (rState.destroyed && rState.closeEmitted === false) { | ||
stream | ||
.on('error', err => { | ||
reject(err) | ||
}) | ||
.on('close', () => { | ||
reject(new TypeError('unusable')) | ||
}) | ||
} else { | ||
reject(rState.errored ?? new TypeError('unusable')) | ||
} | ||
} else { | ||
stream[kConsume] = { | ||
type, | ||
stream, | ||
resolve, | ||
reject, | ||
length: 0, | ||
body: [] | ||
} | ||
stream | ||
.on('error', function (err) { | ||
consumeFinish(this[kConsume], err) | ||
}) | ||
.on('close', function () { | ||
if (this[kConsume].body !== null) { | ||
consumeFinish(this[kConsume], new RequestAbortedError()) | ||
} | ||
}) | ||
stream | ||
.on('error', function (err) { | ||
consumeFinish(this[kConsume], err) | ||
}) | ||
.on('close', function () { | ||
if (this[kConsume].body !== null) { | ||
consumeFinish(this[kConsume], new RequestAbortedError()) | ||
} | ||
}) | ||
process.nextTick(consumeStart, stream[kConsume]) | ||
queueMicrotask(() => consumeStart(stream[kConsume])) | ||
} | ||
}) | ||
@@ -244,0 +267,0 @@ } |
@@ -1966,8 +1966,15 @@ // @ts-check | ||
} | ||
const onAbort = function () { | ||
if (finished) { | ||
return | ||
const onClose = function () { | ||
// 'close' might be emitted *before* 'error' for | ||
// broken streams. Wait a tick to avoid this case. | ||
queueMicrotask(() => { | ||
// It's only safe to remove 'error' listener after | ||
// 'close'. | ||
body.removeListener('error', onFinished) | ||
}) | ||
if (!finished) { | ||
const err = new RequestAbortedError() | ||
queueMicrotask(() => onFinished(err)) | ||
} | ||
const err = new RequestAbortedError() | ||
queueMicrotask(() => onFinished(err)) | ||
} | ||
@@ -1990,4 +1997,3 @@ const onFinished = function (err) { | ||
.removeListener('end', onFinished) | ||
.removeListener('error', onFinished) | ||
.removeListener('close', onAbort) | ||
.removeListener('close', onClose) | ||
@@ -2015,3 +2021,3 @@ if (!err) { | ||
.on('error', onFinished) | ||
.on('close', onAbort) | ||
.on('close', onClose) | ||
@@ -2018,0 +2024,0 @@ if (body.resume) { |
{ | ||
"name": "undici", | ||
"version": "6.0.0", | ||
"version": "6.0.1", | ||
"description": "An HTTP/1.1 client, written from scratch for Node.js", | ||
@@ -5,0 +5,0 @@ "homepage": "https://undici.nodejs.org", |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
1181067
20832