@j0hanz/superfetch 1.1.9 → 1.2.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 (174) hide show
  1. package/README.md +258 -362
  2. package/dist/config/constants.d.ts +20 -0
  3. package/dist/config/constants.d.ts.map +1 -0
  4. package/dist/config/constants.js +25 -0
  5. package/dist/config/constants.js.map +1 -0
  6. package/dist/config/formatting.d.ts +0 -1
  7. package/dist/config/formatting.d.ts.map +1 -1
  8. package/dist/config/formatting.js +1 -1
  9. package/dist/config/formatting.js.map +1 -1
  10. package/dist/config/index.d.ts +8 -1
  11. package/dist/config/index.d.ts.map +1 -1
  12. package/dist/config/index.js +14 -5
  13. package/dist/config/index.js.map +1 -1
  14. package/dist/config/types/content.d.ts +1 -19
  15. package/dist/config/types/content.d.ts.map +1 -1
  16. package/dist/config/types/runtime.d.ts +7 -4
  17. package/dist/config/types/runtime.d.ts.map +1 -1
  18. package/dist/config/types/tools.d.ts +5 -49
  19. package/dist/config/types/tools.d.ts.map +1 -1
  20. package/dist/http/auth.d.ts.map +1 -1
  21. package/dist/http/auth.js +17 -12
  22. package/dist/http/auth.js.map +1 -1
  23. package/dist/http/cors.js +4 -0
  24. package/dist/http/cors.js.map +1 -1
  25. package/dist/http/download-routes.d.ts +15 -0
  26. package/dist/http/download-routes.d.ts.map +1 -0
  27. package/dist/http/download-routes.js +132 -0
  28. package/dist/http/download-routes.js.map +1 -0
  29. package/dist/http/mcp-routes.d.ts +1 -1
  30. package/dist/http/mcp-routes.d.ts.map +1 -1
  31. package/dist/http/mcp-routes.js +1 -1
  32. package/dist/http/mcp-routes.js.map +1 -1
  33. package/dist/http/mcp-session-helpers.d.ts +14 -0
  34. package/dist/http/mcp-session-helpers.d.ts.map +1 -0
  35. package/dist/http/mcp-session-helpers.js +65 -0
  36. package/dist/http/mcp-session-helpers.js.map +1 -0
  37. package/dist/http/mcp-session.d.ts +0 -1
  38. package/dist/http/mcp-session.d.ts.map +1 -1
  39. package/dist/http/mcp-session.js +7 -70
  40. package/dist/http/mcp-session.js.map +1 -1
  41. package/dist/http/server-middleware.d.ts +10 -0
  42. package/dist/http/server-middleware.d.ts.map +1 -0
  43. package/dist/http/server-middleware.js +56 -0
  44. package/dist/http/server-middleware.js.map +1 -0
  45. package/dist/http/server.d.ts.map +1 -1
  46. package/dist/http/server.js +20 -98
  47. package/dist/http/server.js.map +1 -1
  48. package/dist/http/session-cleanup.d.ts +3 -0
  49. package/dist/http/session-cleanup.d.ts.map +1 -0
  50. package/dist/http/session-cleanup.js +38 -0
  51. package/dist/http/session-cleanup.js.map +1 -0
  52. package/dist/index.js +13 -5
  53. package/dist/index.js.map +1 -1
  54. package/dist/resources/cached-content.d.ts.map +1 -1
  55. package/dist/resources/cached-content.js +76 -11
  56. package/dist/resources/cached-content.js.map +1 -1
  57. package/dist/services/cache.d.ts +6 -2
  58. package/dist/services/cache.d.ts.map +1 -1
  59. package/dist/services/cache.js +86 -25
  60. package/dist/services/cache.js.map +1 -1
  61. package/dist/services/context.d.ts +2 -1
  62. package/dist/services/context.d.ts.map +1 -1
  63. package/dist/services/extractor.d.ts.map +1 -1
  64. package/dist/services/extractor.js +45 -17
  65. package/dist/services/extractor.js.map +1 -1
  66. package/dist/services/fetcher/agents.d.ts.map +1 -1
  67. package/dist/services/fetcher/agents.js +3 -6
  68. package/dist/services/fetcher/agents.js.map +1 -1
  69. package/dist/services/fetcher/headers.d.ts.map +1 -1
  70. package/dist/services/fetcher/headers.js +2 -24
  71. package/dist/services/fetcher/headers.js.map +1 -1
  72. package/dist/services/fetcher/interceptors.d.ts +2 -1
  73. package/dist/services/fetcher/interceptors.d.ts.map +1 -1
  74. package/dist/services/fetcher/interceptors.js +30 -20
  75. package/dist/services/fetcher/interceptors.js.map +1 -1
  76. package/dist/services/fetcher/redirects.d.ts +0 -1
  77. package/dist/services/fetcher/redirects.d.ts.map +1 -1
  78. package/dist/services/fetcher/redirects.js +19 -16
  79. package/dist/services/fetcher/redirects.js.map +1 -1
  80. package/dist/services/fetcher/retry-policy.d.ts +1 -27
  81. package/dist/services/fetcher/retry-policy.d.ts.map +1 -1
  82. package/dist/services/fetcher/retry-policy.js +119 -125
  83. package/dist/services/fetcher/retry-policy.js.map +1 -1
  84. package/dist/services/fetcher.d.ts.map +1 -1
  85. package/dist/services/fetcher.js +15 -9
  86. package/dist/services/fetcher.js.map +1 -1
  87. package/dist/services/parser.d.ts +0 -1
  88. package/dist/services/parser.d.ts.map +1 -1
  89. package/dist/services/parser.js +5 -38
  90. package/dist/services/parser.js.map +1 -1
  91. package/dist/tools/handlers/fetch-links/link-extractor.d.ts.map +1 -1
  92. package/dist/tools/handlers/fetch-links/link-extractor.js +15 -19
  93. package/dist/tools/handlers/fetch-links/link-extractor.js.map +1 -1
  94. package/dist/tools/handlers/fetch-links.tool.d.ts.map +1 -1
  95. package/dist/tools/handlers/fetch-links.tool.js +0 -2
  96. package/dist/tools/handlers/fetch-links.tool.js.map +1 -1
  97. package/dist/tools/handlers/fetch-markdown.tool.d.ts.map +1 -1
  98. package/dist/tools/handlers/fetch-markdown.tool.js +16 -17
  99. package/dist/tools/handlers/fetch-markdown.tool.js.map +1 -1
  100. package/dist/tools/handlers/fetch-single.shared.d.ts +11 -2
  101. package/dist/tools/handlers/fetch-single.shared.d.ts.map +1 -1
  102. package/dist/tools/handlers/fetch-single.shared.js +61 -2
  103. package/dist/tools/handlers/fetch-single.shared.js.map +1 -1
  104. package/dist/tools/handlers/fetch-url.tool.d.ts.map +1 -1
  105. package/dist/tools/handlers/fetch-url.tool.js +3 -14
  106. package/dist/tools/handlers/fetch-url.tool.js.map +1 -1
  107. package/dist/tools/handlers/fetch-urls/validation.d.ts +0 -1
  108. package/dist/tools/handlers/fetch-urls/validation.d.ts.map +1 -1
  109. package/dist/tools/handlers/fetch-urls/validation.js +1 -1
  110. package/dist/tools/handlers/fetch-urls/validation.js.map +1 -1
  111. package/dist/tools/index.d.ts.map +1 -1
  112. package/dist/tools/index.js +1 -19
  113. package/dist/tools/index.js.map +1 -1
  114. package/dist/tools/schemas.d.ts +44 -236
  115. package/dist/tools/schemas.d.ts.map +1 -1
  116. package/dist/tools/schemas.js +38 -197
  117. package/dist/tools/schemas.js.map +1 -1
  118. package/dist/tools/utils/cache-vary.d.ts +0 -1
  119. package/dist/tools/utils/cache-vary.d.ts.map +1 -1
  120. package/dist/tools/utils/cache-vary.js +11 -25
  121. package/dist/tools/utils/cache-vary.js.map +1 -1
  122. package/dist/tools/utils/common.d.ts +1 -2
  123. package/dist/tools/utils/common.d.ts.map +1 -1
  124. package/dist/tools/utils/common.js.map +1 -1
  125. package/dist/tools/utils/content-transform.d.ts.map +1 -1
  126. package/dist/tools/utils/content-transform.js +28 -13
  127. package/dist/tools/utils/content-transform.js.map +1 -1
  128. package/dist/tools/utils/fetch-pipeline.js +14 -3
  129. package/dist/tools/utils/fetch-pipeline.js.map +1 -1
  130. package/dist/tools/utils/inline-content.d.ts +3 -2
  131. package/dist/tools/utils/inline-content.d.ts.map +1 -1
  132. package/dist/transformers/markdown.transformer.d.ts.map +1 -1
  133. package/dist/transformers/markdown.transformer.js +3 -6
  134. package/dist/transformers/markdown.transformer.js.map +1 -1
  135. package/dist/utils/code-language.d.ts +3 -0
  136. package/dist/utils/code-language.d.ts.map +1 -0
  137. package/dist/utils/code-language.js +57 -0
  138. package/dist/utils/code-language.js.map +1 -0
  139. package/dist/utils/content-cleaner.d.ts +0 -1
  140. package/dist/utils/content-cleaner.d.ts.map +1 -1
  141. package/dist/utils/content-cleaner.js +0 -3
  142. package/dist/utils/content-cleaner.js.map +1 -1
  143. package/dist/utils/crypto.d.ts +3 -0
  144. package/dist/utils/crypto.d.ts.map +1 -0
  145. package/dist/utils/crypto.js +33 -0
  146. package/dist/utils/crypto.js.map +1 -0
  147. package/dist/utils/download-url.d.ts +9 -0
  148. package/dist/utils/download-url.d.ts.map +1 -0
  149. package/dist/utils/download-url.js +28 -0
  150. package/dist/utils/download-url.js.map +1 -0
  151. package/dist/utils/error-utils.d.ts +4 -0
  152. package/dist/utils/error-utils.d.ts.map +1 -0
  153. package/dist/utils/error-utils.js +14 -0
  154. package/dist/utils/error-utils.js.map +1 -0
  155. package/dist/utils/filename-generator.d.ts +2 -0
  156. package/dist/utils/filename-generator.d.ts.map +1 -0
  157. package/dist/utils/filename-generator.js +60 -0
  158. package/dist/utils/filename-generator.js.map +1 -0
  159. package/dist/utils/header-normalizer.d.ts +7 -3
  160. package/dist/utils/header-normalizer.d.ts.map +1 -1
  161. package/dist/utils/header-normalizer.js +23 -16
  162. package/dist/utils/header-normalizer.js.map +1 -1
  163. package/dist/utils/tool-error-handler.d.ts +0 -1
  164. package/dist/utils/tool-error-handler.d.ts.map +1 -1
  165. package/dist/utils/tool-error-handler.js +11 -5
  166. package/dist/utils/tool-error-handler.js.map +1 -1
  167. package/dist/utils/url-sanitizer.d.ts +2 -0
  168. package/dist/utils/url-sanitizer.d.ts.map +1 -0
  169. package/dist/utils/url-sanitizer.js +12 -0
  170. package/dist/utils/url-sanitizer.js.map +1 -0
  171. package/dist/utils/url-validator.d.ts.map +1 -1
  172. package/dist/utils/url-validator.js +46 -44
  173. package/dist/utils/url-validator.js.map +1 -1
  174. package/package.json +4 -6
