nlcurl 0.12.2 → 0.14.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.
Files changed (92) hide show
  1. package/README.md +4 -15
  2. package/dist/cookies/psl-data.d.ts +2 -2
  3. package/dist/cookies/psl-data.d.ts.map +1 -1
  4. package/dist/cookies/psl-data.js +8 -2
  5. package/dist/cookies/psl-data.js.map +1 -1
  6. package/dist/dns/types.d.ts +0 -2
  7. package/dist/dns/types.d.ts.map +1 -1
  8. package/dist/dns/types.js.map +1 -1
  9. package/dist/fingerprints/extensions.d.ts +0 -6
  10. package/dist/fingerprints/extensions.d.ts.map +1 -1
  11. package/dist/fingerprints/extensions.js +0 -8
  12. package/dist/fingerprints/extensions.js.map +1 -1
  13. package/dist/fingerprints/ja3.d.ts +0 -14
  14. package/dist/fingerprints/ja3.d.ts.map +1 -1
  15. package/dist/fingerprints/ja3.js +0 -35
  16. package/dist/fingerprints/ja3.js.map +1 -1
  17. package/dist/http/h1/encoder.d.ts +0 -11
  18. package/dist/http/h1/encoder.d.ts.map +1 -1
  19. package/dist/http/h1/encoder.js +0 -51
  20. package/dist/http/h1/encoder.js.map +1 -1
  21. package/dist/http/h2/frames.d.ts +0 -19
  22. package/dist/http/h2/frames.d.ts.map +1 -1
  23. package/dist/http/h2/frames.js +0 -32
  24. package/dist/http/h2/frames.js.map +1 -1
  25. package/dist/index.d.ts +0 -12
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +0 -12
  28. package/dist/index.js.map +1 -1
  29. package/dist/tls/constants.d.ts +0 -7
  30. package/dist/tls/constants.d.ts.map +1 -1
  31. package/dist/tls/constants.js +0 -9
  32. package/dist/tls/constants.js.map +1 -1
  33. package/dist/tls/ech.d.ts.map +1 -1
  34. package/dist/tls/ech.js +0 -1
  35. package/dist/tls/ech.js.map +1 -1
  36. package/dist/tls/keylog.d.ts +0 -15
  37. package/dist/tls/keylog.d.ts.map +1 -1
  38. package/dist/tls/keylog.js +0 -19
  39. package/dist/tls/keylog.js.map +1 -1
  40. package/dist/tls/stealth/handshake.d.ts +0 -11
  41. package/dist/tls/stealth/handshake.d.ts.map +1 -1
  42. package/dist/tls/stealth/handshake.js +0 -17
  43. package/dist/tls/stealth/handshake.js.map +1 -1
  44. package/package.json +3 -3
  45. package/dist/cache/groups.d.ts +0 -75
  46. package/dist/cache/groups.d.ts.map +0 -1
  47. package/dist/cache/groups.js +0 -118
  48. package/dist/cache/groups.js.map +0 -1
  49. package/dist/cache/no-vary-search.d.ts +0 -33
  50. package/dist/cache/no-vary-search.d.ts.map +0 -1
  51. package/dist/cache/no-vary-search.js +0 -148
  52. package/dist/cache/no-vary-search.js.map +0 -1
  53. package/dist/cache/range.d.ts +0 -120
  54. package/dist/cache/range.d.ts.map +0 -1
  55. package/dist/cache/range.js +0 -192
  56. package/dist/cache/range.js.map +0 -1
  57. package/dist/dns/dot-resolver.d.ts +0 -89
  58. package/dist/dns/dot-resolver.d.ts.map +0 -1
  59. package/dist/dns/dot-resolver.js +0 -166
  60. package/dist/dns/dot-resolver.js.map +0 -1
  61. package/dist/http/resumable-upload.d.ts +0 -76
  62. package/dist/http/resumable-upload.d.ts.map +0 -1
  63. package/dist/http/resumable-upload.js +0 -104
  64. package/dist/http/resumable-upload.js.map +0 -1
  65. package/dist/http/trailers.d.ts +0 -29
  66. package/dist/http/trailers.d.ts.map +0 -1
  67. package/dist/http/trailers.js +0 -57
  68. package/dist/http/trailers.js.map +0 -1
  69. package/dist/middleware/circuit-breaker.d.ts +0 -44
  70. package/dist/middleware/circuit-breaker.d.ts.map +0 -1
  71. package/dist/middleware/circuit-breaker.js +0 -96
  72. package/dist/middleware/circuit-breaker.js.map +0 -1
  73. package/dist/tls/ct.d.ts +0 -78
  74. package/dist/tls/ct.d.ts.map +0 -1
  75. package/dist/tls/ct.js +0 -175
  76. package/dist/tls/ct.js.map +0 -1
  77. package/dist/tls/early-data.d.ts +0 -45
  78. package/dist/tls/early-data.d.ts.map +0 -1
  79. package/dist/tls/early-data.js +0 -46
  80. package/dist/tls/early-data.js.map +0 -1
  81. package/dist/tls/ocsp.d.ts +0 -55
  82. package/dist/tls/ocsp.d.ts.map +0 -1
  83. package/dist/tls/ocsp.js +0 -131
  84. package/dist/tls/ocsp.js.map +0 -1
  85. package/dist/utils/dictionary-transport.d.ts +0 -97
  86. package/dist/utils/dictionary-transport.d.ts.map +0 -1
  87. package/dist/utils/dictionary-transport.js +0 -171
  88. package/dist/utils/dictionary-transport.js.map +0 -1
  89. package/dist/utils/tcp-fast-open.d.ts +0 -30
  90. package/dist/utils/tcp-fast-open.d.ts.map +0 -1
  91. package/dist/utils/tcp-fast-open.js +0 -36
  92. package/dist/utils/tcp-fast-open.js.map +0 -1
