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.
Files changed (3) hide show
  1. package/README.md +117 -25
  2. package/index.js +14 -0
  3. 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-02-26
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 | Feb 26, 2026 |
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 328,178 ops/sec ±1.46% (90 runs sampled)
861
- tangerine.lookup POST without caching using Cloudflare x 263 ops/sec ±1.89% (78 runs sampled)
862
- tangerine.lookup GET with caching using Cloudflare x 315,952 ops/sec ±0.27% (90 runs sampled)
863
- tangerine.lookup GET without caching using Cloudflare x 227 ops/sec ±3.20% (78 runs sampled)
864
- dns.promises.lookup with caching using Cloudflare x 1,047 ops/sec ±195.98% (80 runs sampled)
865
- dns.promises.lookup without caching using Cloudflare x 2,273 ops/sec ±0.36% (86 runs sampled)
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,146,234 ops/sec ±0.38% (88 runs sampled)
874
- tangerine.resolve POST without caching using Cloudflare x 228 ops/sec ±1.86% (83 runs sampled)
875
- tangerine.resolve GET with caching using Cloudflare x 1,121,526 ops/sec ±0.51% (87 runs sampled)
876
- tangerine.resolve GET without caching using Cloudflare x 293 ops/sec ±1.77% (77 runs sampled)
877
- tangerine.resolve POST with caching using Google x 1,116,293 ops/sec ±0.94% (87 runs sampled)
878
- tangerine.resolve POST without caching using Google x 262 ops/sec ±4.45% (83 runs sampled)
879
- tangerine.resolve GET with caching using Google x 1,127,465 ops/sec ±0.31% (90 runs sampled)
880
- tangerine.resolve GET without caching using Google x 265 ops/sec ±1.09% (83 runs sampled)
881
- resolver.resolve with caching using Cloudflare x 8,518,907 ops/sec ±1.01% (86 runs sampled)
882
- resolver.resolve without caching using Cloudflare x 82.99 ops/sec ±142.66% (36 runs sampled)
883
- Fastest without caching is: tangerine.resolve GET without caching using Cloudflare
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 337,325 ops/sec ±0.52% (89 runs sampled)
891
- tangerine.reverse GET without caching x 233 ops/sec ±2.59% (79 runs sampled)
892
- resolver.reverse with caching x 17.19 ops/sec ±196.00% (86 runs sampled)
893
- resolver.reverse without caching x 6.84 ops/sec ±154.89% (71 runs sampled)
894
- dns.promises.reverse with caching x 8,315,699 ops/sec ±1.33% (78 runs sampled)
895
- dns.promises.reverse without caching x 0.77 ops/sec ±164.54% (37 runs sampled)
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.0",
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"