@@ -1 +1 @@
1
- {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../../src/services/fetcher/agents.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAkM/B,eAAO,MAAM,UAAU,OAA+B,CAAC;AAEvD,wBAAgB,aAAa,IAAI,IAAI,CAEpC"}
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../../src/services/fetcher/agents.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAiM/B,eAAO,MAAM,UAAU,OAA+B,CAAC;AAEvD,wBAAgB,aAAa,IAAI,IAAI,CAEpC"}
@@ -1,6 +1,7 @@
1
1
  import dns from 'node:dns';
2
2
  import os from 'node:os';
3
3
  import { Agent } from 'undici';
4
+ import { createErrorWithCode } from '../../utils/error-utils.js';
4
5
  import { isBlockedIp } from '../../utils/url-validator.js';
5
6
  function resolveDns(hostname, options, callback) {
6
7
  const { normalizedOptions, useAll, resolvedFamily } = buildLookupContext(options);
@@ -84,16 +85,12 @@ function findBlockedIpError(list, hostname) {
84
85
  if (!isBlockedIp(ip)) {
85
86
  continue;
86
87
  }
87
- const error = new Error(`Blocked IP detected for ${hostname}`);
88
- error.code = 'EBLOCKED';
89
- return error;
88
+ return createErrorWithCode(`Blocked IP detected for ${hostname}`, 'EBLOCKED');
90
89
  }
91
90
  return null;
92
91
  }
93
92
  function createNoDnsResultsError(hostname) {
94
- const error = new Error(`No DNS results returned for ${hostname}`);
95
- error.code = 'ENODATA';
96
- return error;
93
+ return createErrorWithCode(`No DNS results returned for ${hostname}`, 'ENODATA');
97
94
  }
98
95
  function getAgentOptions() {
99
96
  const cpuCount = os.availableParallelism();
@@ -1 +1 @@
1
- {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../../src/services/fetcher/agents.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../../src/services/fetcher/agents.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"headers.d.ts","sourceRoot":"","sources":["../../../src/services/fetcher/headers.ts"],"names":[],"mappings":"AAEA,wBAAgB,eAAe,CAC7B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAQpC"}
1
+ {"version":3,"file":"headers.d.ts","sourceRoot":"","sources":["../../../src/services/fetcher/headers.ts"],"names":[],"mappings":"AAIA,wBAAgB,eAAe,CAC7B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAEpC"}
@@ -1,28 +1,6 @@
1
1
  import { config } from '../../config/index.js';
2
+ import { normalizeHeaderRecord } from '../../utils/header-normalizer.js';
2
3
  export function sanitizeHeaders(headers) {
3
- if (!headers || Object.keys(headers).length === 0)
4
- return undefined;
5
- const normalized = normalizeHeaders(headers, config.security.blockedHeaders);
6
- const iterator = normalized.keys();
7
- if (iterator.next().done)
8
- return undefined;
9
- return Object.fromEntries(normalized.entries());
10
- }
11
- function normalizeHeaders(headers, blockedHeaders) {
12
- const normalized = new Headers();
13
- for (const [key, value] of Object.entries(headers)) {
14
- if (blockedHeaders.has(key.toLowerCase()))
15
- continue;
16
- setHeaderSafe(normalized, key, value);
17
- }
18
- return normalized;
19
- }
20
- function setHeaderSafe(headers, key, value) {
21
- try {
22
- headers.set(key, value);
23
- }
24
- catch {
25
- // Ignore invalid header values
26
- }
4
+ return normalizeHeaderRecord(headers, config.security.blockedHeaders);
27
5
  }
28
6
  //# sourceMappingURL=headers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"headers.js","sourceRoot":"","sources":["../../../src/services/fetcher/headers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,MAAM,UAAU,eAAe,CAC7B,OAAgC;IAEhC,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAEpE,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IAC7E,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAE3C,OAAO,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,gBAAgB,CACvB,OAA+B,EAC/B,cAA2B;IAE3B,MAAM,UAAU,GAAG,IAAI,OAAO,EAAE,CAAC;IACjC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,IAAI,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;YAAE,SAAS;QACpD,aAAa,CAAC,UAAU,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,aAAa,CAAC,OAAgB,EAAE,GAAW,EAAE,KAAa;IACjE,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,+BAA+B;IACjC,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"headers.js","sourceRoot":"","sources":["../../../src/services/fetcher/headers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAEzE,MAAM,UAAU,eAAe,CAC7B,OAAgC;IAEhC,OAAO,qBAAqB,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;AACxE,CAAC"}
@@ -1,4 +1,4 @@
1
- export interface FetchTelemetryContext {
1
+ interface FetchTelemetryContext {
2
2
  requestId: string;
3
3
  startTime: number;
4
4
  url: string;
@@ -7,4 +7,5 @@ export interface FetchTelemetryContext {
7
7
  export declare function startFetchTelemetry(url: string, method: string): FetchTelemetryContext;
8
8
  export declare function recordFetchResponse(context: FetchTelemetryContext, response: Response, contentSize?: number): void;
9
9
  export declare function recordFetchError(context: FetchTelemetryContext, error: unknown, status?: number): void;
10
+ export {};
10
11
  //# sourceMappingURL=interceptors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"interceptors.d.ts","sourceRoot":"","sources":["../../../src/services/fetcher/interceptors.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,GACb,qBAAqB,CAwBvB;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,qBAAqB,EAC9B,QAAQ,EAAE,QAAQ,EAClB,WAAW,CAAC,EAAE,MAAM,GACnB,IAAI,CA+BN;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,qBAAqB,EAC9B,KAAK,EAAE,OAAO,EACd,MAAM,CAAC,EAAE,MAAM,GACd,IAAI,CA4BN"}
1
+ {"version":3,"file":"interceptors.d.ts","sourceRoot":"","sources":["../../../src/services/fetcher/interceptors.ts"],"names":[],"mappings":"AAUA,UAAU,qBAAqB;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,GACb,qBAAqB,CAwBvB;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,qBAAqB,EAC9B,QAAQ,EAAE,QAAQ,EAClB,WAAW,CAAC,EAAE,MAAM,GACnB,IAAI,CAYN;AA4CD,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,qBAAqB,EAC9B,KAAK,EAAE,OAAO,EACd,MAAM,CAAC,EAAE,MAAM,GACd,IAAI,CAyBN"}
@@ -1,6 +1,7 @@
1
1
  import { randomUUID } from 'node:crypto';
2
2
  import diagnosticsChannel from 'node:diagnostics_channel';
3
3
  import { performance } from 'node:perf_hooks';
4
+ import { isSystemError } from '../../utils/error-utils.js';
4
5
  import { logDebug, logError, logWarn } from '../logger.js';
5
6
  const fetchChannel = diagnosticsChannel.channel('superfetch.fetch');
6
7
  export function startFetchTelemetry(url, method) {
@@ -27,38 +28,47 @@ export function startFetchTelemetry(url, method) {
27
28
  }
28
29
  export function recordFetchResponse(context, response, contentSize) {
29
30
  const duration = performance.now() - context.startTime;
30
- const contentType = response.headers.get('content-type') ?? undefined;
31
- const contentLength = response.headers.get('content-length') ?? contentSize?.toString();
32
- if (fetchChannel.hasSubscribers) {
33
- fetchChannel.publish({
34
- type: 'end',
35
- requestId: context.requestId,
36
- status: response.status,
37
- duration,
38
- });
39
- }
31
+ publishFetchEnd(context, response.status, duration);
40
32
  logDebug('HTTP Response', {
41
33
  requestId: context.requestId,
42
34
  status: response.status,
43
35
  url: context.url,
36
+ ...buildResponseMeta(response, contentSize, duration),
37
+ });
38
+ logSlowRequestIfNeeded(context, duration);
39
+ }
40
+ function publishFetchEnd(context, status, duration) {
41
+ if (!fetchChannel.hasSubscribers)
42
+ return;
43
+ fetchChannel.publish({
44
+ type: 'end',
45
+ requestId: context.requestId,
46
+ status,
47
+ duration,
48
+ });
49
+ }
50
+ function buildResponseMeta(response, contentSize, duration) {
51
+ const contentType = response.headers.get('content-type') ?? undefined;
52
+ const contentLength = response.headers.get('content-length') ?? contentSize?.toString();
53
+ return {
44
54
  contentType,
45
55
  duration: `${Math.round(duration)}ms`,
46
56
  size: contentLength,
57
+ };
58
+ }
59
+ function logSlowRequestIfNeeded(context, duration) {
60
+ if (duration <= 5000)
61
+ return;
62
+ logWarn('Slow HTTP request detected', {
63
+ requestId: context.requestId,
64
+ url: context.url,
65
+ duration: `${Math.round(duration)}ms`,
47
66
  });
48
- if (duration > 5000) {
49
- logWarn('Slow HTTP request detected', {
50
- requestId: context.requestId,
51
- url: context.url,
52
- duration: `${Math.round(duration)}ms`,
53
- });
54
- }
55
67
  }
56
68
  export function recordFetchError(context, error, status) {
57
69
  const duration = performance.now() - context.startTime;
58
70
  const err = error instanceof Error ? error : new Error(String(error));
59
- const code = typeof err.code === 'string'
60
- ? err.code
61
- : undefined;
71
+ const code = isSystemError(err) ? err.code : undefined;
62
72
  if (fetchChannel.hasSubscribers) {
63
73
  fetchChannel.publish({
64
74
  type: 'error',
@@ -1 +1 @@
1
- {"version":3,"file":"interceptors.js","sourceRoot":"","sources":["../../../src/services/fetcher/interceptors.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"interceptors.js","sourceRoot":"","sources":["../../../src/services/fetcher/interceptors.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,3 @@
1
- export declare function resolveRedirectTarget(baseUrl: string, location: string): string;
2
1
  export declare function fetchWithRedirects(url: string, init: RequestInit, maxRedirects: number): Promise<{
3
2
  response: Response;
4
3
  url: string;
@@ -1 +1 @@
1
- {"version":3,"file":"redirects.d.ts","sourceRoot":"","sources":["../../../src/services/fetcher/redirects.ts"],"names":[],"mappings":"AAqDA,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,MAAM,CAiBR;AAED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,EACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAwB9C"}
1
+ {"version":3,"file":"redirects.d.ts","sourceRoot":"","sources":["../../../src/services/fetcher/redirects.ts"],"names":[],"mappings":"AA8EA,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,EACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAwB9C"}
@@ -1,4 +1,5 @@
1
1
  import { FetchError } from '../../errors/app-error.js';
2
+ import { createErrorWithCode } from '../../utils/error-utils.js';
2
3
  import { validateAndNormalizeUrl } from '../../utils/url-validator.js';
3
4
  const REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);
4
5
  function isRedirectStatus(status) {
@@ -9,37 +10,39 @@ async function performFetchCycle(currentUrl, init, redirectLimit, redirectCount)
9
10
  if (!isRedirectStatus(response.status)) {
10
11
  return { response };
11
12
  }
12
- if (redirectCount >= redirectLimit) {
13
- void response.body?.cancel();
14
- throw new FetchError('Too many redirects', currentUrl);
15
- }
16
- const location = response.headers.get('location');
17
- if (!location) {
18
- void response.body?.cancel();
19
- throw new FetchError('Redirect response missing Location header', currentUrl);
20
- }
13
+ assertRedirectWithinLimit(response, currentUrl, redirectLimit, redirectCount);
14
+ const location = getRedirectLocation(response, currentUrl);
21
15
  void response.body?.cancel();
22
16
  return {
23
17
  response,
24
18
  nextUrl: resolveRedirectTarget(currentUrl, location),
25
19
  };
26
20
  }
21
+ function assertRedirectWithinLimit(response, currentUrl, redirectLimit, redirectCount) {
22
+ if (redirectCount < redirectLimit)
23
+ return;
24
+ void response.body?.cancel();
25
+ throw new FetchError('Too many redirects', currentUrl);
26
+ }
27
+ function getRedirectLocation(response, currentUrl) {
28
+ const location = response.headers.get('location');
29
+ if (location)
30
+ return location;
31
+ void response.body?.cancel();
32
+ throw new FetchError('Redirect response missing Location header', currentUrl);
33
+ }
27
34
  function annotateRedirectError(error, url) {
28
35
  if (!error || typeof error !== 'object')
29
36
  return;
30
37
  error.requestUrl = url;
31
38
  }
32
- export function resolveRedirectTarget(baseUrl, location) {
39
+ function resolveRedirectTarget(baseUrl, location) {
33
40
  if (!URL.canParse(location, baseUrl)) {
34
- const error = new Error('Invalid redirect target');
35
- error.code = 'EBADREDIRECT';
36
- throw error;
41
+ throw createErrorWithCode('Invalid redirect target', 'EBADREDIRECT');
37
42
  }
38
43
  const resolved = new URL(location, baseUrl);
39
44
  if (resolved.username || resolved.password) {
40
- const error = new Error('Redirect target includes credentials');
41
- error.code = 'EBADREDIRECT';
42
- throw error;
45
+ throw createErrorWithCode('Redirect target includes credentials', 'EBADREDIRECT');
43
46
  }
44
47
  return validateAndNormalizeUrl(resolved.href);
45
48
  }
@@ -1 +1 @@
1
- {"version":3,"file":"redirects.js","sourceRoot":"","sources":["../../../src/services/fetcher/redirects.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"redirects.js","sourceRoot":"","sources":["../../../src/services/fetcher/redirects.ts"],"names":[],"mappings":"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"}
@@ -1,28 +1,2 @@
1
- export declare class RetryPolicy {
2
- private readonly maxRetries;
3
- private readonly url;
4
- private static readonly BASE_DELAY_MS;
5
- private static readonly MAX_DELAY_MS;
6
- private static readonly JITTER_FACTOR;
7
- constructor(maxRetries: number, url: string);
8
- execute<T>(operation: () => Promise<T>, signal?: AbortSignal): Promise<T>;
9
- private runAttempt;
10
- private throwIfNotRetryable;
11
- private shouldRetry;
12
- private wait;
13
- private calculateDelay;
14
- private normalizeRetries;
15
- private throwIfAborted;
16
- private normalizeError;
17
- private buildFinalError;
18
- private isAbortError;
19
- private isRateLimited;
20
- private isClientError;
21
- private logRetryDelay;
22
- private isRateLimitLog;
23
- private sleep;
24
- private handleSleepError;
25
- private isAbortTimeout;
26
- private getRateLimitDelay;
27
- }
1
+ export declare function executeWithRetry<T>(url: string, maxRetries: number, operation: () => Promise<T>, signal?: AbortSignal): Promise<T>;
28
2
  //# sourceMappingURL=retry-policy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"retry-policy.d.ts","sourceRoot":"","sources":["../../../src/services/fetcher/retry-policy.ts"],"names":[],"mappings":"AAMA,qBAAa,WAAW;IAMpB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,GAAG;IANtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAQ;IAC7C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAS;IAC7C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAQ;gBAG1B,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,MAAM;IAGxB,OAAO,CAAC,CAAC,EACb,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,CAAC,CAAC;YAaC,UAAU;IAmBxB,OAAO,CAAC,mBAAmB;IAU3B,OAAO,CAAC,WAAW;YAYL,IAAI;IAWlB,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,aAAa;IAiBrB,OAAO,CAAC,cAAc;YAIR,KAAK;IAQnB,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,iBAAiB;CAO1B"}
1
+ {"version":3,"file":"retry-policy.d.ts","sourceRoot":"","sources":["../../../src/services/fetcher/retry-policy.ts"],"names":[],"mappings":"AAUA,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,CAAC,CAAC,CAWZ"}
@@ -1,138 +1,132 @@
1
1
  import { setTimeout } from 'node:timers/promises';
2
2
  import { FetchError } from '../../errors/app-error.js';
3
3
  import { logDebug, logWarn } from '../logger.js';
4
- export class RetryPolicy {
5
- maxRetries;
6
- url;
7
- static BASE_DELAY_MS = 1000;
8
- static MAX_DELAY_MS = 10000;
9
- static JITTER_FACTOR = 0.25;
10
- constructor(maxRetries, url) {
11
- this.maxRetries = maxRetries;
12
- this.url = url;
13
- }
14
- async execute(operation, signal) {
15
- let lastError = new Error(`Failed to fetch ${this.url}`);
16
- const retries = this.normalizeRetries();
17
- for (let attempt = 1; attempt <= retries; attempt++) {
18
- const result = await this.runAttempt(operation, attempt, retries, signal);
19
- if (result.done)
20
- return result.value;
21
- lastError = result.error;
22
- }
23
- throw this.buildFinalError(retries, lastError);
24
- }
25
- async runAttempt(operation, attempt, retries, signal) {
26
- this.throwIfAborted(signal);
27
- try {
28
- const value = await operation();
29
- return { done: true, value };
30
- }
31
- catch (error) {
32
- const normalizedError = this.normalizeError(error);
33
- this.throwIfNotRetryable(attempt, retries, normalizedError);
34
- await this.wait(attempt, normalizedError, signal);
35
- return { done: false, error: normalizedError };
36
- }
37
- }
38
- throwIfNotRetryable(attempt, retries, error) {
39
- if (!this.shouldRetry(attempt, retries, error)) {
40
- throw error;
41
- }
42
- }
43
- shouldRetry(attempt, maxRetries, error) {
44
- if (attempt >= maxRetries)
45
- return false;
46
- if (!(error instanceof FetchError))
47
- return true;
48
- if (this.isAbortError(error))
49
- return false;
50
- if (this.isRateLimited(error))
51
- return true;
52
- return !this.isClientError(error);
53
- }
54
- async wait(attempt, error, signal) {
55
- const delay = this.calculateDelay(attempt, error);
56
- this.logRetryDelay(attempt, delay, error);
57
- await this.sleep(delay, signal);
58
- }
59
- calculateDelay(attempt, error) {
60
- const rateLimitDelay = this.getRateLimitDelay(error);
61
- if (rateLimitDelay !== null)
62
- return rateLimitDelay;
63
- const exponentialDelay = Math.min(RetryPolicy.BASE_DELAY_MS * Math.pow(2, attempt - 1), RetryPolicy.MAX_DELAY_MS);
64
- const jitter = exponentialDelay * RetryPolicy.JITTER_FACTOR * (Math.random() * 2 - 1);
65
- return Math.round(exponentialDelay + jitter);
66
- }
67
- normalizeRetries() {
68
- return Math.min(Math.max(1, this.maxRetries), 10);
69
- }
70
- throwIfAborted(signal) {
71
- if (!signal?.aborted)
72
- return;
73
- throw new FetchError('Request was aborted before execution', this.url);
74
- }
75
- normalizeError(error) {
76
- return error instanceof Error ? error : new Error(String(error));
77
- }
78
- buildFinalError(retries, error) {
79
- return new FetchError(`Failed after ${retries} attempts: ${error.message}`, this.url);
80
- }
81
- isAbortError(error) {
82
- return error.details.reason === 'aborted';
83
- }
84
- isRateLimited(error) {
85
- return error.details.httpStatus === 429;
4
+ const BASE_DELAY_MS = 1000;
5
+ const MAX_DELAY_MS = 10000;
6
+ const JITTER_FACTOR = 0.25;
7
+ export async function executeWithRetry(url, maxRetries, operation, signal) {
8
+ let lastError = new Error(`Failed to fetch ${url}`);
9
+ const retries = normalizeRetries(maxRetries);
10
+ for (let attempt = 1; attempt <= retries; attempt++) {
11
+ const result = await runAttempt(url, operation, attempt, retries, signal);
12
+ if (result.done)
13
+ return result.value;
14
+ lastError = result.error;
15
+ }
16
+ throw buildFinalError(url, retries, lastError);
17
+ }
18
+ async function runAttempt(url, operation, attempt, retries, signal) {
19
+ throwIfAborted(url, signal);
20
+ try {
21
+ const value = await operation();
22
+ return { done: true, value };
23
+ }
24
+ catch (error) {
25
+ const normalizedError = normalizeError(error);
26
+ throwIfNotRetryable(attempt, retries, normalizedError);
27
+ await wait(url, attempt, normalizedError, signal);
28
+ return { done: false, error: normalizedError };
86
29
  }
87
- isClientError(error) {
88
- const status = error.details.httpStatus;
89
- return Boolean(status && status >= 400 && status < 500);
30
+ }
31
+ function throwIfNotRetryable(attempt, retries, error) {
32
+ if (!shouldRetry(attempt, retries, error)) {
33
+ throw error;
90
34
  }
91
- logRetryDelay(attempt, delay, error) {
92
- if (this.isRateLimitLog(error)) {
93
- logWarn('Rate limited, waiting before retry', {
94
- url: this.url,
95
- attempt,
96
- waitTime: `${delay}ms`,
97
- });
98
- return;
99
- }
100
- logDebug('Retrying request', {
101
- url: this.url,
35
+ }
36
+ function shouldRetry(attempt, maxRetries, error) {
37
+ if (attempt >= maxRetries)
38
+ return false;
39
+ if (!(error instanceof FetchError))
40
+ return true;
41
+ if (isAbortError(error))
42
+ return false;
43
+ if (isRateLimited(error))
44
+ return true;
45
+ return !isClientError(error);
46
+ }
47
+ async function wait(url, attempt, error, signal) {
48
+ const delay = calculateDelay(attempt, error);
49
+ logRetryDelay(url, attempt, delay, error);
50
+ await sleep(url, delay, signal);
51
+ }
52
+ function calculateDelay(attempt, error) {
53
+ const rateLimitDelay = getRateLimitDelay(error);
54
+ if (rateLimitDelay !== null)
55
+ return rateLimitDelay;
56
+ const exponentialDelay = Math.min(BASE_DELAY_MS * Math.pow(2, attempt - 1), MAX_DELAY_MS);
57
+ const jitter = exponentialDelay * JITTER_FACTOR * (Math.random() * 2 - 1);
58
+ return Math.round(exponentialDelay + jitter);
59
+ }
60
+ function normalizeRetries(maxRetries) {
61
+ return Math.min(Math.max(1, maxRetries), 10);
62
+ }
63
+ function throwIfAborted(url, signal) {
64
+ if (!signal?.aborted)
65
+ return;
66
+ throw new FetchError('Request was aborted before execution', url);
67
+ }
68
+ function normalizeError(error) {
69
+ return error instanceof Error ? error : new Error(String(error));
70
+ }
71
+ function buildFinalError(url, retries, error) {
72
+ return new FetchError(`Failed after ${retries} attempts: ${error.message}`, url);
73
+ }
74
+ function isAbortError(error) {
75
+ return error.details.reason === 'aborted';
76
+ }
77
+ function isRateLimited(error) {
78
+ return error.details.httpStatus === 429;
79
+ }
80
+ function isClientError(error) {
81
+ const status = error.details.httpStatus;
82
+ return typeof status === 'number' && status >= 400 && status < 500;
83
+ }
84
+ function logRetryDelay(url, attempt, delay, error) {
85
+ if (isRateLimitLog(error)) {
86
+ logWarn('Rate limited, waiting before retry', {
87
+ url,
102
88
  attempt,
103
- delay: `${delay}ms`,
89
+ waitTime: `${delay}ms`,
104
90
  });
91
+ return;
105
92
  }
106
- isRateLimitLog(error) {
107
- return error instanceof FetchError && error.details.httpStatus === 429;
108
- }
109
- async sleep(delay, signal) {
110
- try {
111
- await setTimeout(delay, undefined, { signal });
112
- }
113
- catch (timeoutError) {
114
- this.handleSleepError(timeoutError);
115
- }
116
- }
117
- handleSleepError(error) {
118
- if (this.isAbortTimeout(error)) {
119
- throw new FetchError('Request was aborted during retry wait', this.url, 499, {
120
- reason: 'aborted',
121
- });
122
- }
123
- throw error;
93
+ logDebug('Retrying request', {
94
+ url,
95
+ attempt,
96
+ delay: `${delay}ms`,
97
+ });
98
+ }
99
+ function isRateLimitLog(error) {
100
+ return error instanceof FetchError && error.details.httpStatus === 429;
101
+ }
102
+ async function sleep(url, delay, signal) {
103
+ try {
104
+ await setTimeout(delay, undefined, { signal });
124
105
  }
125
- isAbortTimeout(error) {
126
- return (error instanceof Error &&
127
- (error.name === 'AbortError' || error.name === 'TimeoutError'));
106
+ catch (timeoutError) {
107
+ handleSleepError(url, timeoutError);
128
108
  }
129
- getRateLimitDelay(error) {
130
- if (!(error instanceof FetchError))
131
- return null;
132
- if (error.details.httpStatus !== 429)
133
- return null;
134
- const retryAfter = error.details.retryAfter || 60;
135
- return Math.min(retryAfter * 1000, 30000);
109
+ }
110
+ function handleSleepError(url, error) {
111
+ if (isAbortTimeout(error)) {
112
+ throw new FetchError('Request was aborted during retry wait', url, 499, {
113
+ reason: 'aborted',
114
+ });
136
115
  }
116
+ throw error;
117
+ }
118
+ function isAbortTimeout(error) {
119
+ return (error instanceof Error &&
120
+ (error.name === 'AbortError' || error.name === 'TimeoutError'));
121
+ }
122
+ function getRateLimitDelay(error) {
123
+ if (!(error instanceof FetchError))
124
+ return null;
125
+ if (error.details.httpStatus !== 429)
126
+ return null;
127
+ const retryAfter = typeof error.details.retryAfter === 'number'
128
+ ? error.details.retryAfter
129
+ : 60;
130
+ return Math.min(retryAfter * 1000, 30000);
137
131
  }
138
132
  //# sourceMappingURL=retry-policy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"retry-policy.js","sourceRoot":"","sources":["../../../src/services/fetcher/retry-policy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"retry-policy.js","sourceRoot":"","sources":["../../../src/services/fetcher/retry-policy.ts"],"names":[],"mappings":"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"}