nlcurl 0.12.2 → 0.13.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.
Files changed (58) hide show
  1. package/README.md +4 -15
  2. package/dist/cookies/psl-data.d.ts +2 -2
  3. package/dist/cookies/psl-data.d.ts.map +1 -1
  4. package/dist/cookies/psl-data.js +5 -2
  5. package/dist/cookies/psl-data.js.map +1 -1
  6. package/dist/index.d.ts +0 -12
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +0 -12
  9. package/dist/index.js.map +1 -1
  10. package/package.json +3 -3
  11. package/dist/cache/groups.d.ts +0 -75
  12. package/dist/cache/groups.d.ts.map +0 -1
  13. package/dist/cache/groups.js +0 -118
  14. package/dist/cache/groups.js.map +0 -1
  15. package/dist/cache/no-vary-search.d.ts +0 -33
  16. package/dist/cache/no-vary-search.d.ts.map +0 -1
  17. package/dist/cache/no-vary-search.js +0 -148
  18. package/dist/cache/no-vary-search.js.map +0 -1
  19. package/dist/cache/range.d.ts +0 -120
  20. package/dist/cache/range.d.ts.map +0 -1
  21. package/dist/cache/range.js +0 -192
  22. package/dist/cache/range.js.map +0 -1
  23. package/dist/dns/dot-resolver.d.ts +0 -89
  24. package/dist/dns/dot-resolver.d.ts.map +0 -1
  25. package/dist/dns/dot-resolver.js +0 -166
  26. package/dist/dns/dot-resolver.js.map +0 -1
  27. package/dist/http/resumable-upload.d.ts +0 -76
  28. package/dist/http/resumable-upload.d.ts.map +0 -1
  29. package/dist/http/resumable-upload.js +0 -104
  30. package/dist/http/resumable-upload.js.map +0 -1
  31. package/dist/http/trailers.d.ts +0 -29
  32. package/dist/http/trailers.d.ts.map +0 -1
  33. package/dist/http/trailers.js +0 -57
  34. package/dist/http/trailers.js.map +0 -1
  35. package/dist/middleware/circuit-breaker.d.ts +0 -44
  36. package/dist/middleware/circuit-breaker.d.ts.map +0 -1
  37. package/dist/middleware/circuit-breaker.js +0 -96
  38. package/dist/middleware/circuit-breaker.js.map +0 -1
  39. package/dist/tls/ct.d.ts +0 -78
  40. package/dist/tls/ct.d.ts.map +0 -1
  41. package/dist/tls/ct.js +0 -175
  42. package/dist/tls/ct.js.map +0 -1
  43. package/dist/tls/early-data.d.ts +0 -45
  44. package/dist/tls/early-data.d.ts.map +0 -1
  45. package/dist/tls/early-data.js +0 -46
  46. package/dist/tls/early-data.js.map +0 -1
  47. package/dist/tls/ocsp.d.ts +0 -55
  48. package/dist/tls/ocsp.d.ts.map +0 -1
  49. package/dist/tls/ocsp.js +0 -131
  50. package/dist/tls/ocsp.js.map +0 -1
  51. package/dist/utils/dictionary-transport.d.ts +0 -97
  52. package/dist/utils/dictionary-transport.d.ts.map +0 -1
  53. package/dist/utils/dictionary-transport.js +0 -171
  54. package/dist/utils/dictionary-transport.js.map +0 -1
  55. package/dist/utils/tcp-fast-open.d.ts +0 -30
  56. package/dist/utils/tcp-fast-open.d.ts.map +0 -1
  57. package/dist/utils/tcp-fast-open.js +0 -36
  58. package/dist/utils/tcp-fast-open.js.map +0 -1
