tangerine 2.1.0 → 2.1.1
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.
- package/README.md +117 -25
- package/index.js +14 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -534,7 +534,7 @@ We have written extensive benchmarks to show that :tangerine: Tangerine is as fa
|
|
|
534
534
|
|
|
535
535
|
#### Latest Automated Benchmark Results
|
|
536
536
|
|
|
537
|
-
**Last Updated:** 2026-
|
|
537
|
+
**Last Updated:** 2026-03-05
|
|
538
538
|
|
|
539
539
|
| Node Version | Platform | Arch | Timestamp |
|
|
540
540
|
| ------------ | -------- | ---- | ------------ |
|
|
@@ -545,7 +545,8 @@ We have written extensive benchmarks to show that :tangerine: Tangerine is as fa
|
|
|
545
545
|
| v22.22.0 | linux | x64 | Jan 23, 2026 |
|
|
546
546
|
| v24.12.0 | linux | x64 | Dec 21, 2025 |
|
|
547
547
|
| v24.13.0 | linux | x64 | Feb 19, 2026 |
|
|
548
|
-
| v24.13.1 | linux | x64 |
|
|
548
|
+
| v24.13.1 | linux | x64 | Mar 4, 2026 |
|
|
549
|
+
| v24.14.0 | linux | x64 | Mar 5, 2026 |
|
|
549
550
|
| v25.2.1 | linux | x64 | Dec 21, 2025 |
|
|
550
551
|
| v25.3.0 | linux | x64 | Jan 14, 2026 |
|
|
551
552
|
| v25.4.0 | linux | x64 | Jan 20, 2026 |
|
|
@@ -553,6 +554,7 @@ We have written extensive benchmarks to show that :tangerine: Tangerine is as fa
|
|
|
553
554
|
| v25.6.0 | linux | x64 | Feb 4, 2026 |
|
|
554
555
|
| v25.6.1 | linux | x64 | Feb 11, 2026 |
|
|
555
556
|
| v25.7.0 | linux | x64 | Feb 25, 2026 |
|
|
557
|
+
| v25.8.0 | linux | x64 | Mar 4, 2026 |
|
|
556
558
|
|
|
557
559
|
<details>
|
|
558
560
|
<summary>Click to expand detailed benchmark results</summary>
|
|
@@ -857,12 +859,12 @@ Fastest without caching is: tangerine.reverse GET without caching
|
|
|
857
859
|
|
|
858
860
|
```text
|
|
859
861
|
Started: lookup
|
|
860
|
-
tangerine.lookup POST with caching using Cloudflare x
|
|
861
|
-
tangerine.lookup POST without caching using Cloudflare x
|
|
862
|
-
tangerine.lookup GET with caching using Cloudflare x
|
|
863
|
-
tangerine.lookup GET without caching using Cloudflare x
|
|
864
|
-
dns.promises.lookup with caching using Cloudflare x
|
|
865
|
-
dns.promises.lookup without caching using Cloudflare x 2,
|
|
862
|
+
tangerine.lookup POST with caching using Cloudflare x 333,315 ops/sec ±1.61% (85 runs sampled)
|
|
863
|
+
tangerine.lookup POST without caching using Cloudflare x 227 ops/sec ±1.93% (82 runs sampled)
|
|
864
|
+
tangerine.lookup GET with caching using Cloudflare x 320,901 ops/sec ±0.68% (90 runs sampled)
|
|
865
|
+
tangerine.lookup GET without caching using Cloudflare x 262 ops/sec ±2.60% (81 runs sampled)
|
|
866
|
+
dns.promises.lookup with caching using Cloudflare x 10,104,926 ops/sec ±1.20% (84 runs sampled)
|
|
867
|
+
dns.promises.lookup without caching using Cloudflare x 2,172 ops/sec ±0.39% (86 runs sampled)
|
|
866
868
|
Fastest without caching is: dns.promises.lookup without caching using Cloudflare
|
|
867
869
|
```
|
|
868
870
|
|
|
@@ -870,29 +872,74 @@ Fastest without caching is: dns.promises.lookup without caching using Cloudflare
|
|
|
870
872
|
|
|
871
873
|
```text
|
|
872
874
|
Started: resolve
|
|
873
|
-
tangerine.resolve POST with caching using Cloudflare x 1,
|
|
874
|
-
tangerine.resolve POST without caching using Cloudflare x
|
|
875
|
-
tangerine.resolve GET with caching using Cloudflare x 1,
|
|
876
|
-
tangerine.resolve GET without caching using Cloudflare x
|
|
877
|
-
tangerine.resolve POST with caching using Google x
|
|
878
|
-
tangerine.resolve POST without caching using Google x
|
|
879
|
-
tangerine.resolve GET with caching using Google x 1,127,
|
|
880
|
-
tangerine.resolve GET without caching using Google x
|
|
881
|
-
resolver.resolve with caching using Cloudflare x 8,
|
|
882
|
-
resolver.resolve without caching using Cloudflare x
|
|
883
|
-
Fastest without caching is:
|
|
875
|
+
tangerine.resolve POST with caching using Cloudflare x 1,155,993 ops/sec ±0.68% (89 runs sampled)
|
|
876
|
+
tangerine.resolve POST without caching using Cloudflare x 238 ops/sec ±1.44% (82 runs sampled)
|
|
877
|
+
tangerine.resolve GET with caching using Cloudflare x 1,130,246 ops/sec ±0.43% (89 runs sampled)
|
|
878
|
+
tangerine.resolve GET without caching using Cloudflare x 271 ops/sec ±1.13% (85 runs sampled)
|
|
879
|
+
tangerine.resolve POST with caching using Google x 534 ops/sec ±195.91% (89 runs sampled)
|
|
880
|
+
tangerine.resolve POST without caching using Google x 180 ops/sec ±23.75% (71 runs sampled)
|
|
881
|
+
tangerine.resolve GET with caching using Google x 1,127,220 ops/sec ±0.26% (91 runs sampled)
|
|
882
|
+
tangerine.resolve GET without caching using Google x 194 ops/sec ±16.84% (63 runs sampled)
|
|
883
|
+
resolver.resolve with caching using Cloudflare x 8,475,317 ops/sec ±0.93% (83 runs sampled)
|
|
884
|
+
resolver.resolve without caching using Cloudflare x 345 ops/sec ±1.00% (78 runs sampled)
|
|
885
|
+
Fastest without caching is: resolver.resolve without caching using Cloudflare
|
|
884
886
|
```
|
|
885
887
|
|
|
886
888
|
**reverse:**
|
|
887
889
|
|
|
888
890
|
```text
|
|
889
891
|
Started: reverse
|
|
890
|
-
tangerine.reverse GET with caching x
|
|
891
|
-
tangerine.reverse GET without caching x
|
|
892
|
-
resolver.reverse with caching x
|
|
893
|
-
resolver.reverse without caching x
|
|
894
|
-
dns.promises.reverse with caching x 8,
|
|
895
|
-
dns.promises.reverse without caching x 0.
|
|
892
|
+
tangerine.reverse GET with caching x 331,840 ops/sec ±0.57% (89 runs sampled)
|
|
893
|
+
tangerine.reverse GET without caching x 241 ops/sec ±1.30% (80 runs sampled)
|
|
894
|
+
resolver.reverse with caching x 8,769,670 ops/sec ±0.60% (87 runs sampled)
|
|
895
|
+
resolver.reverse without caching x 24.95 ops/sec ±193.07% (22 runs sampled)
|
|
896
|
+
dns.promises.reverse with caching x 8,895,968 ops/sec ±0.71% (88 runs sampled)
|
|
897
|
+
dns.promises.reverse without caching x 0.05 ops/sec ±112.55% (5 runs sampled)
|
|
898
|
+
Fastest without caching is: tangerine.reverse GET without caching
|
|
899
|
+
```
|
|
900
|
+
|
|
901
|
+
##### Node.js v24.14.0
|
|
902
|
+
|
|
903
|
+
**lookup:**
|
|
904
|
+
|
|
905
|
+
```text
|
|
906
|
+
Started: lookup
|
|
907
|
+
tangerine.lookup POST with caching using Cloudflare x 1,403 ops/sec ±195.16% (90 runs sampled)
|
|
908
|
+
tangerine.lookup POST without caching using Cloudflare x 70.67 ops/sec ±3.34% (84 runs sampled)
|
|
909
|
+
tangerine.lookup GET with caching using Cloudflare x 317,797 ops/sec ±0.25% (91 runs sampled)
|
|
910
|
+
tangerine.lookup GET without caching using Cloudflare x 63.36 ops/sec ±6.51% (78 runs sampled)
|
|
911
|
+
dns.promises.lookup with caching using Cloudflare x 9,932,885 ops/sec ±1.21% (87 runs sampled)
|
|
912
|
+
dns.promises.lookup without caching using Cloudflare x 2,310 ops/sec ±0.39% (89 runs sampled)
|
|
913
|
+
Fastest without caching is: dns.promises.lookup without caching using Cloudflare
|
|
914
|
+
```
|
|
915
|
+
|
|
916
|
+
**resolve:**
|
|
917
|
+
|
|
918
|
+
```text
|
|
919
|
+
Started: resolve
|
|
920
|
+
tangerine.resolve POST with caching using Cloudflare x 1,269 ops/sec ±195.78% (89 runs sampled)
|
|
921
|
+
tangerine.resolve POST without caching using Cloudflare x 85.54 ops/sec ±0.68% (81 runs sampled)
|
|
922
|
+
tangerine.resolve GET with caching using Cloudflare x 1,117,794 ops/sec ±0.40% (90 runs sampled)
|
|
923
|
+
tangerine.resolve GET without caching using Cloudflare x 69.12 ops/sec ±5.91% (84 runs sampled)
|
|
924
|
+
tangerine.resolve POST with caching using Google x 1,675 ops/sec ±195.71% (90 runs sampled)
|
|
925
|
+
tangerine.resolve POST without caching using Google x 57.66 ops/sec ±13.41% (79 runs sampled)
|
|
926
|
+
tangerine.resolve GET with caching using Google x 1,117,350 ops/sec ±0.62% (90 runs sampled)
|
|
927
|
+
tangerine.resolve GET without caching using Google x 56.23 ops/sec ±5.75% (72 runs sampled)
|
|
928
|
+
resolver.resolve with caching using Cloudflare x 8,740,674 ops/sec ±0.82% (83 runs sampled)
|
|
929
|
+
resolver.resolve without caching using Cloudflare x 71.31 ops/sec ±1.31% (72 runs sampled)
|
|
930
|
+
Fastest without caching is: tangerine.resolve POST without caching using Cloudflare
|
|
931
|
+
```
|
|
932
|
+
|
|
933
|
+
**reverse:**
|
|
934
|
+
|
|
935
|
+
```text
|
|
936
|
+
Started: reverse
|
|
937
|
+
tangerine.reverse GET with caching x 1,286 ops/sec ±195.26% (90 runs sampled)
|
|
938
|
+
tangerine.reverse GET without caching x 85.95 ops/sec ±0.80% (81 runs sampled)
|
|
939
|
+
resolver.reverse with caching x 8,753,410 ops/sec ±0.98% (85 runs sampled)
|
|
940
|
+
resolver.reverse without caching x 72.25 ops/sec ±1.42% (74 runs sampled)
|
|
941
|
+
dns.promises.reverse with caching x 8,707,156 ops/sec ±0.92% (84 runs sampled)
|
|
942
|
+
dns.promises.reverse without caching x 71.90 ops/sec ±1.46% (70 runs sampled)
|
|
896
943
|
Fastest without caching is: tangerine.reverse GET without caching
|
|
897
944
|
```
|
|
898
945
|
|
|
@@ -1211,6 +1258,51 @@ dns.promises.reverse without caching x 67.14 ops/sec ±0.80% (79 runs sampled)
|
|
|
1211
1258
|
Fastest without caching is: dns.promises.reverse without caching, resolver.reverse without caching
|
|
1212
1259
|
```
|
|
1213
1260
|
|
|
1261
|
+
##### Node.js v25.8.0
|
|
1262
|
+
|
|
1263
|
+
**lookup:**
|
|
1264
|
+
|
|
1265
|
+
```text
|
|
1266
|
+
Started: lookup
|
|
1267
|
+
tangerine.lookup POST with caching using Cloudflare x 348,234 ops/sec ±1.43% (89 runs sampled)
|
|
1268
|
+
tangerine.lookup POST without caching using Cloudflare x 245 ops/sec ±1.75% (83 runs sampled)
|
|
1269
|
+
tangerine.lookup GET with caching using Cloudflare x 340,115 ops/sec ±0.72% (89 runs sampled)
|
|
1270
|
+
tangerine.lookup GET without caching using Cloudflare x 223 ops/sec ±2.25% (81 runs sampled)
|
|
1271
|
+
dns.promises.lookup with caching using Cloudflare x 1,759 ops/sec ±195.97% (88 runs sampled)
|
|
1272
|
+
dns.promises.lookup without caching using Cloudflare x 2,223 ops/sec ±0.55% (87 runs sampled)
|
|
1273
|
+
Fastest without caching is: dns.promises.lookup without caching using Cloudflare
|
|
1274
|
+
```
|
|
1275
|
+
|
|
1276
|
+
**resolve:**
|
|
1277
|
+
|
|
1278
|
+
```text
|
|
1279
|
+
Started: resolve
|
|
1280
|
+
tangerine.resolve POST with caching using Cloudflare x 1,224,642 ops/sec ±0.58% (87 runs sampled)
|
|
1281
|
+
tangerine.resolve POST without caching using Cloudflare x 248 ops/sec ±1.54% (83 runs sampled)
|
|
1282
|
+
tangerine.resolve GET with caching using Cloudflare x 1,168,649 ops/sec ±0.55% (85 runs sampled)
|
|
1283
|
+
tangerine.resolve GET without caching using Cloudflare x 264 ops/sec ±1.04% (82 runs sampled)
|
|
1284
|
+
tangerine.resolve POST with caching using Google x 1,411 ops/sec ±195.76% (87 runs sampled)
|
|
1285
|
+
tangerine.resolve POST without caching using Google x 178 ops/sec ±24.83% (67 runs sampled)
|
|
1286
|
+
tangerine.resolve GET with caching using Google x 1,188,395 ops/sec ±0.40% (88 runs sampled)
|
|
1287
|
+
tangerine.resolve GET without caching using Google x 237 ops/sec ±14.93% (74 runs sampled)
|
|
1288
|
+
resolver.resolve with caching using Cloudflare x 8.39 ops/sec ±196.00% (84 runs sampled)
|
|
1289
|
+
resolver.resolve without caching using Cloudflare x 109 ops/sec ±113.88% (68 runs sampled)
|
|
1290
|
+
Fastest without caching is: tangerine.resolve GET without caching using Cloudflare, tangerine.resolve POST without caching using Google
|
|
1291
|
+
```
|
|
1292
|
+
|
|
1293
|
+
**reverse:**
|
|
1294
|
+
|
|
1295
|
+
```text
|
|
1296
|
+
Started: reverse
|
|
1297
|
+
tangerine.reverse GET with caching x 346,448 ops/sec ±4.35% (86 runs sampled)
|
|
1298
|
+
tangerine.reverse GET without caching x 259 ops/sec ±1.42% (83 runs sampled)
|
|
1299
|
+
resolver.reverse with caching x 9,199,217 ops/sec ±0.52% (88 runs sampled)
|
|
1300
|
+
resolver.reverse without caching x 13.67 ops/sec ±188.06% (45 runs sampled)
|
|
1301
|
+
dns.promises.reverse with caching x 9,227,637 ops/sec ±0.33% (89 runs sampled)
|
|
1302
|
+
dns.promises.reverse without caching x 0.07 ops/sec ±133.35% (5 runs sampled)
|
|
1303
|
+
Fastest without caching is: tangerine.reverse GET without caching
|
|
1304
|
+
```
|
|
1305
|
+
|
|
1214
1306
|
</details>
|
|
1215
1307
|
|
|
1216
1308
|
<!-- BENCHMARK_RESULTS_END -->
|
package/index.js
CHANGED
|
@@ -2028,6 +2028,20 @@ class Tangerine extends dns.promises.Resolver {
|
|
|
2028
2028
|
if (result.answers.length === 0 && !options.noThrowOnNODATA)
|
|
2029
2029
|
throw this.constructor.createError(name, rrtype, dns.NODATA);
|
|
2030
2030
|
|
|
2031
|
+
//
|
|
2032
|
+
// RFC 7672 Section 2.2.2: Expose DNSSEC validation status (AD flag)
|
|
2033
|
+
// When options.dnssecSecure is true, return an object with the answers
|
|
2034
|
+
// and a boolean indicating whether the response was DNSSEC-validated.
|
|
2035
|
+
// This allows callers (e.g. mx-connect DANE) to check if the MX host's
|
|
2036
|
+
// zone is signed before attempting TLSA lookups.
|
|
2037
|
+
//
|
|
2038
|
+
if (options?.dnssecSecure) {
|
|
2039
|
+
return {
|
|
2040
|
+
secure: Boolean(result.flag_ad),
|
|
2041
|
+
answers: result.answers
|
|
2042
|
+
};
|
|
2043
|
+
}
|
|
2044
|
+
|
|
2031
2045
|
// filter the answers for the same type
|
|
2032
2046
|
result.answers = result.answers.filter((answer) => answer.type === rrtype);
|
|
2033
2047
|
|
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": "2.1.
|
|
4
|
+
"version": "2.1.1",
|
|
5
5
|
"author": "Forward Email (https://forwardemail.net)",
|
|
6
6
|
"bugs": {
|
|
7
7
|
"url": "https://github.com/forwardemail/nodejs-dns-over-https-tangerine/issues"
|