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 @@
|
|
|
1
|
+
{"version":3,"file":"retry-after.js","sourceRoot":"","sources":["../../src/middleware/retry-after.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAE7B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAE7B,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACtC,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;YAC7C,OAAO,OAAO,GAAG,IAAI,CAAC;QACxB,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,OAA+B;IAC7D,MAAM,KAAK,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACrC,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -1,31 +1,22 @@
|
|
|
1
1
|
import type { RetryConfig } from "../core/request.js";
|
|
2
2
|
import { NLcURLResponse } from "../core/response.js";
|
|
3
3
|
import { type Logger } from "../utils/logger.js";
|
|
4
|
-
/**
|
|
5
|
-
* Carries context about the current retry attempt that is passed to the
|
|
6
|
-
* `execute` callback on each invocation.
|
|
7
|
-
*
|
|
8
|
-
* @typedef {Object} RetryContext
|
|
9
|
-
* @property {number} attempt - Zero-based attempt index (0 = first try).
|
|
10
|
-
* @property {Error} [lastError] - The error thrown by the previous attempt, if any.
|
|
11
|
-
* @property {NLcURLResponse} [lastResponse] - The response from the previous attempt, if any.
|
|
12
|
-
*/
|
|
4
|
+
/** Context passed to each retry attempt. */
|
|
13
5
|
export interface RetryContext {
|
|
6
|
+
/** Current attempt number (1-based). */
|
|
14
7
|
attempt: number;
|
|
8
|
+
/** Error from the previous attempt, if any. */
|
|
15
9
|
lastError?: Error;
|
|
10
|
+
/** Response from the previous attempt, if any. */
|
|
16
11
|
lastResponse?: NLcURLResponse;
|
|
17
12
|
}
|
|
18
13
|
/**
|
|
19
|
-
*
|
|
20
|
-
* back-off and jitter between attempts. Transparent to `AbortError` -- those
|
|
21
|
-
* propagate immediately without retry.
|
|
14
|
+
* Execute a request function with configurable retry logic.
|
|
22
15
|
*
|
|
23
|
-
* @param {RetryConfig
|
|
24
|
-
* @param {(ctx: RetryContext) => Promise<NLcURLResponse>} execute -
|
|
25
|
-
* @param {Logger} [logger] - Optional logger for retry
|
|
26
|
-
* @returns {Promise<NLcURLResponse>}
|
|
27
|
-
* @throws {AbortError} Immediately if the operation is aborted.
|
|
28
|
-
* @throws {Error} Re-throws the last error if all attempts are exhausted.
|
|
16
|
+
* @param {RetryConfig|undefined} config - Retry configuration.
|
|
17
|
+
* @param {(ctx: RetryContext) => Promise<NLcURLResponse>} execute - Function that performs the request attempt.
|
|
18
|
+
* @param {Logger} [logger] - Optional logger for retry events.
|
|
19
|
+
* @returns {Promise<NLcURLResponse>} Final HTTP response after all retries.
|
|
29
20
|
*/
|
|
30
21
|
export declare function withRetry(config: RetryConfig | undefined, execute: (ctx: RetryContext) => Promise<NLcURLResponse>, logger?: Logger): Promise<NLcURLResponse>;
|
|
31
22
|
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/middleware/retry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,KAAK,MAAM,EAAoB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/middleware/retry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,KAAK,MAAM,EAAoB,MAAM,oBAAoB,CAAC;AAKnE,4CAA4C;AAC5C,MAAM,WAAW,YAAY;IAC3B,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,KAAK,CAAC;IAClB,kDAAkD;IAClD,YAAY,CAAC,EAAE,cAAc,CAAC;CAC/B;AASD;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,OAAO,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAkDlK"}
|
package/dist/middleware/retry.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { AbortError, TLSError, TimeoutError, ConnectionError, ProtocolError } from "../core/errors.js";
|
|
2
2
|
import { getDefaultLogger } from "../utils/logger.js";
|
|
3
|
+
import { getRetryAfterMs } from "./retry-after.js";
|
|
3
4
|
const RETRYABLE_H2_ERROR_CODES = new Set([1, 2, 7, 8, 11, 13]);
|
|
4
5
|
function shouldRetryDefault(error, statusCode) {
|
|
5
6
|
if (error instanceof ConnectionError || error instanceof TimeoutError || error instanceof TLSError)
|
|
@@ -11,16 +12,12 @@ function shouldRetryDefault(error, statusCode) {
|
|
|
11
12
|
return false;
|
|
12
13
|
}
|
|
13
14
|
/**
|
|
14
|
-
*
|
|
15
|
-
* back-off and jitter between attempts. Transparent to `AbortError` -- those
|
|
16
|
-
* propagate immediately without retry.
|
|
15
|
+
* Execute a request function with configurable retry logic.
|
|
17
16
|
*
|
|
18
|
-
* @param {RetryConfig
|
|
19
|
-
* @param {(ctx: RetryContext) => Promise<NLcURLResponse>} execute -
|
|
20
|
-
* @param {Logger} [logger] - Optional logger for retry
|
|
21
|
-
* @returns {Promise<NLcURLResponse>}
|
|
22
|
-
* @throws {AbortError} Immediately if the operation is aborted.
|
|
23
|
-
* @throws {Error} Re-throws the last error if all attempts are exhausted.
|
|
17
|
+
* @param {RetryConfig|undefined} config - Retry configuration.
|
|
18
|
+
* @param {(ctx: RetryContext) => Promise<NLcURLResponse>} execute - Function that performs the request attempt.
|
|
19
|
+
* @param {Logger} [logger] - Optional logger for retry events.
|
|
20
|
+
* @returns {Promise<NLcURLResponse>} Final HTTP response after all retries.
|
|
24
21
|
*/
|
|
25
22
|
export async function withRetry(config, execute, logger) {
|
|
26
23
|
const log = logger ?? getDefaultLogger();
|
|
@@ -42,6 +39,12 @@ export async function withRetry(config, execute, logger) {
|
|
|
42
39
|
try {
|
|
43
40
|
const response = await execute({ attempt, lastError, lastResponse });
|
|
44
41
|
if (attempt < count && retryOn(null, response.status)) {
|
|
42
|
+
const retryAfterMs = getRetryAfterMs(response.headers);
|
|
43
|
+
if (retryAfterMs !== undefined && retryAfterMs > 0) {
|
|
44
|
+
const cappedDelay = Math.min(retryAfterMs, 300_000);
|
|
45
|
+
log.debug(`retry respecting Retry-After: ${Math.round(cappedDelay)}ms`);
|
|
46
|
+
await sleep(cappedDelay);
|
|
47
|
+
}
|
|
45
48
|
lastResponse = response;
|
|
46
49
|
continue;
|
|
47
50
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/middleware/retry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvG,OAAO,EAAe,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/middleware/retry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/** Supported proxy authentication scheme identifiers. */
|
|
2
|
+
export type ProxyAuthScheme = "basic" | "digest" | "negotiate" | "ntlm";
|
|
3
|
+
/** Credentials and scheme selection for proxy authentication. */
|
|
4
|
+
export interface ProxyAuthConfig {
|
|
5
|
+
/** Proxy account username. */
|
|
6
|
+
username: string;
|
|
7
|
+
/** Proxy account password. */
|
|
8
|
+
password: string;
|
|
9
|
+
/** Authentication scheme to use — defaults to `"basic"`. */
|
|
10
|
+
scheme?: ProxyAuthScheme;
|
|
11
|
+
}
|
|
12
|
+
/** Parsed parameters from an HTTP Digest authentication challenge. */
|
|
13
|
+
export interface DigestChallenge {
|
|
14
|
+
/** Protection realm name. */
|
|
15
|
+
realm: string;
|
|
16
|
+
/** Server-generated nonce value. */
|
|
17
|
+
nonce: string;
|
|
18
|
+
/** Quality-of-protection directive (e.g. `"auth"`). */
|
|
19
|
+
qop?: string;
|
|
20
|
+
/** Opaque value to be returned unchanged to the server. */
|
|
21
|
+
opaque?: string;
|
|
22
|
+
/** Hash algorithm name (e.g. `"MD5"`, `"SHA-256"`). */
|
|
23
|
+
algorithm?: string;
|
|
24
|
+
/** Whether the previous nonce has gone stale. */
|
|
25
|
+
stale?: boolean;
|
|
26
|
+
/** Space-delimited list of URIs defining the protection space. */
|
|
27
|
+
domain?: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Parse a `Proxy-Authenticate` response header into its scheme and raw challenge.
|
|
31
|
+
*
|
|
32
|
+
* @param {string} header - Raw header value.
|
|
33
|
+
* @returns {object|null} Parsed scheme and challenge string, or `null` if unrecognized.
|
|
34
|
+
*/
|
|
35
|
+
export declare function parseProxyAuthenticate(header: string): {
|
|
36
|
+
scheme: ProxyAuthScheme;
|
|
37
|
+
challenge: string;
|
|
38
|
+
} | null;
|
|
39
|
+
/**
|
|
40
|
+
* Parse a raw Digest challenge string into structured parameters.
|
|
41
|
+
*
|
|
42
|
+
* @param {string} challenge - The challenge portion after `Digest `.
|
|
43
|
+
* @returns {DigestChallenge|null} Parsed {@link DigestChallenge}, or `null` if required fields are missing.
|
|
44
|
+
*/
|
|
45
|
+
export declare function parseDigestChallenge(challenge: string): DigestChallenge | null;
|
|
46
|
+
/**
|
|
47
|
+
* Build an HTTP Digest `Proxy-Authorization` header value.
|
|
48
|
+
*
|
|
49
|
+
* @param {string} method - HTTP method (e.g. `"CONNECT"`).
|
|
50
|
+
* @param {string} uri - Request URI.
|
|
51
|
+
* @param {ProxyAuthConfig} auth - Proxy credentials.
|
|
52
|
+
* @param {DigestChallenge} challenge - Parsed digest challenge from the proxy.
|
|
53
|
+
* @returns {string} Fully-formed `Digest` authorization header value.
|
|
54
|
+
*/
|
|
55
|
+
export declare function buildDigestAuth(method: string, uri: string, auth: ProxyAuthConfig, challenge: DigestChallenge): string;
|
|
56
|
+
/**
|
|
57
|
+
* Build an HTTP Basic `Proxy-Authorization` header value.
|
|
58
|
+
*
|
|
59
|
+
* @param {ProxyAuthConfig} auth - Proxy credentials.
|
|
60
|
+
* @returns {string} Base64-encoded `Basic` authorization header value.
|
|
61
|
+
*/
|
|
62
|
+
export declare function buildBasicProxyAuth(auth: ProxyAuthConfig): string;
|
|
63
|
+
/**
|
|
64
|
+
* Build a `Proxy-Authorization` header for the configured scheme.
|
|
65
|
+
*
|
|
66
|
+
* @param {string} method - HTTP method.
|
|
67
|
+
* @param {string} uri - Request URI.
|
|
68
|
+
* @param {ProxyAuthConfig} auth - Proxy credentials and scheme preference.
|
|
69
|
+
* @param {string} [proxyAuthHeader] - Optional raw `Proxy-Authenticate` header for digest negotiation.
|
|
70
|
+
* @returns {string|null} Header value string, or `null` if the scheme cannot be satisfied.
|
|
71
|
+
*/
|
|
72
|
+
export declare function buildProxyAuthorization(method: string, uri: string, auth: ProxyAuthConfig, proxyAuthHeader?: string): string | null;
|
|
73
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/proxy/auth.ts"],"names":[],"mappings":"AAEA,yDAAyD;AACzD,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,QAAQ,GAAG,WAAW,GAAG,MAAM,CAAC;AAExE,iEAAiE;AACjE,MAAM,WAAW,eAAe;IAC9B,8BAA8B;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,eAAe,CAAC;CAC1B;AAED,sEAAsE;AACtE,MAAM,WAAW,eAAe;IAC9B,6BAA6B;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG;IACtD,MAAM,EAAE,eAAe,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,IAAI,CAiBP;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAoB9E;AAID;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,eAAe,GAAG,MAAM,CAiCtH;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAGjE;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmBnI"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
2
|
+
/**
|
|
3
|
+
* Parse a `Proxy-Authenticate` response header into its scheme and raw challenge.
|
|
4
|
+
*
|
|
5
|
+
* @param {string} header - Raw header value.
|
|
6
|
+
* @returns {object|null} Parsed scheme and challenge string, or `null` if unrecognized.
|
|
7
|
+
*/
|
|
8
|
+
export function parseProxyAuthenticate(header) {
|
|
9
|
+
if (!header)
|
|
10
|
+
return null;
|
|
11
|
+
const lower = header.trimStart().toLowerCase();
|
|
12
|
+
if (lower.startsWith("digest ")) {
|
|
13
|
+
return { scheme: "digest", challenge: header.substring(7) };
|
|
14
|
+
}
|
|
15
|
+
if (lower.startsWith("negotiate")) {
|
|
16
|
+
return { scheme: "negotiate", challenge: header.substring(10).trim() };
|
|
17
|
+
}
|
|
18
|
+
if (lower.startsWith("ntlm")) {
|
|
19
|
+
return { scheme: "ntlm", challenge: header.substring(5).trim() };
|
|
20
|
+
}
|
|
21
|
+
if (lower.startsWith("basic ")) {
|
|
22
|
+
return { scheme: "basic", challenge: header.substring(6) };
|
|
23
|
+
}
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Parse a raw Digest challenge string into structured parameters.
|
|
28
|
+
*
|
|
29
|
+
* @param {string} challenge - The challenge portion after `Digest `.
|
|
30
|
+
* @returns {DigestChallenge|null} Parsed {@link DigestChallenge}, or `null` if required fields are missing.
|
|
31
|
+
*/
|
|
32
|
+
export function parseDigestChallenge(challenge) {
|
|
33
|
+
const params = {};
|
|
34
|
+
const regex = /(\w+)=(?:"([^"]*)"|([\w.]+))/g;
|
|
35
|
+
let match;
|
|
36
|
+
while ((match = regex.exec(challenge)) !== null) {
|
|
37
|
+
params[match[1].toLowerCase()] = match[2] ?? match[3] ?? "";
|
|
38
|
+
}
|
|
39
|
+
if (!params["realm"] || !params["nonce"])
|
|
40
|
+
return null;
|
|
41
|
+
return {
|
|
42
|
+
realm: params["realm"],
|
|
43
|
+
nonce: params["nonce"],
|
|
44
|
+
qop: params["qop"],
|
|
45
|
+
opaque: params["opaque"],
|
|
46
|
+
algorithm: params["algorithm"],
|
|
47
|
+
stale: params["stale"]?.toLowerCase() === "true",
|
|
48
|
+
domain: params["domain"],
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
const nonceCounters = new Map();
|
|
52
|
+
/**
|
|
53
|
+
* Build an HTTP Digest `Proxy-Authorization` header value.
|
|
54
|
+
*
|
|
55
|
+
* @param {string} method - HTTP method (e.g. `"CONNECT"`).
|
|
56
|
+
* @param {string} uri - Request URI.
|
|
57
|
+
* @param {ProxyAuthConfig} auth - Proxy credentials.
|
|
58
|
+
* @param {DigestChallenge} challenge - Parsed digest challenge from the proxy.
|
|
59
|
+
* @returns {string} Fully-formed `Digest` authorization header value.
|
|
60
|
+
*/
|
|
61
|
+
export function buildDigestAuth(method, uri, auth, challenge) {
|
|
62
|
+
const algorithm = (challenge.algorithm ?? "MD5").toUpperCase();
|
|
63
|
+
const hashFn = algorithm === "SHA-256" ? "sha256" : "md5";
|
|
64
|
+
const ha1 = md(hashFn, `${auth.username}:${challenge.realm}:${auth.password}`);
|
|
65
|
+
const ha2 = md(hashFn, `${method}:${uri}`);
|
|
66
|
+
const count = (nonceCounters.get(challenge.nonce) ?? 0) + 1;
|
|
67
|
+
nonceCounters.set(challenge.nonce, count);
|
|
68
|
+
const nc = count.toString(16).padStart(8, "0");
|
|
69
|
+
const cnonce = randomBytes(16).toString("hex");
|
|
70
|
+
let response;
|
|
71
|
+
if (challenge.qop) {
|
|
72
|
+
const qop = challenge.qop.includes("auth") ? "auth" : challenge.qop;
|
|
73
|
+
response = md(hashFn, `${ha1}:${challenge.nonce}:${nc}:${cnonce}:${qop}:${ha2}`);
|
|
74
|
+
let header = `Digest username="${auth.username}", realm="${challenge.realm}", `;
|
|
75
|
+
header += `nonce="${challenge.nonce}", uri="${uri}", `;
|
|
76
|
+
header += `algorithm=${algorithm}, qop=${qop}, nc=${nc}, cnonce="${cnonce}", `;
|
|
77
|
+
header += `response="${response}"`;
|
|
78
|
+
if (challenge.opaque)
|
|
79
|
+
header += `, opaque="${challenge.opaque}"`;
|
|
80
|
+
return header;
|
|
81
|
+
}
|
|
82
|
+
response = md(hashFn, `${ha1}:${challenge.nonce}:${ha2}`);
|
|
83
|
+
let header = `Digest username="${auth.username}", realm="${challenge.realm}", `;
|
|
84
|
+
header += `nonce="${challenge.nonce}", uri="${uri}", `;
|
|
85
|
+
header += `algorithm=${algorithm}, response="${response}"`;
|
|
86
|
+
if (challenge.opaque)
|
|
87
|
+
header += `, opaque="${challenge.opaque}"`;
|
|
88
|
+
return header;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Build an HTTP Basic `Proxy-Authorization` header value.
|
|
92
|
+
*
|
|
93
|
+
* @param {ProxyAuthConfig} auth - Proxy credentials.
|
|
94
|
+
* @returns {string} Base64-encoded `Basic` authorization header value.
|
|
95
|
+
*/
|
|
96
|
+
export function buildBasicProxyAuth(auth) {
|
|
97
|
+
const encoded = Buffer.from(`${auth.username}:${auth.password}`).toString("base64");
|
|
98
|
+
return `Basic ${encoded}`;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Build a `Proxy-Authorization` header for the configured scheme.
|
|
102
|
+
*
|
|
103
|
+
* @param {string} method - HTTP method.
|
|
104
|
+
* @param {string} uri - Request URI.
|
|
105
|
+
* @param {ProxyAuthConfig} auth - Proxy credentials and scheme preference.
|
|
106
|
+
* @param {string} [proxyAuthHeader] - Optional raw `Proxy-Authenticate` header for digest negotiation.
|
|
107
|
+
* @returns {string|null} Header value string, or `null` if the scheme cannot be satisfied.
|
|
108
|
+
*/
|
|
109
|
+
export function buildProxyAuthorization(method, uri, auth, proxyAuthHeader) {
|
|
110
|
+
const scheme = auth.scheme ?? "basic";
|
|
111
|
+
if (scheme === "basic") {
|
|
112
|
+
return buildBasicProxyAuth(auth);
|
|
113
|
+
}
|
|
114
|
+
if (scheme === "digest" && proxyAuthHeader) {
|
|
115
|
+
const parsed = parseProxyAuthenticate(proxyAuthHeader);
|
|
116
|
+
if (parsed?.scheme === "digest") {
|
|
117
|
+
const challenge = parseDigestChallenge(parsed.challenge);
|
|
118
|
+
if (challenge) {
|
|
119
|
+
return buildDigestAuth(method, uri, auth, challenge);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
function md(algorithm, data) {
|
|
127
|
+
return createHash(algorithm).update(data).digest("hex");
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/proxy/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,21 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* (`HTTP_PROXY`, `HTTPS_PROXY`, `NO_PROXY` and their lowercase variants).
|
|
4
|
-
* Follows the same conventions as curl, got, axios, and undici.
|
|
5
|
-
*/
|
|
6
|
-
/**
|
|
7
|
-
* Resolves a proxy URL from environment variables for the given request URL.
|
|
8
|
-
* Returns `undefined` if no proxy should be used (either not configured or
|
|
9
|
-
* the host is in the `NO_PROXY` bypass list).
|
|
2
|
+
* Resolve a proxy URL from standard environment variables.
|
|
10
3
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* 2. `https_proxy` / `HTTPS_PROXY` for HTTPS URLs.
|
|
14
|
-
* 3. `http_proxy` / `HTTP_PROXY` for HTTP URLs.
|
|
15
|
-
* 4. `all_proxy` / `ALL_PROXY` as a fallback for either protocol.
|
|
4
|
+
* Checks `NO_PROXY` / `no_proxy` first, then selects `HTTPS_PROXY` or
|
|
5
|
+
* `HTTP_PROXY` (and their lowercase variants) based on the URL scheme.
|
|
16
6
|
*
|
|
17
|
-
* @param {string} url -
|
|
18
|
-
* @returns {string
|
|
7
|
+
* @param {string} url - Absolute URL to resolve a proxy for.
|
|
8
|
+
* @returns {string|undefined} Proxy URL string, or `undefined` if none applies.
|
|
19
9
|
*/
|
|
20
10
|
export declare function resolveEnvProxy(url: string): string | undefined;
|
|
21
11
|
//# sourceMappingURL=env-proxy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-proxy.d.ts","sourceRoot":"","sources":["../../src/proxy/env-proxy.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"env-proxy.d.ts","sourceRoot":"","sources":["../../src/proxy/env-proxy.ts"],"names":[],"mappings":"AAkBA;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA2B/D"}
|
package/dist/proxy/env-proxy.js
CHANGED
|
@@ -1,16 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Resolves proxy configuration from standard environment variables
|
|
3
|
-
* (`HTTP_PROXY`, `HTTPS_PROXY`, `NO_PROXY` and their lowercase variants).
|
|
4
|
-
* Follows the same conventions as curl, got, axios, and undici.
|
|
5
|
-
*/
|
|
6
|
-
/**
|
|
7
|
-
* Checks whether the given hostname should bypass the proxy according to the
|
|
8
|
-
* `NO_PROXY` / `no_proxy` environment variable.
|
|
9
|
-
*
|
|
10
|
-
* @param {string} hostname - The target hostname to check.
|
|
11
|
-
* @param {string} noProxy - Comma-separated list of hosts/domains/CIDRs to bypass.
|
|
12
|
-
* @returns {boolean} `true` if the hostname matches a bypass pattern.
|
|
13
|
-
*/
|
|
14
1
|
function matchesNoProxy(hostname, noProxy) {
|
|
15
2
|
if (noProxy === "*")
|
|
16
3
|
return true;
|
|
@@ -30,18 +17,13 @@ function matchesNoProxy(hostname, noProxy) {
|
|
|
30
17
|
return false;
|
|
31
18
|
}
|
|
32
19
|
/**
|
|
33
|
-
*
|
|
34
|
-
* Returns `undefined` if no proxy should be used (either not configured or
|
|
35
|
-
* the host is in the `NO_PROXY` bypass list).
|
|
20
|
+
* Resolve a proxy URL from standard environment variables.
|
|
36
21
|
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
* 2. `https_proxy` / `HTTPS_PROXY` for HTTPS URLs.
|
|
40
|
-
* 3. `http_proxy` / `HTTP_PROXY` for HTTP URLs.
|
|
41
|
-
* 4. `all_proxy` / `ALL_PROXY` as a fallback for either protocol.
|
|
22
|
+
* Checks `NO_PROXY` / `no_proxy` first, then selects `HTTPS_PROXY` or
|
|
23
|
+
* `HTTP_PROXY` (and their lowercase variants) based on the URL scheme.
|
|
42
24
|
*
|
|
43
|
-
* @param {string} url -
|
|
44
|
-
* @returns {string
|
|
25
|
+
* @param {string} url - Absolute URL to resolve a proxy for.
|
|
26
|
+
* @returns {string|undefined} Proxy URL string, or `undefined` if none applies.
|
|
45
27
|
*/
|
|
46
28
|
export function resolveEnvProxy(url) {
|
|
47
29
|
let parsed;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-proxy.js","sourceRoot":"","sources":["../../src/proxy/env-proxy.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"env-proxy.js","sourceRoot":"","sources":["../../src/proxy/env-proxy.ts"],"names":[],"mappings":"AAAA,SAAS,cAAc,CAAC,QAAgB,EAAE,OAAe;IACvD,IAAI,OAAO,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAEjC,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACpC,MAAM,OAAO,GAAG,OAAO;SACpB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;SAClC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEnB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAChC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAC5F,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,GAAG,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;IAChE,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IACzE,IAAI,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;QACxD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC;IAE3E,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACvE,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;IAC1B,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACrE,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;IAC1B,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACtE,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -1,33 +1,26 @@
|
|
|
1
1
|
import * as net from "node:net";
|
|
2
|
-
/**
|
|
3
|
-
* Options for establishing a connection through an HTTP CONNECT proxy.
|
|
4
|
-
*
|
|
5
|
-
* @typedef {Object} HttpProxyOptions
|
|
6
|
-
* @property {string} host - Proxy server hostname or IP address.
|
|
7
|
-
* @property {number} port - Proxy server port.
|
|
8
|
-
* @property {string} [auth] - Proxy credentials in `username:password` format (used for Basic auth).
|
|
9
|
-
* @property {number} [timeout] - Connection timeout in milliseconds (default: 30 000).
|
|
10
|
-
* @property {4 | 6} [family] - IP address family to use when resolving the proxy host.
|
|
11
|
-
*/
|
|
2
|
+
/** Configuration for connecting through an HTTP CONNECT proxy. */
|
|
12
3
|
export interface HttpProxyOptions {
|
|
4
|
+
/** Proxy server hostname or IP address. */
|
|
13
5
|
host: string;
|
|
6
|
+
/** Proxy server port. */
|
|
14
7
|
port: number;
|
|
8
|
+
/** Optional `Proxy-Authorization` header value. */
|
|
15
9
|
auth?: string;
|
|
10
|
+
/** Connection timeout in milliseconds. */
|
|
16
11
|
timeout?: number;
|
|
12
|
+
/** IP address family to use (`4` or `6`). */
|
|
17
13
|
family?: 4 | 6;
|
|
18
|
-
/**
|
|
14
|
+
/** Connect to the proxy over TLS (HTTPS proxy). */
|
|
19
15
|
secure?: boolean;
|
|
20
16
|
}
|
|
21
17
|
/**
|
|
22
|
-
*
|
|
23
|
-
* `targetHost:targetPort`. Resolves with the raw socket once the tunnel is
|
|
24
|
-
* established.
|
|
18
|
+
* Establish a TCP tunnel through an HTTP CONNECT proxy.
|
|
25
19
|
*
|
|
26
|
-
* @param {HttpProxyOptions} proxy
|
|
27
|
-
* @param {string}
|
|
28
|
-
* @param {number}
|
|
29
|
-
* @returns {Promise<net.Socket>}
|
|
30
|
-
* @throws {ProxyError} If the connection times out or the proxy rejects the CONNECT request.
|
|
20
|
+
* @param {HttpProxyOptions} proxy - Proxy connection options.
|
|
21
|
+
* @param {string} targetHost - Destination hostname.
|
|
22
|
+
* @param {number} targetPort - Destination port.
|
|
23
|
+
* @returns {Promise<net.Socket>} Connected socket tunneled through the proxy.
|
|
31
24
|
*/
|
|
32
25
|
export declare function httpProxyConnect(proxy: HttpProxyOptions, targetHost: string, targetPort: number): Promise<net.Socket>;
|
|
33
26
|
//# sourceMappingURL=http-proxy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-proxy.d.ts","sourceRoot":"","sources":["../../src/proxy/http-proxy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAIhC
|
|
1
|
+
{"version":3,"file":"http-proxy.d.ts","sourceRoot":"","sources":["../../src/proxy/http-proxy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAIhC,kEAAkE;AAClE,MAAM,WAAW,gBAAgB;IAC/B,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACf,mDAAmD;IACnD,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CA0G3H"}
|
package/dist/proxy/http-proxy.js
CHANGED
|
@@ -2,15 +2,12 @@ import * as net from "node:net";
|
|
|
2
2
|
import * as tls from "node:tls";
|
|
3
3
|
import { ProxyError } from "../core/errors.js";
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
6
|
-
* `targetHost:targetPort`. Resolves with the raw socket once the tunnel is
|
|
7
|
-
* established.
|
|
5
|
+
* Establish a TCP tunnel through an HTTP CONNECT proxy.
|
|
8
6
|
*
|
|
9
|
-
* @param {HttpProxyOptions} proxy
|
|
10
|
-
* @param {string}
|
|
11
|
-
* @param {number}
|
|
12
|
-
* @returns {Promise<net.Socket>}
|
|
13
|
-
* @throws {ProxyError} If the connection times out or the proxy rejects the CONNECT request.
|
|
7
|
+
* @param {HttpProxyOptions} proxy - Proxy connection options.
|
|
8
|
+
* @param {string} targetHost - Destination hostname.
|
|
9
|
+
* @param {number} targetPort - Destination port.
|
|
10
|
+
* @returns {Promise<net.Socket>} Connected socket tunneled through the proxy.
|
|
14
11
|
*/
|
|
15
12
|
export async function httpProxyConnect(proxy, targetHost, targetPort) {
|
|
16
13
|
return new Promise((resolve, reject) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-proxy.js","sourceRoot":"","sources":["../../src/proxy/http-proxy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"http-proxy.js","sourceRoot":"","sources":["../../src/proxy/http-proxy.ts"],"names":[],"mappings":"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"}
|
package/dist/proxy/socks.d.ts
CHANGED
|
@@ -1,35 +1,28 @@
|
|
|
1
1
|
import * as net from "node:net";
|
|
2
|
-
/**
|
|
3
|
-
* Options for establishing a connection through a SOCKS4 or SOCKS5 proxy.
|
|
4
|
-
*
|
|
5
|
-
* @typedef {Object} SocksProxyOptions
|
|
6
|
-
* @property {string} host - Proxy server hostname or IP address.
|
|
7
|
-
* @property {number} port - Proxy server port.
|
|
8
|
-
* @property {4 | 5} version - SOCKS protocol version.
|
|
9
|
-
* @property {string} [username] - Username for SOCKS5 username/password authentication.
|
|
10
|
-
* @property {string} [password] - Password for SOCKS5 username/password authentication.
|
|
11
|
-
* @property {number} [timeout] - Connection timeout in milliseconds.
|
|
12
|
-
* @property {4 | 6} [family] - IP address family used when resolving the proxy host.
|
|
13
|
-
*/
|
|
2
|
+
/** Configuration for connecting through a SOCKS proxy. */
|
|
14
3
|
export interface SocksProxyOptions {
|
|
4
|
+
/** Proxy server hostname or IP address. */
|
|
15
5
|
host: string;
|
|
6
|
+
/** Proxy server port. */
|
|
16
7
|
port: number;
|
|
8
|
+
/** SOCKS protocol version (`4` or `5`). */
|
|
17
9
|
version: 4 | 5;
|
|
10
|
+
/** Username for SOCKS5 authentication. */
|
|
18
11
|
username?: string;
|
|
12
|
+
/** Password for SOCKS5 authentication. */
|
|
19
13
|
password?: string;
|
|
14
|
+
/** Connection timeout in milliseconds. */
|
|
20
15
|
timeout?: number;
|
|
16
|
+
/** IP address family to use (`4` or `6`). */
|
|
21
17
|
family?: 4 | 6;
|
|
22
18
|
}
|
|
23
19
|
/**
|
|
24
|
-
*
|
|
25
|
-
* to `targetHost:targetPort`. Resolves with the raw socket once the tunnel is
|
|
26
|
-
* established.
|
|
20
|
+
* Establish a TCP connection through a SOCKS4 or SOCKS5 proxy.
|
|
27
21
|
*
|
|
28
|
-
* @param {SocksProxyOptions} proxy
|
|
29
|
-
* @param {string}
|
|
30
|
-
* @param {number}
|
|
31
|
-
* @returns {Promise<net.Socket>}
|
|
32
|
-
* @throws {ProxyError} If authentication fails or the proxy rejects the connection request.
|
|
22
|
+
* @param {SocksProxyOptions} proxy - SOCKS proxy options including version and optional credentials.
|
|
23
|
+
* @param {string} targetHost - Destination hostname.
|
|
24
|
+
* @param {number} targetPort - Destination port.
|
|
25
|
+
* @returns {Promise<net.Socket>} Connected socket tunneled through the SOCKS proxy.
|
|
33
26
|
*/
|
|
34
27
|
export declare function socksConnect(proxy: SocksProxyOptions, targetHost: string, targetPort: number): Promise<net.Socket>;
|
|
35
28
|
//# sourceMappingURL=socks.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socks.d.ts","sourceRoot":"","sources":["../../src/proxy/socks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAGhC
|
|
1
|
+
{"version":3,"file":"socks.d.ts","sourceRoot":"","sources":["../../src/proxy/socks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAGhC,0DAA0D;AAC1D,MAAM,WAAW,iBAAiB;IAChC,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;IACf,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAcxH"}
|
package/dist/proxy/socks.js
CHANGED
|
@@ -1,15 +1,12 @@
|
|
|
1
1
|
import * as net from "node:net";
|
|
2
2
|
import { ProxyError } from "../core/errors.js";
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
* to `targetHost:targetPort`. Resolves with the raw socket once the tunnel is
|
|
6
|
-
* established.
|
|
4
|
+
* Establish a TCP connection through a SOCKS4 or SOCKS5 proxy.
|
|
7
5
|
*
|
|
8
|
-
* @param {SocksProxyOptions} proxy
|
|
9
|
-
* @param {string}
|
|
10
|
-
* @param {number}
|
|
11
|
-
* @returns {Promise<net.Socket>}
|
|
12
|
-
* @throws {ProxyError} If authentication fails or the proxy rejects the connection request.
|
|
6
|
+
* @param {SocksProxyOptions} proxy - SOCKS proxy options including version and optional credentials.
|
|
7
|
+
* @param {string} targetHost - Destination hostname.
|
|
8
|
+
* @param {number} targetPort - Destination port.
|
|
9
|
+
* @returns {Promise<net.Socket>} Connected socket tunneled through the SOCKS proxy.
|
|
13
10
|
*/
|
|
14
11
|
export async function socksConnect(proxy, targetHost, targetPort) {
|
|
15
12
|
const socket = await tcpConnect(proxy.host, proxy.port, proxy.timeout, proxy.family);
|
|
@@ -103,8 +100,8 @@ async function socks5Handshake(socket, proxy, host, port) {
|
|
|
103
100
|
}
|
|
104
101
|
}
|
|
105
102
|
async function socks4Connect(socket, host, port) {
|
|
106
|
-
const hostBuf = Buffer.from(host
|
|
107
|
-
const req = Buffer.alloc(9 + hostBuf.length);
|
|
103
|
+
const hostBuf = Buffer.from(host, "utf-8");
|
|
104
|
+
const req = Buffer.alloc(9 + hostBuf.length + 1);
|
|
108
105
|
req[0] = 0x04;
|
|
109
106
|
req[1] = 0x01;
|
|
110
107
|
req.writeUInt16BE(port, 2);
|
|
@@ -114,6 +111,7 @@ async function socks4Connect(socket, host, port) {
|
|
|
114
111
|
req[7] = 1;
|
|
115
112
|
req[8] = 0;
|
|
116
113
|
hostBuf.copy(req, 9);
|
|
114
|
+
req[9 + hostBuf.length] = 0;
|
|
117
115
|
await socketWrite(socket, req);
|
|
118
116
|
const resp = await socketRead(socket, 8);
|
|
119
117
|
if (resp[1] !== 0x5a) {
|