tangerine 1.5.4 → 1.5.6

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 +32 -5
  2. package/package.json +24 -23
package/index.js CHANGED
@@ -11,6 +11,7 @@ const autoBind = require('auto-bind');
11
11
  const getStream = require('get-stream');
12
12
  const hostile = require('hostile');
13
13
  const ipaddr = require('ipaddr.js');
14
+ const isStream = require('is-stream');
14
15
  const mergeOptions = require('merge-options');
15
16
  const pMap = require('p-map');
16
17
  const pTimeout = require('p-timeout');
@@ -702,8 +703,8 @@ class Tangerine extends dns.promises.Resolver {
702
703
 
703
704
  // safeguard (matches c-ares)
704
705
  if (lower === 'localhost' || lower === 'localhost.') {
705
- if (!resolve4) resolve4 = ['127.0.0.1'];
706
- if (!resolve6) resolve6 = ['::1'];
706
+ resolve4 ||= ['127.0.0.1'];
707
+ resolve6 ||= ['::1'];
707
708
  }
708
709
 
709
710
  if (isIPv4(name)) {
@@ -1128,22 +1129,41 @@ class Tangerine extends dns.promises.Resolver {
1128
1129
  const statusCode = response.status || response.statusCode;
1129
1130
  debug('response', { statusCode, headers });
1130
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
+
1131
1139
  // eslint-disable-next-line max-depth
1132
1140
  if (body && statusCode >= 200 && statusCode < 300) {
1141
+ // <https://sindresorhus.com/blog/goodbye-nodejs-buffer>
1133
1142
  buffer = Buffer.isBuffer(body)
1134
1143
  ? body
1135
1144
  : // eslint-disable-next-line no-await-in-loop
1136
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();
1137
1149
  // eslint-disable-next-line max-depth
1138
1150
  if (!abortController.signal.aborted) abortController.abort();
1139
1151
  break;
1140
1152
  }
1141
1153
 
1154
+ // <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();
1157
+
1158
+ // <https://github.com/nodejs/undici/blob/00dfd0bd41e73782452aecb728395f354585ca94/lib/core/errors.js#L47-L58>
1142
1159
  const message =
1143
1160
  http.STATUS_CODES[statusCode] ||
1144
1161
  this.options.defaultHTTPErrorMessage;
1145
1162
  const err = new Error(message);
1163
+ err.body = body;
1164
+ err.status = statusCode;
1146
1165
  err.statusCode = statusCode;
1166
+ err.headers = headers;
1147
1167
  throw err;
1148
1168
  }
1149
1169
  } catch (err) {
@@ -1156,7 +1176,8 @@ class Tangerine extends dns.promises.Resolver {
1156
1176
  // eslint-disable-next-line max-depth
1157
1177
  if (err.code === dns.NOTFOUND) throw err;
1158
1178
 
1159
- ipErrors.push(err);
1179
+ // eslint-disable-next-line max-depth
1180
+ if (err.status >= 429) ipErrors.push(err);
1160
1181
 
1161
1182
  // break out of the loop if status code was not retryable
1162
1183
  // eslint-disable-next-line max-depth
@@ -1202,6 +1223,12 @@ class Tangerine extends dns.promises.Resolver {
1202
1223
  // that one or more dns servers have persistent issues
1203
1224
  if (errors.length > 0)
1204
1225
  this.options.logger.error(this.constructor.combineErrors(errors));
1226
+
1227
+ //
1228
+ // NOTE: dns-packet does not yet support Uint8Array
1229
+ // (however undici does have body.arrayBuffer() method)
1230
+ //
1231
+ // https://github.com/mafintosh/dns-packet/issues/72
1205
1232
  return packet.decode(buffer);
1206
1233
  } catch (_err) {
1207
1234
  if (!abortController.signal.aborted) abortController.abort();
@@ -1886,8 +1913,8 @@ class Tangerine extends dns.promises.Resolver {
1886
1913
  Buffer.isBuffer(a.data)
1887
1914
  ? a.data.toString()
1888
1915
  : Array.isArray(a.data)
1889
- ? a.data.map((d) => (Buffer.isBuffer(d) ? d.toString() : d))
1890
- : a.data
1916
+ ? a.data.map((d) => (Buffer.isBuffer(d) ? d.toString() : d))
1917
+ : a.data
1891
1918
  ];
1892
1919
  });
1893
1920
  }
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.4",
4
+ "version": "1.5.6",
5
5
  "author": "Forward Email (https://forwardemail.net)",
6
6
  "bugs": {
7
7
  "url": "https://github.com/forwardemail/nodejs-dns-over-https-tangerine/issues"
@@ -12,49 +12,50 @@
12
12
  "dependencies": {
13
13
  "@ungap/structured-clone": "^1.2.0",
14
14
  "auto-bind": "4",
15
- "dns-packet": "^5.6.0",
15
+ "dns-packet": "^5.6.1",
16
16
  "dohdec": "^5.0.3",
17
17
  "get-stream": "6",
18
- "hostile": "^1.3.3",
19
- "ipaddr.js": "^2.0.1",
18
+ "hostile": "^1.4.0",
19
+ "ipaddr.js": "^2.2.0",
20
+ "is-stream": "2.0.1",
20
21
  "merge-options": "3.0.4",
21
22
  "p-map": "4",
22
23
  "p-timeout": "4",
23
24
  "p-wait-for": "3",
24
25
  "port-numbers": "6.0.1",
25
- "private-ip": "^3.0.0",
26
- "punycode": "^2.3.0",
27
- "semver": "^7.5.1"
26
+ "private-ip": "^3.0.2",
27
+ "punycode": "^2.3.1",
28
+ "semver": "^7.6.3"
28
29
  },
29
30
  "devDependencies": {
30
- "@commitlint/cli": "^17.6.3",
31
- "@commitlint/config-conventional": "^17.6.3",
31
+ "@commitlint/cli": "^19.3.0",
32
+ "@commitlint/config-conventional": "^19.2.2",
32
33
  "ava": "^5.2.0",
33
- "axios": "^1.4.0",
34
+ "axios": "^1.7.3",
34
35
  "benchmark": "^2.1.4",
35
36
  "cross-env": "^7.0.3",
36
- "eslint": "^8.34.0",
37
+ "eslint": "^9.8.0",
37
38
  "eslint-config-xo-lass": "^2.0.1",
38
- "fetch-mock": "^9.11.0",
39
+ "fetch-mock": "^10.1.1",
39
40
  "fixpack": "^4.0.0",
40
41
  "got": "11",
41
- "husky": "^8.0.3",
42
- "ioredis": "^5.3.2",
43
- "ioredis-mock": "^8.7.0",
42
+ "husky": "^9.1.4",
43
+ "ioredis": "^5.4.1",
44
+ "ioredis-mock": "^8.9.0",
44
45
  "is-ci": "^3.0.1",
45
- "lint-staged": "^13.2.2",
46
+ "lint-staged": "^15.2.8",
46
47
  "lodash": "^4.17.21",
47
- "nock": "^13.3.1",
48
+ "nock": "^13.5.4",
48
49
  "node-fetch": "2",
49
- "nyc": "^15.1.0",
50
- "phin": "^3.7.0",
51
- "remark-cli": "^11.0.0",
50
+ "nyc": "^17.0.0",
51
+ "phin": "^3.7.1",
52
+ "remark-cli": "11.0.0",
52
53
  "remark-preset-github": "^4.0.4",
53
54
  "request": "^2.88.2",
54
55
  "sort-keys": "4.2.0",
55
- "superagent": "^8.0.9",
56
- "undici": "^5.22.1",
57
- "xo": "^0.54.2"
56
+ "superagent": "^9.0.2",
57
+ "undici": "^6.19.5",
58
+ "xo": "^0.58.0"
58
59
  },
59
60
  "engines": {
60
61
  "node": ">=16"