nlcurl 0.12.2 → 0.14.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 (92) 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 +8 -2
  5. package/dist/cookies/psl-data.js.map +1 -1
  6. package/dist/dns/types.d.ts +0 -2
  7. package/dist/dns/types.d.ts.map +1 -1
  8. package/dist/dns/types.js.map +1 -1
  9. package/dist/fingerprints/extensions.d.ts +0 -6
  10. package/dist/fingerprints/extensions.d.ts.map +1 -1
  11. package/dist/fingerprints/extensions.js +0 -8
  12. package/dist/fingerprints/extensions.js.map +1 -1
  13. package/dist/fingerprints/ja3.d.ts +0 -14
  14. package/dist/fingerprints/ja3.d.ts.map +1 -1
  15. package/dist/fingerprints/ja3.js +0 -35
  16. package/dist/fingerprints/ja3.js.map +1 -1
  17. package/dist/http/h1/encoder.d.ts +0 -11
  18. package/dist/http/h1/encoder.d.ts.map +1 -1
  19. package/dist/http/h1/encoder.js +0 -51
  20. package/dist/http/h1/encoder.js.map +1 -1
  21. package/dist/http/h2/frames.d.ts +0 -19
  22. package/dist/http/h2/frames.d.ts.map +1 -1
  23. package/dist/http/h2/frames.js +0 -32
  24. package/dist/http/h2/frames.js.map +1 -1
  25. package/dist/index.d.ts +0 -12
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +0 -12
  28. package/dist/index.js.map +1 -1
  29. package/dist/tls/constants.d.ts +0 -7
  30. package/dist/tls/constants.d.ts.map +1 -1
  31. package/dist/tls/constants.js +0 -9
  32. package/dist/tls/constants.js.map +1 -1
  33. package/dist/tls/ech.d.ts.map +1 -1
  34. package/dist/tls/ech.js +0 -1
  35. package/dist/tls/ech.js.map +1 -1
  36. package/dist/tls/keylog.d.ts +0 -15
  37. package/dist/tls/keylog.d.ts.map +1 -1
  38. package/dist/tls/keylog.js +0 -19
  39. package/dist/tls/keylog.js.map +1 -1
  40. package/dist/tls/stealth/handshake.d.ts +0 -11
  41. package/dist/tls/stealth/handshake.d.ts.map +1 -1
  42. package/dist/tls/stealth/handshake.js +0 -17
  43. package/dist/tls/stealth/handshake.js.map +1 -1
  44. package/package.json +3 -3
  45. package/dist/cache/groups.d.ts +0 -75
  46. package/dist/cache/groups.d.ts.map +0 -1
  47. package/dist/cache/groups.js +0 -118
  48. package/dist/cache/groups.js.map +0 -1
  49. package/dist/cache/no-vary-search.d.ts +0 -33
  50. package/dist/cache/no-vary-search.d.ts.map +0 -1
  51. package/dist/cache/no-vary-search.js +0 -148
  52. package/dist/cache/no-vary-search.js.map +0 -1
  53. package/dist/cache/range.d.ts +0 -120
  54. package/dist/cache/range.d.ts.map +0 -1
  55. package/dist/cache/range.js +0 -192
  56. package/dist/cache/range.js.map +0 -1
  57. package/dist/dns/dot-resolver.d.ts +0 -89
  58. package/dist/dns/dot-resolver.d.ts.map +0 -1
  59. package/dist/dns/dot-resolver.js +0 -166
  60. package/dist/dns/dot-resolver.js.map +0 -1
  61. package/dist/http/resumable-upload.d.ts +0 -76
  62. package/dist/http/resumable-upload.d.ts.map +0 -1
  63. package/dist/http/resumable-upload.js +0 -104
  64. package/dist/http/resumable-upload.js.map +0 -1
  65. package/dist/http/trailers.d.ts +0 -29
  66. package/dist/http/trailers.d.ts.map +0 -1
  67. package/dist/http/trailers.js +0 -57
  68. package/dist/http/trailers.js.map +0 -1
  69. package/dist/middleware/circuit-breaker.d.ts +0 -44
  70. package/dist/middleware/circuit-breaker.d.ts.map +0 -1
  71. package/dist/middleware/circuit-breaker.js +0 -96
  72. package/dist/middleware/circuit-breaker.js.map +0 -1
  73. package/dist/tls/ct.d.ts +0 -78
  74. package/dist/tls/ct.d.ts.map +0 -1
  75. package/dist/tls/ct.js +0 -175
  76. package/dist/tls/ct.js.map +0 -1
  77. package/dist/tls/early-data.d.ts +0 -45
  78. package/dist/tls/early-data.d.ts.map +0 -1
  79. package/dist/tls/early-data.js +0 -46
  80. package/dist/tls/early-data.js.map +0 -1
  81. package/dist/tls/ocsp.d.ts +0 -55
  82. package/dist/tls/ocsp.d.ts.map +0 -1
  83. package/dist/tls/ocsp.js +0 -131
  84. package/dist/tls/ocsp.js.map +0 -1
  85. package/dist/utils/dictionary-transport.d.ts +0 -97
  86. package/dist/utils/dictionary-transport.d.ts.map +0 -1
  87. package/dist/utils/dictionary-transport.js +0 -171
  88. package/dist/utils/dictionary-transport.js.map +0 -1
  89. package/dist/utils/tcp-fast-open.d.ts +0 -30
  90. package/dist/utils/tcp-fast-open.d.ts.map +0 -1
  91. package/dist/utils/tcp-fast-open.js +0 -36
  92. package/dist/utils/tcp-fast-open.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"resumable-upload.d.ts","sourceRoot":"","sources":["../../src/http/resumable-upload.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,MAAM,WAAW,aAAa;IAC5B,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,QAAQ,EAAE,OAAO,CAAC;IAClB,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qDAAqD;AACrD,MAAM,WAAW,qBAAqB;IACpC,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACtD;AAKD;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAO1G;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAQnH;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAIjE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAKzE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAGzE;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAUzF;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQjG"}
