nlcurl 0.7.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +149 -140
- package/dist/cache/groups.d.ts +75 -0
- package/dist/cache/groups.d.ts.map +1 -0
- package/dist/cache/groups.js +118 -0
- package/dist/cache/groups.js.map +1 -0
- package/dist/cache/no-vary-search.d.ts +33 -0
- package/dist/cache/no-vary-search.d.ts.map +1 -0
- package/dist/cache/no-vary-search.js +148 -0
- package/dist/cache/no-vary-search.js.map +1 -0
- package/dist/cache/range.d.ts +120 -0
- package/dist/cache/range.d.ts.map +1 -0
- package/dist/cache/range.js +193 -0
- package/dist/cache/range.js.map +1 -0
- package/dist/cache/store.d.ts +75 -37
- package/dist/cache/store.d.ts.map +1 -1
- package/dist/cache/store.js +217 -85
- package/dist/cache/store.js.map +1 -1
- package/dist/cache/types.d.ts +10 -39
- package/dist/cache/types.d.ts.map +1 -1
- package/dist/cli/args.d.ts +4 -37
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +3 -4
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/index.d.ts +0 -5
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +1 -6
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/output.d.ts +14 -20
- package/dist/cli/output.d.ts.map +1 -1
- package/dist/cli/output.js +14 -20
- package/dist/cli/output.js.map +1 -1
- package/dist/cookies/jar.d.ts +41 -40
- package/dist/cookies/jar.d.ts.map +1 -1
- package/dist/cookies/jar.js +65 -42
- package/dist/cookies/jar.js.map +1 -1
- package/dist/cookies/parser.d.ts +13 -17
- package/dist/cookies/parser.d.ts.map +1 -1
- package/dist/cookies/parser.js +23 -15
- package/dist/cookies/parser.js.map +1 -1
- package/dist/cookies/psl-data.d.ts +1 -1
- package/dist/cookies/psl-data.js +1 -1
- package/dist/cookies/public-suffix.d.ts +5 -27
- package/dist/cookies/public-suffix.d.ts.map +1 -1
- package/dist/cookies/public-suffix.js +5 -37
- package/dist/cookies/public-suffix.js.map +1 -1
- package/dist/core/auth.d.ts +61 -0
- package/dist/core/auth.d.ts.map +1 -0
- package/dist/core/auth.js +159 -0
- package/dist/core/auth.js.map +1 -0
- package/dist/core/client.d.ts +28 -40
- package/dist/core/client.d.ts.map +1 -1
- package/dist/core/client.js +31 -41
- package/dist/core/client.js.map +1 -1
- package/dist/core/errors.d.ts +64 -88
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +64 -88
- package/dist/core/errors.js.map +1 -1
- package/dist/core/request.d.ts +33 -113
- package/dist/core/request.d.ts.map +1 -1
- package/dist/core/response.d.ts +49 -66
- package/dist/core/response.d.ts.map +1 -1
- package/dist/core/response.js +45 -59
- package/dist/core/response.js.map +1 -1
- package/dist/core/session.d.ts +66 -78
- package/dist/core/session.d.ts.map +1 -1
- package/dist/core/session.js +136 -77
- package/dist/core/session.js.map +1 -1
- package/dist/core/validation.d.ts +58 -43
- package/dist/core/validation.d.ts.map +1 -1
- package/dist/core/validation.js +141 -56
- package/dist/core/validation.js.map +1 -1
- package/dist/dns/cache.d.ts +65 -0
- package/dist/dns/cache.d.ts.map +1 -0
- package/dist/dns/cache.js +119 -0
- package/dist/dns/cache.js.map +1 -0
- package/dist/dns/codec.d.ts +29 -19
- package/dist/dns/codec.d.ts.map +1 -1
- package/dist/dns/codec.js +73 -39
- package/dist/dns/codec.js.map +1 -1
- package/dist/dns/doh-resolver.d.ts +17 -31
- package/dist/dns/doh-resolver.d.ts.map +1 -1
- package/dist/dns/doh-resolver.js +47 -48
- package/dist/dns/doh-resolver.js.map +1 -1
- package/dist/dns/dot-resolver.d.ts +89 -0
- package/dist/dns/dot-resolver.d.ts.map +1 -0
- package/dist/dns/dot-resolver.js +166 -0
- package/dist/dns/dot-resolver.js.map +1 -0
- package/dist/dns/https-rr.d.ts +19 -30
- package/dist/dns/https-rr.d.ts.map +1 -1
- package/dist/dns/https-rr.js +22 -40
- package/dist/dns/https-rr.js.map +1 -1
- package/dist/dns/types.d.ts +31 -59
- package/dist/dns/types.d.ts.map +1 -1
- package/dist/dns/types.js +3 -14
- package/dist/dns/types.js.map +1 -1
- package/dist/fingerprints/akamai.d.ts +3 -11
- package/dist/fingerprints/akamai.d.ts.map +1 -1
- package/dist/fingerprints/akamai.js +3 -11
- package/dist/fingerprints/akamai.js.map +1 -1
- package/dist/fingerprints/database.d.ts +6 -14
- package/dist/fingerprints/database.d.ts.map +1 -1
- package/dist/fingerprints/database.js +6 -14
- package/dist/fingerprints/database.js.map +1 -1
- package/dist/fingerprints/extensions.d.ts +56 -71
- package/dist/fingerprints/extensions.d.ts.map +1 -1
- package/dist/fingerprints/extensions.js +58 -71
- package/dist/fingerprints/extensions.js.map +1 -1
- package/dist/fingerprints/ja3.d.ts +12 -30
- package/dist/fingerprints/ja3.d.ts.map +1 -1
- package/dist/fingerprints/ja3.js +12 -30
- package/dist/fingerprints/ja3.js.map +1 -1
- package/dist/fingerprints/ja4.d.ts +18 -0
- package/dist/fingerprints/ja4.d.ts.map +1 -0
- package/dist/fingerprints/ja4.js +81 -0
- package/dist/fingerprints/ja4.js.map +1 -0
- package/dist/fingerprints/profiles/chrome.d.ts +18 -21
- package/dist/fingerprints/profiles/chrome.d.ts.map +1 -1
- package/dist/fingerprints/profiles/chrome.js +35 -31
- package/dist/fingerprints/profiles/chrome.js.map +1 -1
- package/dist/fingerprints/profiles/edge.d.ts +7 -10
- package/dist/fingerprints/profiles/edge.d.ts.map +1 -1
- package/dist/fingerprints/profiles/edge.js +7 -10
- package/dist/fingerprints/profiles/edge.js.map +1 -1
- package/dist/fingerprints/profiles/firefox.d.ts +8 -11
- package/dist/fingerprints/profiles/firefox.d.ts.map +1 -1
- package/dist/fingerprints/profiles/firefox.js +8 -11
- package/dist/fingerprints/profiles/firefox.js.map +1 -1
- package/dist/fingerprints/profiles/safari.d.ts +11 -14
- package/dist/fingerprints/profiles/safari.d.ts.map +1 -1
- package/dist/fingerprints/profiles/safari.js +11 -14
- package/dist/fingerprints/profiles/safari.js.map +1 -1
- package/dist/fingerprints/profiles/tor.d.ts +5 -8
- package/dist/fingerprints/profiles/tor.d.ts.map +1 -1
- package/dist/fingerprints/profiles/tor.js +5 -8
- package/dist/fingerprints/profiles/tor.js.map +1 -1
- package/dist/fingerprints/types.d.ts +42 -73
- package/dist/fingerprints/types.d.ts.map +1 -1
- package/dist/hsts/store.d.ts +19 -21
- package/dist/hsts/store.d.ts.map +1 -1
- package/dist/hsts/store.js +20 -28
- package/dist/hsts/store.js.map +1 -1
- package/dist/hsts/types.d.ts +10 -14
- package/dist/hsts/types.d.ts.map +1 -1
- package/dist/http/alt-svc.d.ts +27 -52
- package/dist/http/alt-svc.d.ts.map +1 -1
- package/dist/http/alt-svc.js +17 -67
- package/dist/http/alt-svc.js.map +1 -1
- package/dist/http/early-hints.d.ts +23 -0
- package/dist/http/early-hints.d.ts.map +1 -0
- package/dist/http/early-hints.js +33 -0
- package/dist/http/early-hints.js.map +1 -0
- package/dist/http/form-data.d.ts +17 -35
- package/dist/http/form-data.d.ts.map +1 -1
- package/dist/http/form-data.js +12 -34
- package/dist/http/form-data.js.map +1 -1
- package/dist/http/h1/client.d.ts +14 -26
- package/dist/http/h1/client.d.ts.map +1 -1
- package/dist/http/h1/client.js +14 -23
- package/dist/http/h1/client.js.map +1 -1
- package/dist/http/h1/encoder.d.ts +21 -17
- package/dist/http/h1/encoder.d.ts.map +1 -1
- package/dist/http/h1/encoder.js +56 -20
- package/dist/http/h1/encoder.js.map +1 -1
- package/dist/http/h1/parser.d.ts +23 -59
- package/dist/http/h1/parser.d.ts.map +1 -1
- package/dist/http/h1/parser.js +61 -55
- package/dist/http/h1/parser.js.map +1 -1
- package/dist/http/h2/client.d.ts +23 -59
- package/dist/http/h2/client.d.ts.map +1 -1
- package/dist/http/h2/client.js +107 -64
- package/dist/http/h2/client.js.map +1 -1
- package/dist/http/h2/frames.d.ts +53 -84
- package/dist/http/h2/frames.d.ts.map +1 -1
- package/dist/http/h2/frames.js +48 -76
- package/dist/http/h2/frames.js.map +1 -1
- package/dist/http/h2/hpack.d.ts +20 -36
- package/dist/http/h2/hpack.d.ts.map +1 -1
- package/dist/http/h2/hpack.js +41 -36
- package/dist/http/h2/hpack.js.map +1 -1
- package/dist/http/negotiator.d.ts +25 -38
- package/dist/http/negotiator.d.ts.map +1 -1
- package/dist/http/negotiator.js +17 -38
- package/dist/http/negotiator.js.map +1 -1
- package/dist/http/pool.d.ts +34 -64
- package/dist/http/pool.d.ts.map +1 -1
- package/dist/http/pool.js +22 -41
- package/dist/http/pool.js.map +1 -1
- package/dist/http/resumable-upload.d.ts +76 -0
- package/dist/http/resumable-upload.d.ts.map +1 -0
- package/dist/http/resumable-upload.js +104 -0
- package/dist/http/resumable-upload.js.map +1 -0
- package/dist/http/trailers.d.ts +29 -0
- package/dist/http/trailers.d.ts.map +1 -0
- package/dist/http/trailers.js +57 -0
- package/dist/http/trailers.js.map +1 -0
- package/dist/index.d.ts +24 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -3
- package/dist/index.js.map +1 -1
- package/dist/middleware/circuit-breaker.d.ts +44 -0
- package/dist/middleware/circuit-breaker.d.ts.map +1 -0
- package/dist/middleware/circuit-breaker.js +96 -0
- package/dist/middleware/circuit-breaker.js.map +1 -0
- package/dist/middleware/interceptor.d.ts +13 -32
- package/dist/middleware/interceptor.d.ts.map +1 -1
- package/dist/middleware/interceptor.js +11 -16
- package/dist/middleware/interceptor.js.map +1 -1
- package/dist/middleware/rate-limiter.d.ts +8 -17
- package/dist/middleware/rate-limiter.d.ts.map +1 -1
- package/dist/middleware/rate-limiter.js +11 -12
- package/dist/middleware/rate-limiter.js.map +1 -1
- package/dist/middleware/retry-after.d.ts +15 -0
- package/dist/middleware/retry-after.d.ts.map +1 -0
- package/dist/middleware/retry-after.js +36 -0
- package/dist/middleware/retry-after.js.map +1 -0
- package/dist/middleware/retry.d.ts +9 -18
- package/dist/middleware/retry.d.ts.map +1 -1
- package/dist/middleware/retry.js +12 -9
- package/dist/middleware/retry.js.map +1 -1
- package/dist/proxy/auth.d.ts +73 -0
- package/dist/proxy/auth.d.ts.map +1 -0
- package/dist/proxy/auth.js +129 -0
- package/dist/proxy/auth.js.map +1 -0
- package/dist/proxy/env-proxy.d.ts +5 -15
- package/dist/proxy/env-proxy.d.ts.map +1 -1
- package/dist/proxy/env-proxy.js +5 -23
- package/dist/proxy/env-proxy.js.map +1 -1
- package/dist/proxy/http-proxy.d.ts +12 -19
- package/dist/proxy/http-proxy.d.ts.map +1 -1
- package/dist/proxy/http-proxy.js +5 -8
- package/dist/proxy/http-proxy.js.map +1 -1
- package/dist/proxy/socks.d.ts +13 -20
- package/dist/proxy/socks.d.ts.map +1 -1
- package/dist/proxy/socks.js +8 -10
- package/dist/proxy/socks.js.map +1 -1
- package/dist/sse/parser.d.ts +16 -37
- package/dist/sse/parser.d.ts.map +1 -1
- package/dist/sse/parser.js +31 -28
- package/dist/sse/parser.js.map +1 -1
- package/dist/tls/constants.d.ts +21 -72
- package/dist/tls/constants.d.ts.map +1 -1
- package/dist/tls/constants.js +21 -72
- package/dist/tls/constants.js.map +1 -1
- package/dist/tls/ct.d.ts +78 -0
- package/dist/tls/ct.d.ts.map +1 -0
- package/dist/tls/ct.js +175 -0
- package/dist/tls/ct.js.map +1 -0
- package/dist/tls/early-data.d.ts +45 -0
- package/dist/tls/early-data.d.ts.map +1 -0
- package/dist/tls/early-data.js +46 -0
- package/dist/tls/early-data.js.map +1 -0
- package/dist/tls/ech.d.ts +68 -85
- package/dist/tls/ech.d.ts.map +1 -1
- package/dist/tls/ech.js +54 -102
- package/dist/tls/ech.js.map +1 -1
- package/dist/tls/keylog.d.ts +34 -0
- package/dist/tls/keylog.d.ts.map +1 -0
- package/dist/tls/keylog.js +64 -0
- package/dist/tls/keylog.js.map +1 -0
- package/dist/tls/node-engine.d.ts +10 -17
- package/dist/tls/node-engine.d.ts.map +1 -1
- package/dist/tls/node-engine.js +41 -18
- package/dist/tls/node-engine.js.map +1 -1
- package/dist/tls/ocsp.d.ts +55 -0
- package/dist/tls/ocsp.d.ts.map +1 -0
- package/dist/tls/ocsp.js +131 -0
- package/dist/tls/ocsp.js.map +1 -0
- package/dist/tls/pin-verification.d.ts +5 -4
- package/dist/tls/pin-verification.d.ts.map +1 -1
- package/dist/tls/pin-verification.js +5 -11
- package/dist/tls/pin-verification.js.map +1 -1
- package/dist/tls/session-cache.d.ts +27 -39
- package/dist/tls/session-cache.d.ts.map +1 -1
- package/dist/tls/session-cache.js +20 -24
- package/dist/tls/session-cache.js.map +1 -1
- package/dist/tls/stealth/client-hello.d.ts +26 -45
- package/dist/tls/stealth/client-hello.d.ts.map +1 -1
- package/dist/tls/stealth/client-hello.js +15 -31
- package/dist/tls/stealth/client-hello.js.map +1 -1
- package/dist/tls/stealth/engine.d.ts +10 -15
- package/dist/tls/stealth/engine.d.ts.map +1 -1
- package/dist/tls/stealth/engine.js +98 -18
- package/dist/tls/stealth/engine.js.map +1 -1
- package/dist/tls/stealth/handshake.d.ts +32 -31
- package/dist/tls/stealth/handshake.d.ts.map +1 -1
- package/dist/tls/stealth/handshake.js +74 -47
- package/dist/tls/stealth/handshake.js.map +1 -1
- package/dist/tls/stealth/key-schedule.d.ts +81 -86
- package/dist/tls/stealth/key-schedule.d.ts.map +1 -1
- package/dist/tls/stealth/key-schedule.js +70 -58
- package/dist/tls/stealth/key-schedule.js.map +1 -1
- package/dist/tls/stealth/record-layer.d.ts +52 -75
- package/dist/tls/stealth/record-layer.d.ts.map +1 -1
- package/dist/tls/stealth/record-layer.js +47 -63
- package/dist/tls/stealth/record-layer.js.map +1 -1
- package/dist/tls/stealth/tls12-handshake.d.ts +16 -0
- package/dist/tls/stealth/tls12-handshake.d.ts.map +1 -1
- package/dist/tls/stealth/tls12-handshake.js +10 -2
- package/dist/tls/stealth/tls12-handshake.js.map +1 -1
- package/dist/tls/types.d.ts +46 -60
- package/dist/tls/types.d.ts.map +1 -1
- package/dist/utils/buffer-reader.d.ts +26 -81
- package/dist/utils/buffer-reader.d.ts.map +1 -1
- package/dist/utils/buffer-reader.js +26 -81
- package/dist/utils/buffer-reader.js.map +1 -1
- package/dist/utils/buffer-writer.d.ts +30 -66
- package/dist/utils/buffer-writer.d.ts.map +1 -1
- package/dist/utils/buffer-writer.js +30 -66
- package/dist/utils/buffer-writer.js.map +1 -1
- package/dist/utils/compression.d.ts +18 -0
- package/dist/utils/compression.d.ts.map +1 -0
- package/dist/utils/compression.js +34 -0
- package/dist/utils/compression.js.map +1 -0
- package/dist/utils/dictionary-transport.d.ts +97 -0
- package/dist/utils/dictionary-transport.d.ts.map +1 -0
- package/dist/utils/dictionary-transport.js +171 -0
- package/dist/utils/dictionary-transport.js.map +1 -0
- package/dist/utils/encoding.d.ts +12 -30
- package/dist/utils/encoding.d.ts.map +1 -1
- package/dist/utils/encoding.js +15 -46
- package/dist/utils/encoding.js.map +1 -1
- package/dist/utils/happy-eyeballs.d.ts +18 -8
- package/dist/utils/happy-eyeballs.d.ts.map +1 -1
- package/dist/utils/happy-eyeballs.js +19 -27
- package/dist/utils/happy-eyeballs.js.map +1 -1
- package/dist/utils/logger.d.ts +54 -81
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +92 -64
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/tcp-fast-open.d.ts +30 -0
- package/dist/utils/tcp-fast-open.d.ts.map +1 -0
- package/dist/utils/tcp-fast-open.js +36 -0
- package/dist/utils/tcp-fast-open.js.map +1 -0
- package/dist/utils/url.d.ts +18 -25
- package/dist/utils/url.d.ts.map +1 -1
- package/dist/utils/url.js +18 -25
- package/dist/utils/url.js.map +1 -1
- package/dist/ws/client.d.ts +35 -53
- package/dist/ws/client.d.ts.map +1 -1
- package/dist/ws/client.js +96 -38
- package/dist/ws/client.js.map +1 -1
- package/dist/ws/frame.d.ts +24 -41
- package/dist/ws/frame.d.ts.map +1 -1
- package/dist/ws/frame.js +26 -33
- package/dist/ws/frame.js.map +1 -1
- package/dist/ws/permessage-deflate.d.ts +23 -28
- package/dist/ws/permessage-deflate.d.ts.map +1 -1
- package/dist/ws/permessage-deflate.js +18 -26
- package/dist/ws/permessage-deflate.js.map +1 -1
- package/package.json +2 -2
- package/dist/http/h3/detection.d.ts +0 -17
- package/dist/http/h3/detection.d.ts.map +0 -1
- package/dist/http/h3/detection.js +0 -59
- package/dist/http/h3/detection.js.map +0 -1
package/dist/cookies/jar.js
CHANGED
|
@@ -1,33 +1,44 @@
|
|
|
1
1
|
import { parseSetCookie, serializeCookies } from "./parser.js";
|
|
2
2
|
const DEFAULT_MAX_COOKIES = 3000;
|
|
3
3
|
const DEFAULT_MAX_COOKIES_PER_DOMAIN = 180;
|
|
4
|
+
/** Maximum number of Set-Cookie headers to process per response. */
|
|
5
|
+
const MAX_SET_COOKIE_PER_RESPONSE = 50;
|
|
6
|
+
/** Maximum Cookie header line length in bytes. */
|
|
7
|
+
const MAX_COOKIE_HEADER_LENGTH = 8190;
|
|
8
|
+
/** Maximum cookies to include in a single request. */
|
|
9
|
+
const MAX_COOKIES_PER_REQUEST = 150;
|
|
4
10
|
/**
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
11
|
+
* Manages HTTP cookies across requests, enforcing RFC 6265 semantics including
|
|
12
|
+
* domain scoping, path matching, __Host- / __Secure- prefix validation, and
|
|
13
|
+
* SameSite defaults.
|
|
14
|
+
*
|
|
15
|
+
* @class
|
|
8
16
|
*/
|
|
9
17
|
export class CookieJar {
|
|
10
18
|
cookies = [];
|
|
11
19
|
maxCookies;
|
|
12
20
|
maxCookiesPerDomain;
|
|
13
|
-
/** Monotonic counter for deterministic LRU ordering within the same ms. */
|
|
14
21
|
accessCounter = 0;
|
|
22
|
+
/**
|
|
23
|
+
* Creates a new CookieJar.
|
|
24
|
+
*
|
|
25
|
+
* @param {CookieJarOptions} [options] - Jar capacity limits.
|
|
26
|
+
*/
|
|
15
27
|
constructor(options) {
|
|
16
28
|
this.maxCookies = options?.maxCookies ?? DEFAULT_MAX_COOKIES;
|
|
17
29
|
this.maxCookiesPerDomain = options?.maxCookiesPerDomain ?? DEFAULT_MAX_COOKIES_PER_DOMAIN;
|
|
18
30
|
}
|
|
19
31
|
/**
|
|
20
|
-
*
|
|
21
|
-
* available to handle multiple `Set-Cookie` entries) and stores any valid
|
|
22
|
-
* cookies scoped to the request URL.
|
|
32
|
+
* Extracts and stores cookies from Set-Cookie response headers.
|
|
23
33
|
*
|
|
24
|
-
* @param {Record<string, string>}
|
|
25
|
-
* @param {URL}
|
|
26
|
-
* @param {Array<[string, string]>}
|
|
34
|
+
* @param {Record<string, string>} headers - The response headers.
|
|
35
|
+
* @param {URL} requestUrl - The URL that produced the response.
|
|
36
|
+
* @param {Array<[string, string]>} [rawHeaders] - Raw header pairs for duplicate Set-Cookie handling.
|
|
27
37
|
*/
|
|
28
38
|
setCookies(headers, requestUrl, rawHeaders) {
|
|
29
39
|
const setCookieValues = this.extractSetCookieValues(headers, rawHeaders);
|
|
30
|
-
|
|
40
|
+
const limited = setCookieValues.slice(0, MAX_SET_COOKIE_PER_RESPONSE);
|
|
41
|
+
for (const value of limited) {
|
|
31
42
|
const cookie = parseSetCookie(value, requestUrl);
|
|
32
43
|
if (cookie) {
|
|
33
44
|
this.store(cookie);
|
|
@@ -35,17 +46,20 @@ export class CookieJar {
|
|
|
35
46
|
}
|
|
36
47
|
}
|
|
37
48
|
/**
|
|
38
|
-
* Builds
|
|
39
|
-
* Cookies are sorted by longest path prefix first, then by creation time.
|
|
40
|
-
* Expired cookies are excluded automatically.
|
|
49
|
+
* Builds a Cookie header value for the given URL.
|
|
41
50
|
*
|
|
42
|
-
* @param {URL} url - The URL
|
|
43
|
-
* @
|
|
44
|
-
*
|
|
51
|
+
* @param {URL} url - The target URL.
|
|
52
|
+
* @param {object} [context] - Additional context for SameSite enforcement.
|
|
53
|
+
* @param {URL} [context.siteOrigin] - The top-level site origin for SameSite checks.
|
|
54
|
+
* @param {boolean} [context.isSameSite] - Whether the request is same-site (default: true).
|
|
55
|
+
* @param {"navigate"|"subresource"} [context.type] - Request type for SameSite Lax handling.
|
|
56
|
+
* @param {string} [context.method] - HTTP method (for SameSite Lax top-level navigation).
|
|
57
|
+
* @returns {string} The serialized cookie string, or an empty string if no cookies match.
|
|
45
58
|
*/
|
|
46
|
-
getCookieHeader(url) {
|
|
59
|
+
getCookieHeader(url, context) {
|
|
47
60
|
const now = Date.now();
|
|
48
|
-
const
|
|
61
|
+
const isSameSite = context?.isSameSite ?? true;
|
|
62
|
+
const matching = this.cookies.filter((c) => this.matches(c, url, now, isSameSite, context?.type, context?.method));
|
|
49
63
|
if (matching.length === 0)
|
|
50
64
|
return "";
|
|
51
65
|
for (const c of matching) {
|
|
@@ -56,7 +70,13 @@ export class CookieJar {
|
|
|
56
70
|
return b.path.length - a.path.length;
|
|
57
71
|
return a.createdAt - b.createdAt;
|
|
58
72
|
});
|
|
59
|
-
|
|
73
|
+
const capped = matching.slice(0, MAX_COOKIES_PER_REQUEST);
|
|
74
|
+
let header = serializeCookies(capped);
|
|
75
|
+
while (Buffer.byteLength(header, "utf-8") > MAX_COOKIE_HEADER_LENGTH && capped.length > 1) {
|
|
76
|
+
capped.pop();
|
|
77
|
+
header = serializeCookies(capped);
|
|
78
|
+
}
|
|
79
|
+
return header;
|
|
60
80
|
}
|
|
61
81
|
/**
|
|
62
82
|
* Removes all cookies from the jar.
|
|
@@ -65,35 +85,33 @@ export class CookieJar {
|
|
|
65
85
|
this.cookies = [];
|
|
66
86
|
}
|
|
67
87
|
/**
|
|
68
|
-
* Removes all cookies
|
|
88
|
+
* Removes all cookies for a specific domain.
|
|
69
89
|
*
|
|
70
|
-
* @param {string} domain -
|
|
90
|
+
* @param {string} domain - The domain whose cookies should be removed.
|
|
71
91
|
*/
|
|
72
92
|
clearDomain(domain) {
|
|
73
93
|
this.cookies = this.cookies.filter((c) => c.domain !== domain.toLowerCase());
|
|
74
94
|
}
|
|
75
95
|
/**
|
|
76
|
-
* Returns a read-only
|
|
77
|
-
* including any that may already be expired.
|
|
96
|
+
* Returns a read-only view of all stored cookies.
|
|
78
97
|
*
|
|
79
|
-
* @returns {ReadonlyArray<Cookie>} All
|
|
98
|
+
* @returns {ReadonlyArray<Cookie>} All cookies in the jar.
|
|
80
99
|
*/
|
|
81
100
|
all() {
|
|
82
101
|
return this.cookies;
|
|
83
102
|
}
|
|
84
103
|
/**
|
|
85
|
-
* Returns the
|
|
104
|
+
* Returns the number of cookies stored in the jar.
|
|
86
105
|
*
|
|
87
|
-
* @returns {number}
|
|
106
|
+
* @returns {number} The cookie count.
|
|
88
107
|
*/
|
|
89
108
|
get size() {
|
|
90
109
|
return this.cookies.length;
|
|
91
110
|
}
|
|
92
111
|
/**
|
|
93
|
-
* Serializes all cookies to Netscape cookie file format.
|
|
94
|
-
* saved to disk and reloaded via {@link CookieJar.loadNetscapeString}.
|
|
112
|
+
* Serializes all cookies to Netscape cookie file format.
|
|
95
113
|
*
|
|
96
|
-
* @returns {string}
|
|
114
|
+
* @returns {string} The cookie file content.
|
|
97
115
|
*/
|
|
98
116
|
toNetscapeString() {
|
|
99
117
|
const lines = ["# Netscape HTTP Cookie File"];
|
|
@@ -115,11 +133,9 @@ export class CookieJar {
|
|
|
115
133
|
return lines.join("\n") + "\n";
|
|
116
134
|
}
|
|
117
135
|
/**
|
|
118
|
-
*
|
|
119
|
-
* `#` or blank lines are ignored. Cookies with invalid formats are skipped.
|
|
120
|
-
* Imported cookies are merged with any existing cookies in the jar.
|
|
136
|
+
* Loads cookies from a Netscape cookie file format string.
|
|
121
137
|
*
|
|
122
|
-
* @param {string} content -
|
|
138
|
+
* @param {string} content - The cookie file content.
|
|
123
139
|
*/
|
|
124
140
|
loadNetscapeString(content) {
|
|
125
141
|
for (const line of content.split("\n")) {
|
|
@@ -171,9 +187,6 @@ export class CookieJar {
|
|
|
171
187
|
this.cookies.push(cookie);
|
|
172
188
|
}
|
|
173
189
|
}
|
|
174
|
-
/**
|
|
175
|
-
* Evicts the least recently accessed cookie from a specific domain.
|
|
176
|
-
*/
|
|
177
190
|
evictLRUForDomain(domain) {
|
|
178
191
|
let lruIdx = -1;
|
|
179
192
|
let lruTime = Infinity;
|
|
@@ -187,10 +200,6 @@ export class CookieJar {
|
|
|
187
200
|
if (lruIdx >= 0)
|
|
188
201
|
this.cookies.splice(lruIdx, 1);
|
|
189
202
|
}
|
|
190
|
-
/**
|
|
191
|
-
* Evicts one cookie globally, preferring the domain with the most cookies
|
|
192
|
-
* and then the least recently accessed cookie within that domain.
|
|
193
|
-
*/
|
|
194
203
|
evictGlobalLRU() {
|
|
195
204
|
const domainCounts = new Map();
|
|
196
205
|
for (const c of this.cookies) {
|
|
@@ -211,7 +220,7 @@ export class CookieJar {
|
|
|
211
220
|
this.cookies.shift();
|
|
212
221
|
}
|
|
213
222
|
}
|
|
214
|
-
matches(cookie, url, now) {
|
|
223
|
+
matches(cookie, url, now, isSameSite = true, requestType, method) {
|
|
215
224
|
if (cookie.maxAge !== undefined) {
|
|
216
225
|
if (now > cookie.createdAt + cookie.maxAge * 1000)
|
|
217
226
|
return false;
|
|
@@ -225,6 +234,20 @@ export class CookieJar {
|
|
|
225
234
|
return false;
|
|
226
235
|
if (cookie.secure && url.protocol !== "https:")
|
|
227
236
|
return false;
|
|
237
|
+
if (!isSameSite) {
|
|
238
|
+
const sameSite = cookie.sameSite ?? "lax";
|
|
239
|
+
if (sameSite === "strict")
|
|
240
|
+
return false;
|
|
241
|
+
if (sameSite === "lax") {
|
|
242
|
+
if (requestType !== "navigate")
|
|
243
|
+
return false;
|
|
244
|
+
const safeMethod = !method || method === "GET" || method === "HEAD";
|
|
245
|
+
if (!safeMethod)
|
|
246
|
+
return false;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
if (cookie.partitioned && !isSameSite)
|
|
250
|
+
return false;
|
|
228
251
|
return true;
|
|
229
252
|
}
|
|
230
253
|
domainMatches(host, domain) {
|
package/dist/cookies/jar.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jar.js","sourceRoot":"","sources":["../../src/cookies/jar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAe,MAAM,aAAa,CAAC;AAE5E,MAAM,mBAAmB,GAAG,IAAI,CAAC;AACjC,MAAM,8BAA8B,GAAG,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"jar.js","sourceRoot":"","sources":["../../src/cookies/jar.ts"],"names":[],"mappings":"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"}
|
package/dist/cookies/parser.d.ts
CHANGED
|
@@ -1,17 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Represents a parsed HTTP cookie
|
|
3
|
-
*
|
|
4
|
-
* @typedef {Object} Cookie
|
|
5
|
-
* @property {string} name - Cookie name.
|
|
6
|
-
* @property {string} value - Cookie value.
|
|
7
|
-
* @property {string} domain - Effective domain (without leading dot).
|
|
8
|
-
* @property {string} path - Cookie path scope.
|
|
9
|
-
* @property {Date} [expires] - Absolute expiry date (from the `Expires` attribute).
|
|
10
|
-
* @property {number} [maxAge] - Relative lifetime in seconds (from the `Max-Age` attribute).
|
|
11
|
-
* @property {boolean} secure - Whether the cookie is restricted to HTTPS.
|
|
12
|
-
* @property {boolean} httpOnly - Whether the cookie is inaccessible to client-side scripts.
|
|
13
|
-
* @property {'strict' | 'lax' | 'none'} [sameSite] - SameSite policy.
|
|
14
|
-
* @property {number} createdAt - Unix timestamp (ms) when the cookie was created.
|
|
2
|
+
* Represents a parsed HTTP cookie with all standard attributes.
|
|
15
3
|
*/
|
|
16
4
|
export interface Cookie {
|
|
17
5
|
name: string;
|
|
@@ -23,16 +11,24 @@ export interface Cookie {
|
|
|
23
11
|
secure: boolean;
|
|
24
12
|
httpOnly: boolean;
|
|
25
13
|
sameSite?: "strict" | "lax" | "none";
|
|
14
|
+
partitioned?: boolean;
|
|
26
15
|
createdAt: number;
|
|
27
|
-
/** Timestamp (ms) when the cookie was last matched in getCookieHeader() for LRU eviction. */
|
|
28
16
|
lastAccessedAt: number;
|
|
29
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* Parses a Set-Cookie response header into a Cookie object, enforcing
|
|
20
|
+
* __Host- / __Secure- prefix rules, public suffix rejection, and SameSite defaults.
|
|
21
|
+
*
|
|
22
|
+
* @param {string} header - The raw Set-Cookie header value.
|
|
23
|
+
* @param {URL} requestUrl - The URL of the originating request.
|
|
24
|
+
* @returns {Cookie|null} The parsed cookie, or `null` if validation fails.
|
|
25
|
+
*/
|
|
30
26
|
export declare function parseSetCookie(header: string, requestUrl: URL): Cookie | null;
|
|
31
27
|
/**
|
|
32
|
-
* Serializes an array of cookies into
|
|
28
|
+
* Serializes an array of cookies into a Cookie header value string.
|
|
33
29
|
*
|
|
34
|
-
* @param {Cookie[]} cookies -
|
|
35
|
-
* @returns {string}
|
|
30
|
+
* @param {Cookie[]} cookies - The cookies to serialize.
|
|
31
|
+
* @returns {string} The serialized "name=value; name=value" string.
|
|
36
32
|
*/
|
|
37
33
|
export declare function serializeCookies(cookies: Cookie[]): string;
|
|
38
34
|
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/cookies/parser.ts"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/cookies/parser.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;IACrC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CACxB;AAiBD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,GAAG,MAAM,GAAG,IAAI,CAkH7E;AASD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAE1D"}
|
package/dist/cookies/parser.js
CHANGED
|
@@ -1,25 +1,24 @@
|
|
|
1
1
|
import { isPublicSuffix } from "./public-suffix.js";
|
|
2
|
-
/**
|
|
3
|
-
* Parses a `Set-Cookie` header value into a {@link Cookie} object.
|
|
4
|
-
* Validates the cookie against the request URL to enforce domain and path
|
|
5
|
-
* scoping rules per RFC 6265.
|
|
6
|
-
*
|
|
7
|
-
* @param {string} header - Raw `Set-Cookie` header value.
|
|
8
|
-
* @param {URL} requestUrl - URL of the request that received the header.
|
|
9
|
-
* @returns {Cookie | null} Parsed cookie, or `null` if the header is invalid or
|
|
10
|
-
* the domain attribute fails validation against the request origin.
|
|
11
|
-
*/
|
|
12
2
|
const COOKIE_NAME_RE = /^[!#$%&'*+\-.^_`|~\w]+$/;
|
|
13
3
|
const COOKIE_VALUE_CTL_RE = /[\x00-\x1f\x7f]/;
|
|
14
4
|
const MAX_COOKIE_SIZE = 4096;
|
|
5
|
+
/** Maximum Max-Age: 400 days in seconds (per Chromium and RFC 6265bis). */
|
|
6
|
+
const MAX_COOKIE_AGE_SECONDS = 400 * 24 * 60 * 60;
|
|
15
7
|
const VALID_SAMESITE = new Set(["strict", "lax", "none"]);
|
|
16
|
-
/** Returns true if the string looks like an IPv4 or IPv6 address. */
|
|
17
8
|
function looksLikeIP(host) {
|
|
18
9
|
if (host.includes(":"))
|
|
19
10
|
return true;
|
|
20
11
|
const parts = host.split(".");
|
|
21
12
|
return parts.length === 4 && parts.every((p) => /^\d{1,3}$/.test(p));
|
|
22
13
|
}
|
|
14
|
+
/**
|
|
15
|
+
* Parses a Set-Cookie response header into a Cookie object, enforcing
|
|
16
|
+
* __Host- / __Secure- prefix rules, public suffix rejection, and SameSite defaults.
|
|
17
|
+
*
|
|
18
|
+
* @param {string} header - The raw Set-Cookie header value.
|
|
19
|
+
* @param {URL} requestUrl - The URL of the originating request.
|
|
20
|
+
* @returns {Cookie|null} The parsed cookie, or `null` if validation fails.
|
|
21
|
+
*/
|
|
23
22
|
export function parseSetCookie(header, requestUrl) {
|
|
24
23
|
const parts = header.split(";").map((s) => s.trim());
|
|
25
24
|
if (parts.length === 0)
|
|
@@ -87,7 +86,7 @@ export function parseSetCookie(header, requestUrl) {
|
|
|
87
86
|
case "max-age": {
|
|
88
87
|
const secs = parseInt(attrValue, 10);
|
|
89
88
|
if (!Number.isNaN(secs)) {
|
|
90
|
-
cookie.maxAge = secs;
|
|
89
|
+
cookie.maxAge = Math.min(secs, MAX_COOKIE_AGE_SECONDS);
|
|
91
90
|
}
|
|
92
91
|
break;
|
|
93
92
|
}
|
|
@@ -104,11 +103,17 @@ export function parseSetCookie(header, requestUrl) {
|
|
|
104
103
|
}
|
|
105
104
|
break;
|
|
106
105
|
}
|
|
106
|
+
case "partitioned":
|
|
107
|
+
cookie.partitioned = true;
|
|
108
|
+
break;
|
|
107
109
|
}
|
|
108
110
|
}
|
|
109
111
|
if (cookie.sameSite === undefined) {
|
|
110
112
|
cookie.sameSite = "lax";
|
|
111
113
|
}
|
|
114
|
+
if (cookie.sameSite === "none" && !cookie.secure) {
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
112
117
|
if (cookie.name.startsWith("__Host-")) {
|
|
113
118
|
if (!cookie.secure)
|
|
114
119
|
return null;
|
|
@@ -121,6 +126,9 @@ export function parseSetCookie(header, requestUrl) {
|
|
|
121
126
|
if (!cookie.secure)
|
|
122
127
|
return null;
|
|
123
128
|
}
|
|
129
|
+
if (cookie.partitioned && !cookie.secure) {
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
124
132
|
return cookie;
|
|
125
133
|
}
|
|
126
134
|
function defaultPath(path) {
|
|
@@ -132,10 +140,10 @@ function defaultPath(path) {
|
|
|
132
140
|
return path.substring(0, lastSlash);
|
|
133
141
|
}
|
|
134
142
|
/**
|
|
135
|
-
* Serializes an array of cookies into
|
|
143
|
+
* Serializes an array of cookies into a Cookie header value string.
|
|
136
144
|
*
|
|
137
|
-
* @param {Cookie[]} cookies -
|
|
138
|
-
* @returns {string}
|
|
145
|
+
* @param {Cookie[]} cookies - The cookies to serialize.
|
|
146
|
+
* @returns {string} The serialized "name=value; name=value" string.
|
|
139
147
|
*/
|
|
140
148
|
export function serializeCookies(cookies) {
|
|
141
149
|
return cookies.map((c) => `${c.name}=${c.value}`).join("; ");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/cookies/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/cookies/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Complete Mozilla Public Suffix List rules.
|
|
5
5
|
* Generated from: https://publicsuffix.org/list/public_suffix_list.dat
|
|
6
|
-
* Generated on: 2026-03-
|
|
6
|
+
* Generated on: 2026-03-07T23:06:51.663Z
|
|
7
7
|
* Total rules: 10153
|
|
8
8
|
*
|
|
9
9
|
* To regenerate: npx tsx scripts/update-psl.ts
|
package/dist/cookies/psl-data.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Complete Mozilla Public Suffix List rules.
|
|
5
5
|
* Generated from: https://publicsuffix.org/list/public_suffix_list.dat
|
|
6
|
-
* Generated on: 2026-03-
|
|
6
|
+
* Generated on: 2026-03-07T23:06:51.663Z
|
|
7
7
|
* Total rules: 10153
|
|
8
8
|
*
|
|
9
9
|
* To regenerate: npx tsx scripts/update-psl.ts
|
|
@@ -1,37 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* Uses the complete Mozilla Public Suffix List (10,000+ rules) to prevent
|
|
4
|
-
* supercookie attacks across all registered TLDs, ccSLDs, and hosting platforms.
|
|
2
|
+
* Determines whether a domain is a public suffix (eTLD) according to the Mozilla Public Suffix List.
|
|
5
3
|
*
|
|
6
|
-
*
|
|
7
|
-
* via `npx tsx scripts/update-psl.ts`. Regenerate periodically to stay current.
|
|
8
|
-
*
|
|
9
|
-
* Rules follow the PSL algorithm (https://wiki.mozilla.org/Public_Suffix_List/Algorithm):
|
|
10
|
-
* - A plain entry (e.g. `com`) means that label is a public suffix.
|
|
11
|
-
* - A wildcard entry (e.g. `*.uk`) means all two-label domains under `.uk` are suffixes.
|
|
12
|
-
* - An exception entry (e.g. `!www.ck`) overrides a wildcard and is NOT a suffix.
|
|
13
|
-
*/
|
|
14
|
-
/**
|
|
15
|
-
* Determines whether the given domain is a public suffix (effective TLD).
|
|
16
|
-
* A public suffix is a domain under which the general public can register
|
|
17
|
-
* names — e.g. `com`, `co.uk`, `github.io`.
|
|
18
|
-
*
|
|
19
|
-
* Cookies must never be set with a `domain` attribute equal to a public
|
|
20
|
-
* suffix, as that would create a supercookie affecting all sites under
|
|
21
|
-
* that suffix.
|
|
22
|
-
*
|
|
23
|
-
* @param {string} domain - The domain to check (lowercase, no trailing dot).
|
|
4
|
+
* @param {string} domain - The domain to check.
|
|
24
5
|
* @returns {boolean} `true` if the domain is a public suffix.
|
|
25
6
|
*/
|
|
26
7
|
export declare function isPublicSuffix(domain: string): boolean;
|
|
27
8
|
/**
|
|
28
|
-
*
|
|
29
|
-
* For example, `"www.example.co.uk"` → `"example.co.uk"`.
|
|
30
|
-
* Returns `null` if the domain is itself a public suffix or if
|
|
31
|
-
* the input is invalid.
|
|
9
|
+
* Extracts the registrable domain (eTLD+1) from a hostname using the Public Suffix List.
|
|
32
10
|
*
|
|
33
|
-
* @param {string} hostname -
|
|
34
|
-
* @returns {string
|
|
11
|
+
* @param {string} hostname - The full hostname.
|
|
12
|
+
* @returns {string|null} The registrable domain, or `null` if the hostname is itself a public suffix.
|
|
35
13
|
*/
|
|
36
14
|
export declare function getRegistrableDomain(hostname: string): string | null;
|
|
37
15
|
//# sourceMappingURL=public-suffix.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public-suffix.d.ts","sourceRoot":"","sources":["../../src/cookies/public-suffix.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"public-suffix.d.ts","sourceRoot":"","sources":["../../src/cookies/public-suffix.ts"],"names":[],"mappings":"AAsGA;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAItD;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAapE"}
|
|
@@ -1,16 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Public Suffix List (PSL) implementation for cookie domain validation.
|
|
3
|
-
* Uses the complete Mozilla Public Suffix List (10,000+ rules) to prevent
|
|
4
|
-
* supercookie attacks across all registered TLDs, ccSLDs, and hosting platforms.
|
|
5
|
-
*
|
|
6
|
-
* The data is auto-generated from https://publicsuffix.org/list/public_suffix_list.dat
|
|
7
|
-
* via `npx tsx scripts/update-psl.ts`. Regenerate periodically to stay current.
|
|
8
|
-
*
|
|
9
|
-
* Rules follow the PSL algorithm (https://wiki.mozilla.org/Public_Suffix_List/Algorithm):
|
|
10
|
-
* - A plain entry (e.g. `com`) means that label is a public suffix.
|
|
11
|
-
* - A wildcard entry (e.g. `*.uk`) means all two-label domains under `.uk` are suffixes.
|
|
12
|
-
* - An exception entry (e.g. `!www.ck`) overrides a wildcard and is NOT a suffix.
|
|
13
|
-
*/
|
|
14
1
|
import { PSL_RULES } from "./psl-data.js";
|
|
15
2
|
function parseRule(raw) {
|
|
16
3
|
const isException = raw.startsWith("!");
|
|
@@ -57,16 +44,6 @@ for (const rule of RULES) {
|
|
|
57
44
|
node.isPublicSuffix = true;
|
|
58
45
|
}
|
|
59
46
|
}
|
|
60
|
-
/**
|
|
61
|
-
* Finds the number of labels in the effective TLD for a given domain,
|
|
62
|
-
* following the Mozilla PSL algorithm:
|
|
63
|
-
* 1. Walk the trie from right to left, tracking the longest matching rule.
|
|
64
|
-
* 2. Wildcards extend the eTLD by one label; exceptions retract it.
|
|
65
|
-
* 3. Default rule: if no rule matches, treat the rightmost label as the eTLD.
|
|
66
|
-
*
|
|
67
|
-
* @param {string} domain - Lowercase domain with labels separated by '.'.
|
|
68
|
-
* @returns {number} Number of labels (from the right) forming the eTLD.
|
|
69
|
-
*/
|
|
70
47
|
function findEffectiveTLDLength(domain) {
|
|
71
48
|
const labels = domain.split(".").reverse();
|
|
72
49
|
let node = ROOT;
|
|
@@ -101,15 +78,9 @@ function findEffectiveTLDLength(domain) {
|
|
|
101
78
|
return etldLabels;
|
|
102
79
|
}
|
|
103
80
|
/**
|
|
104
|
-
* Determines whether
|
|
105
|
-
* A public suffix is a domain under which the general public can register
|
|
106
|
-
* names — e.g. `com`, `co.uk`, `github.io`.
|
|
107
|
-
*
|
|
108
|
-
* Cookies must never be set with a `domain` attribute equal to a public
|
|
109
|
-
* suffix, as that would create a supercookie affecting all sites under
|
|
110
|
-
* that suffix.
|
|
81
|
+
* Determines whether a domain is a public suffix (eTLD) according to the Mozilla Public Suffix List.
|
|
111
82
|
*
|
|
112
|
-
* @param {string} domain - The domain to check
|
|
83
|
+
* @param {string} domain - The domain to check.
|
|
113
84
|
* @returns {boolean} `true` if the domain is a public suffix.
|
|
114
85
|
*/
|
|
115
86
|
export function isPublicSuffix(domain) {
|
|
@@ -118,13 +89,10 @@ export function isPublicSuffix(domain) {
|
|
|
118
89
|
return labels.length === findEffectiveTLDLength(d);
|
|
119
90
|
}
|
|
120
91
|
/**
|
|
121
|
-
*
|
|
122
|
-
* For example, `"www.example.co.uk"` → `"example.co.uk"`.
|
|
123
|
-
* Returns `null` if the domain is itself a public suffix or if
|
|
124
|
-
* the input is invalid.
|
|
92
|
+
* Extracts the registrable domain (eTLD+1) from a hostname using the Public Suffix List.
|
|
125
93
|
*
|
|
126
|
-
* @param {string} hostname -
|
|
127
|
-
* @returns {string
|
|
94
|
+
* @param {string} hostname - The full hostname.
|
|
95
|
+
* @returns {string|null} The registrable domain, or `null` if the hostname is itself a public suffix.
|
|
128
96
|
*/
|
|
129
97
|
export function getRegistrableDomain(hostname) {
|
|
130
98
|
const domain = hostname.toLowerCase();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public-suffix.js","sourceRoot":"","sources":["../../src/cookies/public-suffix.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"public-suffix.js","sourceRoot":"","sources":["../../src/cookies/public-suffix.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration for HTTP authentication.
|
|
3
|
+
*
|
|
4
|
+
* @typedef {Object} AuthConfig
|
|
5
|
+
* @property {"basic"|"bearer"|"digest"|"aws-sigv4"} type - The authentication scheme to use.
|
|
6
|
+
* @property {string} [username] - Username for Basic/Digest authentication.
|
|
7
|
+
* @property {string} [password] - Password for Basic/Digest authentication.
|
|
8
|
+
* @property {string} [token] - Bearer token for Bearer authentication.
|
|
9
|
+
* @property {string} [awsRegion] - AWS region for SigV4.
|
|
10
|
+
* @property {string} [awsService] - AWS service for SigV4.
|
|
11
|
+
* @property {string} [awsAccessKeyId] - AWS access key ID for SigV4.
|
|
12
|
+
* @property {string} [awsSecretKey] - AWS secret access key for SigV4.
|
|
13
|
+
* @property {string} [awsSessionToken] - AWS session token (optional) for SigV4.
|
|
14
|
+
*/
|
|
15
|
+
export interface AuthConfig {
|
|
16
|
+
type: "basic" | "bearer" | "digest" | "aws-sigv4";
|
|
17
|
+
username?: string;
|
|
18
|
+
password?: string;
|
|
19
|
+
token?: string;
|
|
20
|
+
awsRegion?: string;
|
|
21
|
+
awsService?: string;
|
|
22
|
+
awsAccessKeyId?: string;
|
|
23
|
+
awsSecretKey?: string;
|
|
24
|
+
awsSessionToken?: string;
|
|
25
|
+
}
|
|
26
|
+
/** Parsed Digest challenge from WWW-Authenticate header. */
|
|
27
|
+
export interface DigestChallenge {
|
|
28
|
+
realm: string;
|
|
29
|
+
nonce: string;
|
|
30
|
+
qop?: string;
|
|
31
|
+
opaque?: string;
|
|
32
|
+
algorithm?: string;
|
|
33
|
+
stale?: boolean;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Builds an HTTP Authorization header value from the given auth configuration.
|
|
37
|
+
*
|
|
38
|
+
* @param {AuthConfig} auth - The authentication configuration.
|
|
39
|
+
* @param {Object} [context] - Additional context for stateful schemes.
|
|
40
|
+
* @param {string} [context.method] - HTTP method for Digest/SigV4.
|
|
41
|
+
* @param {string} [context.url] - Request URL for Digest/SigV4.
|
|
42
|
+
* @param {string} [context.wwwAuthenticate] - WWW-Authenticate header for Digest.
|
|
43
|
+
* @param {Record<string, string>} [context.headers] - Request headers for SigV4.
|
|
44
|
+
* @param {Buffer} [context.body] - Request body for SigV4.
|
|
45
|
+
* @returns {string|undefined} The formatted Authorization header value, or `undefined` if credentials are incomplete.
|
|
46
|
+
*/
|
|
47
|
+
export declare function buildAuthHeader(auth: AuthConfig, context?: {
|
|
48
|
+
method?: string;
|
|
49
|
+
url?: string;
|
|
50
|
+
wwwAuthenticate?: string;
|
|
51
|
+
headers?: Record<string, string>;
|
|
52
|
+
body?: Buffer;
|
|
53
|
+
}): string | undefined;
|
|
54
|
+
/**
|
|
55
|
+
* Extracts the authentication scheme name from a WWW-Authenticate or Proxy-Authenticate header.
|
|
56
|
+
*
|
|
57
|
+
* @param {string} header - The raw authenticate header value.
|
|
58
|
+
* @returns {string|undefined} The lowercase scheme name (e.g. "basic", "bearer"), or `undefined` if not parseable.
|
|
59
|
+
*/
|
|
60
|
+
export declare function parseAuthenticateScheme(header: string): string | undefined;
|
|
61
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/core/auth.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,4DAA4D;AAC5D,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAID;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,UAAU,EAChB,OAAO,CAAC,EAAE;IACR,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GACA,MAAM,GAAG,SAAS,CAwBpB;AA4HD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG1E"}
|