nlcurl 0.6.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 +111 -0
- package/dist/cache/store.d.ts.map +1 -0
- package/dist/cache/store.js +414 -0
- package/dist/cache/store.js.map +1 -0
- package/dist/cache/types.d.ts +69 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +2 -0
- package/dist/cache/types.js.map +1 -0
- 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 +33 -31
- package/dist/cookies/jar.d.ts.map +1 -1
- package/dist/cookies/jar.js +69 -33
- package/dist/cookies/jar.js.map +1 -1
- package/dist/cookies/parser.d.ts +14 -16
- package/dist/cookies/parser.d.ts.map +1 -1
- package/dist/cookies/parser.js +30 -13
- 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 +34 -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 +63 -85
- package/dist/core/request.d.ts.map +1 -1
- package/dist/core/response.d.ts +64 -59
- package/dist/core/response.d.ts.map +1 -1
- package/dist/core/response.js +70 -52
- package/dist/core/response.js.map +1 -1
- package/dist/core/session.d.ts +81 -70
- package/dist/core/session.d.ts.map +1 -1
- package/dist/core/session.js +198 -71
- package/dist/core/session.js.map +1 -1
- package/dist/core/validation.d.ts +44 -42
- package/dist/core/validation.d.ts.map +1 -1
- package/dist/core/validation.js +47 -58
- 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 +39 -0
- package/dist/dns/codec.d.ts.map +1 -0
- package/dist/dns/codec.js +238 -0
- package/dist/dns/codec.js.map +1 -0
- package/dist/dns/doh-resolver.d.ts +38 -0
- package/dist/dns/doh-resolver.d.ts.map +1 -0
- package/dist/dns/doh-resolver.js +191 -0
- package/dist/dns/doh-resolver.js.map +1 -0
- 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 +40 -0
- package/dist/dns/https-rr.d.ts.map +1 -0
- package/dist/dns/https-rr.js +109 -0
- package/dist/dns/https-rr.js.map +1 -0
- package/dist/dns/types.d.ts +82 -0
- package/dist/dns/types.d.ts.map +1 -0
- package/dist/dns/types.js +23 -0
- package/dist/dns/types.js.map +1 -0
- 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 +39 -0
- package/dist/hsts/store.d.ts.map +1 -0
- package/dist/hsts/store.js +163 -0
- package/dist/hsts/store.js.map +1 -0
- package/dist/hsts/types.d.ts +24 -0
- package/dist/hsts/types.d.ts.map +1 -0
- package/dist/hsts/types.js +2 -0
- package/dist/hsts/types.js.map +1 -0
- package/dist/http/alt-svc.d.ts +67 -0
- package/dist/http/alt-svc.d.ts.map +1 -0
- package/dist/http/alt-svc.js +186 -0
- package/dist/http/alt-svc.js.map +1 -0
- 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 +29 -22
- 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 +15 -0
- package/dist/http/h3/detection.d.ts.map +1 -0
- package/dist/http/h3/detection.js +41 -0
- package/dist/http/h3/detection.js.map +1 -0
- package/dist/http/negotiator.d.ts +43 -33
- package/dist/http/negotiator.d.ts.map +1 -1
- package/dist/http/negotiator.js +99 -41
- 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 +36 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +32 -1
- 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 +15 -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 +11 -0
- package/dist/proxy/env-proxy.d.ts.map +1 -0
- package/dist/proxy/env-proxy.js +56 -0
- package/dist/proxy/env-proxy.js.map +1 -0
- package/dist/proxy/http-proxy.d.ts +13 -18
- package/dist/proxy/http-proxy.d.ts.map +1 -1
- package/dist/proxy/http-proxy.js +24 -14
- 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 +6 -9
- package/dist/proxy/socks.js.map +1 -1
- package/dist/sse/parser.d.ts +47 -0
- package/dist/sse/parser.d.ts.map +1 -0
- package/dist/sse/parser.js +139 -0
- package/dist/sse/parser.js.map +1 -0
- 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 +130 -0
- package/dist/tls/ech.d.ts.map +1 -0
- package/dist/tls/ech.js +353 -0
- package/dist/tls/ech.js.map +1 -0
- 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 +15 -14
- package/dist/tls/node-engine.d.ts.map +1 -1
- package/dist/tls/node-engine.js +54 -14
- 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 +10 -0
- package/dist/tls/pin-verification.d.ts.map +1 -0
- package/dist/tls/pin-verification.js +28 -0
- package/dist/tls/pin-verification.js.map +1 -0
- package/dist/tls/session-cache.d.ts +58 -0
- package/dist/tls/session-cache.d.ts.map +1 -0
- package/dist/tls/session-cache.js +76 -0
- package/dist/tls/session-cache.js.map +1 -0
- package/dist/tls/stealth/client-hello.d.ts +34 -32
- package/dist/tls/stealth/client-hello.d.ts.map +1 -1
- package/dist/tls/stealth/client-hello.js +116 -11
- 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 +163 -47
- package/dist/tls/stealth/engine.js.map +1 -1
- package/dist/tls/stealth/handshake.d.ts +23 -32
- package/dist/tls/stealth/handshake.d.ts.map +1 -1
- package/dist/tls/stealth/handshake.js +112 -27
- 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 +30 -0
- package/dist/tls/stealth/tls12-handshake.d.ts.map +1 -0
- package/dist/tls/stealth/tls12-handshake.js +470 -0
- package/dist/tls/stealth/tls12-handshake.js.map +1 -0
- package/dist/tls/types.d.ts +46 -48
- 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 -28
- package/dist/utils/encoding.d.ts.map +1 -1
- package/dist/utils/encoding.js +77 -40
- package/dist/utils/encoding.js.map +1 -1
- package/dist/utils/happy-eyeballs.d.ts +20 -7
- package/dist/utils/happy-eyeballs.d.ts.map +1 -1
- package/dist/utils/happy-eyeballs.js +57 -25
- 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 -52
- package/dist/ws/client.d.ts.map +1 -1
- package/dist/ws/client.js +92 -37
- package/dist/ws/client.js.map +1 -1
- package/dist/ws/frame.d.ts +27 -42
- package/dist/ws/frame.d.ts.map +1 -1
- package/dist/ws/frame.js +25 -37
- package/dist/ws/frame.js.map +1 -1
- package/dist/ws/permessage-deflate.d.ts +53 -0
- package/dist/ws/permessage-deflate.d.ts.map +1 -0
- package/dist/ws/permessage-deflate.js +140 -0
- package/dist/ws/permessage-deflate.js.map +1 -0
- package/package.json +62 -62
|
@@ -0,0 +1,158 @@
|
|
|
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 && typeof r.data === "string").map((r) => r.data);
|
|
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.filter((r) => r.type === RTYPE.AAAA && typeof r.data === "string").map((r) => r.data);
|
|
75
|
+
}
|
|
76
|
+
/** Close the underlying TLS socket and release resources. */
|
|
77
|
+
close() {
|
|
78
|
+
if (this.socket) {
|
|
79
|
+
this.socket.destroy();
|
|
80
|
+
this.socket = null;
|
|
81
|
+
this.connected = false;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async send(data) {
|
|
85
|
+
const socket = await this.getSocket();
|
|
86
|
+
return new Promise((resolve, reject) => {
|
|
87
|
+
let timer;
|
|
88
|
+
let response = Buffer.alloc(0);
|
|
89
|
+
const cleanup = () => {
|
|
90
|
+
if (timer)
|
|
91
|
+
clearTimeout(timer);
|
|
92
|
+
socket.removeListener("data", onData);
|
|
93
|
+
socket.removeListener("error", onError);
|
|
94
|
+
};
|
|
95
|
+
const onData = (chunk) => {
|
|
96
|
+
response = Buffer.concat([response, chunk]);
|
|
97
|
+
if (response.length >= 2) {
|
|
98
|
+
const expectedLen = response.readUInt16BE(0) + 2;
|
|
99
|
+
if (response.length >= expectedLen) {
|
|
100
|
+
cleanup();
|
|
101
|
+
if (!this.keepAlive) {
|
|
102
|
+
socket.destroy();
|
|
103
|
+
this.socket = null;
|
|
104
|
+
this.connected = false;
|
|
105
|
+
}
|
|
106
|
+
resolve(response);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
const onError = (err) => {
|
|
111
|
+
cleanup();
|
|
112
|
+
this.socket = null;
|
|
113
|
+
this.connected = false;
|
|
114
|
+
reject(err);
|
|
115
|
+
};
|
|
116
|
+
timer = setTimeout(() => {
|
|
117
|
+
cleanup();
|
|
118
|
+
if (!this.keepAlive) {
|
|
119
|
+
socket.destroy();
|
|
120
|
+
this.socket = null;
|
|
121
|
+
this.connected = false;
|
|
122
|
+
}
|
|
123
|
+
reject(new Error("DoT query timed out"));
|
|
124
|
+
}, this.timeout);
|
|
125
|
+
socket.on("data", onData);
|
|
126
|
+
socket.on("error", onError);
|
|
127
|
+
socket.write(data);
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
async getSocket() {
|
|
131
|
+
if (this.socket && this.connected) {
|
|
132
|
+
return this.socket;
|
|
133
|
+
}
|
|
134
|
+
return new Promise((resolve, reject) => {
|
|
135
|
+
const socket = tls.connect({
|
|
136
|
+
host: this.server,
|
|
137
|
+
port: this.port,
|
|
138
|
+
servername: this.servername,
|
|
139
|
+
rejectUnauthorized: !this.insecure,
|
|
140
|
+
ALPNProtocols: ["dot"],
|
|
141
|
+
}, () => {
|
|
142
|
+
this.socket = socket;
|
|
143
|
+
this.connected = true;
|
|
144
|
+
resolve(socket);
|
|
145
|
+
});
|
|
146
|
+
socket.once("error", (err) => {
|
|
147
|
+
this.socket = null;
|
|
148
|
+
this.connected = false;
|
|
149
|
+
reject(err);
|
|
150
|
+
});
|
|
151
|
+
socket.setTimeout(this.timeout, () => {
|
|
152
|
+
socket.destroy();
|
|
153
|
+
reject(new Error("DoT connection timed out"));
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# 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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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { type SVCBRecord, type DoHConfig, type ResolvedAddress } from "./types.js";
|
|
2
|
+
import { type Logger } from "../utils/logger.js";
|
|
3
|
+
/** Resolved HTTPS resource record data including ECH, ALPN, and address hints. */
|
|
4
|
+
export interface HTTPSRRResult {
|
|
5
|
+
/** All SVCB records returned by the query. */
|
|
6
|
+
svcb: SVCBRecord[];
|
|
7
|
+
/** Encrypted Client Hello configuration list, if present. */
|
|
8
|
+
echConfigList?: Buffer;
|
|
9
|
+
/** Advertised ALPN protocol identifiers from the best record. */
|
|
10
|
+
alpn?: string[];
|
|
11
|
+
/** IPv4 and IPv6 address hints extracted from service records. */
|
|
12
|
+
addresses: ResolvedAddress[];
|
|
13
|
+
/** Alternate port from the highest-priority service record. */
|
|
14
|
+
port?: number;
|
|
15
|
+
}
|
|
16
|
+
/** Resolver for HTTPS/SVCB resource records via DoH or the system resolver. */
|
|
17
|
+
export declare class HTTPSRRResolver {
|
|
18
|
+
private readonly dohResolver?;
|
|
19
|
+
private readonly systemResolver;
|
|
20
|
+
private readonly logger;
|
|
21
|
+
/**
|
|
22
|
+
* Create a new HTTPS RR resolver.
|
|
23
|
+
*
|
|
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.
|
|
26
|
+
*/
|
|
27
|
+
constructor(dohConfig?: DoHConfig, logger?: Logger);
|
|
28
|
+
/**
|
|
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.
|
|
34
|
+
*/
|
|
35
|
+
resolve(hostname: string, signal?: AbortSignal): Promise<HTTPSRRResult | null>;
|
|
36
|
+
private resolveViaDoH;
|
|
37
|
+
private resolveViaSystem;
|
|
38
|
+
private parseNativeHTTPSRecord;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=https-rr.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { Resolver } from "node:dns/promises";
|
|
2
|
+
import { DoHResolver } from "./doh-resolver.js";
|
|
3
|
+
import { parseSVCBRecord } from "./codec.js";
|
|
4
|
+
import { RTYPE } from "./types.js";
|
|
5
|
+
import { getDefaultLogger } from "../utils/logger.js";
|
|
6
|
+
/** Resolver for HTTPS/SVCB resource records via DoH or the system resolver. */
|
|
7
|
+
export class HTTPSRRResolver {
|
|
8
|
+
dohResolver;
|
|
9
|
+
systemResolver;
|
|
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) {
|
|
18
|
+
if (dohConfig) {
|
|
19
|
+
this.dohResolver = new DoHResolver(dohConfig);
|
|
20
|
+
}
|
|
21
|
+
this.systemResolver = new Resolver();
|
|
22
|
+
this.logger = logger ?? getDefaultLogger();
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Resolve HTTPS resource records for a hostname.
|
|
26
|
+
*
|
|
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.
|
|
30
|
+
*/
|
|
31
|
+
async resolve(hostname, signal) {
|
|
32
|
+
try {
|
|
33
|
+
let svcbRecords;
|
|
34
|
+
if (this.dohResolver) {
|
|
35
|
+
svcbRecords = await this.resolveViaDoH(hostname, signal);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
svcbRecords = await this.resolveViaSystem(hostname);
|
|
39
|
+
}
|
|
40
|
+
if (svcbRecords.length === 0)
|
|
41
|
+
return null;
|
|
42
|
+
svcbRecords.sort((a, b) => a.priority - b.priority);
|
|
43
|
+
const serviceRecords = svcbRecords.filter((r) => r.priority > 0);
|
|
44
|
+
if (serviceRecords.length === 0)
|
|
45
|
+
return null;
|
|
46
|
+
const best = serviceRecords[0];
|
|
47
|
+
const addresses = [];
|
|
48
|
+
for (const rec of serviceRecords) {
|
|
49
|
+
if (rec.ipv4Hints) {
|
|
50
|
+
for (const addr of rec.ipv4Hints) {
|
|
51
|
+
addresses.push({ address: addr, family: 4 });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (rec.ipv6Hints) {
|
|
55
|
+
for (const addr of rec.ipv6Hints) {
|
|
56
|
+
addresses.push({ address: addr, family: 6 });
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const echRecord = serviceRecords.find((r) => r.echConfigList);
|
|
61
|
+
return {
|
|
62
|
+
svcb: svcbRecords,
|
|
63
|
+
echConfigList: echRecord?.echConfigList,
|
|
64
|
+
alpn: best.alpn,
|
|
65
|
+
addresses,
|
|
66
|
+
port: best.port,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
this.logger.debug("HTTPS RR resolution failed", err instanceof Error ? err.message : String(err));
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
async resolveViaDoH(hostname, signal) {
|
|
75
|
+
const records = await this.dohResolver.query(hostname, "HTTPS", signal);
|
|
76
|
+
return records.filter((r) => r.type === RTYPE.HTTPS || r.type === RTYPE.SVCB).map((r) => parseSVCBRecord(r.data));
|
|
77
|
+
}
|
|
78
|
+
async resolveViaSystem(hostname) {
|
|
79
|
+
try {
|
|
80
|
+
const resolver = this.systemResolver;
|
|
81
|
+
const results = await resolver.resolve(hostname, "HTTPS").catch(() => []);
|
|
82
|
+
if (Array.isArray(results) && results.length > 0) {
|
|
83
|
+
return results.map((r) => this.parseNativeHTTPSRecord(r));
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
this.logger.debug("System HTTPS RR lookup unsupported", err instanceof Error ? err.message : String(err));
|
|
88
|
+
}
|
|
89
|
+
return [];
|
|
90
|
+
}
|
|
91
|
+
parseNativeHTTPSRecord(record) {
|
|
92
|
+
const result = {
|
|
93
|
+
priority: record.priority ?? 0,
|
|
94
|
+
target: record.target ?? "",
|
|
95
|
+
};
|
|
96
|
+
if (record.alpn)
|
|
97
|
+
result.alpn = Array.isArray(record.alpn) ? record.alpn : [record.alpn];
|
|
98
|
+
if (record.port)
|
|
99
|
+
result.port = record.port;
|
|
100
|
+
if (record.ipv4hint)
|
|
101
|
+
result.ipv4Hints = Array.isArray(record.ipv4hint) ? record.ipv4hint : [record.ipv4hint];
|
|
102
|
+
if (record.ipv6hint)
|
|
103
|
+
result.ipv6Hints = Array.isArray(record.ipv6hint) ? record.ipv6hint : [record.ipv6hint];
|
|
104
|
+
if (record.ech)
|
|
105
|
+
result.echConfigList = Buffer.isBuffer(record.ech) ? record.ech : Buffer.from(record.ech, "base64");
|
|
106
|
+
return result;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=https-rr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"https-rr.js","sourceRoot":"","sources":["../../src/dns/https-rr.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/** Resolved IP address with protocol family. */
|
|
2
|
+
export interface ResolvedAddress {
|
|
3
|
+
/** IP address string. */
|
|
4
|
+
address: string;
|
|
5
|
+
/** Internet protocol family — 4 for IPv4, 6 for IPv6. */
|
|
6
|
+
family: 4 | 6;
|
|
7
|
+
}
|
|
8
|
+
/** Supported DNS resource record type names. */
|
|
9
|
+
export type DNSRecordType = "A" | "AAAA" | "HTTPS" | "SVCB";
|
|
10
|
+
/** Parsed DNS resource record. */
|
|
11
|
+
export interface DNSRecord {
|
|
12
|
+
/** Domain name the record belongs to. */
|
|
13
|
+
name: string;
|
|
14
|
+
/** Numeric record type (matches RTYPE constants). */
|
|
15
|
+
type: number;
|
|
16
|
+
/** Time-to-live in seconds. */
|
|
17
|
+
ttl: number;
|
|
18
|
+
/** Raw record data. */
|
|
19
|
+
data: Buffer;
|
|
20
|
+
}
|
|
21
|
+
/** Numeric DNS record type constants. */
|
|
22
|
+
export declare const RTYPE: {
|
|
23
|
+
readonly A: 1;
|
|
24
|
+
readonly AAAA: 28;
|
|
25
|
+
readonly HTTPS: 65;
|
|
26
|
+
readonly SVCB: 64;
|
|
27
|
+
};
|
|
28
|
+
/** DNS record class constants. */
|
|
29
|
+
export declare const RCLASS: {
|
|
30
|
+
readonly IN: 1;
|
|
31
|
+
};
|
|
32
|
+
/** SVCB/HTTPS service parameter key constants. */
|
|
33
|
+
export declare const SvcParamKey: {
|
|
34
|
+
readonly MANDATORY: 0;
|
|
35
|
+
readonly ALPN: 1;
|
|
36
|
+
readonly NO_DEFAULT_ALPN: 2;
|
|
37
|
+
readonly PORT: 3;
|
|
38
|
+
readonly IPV4HINT: 4;
|
|
39
|
+
readonly ECH: 5;
|
|
40
|
+
readonly IPV6HINT: 6;
|
|
41
|
+
readonly DOHPATH: 7;
|
|
42
|
+
};
|
|
43
|
+
/** Parsed SVCB/HTTPS DNS resource record. */
|
|
44
|
+
export interface SVCBRecord {
|
|
45
|
+
/** Record priority — 0 indicates an alias record. */
|
|
46
|
+
priority: number;
|
|
47
|
+
/** Target domain name for the service. */
|
|
48
|
+
target: string;
|
|
49
|
+
/** Supported ALPN protocol identifiers. */
|
|
50
|
+
alpn?: string[];
|
|
51
|
+
/** Alternate port for the service. */
|
|
52
|
+
port?: number;
|
|
53
|
+
/** IPv4 address hints for the service. */
|
|
54
|
+
ipv4Hints?: string[];
|
|
55
|
+
/** IPv6 address hints for the service. */
|
|
56
|
+
ipv6Hints?: string[];
|
|
57
|
+
/** Encrypted Client Hello configuration list. */
|
|
58
|
+
echConfigList?: Buffer;
|
|
59
|
+
/** Whether the default ALPN should not be used. */
|
|
60
|
+
noDefaultAlpn?: boolean;
|
|
61
|
+
}
|
|
62
|
+
/** Configuration for a DNS-over-HTTPS resolver. */
|
|
63
|
+
export interface DoHConfig {
|
|
64
|
+
/** DoH server URL (e.g. "https://cloudflare-dns.com/dns-query"). */
|
|
65
|
+
server: string;
|
|
66
|
+
/** HTTP method to use for queries. */
|
|
67
|
+
method?: "GET" | "POST";
|
|
68
|
+
/** Query timeout in milliseconds. */
|
|
69
|
+
timeout?: number;
|
|
70
|
+
/** Whether to use system DNS to bootstrap the DoH server address. */
|
|
71
|
+
bootstrap?: boolean;
|
|
72
|
+
/** DNS cache configuration. */
|
|
73
|
+
cache?: import("./cache.js").DNSCacheConfig;
|
|
74
|
+
}
|
|
75
|
+
/** Top-level DNS resolver configuration. */
|
|
76
|
+
export interface DNSConfig {
|
|
77
|
+
/** DNS-over-HTTPS resolver configuration. */
|
|
78
|
+
doh?: DoHConfig;
|
|
79
|
+
/** Whether to query HTTPS resource records for ECH and ALPN hints. */
|
|
80
|
+
httpsRR?: boolean;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** Numeric DNS record type constants. */
|
|
2
|
+
export const RTYPE = {
|
|
3
|
+
A: 1,
|
|
4
|
+
AAAA: 28,
|
|
5
|
+
HTTPS: 65,
|
|
6
|
+
SVCB: 64,
|
|
7
|
+
};
|
|
8
|
+
/** DNS record class constants. */
|
|
9
|
+
export const RCLASS = {
|
|
10
|
+
IN: 1,
|
|
11
|
+
};
|
|
12
|
+
/** SVCB/HTTPS service parameter key constants. */
|
|
13
|
+
export const SvcParamKey = {
|
|
14
|
+
MANDATORY: 0,
|
|
15
|
+
ALPN: 1,
|
|
16
|
+
NO_DEFAULT_ALPN: 2,
|
|
17
|
+
PORT: 3,
|
|
18
|
+
IPV4HINT: 4,
|
|
19
|
+
ECH: 5,
|
|
20
|
+
IPV6HINT: 6,
|
|
21
|
+
DOHPATH: 7,
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -5,27 +5,19 @@ import { safariLatest } from "./profiles/safari.js";
|
|
|
5
5
|
import { edgeLatest } from "./profiles/edge.js";
|
|
6
6
|
import { torLatest } from "./profiles/tor.js";
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
9
|
-
* Returns the latest version of the named browser when given a bare browser
|
|
10
|
-
* family name (e.g. `"chrome"`, `"firefox"`).
|
|
8
|
+
* Retrieve a browser profile by name.
|
|
11
9
|
*
|
|
12
|
-
* @param {string} name - Profile
|
|
13
|
-
* @returns {BrowserProfile|undefined}
|
|
14
|
-
*
|
|
15
|
-
* @example
|
|
16
|
-
* const profile = getProfile('chrome136');
|
|
17
|
-
* const latest = getProfile('chrome'); // resolves to the latest Chrome profile
|
|
10
|
+
* @param {string} name - Profile name (case-insensitive, dashes and spaces ignored).
|
|
11
|
+
* @returns {BrowserProfile|undefined} Matching browser profile, or `undefined` if not found.
|
|
18
12
|
*/
|
|
19
13
|
export declare function getProfile(name: string): BrowserProfile | undefined;
|
|
20
14
|
/**
|
|
21
|
-
*
|
|
22
|
-
* (e.g. `["chrome120", "chrome124", "firefox120", ...]`). Use these names
|
|
23
|
-
* with {@link getProfile} or the `impersonate` request option.
|
|
15
|
+
* List all available browser profile names.
|
|
24
16
|
*
|
|
25
|
-
* @returns {string[]}
|
|
17
|
+
* @returns {string[]} Sorted array of profile name strings.
|
|
26
18
|
*/
|
|
27
19
|
export declare function listProfiles(): string[];
|
|
28
|
-
/**
|
|
20
|
+
/** Default browser profile used when none is specified. */
|
|
29
21
|
export declare const DEFAULT_PROFILE: BrowserProfile;
|
|
30
22
|
export { chromeLatest, firefoxLatest, safariLatest, edgeLatest, torLatest };
|
|
31
23
|
export type { BrowserProfile } from "./types.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/fingerprints/database.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAkB,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAmB,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAkB,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAgB,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAe,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAU3D
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/fingerprints/database.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAkB,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAmB,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAkB,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAgB,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAe,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAU3D;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAoBnE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,IAAI,MAAM,EAAE,CAEvC;AAED,2DAA2D;AAC3D,eAAO,MAAM,eAAe,EAAE,cAA6B,CAAC;AAE5D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;AAC5E,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -10,16 +10,10 @@ for (const source of [chromeProfiles, firefoxProfiles, safariProfiles, edgeProfi
|
|
|
10
10
|
}
|
|
11
11
|
}
|
|
12
12
|
/**
|
|
13
|
-
*
|
|
14
|
-
* Returns the latest version of the named browser when given a bare browser
|
|
15
|
-
* family name (e.g. `"chrome"`, `"firefox"`).
|
|
13
|
+
* Retrieve a browser profile by name.
|
|
16
14
|
*
|
|
17
|
-
* @param {string} name - Profile
|
|
18
|
-
* @returns {BrowserProfile|undefined}
|
|
19
|
-
*
|
|
20
|
-
* @example
|
|
21
|
-
* const profile = getProfile('chrome136');
|
|
22
|
-
* const latest = getProfile('chrome'); // resolves to the latest Chrome profile
|
|
15
|
+
* @param {string} name - Profile name (case-insensitive, dashes and spaces ignored).
|
|
16
|
+
* @returns {BrowserProfile|undefined} Matching browser profile, or `undefined` if not found.
|
|
23
17
|
*/
|
|
24
18
|
export function getProfile(name) {
|
|
25
19
|
const lower = name.toLowerCase().replace(/[-\s]/g, "");
|
|
@@ -42,16 +36,14 @@ export function getProfile(name) {
|
|
|
42
36
|
}
|
|
43
37
|
}
|
|
44
38
|
/**
|
|
45
|
-
*
|
|
46
|
-
* (e.g. `["chrome120", "chrome124", "firefox120", ...]`). Use these names
|
|
47
|
-
* with {@link getProfile} or the `impersonate` request option.
|
|
39
|
+
* List all available browser profile names.
|
|
48
40
|
*
|
|
49
|
-
* @returns {string[]}
|
|
41
|
+
* @returns {string[]} Sorted array of profile name strings.
|
|
50
42
|
*/
|
|
51
43
|
export function listProfiles() {
|
|
52
44
|
return [...allProfiles.keys()].sort();
|
|
53
45
|
}
|
|
54
|
-
/**
|
|
46
|
+
/** Default browser profile used when none is specified. */
|
|
55
47
|
export const DEFAULT_PROFILE = chromeLatest;
|
|
56
48
|
export { chromeLatest, firefoxLatest, safariLatest, edgeLatest, torLatest };
|
|
57
49
|
//# sourceMappingURL=database.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/fingerprints/database.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE3D,MAAM,WAAW,GAAG,IAAI,GAAG,EAA0B,CAAC;AAEtD,KAAK,MAAM,MAAM,IAAI,CAAC,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,YAAY,EAAE,WAAW,CAAC,EAAE,CAAC;IAClG,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,MAAM,EAAE,CAAC;QACpC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC;AACH,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/fingerprints/database.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE3D,MAAM,WAAW,GAAG,IAAI,GAAG,EAA0B,CAAC;AAEtD,KAAK,MAAM,MAAM,IAAI,CAAC,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,YAAY,EAAE,WAAW,CAAC,EAAE,CAAC;IAClG,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,MAAM,EAAE,CAAC;QACpC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAEvD,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,QAAQ;YACX,OAAO,YAAY,CAAC;QACtB,KAAK,SAAS;YACZ,OAAO,aAAa,CAAC;QACvB,KAAK,QAAQ;YACX,OAAO,YAAY,CAAC;QACtB,KAAK,MAAM;YACT,OAAO,UAAU,CAAC;QACpB,KAAK,KAAK;YACR,OAAO,SAAS,CAAC;QACnB;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACxC,CAAC;AAED,2DAA2D;AAC3D,MAAM,CAAC,MAAM,eAAe,GAAmB,YAAY,CAAC;AAE5D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC"}
|