nlcurl 0.7.0 → 0.9.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 +149 -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 +75 -37
- package/dist/cache/store.d.ts.map +1 -1
- package/dist/cache/store.js +217 -85
- package/dist/cache/store.js.map +1 -1
- package/dist/cache/types.d.ts +10 -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 +41 -40
- package/dist/cookies/jar.d.ts.map +1 -1
- package/dist/cookies/jar.js +65 -42
- 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 +23 -15
- 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 +61 -0
- package/dist/core/auth.d.ts.map +1 -0
- package/dist/core/auth.js +159 -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 +33 -113
- 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 +136 -77
- package/dist/core/session.js.map +1 -1
- package/dist/core/validation.d.ts +58 -43
- package/dist/core/validation.d.ts.map +1 -1
- package/dist/core/validation.js +141 -56
- package/dist/core/validation.js.map +1 -1
- package/dist/dns/cache.d.ts +65 -0
- package/dist/dns/cache.d.ts.map +1 -0
- package/dist/dns/cache.js +119 -0
- package/dist/dns/cache.js.map +1 -0
- package/dist/dns/codec.d.ts +29 -19
- package/dist/dns/codec.d.ts.map +1 -1
- package/dist/dns/codec.js +73 -39
- 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 +47 -48
- 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 +166 -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 +81 -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 +27 -52
- package/dist/http/alt-svc.d.ts.map +1 -1
- package/dist/http/alt-svc.js +17 -67
- 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 +21 -17
- package/dist/http/h1/encoder.d.ts.map +1 -1
- package/dist/http/h1/encoder.js +56 -20
- package/dist/http/h1/encoder.js.map +1 -1
- package/dist/http/h1/parser.d.ts +23 -59
- package/dist/http/h1/parser.d.ts.map +1 -1
- package/dist/http/h1/parser.js +61 -55
- package/dist/http/h1/parser.js.map +1 -1
- package/dist/http/h2/client.d.ts +23 -59
- package/dist/http/h2/client.d.ts.map +1 -1
- package/dist/http/h2/client.js +107 -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 +20 -36
- package/dist/http/h2/hpack.d.ts.map +1 -1
- package/dist/http/h2/hpack.js +41 -36
- package/dist/http/h2/hpack.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 +17 -38
- package/dist/http/negotiator.js.map +1 -1
- package/dist/http/pool.d.ts +34 -64
- 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 +24 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -3
- package/dist/index.js.map +1 -1
- package/dist/middleware/circuit-breaker.d.ts +44 -0
- package/dist/middleware/circuit-breaker.d.ts.map +1 -0
- package/dist/middleware/circuit-breaker.js +96 -0
- package/dist/middleware/circuit-breaker.js.map +1 -0
- 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 +129 -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 +8 -10
- package/dist/proxy/socks.js.map +1 -1
- package/dist/sse/parser.d.ts +16 -37
- package/dist/sse/parser.d.ts.map +1 -1
- package/dist/sse/parser.js +31 -28
- package/dist/sse/parser.js.map +1 -1
- package/dist/tls/constants.d.ts +21 -72
- package/dist/tls/constants.d.ts.map +1 -1
- package/dist/tls/constants.js +21 -72
- 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 +41 -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 +26 -45
- package/dist/tls/stealth/client-hello.d.ts.map +1 -1
- package/dist/tls/stealth/client-hello.js +15 -31
- package/dist/tls/stealth/client-hello.js.map +1 -1
- package/dist/tls/stealth/engine.d.ts +10 -15
- package/dist/tls/stealth/engine.d.ts.map +1 -1
- package/dist/tls/stealth/engine.js +98 -18
- package/dist/tls/stealth/engine.js.map +1 -1
- package/dist/tls/stealth/handshake.d.ts +32 -31
- package/dist/tls/stealth/handshake.d.ts.map +1 -1
- package/dist/tls/stealth/handshake.js +74 -47
- package/dist/tls/stealth/handshake.js.map +1 -1
- package/dist/tls/stealth/key-schedule.d.ts +81 -86
- package/dist/tls/stealth/key-schedule.d.ts.map +1 -1
- package/dist/tls/stealth/key-schedule.js +70 -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 +10 -2
- package/dist/tls/stealth/tls12-handshake.js.map +1 -1
- package/dist/tls/types.d.ts +46 -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 +35 -53
- package/dist/ws/client.d.ts.map +1 -1
- package/dist/ws/client.js +96 -38
- 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 +26 -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 +2 -2
- package/dist/http/h3/detection.d.ts +0 -17
- package/dist/http/h3/detection.d.ts.map +0 -1
- package/dist/http/h3/detection.js +0 -59
- package/dist/http/h3/detection.js.map +0 -1
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import * as tls from "node:tls";
|
|
2
|
+
import { buildDNSQuery, parseDNSResponse } from "./codec.js";
|
|
3
|
+
import { RTYPE } from "./types.js";
|
|
4
|
+
/** Pre-configured DNS-over-TLS server entries. */
|
|
5
|
+
export const DOT_SERVERS = {
|
|
6
|
+
cloudflare: { server: "1.1.1.1", servername: "cloudflare-dns.com" },
|
|
7
|
+
"cloudflare-ipv6": { server: "2606:4700:4700::1111", servername: "cloudflare-dns.com" },
|
|
8
|
+
google: { server: "8.8.8.8", servername: "dns.google" },
|
|
9
|
+
"google-ipv6": { server: "2001:4860:4860::8888", servername: "dns.google" },
|
|
10
|
+
quad9: { server: "9.9.9.9", servername: "dns.quad9.net" },
|
|
11
|
+
adguard: { server: "94.140.14.14", servername: "dns.adguard-dns.com" },
|
|
12
|
+
};
|
|
13
|
+
/** DNS-over-TLS resolver using a persistent TLS connection. */
|
|
14
|
+
export class DoTResolver {
|
|
15
|
+
server;
|
|
16
|
+
port;
|
|
17
|
+
servername;
|
|
18
|
+
timeout;
|
|
19
|
+
insecure;
|
|
20
|
+
keepAlive;
|
|
21
|
+
socket = null;
|
|
22
|
+
connected = false;
|
|
23
|
+
/**
|
|
24
|
+
* Create a new DoT resolver.
|
|
25
|
+
*
|
|
26
|
+
* @param {DoTConfig} [config] - DoT connection configuration.
|
|
27
|
+
*/
|
|
28
|
+
constructor(config) {
|
|
29
|
+
this.server = config?.server ?? "1.1.1.1";
|
|
30
|
+
this.port = config?.port ?? 853;
|
|
31
|
+
this.servername = config?.servername ?? "cloudflare-dns.com";
|
|
32
|
+
this.timeout = config?.timeout ?? 5000;
|
|
33
|
+
this.insecure = config?.insecure ?? false;
|
|
34
|
+
this.keepAlive = config?.keepAlive ?? false;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Resolve a domain name to DNS records over TLS.
|
|
38
|
+
*
|
|
39
|
+
* @param {string} name - Domain name to resolve.
|
|
40
|
+
* @param {RTYPEValue} [type] - Numeric record type (defaults to A).
|
|
41
|
+
* @returns {Promise<DNSRecord[]>} Array of parsed DNS records.
|
|
42
|
+
*/
|
|
43
|
+
async resolve(name, type = RTYPE.A) {
|
|
44
|
+
const queryBuf = buildDNSQuery(name, type);
|
|
45
|
+
const framed = Buffer.allocUnsafe(2 + queryBuf.length);
|
|
46
|
+
framed.writeUInt16BE(queryBuf.length, 0);
|
|
47
|
+
queryBuf.copy(framed, 2);
|
|
48
|
+
const responseData = await this.send(framed);
|
|
49
|
+
if (responseData.length < 2) {
|
|
50
|
+
throw new Error("DoT response too short");
|
|
51
|
+
}
|
|
52
|
+
const msgLen = responseData.readUInt16BE(0);
|
|
53
|
+
const dnsMsg = responseData.subarray(2, 2 + msgLen);
|
|
54
|
+
return parseDNSResponse(dnsMsg);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Resolve a domain name to IPv4 addresses.
|
|
58
|
+
*
|
|
59
|
+
* @param {string} name - Domain name to resolve.
|
|
60
|
+
* @returns {Promise<string[]>} Array of IPv4 address strings.
|
|
61
|
+
*/
|
|
62
|
+
async resolve4(name) {
|
|
63
|
+
const records = await this.resolve(name, RTYPE.A);
|
|
64
|
+
return records.filter((r) => r.type === RTYPE.A && r.data.length === 4).map((r) => `${r.data[0]}.${r.data[1]}.${r.data[2]}.${r.data[3]}`);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Resolve a domain name to IPv6 addresses.
|
|
68
|
+
*
|
|
69
|
+
* @param {string} name - Domain name to resolve.
|
|
70
|
+
* @returns {Promise<string[]>} Array of IPv6 address strings.
|
|
71
|
+
*/
|
|
72
|
+
async resolve6(name) {
|
|
73
|
+
const records = await this.resolve(name, RTYPE.AAAA);
|
|
74
|
+
return records
|
|
75
|
+
.filter((r) => r.type === RTYPE.AAAA && r.data.length === 16)
|
|
76
|
+
.map((r) => {
|
|
77
|
+
const parts = [];
|
|
78
|
+
for (let i = 0; i < 16; i += 2) {
|
|
79
|
+
parts.push(r.data.readUInt16BE(i).toString(16));
|
|
80
|
+
}
|
|
81
|
+
return parts.join(":");
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
/** Close the underlying TLS socket and release resources. */
|
|
85
|
+
close() {
|
|
86
|
+
if (this.socket) {
|
|
87
|
+
this.socket.destroy();
|
|
88
|
+
this.socket = null;
|
|
89
|
+
this.connected = false;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async send(data) {
|
|
93
|
+
const socket = await this.getSocket();
|
|
94
|
+
return new Promise((resolve, reject) => {
|
|
95
|
+
let timer;
|
|
96
|
+
let response = Buffer.alloc(0);
|
|
97
|
+
const cleanup = () => {
|
|
98
|
+
if (timer)
|
|
99
|
+
clearTimeout(timer);
|
|
100
|
+
socket.removeListener("data", onData);
|
|
101
|
+
socket.removeListener("error", onError);
|
|
102
|
+
};
|
|
103
|
+
const onData = (chunk) => {
|
|
104
|
+
response = Buffer.concat([response, chunk]);
|
|
105
|
+
if (response.length >= 2) {
|
|
106
|
+
const expectedLen = response.readUInt16BE(0) + 2;
|
|
107
|
+
if (response.length >= expectedLen) {
|
|
108
|
+
cleanup();
|
|
109
|
+
if (!this.keepAlive) {
|
|
110
|
+
socket.destroy();
|
|
111
|
+
this.socket = null;
|
|
112
|
+
this.connected = false;
|
|
113
|
+
}
|
|
114
|
+
resolve(response);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
const onError = (err) => {
|
|
119
|
+
cleanup();
|
|
120
|
+
this.socket = null;
|
|
121
|
+
this.connected = false;
|
|
122
|
+
reject(err);
|
|
123
|
+
};
|
|
124
|
+
timer = setTimeout(() => {
|
|
125
|
+
cleanup();
|
|
126
|
+
if (!this.keepAlive) {
|
|
127
|
+
socket.destroy();
|
|
128
|
+
this.socket = null;
|
|
129
|
+
this.connected = false;
|
|
130
|
+
}
|
|
131
|
+
reject(new Error("DoT query timed out"));
|
|
132
|
+
}, this.timeout);
|
|
133
|
+
socket.on("data", onData);
|
|
134
|
+
socket.on("error", onError);
|
|
135
|
+
socket.write(data);
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
async getSocket() {
|
|
139
|
+
if (this.socket && this.connected) {
|
|
140
|
+
return this.socket;
|
|
141
|
+
}
|
|
142
|
+
return new Promise((resolve, reject) => {
|
|
143
|
+
const socket = tls.connect({
|
|
144
|
+
host: this.server,
|
|
145
|
+
port: this.port,
|
|
146
|
+
servername: this.servername,
|
|
147
|
+
rejectUnauthorized: !this.insecure,
|
|
148
|
+
ALPNProtocols: ["dot"],
|
|
149
|
+
}, () => {
|
|
150
|
+
this.socket = socket;
|
|
151
|
+
this.connected = true;
|
|
152
|
+
resolve(socket);
|
|
153
|
+
});
|
|
154
|
+
socket.once("error", (err) => {
|
|
155
|
+
this.socket = null;
|
|
156
|
+
this.connected = false;
|
|
157
|
+
reject(err);
|
|
158
|
+
});
|
|
159
|
+
socket.setTimeout(this.timeout, () => {
|
|
160
|
+
socket.destroy();
|
|
161
|
+
reject(new Error("DoT connection timed out"));
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=dot-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dot-resolver.js","sourceRoot":"","sources":["../../src/dns/dot-resolver.ts"],"names":[],"mappings":"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"}
|
package/dist/dns/https-rr.d.ts
CHANGED
|
@@ -1,51 +1,40 @@
|
|
|
1
1
|
import { type SVCBRecord, type DoHConfig, type ResolvedAddress } from "./types.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
*/
|
|
2
|
+
import { type Logger } from "../utils/logger.js";
|
|
3
|
+
/** Resolved HTTPS resource record data including ECH, ALPN, and address hints. */
|
|
5
4
|
export interface HTTPSRRResult {
|
|
6
|
-
/**
|
|
5
|
+
/** All SVCB records returned by the query. */
|
|
7
6
|
svcb: SVCBRecord[];
|
|
8
|
-
/**
|
|
7
|
+
/** Encrypted Client Hello configuration list, if present. */
|
|
9
8
|
echConfigList?: Buffer;
|
|
10
|
-
/** ALPN
|
|
9
|
+
/** Advertised ALPN protocol identifiers from the best record. */
|
|
11
10
|
alpn?: string[];
|
|
12
|
-
/**
|
|
11
|
+
/** IPv4 and IPv6 address hints extracted from service records. */
|
|
13
12
|
addresses: ResolvedAddress[];
|
|
14
|
-
/**
|
|
13
|
+
/** Alternate port from the highest-priority service record. */
|
|
15
14
|
port?: number;
|
|
16
15
|
}
|
|
17
|
-
/**
|
|
18
|
-
* Resolver for HTTPS/SVCB DNS Resource Records (RFC 9460).
|
|
19
|
-
*
|
|
20
|
-
* Supports two modes:
|
|
21
|
-
* 1. **System DNS** — Uses `node:dns` (resolveAny or raw query).
|
|
22
|
-
* 2. **DoH** — Uses a DoHResolver for encrypted HTTPS-RR queries.
|
|
23
|
-
*/
|
|
16
|
+
/** Resolver for HTTPS/SVCB resource records via DoH or the system resolver. */
|
|
24
17
|
export declare class HTTPSRRResolver {
|
|
25
18
|
private readonly dohResolver?;
|
|
26
19
|
private readonly systemResolver;
|
|
27
|
-
|
|
20
|
+
private readonly logger;
|
|
28
21
|
/**
|
|
29
|
-
*
|
|
22
|
+
* Create a new HTTPS RR resolver.
|
|
30
23
|
*
|
|
31
|
-
* @param
|
|
32
|
-
* @param
|
|
33
|
-
* @returns Parsed HTTPS-RR result with SVCB params, or null if no records found.
|
|
24
|
+
* @param {DoHConfig} [dohConfig] - Optional DoH configuration; falls back to system DNS when omitted.
|
|
25
|
+
* @param {Logger} [logger] - Optional logger; falls back to the default logger.
|
|
34
26
|
*/
|
|
35
|
-
|
|
27
|
+
constructor(dohConfig?: DoHConfig, logger?: Logger);
|
|
36
28
|
/**
|
|
37
|
-
*
|
|
29
|
+
* Resolve HTTPS resource records for a hostname.
|
|
30
|
+
*
|
|
31
|
+
* @param {string} hostname - Domain name to query.
|
|
32
|
+
* @param {AbortSignal} [signal] - Optional abort signal.
|
|
33
|
+
* @returns {Promise<HTTPSRRResult|null>} Parsed HTTPS RR result, or `null` if no service records are found.
|
|
38
34
|
*/
|
|
35
|
+
resolve(hostname: string, signal?: AbortSignal): Promise<HTTPSRRResult | null>;
|
|
39
36
|
private resolveViaDoH;
|
|
40
|
-
/**
|
|
41
|
-
* Resolves HTTPS records via the system DNS resolver.
|
|
42
|
-
* Uses raw DNS query + decode since node:dns doesn't natively support type 65.
|
|
43
|
-
*/
|
|
44
37
|
private resolveViaSystem;
|
|
45
|
-
/**
|
|
46
|
-
* Parses a native Node.js HTTPS DNS record into our SVCBRecord format.
|
|
47
|
-
* Node.js 22+ may return HTTPS records with a specific structure.
|
|
48
|
-
*/
|
|
49
38
|
private parseNativeHTTPSRecord;
|
|
50
39
|
}
|
|
51
40
|
//# sourceMappingURL=https-rr.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"https-rr.d.ts","sourceRoot":"","sources":["../../src/dns/https-rr.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"https-rr.d.ts","sourceRoot":"","sources":["../../src/dns/https-rr.ts"],"names":[],"mappings":"AAGA,OAAO,EAAS,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAC1F,OAAO,EAAE,KAAK,MAAM,EAAoB,MAAM,oBAAoB,CAAC;AAYnE,kFAAkF;AAClF,MAAM,WAAW,aAAa;IAC5B,8CAA8C;IAC9C,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,6DAA6D;IAC7D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iEAAiE;IACjE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,kEAAkE;IAClE,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,+DAA+D;IAC/D,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,+EAA+E;AAC/E,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAc;IAC3C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAW;IAC1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAEhC;;;;;OAKG;gBACS,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM;IAQlD;;;;;;OAMG;IACG,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;YAgDtE,aAAa;YAKb,gBAAgB;IAa9B,OAAO,CAAC,sBAAsB;CAc/B"}
|
package/dist/dns/https-rr.js
CHANGED
|
@@ -1,43 +1,32 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* HTTPS Resource Record resolver (RFC 9460).
|
|
3
|
-
*
|
|
4
|
-
* Queries HTTPS/SVCB DNS records to discover:
|
|
5
|
-
* - ECH (Encrypted Client Hello) configuration keys
|
|
6
|
-
* - ALPN protocol hints (e.g. h2, h3)
|
|
7
|
-
* - IP address hints for faster connection setup
|
|
8
|
-
* - Port overrides
|
|
9
|
-
*
|
|
10
|
-
* Can use either the system DNS resolver (via `node:dns`) or a DoH
|
|
11
|
-
* resolver for encrypted queries.
|
|
12
|
-
*
|
|
13
|
-
* @see https://datatracker.ietf.org/doc/html/rfc9460
|
|
14
|
-
*/
|
|
15
1
|
import { Resolver } from "node:dns/promises";
|
|
16
2
|
import { DoHResolver } from "./doh-resolver.js";
|
|
17
3
|
import { parseSVCBRecord } from "./codec.js";
|
|
18
4
|
import { RTYPE } from "./types.js";
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
*
|
|
22
|
-
* Supports two modes:
|
|
23
|
-
* 1. **System DNS** — Uses `node:dns` (resolveAny or raw query).
|
|
24
|
-
* 2. **DoH** — Uses a DoHResolver for encrypted HTTPS-RR queries.
|
|
25
|
-
*/
|
|
5
|
+
import { getDefaultLogger } from "../utils/logger.js";
|
|
6
|
+
/** Resolver for HTTPS/SVCB resource records via DoH or the system resolver. */
|
|
26
7
|
export class HTTPSRRResolver {
|
|
27
8
|
dohResolver;
|
|
28
9
|
systemResolver;
|
|
29
|
-
|
|
10
|
+
logger;
|
|
11
|
+
/**
|
|
12
|
+
* Create a new HTTPS RR resolver.
|
|
13
|
+
*
|
|
14
|
+
* @param {DoHConfig} [dohConfig] - Optional DoH configuration; falls back to system DNS when omitted.
|
|
15
|
+
* @param {Logger} [logger] - Optional logger; falls back to the default logger.
|
|
16
|
+
*/
|
|
17
|
+
constructor(dohConfig, logger) {
|
|
30
18
|
if (dohConfig) {
|
|
31
19
|
this.dohResolver = new DoHResolver(dohConfig);
|
|
32
20
|
}
|
|
33
21
|
this.systemResolver = new Resolver();
|
|
22
|
+
this.logger = logger ?? getDefaultLogger();
|
|
34
23
|
}
|
|
35
24
|
/**
|
|
36
|
-
*
|
|
25
|
+
* Resolve HTTPS resource records for a hostname.
|
|
37
26
|
*
|
|
38
|
-
* @param hostname
|
|
39
|
-
* @param signal
|
|
40
|
-
* @returns Parsed HTTPS
|
|
27
|
+
* @param {string} hostname - Domain name to query.
|
|
28
|
+
* @param {AbortSignal} [signal] - Optional abort signal.
|
|
29
|
+
* @returns {Promise<HTTPSRRResult|null>} Parsed HTTPS RR result, or `null` if no service records are found.
|
|
41
30
|
*/
|
|
42
31
|
async resolve(hostname, signal) {
|
|
43
32
|
try {
|
|
@@ -77,35 +66,28 @@ export class HTTPSRRResolver {
|
|
|
77
66
|
port: best.port,
|
|
78
67
|
};
|
|
79
68
|
}
|
|
80
|
-
catch {
|
|
69
|
+
catch (err) {
|
|
70
|
+
this.logger.debug("HTTPS RR resolution failed", err instanceof Error ? err.message : String(err));
|
|
81
71
|
return null;
|
|
82
72
|
}
|
|
83
73
|
}
|
|
84
|
-
/**
|
|
85
|
-
* Resolves HTTPS records via DoH.
|
|
86
|
-
*/
|
|
87
74
|
async resolveViaDoH(hostname, signal) {
|
|
88
75
|
const records = await this.dohResolver.query(hostname, "HTTPS", signal);
|
|
89
76
|
return records.filter((r) => r.type === RTYPE.HTTPS || r.type === RTYPE.SVCB).map((r) => parseSVCBRecord(r.data));
|
|
90
77
|
}
|
|
91
|
-
/**
|
|
92
|
-
* Resolves HTTPS records via the system DNS resolver.
|
|
93
|
-
* Uses raw DNS query + decode since node:dns doesn't natively support type 65.
|
|
94
|
-
*/
|
|
95
78
|
async resolveViaSystem(hostname) {
|
|
96
79
|
try {
|
|
97
|
-
const
|
|
80
|
+
const resolver = this.systemResolver;
|
|
81
|
+
const results = await resolver.resolve(hostname, "HTTPS").catch(() => []);
|
|
98
82
|
if (Array.isArray(results) && results.length > 0) {
|
|
99
83
|
return results.map((r) => this.parseNativeHTTPSRecord(r));
|
|
100
84
|
}
|
|
101
85
|
}
|
|
102
|
-
catch {
|
|
86
|
+
catch (err) {
|
|
87
|
+
this.logger.debug("System HTTPS RR lookup unsupported", err instanceof Error ? err.message : String(err));
|
|
88
|
+
}
|
|
103
89
|
return [];
|
|
104
90
|
}
|
|
105
|
-
/**
|
|
106
|
-
* Parses a native Node.js HTTPS DNS record into our SVCBRecord format.
|
|
107
|
-
* Node.js 22+ may return HTTPS records with a specific structure.
|
|
108
|
-
*/
|
|
109
91
|
parseNativeHTTPSRecord(record) {
|
|
110
92
|
const result = {
|
|
111
93
|
priority: record.priority ?? 0,
|
package/dist/dns/https-rr.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"https-rr.js","sourceRoot":"","sources":["../../src/dns/https-rr.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"https-rr.js","sourceRoot":"","sources":["../../src/dns/https-rr.ts"],"names":[],"mappings":"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"}
|
package/dist/dns/types.d.ts
CHANGED
|
@@ -1,45 +1,35 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Type definitions for the DNS resolution subsystem, including DNS-over-HTTPS
|
|
3
|
-
* (RFC 8484), HTTPS/SVCB resource records (RFC 9460), and resolver interfaces.
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* A resolved IP address entry.
|
|
7
|
-
*/
|
|
1
|
+
/** Resolved IP address with protocol family. */
|
|
8
2
|
export interface ResolvedAddress {
|
|
3
|
+
/** IP address string. */
|
|
9
4
|
address: string;
|
|
5
|
+
/** Internet protocol family — 4 for IPv4, 6 for IPv6. */
|
|
10
6
|
family: 4 | 6;
|
|
11
7
|
}
|
|
12
|
-
/**
|
|
13
|
-
* DNS query types used by the resolver.
|
|
14
|
-
*/
|
|
8
|
+
/** Supported DNS resource record type names. */
|
|
15
9
|
export type DNSRecordType = "A" | "AAAA" | "HTTPS" | "SVCB";
|
|
16
|
-
/**
|
|
17
|
-
* A parsed DNS resource record.
|
|
18
|
-
*/
|
|
10
|
+
/** Parsed DNS resource record. */
|
|
19
11
|
export interface DNSRecord {
|
|
12
|
+
/** Domain name the record belongs to. */
|
|
20
13
|
name: string;
|
|
14
|
+
/** Numeric record type (matches RTYPE constants). */
|
|
21
15
|
type: number;
|
|
16
|
+
/** Time-to-live in seconds. */
|
|
22
17
|
ttl: number;
|
|
18
|
+
/** Raw record data. */
|
|
23
19
|
data: Buffer;
|
|
24
20
|
}
|
|
25
|
-
/**
|
|
26
|
-
* Wire-format DNS record type numbers.
|
|
27
|
-
*/
|
|
21
|
+
/** Numeric DNS record type constants. */
|
|
28
22
|
export declare const RTYPE: {
|
|
29
23
|
readonly A: 1;
|
|
30
24
|
readonly AAAA: 28;
|
|
31
25
|
readonly HTTPS: 65;
|
|
32
26
|
readonly SVCB: 64;
|
|
33
27
|
};
|
|
34
|
-
/**
|
|
35
|
-
* Wire-format DNS class numbers.
|
|
36
|
-
*/
|
|
28
|
+
/** DNS record class constants. */
|
|
37
29
|
export declare const RCLASS: {
|
|
38
30
|
readonly IN: 1;
|
|
39
31
|
};
|
|
40
|
-
/**
|
|
41
|
-
* SvcParam keys defined in RFC 9460 §14.3.
|
|
42
|
-
*/
|
|
32
|
+
/** SVCB/HTTPS service parameter key constants. */
|
|
43
33
|
export declare const SvcParamKey: {
|
|
44
34
|
readonly MANDATORY: 0;
|
|
45
35
|
readonly ALPN: 1;
|
|
@@ -48,63 +38,45 @@ export declare const SvcParamKey: {
|
|
|
48
38
|
readonly IPV4HINT: 4;
|
|
49
39
|
readonly ECH: 5;
|
|
50
40
|
readonly IPV6HINT: 6;
|
|
51
|
-
/** draft-ietf-dnsop-svcb-https §14 — DNS-over-HTTPS path template */
|
|
52
41
|
readonly DOHPATH: 7;
|
|
53
42
|
};
|
|
54
|
-
/**
|
|
55
|
-
* Parsed HTTPS/SVCB record service parameters (RFC 9460).
|
|
56
|
-
*/
|
|
43
|
+
/** Parsed SVCB/HTTPS DNS resource record. */
|
|
57
44
|
export interface SVCBRecord {
|
|
58
|
-
/**
|
|
45
|
+
/** Record priority — 0 indicates an alias record. */
|
|
59
46
|
priority: number;
|
|
60
|
-
/**
|
|
47
|
+
/** Target domain name for the service. */
|
|
61
48
|
target: string;
|
|
62
|
-
/** ALPN protocol identifiers
|
|
49
|
+
/** Supported ALPN protocol identifiers. */
|
|
63
50
|
alpn?: string[];
|
|
64
|
-
/**
|
|
51
|
+
/** Alternate port for the service. */
|
|
65
52
|
port?: number;
|
|
66
|
-
/** IPv4 address hints. */
|
|
53
|
+
/** IPv4 address hints for the service. */
|
|
67
54
|
ipv4Hints?: string[];
|
|
68
|
-
/** IPv6 address hints. */
|
|
55
|
+
/** IPv6 address hints for the service. */
|
|
69
56
|
ipv6Hints?: string[];
|
|
70
|
-
/**
|
|
57
|
+
/** Encrypted Client Hello configuration list. */
|
|
71
58
|
echConfigList?: Buffer;
|
|
72
|
-
/** Whether
|
|
59
|
+
/** Whether the default ALPN should not be used. */
|
|
73
60
|
noDefaultAlpn?: boolean;
|
|
74
61
|
}
|
|
75
|
-
/**
|
|
76
|
-
* Configuration options for the DoH resolver.
|
|
77
|
-
*/
|
|
62
|
+
/** Configuration for a DNS-over-HTTPS resolver. */
|
|
78
63
|
export interface DoHConfig {
|
|
79
|
-
/** DoH server URL (e.g. "https://
|
|
64
|
+
/** DoH server URL (e.g. "https://cloudflare-dns.com/dns-query"). */
|
|
80
65
|
server: string;
|
|
81
|
-
/**
|
|
82
|
-
* HTTP method for DoH queries.
|
|
83
|
-
* - `"GET"`: DNS wire-format base64url-encoded in `?dns=` query parameter.
|
|
84
|
-
* - `"POST"`: DNS wire-format in request body.
|
|
85
|
-
* @default "POST"
|
|
86
|
-
*/
|
|
66
|
+
/** HTTP method to use for queries. */
|
|
87
67
|
method?: "GET" | "POST";
|
|
88
|
-
/**
|
|
68
|
+
/** Query timeout in milliseconds. */
|
|
89
69
|
timeout?: number;
|
|
90
|
-
/**
|
|
91
|
-
* Whether to bootstrap the DoH server address via system DNS if the
|
|
92
|
-
* server URL uses a hostname instead of an IP.
|
|
93
|
-
* @default true
|
|
94
|
-
*/
|
|
70
|
+
/** Whether to use system DNS to bootstrap the DoH server address. */
|
|
95
71
|
bootstrap?: boolean;
|
|
72
|
+
/** DNS cache configuration. */
|
|
73
|
+
cache?: import("./cache.js").DNSCacheConfig;
|
|
96
74
|
}
|
|
97
|
-
/**
|
|
98
|
-
* Combined DNS configuration for the library.
|
|
99
|
-
*/
|
|
75
|
+
/** Top-level DNS resolver configuration. */
|
|
100
76
|
export interface DNSConfig {
|
|
101
|
-
/**
|
|
77
|
+
/** DNS-over-HTTPS resolver configuration. */
|
|
102
78
|
doh?: DoHConfig;
|
|
103
|
-
/**
|
|
104
|
-
* Whether to query HTTPS/SVCB records alongside A/AAAA.
|
|
105
|
-
* Enables ECH key discovery, ALPN hints, and IP hints.
|
|
106
|
-
* @default false
|
|
107
|
-
*/
|
|
79
|
+
/** Whether to query HTTPS resource records for ECH and ALPN hints. */
|
|
108
80
|
httpsRR?: boolean;
|
|
109
81
|
}
|
|
110
82
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/dns/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/dns/types.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/dns/types.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,MAAM,WAAW,eAAe;IAC9B,yBAAyB;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;CACf;AAED,gDAAgD;AAChD,MAAM,MAAM,aAAa,GAAG,GAAG,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAE5D,kCAAkC;AAClC,MAAM,WAAW,SAAS;IACxB,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,+BAA+B;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,yCAAyC;AACzC,eAAO,MAAM,KAAK;;;;;CAKR,CAAC;AAEX,kCAAkC;AAClC,eAAO,MAAM,MAAM;;CAET,CAAC;AAEX,kDAAkD;AAClD,eAAO,MAAM,WAAW;;;;;;;;;CASd,CAAC;AAEX,6CAA6C;AAC7C,MAAM,WAAW,UAAU;IACzB,qDAAqD;IACrD,QAAQ,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,sCAAsC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,iDAAiD;IACjD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mDAAmD;IACnD,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,mDAAmD;AACnD,MAAM,WAAW,SAAS;IACxB,oEAAoE;IACpE,MAAM,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACxB,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,OAAO,YAAY,EAAE,cAAc,CAAC;CAC7C;AAED,4CAA4C;AAC5C,MAAM,WAAW,SAAS;IACxB,6CAA6C;IAC7C,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,sEAAsE;IACtE,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB"}
|
package/dist/dns/types.js
CHANGED
|
@@ -1,25 +1,15 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Type definitions for the DNS resolution subsystem, including DNS-over-HTTPS
|
|
3
|
-
* (RFC 8484), HTTPS/SVCB resource records (RFC 9460), and resolver interfaces.
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* Wire-format DNS record type numbers.
|
|
7
|
-
*/
|
|
1
|
+
/** Numeric DNS record type constants. */
|
|
8
2
|
export const RTYPE = {
|
|
9
3
|
A: 1,
|
|
10
4
|
AAAA: 28,
|
|
11
5
|
HTTPS: 65,
|
|
12
6
|
SVCB: 64,
|
|
13
7
|
};
|
|
14
|
-
/**
|
|
15
|
-
* Wire-format DNS class numbers.
|
|
16
|
-
*/
|
|
8
|
+
/** DNS record class constants. */
|
|
17
9
|
export const RCLASS = {
|
|
18
10
|
IN: 1,
|
|
19
11
|
};
|
|
20
|
-
/**
|
|
21
|
-
* SvcParam keys defined in RFC 9460 §14.3.
|
|
22
|
-
*/
|
|
12
|
+
/** SVCB/HTTPS service parameter key constants. */
|
|
23
13
|
export const SvcParamKey = {
|
|
24
14
|
MANDATORY: 0,
|
|
25
15
|
ALPN: 1,
|
|
@@ -28,7 +18,6 @@ export const SvcParamKey = {
|
|
|
28
18
|
IPV4HINT: 4,
|
|
29
19
|
ECH: 5,
|
|
30
20
|
IPV6HINT: 6,
|
|
31
|
-
/** draft-ietf-dnsop-svcb-https §14 — DNS-over-HTTPS path template */
|
|
32
21
|
DOHPATH: 7,
|
|
33
22
|
};
|
|
34
23
|
//# sourceMappingURL=types.js.map
|
package/dist/dns/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/dns/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/dns/types.ts"],"names":[],"mappings":"AAuBA,yCAAyC;AACzC,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,CAAC,EAAE,CAAC;IACJ,IAAI,EAAE,EAAE;IACR,KAAK,EAAE,EAAE;IACT,IAAI,EAAE,EAAE;CACA,CAAC;AAEX,kCAAkC;AAClC,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,EAAE,EAAE,CAAC;CACG,CAAC;AAEX,kDAAkD;AAClD,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,SAAS,EAAE,CAAC;IACZ,IAAI,EAAE,CAAC;IACP,eAAe,EAAE,CAAC;IAClB,IAAI,EAAE,CAAC;IACP,QAAQ,EAAE,CAAC;IACX,GAAG,EAAE,CAAC;IACN,QAAQ,EAAE,CAAC;IACX,OAAO,EAAE,CAAC;CACF,CAAC"}
|
|
@@ -1,17 +1,9 @@
|
|
|
1
1
|
import type { H2Profile } from "./types.js";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
* string encodes the SETTINGS frame parameters, connection window update,
|
|
5
|
-
* optional PRIORITY frame configuration, and pseudo-header ordering,
|
|
6
|
-
* separated by pipe characters (`|`).
|
|
3
|
+
* Generate an Akamai HTTP/2 fingerprint string.
|
|
7
4
|
*
|
|
8
|
-
* @param {H2Profile} profile -
|
|
9
|
-
* @returns {string}
|
|
10
|
-
* `"S1:V1;S2:V2|WU|P1:E1:D1:W1,...|:method,:path,..."`.
|
|
11
|
-
*
|
|
12
|
-
* @example
|
|
13
|
-
* const fp = akamaiFingerprint(chromeLatest.h2);
|
|
14
|
-
* // => "1:65536;2:0;3:1000;4:6291456;6:262144|15663105|0:0:0:255|m,p,a,s"
|
|
5
|
+
* @param {H2Profile} profile - HTTP/2 connection profile.
|
|
6
|
+
* @returns {string} Pipe-separated fingerprint of settings, window update, priority frames, and pseudo-header order.
|
|
15
7
|
*/
|
|
16
8
|
export declare function akamaiFingerprint(profile: H2Profile): string;
|
|
17
9
|
//# sourceMappingURL=akamai.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"akamai.d.ts","sourceRoot":"","sources":["../../src/fingerprints/akamai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C
|
|
1
|
+
{"version":3,"file":"akamai.d.ts","sourceRoot":"","sources":["../../src/fingerprints/akamai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,SAAS,GAAG,MAAM,CAU5D"}
|
|
@@ -1,16 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* string encodes the SETTINGS frame parameters, connection window update,
|
|
4
|
-
* optional PRIORITY frame configuration, and pseudo-header ordering,
|
|
5
|
-
* separated by pipe characters (`|`).
|
|
2
|
+
* Generate an Akamai HTTP/2 fingerprint string.
|
|
6
3
|
*
|
|
7
|
-
* @param {H2Profile} profile -
|
|
8
|
-
* @returns {string}
|
|
9
|
-
* `"S1:V1;S2:V2|WU|P1:E1:D1:W1,...|:method,:path,..."`.
|
|
10
|
-
*
|
|
11
|
-
* @example
|
|
12
|
-
* const fp = akamaiFingerprint(chromeLatest.h2);
|
|
13
|
-
* // => "1:65536;2:0;3:1000;4:6291456;6:262144|15663105|0:0:0:255|m,p,a,s"
|
|
4
|
+
* @param {H2Profile} profile - HTTP/2 connection profile.
|
|
5
|
+
* @returns {string} Pipe-separated fingerprint of settings, window update, priority frames, and pseudo-header order.
|
|
14
6
|
*/
|
|
15
7
|
export function akamaiFingerprint(profile) {
|
|
16
8
|
const settings = profile.settings.map((s) => `${s.id}:${s.value}`).join(";");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"akamai.js","sourceRoot":"","sources":["../../src/fingerprints/akamai.ts"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"akamai.js","sourceRoot":"","sources":["../../src/fingerprints/akamai.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAkB;IAClD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE7E,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAExC,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAExI,MAAM,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEnD,OAAO,GAAG,QAAQ,IAAI,EAAE,IAAI,QAAQ,IAAI,MAAM,EAAE,CAAC;AACnD,CAAC"}
|