nlcurl 0.3.1 → 0.4.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/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +84 -90
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/index.js +25 -25
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/output.d.ts +2 -2
- package/dist/cli/output.d.ts.map +1 -1
- package/dist/cli/output.js +55 -55
- package/dist/cli/output.js.map +1 -1
- package/dist/cookies/jar.d.ts +1 -1
- package/dist/cookies/jar.d.ts.map +1 -1
- package/dist/cookies/jar.js +20 -22
- package/dist/cookies/jar.js.map +1 -1
- package/dist/cookies/parser.d.ts +1 -1
- package/dist/cookies/parser.d.ts.map +1 -1
- package/dist/cookies/parser.js +20 -22
- package/dist/cookies/parser.js.map +1 -1
- package/dist/core/client.d.ts +3 -3
- package/dist/core/client.d.ts.map +1 -1
- package/dist/core/client.js +9 -8
- package/dist/core/client.js.map +1 -1
- package/dist/core/errors.d.ts +64 -21
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +112 -36
- package/dist/core/errors.js.map +1 -1
- package/dist/core/request.d.ts +10 -5
- package/dist/core/request.d.ts.map +1 -1
- package/dist/core/response.d.ts +2 -2
- package/dist/core/response.d.ts.map +1 -1
- package/dist/core/response.js +6 -8
- package/dist/core/response.js.map +1 -1
- package/dist/core/session.d.ts +7 -6
- package/dist/core/session.d.ts.map +1 -1
- package/dist/core/session.js +58 -43
- package/dist/core/session.js.map +1 -1
- package/dist/core/validation.d.ts +96 -0
- package/dist/core/validation.d.ts.map +1 -0
- package/dist/core/validation.js +246 -0
- package/dist/core/validation.js.map +1 -0
- package/dist/fingerprints/akamai.d.ts +1 -1
- package/dist/fingerprints/akamai.d.ts.map +1 -1
- package/dist/fingerprints/akamai.js +3 -7
- package/dist/fingerprints/akamai.js.map +1 -1
- package/dist/fingerprints/database.d.ts +7 -7
- package/dist/fingerprints/database.d.ts.map +1 -1
- package/dist/fingerprints/database.js +12 -18
- package/dist/fingerprints/database.js.map +1 -1
- package/dist/fingerprints/extensions.d.ts.map +1 -1
- package/dist/fingerprints/extensions.js +4 -4
- package/dist/fingerprints/extensions.js.map +1 -1
- package/dist/fingerprints/ja3.d.ts +1 -1
- package/dist/fingerprints/ja3.d.ts.map +1 -1
- package/dist/fingerprints/ja3.js +12 -12
- package/dist/fingerprints/ja3.js.map +1 -1
- package/dist/fingerprints/profiles/chrome.d.ts +1 -1
- package/dist/fingerprints/profiles/chrome.d.ts.map +1 -1
- package/dist/fingerprints/profiles/chrome.js +59 -100
- package/dist/fingerprints/profiles/chrome.js.map +1 -1
- package/dist/fingerprints/profiles/edge.d.ts +1 -1
- package/dist/fingerprints/profiles/edge.d.ts.map +1 -1
- package/dist/fingerprints/profiles/edge.js +26 -26
- package/dist/fingerprints/profiles/edge.js.map +1 -1
- package/dist/fingerprints/profiles/firefox.d.ts +1 -1
- package/dist/fingerprints/profiles/firefox.d.ts.map +1 -1
- package/dist/fingerprints/profiles/firefox.js +35 -85
- package/dist/fingerprints/profiles/firefox.js.map +1 -1
- package/dist/fingerprints/profiles/safari.d.ts +1 -1
- package/dist/fingerprints/profiles/safari.d.ts.map +1 -1
- package/dist/fingerprints/profiles/safari.js +35 -68
- package/dist/fingerprints/profiles/safari.js.map +1 -1
- package/dist/fingerprints/profiles/tor.d.ts +1 -1
- package/dist/fingerprints/profiles/tor.d.ts.map +1 -1
- package/dist/fingerprints/profiles/tor.js +24 -57
- package/dist/fingerprints/profiles/tor.js.map +1 -1
- package/dist/fingerprints/types.d.ts +1 -1
- package/dist/fingerprints/types.d.ts.map +1 -1
- package/dist/http/h1/client.d.ts +4 -4
- package/dist/http/h1/client.d.ts.map +1 -1
- package/dist/http/h1/client.js +31 -31
- package/dist/http/h1/client.js.map +1 -1
- package/dist/http/h1/encoder.d.ts +1 -1
- package/dist/http/h1/encoder.d.ts.map +1 -1
- package/dist/http/h1/encoder.js +17 -19
- package/dist/http/h1/encoder.js.map +1 -1
- package/dist/http/h1/parser.d.ts +1 -1
- package/dist/http/h1/parser.d.ts.map +1 -1
- package/dist/http/h1/parser.js +29 -33
- package/dist/http/h1/parser.js.map +1 -1
- package/dist/http/h2/client.d.ts +5 -4
- package/dist/http/h2/client.d.ts.map +1 -1
- package/dist/http/h2/client.js +59 -71
- package/dist/http/h2/client.js.map +1 -1
- package/dist/http/h2/frames.d.ts +7 -3
- package/dist/http/h2/frames.d.ts.map +1 -1
- package/dist/http/h2/frames.js +16 -12
- package/dist/http/h2/frames.js.map +1 -1
- package/dist/http/h2/hpack.d.ts.map +1 -1
- package/dist/http/h2/hpack.js +328 -130
- package/dist/http/h2/hpack.js.map +1 -1
- package/dist/http/negotiator.d.ts +4 -4
- package/dist/http/negotiator.d.ts.map +1 -1
- package/dist/http/negotiator.js +26 -39
- package/dist/http/negotiator.js.map +1 -1
- package/dist/http/pool.d.ts +5 -5
- package/dist/http/pool.d.ts.map +1 -1
- package/dist/http/pool.js +5 -5
- package/dist/http/pool.js.map +1 -1
- package/dist/index.d.ts +16 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -9
- package/dist/index.js.map +1 -1
- package/dist/middleware/interceptor.d.ts +2 -2
- package/dist/middleware/interceptor.d.ts.map +1 -1
- package/dist/middleware/interceptor.js.map +1 -1
- package/dist/middleware/rate-limiter.d.ts.map +1 -1
- package/dist/middleware/rate-limiter.js +2 -0
- package/dist/middleware/rate-limiter.js.map +1 -1
- package/dist/middleware/retry.d.ts +6 -4
- package/dist/middleware/retry.d.ts.map +1 -1
- package/dist/middleware/retry.js +9 -7
- package/dist/middleware/retry.js.map +1 -1
- package/dist/proxy/http-proxy.d.ts +1 -1
- package/dist/proxy/http-proxy.d.ts.map +1 -1
- package/dist/proxy/http-proxy.js +14 -14
- package/dist/proxy/http-proxy.js.map +1 -1
- package/dist/proxy/socks.d.ts +1 -1
- package/dist/proxy/socks.d.ts.map +1 -1
- package/dist/proxy/socks.js +31 -27
- package/dist/proxy/socks.js.map +1 -1
- package/dist/tls/constants.d.ts.map +1 -1
- package/dist/tls/constants.js +1 -4
- package/dist/tls/constants.js.map +1 -1
- package/dist/tls/node-engine.d.ts +2 -2
- package/dist/tls/node-engine.d.ts.map +1 -1
- package/dist/tls/node-engine.js +58 -58
- package/dist/tls/node-engine.js.map +1 -1
- package/dist/tls/stealth/client-hello.d.ts +1 -1
- package/dist/tls/stealth/client-hello.d.ts.map +1 -1
- package/dist/tls/stealth/client-hello.js +8 -14
- package/dist/tls/stealth/client-hello.js.map +1 -1
- package/dist/tls/stealth/engine.d.ts +2 -2
- package/dist/tls/stealth/engine.d.ts.map +1 -1
- package/dist/tls/stealth/engine.js +23 -26
- package/dist/tls/stealth/engine.js.map +1 -1
- package/dist/tls/stealth/handshake.d.ts +3 -3
- package/dist/tls/stealth/handshake.d.ts.map +1 -1
- package/dist/tls/stealth/handshake.js +62 -74
- package/dist/tls/stealth/handshake.js.map +1 -1
- package/dist/tls/stealth/key-schedule.d.ts +2 -2
- package/dist/tls/stealth/key-schedule.d.ts.map +1 -1
- package/dist/tls/stealth/key-schedule.js +20 -20
- package/dist/tls/stealth/key-schedule.js.map +1 -1
- package/dist/tls/stealth/record-layer.d.ts +1 -1
- package/dist/tls/stealth/record-layer.d.ts.map +1 -1
- package/dist/tls/stealth/record-layer.js +13 -13
- package/dist/tls/stealth/record-layer.js.map +1 -1
- package/dist/tls/types.d.ts +4 -4
- package/dist/tls/types.d.ts.map +1 -1
- package/dist/utils/buffer-reader.d.ts.map +1 -1
- package/dist/utils/buffer-reader.js.map +1 -1
- package/dist/utils/buffer-writer.d.ts.map +1 -1
- package/dist/utils/buffer-writer.js +6 -0
- package/dist/utils/buffer-writer.js.map +1 -1
- package/dist/utils/encoding.d.ts +1 -1
- package/dist/utils/encoding.d.ts.map +1 -1
- package/dist/utils/encoding.js +23 -25
- package/dist/utils/encoding.js.map +1 -1
- package/dist/utils/logger.d.ts +48 -7
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +61 -13
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/url.d.ts.map +1 -1
- package/dist/utils/url.js +2 -2
- package/dist/utils/url.js.map +1 -1
- package/dist/ws/client.d.ts +2 -2
- package/dist/ws/client.d.ts.map +1 -1
- package/dist/ws/client.js +67 -71
- package/dist/ws/client.js.map +1 -1
- package/dist/ws/frame.d.ts.map +1 -1
- package/dist/ws/frame.js +8 -8
- package/dist/ws/frame.js.map +1 -1
- package/package.json +60 -57
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module validation
|
|
3
|
+
* @description Provides reusable runtime validation helpers for all public API
|
|
4
|
+
* entry points. Functions throw {@link NLcURLError} with code `ERR_VALIDATION`
|
|
5
|
+
* when an input fails a check. These guards protect every trust boundary
|
|
6
|
+
* between caller-supplied data and internal library logic.
|
|
7
|
+
*/
|
|
8
|
+
import { NLcURLError } from "./errors.js";
|
|
9
|
+
const VALID_METHODS = new Set(["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"]);
|
|
10
|
+
const VALID_HTTP_VERSIONS = new Set(["1.1", "2"]);
|
|
11
|
+
const VALID_DNS_FAMILIES = new Set([4, 6]);
|
|
12
|
+
const VALID_BACKOFF = new Set(["linear", "exponential"]);
|
|
13
|
+
/**
|
|
14
|
+
* Throws an `ERR_VALIDATION` error with the supplied message.
|
|
15
|
+
*
|
|
16
|
+
* @param {string} message - Description of the validation failure.
|
|
17
|
+
* @throws {NLcURLError} Always.
|
|
18
|
+
*/
|
|
19
|
+
function fail(message) {
|
|
20
|
+
throw new NLcURLError(message, "ERR_VALIDATION");
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Asserts that `value` is a non-empty string.
|
|
24
|
+
*
|
|
25
|
+
* @param {unknown} value - The value to check.
|
|
26
|
+
* @param {string} label - Parameter name for the error message.
|
|
27
|
+
* @throws {NLcURLError} If the value is not a non-empty string.
|
|
28
|
+
*/
|
|
29
|
+
export function assertNonEmptyString(value, label) {
|
|
30
|
+
if (typeof value !== "string" || value.length === 0) {
|
|
31
|
+
fail(`${label} must be a non-empty string`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Asserts that `value` is a positive finite number.
|
|
36
|
+
*
|
|
37
|
+
* @param {unknown} value - The value to check.
|
|
38
|
+
* @param {string} label - Parameter name for the error message.
|
|
39
|
+
* @throws {NLcURLError} If the value is not a positive finite number.
|
|
40
|
+
*/
|
|
41
|
+
export function assertPositiveNumber(value, label) {
|
|
42
|
+
if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) {
|
|
43
|
+
fail(`${label} must be a positive finite number`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Asserts that `value` is a non-negative finite integer.
|
|
48
|
+
*
|
|
49
|
+
* @param {unknown} value - The value to check.
|
|
50
|
+
* @param {string} label - Parameter name for the error message.
|
|
51
|
+
* @throws {NLcURLError} If the value is not a non-negative integer.
|
|
52
|
+
*/
|
|
53
|
+
export function assertNonNegativeInt(value, label) {
|
|
54
|
+
if (typeof value !== "number" || !Number.isInteger(value) || value < 0) {
|
|
55
|
+
fail(`${label} must be a non-negative integer`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Asserts that `value` is a member of the allowed set.
|
|
60
|
+
*
|
|
61
|
+
* @param {unknown} value - The value to check.
|
|
62
|
+
* @param {Set<T>} allowed - Set of permitted values.
|
|
63
|
+
* @param {string} label - Parameter name for the error message.
|
|
64
|
+
* @throws {NLcURLError} If the value is not in the allowed set.
|
|
65
|
+
*/
|
|
66
|
+
export function assertEnum(value, allowed, label) {
|
|
67
|
+
if (!allowed.has(value)) {
|
|
68
|
+
const names = [...allowed].map(String).join(", ");
|
|
69
|
+
fail(`${label} must be one of: ${names}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Asserts that `value` is a plain object (not `null`, not an array, not a
|
|
74
|
+
* class instance other than `Object`).
|
|
75
|
+
*
|
|
76
|
+
* @param {unknown} value - The value to check.
|
|
77
|
+
* @param {string} label - Parameter name for the error message.
|
|
78
|
+
* @throws {NLcURLError} If the value is not a plain object.
|
|
79
|
+
*/
|
|
80
|
+
export function assertPlainObject(value, label) {
|
|
81
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
82
|
+
fail(`${label} must be a plain object`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Validates the URL string and its protocol for HTTP requests.
|
|
87
|
+
*
|
|
88
|
+
* @param {string} url - The URL string to validate.
|
|
89
|
+
* @param {Set<string>} [allowedSchemes] - Permitted protocol schemes.
|
|
90
|
+
* @throws {NLcURLError} If the URL is invalid or uses an unsupported protocol.
|
|
91
|
+
*/
|
|
92
|
+
export function validateUrl(url, allowedSchemes = new Set(["http:", "https:"])) {
|
|
93
|
+
if (typeof url !== "string" || url.length === 0) {
|
|
94
|
+
fail("url must be a non-empty string");
|
|
95
|
+
}
|
|
96
|
+
let parsed;
|
|
97
|
+
try {
|
|
98
|
+
parsed = new URL(url);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
fail(`Invalid URL: ${url}`);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (!allowedSchemes.has(parsed.protocol)) {
|
|
105
|
+
fail(`Unsupported URL protocol: ${parsed.protocol}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Validates per-phase timeout configuration. Each field must be a positive
|
|
110
|
+
* finite number when present.
|
|
111
|
+
*
|
|
112
|
+
* @param {unknown} timeout - A flat timeout number or per-phase object.
|
|
113
|
+
* @throws {NLcURLError} If any timeout value is invalid.
|
|
114
|
+
*/
|
|
115
|
+
export function validateTimeout(timeout) {
|
|
116
|
+
if (timeout === undefined || timeout === null)
|
|
117
|
+
return;
|
|
118
|
+
if (typeof timeout === "number") {
|
|
119
|
+
if (!Number.isFinite(timeout) || timeout <= 0) {
|
|
120
|
+
fail("timeout must be a positive finite number");
|
|
121
|
+
}
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
if (typeof timeout === "object" && !Array.isArray(timeout)) {
|
|
125
|
+
const obj = timeout;
|
|
126
|
+
for (const key of ["connect", "tls", "response", "total"]) {
|
|
127
|
+
if (obj[key] !== undefined) {
|
|
128
|
+
if (typeof obj[key] !== "number" || !Number.isFinite(obj[key]) || obj[key] <= 0) {
|
|
129
|
+
fail(`timeout.${key} must be a positive finite number`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
fail("timeout must be a number or a TimeoutConfig object");
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Validates all user-supplied fields of an outgoing request descriptor.
|
|
139
|
+
* Called at the entry of every public request function before any processing.
|
|
140
|
+
*
|
|
141
|
+
* @param {Record<string, unknown>} input - The raw request descriptor.
|
|
142
|
+
* @throws {NLcURLError} If any field fails validation.
|
|
143
|
+
*/
|
|
144
|
+
export function validateRequest(input) {
|
|
145
|
+
if (input["method"] !== undefined) {
|
|
146
|
+
assertEnum(input["method"], VALID_METHODS, "method");
|
|
147
|
+
}
|
|
148
|
+
if (input["headers"] !== undefined && input["headers"] !== null) {
|
|
149
|
+
assertPlainObject(input["headers"], "headers");
|
|
150
|
+
}
|
|
151
|
+
if (input["httpVersion"] !== undefined) {
|
|
152
|
+
assertEnum(input["httpVersion"], VALID_HTTP_VERSIONS, "httpVersion");
|
|
153
|
+
}
|
|
154
|
+
if (input["dnsFamily"] !== undefined) {
|
|
155
|
+
assertEnum(input["dnsFamily"], VALID_DNS_FAMILIES, "dnsFamily");
|
|
156
|
+
}
|
|
157
|
+
if (input["maxRedirects"] !== undefined) {
|
|
158
|
+
assertNonNegativeInt(input["maxRedirects"], "maxRedirects");
|
|
159
|
+
}
|
|
160
|
+
validateTimeout(input["timeout"]);
|
|
161
|
+
if (input["impersonate"] !== undefined && input["impersonate"] !== null) {
|
|
162
|
+
assertNonEmptyString(input["impersonate"], "impersonate");
|
|
163
|
+
}
|
|
164
|
+
if (input["proxy"] !== undefined && input["proxy"] !== null) {
|
|
165
|
+
assertNonEmptyString(input["proxy"], "proxy");
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Validates session-level configuration. Called once in the
|
|
170
|
+
* {@link NLcURLSession} constructor.
|
|
171
|
+
*
|
|
172
|
+
* @param {Record<string, unknown>} config - The raw session config.
|
|
173
|
+
* @throws {NLcURLError} If any field fails validation.
|
|
174
|
+
*/
|
|
175
|
+
export function validateSessionConfig(config) {
|
|
176
|
+
if (config["baseURL"] !== undefined && config["baseURL"] !== null) {
|
|
177
|
+
assertNonEmptyString(config["baseURL"], "baseURL");
|
|
178
|
+
}
|
|
179
|
+
if (config["headers"] !== undefined && config["headers"] !== null) {
|
|
180
|
+
assertPlainObject(config["headers"], "headers");
|
|
181
|
+
}
|
|
182
|
+
if (config["httpVersion"] !== undefined) {
|
|
183
|
+
assertEnum(config["httpVersion"], VALID_HTTP_VERSIONS, "httpVersion");
|
|
184
|
+
}
|
|
185
|
+
if (config["dnsFamily"] !== undefined) {
|
|
186
|
+
assertEnum(config["dnsFamily"], VALID_DNS_FAMILIES, "dnsFamily");
|
|
187
|
+
}
|
|
188
|
+
if (config["maxRedirects"] !== undefined) {
|
|
189
|
+
assertNonNegativeInt(config["maxRedirects"], "maxRedirects");
|
|
190
|
+
}
|
|
191
|
+
validateTimeout(config["timeout"]);
|
|
192
|
+
if (config["impersonate"] !== undefined && config["impersonate"] !== null) {
|
|
193
|
+
assertNonEmptyString(config["impersonate"], "impersonate");
|
|
194
|
+
}
|
|
195
|
+
if (config["proxy"] !== undefined && config["proxy"] !== null) {
|
|
196
|
+
assertNonEmptyString(config["proxy"], "proxy");
|
|
197
|
+
}
|
|
198
|
+
if (config["retry"] !== undefined && config["retry"] !== null) {
|
|
199
|
+
validateRetryConfig(config["retry"]);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Validates the retry configuration object.
|
|
204
|
+
*
|
|
205
|
+
* @param {Record<string, unknown>} config - The raw retry config.
|
|
206
|
+
* @throws {NLcURLError} If any retry setting is invalid.
|
|
207
|
+
*/
|
|
208
|
+
export function validateRetryConfig(config) {
|
|
209
|
+
if (config["count"] !== undefined) {
|
|
210
|
+
assertNonNegativeInt(config["count"], "retry.count");
|
|
211
|
+
}
|
|
212
|
+
if (config["delay"] !== undefined) {
|
|
213
|
+
assertPositiveNumber(config["delay"], "retry.delay");
|
|
214
|
+
}
|
|
215
|
+
if (config["jitter"] !== undefined) {
|
|
216
|
+
if (typeof config["jitter"] !== "number" || !Number.isFinite(config["jitter"]) || config["jitter"] < 0) {
|
|
217
|
+
fail("retry.jitter must be a non-negative finite number");
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
if (config["backoff"] !== undefined) {
|
|
221
|
+
assertEnum(config["backoff"], VALID_BACKOFF, "retry.backoff");
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Validates rate limit configuration.
|
|
226
|
+
*
|
|
227
|
+
* @param {Record<string, unknown>} config - The raw rate limit config.
|
|
228
|
+
* @throws {NLcURLError} If any rate limit parameter is invalid.
|
|
229
|
+
*/
|
|
230
|
+
export function validateRateLimitConfig(config) {
|
|
231
|
+
assertPositiveNumber(config["maxRequests"], "maxRequests");
|
|
232
|
+
assertPositiveNumber(config["windowMs"], "windowMs");
|
|
233
|
+
if (!Number.isInteger(config["maxRequests"])) {
|
|
234
|
+
fail("maxRequests must be an integer");
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Validates a WebSocket URL (must use `ws:` or `wss:` protocol).
|
|
239
|
+
*
|
|
240
|
+
* @param {string} url - The WebSocket URL to validate.
|
|
241
|
+
* @throws {NLcURLError} If the URL is invalid or uses a non-WebSocket protocol.
|
|
242
|
+
*/
|
|
243
|
+
export function validateWebSocketUrl(url) {
|
|
244
|
+
validateUrl(url, new Set(["ws:", "wss:"]));
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/core/validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"akamai.d.ts","sourceRoot":"","sources":["../../src/fingerprints/akamai.ts"],"names":[],"mappings":"
|
|
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;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,SAAS,GAAG,MAAM,CAU5D"}
|
|
@@ -13,14 +13,10 @@
|
|
|
13
13
|
* // => "1:65536;2:0;3:1000;4:6291456;6:262144|15663105|0:0:0:255|m,p,a,s"
|
|
14
14
|
*/
|
|
15
15
|
export function akamaiFingerprint(profile) {
|
|
16
|
-
const settings = profile.settings
|
|
17
|
-
.map((s) => `${s.id}:${s.value}`)
|
|
18
|
-
.join(';');
|
|
16
|
+
const settings = profile.settings.map((s) => `${s.id}:${s.value}`).join(";");
|
|
19
17
|
const wu = String(profile.windowUpdate);
|
|
20
|
-
const priority = (profile.priorityFrames ?? [])
|
|
21
|
-
|
|
22
|
-
.join(',');
|
|
23
|
-
const pseudo = profile.pseudoHeaderOrder.join(',');
|
|
18
|
+
const priority = (profile.priorityFrames ?? []).map((f) => `${f.streamId}:${f.exclusive ? 1 : 0}:${f.dependsOn}:${f.weight}`).join(",");
|
|
19
|
+
const pseudo = profile.pseudoHeaderOrder.join(",");
|
|
24
20
|
return `${settings}|${wu}|${priority}|${pseudo}`;
|
|
25
21
|
}
|
|
26
22
|
//# sourceMappingURL=akamai.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"akamai.js","sourceRoot":"","sources":["../../src/fingerprints/akamai.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"akamai.js","sourceRoot":"","sources":["../../src/fingerprints/akamai.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;GAaG;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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import type { BrowserProfile } from
|
|
2
|
-
import { chromeLatest } from
|
|
3
|
-
import { firefoxLatest } from
|
|
4
|
-
import { safariLatest } from
|
|
5
|
-
import { edgeLatest } from
|
|
6
|
-
import { torLatest } from
|
|
1
|
+
import type { BrowserProfile } from "./types.js";
|
|
2
|
+
import { chromeLatest } from "./profiles/chrome.js";
|
|
3
|
+
import { firefoxLatest } from "./profiles/firefox.js";
|
|
4
|
+
import { safariLatest } from "./profiles/safari.js";
|
|
5
|
+
import { edgeLatest } from "./profiles/edge.js";
|
|
6
|
+
import { torLatest } from "./profiles/tor.js";
|
|
7
7
|
/**
|
|
8
8
|
* Looks up a browser profile by name, accepting flexible casing and separators.
|
|
9
9
|
* Returns the latest version of the named browser when given a bare browser
|
|
@@ -28,5 +28,5 @@ export declare function listProfiles(): string[];
|
|
|
28
28
|
/** The default browser profile used when no `impersonate` option is specified. Points to the latest bundled Chrome profile. */
|
|
29
29
|
export declare const DEFAULT_PROFILE: BrowserProfile;
|
|
30
30
|
export { chromeLatest, firefoxLatest, safariLatest, edgeLatest, torLatest };
|
|
31
|
-
export type { BrowserProfile } from
|
|
31
|
+
export type { BrowserProfile } from "./types.js";
|
|
32
32
|
//# sourceMappingURL=database.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/fingerprints/database.ts"],"names":[],"mappings":"
|
|
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;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAoBnE;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,IAAI,MAAM,EAAE,CAEvC;AAED,+HAA+H;AAC/H,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"}
|
|
@@ -1,16 +1,10 @@
|
|
|
1
|
-
import { chromeProfiles, chromeLatest } from
|
|
2
|
-
import { firefoxProfiles, firefoxLatest } from
|
|
3
|
-
import { safariProfiles, safariLatest } from
|
|
4
|
-
import { edgeProfiles, edgeLatest } from
|
|
5
|
-
import { torProfiles, torLatest } from
|
|
1
|
+
import { chromeProfiles, chromeLatest } from "./profiles/chrome.js";
|
|
2
|
+
import { firefoxProfiles, firefoxLatest } from "./profiles/firefox.js";
|
|
3
|
+
import { safariProfiles, safariLatest } from "./profiles/safari.js";
|
|
4
|
+
import { edgeProfiles, edgeLatest } from "./profiles/edge.js";
|
|
5
|
+
import { torProfiles, torLatest } from "./profiles/tor.js";
|
|
6
6
|
const allProfiles = new Map();
|
|
7
|
-
for (const source of [
|
|
8
|
-
chromeProfiles,
|
|
9
|
-
firefoxProfiles,
|
|
10
|
-
safariProfiles,
|
|
11
|
-
edgeProfiles,
|
|
12
|
-
torProfiles,
|
|
13
|
-
]) {
|
|
7
|
+
for (const source of [chromeProfiles, firefoxProfiles, safariProfiles, edgeProfiles, torProfiles]) {
|
|
14
8
|
for (const [key, profile] of source) {
|
|
15
9
|
allProfiles.set(key, profile);
|
|
16
10
|
}
|
|
@@ -28,20 +22,20 @@ for (const source of [
|
|
|
28
22
|
* const latest = getProfile('chrome'); // resolves to the latest Chrome profile
|
|
29
23
|
*/
|
|
30
24
|
export function getProfile(name) {
|
|
31
|
-
const lower = name.toLowerCase().replace(/[-\s]/g,
|
|
25
|
+
const lower = name.toLowerCase().replace(/[-\s]/g, "");
|
|
32
26
|
const direct = allProfiles.get(lower);
|
|
33
27
|
if (direct)
|
|
34
28
|
return direct;
|
|
35
29
|
switch (lower) {
|
|
36
|
-
case
|
|
30
|
+
case "chrome":
|
|
37
31
|
return chromeLatest;
|
|
38
|
-
case
|
|
32
|
+
case "firefox":
|
|
39
33
|
return firefoxLatest;
|
|
40
|
-
case
|
|
34
|
+
case "safari":
|
|
41
35
|
return safariLatest;
|
|
42
|
-
case
|
|
36
|
+
case "edge":
|
|
43
37
|
return edgeLatest;
|
|
44
|
-
case
|
|
38
|
+
case "tor":
|
|
45
39
|
return torLatest;
|
|
46
40
|
default:
|
|
47
41
|
return undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/fingerprints/database.ts"],"names":[],"mappings":"
|
|
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;;;;;;;;;;;GAWG;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;;;;;;GAMG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACxC,CAAC;AAED,+HAA+H;AAC/H,MAAM,CAAC,MAAM,eAAe,GAAmB,YAAY,CAAC;AAE5D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extensions.d.ts","sourceRoot":"","sources":["../../src/fingerprints/extensions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"extensions.d.ts","sourceRoot":"","sources":["../../src/fingerprints/extensions.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAShD;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAKhE;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAK5D;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAK5D;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAK9D;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,CAcpD;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,CAK7D;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAK/D;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAE5D;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAM1C;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,IAAI,MAAM,CAEhC;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIzD;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAKlE;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,CAcnE;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAgBtC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BufferWriter } from
|
|
1
|
+
import { BufferWriter } from "../utils/buffer-writer.js";
|
|
2
2
|
/**
|
|
3
3
|
* Builds the SNI (Server Name Indication) extension payload for the given
|
|
4
4
|
* hostname, encoded as a TLS `HostName` name list structure per RFC 6066.
|
|
@@ -7,7 +7,7 @@ import { BufferWriter } from '../utils/buffer-writer.js';
|
|
|
7
7
|
* @returns {Buffer} Encoded SNI extension data.
|
|
8
8
|
*/
|
|
9
9
|
export function sniData(hostname) {
|
|
10
|
-
const host = Buffer.from(hostname,
|
|
10
|
+
const host = Buffer.from(hostname, "ascii");
|
|
11
11
|
const w = new BufferWriter(host.length + 16);
|
|
12
12
|
w.writeUInt16(host.length + 3 + 2);
|
|
13
13
|
w.writeUInt16(host.length + 3);
|
|
@@ -82,7 +82,7 @@ export function signatureAlgorithmsData(algs) {
|
|
|
82
82
|
export function alpnData(protocols) {
|
|
83
83
|
let totalLen = 0;
|
|
84
84
|
const bufs = protocols.map((p) => {
|
|
85
|
-
const b = Buffer.from(p,
|
|
85
|
+
const b = Buffer.from(p, "ascii");
|
|
86
86
|
totalLen += 1 + b.length;
|
|
87
87
|
return b;
|
|
88
88
|
});
|
|
@@ -219,7 +219,7 @@ export function delegatedCredentialsData(sigAlgs) {
|
|
|
219
219
|
export function applicationSettingsData(protocols) {
|
|
220
220
|
let totalLen = 0;
|
|
221
221
|
const bufs = protocols.map((p) => {
|
|
222
|
-
const b = Buffer.from(p,
|
|
222
|
+
const b = Buffer.from(p, "ascii");
|
|
223
223
|
totalLen += 2 + b.length;
|
|
224
224
|
return b;
|
|
225
225
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extensions.js","sourceRoot":"","sources":["../../src/fingerprints/extensions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"extensions.js","sourceRoot":"","sources":["../../src/fingerprints/extensions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ja3.d.ts","sourceRoot":"","sources":["../../src/fingerprints/ja3.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ja3.d.ts","sourceRoot":"","sources":["../../src/fingerprints/ja3.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAY7C;;;;;;;;;;;;GAYG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAQrD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAEnD;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CActD;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAEpD"}
|
package/dist/fingerprints/ja3.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { createHash } from
|
|
2
|
-
import { GREASE_VALUES } from
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { GREASE_VALUES } from "../tls/constants.js";
|
|
3
3
|
const GREASE_SET = new Set(GREASE_VALUES);
|
|
4
4
|
function isGrease(value) {
|
|
5
5
|
return GREASE_SET.has(value);
|
|
@@ -22,10 +22,10 @@ function filterGrease(values) {
|
|
|
22
22
|
*/
|
|
23
23
|
export function ja3String(profile) {
|
|
24
24
|
const version = profile.clientVersion;
|
|
25
|
-
const ciphers = filterGrease(profile.cipherSuites).join(
|
|
26
|
-
const extensions = filterGrease(profile.extensions.map((e) => e.type)).join(
|
|
27
|
-
const groups = filterGrease(profile.supportedGroups).join(
|
|
28
|
-
const formats = (profile.ecPointFormats ?? []).join(
|
|
25
|
+
const ciphers = filterGrease(profile.cipherSuites).join("-");
|
|
26
|
+
const extensions = filterGrease(profile.extensions.map((e) => e.type)).join("-");
|
|
27
|
+
const groups = filterGrease(profile.supportedGroups).join("-");
|
|
28
|
+
const formats = (profile.ecPointFormats ?? []).join("-");
|
|
29
29
|
return `${version},${ciphers},${extensions},${groups},${formats}`;
|
|
30
30
|
}
|
|
31
31
|
/**
|
|
@@ -41,7 +41,7 @@ export function ja3String(profile) {
|
|
|
41
41
|
* // => "cd08e31494f9531f560d64c695473da9"
|
|
42
42
|
*/
|
|
43
43
|
export function ja3Hash(profile) {
|
|
44
|
-
return createHash(
|
|
44
|
+
return createHash("md5").update(ja3String(profile)).digest("hex");
|
|
45
45
|
}
|
|
46
46
|
/**
|
|
47
47
|
* Computes the JA3N (normalised) string for a TLS profile. Unlike
|
|
@@ -56,14 +56,14 @@ export function ja3nString(profile) {
|
|
|
56
56
|
const version = profile.clientVersion;
|
|
57
57
|
const ciphers = filterGrease(profile.cipherSuites)
|
|
58
58
|
.sort((a, b) => a - b)
|
|
59
|
-
.join(
|
|
59
|
+
.join("-");
|
|
60
60
|
const extensions = filterGrease(profile.extensions.map((e) => e.type))
|
|
61
61
|
.sort((a, b) => a - b)
|
|
62
|
-
.join(
|
|
62
|
+
.join("-");
|
|
63
63
|
const groups = filterGrease(profile.supportedGroups)
|
|
64
64
|
.sort((a, b) => a - b)
|
|
65
|
-
.join(
|
|
66
|
-
const formats = (profile.ecPointFormats ?? []).sort((a, b) => a - b).join(
|
|
65
|
+
.join("-");
|
|
66
|
+
const formats = (profile.ecPointFormats ?? []).sort((a, b) => a - b).join("-");
|
|
67
67
|
return `${version},${ciphers},${extensions},${groups},${formats}`;
|
|
68
68
|
}
|
|
69
69
|
/**
|
|
@@ -75,6 +75,6 @@ export function ja3nString(profile) {
|
|
|
75
75
|
* @returns {string} The 32-character lowercase hex JA3N MD5 hash.
|
|
76
76
|
*/
|
|
77
77
|
export function ja3nHash(profile) {
|
|
78
|
-
return createHash(
|
|
78
|
+
return createHash("md5").update(ja3nString(profile)).digest("hex");
|
|
79
79
|
}
|
|
80
80
|
//# sourceMappingURL=ja3.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ja3.js","sourceRoot":"","sources":["../../src/fingerprints/ja3.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ja3.js","sourceRoot":"","sources":["../../src/fingerprints/ja3.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { BrowserProfile } from
|
|
1
|
+
import type { BrowserProfile } from "../types.js";
|
|
2
2
|
/** {@link BrowserProfile} impersonating Chrome 99 (Chromium 99.0.4844.51). */
|
|
3
3
|
export declare const chrome99: BrowserProfile;
|
|
4
4
|
/** {@link BrowserProfile} impersonating Chrome 100 (Chromium 100.0.4896.75). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chrome.d.ts","sourceRoot":"","sources":["../../../src/fingerprints/profiles/chrome.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"chrome.d.ts","sourceRoot":"","sources":["../../../src/fingerprints/profiles/chrome.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAoE,MAAM,aAAa,CAAC;AA6HpH,8EAA8E;AAC9E,eAAO,MAAM,QAAQ,gBAA4C,CAAC;AAClE,gFAAgF;AAChF,eAAO,MAAM,SAAS,gBAA8C,CAAC;AACrE,gFAAgF;AAChF,eAAO,MAAM,SAAS,gBAA8C,CAAC;AACrE,gFAAgF;AAChF,eAAO,MAAM,SAAS,gBAA8C,CAAC;AACrE,iFAAiF;AACjF,eAAO,MAAM,SAAS,gBAA+C,CAAC;AACtE,iFAAiF;AACjF,eAAO,MAAM,SAAS,gBAA+C,CAAC;AACtE,iFAAiF;AACjF,eAAO,MAAM,SAAS,gBAA8D,CAAC;AACrF,iFAAiF;AACjF,eAAO,MAAM,SAAS,gBAA+D,CAAC;AACtF,0FAA0F;AAC1F,eAAO,MAAM,SAAS,gBAA0E,CAAC;AACjG,0FAA0F;AAC1F,eAAO,MAAM,SAAS,gBAAyE,CAAC;AAChG,0FAA0F;AAC1F,eAAO,MAAM,SAAS,gBAAyE,CAAC;AAChG,0FAA0F;AAC1F,eAAO,MAAM,SAAS,gBAAyE,CAAC;AAChG,0FAA0F;AAC1F,eAAO,MAAM,SAAS,gBAAyE,CAAC;AAChG,0FAA0F;AAC1F,eAAO,MAAM,SAAS,gBAAyE,CAAC;AAChG,0FAA0F;AAC1F,eAAO,MAAM,SAAS,gBAAyE,CAAC;AAChG,0FAA0F;AAC1F,eAAO,MAAM,SAAS,gBAAyE,CAAC;AAEhG,oEAAoE;AACpE,eAAO,MAAM,YAAY,gBAAY,CAAC;AAEtC;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAkB7D,CAAC"}
|