@@ -1,120 +0,0 @@
1
- /**
2
- * Parsed Content-Range header fields.
3
- */
4
- export interface ContentRange {
5
- unit: string;
6
- start: number;
7
- end: number;
8
- total: number;
9
- }
10
- /**
11
- * A contiguous byte range segment stored in cache.
12
- */
13
- export interface RangeSegment {
14
- start: number;
15
- end: number;
16
- data: Buffer;
17
- etag?: string;
18
- storedAt: number;
19
- }
20
- /**
21
- * Represents all cached range segments for a given URL.
22
- */
23
- export interface RangeCacheEntry {
24
- url: string;
25
- segments: RangeSegment[];
26
- totalSize: number;
27
- etag?: string;
28
- lastModified?: string;
29
- }
30
- /**
31
- * Parses a Content-Range header value into its component fields.
32
- *
33
- * @param {string} header - The raw Content-Range header value.
34
- * @returns {ContentRange|null} The parsed range, or `null` if the header is malformed.
35
- */
36
- export declare function parseContentRange(header: string): ContentRange | null;
37
- /**
38
- * Parses a Range request header into an array of byte ranges.
39
- *
40
- * @param {string} header - The raw Range header value (e.g. "bytes=0-499,1000-1499").
41
- * @returns {Array<[number, number|undefined]>|null} Parsed ranges, or `null` if invalid.
42
- */
43
- export declare function parseRangeHeader(header: string): Array<[number, number | undefined]> | null;
44
- /**
45
- * Caches partial HTTP responses (206 Partial Content) and reassembles
46
- * byte ranges on subsequent lookups.
47
- *
48
- * @class
49
- */
50
- export declare class RangeCache {
51
- private readonly entries;
52
- private readonly maxEntries;
53
- private readonly maxSegmentsPerEntry;
54
- /**
55
- * Creates a new RangeCache.
56
- *
57
- * @param {Object} [config] - Optional cache limits.
58
- * @param {number} [config.maxEntries=200] - Maximum number of URLs to cache.
59
- * @param {number} [config.maxSegmentsPerEntry=100] - Maximum segments per URL.
60
- */
61
- constructor(config?: {
62
- maxEntries?: number;
63
- maxSegmentsPerEntry?: number;
64
- });
65
- /**
66
- * Stores a range segment for the given URL.
67
- *
68
- * @param {string} url - The resource URL.
69
- * @param {ContentRange} range - The content range descriptor.
70
- * @param {Buffer} data - The response body bytes for this range.
71
- * @param {Object} [meta] - Optional metadata.
72
- * @param {string} [meta.etag] - The entity tag for cache coherence.
73
- * @param {string} [meta.lastModified] - The Last-Modified date.
74
- */
75
- store(url: string, range: ContentRange, data: Buffer, meta?: {
76
- etag?: string;
77
- lastModified?: string;
78
- }): void;
79
- /**
80
- * Looks up cached bytes for a given byte range.
81
- *
82
- * @param {string} url - The resource URL.
83
- * @param {number} start - Start byte offset (inclusive).
84
- * @param {number} end - End byte offset (inclusive).
85
- * @returns {Buffer|null} The cached bytes, or `null` on a miss.
86
- */
87
- lookup(url: string, start: number, end: number): Buffer | null;
88
- /**
89
- * Checks whether all bytes for a URL have been cached.
90
- *
91
- * @param {string} url - The resource URL.
92
- * @returns {boolean} `true` if the full resource is cached.
93
- */
94
- isComplete(url: string): boolean;
95
- /**
96
- * Returns the range cache entry for a URL, if present.
97
- *
98
- * @param {string} url - The resource URL.
99
- * @returns {RangeCacheEntry|undefined} The cached entry.
100
- */
101
- get(url: string): RangeCacheEntry | undefined;
102
- /**
103
- * Removes the cache entry for a URL.
104
- *
105
- * @param {string} url - The resource URL to evict.
106
- * @returns {boolean} `true` if an entry was removed.
107
- */
108
- delete(url: string): boolean;
109
- /**
110
- * Removes all cached range entries.
111
- */
112
- clear(): void;
113
- /**
114
- * Returns the number of URLs with cached ranges.
115
- *
116
- * @returns {number} The entry count.
117
- */
118
- get size(): number;
119
- }
120
- //# sourceMappingURL=range.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"range.d.ts","sourceRoot":"","sources":["../../src/cache/range.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAarE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,GAAG,IAAI,CA2B3F;AAED;;;;;GAKG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsC;IAC9D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAE7C;;;;;;OAMG;gBACS,MAAM,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;KAAE;IAK1E;;;;;;;;;OASG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IA0C5G;;;;;;;OAOG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAe9D;;;;;OAKG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAYhC;;;;;OAKG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAI7C;;;;;OAKG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI5B;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;;;OAIG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
@@ -1,192 +0,0 @@
1
- /**
2
- * Parses a Content-Range header value into its component fields.
3
- *
4
- * @param {string} header - The raw Content-Range header value.
5
- * @returns {ContentRange|null} The parsed range, or `null` if the header is malformed.
6
- */
7
- export function parseContentRange(header) {
8
- const match = header.match(/^(\w+)\s+(\d+)-(\d+)\/(\d+|\*)/);
9
- if (!match)
10
- return null;
11
- const unit = match[1];
12
- const start = parseInt(match[2], 10);
13
- const end = parseInt(match[3], 10);
14
- const total = match[4] === "*" ? -1 : parseInt(match[4], 10);
15
- if (start > end)
16
- return null;
17
- if (total !== -1 && end >= total)
18
- return null;
19
- return { unit, start, end, total };
20
- }
21
- /**
22
- * Parses a Range request header into an array of byte ranges.
23
- *
24
- * @param {string} header - The raw Range header value (e.g. "bytes=0-499,1000-1499").
25
- * @returns {Array<[number, number|undefined]>|null} Parsed ranges, or `null` if invalid.
26
- */
27
- export function parseRangeHeader(header) {
28
- const match = header.match(/^bytes=(.+)/);
29
- if (!match)
30
- return null;
31
- const ranges = [];
32
- const parts = match[1].split(",");
33
- for (const part of parts) {
34
- const trimmed = part.trim();
35
- const dashIdx = trimmed.indexOf("-");
36
- if (dashIdx === -1)
37
- return null;
38
- const startStr = trimmed.substring(0, dashIdx);
39
- const endStr = trimmed.substring(dashIdx + 1);
40
- if (startStr === "" && endStr === "")
41
- return null;
42
- const start = startStr === "" ? -parseInt(endStr, 10) : parseInt(startStr, 10);
43
- const end = endStr === "" ? undefined : parseInt(endStr, 10);
44
- if (Number.isNaN(start))
45
- return null;
46
- if (end !== undefined && Number.isNaN(end))
47
- return null;
48
- ranges.push([start, end]);
49
- }
50
- return ranges.length > 0 ? ranges : null;
51
- }
52
- /**
53
- * Caches partial HTTP responses (206 Partial Content) and reassembles
54
- * byte ranges on subsequent lookups.
55
- *
56
- * @class
57
- */
58
- export class RangeCache {
59
- entries = new Map();
60
- maxEntries;
61
- maxSegmentsPerEntry;
62
- /**
63
- * Creates a new RangeCache.
64
- *
65
- * @param {Object} [config] - Optional cache limits.
66
- * @param {number} [config.maxEntries=200] - Maximum number of URLs to cache.
67
- * @param {number} [config.maxSegmentsPerEntry=100] - Maximum segments per URL.
68
- */
69
- constructor(config) {
70
- this.maxEntries = config?.maxEntries ?? 200;
71
- this.maxSegmentsPerEntry = config?.maxSegmentsPerEntry ?? 100;
72
- }
73
- /**
74
- * Stores a range segment for the given URL.
75
- *
76
- * @param {string} url - The resource URL.
77
- * @param {ContentRange} range - The content range descriptor.
78
- * @param {Buffer} data - The response body bytes for this range.
79
- * @param {Object} [meta] - Optional metadata.
80
- * @param {string} [meta.etag] - The entity tag for cache coherence.
81
- * @param {string} [meta.lastModified] - The Last-Modified date.
82
- */
83
- store(url, range, data, meta) {
84
- let entry = this.entries.get(url);
85
- if (entry) {
86
- if (meta?.etag && entry.etag && meta.etag !== entry.etag) {
87
- entry.segments = [];
88
- entry.etag = meta.etag;
89
- }
90
- }
91
- else {
92
- if (this.entries.size >= this.maxEntries) {
93
- const firstKey = this.entries.keys().next().value;
94
- if (firstKey)
95
- this.entries.delete(firstKey);
96
- }
97
- entry = {
98
- url,
99
- segments: [],
100
- totalSize: range.total,
101
- etag: meta?.etag,
102
- lastModified: meta?.lastModified,
103
- };
104
- this.entries.set(url, entry);
105
- }
106
- if (range.total !== -1) {
107
- entry.totalSize = range.total;
108
- }
109
- entry.segments = entry.segments.filter((s) => s.end < range.start || s.start > range.end);
110
- if (entry.segments.length < this.maxSegmentsPerEntry) {
111
- entry.segments.push({
112
- start: range.start,
113
- end: range.end,
114
- data: Buffer.from(data),
115
- etag: meta?.etag,
116
- storedAt: Date.now(),
117
- });
118
- entry.segments.sort((a, b) => a.start - b.start);
119
- }
120
- }
121
- /**
122
- * Looks up cached bytes for a given byte range.
123
- *
124
- * @param {string} url - The resource URL.
125
- * @param {number} start - Start byte offset (inclusive).
126
- * @param {number} end - End byte offset (inclusive).
127
- * @returns {Buffer|null} The cached bytes, or `null` on a miss.
128
- */
129
- lookup(url, start, end) {
130
- const entry = this.entries.get(url);
131
- if (!entry)
132
- return null;
133
- const segment = entry.segments.find((s) => s.start <= start && s.end >= end);
134
- if (segment) {
135
- const offsetStart = start - segment.start;
136
- const offsetEnd = end - segment.start + 1;
137
- return segment.data.subarray(offsetStart, offsetEnd);
138
- }
139
- return null;
140
- }
141
- /**
142
- * Checks whether all bytes for a URL have been cached.
143
- *
144
- * @param {string} url - The resource URL.
145
- * @returns {boolean} `true` if the full resource is cached.
146
- */
147
- isComplete(url) {
148
- const entry = this.entries.get(url);
149
- if (!entry || entry.totalSize <= 0)
150
- return false;
151
- let covered = 0;
152
- for (const segment of entry.segments) {
153
- if (segment.start > covered)
154
- return false;
155
- covered = Math.max(covered, segment.end + 1);
156
- }
157
- return covered >= entry.totalSize;
158
- }
159
- /**
160
- * Returns the range cache entry for a URL, if present.
161
- *
162
- * @param {string} url - The resource URL.
163
- * @returns {RangeCacheEntry|undefined} The cached entry.
164
- */
165
- get(url) {
166
- return this.entries.get(url);
167
- }
168
- /**
169
- * Removes the cache entry for a URL.
170
- *
171
- * @param {string} url - The resource URL to evict.
172
- * @returns {boolean} `true` if an entry was removed.
173
- */
174
- delete(url) {
175
- return this.entries.delete(url);
176
- }
177
- /**
178
- * Removes all cached range entries.
179
- */
180
- clear() {
181
- this.entries.clear();
182
- }
183
- /**
184
- * Returns the number of URLs with cached ranges.
185
- *
186
- * @returns {number} The entry count.
187
- */
188
- get size() {
189
- return this.entries.size;
190
- }
191
- }
192
- //# sourceMappingURL=range.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"range.js","sourceRoot":"","sources":["../../src/cache/range.ts"],"names":[],"mappings":"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"}
@@ -1,89 +0,0 @@
1
- import { RTYPE, type DNSRecord } from "./types.js";
2
- type RTYPEValue = (typeof RTYPE)[keyof typeof RTYPE];
3
- /** Configuration for a DNS-over-TLS resolver. */
4
- export interface DoTConfig {
5
- /** DoT server IP address or hostname. */
6
- server?: string;
7
- /** Server port (default 853). */
8
- port?: number;
9
- /** TLS server name for certificate verification. */
10
- servername?: string;
11
- /** Query timeout in milliseconds. */
12
- timeout?: number;
13
- /** Whether to reuse the TLS connection across queries. */
14
- keepAlive?: boolean;
15
- /** Whether to skip TLS certificate verification. */
16
- insecure?: boolean;
17
- }
18
- /** Pre-configured DNS-over-TLS server entries. */
19
- export declare const DOT_SERVERS: {
20
- readonly cloudflare: {
21
- readonly server: "1.1.1.1";
22
- readonly servername: "cloudflare-dns.com";
23
- };
24
- readonly "cloudflare-ipv6": {
25
- readonly server: "2606:4700:4700::1111";
26
- readonly servername: "cloudflare-dns.com";
27
- };
28
- readonly google: {
29
- readonly server: "8.8.8.8";
30
- readonly servername: "dns.google";
31
- };
32
- readonly "google-ipv6": {
33
- readonly server: "2001:4860:4860::8888";
34
- readonly servername: "dns.google";
35
- };
36
- readonly quad9: {
37
- readonly server: "9.9.9.9";
38
- readonly servername: "dns.quad9.net";
39
- };
40
- readonly adguard: {
41
- readonly server: "94.140.14.14";
42
- readonly servername: "dns.adguard-dns.com";
43
- };
44
- };
45
- /** DNS-over-TLS resolver using a persistent TLS connection. */
46
- export declare class DoTResolver {
47
- private readonly server;
48
- private readonly port;
49
- private readonly servername;
50
- private readonly timeout;
51
- private readonly insecure;
52
- private readonly keepAlive;
53
- private socket;
54
- private connected;
55
- /**
56
- * Create a new DoT resolver.
57
- *
58
- * @param {DoTConfig} [config] - DoT connection configuration.
59
- */
60
- constructor(config?: DoTConfig);
61
- /**
62
- * Resolve a domain name to DNS records over TLS.
63
- *
64
- * @param {string} name - Domain name to resolve.
65
- * @param {RTYPEValue} [type] - Numeric record type (defaults to A).
66
- * @returns {Promise<DNSRecord[]>} Array of parsed DNS records.
67
- */
68
- resolve(name: string, type?: RTYPEValue): Promise<DNSRecord[]>;
69
- /**
70
- * Resolve a domain name to IPv4 addresses.
71
- *
72
- * @param {string} name - Domain name to resolve.
73
- * @returns {Promise<string[]>} Array of IPv4 address strings.
74
- */
75
- resolve4(name: string): Promise<string[]>;
76
- /**
77
- * Resolve a domain name to IPv6 addresses.
78
- *
79
- * @param {string} name - Domain name to resolve.
80
- * @returns {Promise<string[]>} Array of IPv6 address strings.
81
- */
82
- resolve6(name: string): Promise<string[]>;
83
- /** Close the underlying TLS socket and release resources. */
84
- close(): void;
85
- private send;
86
- private getSocket;
87
- }
88
- export {};
89
- //# sourceMappingURL=dot-resolver.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dot-resolver.d.ts","sourceRoot":"","sources":["../../src/dns/dot-resolver.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAEnD,KAAK,UAAU,GAAG,CAAC,OAAO,KAAK,CAAC,CAAC,MAAM,OAAO,KAAK,CAAC,CAAC;AAErD,iDAAiD;AACjD,MAAM,WAAW,SAAS;IACxB,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,oDAAoD;IACpD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,kDAAkD;AAClD,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;CAOd,CAAC;AAEX,+DAA+D;AAC/D,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAU;IACpC,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,SAAS,CAAS;IAE1B;;;;OAIG;gBACS,MAAM,CAAC,EAAE,SAAS;IAS9B;;;;;;OAMG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,UAAoB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAkB7E;;;;;OAKG;IACG,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAK/C;;;;;OAKG;IACG,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAa/C,6DAA6D;IAC7D,KAAK,IAAI,IAAI;YAQC,IAAI;YAqDJ,SAAS;CAiCxB"}
@@ -1,166 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"dot-resolver.js","sourceRoot":"","sources":["../../src/dns/dot-resolver.ts"],"names":[],"mappings":"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"}
@@ -1,76 +0,0 @@
1
- /** State of a resumable upload session. */
2
- export interface UploadSession {
3
- /** Server-assigned upload URL. */
4
- uploadUrl: string;
5
- /** Number of bytes already uploaded. */
6
- offset: number;
7
- /** Total size of the upload in bytes. */
8
- totalSize: number;
9
- /** Whether the upload has been completed. */
10
- complete: boolean;
11
- /** Timestamp when the session was created. */
12
- createdAt: number;
13
- }
14
- /** Configuration for resumable upload operations. */
15
- export interface ResumableUploadConfig {
16
- /** Size of each upload chunk in bytes. */
17
- chunkSize?: number;
18
- /** Maximum number of retry attempts per chunk. */
19
- maxRetries?: number;
20
- /** Progress callback invoked after each chunk. */
21
- onProgress?: (offset: number, total: number) => void;
22
- }
23
- /**
24
- * Build headers for initiating a new resumable upload.
25
- *
26
- * @param {number} totalSize - Total upload size in bytes.
27
- * @param {string} [contentType] - MIME type of the upload content.
28
- * @returns {Record<string, string>} Header record for the upload creation request.
29
- */
30
- export declare function buildUploadCreationHeaders(totalSize: number, contentType?: string): Record<string, string>;
31
- /**
32
- * Build headers for resuming an upload at a given offset.
33
- *
34
- * @param {number} offset - Byte offset to resume from.
35
- * @param {number} chunkSize - Size of the chunk being sent.
36
- * @param {boolean} isLast - Whether this is the final chunk.
37
- * @returns {Record<string, string>} Header record for the resume request.
38
- */
39
- export declare function buildUploadResumeHeaders(offset: number, chunkSize: number, isLast: boolean): Record<string, string>;
40
- /**
41
- * Build headers for querying the current upload offset.
42
- *
43
- * @returns {Record<string, string>} Header record for the offset query request.
44
- */
45
- export declare function buildUploadOffsetHeaders(): Record<string, string>;
46
- /**
47
- * Parse the upload offset from response headers.
48
- *
49
- * @param {Record<string, string>} headers - Response headers.
50
- * @returns {number} Byte offset, or -1 if not present or invalid.
51
- */
52
- export declare function parseUploadOffset(headers: Record<string, string>): number;
53
- /**
54
- * Check whether the upload is marked as complete in response headers.
55
- *
56
- * @param {Record<string, string>} headers - Response headers.
57
- * @returns {boolean} `true` if the upload-complete header is "?1".
58
- */
59
- export declare function isUploadComplete(headers: Record<string, string>): boolean;
60
- /**
61
- * Split a buffer into offset-chunk pairs for resumable upload.
62
- *
63
- * @param {Buffer} data - Data to split.
64
- * @param {number} [chunkSize] - Maximum chunk size in bytes.
65
- * @returns {Array<[number, Buffer]>} Array of [offset, chunk] tuples.
66
- */
67
- export declare function splitIntoChunks(data: Buffer, chunkSize?: number): Array<[number, Buffer]>;
68
- /**
69
- * Extract the upload URL from response headers.
70
- *
71
- * @param {Record<string, string>} headers - Response headers.
72
- * @param {string} requestUrl - Original request URL for resolving relative locations.
73
- * @returns {string | null} Absolute upload URL, or `null` if not present.
74
- */
75
- export declare function parseUploadUrl(headers: Record<string, string>, requestUrl: string): string | null;
76
- //# sourceMappingURL=resumable-upload.d.ts.map