@@ -1,29 +0,0 @@
1
- /**
2
- * Check whether a header name is allowed as an HTTP trailer field.
3
- *
4
- * @param {string} name - Header field name.
5
- * @returns {boolean} `true` if the name is not in the forbidden trailer fields set.
6
- */
7
- export declare function isValidTrailerField(name: string): boolean;
8
- /**
9
- * Serialize trailer fields into a wire-format buffer.
10
- *
11
- * @param {Record<string, string>} trailers - Key-value pairs of trailer fields.
12
- * @returns {Buffer} CRLF-delimited buffer of valid trailer fields.
13
- */
14
- export declare function serializeTrailers(trailers: Record<string, string>): Buffer;
15
- /**
16
- * Parse trailer field data into a key-value record.
17
- *
18
- * @param {Buffer} data - Raw trailer data buffer.
19
- * @returns {Record<string, string>} Parsed trailer fields keyed by lowercase name.
20
- */
21
- export declare function parseTrailers(data: Buffer): Record<string, string>;
22
- /**
23
- * Build a Trailer header value listing the trailer field names.
24
- *
25
- * @param {string[]} fieldNames - Trailer field names to advertise.
26
- * @returns {string} Comma-separated string of valid trailer field names.
27
- */
28
- export declare function buildTrailerHeader(fieldNames: string[]): string;
29
- //# sourceMappingURL=trailers.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"trailers.d.ts","sourceRoot":"","sources":["../../src/http/trailers.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAQ1E;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAclE;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,CAE/D"}
@@ -1,57 +0,0 @@
1
- const FORBIDDEN_TRAILER_FIELDS = new Set(["transfer-encoding", "content-length", "host", "cache-control", "expect", "max-forwards", "pragma", "range", "te", "authorization", "content-encoding", "content-range", "content-type", "trailer", "set-cookie"]);
2
- /**
3
- * Check whether a header name is allowed as an HTTP trailer field.
4
- *
5
- * @param {string} name - Header field name.
6
- * @returns {boolean} `true` if the name is not in the forbidden trailer fields set.
7
- */
8
- export function isValidTrailerField(name) {
9
- return !FORBIDDEN_TRAILER_FIELDS.has(name.toLowerCase());
10
- }
11
- /**
12
- * Serialize trailer fields into a wire-format buffer.
13
- *
14
- * @param {Record<string, string>} trailers - Key-value pairs of trailer fields.
15
- * @returns {Buffer} CRLF-delimited buffer of valid trailer fields.
16
- */
17
- export function serializeTrailers(trailers) {
18
- const lines = [];
19
- for (const [name, value] of Object.entries(trailers)) {
20
- if (isValidTrailerField(name)) {
21
- lines.push(`${name}: ${value}`);
22
- }
23
- }
24
- return Buffer.from(lines.join("\r\n") + "\r\n", "ascii");
25
- }
26
- /**
27
- * Parse trailer field data into a key-value record.
28
- *
29
- * @param {Buffer} data - Raw trailer data buffer.
30
- * @returns {Record<string, string>} Parsed trailer fields keyed by lowercase name.
31
- */
32
- export function parseTrailers(data) {
33
- const trailers = {};
34
- const text = data.toString("ascii");
35
- const lines = text.split("\r\n");
36
- for (const line of lines) {
37
- const colonIdx = line.indexOf(":");
38
- if (colonIdx < 0)
39
- continue;
40
- const name = line.substring(0, colonIdx).trim().toLowerCase();
41
- const value = line.substring(colonIdx + 1).trim();
42
- if (name && isValidTrailerField(name)) {
43
- trailers[name] = value;
44
- }
45
- }
46
- return trailers;
47
- }
48
- /**
49
- * Build a Trailer header value listing the trailer field names.
50
- *
51
- * @param {string[]} fieldNames - Trailer field names to advertise.
52
- * @returns {string} Comma-separated string of valid trailer field names.
53
- */
54
- export function buildTrailerHeader(fieldNames) {
55
- return fieldNames.filter(isValidTrailerField).join(", ");
56
- }
57
- //# sourceMappingURL=trailers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"trailers.js","sourceRoot":"","sources":["../../src/http/trailers.ts"],"names":[],"mappings":"AAAA,MAAM,wBAAwB,GAAG,IAAI,GAAG,CAAC,CAAC,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,kBAAkB,EAAE,eAAe,EAAE,cAAc,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;AAE7P;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,OAAO,CAAC,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgC;IAChE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrD,IAAI,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,OAAO,CAAC,CAAC;AAC3D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,QAAQ,GAAG,CAAC;YAAE,SAAS;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAClD,IAAI,IAAI,IAAI,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QACzB,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAAoB;IACrD,OAAO,UAAU,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3D,CAAC"}
@@ -1,44 +0,0 @@
1
- /** Circuit breaker states. */
2
- export declare const enum CircuitState {
3
- CLOSED = 0,
4
- OPEN = 1,
5
- HALF_OPEN = 2
6
- }
7
- /** Configuration for the circuit breaker. */
8
- export interface CircuitBreakerConfig {
9
- /** Number of consecutive failures before opening the circuit. */
10
- failureThreshold: number;
11
- /** Time in ms the circuit stays open before allowing a probe request. */
12
- resetTimeoutMs: number;
13
- /** Number of successful probe requests to close the circuit (default: 1). */
14
- successThreshold?: number;
15
- /** Optional predicate to determine if a status code is a failure. */
16
- isFailure?: (statusCode: number) => boolean;
17
- }
18
- /** Per-origin circuit breaker for preventing cascading failures. */
19
- export declare class CircuitBreaker {
20
- private readonly failureThreshold;
21
- private readonly resetTimeoutMs;
22
- private readonly successThreshold;
23
- private readonly isFailure;
24
- private readonly circuits;
25
- constructor(config: CircuitBreakerConfig);
26
- /**
27
- * Check if a request to the given origin should be allowed.
28
- * Throws if the circuit is open and not yet ready for a probe.
29
- */
30
- allowRequest(origin: string): void;
31
- /** Record a successful request to the origin. */
32
- recordSuccess(origin: string): void;
33
- /** Record a failed request or a failure status code. */
34
- recordFailure(origin: string): void;
35
- /** Record a response and automatically classify as success/failure. */
36
- recordResponse(origin: string, statusCode: number): void;
37
- /** Get the current state of the circuit for an origin. */
38
- getState(origin: string): CircuitState;
39
- /** Reset a specific origin's circuit. */
40
- reset(origin: string): void;
41
- /** Reset all circuits. */
42
- resetAll(): void;
43
- }
44
- //# sourceMappingURL=circuit-breaker.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"circuit-breaker.d.ts","sourceRoot":"","sources":["../../src/middleware/circuit-breaker.ts"],"names":[],"mappings":"AAEA,8BAA8B;AAC9B,0BAAkB,YAAY;IAC5B,MAAM,IAAI;IACV,IAAI,IAAI;IACR,SAAS,IAAI;CACd;AAED,6CAA6C;AAC7C,MAAM,WAAW,oBAAoB;IACnC,iEAAiE;IACjE,gBAAgB,EAAE,MAAM,CAAC;IACzB,yEAAyE;IACzE,cAAc,EAAE,MAAM,CAAC;IACvB,6EAA6E;IAC7E,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,qEAAqE;IACrE,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC;CAC7C;AAED,oEAAoE;AACpE,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkC;IAC5D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;gBAEhD,MAAM,EAAE,oBAAoB;IAOxC;;;OAGG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAclC,iDAAiD;IACjD,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAenC,wDAAwD;IACxD,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAoBnC,uEAAuE;IACvE,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAQxD,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY;IAItC,yCAAyC;IACzC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI3B,0BAA0B;IAC1B,QAAQ,IAAI,IAAI;CAGjB"}
@@ -1,96 +0,0 @@
1
- import { NLcURLError } from "../core/errors.js";
2
- /** Circuit breaker states. */
3
- export var CircuitState;
4
- (function (CircuitState) {
5
- CircuitState[CircuitState["CLOSED"] = 0] = "CLOSED";
6
- CircuitState[CircuitState["OPEN"] = 1] = "OPEN";
7
- CircuitState[CircuitState["HALF_OPEN"] = 2] = "HALF_OPEN";
8
- })(CircuitState || (CircuitState = {}));
9
- /** Per-origin circuit breaker for preventing cascading failures. */
10
- export class CircuitBreaker {
11
- failureThreshold;
12
- resetTimeoutMs;
13
- successThreshold;
14
- isFailure;
15
- circuits = new Map();
16
- constructor(config) {
17
- this.failureThreshold = config.failureThreshold;
18
- this.resetTimeoutMs = config.resetTimeoutMs;
19
- this.successThreshold = config.successThreshold ?? 1;
20
- this.isFailure = config.isFailure ?? ((s) => s >= 500);
21
- }
22
- /**
23
- * Check if a request to the given origin should be allowed.
24
- * Throws if the circuit is open and not yet ready for a probe.
25
- */
26
- allowRequest(origin) {
27
- const entry = this.circuits.get(origin);
28
- if (!entry)
29
- return;
30
- if (entry.state === CircuitState.OPEN) {
31
- if (Date.now() >= entry.openedAt + this.resetTimeoutMs) {
32
- entry.state = CircuitState.HALF_OPEN;
33
- entry.halfOpenSuccesses = 0;
34
- }
35
- else {
36
- throw new NLcURLError(`Circuit breaker open for ${origin} — failing fast`, "ERR_CIRCUIT_OPEN");
37
- }
38
- }
39
- }
40
- /** Record a successful request to the origin. */
41
- recordSuccess(origin) {
42
- const entry = this.circuits.get(origin);
43
- if (!entry)
44
- return;
45
- if (entry.state === CircuitState.HALF_OPEN) {
46
- entry.halfOpenSuccesses++;
47
- if (entry.halfOpenSuccesses >= this.successThreshold) {
48
- entry.state = CircuitState.CLOSED;
49
- entry.consecutiveFailures = 0;
50
- }
51
- }
52
- else if (entry.state === CircuitState.CLOSED) {
53
- entry.consecutiveFailures = 0;
54
- }
55
- }
56
- /** Record a failed request or a failure status code. */
57
- recordFailure(origin) {
58
- let entry = this.circuits.get(origin);
59
- if (!entry) {
60
- entry = { state: CircuitState.CLOSED, consecutiveFailures: 0, openedAt: 0, halfOpenSuccesses: 0 };
61
- this.circuits.set(origin, entry);
62
- }
63
- if (entry.state === CircuitState.HALF_OPEN) {
64
- entry.state = CircuitState.OPEN;
65
- entry.openedAt = Date.now();
66
- return;
67
- }
68
- entry.consecutiveFailures++;
69
- if (entry.consecutiveFailures >= this.failureThreshold) {
70
- entry.state = CircuitState.OPEN;
71
- entry.openedAt = Date.now();
72
- }
73
- }
74
- /** Record a response and automatically classify as success/failure. */
75
- recordResponse(origin, statusCode) {
76
- if (this.isFailure(statusCode)) {
77
- this.recordFailure(origin);
78
- }
79
- else {
80
- this.recordSuccess(origin);
81
- }
82
- }
83
- /** Get the current state of the circuit for an origin. */
84
- getState(origin) {
85
- return this.circuits.get(origin)?.state ?? CircuitState.CLOSED;
86
- }
87
- /** Reset a specific origin's circuit. */
88
- reset(origin) {
89
- this.circuits.delete(origin);
90
- }
91
- /** Reset all circuits. */
92
- resetAll() {
93
- this.circuits.clear();
94
- }
95
- }
96
- //# sourceMappingURL=circuit-breaker.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../../src/middleware/circuit-breaker.ts"],"names":[],"mappings":"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"}
package/dist/tls/ct.d.ts DELETED
@@ -1,78 +0,0 @@
1
- /** Hash algorithms used in Signed Certificate Timestamps. */
2
- export declare enum SCTHashAlgorithm {
3
- NONE = 0,
4
- MD5 = 1,
5
- SHA1 = 2,
6
- SHA224 = 3,
7
- SHA256 = 4,
8
- SHA384 = 5,
9
- SHA512 = 6
10
- }
11
- /** Digital signature algorithms used in Signed Certificate Timestamps. */
12
- export declare enum SCTSignatureAlgorithm {
13
- ANONYMOUS = 0,
14
- RSA = 1,
15
- DSA = 2,
16
- ECDSA = 3
17
- }
18
- /** Signed Certificate Timestamp version identifiers. */
19
- export declare enum SCTVersion {
20
- V1 = 0
21
- }
22
- /** Parsed Signed Certificate Timestamp (RFC 6962). */
23
- export interface SCT {
24
- /** SCT structure version. */
25
- version: SCTVersion;
26
- /** Log ID (SHA-256 hash of the log's public key). */
27
- logId: Buffer;
28
- /** Timestamp when the SCT was issued. */
29
- timestamp: Date;
30
- /** SCT extensions data. */
31
- extensions: Buffer;
32
- /** Hash algorithm used in the signature. */
33
- hashAlgorithm: SCTHashAlgorithm;
34
- /** Signature algorithm used. */
35
- signatureAlgorithm: SCTSignatureAlgorithm;
36
- /** Digital signature bytes. */
37
- signature: Buffer;
38
- }
39
- /** Result of validating SCTs for Certificate Transparency compliance. */
40
- export interface SCTValidationResult {
41
- /** Whether the certificate meets CT compliance requirements. */
42
- compliant: boolean;
43
- /** Number of unique SCTs found. */
44
- sctCount: number;
45
- /** Deduplicated SCT entries. */
46
- scts: SCT[];
47
- /** Source from which the SCTs were obtained. */
48
- source?: "embedded" | "tls-extension" | "ocsp";
49
- }
50
- /**
51
- * Parse a serialized SCT list into individual SCT entries.
52
- *
53
- * @param {Buffer} data - TLS-encoded SCT list buffer.
54
- * @returns {SCT[]} Array of parsed {@link SCT} objects.
55
- */
56
- export declare function parseSCTList(data: Buffer): SCT[];
57
- /**
58
- * Validate a set of SCTs for Certificate Transparency compliance.
59
- *
60
- * Deduplicates by log ID and requires at least two unique logs.
61
- *
62
- * @param {SCT[]} scts - Array of parsed SCTs.
63
- * @returns {SCTValidationResult} Validation result with compliance status.
64
- */
65
- export declare function validateSCTs(scts: SCT[]): SCTValidationResult;
66
- /**
67
- * Extract embedded SCTs from a TLS socket's peer certificate.
68
- *
69
- * @param {{ getPeerCertificate?: (detailed?: boolean) => { raw?: Buffer; serialNumber?: string } }} socket - Socket with a `getPeerCertificate` method.
70
- * @returns {SCTValidationResult | undefined} Validation result, or `undefined` if SCTs cannot be extracted.
71
- */
72
- export declare function extractSCTsFromSocket(socket: {
73
- getPeerCertificate?: (detailed?: boolean) => {
74
- raw?: Buffer;
75
- serialNumber?: string;
76
- };
77
- }): SCTValidationResult | undefined;
78
- //# sourceMappingURL=ct.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ct.d.ts","sourceRoot":"","sources":["../../src/tls/ct.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,oBAAY,gBAAgB;IAC1B,IAAI,IAAI;IACR,GAAG,IAAI;IACP,IAAI,IAAI;IACR,MAAM,IAAI;IACV,MAAM,IAAI;IACV,MAAM,IAAI;IACV,MAAM,IAAI;CACX;AAED,0EAA0E;AAC1E,oBAAY,qBAAqB;IAC/B,SAAS,IAAI;IACb,GAAG,IAAI;IACP,GAAG,IAAI;IACP,KAAK,IAAI;CACV;AAED,wDAAwD;AACxD,oBAAY,UAAU;IACpB,EAAE,IAAI;CACP;AAED,sDAAsD;AACtD,MAAM,WAAW,GAAG;IAClB,6BAA6B;IAC7B,OAAO,EAAE,UAAU,CAAC;IACpB,qDAAqD;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,SAAS,EAAE,IAAI,CAAC;IAChB,2BAA2B;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,aAAa,EAAE,gBAAgB,CAAC;IAChC,gCAAgC;IAChC,kBAAkB,EAAE,qBAAqB,CAAC;IAC1C,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,yEAAyE;AACzE,MAAM,WAAW,mBAAmB;IAClC,gEAAgE;IAChE,SAAS,EAAE,OAAO,CAAC;IACnB,mCAAmC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,gCAAgC;IAChC,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,gDAAgD;IAChD,MAAM,CAAC,EAAE,UAAU,GAAG,eAAe,GAAG,MAAM,CAAC;CAChD;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,EAAE,CAsBhD;AA+CD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,mBAAmB,CAgB7D;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE;IAAE,kBAAkB,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,OAAO,KAAK;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAAG,mBAAmB,GAAG,SAAS,CA2CvK"}
package/dist/tls/ct.js DELETED
@@ -1,175 +0,0 @@
1
- /** Hash algorithms used in Signed Certificate Timestamps. */
2
- export var SCTHashAlgorithm;
3
- (function (SCTHashAlgorithm) {
4
- SCTHashAlgorithm[SCTHashAlgorithm["NONE"] = 0] = "NONE";
5
- SCTHashAlgorithm[SCTHashAlgorithm["MD5"] = 1] = "MD5";
6
- SCTHashAlgorithm[SCTHashAlgorithm["SHA1"] = 2] = "SHA1";
7
- SCTHashAlgorithm[SCTHashAlgorithm["SHA224"] = 3] = "SHA224";
8
- SCTHashAlgorithm[SCTHashAlgorithm["SHA256"] = 4] = "SHA256";
9
- SCTHashAlgorithm[SCTHashAlgorithm["SHA384"] = 5] = "SHA384";
10
- SCTHashAlgorithm[SCTHashAlgorithm["SHA512"] = 6] = "SHA512";
11
- })(SCTHashAlgorithm || (SCTHashAlgorithm = {}));
12
- /** Digital signature algorithms used in Signed Certificate Timestamps. */
13
- export var SCTSignatureAlgorithm;
14
- (function (SCTSignatureAlgorithm) {
15
- SCTSignatureAlgorithm[SCTSignatureAlgorithm["ANONYMOUS"] = 0] = "ANONYMOUS";
16
- SCTSignatureAlgorithm[SCTSignatureAlgorithm["RSA"] = 1] = "RSA";
17
- SCTSignatureAlgorithm[SCTSignatureAlgorithm["DSA"] = 2] = "DSA";
18
- SCTSignatureAlgorithm[SCTSignatureAlgorithm["ECDSA"] = 3] = "ECDSA";
19
- })(SCTSignatureAlgorithm || (SCTSignatureAlgorithm = {}));
20
- /** Signed Certificate Timestamp version identifiers. */
21
- export var SCTVersion;
22
- (function (SCTVersion) {
23
- SCTVersion[SCTVersion["V1"] = 0] = "V1";
24
- })(SCTVersion || (SCTVersion = {}));
25
- /**
26
- * Parse a serialized SCT list into individual SCT entries.
27
- *
28
- * @param {Buffer} data - TLS-encoded SCT list buffer.
29
- * @returns {SCT[]} Array of parsed {@link SCT} objects.
30
- */
31
- export function parseSCTList(data) {
32
- if (data.length < 2)
33
- return [];
34
- const listLength = data.readUInt16BE(0);
35
- if (listLength + 2 > data.length)
36
- return [];
37
- const scts = [];
38
- let offset = 2;
39
- const end = 2 + listLength;
40
- while (offset + 2 <= end) {
41
- const sctLength = data.readUInt16BE(offset);
42
- offset += 2;
43
- if (offset + sctLength > end)
44
- break;
45
- const sct = parseSingleSCT(data.subarray(offset, offset + sctLength));
46
- if (sct)
47
- scts.push(sct);
48
- offset += sctLength;
49
- }
50
- return scts;
51
- }
52
- function parseSingleSCT(data) {
53
- if (data.length < 1 + 32 + 8 + 2 + 2 + 2)
54
- return null;
55
- let offset = 0;
56
- const version = data[offset];
57
- if (version !== SCTVersion.V1)
58
- return null;
59
- offset += 1;
60
- const logId = Buffer.from(data.subarray(offset, offset + 32));
61
- offset += 32;
62
- const timestampMs = Number(data.readBigUInt64BE(offset));
63
- const timestamp = new Date(timestampMs);
64
- offset += 8;
65
- const extensionsLength = data.readUInt16BE(offset);
66
- offset += 2;
67
- const extensions = Buffer.from(data.subarray(offset, offset + extensionsLength));
68
- offset += extensionsLength;
69
- if (offset + 4 > data.length)
70
- return null;
71
- const hashAlgorithm = data[offset];
72
- offset += 1;
73
- const signatureAlgorithm = data[offset];
74
- offset += 1;
75
- const signatureLength = data.readUInt16BE(offset);
76
- offset += 2;
77
- if (offset + signatureLength > data.length)
78
- return null;
79
- const signature = Buffer.from(data.subarray(offset, offset + signatureLength));
80
- return {
81
- version,
82
- logId,
83
- timestamp,
84
- extensions,
85
- hashAlgorithm,
86
- signatureAlgorithm,
87
- signature,
88
- };
89
- }
90
- /**
91
- * Validate a set of SCTs for Certificate Transparency compliance.
92
- *
93
- * Deduplicates by log ID and requires at least two unique logs.
94
- *
95
- * @param {SCT[]} scts - Array of parsed SCTs.
96
- * @returns {SCTValidationResult} Validation result with compliance status.
97
- */
98
- export function validateSCTs(scts) {
99
- const uniqueLogs = new Set();
100
- const uniqueSCTs = [];
101
- for (const sct of scts) {
102
- const logIdHex = sct.logId.toString("hex");
103
- if (!uniqueLogs.has(logIdHex)) {
104
- uniqueLogs.add(logIdHex);
105
- uniqueSCTs.push(sct);
106
- }
107
- }
108
- return {
109
- compliant: uniqueLogs.size >= 2,
110
- sctCount: uniqueSCTs.length,
111
- scts: uniqueSCTs,
112
- };
113
- }
114
- /**
115
- * Extract embedded SCTs from a TLS socket's peer certificate.
116
- *
117
- * @param {{ getPeerCertificate?: (detailed?: boolean) => { raw?: Buffer; serialNumber?: string } }} socket - Socket with a `getPeerCertificate` method.
118
- * @returns {SCTValidationResult | undefined} Validation result, or `undefined` if SCTs cannot be extracted.
119
- */
120
- export function extractSCTsFromSocket(socket) {
121
- if (!socket.getPeerCertificate)
122
- return undefined;
123
- const cert = socket.getPeerCertificate(true);
124
- if (!cert || !cert.raw)
125
- return undefined;
126
- const sctExtOid = Buffer.from([0x06, 0x0a, 0x2b, 0x06, 0x01, 0x04, 0x01, 0xd6, 0x79, 0x02, 0x04, 0x02]);
127
- const extIdx = cert.raw.indexOf(sctExtOid);
128
- if (extIdx === -1) {
129
- return { compliant: false, sctCount: 0, scts: [] };
130
- }
131
- let offset = extIdx + sctExtOid.length;
132
- if (offset < cert.raw.length && cert.raw[offset] === 0x01) {
133
- offset += 3;
134
- }
135
- if (offset >= cert.raw.length || cert.raw[offset] !== 0x04) {
136
- return { compliant: false, sctCount: 0, scts: [] };
137
- }
138
- offset++;
139
- const result = readLength(cert.raw, offset);
140
- if (result.value === -1)
141
- return { compliant: false, sctCount: 0, scts: [] };
142
- offset += result.bytesRead;
143
- if (offset >= cert.raw.length || cert.raw[offset] !== 0x04) {
144
- const scts = parseSCTList(cert.raw.subarray(offset));
145
- const validation = validateSCTs(scts);
146
- validation.source = "embedded";
147
- return validation;
148
- }
149
- offset++;
150
- const innerResult = readLength(cert.raw, offset);
151
- if (innerResult.value === -1)
152
- return { compliant: false, sctCount: 0, scts: [] };
153
- offset += innerResult.bytesRead;
154
- const sctData = cert.raw.subarray(offset, offset + innerResult.value);
155
- const scts = parseSCTList(sctData);
156
- const validation = validateSCTs(scts);
157
- validation.source = "embedded";
158
- return validation;
159
- }
160
- function readLength(buf, offset) {
161
- if (offset >= buf.length)
162
- return { value: -1, bytesRead: 0 };
163
- const first = buf[offset];
164
- if (first < 0x80)
165
- return { value: first, bytesRead: 1 };
166
- const numBytes = first & 0x7f;
167
- if (numBytes === 0 || numBytes > 4 || offset + numBytes >= buf.length)
168
- return { value: -1, bytesRead: 0 };
169
- let value = 0;
170
- for (let i = 0; i < numBytes; i++) {
171
- value = (value << 8) | buf[offset + 1 + i];
172
- }
173
- return { value, bytesRead: 1 + numBytes };
174
- }
175
- //# sourceMappingURL=ct.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ct.js","sourceRoot":"","sources":["../../src/tls/ct.ts"],"names":[],"mappings":"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"}
@@ -1,45 +0,0 @@
1
- /** Configuration for TLS 1.3 early data (0-RTT). */
2
- export interface EarlyDataConfig {
3
- /** Enable early data transmission. */
4
- enabled?: boolean;
5
- /** Maximum early data payload size in bytes. */
6
- maxSize?: number;
7
- /** Restrict early data to safe (idempotent) HTTP methods only. */
8
- safeOnly?: boolean;
9
- }
10
- /** Outcome of an early data (0-RTT) transmission attempt. */
11
- export interface EarlyDataResult {
12
- /** Whether the server accepted the early data. */
13
- accepted: boolean;
14
- /** Whether early data transmission was attempted. */
15
- attempted: boolean;
16
- /** Number of bytes sent as early data. */
17
- bytesSent: number;
18
- }
19
- /**
20
- * Determine whether early data can be sent for the given HTTP method.
21
- *
22
- * @param {string} method - HTTP method string.
23
- * @param {EarlyDataConfig} [config] - Early data configuration.
24
- * @returns {boolean} `true` if early data is permitted.
25
- */
26
- export declare function canSendEarlyData(method: string, config?: EarlyDataConfig): boolean;
27
- /**
28
- * Prepare request data for 0-RTT transmission.
29
- *
30
- * @param {Buffer} requestData - Serialized request bytes.
31
- * @param {EarlyDataConfig} [config] - Early data configuration.
32
- * @returns {Buffer|null} Buffer to send as early data, or `null` if not applicable.
33
- */
34
- export declare function prepareEarlyData(requestData: Buffer, config?: EarlyDataConfig): Buffer | null;
35
- /**
36
- * Check whether the server accepted early data on a connected socket.
37
- *
38
- * @param {{ alpnProtocol?: string | false; earlyData?: boolean }} socket - Socket with optional `earlyData` flag.
39
- * @returns {EarlyDataResult} Early data acceptance result.
40
- */
41
- export declare function checkEarlyDataAccepted(socket: {
42
- alpnProtocol?: string | false;
43
- earlyData?: boolean;
44
- }): EarlyDataResult;
45
- //# sourceMappingURL=early-data.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"early-data.d.ts","sourceRoot":"","sources":["../../src/tls/early-data.ts"],"names":[],"mappings":"AAEA,oDAAoD;AACpD,MAAM,WAAW,eAAe;IAC9B,sCAAsC;IACtC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,6DAA6D;AAC7D,MAAM,WAAW,eAAe;IAC9B,kDAAkD;IAClD,QAAQ,EAAE,OAAO,CAAC;IAClB,qDAAqD;IACrD,SAAS,EAAE,OAAO,CAAC;IACnB,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,eAAe,GAAG,OAAO,CAMlF;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAO7F;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,eAAe,CAOtH"}
@@ -1,46 +0,0 @@
1
- const SAFE_EARLY_DATA_METHODS = new Set(["GET", "HEAD", "OPTIONS"]);
2
- /**
3
- * Determine whether early data can be sent for the given HTTP method.
4
- *
5
- * @param {string} method - HTTP method string.
6
- * @param {EarlyDataConfig} [config] - Early data configuration.
7
- * @returns {boolean} `true` if early data is permitted.
8
- */
9
- export function canSendEarlyData(method, config) {
10
- if (!config?.enabled)
11
- return false;
12
- if (config.safeOnly !== false && !SAFE_EARLY_DATA_METHODS.has(method.toUpperCase())) {
13
- return false;
14
- }
15
- return true;
16
- }
17
- /**
18
- * Prepare request data for 0-RTT transmission.
19
- *
20
- * @param {Buffer} requestData - Serialized request bytes.
21
- * @param {EarlyDataConfig} [config] - Early data configuration.
22
- * @returns {Buffer|null} Buffer to send as early data, or `null` if not applicable.
23
- */
24
- export function prepareEarlyData(requestData, config) {
25
- if (!config?.enabled)
26
- return null;
27
- const maxSize = config.maxSize ?? 16384;
28
- if (requestData.length > maxSize)
29
- return null;
30
- return requestData;
31
- }
32
- /**
33
- * Check whether the server accepted early data on a connected socket.
34
- *
35
- * @param {{ alpnProtocol?: string | false; earlyData?: boolean }} socket - Socket with optional `earlyData` flag.
36
- * @returns {EarlyDataResult} Early data acceptance result.
37
- */
38
- export function checkEarlyDataAccepted(socket) {
39
- const accepted = socket.earlyData === true;
40
- return {
41
- accepted,
42
- attempted: true,
43
- bytesSent: 0,
44
- };
45
- }
46
- //# sourceMappingURL=early-data.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"early-data.js","sourceRoot":"","sources":["../../src/tls/early-data.ts"],"names":[],"mappings":"AAAA,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;AAsBpE;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAc,EAAE,MAAwB;IACvE,IAAI,CAAC,MAAM,EAAE,OAAO;QAAE,OAAO,KAAK,CAAC;IACnC,IAAI,MAAM,CAAC,QAAQ,KAAK,KAAK,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;QACpF,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAmB,EAAE,MAAwB;IAC5E,IAAI,CAAC,MAAM,EAAE,OAAO;QAAE,OAAO,IAAI,CAAC;IAElC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,KAAK,CAAC;IACxC,IAAI,WAAW,CAAC,MAAM,GAAG,OAAO;QAAE,OAAO,IAAI,CAAC;IAE9C,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAA8D;IACnG,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,KAAK,IAAI,CAAC;IAC3C,OAAO;QACL,QAAQ;QACR,SAAS,EAAE,IAAI;QACf,SAAS,EAAE,CAAC;KACb,CAAC;AACJ,CAAC"}