nlcurl 0.7.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +149 -140
- package/dist/cache/groups.d.ts +75 -0
- package/dist/cache/groups.d.ts.map +1 -0
- package/dist/cache/groups.js +118 -0
- package/dist/cache/groups.js.map +1 -0
- package/dist/cache/no-vary-search.d.ts +33 -0
- package/dist/cache/no-vary-search.d.ts.map +1 -0
- package/dist/cache/no-vary-search.js +148 -0
- package/dist/cache/no-vary-search.js.map +1 -0
- package/dist/cache/range.d.ts +120 -0
- package/dist/cache/range.d.ts.map +1 -0
- package/dist/cache/range.js +193 -0
- package/dist/cache/range.js.map +1 -0
- package/dist/cache/store.d.ts +75 -37
- package/dist/cache/store.d.ts.map +1 -1
- package/dist/cache/store.js +217 -85
- package/dist/cache/store.js.map +1 -1
- package/dist/cache/types.d.ts +10 -39
- package/dist/cache/types.d.ts.map +1 -1
- package/dist/cli/args.d.ts +4 -37
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +3 -4
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/index.d.ts +0 -5
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +1 -6
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/output.d.ts +14 -20
- package/dist/cli/output.d.ts.map +1 -1
- package/dist/cli/output.js +14 -20
- package/dist/cli/output.js.map +1 -1
- package/dist/cookies/jar.d.ts +41 -40
- package/dist/cookies/jar.d.ts.map +1 -1
- package/dist/cookies/jar.js +65 -42
- package/dist/cookies/jar.js.map +1 -1
- package/dist/cookies/parser.d.ts +13 -17
- package/dist/cookies/parser.d.ts.map +1 -1
- package/dist/cookies/parser.js +23 -15
- package/dist/cookies/parser.js.map +1 -1
- package/dist/cookies/psl-data.d.ts +1 -1
- package/dist/cookies/psl-data.js +1 -1
- package/dist/cookies/public-suffix.d.ts +5 -27
- package/dist/cookies/public-suffix.d.ts.map +1 -1
- package/dist/cookies/public-suffix.js +5 -37
- package/dist/cookies/public-suffix.js.map +1 -1
- package/dist/core/auth.d.ts +61 -0
- package/dist/core/auth.d.ts.map +1 -0
- package/dist/core/auth.js +159 -0
- package/dist/core/auth.js.map +1 -0
- package/dist/core/client.d.ts +28 -40
- package/dist/core/client.d.ts.map +1 -1
- package/dist/core/client.js +31 -41
- package/dist/core/client.js.map +1 -1
- package/dist/core/errors.d.ts +64 -88
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +64 -88
- package/dist/core/errors.js.map +1 -1
- package/dist/core/request.d.ts +33 -113
- package/dist/core/request.d.ts.map +1 -1
- package/dist/core/response.d.ts +49 -66
- package/dist/core/response.d.ts.map +1 -1
- package/dist/core/response.js +45 -59
- package/dist/core/response.js.map +1 -1
- package/dist/core/session.d.ts +66 -78
- package/dist/core/session.d.ts.map +1 -1
- package/dist/core/session.js +136 -77
- package/dist/core/session.js.map +1 -1
- package/dist/core/validation.d.ts +58 -43
- package/dist/core/validation.d.ts.map +1 -1
- package/dist/core/validation.js +141 -56
- package/dist/core/validation.js.map +1 -1
- package/dist/dns/cache.d.ts +65 -0
- package/dist/dns/cache.d.ts.map +1 -0
- package/dist/dns/cache.js +119 -0
- package/dist/dns/cache.js.map +1 -0
- package/dist/dns/codec.d.ts +29 -19
- package/dist/dns/codec.d.ts.map +1 -1
- package/dist/dns/codec.js +73 -39
- package/dist/dns/codec.js.map +1 -1
- package/dist/dns/doh-resolver.d.ts +17 -31
- package/dist/dns/doh-resolver.d.ts.map +1 -1
- package/dist/dns/doh-resolver.js +47 -48
- package/dist/dns/doh-resolver.js.map +1 -1
- package/dist/dns/dot-resolver.d.ts +89 -0
- package/dist/dns/dot-resolver.d.ts.map +1 -0
- package/dist/dns/dot-resolver.js +166 -0
- package/dist/dns/dot-resolver.js.map +1 -0
- package/dist/dns/https-rr.d.ts +19 -30
- package/dist/dns/https-rr.d.ts.map +1 -1
- package/dist/dns/https-rr.js +22 -40
- package/dist/dns/https-rr.js.map +1 -1
- package/dist/dns/types.d.ts +31 -59
- package/dist/dns/types.d.ts.map +1 -1
- package/dist/dns/types.js +3 -14
- package/dist/dns/types.js.map +1 -1
- package/dist/fingerprints/akamai.d.ts +3 -11
- package/dist/fingerprints/akamai.d.ts.map +1 -1
- package/dist/fingerprints/akamai.js +3 -11
- package/dist/fingerprints/akamai.js.map +1 -1
- package/dist/fingerprints/database.d.ts +6 -14
- package/dist/fingerprints/database.d.ts.map +1 -1
- package/dist/fingerprints/database.js +6 -14
- package/dist/fingerprints/database.js.map +1 -1
- package/dist/fingerprints/extensions.d.ts +56 -71
- package/dist/fingerprints/extensions.d.ts.map +1 -1
- package/dist/fingerprints/extensions.js +58 -71
- package/dist/fingerprints/extensions.js.map +1 -1
- package/dist/fingerprints/ja3.d.ts +12 -30
- package/dist/fingerprints/ja3.d.ts.map +1 -1
- package/dist/fingerprints/ja3.js +12 -30
- package/dist/fingerprints/ja3.js.map +1 -1
- package/dist/fingerprints/ja4.d.ts +18 -0
- package/dist/fingerprints/ja4.d.ts.map +1 -0
- package/dist/fingerprints/ja4.js +81 -0
- package/dist/fingerprints/ja4.js.map +1 -0
- package/dist/fingerprints/profiles/chrome.d.ts +18 -21
- package/dist/fingerprints/profiles/chrome.d.ts.map +1 -1
- package/dist/fingerprints/profiles/chrome.js +35 -31
- package/dist/fingerprints/profiles/chrome.js.map +1 -1
- package/dist/fingerprints/profiles/edge.d.ts +7 -10
- package/dist/fingerprints/profiles/edge.d.ts.map +1 -1
- package/dist/fingerprints/profiles/edge.js +7 -10
- package/dist/fingerprints/profiles/edge.js.map +1 -1
- package/dist/fingerprints/profiles/firefox.d.ts +8 -11
- package/dist/fingerprints/profiles/firefox.d.ts.map +1 -1
- package/dist/fingerprints/profiles/firefox.js +8 -11
- package/dist/fingerprints/profiles/firefox.js.map +1 -1
- package/dist/fingerprints/profiles/safari.d.ts +11 -14
- package/dist/fingerprints/profiles/safari.d.ts.map +1 -1
- package/dist/fingerprints/profiles/safari.js +11 -14
- package/dist/fingerprints/profiles/safari.js.map +1 -1
- package/dist/fingerprints/profiles/tor.d.ts +5 -8
- package/dist/fingerprints/profiles/tor.d.ts.map +1 -1
- package/dist/fingerprints/profiles/tor.js +5 -8
- package/dist/fingerprints/profiles/tor.js.map +1 -1
- package/dist/fingerprints/types.d.ts +42 -73
- package/dist/fingerprints/types.d.ts.map +1 -1
- package/dist/hsts/store.d.ts +19 -21
- package/dist/hsts/store.d.ts.map +1 -1
- package/dist/hsts/store.js +20 -28
- package/dist/hsts/store.js.map +1 -1
- package/dist/hsts/types.d.ts +10 -14
- package/dist/hsts/types.d.ts.map +1 -1
- package/dist/http/alt-svc.d.ts +27 -52
- package/dist/http/alt-svc.d.ts.map +1 -1
- package/dist/http/alt-svc.js +17 -67
- package/dist/http/alt-svc.js.map +1 -1
- package/dist/http/early-hints.d.ts +23 -0
- package/dist/http/early-hints.d.ts.map +1 -0
- package/dist/http/early-hints.js +33 -0
- package/dist/http/early-hints.js.map +1 -0
- package/dist/http/form-data.d.ts +17 -35
- package/dist/http/form-data.d.ts.map +1 -1
- package/dist/http/form-data.js +12 -34
- package/dist/http/form-data.js.map +1 -1
- package/dist/http/h1/client.d.ts +14 -26
- package/dist/http/h1/client.d.ts.map +1 -1
- package/dist/http/h1/client.js +14 -23
- package/dist/http/h1/client.js.map +1 -1
- package/dist/http/h1/encoder.d.ts +21 -17
- package/dist/http/h1/encoder.d.ts.map +1 -1
- package/dist/http/h1/encoder.js +56 -20
- package/dist/http/h1/encoder.js.map +1 -1
- package/dist/http/h1/parser.d.ts +23 -59
- package/dist/http/h1/parser.d.ts.map +1 -1
- package/dist/http/h1/parser.js +61 -55
- package/dist/http/h1/parser.js.map +1 -1
- package/dist/http/h2/client.d.ts +23 -59
- package/dist/http/h2/client.d.ts.map +1 -1
- package/dist/http/h2/client.js +107 -64
- package/dist/http/h2/client.js.map +1 -1
- package/dist/http/h2/frames.d.ts +53 -84
- package/dist/http/h2/frames.d.ts.map +1 -1
- package/dist/http/h2/frames.js +48 -76
- package/dist/http/h2/frames.js.map +1 -1
- package/dist/http/h2/hpack.d.ts +20 -36
- package/dist/http/h2/hpack.d.ts.map +1 -1
- package/dist/http/h2/hpack.js +41 -36
- package/dist/http/h2/hpack.js.map +1 -1
- package/dist/http/negotiator.d.ts +25 -38
- package/dist/http/negotiator.d.ts.map +1 -1
- package/dist/http/negotiator.js +17 -38
- package/dist/http/negotiator.js.map +1 -1
- package/dist/http/pool.d.ts +34 -64
- package/dist/http/pool.d.ts.map +1 -1
- package/dist/http/pool.js +22 -41
- package/dist/http/pool.js.map +1 -1
- package/dist/http/resumable-upload.d.ts +76 -0
- package/dist/http/resumable-upload.d.ts.map +1 -0
- package/dist/http/resumable-upload.js +104 -0
- package/dist/http/resumable-upload.js.map +1 -0
- package/dist/http/trailers.d.ts +29 -0
- package/dist/http/trailers.d.ts.map +1 -0
- package/dist/http/trailers.js +57 -0
- package/dist/http/trailers.js.map +1 -0
- package/dist/index.d.ts +24 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -3
- package/dist/index.js.map +1 -1
- package/dist/middleware/circuit-breaker.d.ts +44 -0
- package/dist/middleware/circuit-breaker.d.ts.map +1 -0
- package/dist/middleware/circuit-breaker.js +96 -0
- package/dist/middleware/circuit-breaker.js.map +1 -0
- package/dist/middleware/interceptor.d.ts +13 -32
- package/dist/middleware/interceptor.d.ts.map +1 -1
- package/dist/middleware/interceptor.js +11 -16
- package/dist/middleware/interceptor.js.map +1 -1
- package/dist/middleware/rate-limiter.d.ts +8 -17
- package/dist/middleware/rate-limiter.d.ts.map +1 -1
- package/dist/middleware/rate-limiter.js +11 -12
- package/dist/middleware/rate-limiter.js.map +1 -1
- package/dist/middleware/retry-after.d.ts +15 -0
- package/dist/middleware/retry-after.d.ts.map +1 -0
- package/dist/middleware/retry-after.js +36 -0
- package/dist/middleware/retry-after.js.map +1 -0
- package/dist/middleware/retry.d.ts +9 -18
- package/dist/middleware/retry.d.ts.map +1 -1
- package/dist/middleware/retry.js +12 -9
- package/dist/middleware/retry.js.map +1 -1
- package/dist/proxy/auth.d.ts +73 -0
- package/dist/proxy/auth.d.ts.map +1 -0
- package/dist/proxy/auth.js +129 -0
- package/dist/proxy/auth.js.map +1 -0
- package/dist/proxy/env-proxy.d.ts +5 -15
- package/dist/proxy/env-proxy.d.ts.map +1 -1
- package/dist/proxy/env-proxy.js +5 -23
- package/dist/proxy/env-proxy.js.map +1 -1
- package/dist/proxy/http-proxy.d.ts +12 -19
- package/dist/proxy/http-proxy.d.ts.map +1 -1
- package/dist/proxy/http-proxy.js +5 -8
- package/dist/proxy/http-proxy.js.map +1 -1
- package/dist/proxy/socks.d.ts +13 -20
- package/dist/proxy/socks.d.ts.map +1 -1
- package/dist/proxy/socks.js +8 -10
- package/dist/proxy/socks.js.map +1 -1
- package/dist/sse/parser.d.ts +16 -37
- package/dist/sse/parser.d.ts.map +1 -1
- package/dist/sse/parser.js +31 -28
- package/dist/sse/parser.js.map +1 -1
- package/dist/tls/constants.d.ts +21 -72
- package/dist/tls/constants.d.ts.map +1 -1
- package/dist/tls/constants.js +21 -72
- package/dist/tls/constants.js.map +1 -1
- package/dist/tls/ct.d.ts +78 -0
- package/dist/tls/ct.d.ts.map +1 -0
- package/dist/tls/ct.js +175 -0
- package/dist/tls/ct.js.map +1 -0
- package/dist/tls/early-data.d.ts +45 -0
- package/dist/tls/early-data.d.ts.map +1 -0
- package/dist/tls/early-data.js +46 -0
- package/dist/tls/early-data.js.map +1 -0
- package/dist/tls/ech.d.ts +68 -85
- package/dist/tls/ech.d.ts.map +1 -1
- package/dist/tls/ech.js +54 -102
- package/dist/tls/ech.js.map +1 -1
- package/dist/tls/keylog.d.ts +34 -0
- package/dist/tls/keylog.d.ts.map +1 -0
- package/dist/tls/keylog.js +64 -0
- package/dist/tls/keylog.js.map +1 -0
- package/dist/tls/node-engine.d.ts +10 -17
- package/dist/tls/node-engine.d.ts.map +1 -1
- package/dist/tls/node-engine.js +41 -18
- package/dist/tls/node-engine.js.map +1 -1
- package/dist/tls/ocsp.d.ts +55 -0
- package/dist/tls/ocsp.d.ts.map +1 -0
- package/dist/tls/ocsp.js +131 -0
- package/dist/tls/ocsp.js.map +1 -0
- package/dist/tls/pin-verification.d.ts +5 -4
- package/dist/tls/pin-verification.d.ts.map +1 -1
- package/dist/tls/pin-verification.js +5 -11
- package/dist/tls/pin-verification.js.map +1 -1
- package/dist/tls/session-cache.d.ts +27 -39
- package/dist/tls/session-cache.d.ts.map +1 -1
- package/dist/tls/session-cache.js +20 -24
- package/dist/tls/session-cache.js.map +1 -1
- package/dist/tls/stealth/client-hello.d.ts +26 -45
- package/dist/tls/stealth/client-hello.d.ts.map +1 -1
- package/dist/tls/stealth/client-hello.js +15 -31
- package/dist/tls/stealth/client-hello.js.map +1 -1
- package/dist/tls/stealth/engine.d.ts +10 -15
- package/dist/tls/stealth/engine.d.ts.map +1 -1
- package/dist/tls/stealth/engine.js +98 -18
- package/dist/tls/stealth/engine.js.map +1 -1
- package/dist/tls/stealth/handshake.d.ts +32 -31
- package/dist/tls/stealth/handshake.d.ts.map +1 -1
- package/dist/tls/stealth/handshake.js +74 -47
- package/dist/tls/stealth/handshake.js.map +1 -1
- package/dist/tls/stealth/key-schedule.d.ts +81 -86
- package/dist/tls/stealth/key-schedule.d.ts.map +1 -1
- package/dist/tls/stealth/key-schedule.js +70 -58
- package/dist/tls/stealth/key-schedule.js.map +1 -1
- package/dist/tls/stealth/record-layer.d.ts +52 -75
- package/dist/tls/stealth/record-layer.d.ts.map +1 -1
- package/dist/tls/stealth/record-layer.js +47 -63
- package/dist/tls/stealth/record-layer.js.map +1 -1
- package/dist/tls/stealth/tls12-handshake.d.ts +16 -0
- package/dist/tls/stealth/tls12-handshake.d.ts.map +1 -1
- package/dist/tls/stealth/tls12-handshake.js +10 -2
- package/dist/tls/stealth/tls12-handshake.js.map +1 -1
- package/dist/tls/types.d.ts +46 -60
- package/dist/tls/types.d.ts.map +1 -1
- package/dist/utils/buffer-reader.d.ts +26 -81
- package/dist/utils/buffer-reader.d.ts.map +1 -1
- package/dist/utils/buffer-reader.js +26 -81
- package/dist/utils/buffer-reader.js.map +1 -1
- package/dist/utils/buffer-writer.d.ts +30 -66
- package/dist/utils/buffer-writer.d.ts.map +1 -1
- package/dist/utils/buffer-writer.js +30 -66
- package/dist/utils/buffer-writer.js.map +1 -1
- package/dist/utils/compression.d.ts +18 -0
- package/dist/utils/compression.d.ts.map +1 -0
- package/dist/utils/compression.js +34 -0
- package/dist/utils/compression.js.map +1 -0
- package/dist/utils/dictionary-transport.d.ts +97 -0
- package/dist/utils/dictionary-transport.d.ts.map +1 -0
- package/dist/utils/dictionary-transport.js +171 -0
- package/dist/utils/dictionary-transport.js.map +1 -0
- package/dist/utils/encoding.d.ts +12 -30
- package/dist/utils/encoding.d.ts.map +1 -1
- package/dist/utils/encoding.js +15 -46
- package/dist/utils/encoding.js.map +1 -1
- package/dist/utils/happy-eyeballs.d.ts +18 -8
- package/dist/utils/happy-eyeballs.d.ts.map +1 -1
- package/dist/utils/happy-eyeballs.js +19 -27
- package/dist/utils/happy-eyeballs.js.map +1 -1
- package/dist/utils/logger.d.ts +54 -81
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +92 -64
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/tcp-fast-open.d.ts +30 -0
- package/dist/utils/tcp-fast-open.d.ts.map +1 -0
- package/dist/utils/tcp-fast-open.js +36 -0
- package/dist/utils/tcp-fast-open.js.map +1 -0
- package/dist/utils/url.d.ts +18 -25
- package/dist/utils/url.d.ts.map +1 -1
- package/dist/utils/url.js +18 -25
- package/dist/utils/url.js.map +1 -1
- package/dist/ws/client.d.ts +35 -53
- package/dist/ws/client.d.ts.map +1 -1
- package/dist/ws/client.js +96 -38
- package/dist/ws/client.js.map +1 -1
- package/dist/ws/frame.d.ts +24 -41
- package/dist/ws/frame.d.ts.map +1 -1
- package/dist/ws/frame.js +26 -33
- package/dist/ws/frame.js.map +1 -1
- package/dist/ws/permessage-deflate.d.ts +23 -28
- package/dist/ws/permessage-deflate.d.ts.map +1 -1
- package/dist/ws/permessage-deflate.js +18 -26
- package/dist/ws/permessage-deflate.js.map +1 -1
- package/package.json +2 -2
- package/dist/http/h3/detection.d.ts +0 -17
- package/dist/http/h3/detection.d.ts.map +0 -1
- package/dist/http/h3/detection.js +0 -59
- package/dist/http/h3/detection.js.map +0 -1
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import * as zlib from "node:zlib";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
const gzipAsync = promisify(zlib.gzip);
|
|
4
|
+
const deflateAsync = promisify(zlib.deflate);
|
|
5
|
+
const brotliCompressAsync = promisify(zlib.brotliCompress);
|
|
6
|
+
/**
|
|
7
|
+
* Compress a request body buffer with the specified encoding.
|
|
8
|
+
*
|
|
9
|
+
* @param {Buffer} body - Uncompressed body bytes.
|
|
10
|
+
* @param {RequestEncoding} encoding - Compression algorithm.
|
|
11
|
+
* @returns {Promise<Buffer>} Compressed buffer.
|
|
12
|
+
*/
|
|
13
|
+
export async function compressBody(body, encoding) {
|
|
14
|
+
switch (encoding) {
|
|
15
|
+
case "gzip":
|
|
16
|
+
return gzipAsync(body);
|
|
17
|
+
case "deflate":
|
|
18
|
+
return deflateAsync(body);
|
|
19
|
+
case "br":
|
|
20
|
+
return brotliCompressAsync(body);
|
|
21
|
+
default:
|
|
22
|
+
return body;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Determine whether a body is large enough to benefit from compression.
|
|
27
|
+
*
|
|
28
|
+
* @param {number} bodySize - Body size in bytes.
|
|
29
|
+
* @returns {boolean} `true` if the body meets the minimum threshold.
|
|
30
|
+
*/
|
|
31
|
+
export function shouldCompress(bodySize) {
|
|
32
|
+
return bodySize >= 1024;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=compression.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compression.js","sourceRoot":"","sources":["../../src/utils/compression.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACvC,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC7C,MAAM,mBAAmB,GAAG,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AAK3D;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,QAAyB;IACxE,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,MAAM;YACT,OAAO,SAAS,CAAC,IAAI,CAAoB,CAAC;QAC5C,KAAK,SAAS;YACZ,OAAO,YAAY,CAAC,IAAI,CAAoB,CAAC;QAC/C,KAAK,IAAI;YACP,OAAO,mBAAmB,CAAC,IAAI,CAAoB,CAAC;QACtD;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,OAAO,QAAQ,IAAI,IAAI,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/** Stored compression dictionary with associated metadata. */
|
|
2
|
+
export interface CompressionDictionary {
|
|
3
|
+
/** SHA-256 hash of the dictionary data in structured field format. */
|
|
4
|
+
hash: string;
|
|
5
|
+
/** URL from which the dictionary was fetched. */
|
|
6
|
+
url: string;
|
|
7
|
+
/** Raw dictionary bytes. */
|
|
8
|
+
data: Buffer;
|
|
9
|
+
/** Timestamp (ms since epoch) when the dictionary was stored. */
|
|
10
|
+
storedAt: number;
|
|
11
|
+
/** URL match pattern from the `Use-As-Dictionary` header. */
|
|
12
|
+
matchPattern?: string;
|
|
13
|
+
/** Expiry timestamp (ms since epoch). */
|
|
14
|
+
expiresAt?: number;
|
|
15
|
+
}
|
|
16
|
+
/** Configuration for the compression dictionary store. */
|
|
17
|
+
export interface DictionaryConfig {
|
|
18
|
+
/** Maximum number of dictionaries to cache. */
|
|
19
|
+
maxEntries?: number;
|
|
20
|
+
/** Maximum individual dictionary size in bytes. */
|
|
21
|
+
maxDictionarySize?: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Parse a `Use-As-Dictionary` response header.
|
|
25
|
+
*
|
|
26
|
+
* @param {string} header - Raw header value.
|
|
27
|
+
* @returns {{ match?: string; matchDest?: string[]; id?: string } | null} Parsed fields, or `null` if the header is empty.
|
|
28
|
+
*/
|
|
29
|
+
export declare function parseUseAsDictionary(header: string): {
|
|
30
|
+
match?: string;
|
|
31
|
+
matchDest?: string[];
|
|
32
|
+
id?: string;
|
|
33
|
+
} | null;
|
|
34
|
+
/**
|
|
35
|
+
* Compute the SHA-256 structured hash of dictionary data.
|
|
36
|
+
*
|
|
37
|
+
* @param {Buffer} data - Raw dictionary bytes.
|
|
38
|
+
* @returns {string} Hash string in structured field byte-sequence format.
|
|
39
|
+
*/
|
|
40
|
+
export declare function computeDictionaryHash(data: Buffer): string;
|
|
41
|
+
/**
|
|
42
|
+
* Build an `Available-Dictionary` request header value.
|
|
43
|
+
*
|
|
44
|
+
* @param {string} hash - Dictionary hash.
|
|
45
|
+
* @returns {string} Header value string.
|
|
46
|
+
*/
|
|
47
|
+
export declare function buildAvailableDictionaryHeader(hash: string): string;
|
|
48
|
+
/**
|
|
49
|
+
* Append dictionary-based encodings to an `Accept-Encoding` header.
|
|
50
|
+
*
|
|
51
|
+
* @param {string} [existingEncoding] - Current `Accept-Encoding` value.
|
|
52
|
+
* @returns {string} Updated encoding string with `dcb` and `dcz` appended.
|
|
53
|
+
*/
|
|
54
|
+
export declare function buildDictionaryAcceptEncoding(existingEncoding?: string): string;
|
|
55
|
+
/** Cache of compression dictionaries for shared dictionary transport. */
|
|
56
|
+
export declare class DictionaryStore {
|
|
57
|
+
private readonly dictionaries;
|
|
58
|
+
private readonly maxEntries;
|
|
59
|
+
private readonly maxDictionarySize;
|
|
60
|
+
/**
|
|
61
|
+
* Create a new dictionary store.
|
|
62
|
+
*
|
|
63
|
+
* @param {DictionaryConfig} [config] - Cache size and dictionary size limits.
|
|
64
|
+
*/
|
|
65
|
+
constructor(config?: DictionaryConfig);
|
|
66
|
+
/**
|
|
67
|
+
* Store a dictionary response.
|
|
68
|
+
*
|
|
69
|
+
* @param {string} url - URL the dictionary was fetched from.
|
|
70
|
+
* @param {Buffer} data - Raw dictionary bytes.
|
|
71
|
+
* @param {{ match?: string; id?: string }} [metadata] - Match pattern and ID from the response header.
|
|
72
|
+
* @param {number} [maxAge] - Maximum age in seconds.
|
|
73
|
+
*/
|
|
74
|
+
store(url: string, data: Buffer, metadata?: {
|
|
75
|
+
match?: string;
|
|
76
|
+
id?: string;
|
|
77
|
+
}, maxAge?: number): void;
|
|
78
|
+
/**
|
|
79
|
+
* Find a dictionary whose match pattern covers the given request URL.
|
|
80
|
+
*
|
|
81
|
+
* @param {string} requestUrl - URL being requested.
|
|
82
|
+
* @returns {CompressionDictionary | undefined} Matching dictionary, or `undefined` if none found.
|
|
83
|
+
*/
|
|
84
|
+
findForUrl(requestUrl: string): CompressionDictionary | undefined;
|
|
85
|
+
/**
|
|
86
|
+
* Retrieve a dictionary by its hash.
|
|
87
|
+
*
|
|
88
|
+
* @param {string} hash - Dictionary hash string.
|
|
89
|
+
* @returns {CompressionDictionary | undefined} Dictionary entry, or `undefined` if not found.
|
|
90
|
+
*/
|
|
91
|
+
getByHash(hash: string): CompressionDictionary | undefined;
|
|
92
|
+
/** Number of dictionaries currently stored. */
|
|
93
|
+
get size(): number;
|
|
94
|
+
/** Remove all stored dictionaries. */
|
|
95
|
+
clear(): void;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=dictionary-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dictionary-transport.d.ts","sourceRoot":"","sources":["../../src/utils/dictionary-transport.ts"],"names":[],"mappings":"AAEA,8DAA8D;AAC9D,MAAM,WAAW,qBAAqB;IACpC,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,GAAG,EAAE,MAAM,CAAC;IACZ,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,QAAQ,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,0DAA0D;AAC1D,MAAM,WAAW,gBAAgB;IAC/B,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb,GAAG,IAAI,CA2BP;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ/E;AAED,yEAAyE;AACzE,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA4C;IACzE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAE3C;;;;OAIG;gBACS,MAAM,CAAC,EAAE,gBAAgB;IAKrC;;;;;;;OAOG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IA2BnG;;;;;OAKG;IACH,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS;IAmBjE;;;;;OAKG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS;IAI1D,+CAA+C;IAC/C,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,sCAAsC;IACtC,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
/**
|
|
3
|
+
* Parse a `Use-As-Dictionary` response header.
|
|
4
|
+
*
|
|
5
|
+
* @param {string} header - Raw header value.
|
|
6
|
+
* @returns {{ match?: string; matchDest?: string[]; id?: string } | null} Parsed fields, or `null` if the header is empty.
|
|
7
|
+
*/
|
|
8
|
+
export function parseUseAsDictionary(header) {
|
|
9
|
+
if (!header)
|
|
10
|
+
return null;
|
|
11
|
+
const result = {};
|
|
12
|
+
const matchRegex = /match="([^"]+)"/;
|
|
13
|
+
const matchMatch = header.match(matchRegex);
|
|
14
|
+
if (matchMatch) {
|
|
15
|
+
result.match = matchMatch[1];
|
|
16
|
+
}
|
|
17
|
+
const destRegex = /match-dest=\(([^)]*)\)/;
|
|
18
|
+
const destMatch = header.match(destRegex);
|
|
19
|
+
if (destMatch) {
|
|
20
|
+
result.matchDest = destMatch[1]
|
|
21
|
+
.split(/\s+/)
|
|
22
|
+
.map((s) => s.replace(/"/g, ""))
|
|
23
|
+
.filter(Boolean);
|
|
24
|
+
}
|
|
25
|
+
const idRegex = /id="([^"]+)"/;
|
|
26
|
+
const idMatch = header.match(idRegex);
|
|
27
|
+
if (idMatch) {
|
|
28
|
+
result.id = idMatch[1];
|
|
29
|
+
}
|
|
30
|
+
return result;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Compute the SHA-256 structured hash of dictionary data.
|
|
34
|
+
*
|
|
35
|
+
* @param {Buffer} data - Raw dictionary bytes.
|
|
36
|
+
* @returns {string} Hash string in structured field byte-sequence format.
|
|
37
|
+
*/
|
|
38
|
+
export function computeDictionaryHash(data) {
|
|
39
|
+
const hash = createHash("sha256").update(data).digest("base64");
|
|
40
|
+
return `:${hash}:`;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Build an `Available-Dictionary` request header value.
|
|
44
|
+
*
|
|
45
|
+
* @param {string} hash - Dictionary hash.
|
|
46
|
+
* @returns {string} Header value string.
|
|
47
|
+
*/
|
|
48
|
+
export function buildAvailableDictionaryHeader(hash) {
|
|
49
|
+
return hash;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Append dictionary-based encodings to an `Accept-Encoding` header.
|
|
53
|
+
*
|
|
54
|
+
* @param {string} [existingEncoding] - Current `Accept-Encoding` value.
|
|
55
|
+
* @returns {string} Updated encoding string with `dcb` and `dcz` appended.
|
|
56
|
+
*/
|
|
57
|
+
export function buildDictionaryAcceptEncoding(existingEncoding) {
|
|
58
|
+
const base = existingEncoding ?? "gzip, deflate, br";
|
|
59
|
+
const encodings = base.split(",").map((s) => s.trim());
|
|
60
|
+
if (!encodings.includes("dcb"))
|
|
61
|
+
encodings.push("dcb");
|
|
62
|
+
if (!encodings.includes("dcz"))
|
|
63
|
+
encodings.push("dcz");
|
|
64
|
+
return encodings.join(", ");
|
|
65
|
+
}
|
|
66
|
+
/** Cache of compression dictionaries for shared dictionary transport. */
|
|
67
|
+
export class DictionaryStore {
|
|
68
|
+
dictionaries = new Map();
|
|
69
|
+
maxEntries;
|
|
70
|
+
maxDictionarySize;
|
|
71
|
+
/**
|
|
72
|
+
* Create a new dictionary store.
|
|
73
|
+
*
|
|
74
|
+
* @param {DictionaryConfig} [config] - Cache size and dictionary size limits.
|
|
75
|
+
*/
|
|
76
|
+
constructor(config) {
|
|
77
|
+
this.maxEntries = config?.maxEntries ?? 50;
|
|
78
|
+
this.maxDictionarySize = config?.maxDictionarySize ?? 10 * 1024 * 1024;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Store a dictionary response.
|
|
82
|
+
*
|
|
83
|
+
* @param {string} url - URL the dictionary was fetched from.
|
|
84
|
+
* @param {Buffer} data - Raw dictionary bytes.
|
|
85
|
+
* @param {{ match?: string; id?: string }} [metadata] - Match pattern and ID from the response header.
|
|
86
|
+
* @param {number} [maxAge] - Maximum age in seconds.
|
|
87
|
+
*/
|
|
88
|
+
store(url, data, metadata, maxAge) {
|
|
89
|
+
if (data.length > this.maxDictionarySize)
|
|
90
|
+
return;
|
|
91
|
+
if (this.dictionaries.size >= this.maxEntries) {
|
|
92
|
+
let oldest;
|
|
93
|
+
let oldestTime = Infinity;
|
|
94
|
+
for (const [key, entry] of this.dictionaries) {
|
|
95
|
+
if (entry.storedAt < oldestTime) {
|
|
96
|
+
oldestTime = entry.storedAt;
|
|
97
|
+
oldest = key;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (oldest)
|
|
101
|
+
this.dictionaries.delete(oldest);
|
|
102
|
+
}
|
|
103
|
+
const hash = computeDictionaryHash(data);
|
|
104
|
+
const now = Date.now();
|
|
105
|
+
this.dictionaries.set(hash, {
|
|
106
|
+
hash,
|
|
107
|
+
url,
|
|
108
|
+
data,
|
|
109
|
+
storedAt: now,
|
|
110
|
+
matchPattern: metadata?.match,
|
|
111
|
+
expiresAt: maxAge ? now + maxAge * 1000 : undefined,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Find a dictionary whose match pattern covers the given request URL.
|
|
116
|
+
*
|
|
117
|
+
* @param {string} requestUrl - URL being requested.
|
|
118
|
+
* @returns {CompressionDictionary | undefined} Matching dictionary, or `undefined` if none found.
|
|
119
|
+
*/
|
|
120
|
+
findForUrl(requestUrl) {
|
|
121
|
+
const now = Date.now();
|
|
122
|
+
for (const dict of this.dictionaries.values()) {
|
|
123
|
+
if (dict.expiresAt && dict.expiresAt < now) {
|
|
124
|
+
this.dictionaries.delete(dict.hash);
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
if (dict.matchPattern) {
|
|
128
|
+
if (matchesPattern(requestUrl, dict.matchPattern, dict.url)) {
|
|
129
|
+
return dict;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return undefined;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Retrieve a dictionary by its hash.
|
|
137
|
+
*
|
|
138
|
+
* @param {string} hash - Dictionary hash string.
|
|
139
|
+
* @returns {CompressionDictionary | undefined} Dictionary entry, or `undefined` if not found.
|
|
140
|
+
*/
|
|
141
|
+
getByHash(hash) {
|
|
142
|
+
return this.dictionaries.get(hash);
|
|
143
|
+
}
|
|
144
|
+
/** Number of dictionaries currently stored. */
|
|
145
|
+
get size() {
|
|
146
|
+
return this.dictionaries.size;
|
|
147
|
+
}
|
|
148
|
+
/** Remove all stored dictionaries. */
|
|
149
|
+
clear() {
|
|
150
|
+
this.dictionaries.clear();
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
function matchesPattern(requestUrl, pattern, dictionaryUrl) {
|
|
154
|
+
try {
|
|
155
|
+
const dictBase = new URL(dictionaryUrl);
|
|
156
|
+
const reqUrl = new URL(requestUrl);
|
|
157
|
+
if (reqUrl.origin !== dictBase.origin)
|
|
158
|
+
return false;
|
|
159
|
+
if (pattern === "*" || pattern === "/*")
|
|
160
|
+
return true;
|
|
161
|
+
if (pattern.endsWith("*")) {
|
|
162
|
+
const prefix = pattern.slice(0, -1);
|
|
163
|
+
return reqUrl.pathname.startsWith(prefix);
|
|
164
|
+
}
|
|
165
|
+
return reqUrl.pathname === pattern;
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=dictionary-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dictionary-transport.js","sourceRoot":"","sources":["../../src/utils/dictionary-transport.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/encoding.d.ts
CHANGED
|
@@ -1,46 +1,28 @@
|
|
|
1
1
|
import { Transform } from "node:stream";
|
|
2
|
-
/**
|
|
3
|
-
* `true` when the current Node.js runtime provides native Zstandard
|
|
4
|
-
* decompression support (`zlib.zstdDecompress`). `false` on older Node.js
|
|
5
|
-
* versions that lack the API.
|
|
6
|
-
*/
|
|
2
|
+
/** Whether the current Node.js build supports zstd decompression. */
|
|
7
3
|
export declare const supportsZstd: boolean;
|
|
8
4
|
/**
|
|
9
|
-
*
|
|
10
|
-
* Content-Encoding layers (e.g. `"gzip, br"`). Layers are applied in
|
|
11
|
-
* reverse order per RFC 9110 §8.4. Throws if the number of layers
|
|
12
|
-
* exceeds {@link MAX_CONTENT_ENCODING_LAYERS}.
|
|
5
|
+
* Decompress a response body according to `Content-Encoding` layers.
|
|
13
6
|
*
|
|
14
|
-
* @param {Buffer}
|
|
15
|
-
* @param {string | undefined} contentEncoding -
|
|
16
|
-
* @returns {Promise<Buffer>} Decompressed
|
|
7
|
+
* @param {Buffer} body - Compressed body bytes.
|
|
8
|
+
* @param {string | undefined} contentEncoding - Comma-separated encoding list.
|
|
9
|
+
* @returns {Promise<Buffer>} Decompressed buffer.
|
|
17
10
|
*/
|
|
18
11
|
export declare function decompressBody(body: Buffer, contentEncoding: string | undefined): Promise<Buffer>;
|
|
19
12
|
/**
|
|
20
|
-
*
|
|
21
|
-
* using the algorithm(s) indicated by `contentEncoding`. Supports multiple
|
|
22
|
-
* comma-separated encodings (e.g. `"gzip, br"`). Returns `null` when no
|
|
23
|
-
* transform is needed. Throws if the number of encoding layers exceeds
|
|
24
|
-
* {@link MAX_CONTENT_ENCODING_LAYERS}.
|
|
13
|
+
* Create a streaming decompressor for the given `Content-Encoding`.
|
|
25
14
|
*
|
|
26
|
-
* @param {string | undefined} contentEncoding -
|
|
27
|
-
* @returns {Transform | null}
|
|
15
|
+
* @param {string | undefined} contentEncoding - Comma-separated encoding list.
|
|
16
|
+
* @returns {Transform | null} Transform stream, or `null` if no decompression is needed.
|
|
28
17
|
*/
|
|
29
18
|
export declare function createDecompressStream(contentEncoding: string | undefined): Transform | null;
|
|
30
|
-
/**
|
|
31
|
-
* Returns the default `Accept-Encoding` header value supported by this
|
|
32
|
-
* Node.js runtime. Includes `zstd` when Zstandard is available.
|
|
33
|
-
*
|
|
34
|
-
* @returns {string} E.g. `"gzip, deflate, br, zstd"` or `"gzip, deflate, br"`.
|
|
35
|
-
*/
|
|
19
|
+
/** Return the default `Accept-Encoding` header value for this runtime. */
|
|
36
20
|
export declare function defaultAcceptEncoding(): string;
|
|
37
21
|
/**
|
|
38
|
-
*
|
|
39
|
-
* current runtime does not support Zstandard decompression. Otherwise returns
|
|
40
|
-
* the value unchanged.
|
|
22
|
+
* Strip unsupported encodings (e.g. `zstd`) from an `Accept-Encoding` value.
|
|
41
23
|
*
|
|
42
|
-
* @param {string} value -
|
|
43
|
-
* @returns {string} Sanitized
|
|
24
|
+
* @param {string} value - Original `Accept-Encoding` header value.
|
|
25
|
+
* @returns {string} Sanitized header value.
|
|
44
26
|
*/
|
|
45
27
|
export declare function sanitizeAcceptEncoding(value: string): string;
|
|
46
28
|
//# sourceMappingURL=encoding.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["../../src/utils/encoding.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["../../src/utils/encoding.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AASxC,qEAAqE;AACrE,eAAO,MAAM,YAAY,EAAE,OAAsC,CAAC;AAwClE;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAWvG;AA2BD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,eAAe,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,IAAI,CA0C5F;AAED,0EAA0E;AAC1E,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAO5D"}
|
package/dist/utils/encoding.js
CHANGED
|
@@ -6,22 +6,9 @@ const inflateAsync = promisify(zlib.inflate);
|
|
|
6
6
|
const brotliDecompressAsync = promisify(zlib.brotliDecompress);
|
|
7
7
|
const _zstdFn = zlib["zstdDecompress"];
|
|
8
8
|
const zstdDecompressAsync = typeof _zstdFn === "function" ? promisify(_zstdFn) : null;
|
|
9
|
-
/**
|
|
10
|
-
* `true` when the current Node.js runtime provides native Zstandard
|
|
11
|
-
* decompression support (`zlib.zstdDecompress`). `false` on older Node.js
|
|
12
|
-
* versions that lack the API.
|
|
13
|
-
*/
|
|
9
|
+
/** Whether the current Node.js build supports zstd decompression. */
|
|
14
10
|
export const supportsZstd = zstdDecompressAsync !== null;
|
|
15
|
-
/**
|
|
16
|
-
* Maximum number of Content-Encoding layers permitted. Prevents
|
|
17
|
-
* decompression bomb attacks that nest many encoding layers to cause
|
|
18
|
-
* exponential memory/CPU usage. Matches undici's limit.
|
|
19
|
-
*/
|
|
20
11
|
const MAX_CONTENT_ENCODING_LAYERS = 5;
|
|
21
|
-
/**
|
|
22
|
-
* Parses a Content-Encoding header value into individual encoding tokens,
|
|
23
|
-
* filters out `identity`, and validates the layer count.
|
|
24
|
-
*/
|
|
25
12
|
function parseEncodings(contentEncoding) {
|
|
26
13
|
const encodings = contentEncoding
|
|
27
14
|
.split(",")
|
|
@@ -32,9 +19,6 @@ function parseEncodings(contentEncoding) {
|
|
|
32
19
|
}
|
|
33
20
|
return encodings;
|
|
34
21
|
}
|
|
35
|
-
/**
|
|
36
|
-
* Decompresses a single buffer using the specified encoding algorithm.
|
|
37
|
-
*/
|
|
38
22
|
async function decompressSingle(body, encoding) {
|
|
39
23
|
switch (encoding) {
|
|
40
24
|
case "gzip":
|
|
@@ -54,14 +38,11 @@ async function decompressSingle(body, encoding) {
|
|
|
54
38
|
}
|
|
55
39
|
}
|
|
56
40
|
/**
|
|
57
|
-
*
|
|
58
|
-
* Content-Encoding layers (e.g. `"gzip, br"`). Layers are applied in
|
|
59
|
-
* reverse order per RFC 9110 §8.4. Throws if the number of layers
|
|
60
|
-
* exceeds {@link MAX_CONTENT_ENCODING_LAYERS}.
|
|
41
|
+
* Decompress a response body according to `Content-Encoding` layers.
|
|
61
42
|
*
|
|
62
|
-
* @param {Buffer}
|
|
63
|
-
* @param {string | undefined} contentEncoding -
|
|
64
|
-
* @returns {Promise<Buffer>} Decompressed
|
|
43
|
+
* @param {Buffer} body - Compressed body bytes.
|
|
44
|
+
* @param {string | undefined} contentEncoding - Comma-separated encoding list.
|
|
45
|
+
* @returns {Promise<Buffer>} Decompressed buffer.
|
|
65
46
|
*/
|
|
66
47
|
export async function decompressBody(body, contentEncoding) {
|
|
67
48
|
if (!contentEncoding || body.length === 0)
|
|
@@ -75,9 +56,6 @@ export async function decompressBody(body, contentEncoding) {
|
|
|
75
56
|
}
|
|
76
57
|
return result;
|
|
77
58
|
}
|
|
78
|
-
/**
|
|
79
|
-
* Creates a decompressor Transform for a single encoding algorithm.
|
|
80
|
-
*/
|
|
81
59
|
function createSingleDecompressStream(encoding) {
|
|
82
60
|
switch (encoding) {
|
|
83
61
|
case "gzip":
|
|
@@ -99,14 +77,10 @@ function createSingleDecompressStream(encoding) {
|
|
|
99
77
|
}
|
|
100
78
|
}
|
|
101
79
|
/**
|
|
102
|
-
*
|
|
103
|
-
* using the algorithm(s) indicated by `contentEncoding`. Supports multiple
|
|
104
|
-
* comma-separated encodings (e.g. `"gzip, br"`). Returns `null` when no
|
|
105
|
-
* transform is needed. Throws if the number of encoding layers exceeds
|
|
106
|
-
* {@link MAX_CONTENT_ENCODING_LAYERS}.
|
|
80
|
+
* Create a streaming decompressor for the given `Content-Encoding`.
|
|
107
81
|
*
|
|
108
|
-
* @param {string | undefined} contentEncoding -
|
|
109
|
-
* @returns {Transform | null}
|
|
82
|
+
* @param {string | undefined} contentEncoding - Comma-separated encoding list.
|
|
83
|
+
* @returns {Transform | null} Transform stream, or `null` if no decompression is needed.
|
|
110
84
|
*/
|
|
111
85
|
export function createDecompressStream(contentEncoding) {
|
|
112
86
|
if (!contentEncoding)
|
|
@@ -138,29 +112,24 @@ export function createDecompressStream(contentEncoding) {
|
|
|
138
112
|
},
|
|
139
113
|
flush(callback) {
|
|
140
114
|
first.end();
|
|
141
|
-
last.once("end", () =>
|
|
115
|
+
last.once("end", () => {
|
|
116
|
+
callback();
|
|
117
|
+
});
|
|
142
118
|
},
|
|
143
119
|
});
|
|
144
120
|
last.on("data", (chunk) => compound.push(chunk));
|
|
145
121
|
last.on("error", (err) => compound.destroy(err));
|
|
146
122
|
return compound;
|
|
147
123
|
}
|
|
148
|
-
/**
|
|
149
|
-
* Returns the default `Accept-Encoding` header value supported by this
|
|
150
|
-
* Node.js runtime. Includes `zstd` when Zstandard is available.
|
|
151
|
-
*
|
|
152
|
-
* @returns {string} E.g. `"gzip, deflate, br, zstd"` or `"gzip, deflate, br"`.
|
|
153
|
-
*/
|
|
124
|
+
/** Return the default `Accept-Encoding` header value for this runtime. */
|
|
154
125
|
export function defaultAcceptEncoding() {
|
|
155
126
|
return supportsZstd ? "gzip, deflate, br, zstd" : "gzip, deflate, br";
|
|
156
127
|
}
|
|
157
128
|
/**
|
|
158
|
-
*
|
|
159
|
-
* current runtime does not support Zstandard decompression. Otherwise returns
|
|
160
|
-
* the value unchanged.
|
|
129
|
+
* Strip unsupported encodings (e.g. `zstd`) from an `Accept-Encoding` value.
|
|
161
130
|
*
|
|
162
|
-
* @param {string} value -
|
|
163
|
-
* @returns {string} Sanitized
|
|
131
|
+
* @param {string} value - Original `Accept-Encoding` header value.
|
|
132
|
+
* @returns {string} Sanitized header value.
|
|
164
133
|
*/
|
|
165
134
|
export function sanitizeAcceptEncoding(value) {
|
|
166
135
|
if (supportsZstd)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"encoding.js","sourceRoot":"","sources":["../../src/utils/encoding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"encoding.js","sourceRoot":"","sources":["../../src/utils/encoding.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,29 +1,39 @@
|
|
|
1
1
|
import * as net from "node:net";
|
|
2
2
|
import type { DoHResolver } from "../dns/doh-resolver.js";
|
|
3
|
+
/** Options for the Happy Eyeballs (RFC 8305) connection algorithm. */
|
|
3
4
|
export interface HappyEyeballsOptions {
|
|
5
|
+
/** Destination hostname or IP address. */
|
|
4
6
|
host: string;
|
|
7
|
+
/** Destination port. */
|
|
5
8
|
port: number;
|
|
9
|
+
/** Restrict connections to IPv4 (`4`) or IPv6 (`6`). */
|
|
6
10
|
family?: 4 | 6;
|
|
11
|
+
/** Overall connection timeout in milliseconds. */
|
|
7
12
|
timeout?: number;
|
|
13
|
+
/** Abort signal to cancel the connection attempt. */
|
|
8
14
|
signal?: AbortSignal;
|
|
9
|
-
/**
|
|
15
|
+
/** DNS-over-HTTPS resolver to use instead of system DNS. */
|
|
10
16
|
dohResolver?: DoHResolver;
|
|
11
17
|
}
|
|
18
|
+
/** Outcome of a Happy Eyeballs connection attempt. */
|
|
12
19
|
export interface HappyEyeballsResult {
|
|
20
|
+
/** Connected TCP socket. */
|
|
13
21
|
socket: net.Socket;
|
|
22
|
+
/** Resolved IP address that was connected to. */
|
|
14
23
|
address: string;
|
|
24
|
+
/** IP address family of the connected socket. */
|
|
15
25
|
family: number;
|
|
26
|
+
/** Time spent on DNS resolution in milliseconds. */
|
|
16
27
|
dnsTimeMs: number;
|
|
17
28
|
}
|
|
18
29
|
/**
|
|
19
|
-
*
|
|
30
|
+
* Connect to a host using the Happy Eyeballs algorithm (RFC 8305).
|
|
20
31
|
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
* 5. Returns the first socket that connects; destroys all others.
|
|
32
|
+
* Races IPv6 and IPv4 connection attempts with a staggered delay
|
|
33
|
+
* for fast fallback.
|
|
34
|
+
*
|
|
35
|
+
* @param {HappyEyeballsOptions} options - Connection options.
|
|
36
|
+
* @returns {Promise<HappyEyeballsResult>} Connected socket and connection metadata.
|
|
27
37
|
*/
|
|
28
38
|
export declare function happyEyeballsConnect(options: HappyEyeballsOptions): Promise<HappyEyeballsResult>;
|
|
29
39
|
//# sourceMappingURL=happy-eyeballs.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"happy-eyeballs.d.ts","sourceRoot":"","sources":["../../src/utils/happy-eyeballs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAEhC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"happy-eyeballs.d.ts","sourceRoot":"","sources":["../../src/utils/happy-eyeballs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAEhC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAW1D,sEAAsE;AACtE,MAAM,WAAW,oBAAoB;IACnC,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACf,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,4DAA4D;IAC5D,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,sDAAsD;AACtD,MAAM,WAAW,mBAAmB;IAClC,4BAA4B;IAC5B,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC;IACnB,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA6BtG"}
|