tangerine 1.5.6 → 1.5.8

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 (2) hide show
  1. package/index.js +34 -24
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -1043,7 +1043,7 @@ class Tangerine extends dns.promises.Resolver {
1043
1043
  //
1044
1044
  async #request(pkt, server, abortController, timeout = this.options.timeout) {
1045
1045
  // safeguard in case aborted
1046
- if (abortController.signal.aborted) return;
1046
+ if (abortController?.signal?.aborted) return;
1047
1047
 
1048
1048
  let localAddress;
1049
1049
  let localPort;
@@ -1129,31 +1129,33 @@ class Tangerine extends dns.promises.Resolver {
1129
1129
  const statusCode = response.status || response.statusCode;
1130
1130
  debug('response', { statusCode, headers });
1131
1131
 
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
-
1139
1132
  // eslint-disable-next-line max-depth
1140
1133
  if (body && statusCode >= 200 && statusCode < 300) {
1141
1134
  // <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
1135
  // eslint-disable-next-line max-depth
1150
- if (!abortController.signal.aborted) abortController.abort();
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
+
1151
1148
  break;
1152
1149
  }
1153
1150
 
1154
1151
  // <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();
1157
1159
 
1158
1160
  // <https://github.com/nodejs/undici/blob/00dfd0bd41e73782452aecb728395f354585ca94/lib/core/errors.js#L47-L58>
1159
1161
  const message =
@@ -1173,14 +1175,13 @@ class Tangerine extends dns.promises.Resolver {
1173
1175
  // NOTE: if NOTFOUND error occurs then don't attempt further requests
1174
1176
  // <https://nodejs.org/api/dns.html#dnssetserversservers>
1175
1177
  //
1176
- // eslint-disable-next-line max-depth
1178
+
1177
1179
  if (err.code === dns.NOTFOUND) throw err;
1178
1180
 
1179
- // eslint-disable-next-line max-depth
1180
1181
  if (err.status >= 429) ipErrors.push(err);
1181
1182
 
1182
1183
  // break out of the loop if status code was not retryable
1183
- // eslint-disable-next-line max-depth
1184
+
1184
1185
  if (
1185
1186
  !(
1186
1187
  err.statusCode &&
@@ -1231,7 +1232,6 @@ class Tangerine extends dns.promises.Resolver {
1231
1232
  // https://github.com/mafintosh/dns-packet/issues/72
1232
1233
  return packet.decode(buffer);
1233
1234
  } catch (_err) {
1234
- if (!abortController.signal.aborted) abortController.abort();
1235
1235
  debug(_err, { name, rrtype, ecsSubnet });
1236
1236
  if (this.options.returnHTTPErrors) throw _err;
1237
1237
  const err = this.constructor.createError(
@@ -1255,7 +1255,13 @@ class Tangerine extends dns.promises.Resolver {
1255
1255
  // (instead they are called with "ABORT_ERR"; see ABORT_ERROR_CODES)
1256
1256
  cancel() {
1257
1257
  for (const abortController of this.abortControllers) {
1258
- if (!abortController.signal.aborted) abortController.abort();
1258
+ if (!abortController.signal.aborted) {
1259
+ try {
1260
+ abortController.abort('Cancel invoked');
1261
+ } catch (err) {
1262
+ this.options.logger.debug(err);
1263
+ }
1264
+ }
1259
1265
  }
1260
1266
  }
1261
1267
 
@@ -1273,7 +1279,11 @@ class Tangerine extends dns.promises.Resolver {
1273
1279
  parentAbortController.signal.addEventListener(
1274
1280
  'abort',
1275
1281
  () => {
1276
- abortController.abort();
1282
+ try {
1283
+ abortController.abort('Parent abort controller aborted');
1284
+ } catch (err) {
1285
+ this.options.logger.debug(err);
1286
+ }
1277
1287
  },
1278
1288
  { once: true }
1279
1289
  );
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "tangerine",
3
3
  "description": "Tangerine is the best Node.js drop-in replacement for dns.promises.Resolver using DNS over HTTPS (\"DoH\") via undici with built-in retries, timeouts, smart server rotation, AbortControllers, and caching support for multiple backends (with TTL and purge support).",
4
- "version": "1.5.6",
4
+ "version": "1.5.8",
5
5
  "author": "Forward Email (https://forwardemail.net)",
6
6
  "bugs": {
7
7
  "url": "https://github.com/forwardemail/nodejs-dns-over-https-tangerine/issues"