nlcurl 0.7.0 → 0.8.0
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 +143 -140
- package/dist/cache/groups.d.ts +75 -0
- package/dist/cache/groups.d.ts.map +1 -0
- package/dist/cache/groups.js +118 -0
- package/dist/cache/groups.js.map +1 -0
- package/dist/cache/no-vary-search.d.ts +33 -0
- package/dist/cache/no-vary-search.d.ts.map +1 -0
- package/dist/cache/no-vary-search.js +148 -0
- package/dist/cache/no-vary-search.js.map +1 -0
- package/dist/cache/range.d.ts +120 -0
- package/dist/cache/range.d.ts.map +1 -0
- package/dist/cache/range.js +193 -0
- package/dist/cache/range.js.map +1 -0
- package/dist/cache/store.d.ts +58 -36
- package/dist/cache/store.d.ts.map +1 -1
- package/dist/cache/store.js +58 -46
- package/dist/cache/store.js.map +1 -1
- package/dist/cache/types.d.ts +7 -39
- package/dist/cache/types.d.ts.map +1 -1
- package/dist/cli/args.d.ts +4 -37
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +3 -4
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/index.d.ts +0 -5
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +1 -6
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/output.d.ts +14 -20
- package/dist/cli/output.d.ts.map +1 -1
- package/dist/cli/output.js +14 -20
- package/dist/cli/output.js.map +1 -1
- package/dist/cookies/jar.d.ts +30 -39
- package/dist/cookies/jar.d.ts.map +1 -1
- package/dist/cookies/jar.js +27 -37
- package/dist/cookies/jar.js.map +1 -1
- package/dist/cookies/parser.d.ts +13 -17
- package/dist/cookies/parser.d.ts.map +1 -1
- package/dist/cookies/parser.js +17 -14
- package/dist/cookies/parser.js.map +1 -1
- package/dist/cookies/psl-data.d.ts +1 -1
- package/dist/cookies/psl-data.js +1 -1
- package/dist/cookies/public-suffix.d.ts +5 -27
- package/dist/cookies/public-suffix.d.ts.map +1 -1
- package/dist/cookies/public-suffix.js +5 -37
- package/dist/cookies/public-suffix.js.map +1 -1
- package/dist/core/auth.d.ts +30 -0
- package/dist/core/auth.d.ts.map +1 -0
- package/dist/core/auth.js +34 -0
- package/dist/core/auth.js.map +1 -0
- package/dist/core/client.d.ts +28 -40
- package/dist/core/client.d.ts.map +1 -1
- package/dist/core/client.js +31 -41
- package/dist/core/client.js.map +1 -1
- package/dist/core/errors.d.ts +64 -88
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +64 -88
- package/dist/core/errors.js.map +1 -1
- package/dist/core/request.d.ts +23 -111
- package/dist/core/request.d.ts.map +1 -1
- package/dist/core/response.d.ts +49 -66
- package/dist/core/response.d.ts.map +1 -1
- package/dist/core/response.js +45 -59
- package/dist/core/response.js.map +1 -1
- package/dist/core/session.d.ts +66 -78
- package/dist/core/session.d.ts.map +1 -1
- package/dist/core/session.js +105 -76
- package/dist/core/session.js.map +1 -1
- package/dist/core/validation.d.ts +44 -43
- package/dist/core/validation.d.ts.map +1 -1
- package/dist/core/validation.js +44 -56
- package/dist/core/validation.js.map +1 -1
- package/dist/dns/cache.d.ts +59 -0
- package/dist/dns/cache.d.ts.map +1 -0
- package/dist/dns/cache.js +99 -0
- package/dist/dns/cache.js.map +1 -0
- package/dist/dns/codec.d.ts +20 -18
- package/dist/dns/codec.d.ts.map +1 -1
- package/dist/dns/codec.js +20 -36
- package/dist/dns/codec.js.map +1 -1
- package/dist/dns/doh-resolver.d.ts +17 -31
- package/dist/dns/doh-resolver.d.ts.map +1 -1
- package/dist/dns/doh-resolver.js +46 -47
- package/dist/dns/doh-resolver.js.map +1 -1
- package/dist/dns/dot-resolver.d.ts +89 -0
- package/dist/dns/dot-resolver.d.ts.map +1 -0
- package/dist/dns/dot-resolver.js +158 -0
- package/dist/dns/dot-resolver.js.map +1 -0
- package/dist/dns/https-rr.d.ts +19 -30
- package/dist/dns/https-rr.d.ts.map +1 -1
- package/dist/dns/https-rr.js +22 -40
- package/dist/dns/https-rr.js.map +1 -1
- package/dist/dns/types.d.ts +31 -59
- package/dist/dns/types.d.ts.map +1 -1
- package/dist/dns/types.js +3 -14
- package/dist/dns/types.js.map +1 -1
- package/dist/fingerprints/akamai.d.ts +3 -11
- package/dist/fingerprints/akamai.d.ts.map +1 -1
- package/dist/fingerprints/akamai.js +3 -11
- package/dist/fingerprints/akamai.js.map +1 -1
- package/dist/fingerprints/database.d.ts +6 -14
- package/dist/fingerprints/database.d.ts.map +1 -1
- package/dist/fingerprints/database.js +6 -14
- package/dist/fingerprints/database.js.map +1 -1
- package/dist/fingerprints/extensions.d.ts +56 -71
- package/dist/fingerprints/extensions.d.ts.map +1 -1
- package/dist/fingerprints/extensions.js +58 -71
- package/dist/fingerprints/extensions.js.map +1 -1
- package/dist/fingerprints/ja3.d.ts +12 -30
- package/dist/fingerprints/ja3.d.ts.map +1 -1
- package/dist/fingerprints/ja3.js +12 -30
- package/dist/fingerprints/ja3.js.map +1 -1
- package/dist/fingerprints/ja4.d.ts +18 -0
- package/dist/fingerprints/ja4.d.ts.map +1 -0
- package/dist/fingerprints/ja4.js +83 -0
- package/dist/fingerprints/ja4.js.map +1 -0
- package/dist/fingerprints/profiles/chrome.d.ts +18 -21
- package/dist/fingerprints/profiles/chrome.d.ts.map +1 -1
- package/dist/fingerprints/profiles/chrome.js +35 -31
- package/dist/fingerprints/profiles/chrome.js.map +1 -1
- package/dist/fingerprints/profiles/edge.d.ts +7 -10
- package/dist/fingerprints/profiles/edge.d.ts.map +1 -1
- package/dist/fingerprints/profiles/edge.js +7 -10
- package/dist/fingerprints/profiles/edge.js.map +1 -1
- package/dist/fingerprints/profiles/firefox.d.ts +8 -11
- package/dist/fingerprints/profiles/firefox.d.ts.map +1 -1
- package/dist/fingerprints/profiles/firefox.js +8 -11
- package/dist/fingerprints/profiles/firefox.js.map +1 -1
- package/dist/fingerprints/profiles/safari.d.ts +11 -14
- package/dist/fingerprints/profiles/safari.d.ts.map +1 -1
- package/dist/fingerprints/profiles/safari.js +11 -14
- package/dist/fingerprints/profiles/safari.js.map +1 -1
- package/dist/fingerprints/profiles/tor.d.ts +5 -8
- package/dist/fingerprints/profiles/tor.d.ts.map +1 -1
- package/dist/fingerprints/profiles/tor.js +5 -8
- package/dist/fingerprints/profiles/tor.js.map +1 -1
- package/dist/fingerprints/types.d.ts +42 -73
- package/dist/fingerprints/types.d.ts.map +1 -1
- package/dist/hsts/store.d.ts +19 -21
- package/dist/hsts/store.d.ts.map +1 -1
- package/dist/hsts/store.js +20 -28
- package/dist/hsts/store.js.map +1 -1
- package/dist/hsts/types.d.ts +10 -14
- package/dist/hsts/types.d.ts.map +1 -1
- package/dist/http/alt-svc.d.ts +31 -49
- package/dist/http/alt-svc.d.ts.map +1 -1
- package/dist/http/alt-svc.js +21 -55
- package/dist/http/alt-svc.js.map +1 -1
- package/dist/http/early-hints.d.ts +23 -0
- package/dist/http/early-hints.d.ts.map +1 -0
- package/dist/http/early-hints.js +33 -0
- package/dist/http/early-hints.js.map +1 -0
- package/dist/http/form-data.d.ts +17 -35
- package/dist/http/form-data.d.ts.map +1 -1
- package/dist/http/form-data.js +12 -34
- package/dist/http/form-data.js.map +1 -1
- package/dist/http/h1/client.d.ts +14 -26
- package/dist/http/h1/client.d.ts.map +1 -1
- package/dist/http/h1/client.js +14 -23
- package/dist/http/h1/client.js.map +1 -1
- package/dist/http/h1/encoder.d.ts +10 -17
- package/dist/http/h1/encoder.d.ts.map +1 -1
- package/dist/http/h1/encoder.js +10 -17
- package/dist/http/h1/encoder.js.map +1 -1
- package/dist/http/h1/parser.d.ts +22 -59
- package/dist/http/h1/parser.d.ts.map +1 -1
- package/dist/http/h1/parser.js +15 -47
- package/dist/http/h1/parser.js.map +1 -1
- package/dist/http/h2/client.d.ts +18 -59
- package/dist/http/h2/client.d.ts.map +1 -1
- package/dist/http/h2/client.js +29 -64
- package/dist/http/h2/client.js.map +1 -1
- package/dist/http/h2/frames.d.ts +53 -84
- package/dist/http/h2/frames.d.ts.map +1 -1
- package/dist/http/h2/frames.js +48 -76
- package/dist/http/h2/frames.js.map +1 -1
- package/dist/http/h2/hpack.d.ts +16 -35
- package/dist/http/h2/hpack.d.ts.map +1 -1
- package/dist/http/h2/hpack.js +16 -35
- package/dist/http/h2/hpack.js.map +1 -1
- package/dist/http/h3/detection.d.ts +5 -7
- package/dist/http/h3/detection.d.ts.map +1 -1
- package/dist/http/h3/detection.js +5 -23
- package/dist/http/h3/detection.js.map +1 -1
- package/dist/http/negotiator.d.ts +25 -38
- package/dist/http/negotiator.d.ts.map +1 -1
- package/dist/http/negotiator.js +16 -28
- package/dist/http/negotiator.js.map +1 -1
- package/dist/http/pool.d.ts +32 -62
- package/dist/http/pool.d.ts.map +1 -1
- package/dist/http/pool.js +22 -41
- package/dist/http/pool.js.map +1 -1
- package/dist/http/resumable-upload.d.ts +76 -0
- package/dist/http/resumable-upload.d.ts.map +1 -0
- package/dist/http/resumable-upload.js +104 -0
- package/dist/http/resumable-upload.js.map +1 -0
- package/dist/http/trailers.d.ts +29 -0
- package/dist/http/trailers.d.ts.map +1 -0
- package/dist/http/trailers.js +57 -0
- package/dist/http/trailers.js.map +1 -0
- package/dist/index.d.ts +21 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -2
- package/dist/index.js.map +1 -1
- package/dist/middleware/interceptor.d.ts +13 -32
- package/dist/middleware/interceptor.d.ts.map +1 -1
- package/dist/middleware/interceptor.js +11 -16
- package/dist/middleware/interceptor.js.map +1 -1
- package/dist/middleware/rate-limiter.d.ts +8 -17
- package/dist/middleware/rate-limiter.d.ts.map +1 -1
- package/dist/middleware/rate-limiter.js +11 -12
- package/dist/middleware/rate-limiter.js.map +1 -1
- package/dist/middleware/retry-after.d.ts +15 -0
- package/dist/middleware/retry-after.d.ts.map +1 -0
- package/dist/middleware/retry-after.js +36 -0
- package/dist/middleware/retry-after.js.map +1 -0
- package/dist/middleware/retry.d.ts +9 -18
- package/dist/middleware/retry.d.ts.map +1 -1
- package/dist/middleware/retry.js +12 -9
- package/dist/middleware/retry.js.map +1 -1
- package/dist/proxy/auth.d.ts +73 -0
- package/dist/proxy/auth.d.ts.map +1 -0
- package/dist/proxy/auth.js +128 -0
- package/dist/proxy/auth.js.map +1 -0
- package/dist/proxy/env-proxy.d.ts +5 -15
- package/dist/proxy/env-proxy.d.ts.map +1 -1
- package/dist/proxy/env-proxy.js +5 -23
- package/dist/proxy/env-proxy.js.map +1 -1
- package/dist/proxy/http-proxy.d.ts +12 -19
- package/dist/proxy/http-proxy.d.ts.map +1 -1
- package/dist/proxy/http-proxy.js +5 -8
- package/dist/proxy/http-proxy.js.map +1 -1
- package/dist/proxy/socks.d.ts +13 -20
- package/dist/proxy/socks.d.ts.map +1 -1
- package/dist/proxy/socks.js +5 -8
- package/dist/proxy/socks.js.map +1 -1
- package/dist/sse/parser.d.ts +14 -37
- package/dist/sse/parser.d.ts.map +1 -1
- package/dist/sse/parser.js +14 -28
- package/dist/sse/parser.js.map +1 -1
- package/dist/tls/constants.d.ts +15 -74
- package/dist/tls/constants.d.ts.map +1 -1
- package/dist/tls/constants.js +15 -74
- package/dist/tls/constants.js.map +1 -1
- package/dist/tls/ct.d.ts +78 -0
- package/dist/tls/ct.d.ts.map +1 -0
- package/dist/tls/ct.js +175 -0
- package/dist/tls/ct.js.map +1 -0
- package/dist/tls/early-data.d.ts +45 -0
- package/dist/tls/early-data.d.ts.map +1 -0
- package/dist/tls/early-data.js +46 -0
- package/dist/tls/early-data.js.map +1 -0
- package/dist/tls/ech.d.ts +68 -85
- package/dist/tls/ech.d.ts.map +1 -1
- package/dist/tls/ech.js +54 -102
- package/dist/tls/ech.js.map +1 -1
- package/dist/tls/keylog.d.ts +34 -0
- package/dist/tls/keylog.d.ts.map +1 -0
- package/dist/tls/keylog.js +64 -0
- package/dist/tls/keylog.js.map +1 -0
- package/dist/tls/node-engine.d.ts +10 -17
- package/dist/tls/node-engine.d.ts.map +1 -1
- package/dist/tls/node-engine.js +20 -18
- package/dist/tls/node-engine.js.map +1 -1
- package/dist/tls/ocsp.d.ts +55 -0
- package/dist/tls/ocsp.d.ts.map +1 -0
- package/dist/tls/ocsp.js +131 -0
- package/dist/tls/ocsp.js.map +1 -0
- package/dist/tls/pin-verification.d.ts +5 -4
- package/dist/tls/pin-verification.d.ts.map +1 -1
- package/dist/tls/pin-verification.js +5 -11
- package/dist/tls/pin-verification.js.map +1 -1
- package/dist/tls/session-cache.d.ts +27 -39
- package/dist/tls/session-cache.d.ts.map +1 -1
- package/dist/tls/session-cache.js +20 -24
- package/dist/tls/session-cache.js.map +1 -1
- package/dist/tls/stealth/client-hello.d.ts +25 -44
- package/dist/tls/stealth/client-hello.d.ts.map +1 -1
- package/dist/tls/stealth/client-hello.js +17 -28
- package/dist/tls/stealth/client-hello.js.map +1 -1
- package/dist/tls/stealth/engine.d.ts +5 -15
- package/dist/tls/stealth/engine.d.ts.map +1 -1
- package/dist/tls/stealth/engine.js +11 -17
- package/dist/tls/stealth/engine.js.map +1 -1
- package/dist/tls/stealth/handshake.d.ts +21 -31
- package/dist/tls/stealth/handshake.d.ts.map +1 -1
- package/dist/tls/stealth/handshake.js +15 -43
- package/dist/tls/stealth/handshake.js.map +1 -1
- package/dist/tls/stealth/key-schedule.d.ts +59 -86
- package/dist/tls/stealth/key-schedule.d.ts.map +1 -1
- package/dist/tls/stealth/key-schedule.js +46 -58
- package/dist/tls/stealth/key-schedule.js.map +1 -1
- package/dist/tls/stealth/record-layer.d.ts +52 -75
- package/dist/tls/stealth/record-layer.d.ts.map +1 -1
- package/dist/tls/stealth/record-layer.js +47 -63
- package/dist/tls/stealth/record-layer.js.map +1 -1
- package/dist/tls/stealth/tls12-handshake.d.ts +16 -0
- package/dist/tls/stealth/tls12-handshake.d.ts.map +1 -1
- package/dist/tls/stealth/tls12-handshake.js +8 -0
- package/dist/tls/stealth/tls12-handshake.js.map +1 -1
- package/dist/tls/types.d.ts +42 -60
- package/dist/tls/types.d.ts.map +1 -1
- package/dist/utils/buffer-reader.d.ts +26 -81
- package/dist/utils/buffer-reader.d.ts.map +1 -1
- package/dist/utils/buffer-reader.js +26 -81
- package/dist/utils/buffer-reader.js.map +1 -1
- package/dist/utils/buffer-writer.d.ts +30 -66
- package/dist/utils/buffer-writer.d.ts.map +1 -1
- package/dist/utils/buffer-writer.js +30 -66
- package/dist/utils/buffer-writer.js.map +1 -1
- package/dist/utils/compression.d.ts +18 -0
- package/dist/utils/compression.d.ts.map +1 -0
- package/dist/utils/compression.js +34 -0
- package/dist/utils/compression.js.map +1 -0
- package/dist/utils/dictionary-transport.d.ts +97 -0
- package/dist/utils/dictionary-transport.d.ts.map +1 -0
- package/dist/utils/dictionary-transport.js +171 -0
- package/dist/utils/dictionary-transport.js.map +1 -0
- package/dist/utils/encoding.d.ts +12 -30
- package/dist/utils/encoding.d.ts.map +1 -1
- package/dist/utils/encoding.js +15 -46
- package/dist/utils/encoding.js.map +1 -1
- package/dist/utils/happy-eyeballs.d.ts +18 -8
- package/dist/utils/happy-eyeballs.d.ts.map +1 -1
- package/dist/utils/happy-eyeballs.js +19 -27
- package/dist/utils/happy-eyeballs.js.map +1 -1
- package/dist/utils/logger.d.ts +54 -81
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +92 -64
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/tcp-fast-open.d.ts +30 -0
- package/dist/utils/tcp-fast-open.d.ts.map +1 -0
- package/dist/utils/tcp-fast-open.js +36 -0
- package/dist/utils/tcp-fast-open.js.map +1 -0
- package/dist/utils/url.d.ts +18 -25
- package/dist/utils/url.d.ts.map +1 -1
- package/dist/utils/url.js +18 -25
- package/dist/utils/url.js.map +1 -1
- package/dist/ws/client.d.ts +33 -53
- package/dist/ws/client.d.ts.map +1 -1
- package/dist/ws/client.js +29 -30
- package/dist/ws/client.js.map +1 -1
- package/dist/ws/frame.d.ts +24 -41
- package/dist/ws/frame.d.ts.map +1 -1
- package/dist/ws/frame.js +18 -33
- package/dist/ws/frame.js.map +1 -1
- package/dist/ws/permessage-deflate.d.ts +23 -28
- package/dist/ws/permessage-deflate.d.ts.map +1 -1
- package/dist/ws/permessage-deflate.js +18 -26
- package/dist/ws/permessage-deflate.js.map +1 -1
- package/package.json +62 -62
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
const DEFAULT_MAX_ENTRIES = 500;
|
|
2
|
+
const DEFAULT_MIN_TTL = 30;
|
|
3
|
+
const DEFAULT_MAX_TTL = 86400;
|
|
4
|
+
/** LRU cache for DNS records with configurable TTL bounds. */
|
|
5
|
+
export class DNSCache {
|
|
6
|
+
entries = new Map();
|
|
7
|
+
maxEntries;
|
|
8
|
+
minTTL;
|
|
9
|
+
maxTTL;
|
|
10
|
+
accessCounter = 0;
|
|
11
|
+
/**
|
|
12
|
+
* Create a new DNS cache.
|
|
13
|
+
*
|
|
14
|
+
* @param {DNSCacheConfig} [config] - Cache configuration options.
|
|
15
|
+
*/
|
|
16
|
+
constructor(config) {
|
|
17
|
+
this.maxEntries = config?.maxEntries ?? DEFAULT_MAX_ENTRIES;
|
|
18
|
+
this.minTTL = config?.minTTL ?? DEFAULT_MIN_TTL;
|
|
19
|
+
this.maxTTL = config?.maxTTL ?? DEFAULT_MAX_TTL;
|
|
20
|
+
}
|
|
21
|
+
cacheKey(name, type) {
|
|
22
|
+
return `${type}:${name.toLowerCase()}`;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Retrieve cached records for a name and type.
|
|
26
|
+
*
|
|
27
|
+
* @param {string} name - Domain name to look up.
|
|
28
|
+
* @param {string} type - Record type string.
|
|
29
|
+
* @returns {DNSRecord[]|undefined} Cached records, or `undefined` if absent or expired.
|
|
30
|
+
*/
|
|
31
|
+
get(name, type) {
|
|
32
|
+
const key = this.cacheKey(name, type);
|
|
33
|
+
const entry = this.entries.get(key);
|
|
34
|
+
if (!entry)
|
|
35
|
+
return undefined;
|
|
36
|
+
const age = (Date.now() - entry.storedAt) / 1000;
|
|
37
|
+
if (age >= entry.ttl) {
|
|
38
|
+
this.entries.delete(key);
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
entry.lastAccessedAt = ++this.accessCounter;
|
|
42
|
+
return entry.records;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Store DNS records in the cache.
|
|
46
|
+
*
|
|
47
|
+
* @param {string} name - Domain name.
|
|
48
|
+
* @param {string} type - Record type string.
|
|
49
|
+
* @param {DNSRecord[]} records - DNS records to cache.
|
|
50
|
+
*/
|
|
51
|
+
set(name, type, records) {
|
|
52
|
+
if (records.length === 0)
|
|
53
|
+
return;
|
|
54
|
+
const ttl = this.computeTTL(records);
|
|
55
|
+
const key = this.cacheKey(name, type);
|
|
56
|
+
if (this.entries.size >= this.maxEntries && !this.entries.has(key)) {
|
|
57
|
+
this.evictLRU();
|
|
58
|
+
}
|
|
59
|
+
this.entries.set(key, {
|
|
60
|
+
records,
|
|
61
|
+
storedAt: Date.now(),
|
|
62
|
+
ttl,
|
|
63
|
+
lastAccessedAt: ++this.accessCounter,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
computeTTL(records) {
|
|
67
|
+
let minRecordTTL = Infinity;
|
|
68
|
+
for (const record of records) {
|
|
69
|
+
if (record.ttl < minRecordTTL) {
|
|
70
|
+
minRecordTTL = record.ttl;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (minRecordTTL === Infinity)
|
|
74
|
+
minRecordTTL = this.minTTL;
|
|
75
|
+
return Math.max(this.minTTL, Math.min(this.maxTTL, minRecordTTL));
|
|
76
|
+
}
|
|
77
|
+
evictLRU() {
|
|
78
|
+
let oldestKey;
|
|
79
|
+
let oldestAccess = Infinity;
|
|
80
|
+
for (const [key, entry] of this.entries) {
|
|
81
|
+
if (entry.lastAccessedAt < oldestAccess) {
|
|
82
|
+
oldestAccess = entry.lastAccessedAt;
|
|
83
|
+
oldestKey = key;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (oldestKey) {
|
|
87
|
+
this.entries.delete(oldestKey);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/** Remove all entries from the cache. */
|
|
91
|
+
clear() {
|
|
92
|
+
this.entries.clear();
|
|
93
|
+
}
|
|
94
|
+
/** Number of entries currently in the cache. */
|
|
95
|
+
get size() {
|
|
96
|
+
return this.entries.size;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/dns/cache.ts"],"names":[],"mappings":"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"}
|
package/dist/dns/codec.d.ts
CHANGED
|
@@ -1,37 +1,39 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Minimal DNS wire-format encoder/decoder for DNS-over-HTTPS (RFC 8484)
|
|
3
|
-
* and HTTPS/SVCB record parsing (RFC 9460).
|
|
4
|
-
*
|
|
5
|
-
* Supports building A/AAAA/HTTPS queries and parsing response packets
|
|
6
|
-
* including SvcParam extraction. Uses only Node.js built-in `Buffer`.
|
|
7
|
-
*/
|
|
8
1
|
import { type DNSRecord, type SVCBRecord } from "./types.js";
|
|
9
2
|
/**
|
|
10
|
-
*
|
|
3
|
+
* Build a raw DNS query packet.
|
|
11
4
|
*
|
|
12
|
-
* @param name
|
|
13
|
-
* @param
|
|
14
|
-
* @param id
|
|
15
|
-
* @returns
|
|
5
|
+
* @param {string} name - Domain name to query.
|
|
6
|
+
* @param {number} type - Numeric record type.
|
|
7
|
+
* @param {number} [id] - Query identifier (defaults to 0).
|
|
8
|
+
* @returns {Buffer} Wire-format DNS query buffer.
|
|
16
9
|
*/
|
|
17
10
|
export declare function buildDNSQuery(name: string, type: number, id?: number): Buffer;
|
|
18
11
|
/**
|
|
19
|
-
*
|
|
12
|
+
* Parse a wire-format DNS response packet into records.
|
|
20
13
|
*
|
|
21
|
-
* @param packet Raw DNS response
|
|
22
|
-
* @returns Array of parsed DNS records from the answer section.
|
|
14
|
+
* @param {Buffer} packet - Raw DNS response data.
|
|
15
|
+
* @returns {DNSRecord[]} Array of parsed DNS records from the answer section.
|
|
23
16
|
*/
|
|
24
17
|
export declare function parseDNSResponse(packet: Buffer): DNSRecord[];
|
|
25
18
|
/**
|
|
26
|
-
*
|
|
19
|
+
* Parse a 4-byte buffer into a dotted-decimal IPv4 address string.
|
|
20
|
+
*
|
|
21
|
+
* @param {Buffer} data - Raw A record data.
|
|
22
|
+
* @returns {string} IPv4 address string.
|
|
27
23
|
*/
|
|
28
24
|
export declare function parseARecord(data: Buffer): string;
|
|
29
25
|
/**
|
|
30
|
-
*
|
|
26
|
+
* Parse a 16-byte buffer into a colon-hex IPv6 address string.
|
|
27
|
+
*
|
|
28
|
+
* @param {Buffer} data - Raw AAAA record data.
|
|
29
|
+
* @returns {string} IPv6 address string.
|
|
31
30
|
*/
|
|
32
31
|
export declare function parseAAAARecord(data: Buffer): string;
|
|
33
32
|
/**
|
|
34
|
-
*
|
|
33
|
+
* Parse raw SVCB/HTTPS record data into a structured record.
|
|
34
|
+
*
|
|
35
|
+
* @param {Buffer} data - Raw SVCB record data.
|
|
36
|
+
* @returns {SVCBRecord} Parsed SVCB record with service parameters.
|
|
35
37
|
*/
|
|
36
38
|
export declare function parseSVCBRecord(data: Buffer): SVCBRecord;
|
|
37
39
|
//# sourceMappingURL=codec.d.ts.map
|
package/dist/dns/codec.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../../src/dns/codec.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../../src/dns/codec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,SAAS,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAElF;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAE,MAAU,GAAG,MAAM,CAgBhF;AAcD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,CA4C5D;AA8CD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGjD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOpD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAuDxD"}
|
package/dist/dns/codec.js
CHANGED
|
@@ -1,18 +1,11 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Minimal DNS wire-format encoder/decoder for DNS-over-HTTPS (RFC 8484)
|
|
3
|
-
* and HTTPS/SVCB record parsing (RFC 9460).
|
|
4
|
-
*
|
|
5
|
-
* Supports building A/AAAA/HTTPS queries and parsing response packets
|
|
6
|
-
* including SvcParam extraction. Uses only Node.js built-in `Buffer`.
|
|
7
|
-
*/
|
|
8
1
|
import { RCLASS, SvcParamKey } from "./types.js";
|
|
9
2
|
/**
|
|
10
|
-
*
|
|
3
|
+
* Build a raw DNS query packet.
|
|
11
4
|
*
|
|
12
|
-
* @param name
|
|
13
|
-
* @param
|
|
14
|
-
* @param id
|
|
15
|
-
* @returns
|
|
5
|
+
* @param {string} name - Domain name to query.
|
|
6
|
+
* @param {number} type - Numeric record type.
|
|
7
|
+
* @param {number} [id] - Query identifier (defaults to 0).
|
|
8
|
+
* @returns {Buffer} Wire-format DNS query buffer.
|
|
16
9
|
*/
|
|
17
10
|
export function buildDNSQuery(name, type, id = 0) {
|
|
18
11
|
const labels = encodeName(name);
|
|
@@ -28,9 +21,6 @@ export function buildDNSQuery(name, type, id = 0) {
|
|
|
28
21
|
buf.writeUInt16BE(RCLASS.IN, 12 + labels.length + 2);
|
|
29
22
|
return buf;
|
|
30
23
|
}
|
|
31
|
-
/**
|
|
32
|
-
* Encodes a domain name into DNS wire format labels.
|
|
33
|
-
*/
|
|
34
24
|
function encodeName(name) {
|
|
35
25
|
const parts = name.replace(/\.$/, "").split(".");
|
|
36
26
|
const buffers = [];
|
|
@@ -44,10 +34,10 @@ function encodeName(name) {
|
|
|
44
34
|
return Buffer.concat(buffers);
|
|
45
35
|
}
|
|
46
36
|
/**
|
|
47
|
-
*
|
|
37
|
+
* Parse a wire-format DNS response packet into records.
|
|
48
38
|
*
|
|
49
|
-
* @param packet Raw DNS response
|
|
50
|
-
* @returns Array of parsed DNS records from the answer section.
|
|
39
|
+
* @param {Buffer} packet - Raw DNS response data.
|
|
40
|
+
* @returns {DNSRecord[]} Array of parsed DNS records from the answer section.
|
|
51
41
|
*/
|
|
52
42
|
export function parseDNSResponse(packet) {
|
|
53
43
|
if (packet.length < 12)
|
|
@@ -86,9 +76,6 @@ export function parseDNSResponse(packet) {
|
|
|
86
76
|
}
|
|
87
77
|
return records;
|
|
88
78
|
}
|
|
89
|
-
/**
|
|
90
|
-
* Decodes a DNS compressed name from a packet.
|
|
91
|
-
*/
|
|
92
79
|
function decodeName(packet, offset) {
|
|
93
80
|
const labels = [];
|
|
94
81
|
let jumped = false;
|
|
@@ -118,9 +105,6 @@ function decodeName(packet, offset) {
|
|
|
118
105
|
returnOffset = offset + 1;
|
|
119
106
|
return { name: labels.join("."), newOffset: returnOffset };
|
|
120
107
|
}
|
|
121
|
-
/**
|
|
122
|
-
* Skips past a DNS name in a packet (handles compression pointers).
|
|
123
|
-
*/
|
|
124
108
|
function skipName(packet, offset) {
|
|
125
109
|
let depth = 0;
|
|
126
110
|
while (offset < packet.length) {
|
|
@@ -136,7 +120,10 @@ function skipName(packet, offset) {
|
|
|
136
120
|
return offset;
|
|
137
121
|
}
|
|
138
122
|
/**
|
|
139
|
-
*
|
|
123
|
+
* Parse a 4-byte buffer into a dotted-decimal IPv4 address string.
|
|
124
|
+
*
|
|
125
|
+
* @param {Buffer} data - Raw A record data.
|
|
126
|
+
* @returns {string} IPv4 address string.
|
|
140
127
|
*/
|
|
141
128
|
export function parseARecord(data) {
|
|
142
129
|
if (data.length !== 4)
|
|
@@ -144,7 +131,10 @@ export function parseARecord(data) {
|
|
|
144
131
|
return `${data[0]}.${data[1]}.${data[2]}.${data[3]}`;
|
|
145
132
|
}
|
|
146
133
|
/**
|
|
147
|
-
*
|
|
134
|
+
* Parse a 16-byte buffer into a colon-hex IPv6 address string.
|
|
135
|
+
*
|
|
136
|
+
* @param {Buffer} data - Raw AAAA record data.
|
|
137
|
+
* @returns {string} IPv6 address string.
|
|
148
138
|
*/
|
|
149
139
|
export function parseAAAARecord(data) {
|
|
150
140
|
if (data.length !== 16)
|
|
@@ -156,7 +146,10 @@ export function parseAAAARecord(data) {
|
|
|
156
146
|
return groups.join(":");
|
|
157
147
|
}
|
|
158
148
|
/**
|
|
159
|
-
*
|
|
149
|
+
* Parse raw SVCB/HTTPS record data into a structured record.
|
|
150
|
+
*
|
|
151
|
+
* @param {Buffer} data - Raw SVCB record data.
|
|
152
|
+
* @returns {SVCBRecord} Parsed SVCB record with service parameters.
|
|
160
153
|
*/
|
|
161
154
|
export function parseSVCBRecord(data) {
|
|
162
155
|
if (data.length < 3)
|
|
@@ -211,9 +204,6 @@ export function parseSVCBRecord(data) {
|
|
|
211
204
|
}
|
|
212
205
|
return record;
|
|
213
206
|
}
|
|
214
|
-
/**
|
|
215
|
-
* Parses the ALPN SvcParam — length-prefixed protocol identifier list.
|
|
216
|
-
*/
|
|
217
207
|
function parseAlpnParam(data) {
|
|
218
208
|
const protocols = [];
|
|
219
209
|
let offset = 0;
|
|
@@ -227,9 +217,6 @@ function parseAlpnParam(data) {
|
|
|
227
217
|
}
|
|
228
218
|
return protocols;
|
|
229
219
|
}
|
|
230
|
-
/**
|
|
231
|
-
* Parses IPv4 address hints from SvcParam value.
|
|
232
|
-
*/
|
|
233
220
|
function parseIPv4Hints(data) {
|
|
234
221
|
const addresses = [];
|
|
235
222
|
for (let i = 0; i + 4 <= data.length; i += 4) {
|
|
@@ -237,9 +224,6 @@ function parseIPv4Hints(data) {
|
|
|
237
224
|
}
|
|
238
225
|
return addresses;
|
|
239
226
|
}
|
|
240
|
-
/**
|
|
241
|
-
* Parses IPv6 address hints from SvcParam value.
|
|
242
|
-
*/
|
|
243
227
|
function parseIPv6Hints(data) {
|
|
244
228
|
const addresses = [];
|
|
245
229
|
for (let i = 0; i + 16 <= data.length; i += 16) {
|
package/dist/dns/codec.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codec.js","sourceRoot":"","sources":["../../src/dns/codec.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"codec.js","sourceRoot":"","sources":["../../src/dns/codec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,52 +1,38 @@
|
|
|
1
1
|
import type { DoHConfig, DNSRecord } from "./types.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
*
|
|
5
|
-
* Usage:
|
|
6
|
-
* ```typescript
|
|
7
|
-
* const resolver = new DoHResolver({ server: "https://1.1.1.1/dns-query" });
|
|
8
|
-
* const records = await resolver.query("example.com", "A");
|
|
9
|
-
* ```
|
|
10
|
-
*/
|
|
2
|
+
import { DNSCache } from "./cache.js";
|
|
3
|
+
/** DNS-over-HTTPS resolver supporting GET and POST wire-format queries. */
|
|
11
4
|
export declare class DoHResolver {
|
|
12
5
|
private readonly serverUrl;
|
|
13
6
|
private readonly method;
|
|
14
7
|
private readonly timeout;
|
|
15
8
|
private readonly bootstrap;
|
|
9
|
+
private readonly cache;
|
|
16
10
|
private queryId;
|
|
11
|
+
/**
|
|
12
|
+
* Create a new DoH resolver.
|
|
13
|
+
*
|
|
14
|
+
* @param {DoHConfig} config - DoH connection and cache configuration.
|
|
15
|
+
*/
|
|
17
16
|
constructor(config: DoHConfig);
|
|
18
17
|
/**
|
|
19
|
-
*
|
|
18
|
+
* Perform a DNS query over HTTPS.
|
|
20
19
|
*
|
|
21
|
-
* @param name
|
|
22
|
-
* @param
|
|
23
|
-
* @param signal Optional
|
|
24
|
-
* @returns Array of
|
|
20
|
+
* @param {string} name - Domain name to resolve.
|
|
21
|
+
* @param {"A"|"AAAA"|"HTTPS"|"SVCB"} type - Record type to query.
|
|
22
|
+
* @param {AbortSignal} [signal] - Optional abort signal.
|
|
23
|
+
* @returns {Promise<DNSRecord[]>} Array of DNS records from the response.
|
|
25
24
|
*/
|
|
26
25
|
query(name: string, type: "A" | "AAAA" | "HTTPS" | "SVCB", signal?: AbortSignal): Promise<DNSRecord[]>;
|
|
27
26
|
/**
|
|
28
|
-
*
|
|
27
|
+
* Return the underlying DNS cache.
|
|
28
|
+
*
|
|
29
|
+
* @returns {DNSCache} The resolver's DNS cache instance.
|
|
29
30
|
*/
|
|
31
|
+
getCache(): DNSCache;
|
|
30
32
|
private sendQuery;
|
|
31
|
-
/**
|
|
32
|
-
* GET method: base64url-encode the DNS query in the `dns` query parameter.
|
|
33
|
-
*/
|
|
34
33
|
private sendGET;
|
|
35
|
-
/**
|
|
36
|
-
* POST method: send DNS wire-format directly in the request body.
|
|
37
|
-
*/
|
|
38
34
|
private sendPOST;
|
|
39
|
-
/**
|
|
40
|
-
* Make the HTTPS request with timeout and abort support.
|
|
41
|
-
*/
|
|
42
35
|
private httpRequest;
|
|
43
|
-
/**
|
|
44
|
-
* Resolves the DoH server hostname to an IP address (bootstrap).
|
|
45
|
-
* Uses the system DNS resolver for this bootstrap step to avoid
|
|
46
|
-
* a circular dependency (we can't use DoH to resolve the DoH server).
|
|
47
|
-
*
|
|
48
|
-
* If the server URL already uses an IP address, returns it directly.
|
|
49
|
-
*/
|
|
50
36
|
private resolveServerHost;
|
|
51
37
|
}
|
|
52
38
|
//# sourceMappingURL=doh-resolver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doh-resolver.d.ts","sourceRoot":"","sources":["../../src/dns/doh-resolver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"doh-resolver.d.ts","sourceRoot":"","sources":["../../src/dns/doh-resolver.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAStC,2EAA2E;AAC3E,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAM;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAU;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAW;IACjC,OAAO,CAAC,OAAO,CAAK;IAEpB;;;;OAIG;gBACS,MAAM,EAAE,SAAS;IAQ7B;;;;;;;OAOG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAgB5G;;;;OAIG;IACH,QAAQ,IAAI,QAAQ;YAIN,SAAS;IASvB,OAAO,CAAC,OAAO;IAqBf,OAAO,CAAC,QAAQ;IAmBhB,OAAO,CAAC,WAAW;YAmFL,iBAAiB;CA8BhC"}
|
package/dist/dns/doh-resolver.js
CHANGED
|
@@ -1,60 +1,62 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* DNS-over-HTTPS (DoH) resolver implementing RFC 8484.
|
|
3
|
-
*
|
|
4
|
-
* Sends DNS queries over HTTPS to a configured DoH server, providing
|
|
5
|
-
* encrypted DNS resolution for privacy. Supports both GET (wire-format
|
|
6
|
-
* in query parameter) and POST (wire-format in body) methods.
|
|
7
|
-
*
|
|
8
|
-
* @see https://datatracker.ietf.org/doc/html/rfc8484
|
|
9
|
-
*/
|
|
10
1
|
import * as https from "node:https";
|
|
11
2
|
import * as http from "node:http";
|
|
12
3
|
import { lookup } from "node:dns/promises";
|
|
13
4
|
import { buildDNSQuery, parseDNSResponse } from "./codec.js";
|
|
14
5
|
import { RTYPE } from "./types.js";
|
|
6
|
+
import { DNSCache } from "./cache.js";
|
|
15
7
|
const DOH_CONTENT_TYPE = "application/dns-message";
|
|
16
8
|
const DEFAULT_TIMEOUT = 5000;
|
|
17
|
-
|
|
9
|
+
const BOOTSTRAP_CACHE_MAX = 50;
|
|
10
|
+
const BOOTSTRAP_CACHE_TTL = 300_000;
|
|
18
11
|
const bootstrapCache = new Map();
|
|
19
|
-
/**
|
|
20
|
-
* DNS-over-HTTPS resolver for encrypted DNS resolution.
|
|
21
|
-
*
|
|
22
|
-
* Usage:
|
|
23
|
-
* ```typescript
|
|
24
|
-
* const resolver = new DoHResolver({ server: "https://1.1.1.1/dns-query" });
|
|
25
|
-
* const records = await resolver.query("example.com", "A");
|
|
26
|
-
* ```
|
|
27
|
-
*/
|
|
12
|
+
/** DNS-over-HTTPS resolver supporting GET and POST wire-format queries. */
|
|
28
13
|
export class DoHResolver {
|
|
29
14
|
serverUrl;
|
|
30
15
|
method;
|
|
31
16
|
timeout;
|
|
32
17
|
bootstrap;
|
|
18
|
+
cache;
|
|
33
19
|
queryId = 0;
|
|
20
|
+
/**
|
|
21
|
+
* Create a new DoH resolver.
|
|
22
|
+
*
|
|
23
|
+
* @param {DoHConfig} config - DoH connection and cache configuration.
|
|
24
|
+
*/
|
|
34
25
|
constructor(config) {
|
|
35
26
|
this.serverUrl = new URL(config.server);
|
|
36
27
|
this.method = config.method ?? "POST";
|
|
37
28
|
this.timeout = config.timeout ?? DEFAULT_TIMEOUT;
|
|
38
29
|
this.bootstrap = config.bootstrap ?? true;
|
|
30
|
+
this.cache = new DNSCache(config.cache);
|
|
39
31
|
}
|
|
40
32
|
/**
|
|
41
|
-
*
|
|
33
|
+
* Perform a DNS query over HTTPS.
|
|
42
34
|
*
|
|
43
|
-
* @param name
|
|
44
|
-
* @param
|
|
45
|
-
* @param signal Optional
|
|
46
|
-
* @returns Array of
|
|
35
|
+
* @param {string} name - Domain name to resolve.
|
|
36
|
+
* @param {"A"|"AAAA"|"HTTPS"|"SVCB"} type - Record type to query.
|
|
37
|
+
* @param {AbortSignal} [signal] - Optional abort signal.
|
|
38
|
+
* @returns {Promise<DNSRecord[]>} Array of DNS records from the response.
|
|
47
39
|
*/
|
|
48
40
|
async query(name, type, signal) {
|
|
41
|
+
const cached = this.cache.get(name, type);
|
|
42
|
+
if (cached)
|
|
43
|
+
return cached;
|
|
49
44
|
const rtype = RTYPE[type];
|
|
50
45
|
const id = this.queryId++ & 0xffff;
|
|
51
46
|
const queryPacket = buildDNSQuery(name, rtype, id);
|
|
52
47
|
const responseData = await this.sendQuery(queryPacket, signal);
|
|
53
|
-
|
|
48
|
+
const records = parseDNSResponse(responseData);
|
|
49
|
+
this.cache.set(name, type, records);
|
|
50
|
+
return records;
|
|
54
51
|
}
|
|
55
52
|
/**
|
|
56
|
-
*
|
|
53
|
+
* Return the underlying DNS cache.
|
|
54
|
+
*
|
|
55
|
+
* @returns {DNSCache} The resolver's DNS cache instance.
|
|
57
56
|
*/
|
|
57
|
+
getCache() {
|
|
58
|
+
return this.cache;
|
|
59
|
+
}
|
|
58
60
|
async sendQuery(packet, signal) {
|
|
59
61
|
const host = await this.resolveServerHost();
|
|
60
62
|
if (this.method === "GET") {
|
|
@@ -62,9 +64,6 @@ export class DoHResolver {
|
|
|
62
64
|
}
|
|
63
65
|
return this.sendPOST(packet, host, signal);
|
|
64
66
|
}
|
|
65
|
-
/**
|
|
66
|
-
* GET method: base64url-encode the DNS query in the `dns` query parameter.
|
|
67
|
-
*/
|
|
68
67
|
sendGET(packet, host, signal) {
|
|
69
68
|
const encoded = packet.toString("base64url");
|
|
70
69
|
const url = new URL(this.serverUrl.toString());
|
|
@@ -80,9 +79,6 @@ export class DoHResolver {
|
|
|
80
79
|
},
|
|
81
80
|
}, undefined, signal);
|
|
82
81
|
}
|
|
83
|
-
/**
|
|
84
|
-
* POST method: send DNS wire-format directly in the request body.
|
|
85
|
-
*/
|
|
86
82
|
sendPOST(packet, host, signal) {
|
|
87
83
|
return this.httpRequest({
|
|
88
84
|
method: "POST",
|
|
@@ -97,9 +93,6 @@ export class DoHResolver {
|
|
|
97
93
|
},
|
|
98
94
|
}, packet, signal);
|
|
99
95
|
}
|
|
100
|
-
/**
|
|
101
|
-
* Make the HTTPS request with timeout and abort support.
|
|
102
|
-
*/
|
|
103
96
|
httpRequest(options, body, signal) {
|
|
104
97
|
return new Promise((resolve, reject) => {
|
|
105
98
|
if (signal?.aborted) {
|
|
@@ -149,7 +142,9 @@ export class DoHResolver {
|
|
|
149
142
|
req.destroy();
|
|
150
143
|
reject(new Error("DoH query timed out"));
|
|
151
144
|
}, this.timeout);
|
|
152
|
-
req.once("close", () =>
|
|
145
|
+
req.once("close", () => {
|
|
146
|
+
clearTimeout(timer);
|
|
147
|
+
});
|
|
153
148
|
if (signal) {
|
|
154
149
|
const onAbort = () => {
|
|
155
150
|
clearTimeout(timer);
|
|
@@ -157,7 +152,9 @@ export class DoHResolver {
|
|
|
157
152
|
reject(new Error("DoH query aborted"));
|
|
158
153
|
};
|
|
159
154
|
signal.addEventListener("abort", onAbort, { once: true });
|
|
160
|
-
req.once("close", () =>
|
|
155
|
+
req.once("close", () => {
|
|
156
|
+
signal.removeEventListener("abort", onAbort);
|
|
157
|
+
});
|
|
161
158
|
}
|
|
162
159
|
if (body) {
|
|
163
160
|
req.write(body);
|
|
@@ -165,27 +162,29 @@ export class DoHResolver {
|
|
|
165
162
|
req.end();
|
|
166
163
|
});
|
|
167
164
|
}
|
|
168
|
-
/**
|
|
169
|
-
* Resolves the DoH server hostname to an IP address (bootstrap).
|
|
170
|
-
* Uses the system DNS resolver for this bootstrap step to avoid
|
|
171
|
-
* a circular dependency (we can't use DoH to resolve the DoH server).
|
|
172
|
-
*
|
|
173
|
-
* If the server URL already uses an IP address, returns it directly.
|
|
174
|
-
*/
|
|
175
165
|
async resolveServerHost() {
|
|
176
166
|
const host = this.serverUrl.hostname;
|
|
177
167
|
if (/^\d+\.\d+\.\d+\.\d+$/.test(host) || host.includes(":")) {
|
|
178
168
|
return host;
|
|
179
169
|
}
|
|
180
170
|
const cached = bootstrapCache.get(host);
|
|
181
|
-
if (cached)
|
|
182
|
-
|
|
171
|
+
if (cached) {
|
|
172
|
+
if (Date.now() - cached.storedAt < BOOTSTRAP_CACHE_TTL) {
|
|
173
|
+
return cached.address;
|
|
174
|
+
}
|
|
175
|
+
bootstrapCache.delete(host);
|
|
176
|
+
}
|
|
183
177
|
if (!this.bootstrap) {
|
|
184
178
|
return host;
|
|
185
179
|
}
|
|
186
180
|
const result = await lookup(host, { family: 0 });
|
|
187
181
|
const address = Array.isArray(result) ? result[0].address : result.address;
|
|
188
|
-
bootstrapCache.
|
|
182
|
+
if (bootstrapCache.size >= BOOTSTRAP_CACHE_MAX) {
|
|
183
|
+
const firstKey = bootstrapCache.keys().next().value;
|
|
184
|
+
if (firstKey)
|
|
185
|
+
bootstrapCache.delete(firstKey);
|
|
186
|
+
}
|
|
187
|
+
bootstrapCache.set(host, { address, storedAt: Date.now() });
|
|
189
188
|
return address;
|
|
190
189
|
}
|
|
191
190
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doh-resolver.js","sourceRoot":"","sources":["../../src/dns/doh-resolver.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"doh-resolver.js","sourceRoot":"","sources":["../../src/dns/doh-resolver.ts"],"names":[],"mappings":"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"}
|