nlcurl 0.6.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +143 -140
- package/dist/cache/groups.d.ts +75 -0
- package/dist/cache/groups.d.ts.map +1 -0
- package/dist/cache/groups.js +118 -0
- package/dist/cache/groups.js.map +1 -0
- package/dist/cache/no-vary-search.d.ts +33 -0
- package/dist/cache/no-vary-search.d.ts.map +1 -0
- package/dist/cache/no-vary-search.js +148 -0
- package/dist/cache/no-vary-search.js.map +1 -0
- package/dist/cache/range.d.ts +120 -0
- package/dist/cache/range.d.ts.map +1 -0
- package/dist/cache/range.js +193 -0
- package/dist/cache/range.js.map +1 -0
- package/dist/cache/store.d.ts +111 -0
- package/dist/cache/store.d.ts.map +1 -0
- package/dist/cache/store.js +414 -0
- package/dist/cache/store.js.map +1 -0
- package/dist/cache/types.d.ts +69 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +2 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/cli/args.d.ts +4 -37
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +3 -4
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/index.d.ts +0 -5
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +1 -6
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/output.d.ts +14 -20
- package/dist/cli/output.d.ts.map +1 -1
- package/dist/cli/output.js +14 -20
- package/dist/cli/output.js.map +1 -1
- package/dist/cookies/jar.d.ts +33 -31
- package/dist/cookies/jar.d.ts.map +1 -1
- package/dist/cookies/jar.js +69 -33
- package/dist/cookies/jar.js.map +1 -1
- package/dist/cookies/parser.d.ts +14 -16
- package/dist/cookies/parser.d.ts.map +1 -1
- package/dist/cookies/parser.js +30 -13
- package/dist/cookies/parser.js.map +1 -1
- package/dist/cookies/psl-data.d.ts +1 -1
- package/dist/cookies/psl-data.js +1 -1
- package/dist/cookies/public-suffix.d.ts +5 -27
- package/dist/cookies/public-suffix.d.ts.map +1 -1
- package/dist/cookies/public-suffix.js +5 -37
- package/dist/cookies/public-suffix.js.map +1 -1
- package/dist/core/auth.d.ts +30 -0
- package/dist/core/auth.d.ts.map +1 -0
- package/dist/core/auth.js +34 -0
- package/dist/core/auth.js.map +1 -0
- package/dist/core/client.d.ts +28 -40
- package/dist/core/client.d.ts.map +1 -1
- package/dist/core/client.js +34 -41
- package/dist/core/client.js.map +1 -1
- package/dist/core/errors.d.ts +64 -88
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +64 -88
- package/dist/core/errors.js.map +1 -1
- package/dist/core/request.d.ts +63 -85
- package/dist/core/request.d.ts.map +1 -1
- package/dist/core/response.d.ts +64 -59
- package/dist/core/response.d.ts.map +1 -1
- package/dist/core/response.js +70 -52
- package/dist/core/response.js.map +1 -1
- package/dist/core/session.d.ts +81 -70
- package/dist/core/session.d.ts.map +1 -1
- package/dist/core/session.js +198 -71
- package/dist/core/session.js.map +1 -1
- package/dist/core/validation.d.ts +44 -42
- package/dist/core/validation.d.ts.map +1 -1
- package/dist/core/validation.js +47 -58
- package/dist/core/validation.js.map +1 -1
- package/dist/dns/cache.d.ts +59 -0
- package/dist/dns/cache.d.ts.map +1 -0
- package/dist/dns/cache.js +99 -0
- package/dist/dns/cache.js.map +1 -0
- package/dist/dns/codec.d.ts +39 -0
- package/dist/dns/codec.d.ts.map +1 -0
- package/dist/dns/codec.js +238 -0
- package/dist/dns/codec.js.map +1 -0
- package/dist/dns/doh-resolver.d.ts +38 -0
- package/dist/dns/doh-resolver.d.ts.map +1 -0
- package/dist/dns/doh-resolver.js +191 -0
- package/dist/dns/doh-resolver.js.map +1 -0
- package/dist/dns/dot-resolver.d.ts +89 -0
- package/dist/dns/dot-resolver.d.ts.map +1 -0
- package/dist/dns/dot-resolver.js +158 -0
- package/dist/dns/dot-resolver.js.map +1 -0
- package/dist/dns/https-rr.d.ts +40 -0
- package/dist/dns/https-rr.d.ts.map +1 -0
- package/dist/dns/https-rr.js +109 -0
- package/dist/dns/https-rr.js.map +1 -0
- package/dist/dns/types.d.ts +82 -0
- package/dist/dns/types.d.ts.map +1 -0
- package/dist/dns/types.js +23 -0
- package/dist/dns/types.js.map +1 -0
- package/dist/fingerprints/akamai.d.ts +3 -11
- package/dist/fingerprints/akamai.d.ts.map +1 -1
- package/dist/fingerprints/akamai.js +3 -11
- package/dist/fingerprints/akamai.js.map +1 -1
- package/dist/fingerprints/database.d.ts +6 -14
- package/dist/fingerprints/database.d.ts.map +1 -1
- package/dist/fingerprints/database.js +6 -14
- package/dist/fingerprints/database.js.map +1 -1
- package/dist/fingerprints/extensions.d.ts +56 -71
- package/dist/fingerprints/extensions.d.ts.map +1 -1
- package/dist/fingerprints/extensions.js +58 -71
- package/dist/fingerprints/extensions.js.map +1 -1
- package/dist/fingerprints/ja3.d.ts +12 -30
- package/dist/fingerprints/ja3.d.ts.map +1 -1
- package/dist/fingerprints/ja3.js +12 -30
- package/dist/fingerprints/ja3.js.map +1 -1
- package/dist/fingerprints/ja4.d.ts +18 -0
- package/dist/fingerprints/ja4.d.ts.map +1 -0
- package/dist/fingerprints/ja4.js +83 -0
- package/dist/fingerprints/ja4.js.map +1 -0
- package/dist/fingerprints/profiles/chrome.d.ts +18 -21
- package/dist/fingerprints/profiles/chrome.d.ts.map +1 -1
- package/dist/fingerprints/profiles/chrome.js +35 -31
- package/dist/fingerprints/profiles/chrome.js.map +1 -1
- package/dist/fingerprints/profiles/edge.d.ts +7 -10
- package/dist/fingerprints/profiles/edge.d.ts.map +1 -1
- package/dist/fingerprints/profiles/edge.js +7 -10
- package/dist/fingerprints/profiles/edge.js.map +1 -1
- package/dist/fingerprints/profiles/firefox.d.ts +8 -11
- package/dist/fingerprints/profiles/firefox.d.ts.map +1 -1
- package/dist/fingerprints/profiles/firefox.js +8 -11
- package/dist/fingerprints/profiles/firefox.js.map +1 -1
- package/dist/fingerprints/profiles/safari.d.ts +11 -14
- package/dist/fingerprints/profiles/safari.d.ts.map +1 -1
- package/dist/fingerprints/profiles/safari.js +11 -14
- package/dist/fingerprints/profiles/safari.js.map +1 -1
- package/dist/fingerprints/profiles/tor.d.ts +5 -8
- package/dist/fingerprints/profiles/tor.d.ts.map +1 -1
- package/dist/fingerprints/profiles/tor.js +5 -8
- package/dist/fingerprints/profiles/tor.js.map +1 -1
- package/dist/fingerprints/types.d.ts +42 -73
- package/dist/fingerprints/types.d.ts.map +1 -1
- package/dist/hsts/store.d.ts +39 -0
- package/dist/hsts/store.d.ts.map +1 -0
- package/dist/hsts/store.js +163 -0
- package/dist/hsts/store.js.map +1 -0
- package/dist/hsts/types.d.ts +24 -0
- package/dist/hsts/types.d.ts.map +1 -0
- package/dist/hsts/types.js +2 -0
- package/dist/hsts/types.js.map +1 -0
- package/dist/http/alt-svc.d.ts +67 -0
- package/dist/http/alt-svc.d.ts.map +1 -0
- package/dist/http/alt-svc.js +186 -0
- package/dist/http/alt-svc.js.map +1 -0
- package/dist/http/early-hints.d.ts +23 -0
- package/dist/http/early-hints.d.ts.map +1 -0
- package/dist/http/early-hints.js +33 -0
- package/dist/http/early-hints.js.map +1 -0
- package/dist/http/form-data.d.ts +17 -35
- package/dist/http/form-data.d.ts.map +1 -1
- package/dist/http/form-data.js +12 -34
- package/dist/http/form-data.js.map +1 -1
- package/dist/http/h1/client.d.ts +14 -26
- package/dist/http/h1/client.d.ts.map +1 -1
- package/dist/http/h1/client.js +29 -22
- package/dist/http/h1/client.js.map +1 -1
- package/dist/http/h1/encoder.d.ts +10 -17
- package/dist/http/h1/encoder.d.ts.map +1 -1
- package/dist/http/h1/encoder.js +10 -17
- package/dist/http/h1/encoder.js.map +1 -1
- package/dist/http/h1/parser.d.ts +22 -59
- package/dist/http/h1/parser.d.ts.map +1 -1
- package/dist/http/h1/parser.js +15 -47
- package/dist/http/h1/parser.js.map +1 -1
- package/dist/http/h2/client.d.ts +18 -59
- package/dist/http/h2/client.d.ts.map +1 -1
- package/dist/http/h2/client.js +29 -64
- package/dist/http/h2/client.js.map +1 -1
- package/dist/http/h2/frames.d.ts +53 -84
- package/dist/http/h2/frames.d.ts.map +1 -1
- package/dist/http/h2/frames.js +48 -76
- package/dist/http/h2/frames.js.map +1 -1
- package/dist/http/h2/hpack.d.ts +16 -35
- package/dist/http/h2/hpack.d.ts.map +1 -1
- package/dist/http/h2/hpack.js +16 -35
- package/dist/http/h2/hpack.js.map +1 -1
- package/dist/http/h3/detection.d.ts +15 -0
- package/dist/http/h3/detection.d.ts.map +1 -0
- package/dist/http/h3/detection.js +41 -0
- package/dist/http/h3/detection.js.map +1 -0
- package/dist/http/negotiator.d.ts +43 -33
- package/dist/http/negotiator.d.ts.map +1 -1
- package/dist/http/negotiator.js +99 -41
- package/dist/http/negotiator.js.map +1 -1
- package/dist/http/pool.d.ts +34 -64
- package/dist/http/pool.d.ts.map +1 -1
- package/dist/http/pool.js +22 -41
- package/dist/http/pool.js.map +1 -1
- package/dist/http/resumable-upload.d.ts +76 -0
- package/dist/http/resumable-upload.d.ts.map +1 -0
- package/dist/http/resumable-upload.js +104 -0
- package/dist/http/resumable-upload.js.map +1 -0
- package/dist/http/trailers.d.ts +29 -0
- package/dist/http/trailers.d.ts.map +1 -0
- package/dist/http/trailers.js +57 -0
- package/dist/http/trailers.js.map +1 -0
- package/dist/index.d.ts +36 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +32 -1
- package/dist/index.js.map +1 -1
- package/dist/middleware/interceptor.d.ts +13 -32
- package/dist/middleware/interceptor.d.ts.map +1 -1
- package/dist/middleware/interceptor.js +11 -16
- package/dist/middleware/interceptor.js.map +1 -1
- package/dist/middleware/rate-limiter.d.ts +8 -17
- package/dist/middleware/rate-limiter.d.ts.map +1 -1
- package/dist/middleware/rate-limiter.js +15 -12
- package/dist/middleware/rate-limiter.js.map +1 -1
- package/dist/middleware/retry-after.d.ts +15 -0
- package/dist/middleware/retry-after.d.ts.map +1 -0
- package/dist/middleware/retry-after.js +36 -0
- package/dist/middleware/retry-after.js.map +1 -0
- package/dist/middleware/retry.d.ts +9 -18
- package/dist/middleware/retry.d.ts.map +1 -1
- package/dist/middleware/retry.js +12 -9
- package/dist/middleware/retry.js.map +1 -1
- package/dist/proxy/auth.d.ts +73 -0
- package/dist/proxy/auth.d.ts.map +1 -0
- package/dist/proxy/auth.js +128 -0
- package/dist/proxy/auth.js.map +1 -0
- package/dist/proxy/env-proxy.d.ts +11 -0
- package/dist/proxy/env-proxy.d.ts.map +1 -0
- package/dist/proxy/env-proxy.js +56 -0
- package/dist/proxy/env-proxy.js.map +1 -0
- package/dist/proxy/http-proxy.d.ts +13 -18
- package/dist/proxy/http-proxy.d.ts.map +1 -1
- package/dist/proxy/http-proxy.js +24 -14
- package/dist/proxy/http-proxy.js.map +1 -1
- package/dist/proxy/socks.d.ts +13 -20
- package/dist/proxy/socks.d.ts.map +1 -1
- package/dist/proxy/socks.js +6 -9
- package/dist/proxy/socks.js.map +1 -1
- package/dist/sse/parser.d.ts +47 -0
- package/dist/sse/parser.d.ts.map +1 -0
- package/dist/sse/parser.js +139 -0
- package/dist/sse/parser.js.map +1 -0
- package/dist/tls/constants.d.ts +15 -74
- package/dist/tls/constants.d.ts.map +1 -1
- package/dist/tls/constants.js +15 -74
- package/dist/tls/constants.js.map +1 -1
- package/dist/tls/ct.d.ts +78 -0
- package/dist/tls/ct.d.ts.map +1 -0
- package/dist/tls/ct.js +175 -0
- package/dist/tls/ct.js.map +1 -0
- package/dist/tls/early-data.d.ts +45 -0
- package/dist/tls/early-data.d.ts.map +1 -0
- package/dist/tls/early-data.js +46 -0
- package/dist/tls/early-data.js.map +1 -0
- package/dist/tls/ech.d.ts +130 -0
- package/dist/tls/ech.d.ts.map +1 -0
- package/dist/tls/ech.js +353 -0
- package/dist/tls/ech.js.map +1 -0
- package/dist/tls/keylog.d.ts +34 -0
- package/dist/tls/keylog.d.ts.map +1 -0
- package/dist/tls/keylog.js +64 -0
- package/dist/tls/keylog.js.map +1 -0
- package/dist/tls/node-engine.d.ts +15 -14
- package/dist/tls/node-engine.d.ts.map +1 -1
- package/dist/tls/node-engine.js +54 -14
- package/dist/tls/node-engine.js.map +1 -1
- package/dist/tls/ocsp.d.ts +55 -0
- package/dist/tls/ocsp.d.ts.map +1 -0
- package/dist/tls/ocsp.js +131 -0
- package/dist/tls/ocsp.js.map +1 -0
- package/dist/tls/pin-verification.d.ts +10 -0
- package/dist/tls/pin-verification.d.ts.map +1 -0
- package/dist/tls/pin-verification.js +28 -0
- package/dist/tls/pin-verification.js.map +1 -0
- package/dist/tls/session-cache.d.ts +58 -0
- package/dist/tls/session-cache.d.ts.map +1 -0
- package/dist/tls/session-cache.js +76 -0
- package/dist/tls/session-cache.js.map +1 -0
- package/dist/tls/stealth/client-hello.d.ts +34 -32
- package/dist/tls/stealth/client-hello.d.ts.map +1 -1
- package/dist/tls/stealth/client-hello.js +116 -11
- package/dist/tls/stealth/client-hello.js.map +1 -1
- package/dist/tls/stealth/engine.d.ts +5 -15
- package/dist/tls/stealth/engine.d.ts.map +1 -1
- package/dist/tls/stealth/engine.js +163 -47
- package/dist/tls/stealth/engine.js.map +1 -1
- package/dist/tls/stealth/handshake.d.ts +23 -32
- package/dist/tls/stealth/handshake.d.ts.map +1 -1
- package/dist/tls/stealth/handshake.js +112 -27
- package/dist/tls/stealth/handshake.js.map +1 -1
- package/dist/tls/stealth/key-schedule.d.ts +59 -86
- package/dist/tls/stealth/key-schedule.d.ts.map +1 -1
- package/dist/tls/stealth/key-schedule.js +46 -58
- package/dist/tls/stealth/key-schedule.js.map +1 -1
- package/dist/tls/stealth/record-layer.d.ts +52 -75
- package/dist/tls/stealth/record-layer.d.ts.map +1 -1
- package/dist/tls/stealth/record-layer.js +47 -63
- package/dist/tls/stealth/record-layer.js.map +1 -1
- package/dist/tls/stealth/tls12-handshake.d.ts +30 -0
- package/dist/tls/stealth/tls12-handshake.d.ts.map +1 -0
- package/dist/tls/stealth/tls12-handshake.js +470 -0
- package/dist/tls/stealth/tls12-handshake.js.map +1 -0
- package/dist/tls/types.d.ts +46 -48
- package/dist/tls/types.d.ts.map +1 -1
- package/dist/utils/buffer-reader.d.ts +26 -81
- package/dist/utils/buffer-reader.d.ts.map +1 -1
- package/dist/utils/buffer-reader.js +26 -81
- package/dist/utils/buffer-reader.js.map +1 -1
- package/dist/utils/buffer-writer.d.ts +30 -66
- package/dist/utils/buffer-writer.d.ts.map +1 -1
- package/dist/utils/buffer-writer.js +30 -66
- package/dist/utils/buffer-writer.js.map +1 -1
- package/dist/utils/compression.d.ts +18 -0
- package/dist/utils/compression.d.ts.map +1 -0
- package/dist/utils/compression.js +34 -0
- package/dist/utils/compression.js.map +1 -0
- package/dist/utils/dictionary-transport.d.ts +97 -0
- package/dist/utils/dictionary-transport.d.ts.map +1 -0
- package/dist/utils/dictionary-transport.js +171 -0
- package/dist/utils/dictionary-transport.js.map +1 -0
- package/dist/utils/encoding.d.ts +12 -28
- package/dist/utils/encoding.d.ts.map +1 -1
- package/dist/utils/encoding.js +77 -40
- package/dist/utils/encoding.js.map +1 -1
- package/dist/utils/happy-eyeballs.d.ts +20 -7
- package/dist/utils/happy-eyeballs.d.ts.map +1 -1
- package/dist/utils/happy-eyeballs.js +57 -25
- package/dist/utils/happy-eyeballs.js.map +1 -1
- package/dist/utils/logger.d.ts +54 -81
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +92 -64
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/tcp-fast-open.d.ts +30 -0
- package/dist/utils/tcp-fast-open.d.ts.map +1 -0
- package/dist/utils/tcp-fast-open.js +36 -0
- package/dist/utils/tcp-fast-open.js.map +1 -0
- package/dist/utils/url.d.ts +18 -25
- package/dist/utils/url.d.ts.map +1 -1
- package/dist/utils/url.js +18 -25
- package/dist/utils/url.js.map +1 -1
- package/dist/ws/client.d.ts +35 -52
- package/dist/ws/client.d.ts.map +1 -1
- package/dist/ws/client.js +92 -37
- package/dist/ws/client.js.map +1 -1
- package/dist/ws/frame.d.ts +27 -42
- package/dist/ws/frame.d.ts.map +1 -1
- package/dist/ws/frame.js +25 -37
- package/dist/ws/frame.js.map +1 -1
- package/dist/ws/permessage-deflate.d.ts +53 -0
- package/dist/ws/permessage-deflate.d.ts.map +1 -0
- package/dist/ws/permessage-deflate.js +140 -0
- package/dist/ws/permessage-deflate.js.map +1 -0
- package/package.json +62 -62
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/** Parsed Alt-Svc header entry. */
|
|
2
|
+
export interface AltSvcEntry {
|
|
3
|
+
/** ALPN protocol identifier (e.g. "h3"). */
|
|
4
|
+
alpn: string;
|
|
5
|
+
/** Alternative authority hostname. */
|
|
6
|
+
host: string;
|
|
7
|
+
/** Alternative authority port. */
|
|
8
|
+
port: number;
|
|
9
|
+
/** Maximum age of the entry in seconds. */
|
|
10
|
+
maxAge: number;
|
|
11
|
+
/** Whether the entry persists across network changes. */
|
|
12
|
+
persist: boolean;
|
|
13
|
+
/** Timestamp when the entry was stored. */
|
|
14
|
+
storedAt: number;
|
|
15
|
+
}
|
|
16
|
+
/** Configuration for {@link AltSvcStore}. */
|
|
17
|
+
export interface AltSvcConfig {
|
|
18
|
+
/** Maximum number of entries across all origins. */
|
|
19
|
+
maxEntries?: number;
|
|
20
|
+
/** Whether Alt-Svc processing is enabled. */
|
|
21
|
+
enabled?: boolean;
|
|
22
|
+
}
|
|
23
|
+
/** Store for Alt-Svc (Alternative Services) header entries. */
|
|
24
|
+
export declare class AltSvcStore {
|
|
25
|
+
private readonly entries;
|
|
26
|
+
private readonly maxEntries;
|
|
27
|
+
private totalEntries;
|
|
28
|
+
/**
|
|
29
|
+
* Create a new Alt-Svc store.
|
|
30
|
+
*
|
|
31
|
+
* @param {AltSvcConfig} [config] - Store configuration.
|
|
32
|
+
*/
|
|
33
|
+
constructor(config?: AltSvcConfig);
|
|
34
|
+
/**
|
|
35
|
+
* Parse an Alt-Svc response header and store the entries.
|
|
36
|
+
*
|
|
37
|
+
* @param {string} origin - Request origin (scheme + host + port).
|
|
38
|
+
* @param {string} headerValue - Raw Alt-Svc header value.
|
|
39
|
+
*/
|
|
40
|
+
parseHeader(origin: string, headerValue: string): void;
|
|
41
|
+
/**
|
|
42
|
+
* Look up the best alternative service for an origin.
|
|
43
|
+
*
|
|
44
|
+
* @param {string} origin - Request origin to look up.
|
|
45
|
+
* @returns {AltSvcEntry|undefined} Best matching entry, preferring h3, or `undefined` if none.
|
|
46
|
+
*/
|
|
47
|
+
lookup(origin: string): AltSvcEntry | undefined;
|
|
48
|
+
/**
|
|
49
|
+
* Check whether an origin has an HTTP/3 alternative service.
|
|
50
|
+
*
|
|
51
|
+
* @param {string} origin - Request origin to check.
|
|
52
|
+
* @returns {boolean} `true` if an h3 entry exists for the origin.
|
|
53
|
+
*/
|
|
54
|
+
hasH3(origin: string): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Remove all Alt-Svc entries for an origin.
|
|
57
|
+
*
|
|
58
|
+
* @param {string} origin - Origin to clear.
|
|
59
|
+
*/
|
|
60
|
+
clear(origin: string): void;
|
|
61
|
+
/** Remove all Alt-Svc entries from the store. */
|
|
62
|
+
clearAll(): void;
|
|
63
|
+
/** Total number of entries across all origins. */
|
|
64
|
+
get size(): number;
|
|
65
|
+
private evictOldest;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=alt-svc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alt-svc.d.ts","sourceRoot":"","sources":["../../src/http/alt-svc.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,MAAM,WAAW,WAAW;IAC1B,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,OAAO,EAAE,OAAO,CAAC;IACjB,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,6CAA6C;AAC7C,MAAM,WAAW,YAAY;IAC3B,oDAAoD;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAKD,+DAA+D;AAC/D,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoC;IAC5D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,YAAY,CAAK;IAEzB;;;;OAIG;gBACS,MAAM,CAAC,EAAE,YAAY;IAIjC;;;;;OAKG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IAyBtD;;;;;OAKG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IA2B/C;;;;;OAKG;IACH,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAK9B;;;;OAIG;IACH,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAQ3B,iDAAiD;IACjD,QAAQ,IAAI,IAAI;IAKhB,kDAAkD;IAClD,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,OAAO,CAAC,WAAW;CAiBpB"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
const DEFAULT_MAX_AGE = 86400;
|
|
2
|
+
const DEFAULT_MAX_ENTRIES = 1000;
|
|
3
|
+
/** Store for Alt-Svc (Alternative Services) header entries. */
|
|
4
|
+
export class AltSvcStore {
|
|
5
|
+
entries = new Map();
|
|
6
|
+
maxEntries;
|
|
7
|
+
totalEntries = 0;
|
|
8
|
+
/**
|
|
9
|
+
* Create a new Alt-Svc store.
|
|
10
|
+
*
|
|
11
|
+
* @param {AltSvcConfig} [config] - Store configuration.
|
|
12
|
+
*/
|
|
13
|
+
constructor(config) {
|
|
14
|
+
this.maxEntries = config?.maxEntries ?? DEFAULT_MAX_ENTRIES;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Parse an Alt-Svc response header and store the entries.
|
|
18
|
+
*
|
|
19
|
+
* @param {string} origin - Request origin (scheme + host + port).
|
|
20
|
+
* @param {string} headerValue - Raw Alt-Svc header value.
|
|
21
|
+
*/
|
|
22
|
+
parseHeader(origin, headerValue) {
|
|
23
|
+
const trimmed = headerValue.trim();
|
|
24
|
+
if (trimmed === "clear") {
|
|
25
|
+
this.clear(origin);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const now = Date.now();
|
|
29
|
+
const parsed = parseAltSvcHeader(trimmed, origin, now);
|
|
30
|
+
if (parsed.length === 0)
|
|
31
|
+
return;
|
|
32
|
+
const existing = this.entries.get(origin);
|
|
33
|
+
if (existing) {
|
|
34
|
+
this.totalEntries -= existing.length;
|
|
35
|
+
}
|
|
36
|
+
while (this.totalEntries + parsed.length > this.maxEntries) {
|
|
37
|
+
this.evictOldest();
|
|
38
|
+
}
|
|
39
|
+
this.entries.set(origin, parsed);
|
|
40
|
+
this.totalEntries += parsed.length;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Look up the best alternative service for an origin.
|
|
44
|
+
*
|
|
45
|
+
* @param {string} origin - Request origin to look up.
|
|
46
|
+
* @returns {AltSvcEntry|undefined} Best matching entry, preferring h3, or `undefined` if none.
|
|
47
|
+
*/
|
|
48
|
+
lookup(origin) {
|
|
49
|
+
const entries = this.entries.get(origin);
|
|
50
|
+
if (!entries)
|
|
51
|
+
return undefined;
|
|
52
|
+
const now = Date.now();
|
|
53
|
+
const valid = entries.filter((e) => now - e.storedAt < e.maxAge * 1000);
|
|
54
|
+
if (valid.length === 0) {
|
|
55
|
+
this.entries.delete(origin);
|
|
56
|
+
this.totalEntries -= entries.length;
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
if (valid.length !== entries.length) {
|
|
60
|
+
this.totalEntries -= entries.length - valid.length;
|
|
61
|
+
this.entries.set(origin, valid);
|
|
62
|
+
}
|
|
63
|
+
const h3 = valid.find((e) => e.alpn === "h3");
|
|
64
|
+
if (h3)
|
|
65
|
+
return h3;
|
|
66
|
+
const h3Draft = valid.find((e) => e.alpn.startsWith("h3-"));
|
|
67
|
+
if (h3Draft)
|
|
68
|
+
return h3Draft;
|
|
69
|
+
return valid[0];
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Check whether an origin has an HTTP/3 alternative service.
|
|
73
|
+
*
|
|
74
|
+
* @param {string} origin - Request origin to check.
|
|
75
|
+
* @returns {boolean} `true` if an h3 entry exists for the origin.
|
|
76
|
+
*/
|
|
77
|
+
hasH3(origin) {
|
|
78
|
+
const entry = this.lookup(origin);
|
|
79
|
+
return entry !== undefined && (entry.alpn === "h3" || entry.alpn.startsWith("h3-"));
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Remove all Alt-Svc entries for an origin.
|
|
83
|
+
*
|
|
84
|
+
* @param {string} origin - Origin to clear.
|
|
85
|
+
*/
|
|
86
|
+
clear(origin) {
|
|
87
|
+
const entries = this.entries.get(origin);
|
|
88
|
+
if (entries) {
|
|
89
|
+
this.totalEntries -= entries.length;
|
|
90
|
+
this.entries.delete(origin);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/** Remove all Alt-Svc entries from the store. */
|
|
94
|
+
clearAll() {
|
|
95
|
+
this.entries.clear();
|
|
96
|
+
this.totalEntries = 0;
|
|
97
|
+
}
|
|
98
|
+
/** Total number of entries across all origins. */
|
|
99
|
+
get size() {
|
|
100
|
+
return this.totalEntries;
|
|
101
|
+
}
|
|
102
|
+
evictOldest() {
|
|
103
|
+
let oldestOrigin;
|
|
104
|
+
let oldestTime = Infinity;
|
|
105
|
+
for (const [origin, entries] of this.entries) {
|
|
106
|
+
for (const entry of entries) {
|
|
107
|
+
if (entry.storedAt < oldestTime) {
|
|
108
|
+
oldestTime = entry.storedAt;
|
|
109
|
+
oldestOrigin = origin;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (oldestOrigin) {
|
|
114
|
+
this.clear(oldestOrigin);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function parseAltSvcHeader(value, origin, now) {
|
|
119
|
+
const entries = [];
|
|
120
|
+
const originUrl = new URL(origin);
|
|
121
|
+
const defaultHost = originUrl.hostname;
|
|
122
|
+
const defaultPort = parseInt(originUrl.port) || (originUrl.protocol === "https:" ? 443 : 80);
|
|
123
|
+
const alternatives = splitAltSvc(value);
|
|
124
|
+
for (const alt of alternatives) {
|
|
125
|
+
const entry = parseSingleAltSvc(alt.trim(), defaultHost, defaultPort, now);
|
|
126
|
+
if (entry)
|
|
127
|
+
entries.push(entry);
|
|
128
|
+
}
|
|
129
|
+
return entries;
|
|
130
|
+
}
|
|
131
|
+
function splitAltSvc(value) {
|
|
132
|
+
const parts = [];
|
|
133
|
+
let current = "";
|
|
134
|
+
let inQuotes = false;
|
|
135
|
+
for (const ch of value) {
|
|
136
|
+
if (ch === '"') {
|
|
137
|
+
inQuotes = !inQuotes;
|
|
138
|
+
current += ch;
|
|
139
|
+
}
|
|
140
|
+
else if (ch === "," && !inQuotes) {
|
|
141
|
+
parts.push(current);
|
|
142
|
+
current = "";
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
current += ch;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (current)
|
|
149
|
+
parts.push(current);
|
|
150
|
+
return parts;
|
|
151
|
+
}
|
|
152
|
+
function parseSingleAltSvc(alt, defaultHost, defaultPort, now) {
|
|
153
|
+
const match = alt.match(/^([a-zA-Z0-9-]+)="([^"]*)"/);
|
|
154
|
+
if (!match)
|
|
155
|
+
return null;
|
|
156
|
+
const alpn = match[1];
|
|
157
|
+
const authority = match[2];
|
|
158
|
+
let host = defaultHost;
|
|
159
|
+
let port = defaultPort;
|
|
160
|
+
if (authority) {
|
|
161
|
+
const colonIdx = authority.lastIndexOf(":");
|
|
162
|
+
if (colonIdx >= 0) {
|
|
163
|
+
const hostPart = authority.substring(0, colonIdx);
|
|
164
|
+
const portPart = authority.substring(colonIdx + 1);
|
|
165
|
+
if (hostPart)
|
|
166
|
+
host = hostPart;
|
|
167
|
+
const parsedPort = parseInt(portPart, 10);
|
|
168
|
+
if (!isNaN(parsedPort) && parsedPort > 0 && parsedPort <= 65535) {
|
|
169
|
+
port = parsedPort;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
let maxAge = DEFAULT_MAX_AGE;
|
|
174
|
+
let persist = false;
|
|
175
|
+
const params = alt.substring(match[0].length);
|
|
176
|
+
const maMatch = params.match(/;\s*ma=(\d+)/);
|
|
177
|
+
if (maMatch) {
|
|
178
|
+
maxAge = parseInt(maMatch[1], 10);
|
|
179
|
+
}
|
|
180
|
+
const persistMatch = params.match(/;\s*persist=1/);
|
|
181
|
+
if (persistMatch) {
|
|
182
|
+
persist = true;
|
|
183
|
+
}
|
|
184
|
+
return { alpn, host, port, maxAge, persist, storedAt: now };
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=alt-svc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alt-svc.js","sourceRoot":"","sources":["../../src/http/alt-svc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** Parsed early hint from a Link header in a 103 response. */
|
|
2
|
+
export interface EarlyHint {
|
|
3
|
+
/** Target resource URI. */
|
|
4
|
+
uri: string;
|
|
5
|
+
/** Link relation type (e.g. "preload"). */
|
|
6
|
+
rel?: string;
|
|
7
|
+
/** Destination type for the resource (e.g. "script", "style"). */
|
|
8
|
+
as?: string;
|
|
9
|
+
/** MIME type of the linked resource. */
|
|
10
|
+
type?: string;
|
|
11
|
+
/** Whether the resource requires CORS. */
|
|
12
|
+
crossorigin?: boolean;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Parse a Link header into an array of early hints.
|
|
16
|
+
*
|
|
17
|
+
* @param {string} linkHeader - Raw Link header value.
|
|
18
|
+
* @returns {EarlyHint[]} Array of parsed early hint objects.
|
|
19
|
+
*/
|
|
20
|
+
export declare function parseLinkHeader(linkHeader: string): EarlyHint[];
|
|
21
|
+
/** Callback invoked when 103 Early Hints are received. */
|
|
22
|
+
export type EarlyHintsCallback = (hints: EarlyHint[]) => void;
|
|
23
|
+
//# sourceMappingURL=early-hints.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"early-hints.d.ts","sourceRoot":"","sources":["../../src/http/early-hints.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,MAAM,WAAW,SAAS;IACxB,2BAA2B;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,2CAA2C;IAC3C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,CA6B/D;AAED,0DAA0D;AAC1D,MAAM,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse a Link header into an array of early hints.
|
|
3
|
+
*
|
|
4
|
+
* @param {string} linkHeader - Raw Link header value.
|
|
5
|
+
* @returns {EarlyHint[]} Array of parsed early hint objects.
|
|
6
|
+
*/
|
|
7
|
+
export function parseLinkHeader(linkHeader) {
|
|
8
|
+
const hints = [];
|
|
9
|
+
const parts = linkHeader.split(",");
|
|
10
|
+
for (const part of parts) {
|
|
11
|
+
const trimmed = part.trim();
|
|
12
|
+
const uriMatch = /^<([^>]+)>/.exec(trimmed);
|
|
13
|
+
if (!uriMatch)
|
|
14
|
+
continue;
|
|
15
|
+
const hint = { uri: uriMatch[1] };
|
|
16
|
+
const params = trimmed.substring(uriMatch[0].length);
|
|
17
|
+
const relMatch = /;\s*rel\s*=\s*"?([^";]+)"?/i.exec(params);
|
|
18
|
+
if (relMatch)
|
|
19
|
+
hint.rel = relMatch[1].trim();
|
|
20
|
+
const asMatch = /;\s*as\s*=\s*"?([^";]+)"?/i.exec(params);
|
|
21
|
+
if (asMatch)
|
|
22
|
+
hint.as = asMatch[1].trim();
|
|
23
|
+
const typeMatch = /;\s*type\s*=\s*"?([^";]+)"?/i.exec(params);
|
|
24
|
+
if (typeMatch)
|
|
25
|
+
hint.type = typeMatch[1].trim();
|
|
26
|
+
if (/;\s*crossorigin/i.test(params)) {
|
|
27
|
+
hint.crossorigin = true;
|
|
28
|
+
}
|
|
29
|
+
hints.push(hint);
|
|
30
|
+
}
|
|
31
|
+
return hints;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=early-hints.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"early-hints.js","sourceRoot":"","sources":["../../src/http/early-hints.ts"],"names":[],"mappings":"AAcA;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,UAAkB;IAChD,MAAM,KAAK,GAAgB,EAAE,CAAC;IAE9B,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,QAAQ;YAAE,SAAS;QAExB,MAAM,IAAI,GAAc,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAE,EAAE,CAAC;QAE9C,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,6BAA6B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5D,IAAI,QAAQ;YAAE,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;QAE7C,MAAM,OAAO,GAAG,4BAA4B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1D,IAAI,OAAO;YAAE,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;QAE1C,MAAM,SAAS,GAAG,8BAA8B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9D,IAAI,SAAS;YAAE,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;QAEhD,IAAI,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAC1B,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/http/form-data.d.ts
CHANGED
|
@@ -1,58 +1,40 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Represents a single form field value. Either a string or a file descriptor.
|
|
3
|
-
*/
|
|
1
|
+
/** File attachment for multipart form-data encoding. */
|
|
4
2
|
export interface FormFile {
|
|
5
|
-
/**
|
|
3
|
+
/** Raw file content. */
|
|
6
4
|
data: Buffer;
|
|
7
|
-
/**
|
|
5
|
+
/** Name of the file. */
|
|
8
6
|
filename: string;
|
|
9
|
-
/**
|
|
7
|
+
/** MIME content type (defaults to application/octet-stream). */
|
|
10
8
|
contentType?: string;
|
|
11
9
|
}
|
|
10
|
+
/** A form field value — either a plain string or a file attachment. */
|
|
12
11
|
export type FormValue = string | FormFile;
|
|
13
|
-
/**
|
|
14
|
-
* Builds a `multipart/form-data` request body per RFC 7578.
|
|
15
|
-
*
|
|
16
|
-
* Generates a cryptographically random boundary and serializes all fields
|
|
17
|
-
* into a single `Buffer` suitable for use as a request body. The
|
|
18
|
-
* corresponding `Content-Type` header (including the boundary parameter)
|
|
19
|
-
* is available via {@link FormData.contentType}.
|
|
20
|
-
*
|
|
21
|
-
* @example
|
|
22
|
-
* ```ts
|
|
23
|
-
* const form = new FormData();
|
|
24
|
-
* form.append("username", "alice");
|
|
25
|
-
* form.append("avatar", { data: avatarBuffer, filename: "avatar.png", contentType: "image/png" });
|
|
26
|
-
*
|
|
27
|
-
* const response = await post("https://example.com/upload", form);
|
|
28
|
-
* ```
|
|
29
|
-
*/
|
|
12
|
+
/** Multipart form-data encoder for HTTP request bodies. */
|
|
30
13
|
export declare class FormData {
|
|
31
14
|
private readonly fields;
|
|
32
15
|
private readonly boundary;
|
|
16
|
+
/** Create a new FormData instance with a random boundary. */
|
|
33
17
|
constructor();
|
|
34
18
|
/**
|
|
35
|
-
*
|
|
19
|
+
* Append a field to the form.
|
|
36
20
|
*
|
|
37
|
-
* @param {string}
|
|
38
|
-
* @param {FormValue} value -
|
|
39
|
-
* @returns {this}
|
|
21
|
+
* @param {string} name - Field name.
|
|
22
|
+
* @param {FormValue} value - String value or file attachment.
|
|
23
|
+
* @returns {this} This instance for chaining.
|
|
40
24
|
*/
|
|
41
25
|
append(name: string, value: FormValue): this;
|
|
42
|
-
/**
|
|
43
|
-
* Returns the `Content-Type` header value including the boundary parameter.
|
|
44
|
-
* Must be set on the request for the server to parse the body correctly.
|
|
45
|
-
*/
|
|
26
|
+
/** Content-Type header value including the boundary parameter. */
|
|
46
27
|
get contentType(): string;
|
|
47
28
|
/**
|
|
48
|
-
*
|
|
29
|
+
* Return the multipart boundary string.
|
|
30
|
+
*
|
|
31
|
+
* @returns {string} The boundary delimiter.
|
|
49
32
|
*/
|
|
50
33
|
getBoundary(): string;
|
|
51
34
|
/**
|
|
52
|
-
*
|
|
53
|
-
* `multipart/form-data` format per RFC 7578.
|
|
35
|
+
* Encode all fields into a multipart form-data buffer.
|
|
54
36
|
*
|
|
55
|
-
* @returns {Buffer}
|
|
37
|
+
* @returns {Buffer} Wire-format multipart body.
|
|
56
38
|
*/
|
|
57
39
|
encode(): Buffer;
|
|
58
40
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form-data.d.ts","sourceRoot":"","sources":["../../src/http/form-data.ts"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"form-data.d.ts","sourceRoot":"","sources":["../../src/http/form-data.ts"],"names":[],"mappings":"AAEA,wDAAwD;AACxD,MAAM,WAAW,QAAQ;IACvB,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,uEAAuE;AACvE,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE1C,2DAA2D;AAC3D,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiD;IACxE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAElC,6DAA6D;;IAK7D;;;;;;OAMG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI;IAK5C,kEAAkE;IAClE,IAAI,WAAW,IAAI,MAAM,CAExB;IAED;;;;OAIG;IACH,WAAW,IAAI,MAAM;IAIrB;;;;OAIG;IACH,MAAM,IAAI,MAAM;CA2BjB"}
|
package/dist/http/form-data.js
CHANGED
|
@@ -1,56 +1,39 @@
|
|
|
1
1
|
import { randomBytes } from "node:crypto";
|
|
2
|
-
/**
|
|
3
|
-
* Builds a `multipart/form-data` request body per RFC 7578.
|
|
4
|
-
*
|
|
5
|
-
* Generates a cryptographically random boundary and serializes all fields
|
|
6
|
-
* into a single `Buffer` suitable for use as a request body. The
|
|
7
|
-
* corresponding `Content-Type` header (including the boundary parameter)
|
|
8
|
-
* is available via {@link FormData.contentType}.
|
|
9
|
-
*
|
|
10
|
-
* @example
|
|
11
|
-
* ```ts
|
|
12
|
-
* const form = new FormData();
|
|
13
|
-
* form.append("username", "alice");
|
|
14
|
-
* form.append("avatar", { data: avatarBuffer, filename: "avatar.png", contentType: "image/png" });
|
|
15
|
-
*
|
|
16
|
-
* const response = await post("https://example.com/upload", form);
|
|
17
|
-
* ```
|
|
18
|
-
*/
|
|
2
|
+
/** Multipart form-data encoder for HTTP request bodies. */
|
|
19
3
|
export class FormData {
|
|
20
4
|
fields = [];
|
|
21
5
|
boundary;
|
|
6
|
+
/** Create a new FormData instance with a random boundary. */
|
|
22
7
|
constructor() {
|
|
23
8
|
this.boundary = `----NLcURL${randomBytes(24).toString("hex")}`;
|
|
24
9
|
}
|
|
25
10
|
/**
|
|
26
|
-
*
|
|
11
|
+
* Append a field to the form.
|
|
27
12
|
*
|
|
28
|
-
* @param {string}
|
|
29
|
-
* @param {FormValue} value -
|
|
30
|
-
* @returns {this}
|
|
13
|
+
* @param {string} name - Field name.
|
|
14
|
+
* @param {FormValue} value - String value or file attachment.
|
|
15
|
+
* @returns {this} This instance for chaining.
|
|
31
16
|
*/
|
|
32
17
|
append(name, value) {
|
|
33
18
|
this.fields.push({ name, value });
|
|
34
19
|
return this;
|
|
35
20
|
}
|
|
36
|
-
/**
|
|
37
|
-
* Returns the `Content-Type` header value including the boundary parameter.
|
|
38
|
-
* Must be set on the request for the server to parse the body correctly.
|
|
39
|
-
*/
|
|
21
|
+
/** Content-Type header value including the boundary parameter. */
|
|
40
22
|
get contentType() {
|
|
41
23
|
return `multipart/form-data; boundary=${this.boundary}`;
|
|
42
24
|
}
|
|
43
25
|
/**
|
|
44
|
-
*
|
|
26
|
+
* Return the multipart boundary string.
|
|
27
|
+
*
|
|
28
|
+
* @returns {string} The boundary delimiter.
|
|
45
29
|
*/
|
|
46
30
|
getBoundary() {
|
|
47
31
|
return this.boundary;
|
|
48
32
|
}
|
|
49
33
|
/**
|
|
50
|
-
*
|
|
51
|
-
* `multipart/form-data` format per RFC 7578.
|
|
34
|
+
* Encode all fields into a multipart form-data buffer.
|
|
52
35
|
*
|
|
53
|
-
* @returns {Buffer}
|
|
36
|
+
* @returns {Buffer} Wire-format multipart body.
|
|
54
37
|
*/
|
|
55
38
|
encode() {
|
|
56
39
|
const parts = [];
|
|
@@ -76,11 +59,6 @@ export class FormData {
|
|
|
76
59
|
return Buffer.concat(parts);
|
|
77
60
|
}
|
|
78
61
|
}
|
|
79
|
-
/**
|
|
80
|
-
* Escapes double quotes and backslashes in header parameter values
|
|
81
|
-
* and strips control characters (\r, \n, \0) to prevent header injection
|
|
82
|
-
* in Content-Disposition fields.
|
|
83
|
-
*/
|
|
84
62
|
function escapeQuotes(str) {
|
|
85
63
|
return str
|
|
86
64
|
.replace(/[\r\n\0]/g, "")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form-data.js","sourceRoot":"","sources":["../../src/http/form-data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"form-data.js","sourceRoot":"","sources":["../../src/http/form-data.ts"],"names":[],"mappings":"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"}
|
package/dist/http/h1/client.d.ts
CHANGED
|
@@ -2,41 +2,29 @@ import type { Duplex } from "node:stream";
|
|
|
2
2
|
import type { NLcURLRequest } from "../../core/request.js";
|
|
3
3
|
import { NLcURLResponse } from "../../core/response.js";
|
|
4
4
|
import type { RequestTimings } from "../../core/request.js";
|
|
5
|
-
/**
|
|
6
|
-
* Options shared across all HTTP/1.1 client functions.
|
|
7
|
-
*
|
|
8
|
-
* @typedef {Object} H1ClientOptions
|
|
9
|
-
* @property {Array<[string,string]>} [defaultHeaders] - Profile-level headers prepended before request-specific headers.
|
|
10
|
-
*/
|
|
5
|
+
/** Options for the HTTP/1.1 client. */
|
|
11
6
|
export interface H1ClientOptions {
|
|
7
|
+
/** Default headers to include in every request. */
|
|
12
8
|
defaultHeaders?: Array<[string, string]>;
|
|
13
9
|
}
|
|
14
10
|
/**
|
|
15
|
-
*
|
|
16
|
-
* fully buffered response. Blocks until all response body bytes are received.
|
|
11
|
+
* Send an HTTP/1.1 request and buffer the entire response body.
|
|
17
12
|
*
|
|
18
|
-
* @param {Duplex}
|
|
19
|
-
* @param {NLcURLRequest}
|
|
20
|
-
* @param {H1ClientOptions}
|
|
21
|
-
* @param {Partial<RequestTimings>} [timings
|
|
22
|
-
* @returns {Promise<NLcURLResponse>}
|
|
23
|
-
* @throws {HTTPError} If the connection is closed before the response completes.
|
|
24
|
-
* @throws {TimeoutError} If the response timeout is exceeded.
|
|
13
|
+
* @param {Duplex} stream - Duplex stream (typically a TLS socket).
|
|
14
|
+
* @param {NLcURLRequest} request - Request to send.
|
|
15
|
+
* @param {H1ClientOptions} [options] - Client options.
|
|
16
|
+
* @param {Partial<RequestTimings>} [timings] - Partial timings object to populate.
|
|
17
|
+
* @returns {Promise<NLcURLResponse>} Buffered HTTP response.
|
|
25
18
|
*/
|
|
26
19
|
export declare function sendH1Request(stream: Duplex, request: NLcURLRequest, options?: H1ClientOptions, timings?: Partial<RequestTimings>): Promise<NLcURLResponse>;
|
|
27
20
|
/**
|
|
28
|
-
*
|
|
29
|
-
* streaming response whose body is available as a `Readable` stream on
|
|
30
|
-
* `response.body`. The headers are fully parsed before resolving;
|
|
31
|
-
* the body is streamed asynchronously.
|
|
21
|
+
* Send an HTTP/1.1 request with a streaming response body.
|
|
32
22
|
*
|
|
33
|
-
* @param {Duplex}
|
|
34
|
-
* @param {NLcURLRequest}
|
|
35
|
-
* @param {H1ClientOptions}
|
|
36
|
-
* @param {Partial<RequestTimings>} [timings
|
|
37
|
-
* @returns {Promise<NLcURLResponse>}
|
|
38
|
-
* @throws {HTTPError} If the connection is closed before headers are received.
|
|
39
|
-
* @throws {TimeoutError} If the response timeout is exceeded.
|
|
23
|
+
* @param {Duplex} stream - Duplex stream (typically a TLS socket).
|
|
24
|
+
* @param {NLcURLRequest} request - Request to send.
|
|
25
|
+
* @param {H1ClientOptions} [options] - Client options.
|
|
26
|
+
* @param {Partial<RequestTimings>} [timings] - Partial timings object to populate.
|
|
27
|
+
* @returns {Promise<NLcURLResponse>} HTTP response with a readable body stream.
|
|
40
28
|
*/
|
|
41
29
|
export declare function sendH1StreamingRequest(stream: Duplex, request: NLcURLRequest, options?: H1ClientOptions, timings?: Partial<RequestTimings>): Promise<NLcURLResponse>;
|
|
42
30
|
//# sourceMappingURL=client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/http/h1/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAKxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/http/h1/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAKxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,uCAAuC;AACvC,MAAM,WAAW,eAAe;IAC9B,mDAAmD;IACnD,cAAc,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC1C;AAED;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,GAAE,eAAoB,EAAE,OAAO,GAAE,OAAO,CAAC,cAAc,CAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAuEzK;AAED;;;;;;;;GAQG;AACH,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,GAAE,eAAoB,EAAE,OAAO,GAAE,OAAO,CAAC,cAAc,CAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAuDlL"}
|