Skip to content

Commit 63c4b5d

Browse files
committed
fix: attempt to fix uncaught exception per <nodejs/undici#3353>
1 parent 6fec218 commit 63c4b5d

File tree

1 file changed

+25
-26
lines changed

1 file changed

+25
-26
lines changed

index.js

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1043,7 +1043,7 @@ class Tangerine extends dns.promises.Resolver {
10431043
//
10441044
async #request(pkt, server, abortController, timeout = this.options.timeout) {
10451045
// safeguard in case aborted
1046-
if (abortController.signal.aborted) return;
1046+
if (abortController?.signal?.aborted) return;
10471047

10481048
let localAddress;
10491049
let localPort;
@@ -1129,31 +1129,33 @@ class Tangerine extends dns.promises.Resolver {
11291129
const statusCode = response.status || response.statusCode;
11301130
debug('response', { statusCode, headers });
11311131

1132-
// <https://github.com/nodejs/undici/issues/3353#issuecomment-2184635954>
1133-
// eslint-disable-next-line max-depth
1134-
if (body && isStream(body) && typeof body.on === 'function')
1135-
body.on('error', (err) => {
1136-
this.options.logger.error(err, { response });
1137-
});
1138-
11391132
// eslint-disable-next-line max-depth
11401133
if (body && statusCode >= 200 && statusCode < 300) {
11411134
// <https://sindresorhus.com/blog/goodbye-nodejs-buffer>
1142-
buffer = Buffer.isBuffer(body)
1143-
? body
1144-
: // eslint-disable-next-line no-await-in-loop
1145-
await getStream.buffer(body);
1146-
// <https://github.com/nodejs/undici/issues/3353>
1147-
// eslint-disable-next-line no-await-in-loop, max-depth
1148-
if (body && typeof body.dump === 'function') await body.dump();
1149-
// NOTE: we don't need to do this (causes uncaught exception)
1150-
// if (!abortController.signal.aborted) abortController.abort();
1135+
// eslint-disable-next-line max-depth
1136+
if (Buffer.isBuffer(body)) buffer = body;
1137+
else if (typeof body.arrayBuffer === 'function')
1138+
// eslint-disable-next-line no-await-in-loop
1139+
buffer = Buffer.from(await body.arrayBuffer());
1140+
// eslint-disable-next-line no-await-in-loop
1141+
else if (isStream(body)) buffer = await getStream.buffer(body);
1142+
else {
1143+
const err = new TypeError('Unsupported body type');
1144+
err.body = body;
1145+
throw err;
1146+
}
1147+
11511148
break;
11521149
}
11531150

11541151
// <https://github.com/nodejs/undici/issues/3353>
1155-
// eslint-disable-next-line no-await-in-loop, max-depth
1156-
if (body && typeof body.dump === 'function') await body.dump();
1152+
if (
1153+
!abortController?.signal?.aborted &&
1154+
body &&
1155+
typeof body.dump === 'function'
1156+
)
1157+
// eslint-disable-next-line no-await-in-loop
1158+
await body.dump();
11571159

11581160
// <https://github.com/nodejs/undici/blob/00dfd0bd41e73782452aecb728395f354585ca94/lib/core/errors.js#L47-L58>
11591161
const message =
@@ -1173,14 +1175,13 @@ class Tangerine extends dns.promises.Resolver {
11731175
// NOTE: if NOTFOUND error occurs then don't attempt further requests
11741176
// <https://nodejs.org/api/dns.html#dnssetserversservers>
11751177
//
1176-
// eslint-disable-next-line max-depth
1178+
11771179
if (err.code === dns.NOTFOUND) throw err;
11781180

1179-
// eslint-disable-next-line max-depth
11801181
if (err.status >= 429) ipErrors.push(err);
11811182

11821183
// break out of the loop if status code was not retryable
1183-
// eslint-disable-next-line max-depth
1184+
11841185
if (
11851186
!(
11861187
err.statusCode &&
@@ -1231,8 +1232,6 @@ class Tangerine extends dns.promises.Resolver {
12311232
// https://github.com/mafintosh/dns-packet/issues/72
12321233
return packet.decode(buffer);
12331234
} catch (_err) {
1234-
// NOTE: we don't need to do this (causes uncaught exception)
1235-
// if (!abortController.signal.aborted) abortController.abort();
12361235
debug(_err, { name, rrtype, ecsSubnet });
12371236
if (this.options.returnHTTPErrors) throw _err;
12381237
const err = this.constructor.createError(
@@ -1258,7 +1257,7 @@ class Tangerine extends dns.promises.Resolver {
12581257
for (const abortController of this.abortControllers) {
12591258
if (!abortController.signal.aborted) {
12601259
try {
1261-
abortController.abort();
1260+
abortController.abort('Cancel invoked');
12621261
} catch (err) {
12631262
this.options.logger.debug(err);
12641263
}
@@ -1281,7 +1280,7 @@ class Tangerine extends dns.promises.Resolver {
12811280
'abort',
12821281
() => {
12831282
try {
1284-
abortController.abort();
1283+
abortController.abort('Parent abort controller aborted');
12851284
} catch (err) {
12861285
this.options.logger.debug(err);
12871286
}

0 commit comments

Comments
 (0)