@@ -1,104 +0,0 @@
1
- const DEFAULT_CHUNK_SIZE = 5 * 1024 * 1024;
2
- const UPLOAD_CONTENT_TYPE = "application/partial-upload";
3
- /**
4
- * Build headers for initiating a new resumable upload.
5
- *
6
- * @param {number} totalSize - Total upload size in bytes.
7
- * @param {string} [contentType] - MIME type of the upload content.
8
- * @returns {Record<string, string>} Header record for the upload creation request.
9
- */
10
- export function buildUploadCreationHeaders(totalSize, contentType) {
11
- return {
12
- "upload-complete": "?0",
13
- "upload-draft-interop-version": "7",
14
- "content-type": contentType ?? "application/octet-stream",
15
- "content-length": String(totalSize),
16
- };
17
- }
18
- /**
19
- * Build headers for resuming an upload at a given offset.
20
- *
21
- * @param {number} offset - Byte offset to resume from.
22
- * @param {number} chunkSize - Size of the chunk being sent.
23
- * @param {boolean} isLast - Whether this is the final chunk.
24
- * @returns {Record<string, string>} Header record for the resume request.
25
- */
26
- export function buildUploadResumeHeaders(offset, chunkSize, isLast) {
27
- return {
28
- "upload-offset": String(offset),
29
- "upload-complete": isLast ? "?1" : "?0",
30
- "upload-draft-interop-version": "7",
31
- "content-type": UPLOAD_CONTENT_TYPE,
32
- "content-length": String(chunkSize),
33
- };
34
- }
35
- /**
36
- * Build headers for querying the current upload offset.
37
- *
38
- * @returns {Record<string, string>} Header record for the offset query request.
39
- */
40
- export function buildUploadOffsetHeaders() {
41
- return {
42
- "upload-draft-interop-version": "7",
43
- };
44
- }
45
- /**
46
- * Parse the upload offset from response headers.
47
- *
48
- * @param {Record<string, string>} headers - Response headers.
49
- * @returns {number} Byte offset, or -1 if not present or invalid.
50
- */
51
- export function parseUploadOffset(headers) {
52
- const val = headers["upload-offset"];
53
- if (!val)
54
- return -1;
55
- const offset = parseInt(val, 10);
56
- return Number.isFinite(offset) && offset >= 0 ? offset : -1;
57
- }
58
- /**
59
- * Check whether the upload is marked as complete in response headers.
60
- *
61
- * @param {Record<string, string>} headers - Response headers.
62
- * @returns {boolean} `true` if the upload-complete header is "?1".
63
- */
64
- export function isUploadComplete(headers) {
65
- const val = headers["upload-complete"];
66
- return val === "?1";
67
- }
68
- /**
69
- * Split a buffer into offset-chunk pairs for resumable upload.
70
- *
71
- * @param {Buffer} data - Data to split.
72
- * @param {number} [chunkSize] - Maximum chunk size in bytes.
73
- * @returns {Array<[number, Buffer]>} Array of [offset, chunk] tuples.
74
- */
75
- export function splitIntoChunks(data, chunkSize) {
76
- const size = chunkSize ?? DEFAULT_CHUNK_SIZE;
77
- const chunks = [];
78
- let offset = 0;
79
- while (offset < data.length) {
80
- const end = Math.min(offset + size, data.length);
81
- chunks.push([offset, data.subarray(offset, end)]);
82
- offset = end;
83
- }
84
- return chunks;
85
- }
86
- /**
87
- * Extract the upload URL from response headers.
88
- *
89
- * @param {Record<string, string>} headers - Response headers.
90
- * @param {string} requestUrl - Original request URL for resolving relative locations.
91
- * @returns {string | null} Absolute upload URL, or `null` if not present.
92
- */
93
- export function parseUploadUrl(headers, requestUrl) {
94
- const location = headers["location"];
95
- if (!location)
96
- return null;
97
- try {
98
- return new URL(location, requestUrl).href;
99
- }
100
- catch {
101
- return null;
102
- }
103
- }
104
- //# sourceMappingURL=resumable-upload.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resumable-upload.js","sourceRoot":"","sources":["../../src/http/resumable-upload.ts"],"names":[],"mappings":"AAwBA,MAAM,kBAAkB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAC3C,MAAM,mBAAmB,GAAG,4BAA4B,CAAC;AAEzD;;;;;;GAMG;AACH,MAAM,UAAU,0BAA0B,CAAC,SAAiB,EAAE,WAAoB;IAChF,OAAO;QACL,iBAAiB,EAAE,IAAI;QACvB,8BAA8B,EAAE,GAAG;QACnC,cAAc,EAAE,WAAW,IAAI,0BAA0B;QACzD,gBAAgB,EAAE,MAAM,CAAC,SAAS,CAAC;KACpC,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,wBAAwB,CAAC,MAAc,EAAE,SAAiB,EAAE,MAAe;IACzF,OAAO;QACL,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC;QAC/B,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;QACvC,8BAA8B,EAAE,GAAG;QACnC,cAAc,EAAE,mBAAmB;QACnC,gBAAgB,EAAE,MAAM,CAAC,SAAS,CAAC;KACpC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,wBAAwB;IACtC,OAAO;QACL,8BAA8B,EAAE,GAAG;KACpC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAA+B;IAC/D,MAAM,GAAG,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACrC,IAAI,CAAC,GAAG;QAAE,OAAO,CAAC,CAAC,CAAC;IACpB,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACjC,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAA+B;IAC9D,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACvC,OAAO,GAAG,KAAK,IAAI,CAAC;AACtB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,SAAkB;IAC9D,MAAM,IAAI,GAAG,SAAS,IAAI,kBAAkB,CAAC;IAC7C,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,OAAO,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,CAAC;IACf,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,OAA+B,EAAE,UAAkB;IAChF,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACrC,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -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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"}