@j0hanz/superfetch 1.1.2 → 1.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -30
- package/dist/config/formatting.d.ts +9 -0
- package/dist/config/formatting.d.ts.map +1 -0
- package/dist/config/formatting.js +11 -0
- package/dist/config/formatting.js.map +1 -0
- package/dist/config/index.d.ts +11 -2
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +35 -13
- package/dist/config/index.js.map +1 -1
- package/dist/config/types/content.d.ts +107 -0
- package/dist/config/types/content.d.ts.map +1 -0
- package/dist/config/types/content.js +2 -0
- package/dist/config/types/content.js.map +1 -0
- package/dist/config/types/runtime.d.ts +78 -0
- package/dist/config/types/runtime.d.ts.map +1 -0
- package/dist/config/types/runtime.js +2 -0
- package/dist/config/types/runtime.js.map +1 -0
- package/dist/config/types/tools.d.ts +99 -0
- package/dist/config/types/tools.d.ts.map +1 -0
- package/dist/config/types/tools.js +2 -0
- package/dist/config/types/tools.js.map +1 -0
- package/dist/config/types.d.ts +3 -297
- package/dist/config/types.d.ts.map +1 -1
- package/dist/http/auth.d.ts +3 -0
- package/dist/http/auth.d.ts.map +1 -0
- package/dist/http/auth.js +34 -0
- package/dist/http/auth.js.map +1 -0
- package/dist/http/cors.d.ts +8 -0
- package/dist/http/cors.d.ts.map +1 -0
- package/dist/http/cors.js +47 -0
- package/dist/http/cors.js.map +1 -0
- package/dist/http/mcp-routes.d.ts +5 -0
- package/dist/http/mcp-routes.d.ts.map +1 -0
- package/dist/http/mcp-routes.js +110 -0
- package/dist/http/mcp-routes.js.map +1 -0
- package/dist/http/mcp-session.d.ts +12 -0
- package/dist/http/mcp-session.d.ts.map +1 -0
- package/dist/http/mcp-session.js +209 -0
- package/dist/http/mcp-session.js.map +1 -0
- package/dist/http/mcp-validation.d.ts +3 -0
- package/dist/http/mcp-validation.d.ts.map +1 -0
- package/dist/http/mcp-validation.js +34 -0
- package/dist/http/mcp-validation.js.map +1 -0
- package/dist/http/rate-limit.d.ts +13 -0
- package/dist/http/rate-limit.d.ts.map +1 -0
- package/dist/http/rate-limit.js +91 -0
- package/dist/http/rate-limit.js.map +1 -0
- package/dist/http/server.d.ts +4 -0
- package/dist/http/server.d.ts.map +1 -0
- package/dist/http/server.js +183 -0
- package/dist/http/server.js.map +1 -0
- package/dist/http/sessions.d.ts +15 -0
- package/dist/http/sessions.d.ts.map +1 -0
- package/dist/http/sessions.js +64 -0
- package/dist/http/sessions.js.map +1 -0
- package/dist/index.js +26 -341
- package/dist/index.js.map +1 -1
- package/dist/middleware/error-handler.d.ts +2 -2
- package/dist/middleware/error-handler.d.ts.map +1 -1
- package/dist/middleware/error-handler.js +46 -15
- package/dist/middleware/error-handler.js.map +1 -1
- package/dist/resources/cached-content.d.ts.map +1 -1
- package/dist/resources/cached-content.js +104 -44
- package/dist/resources/cached-content.js.map +1 -1
- package/dist/resources/index.d.ts.map +1 -1
- package/dist/resources/index.js +77 -69
- package/dist/resources/index.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +9 -3
- package/dist/server.js.map +1 -1
- package/dist/services/cache.d.ts +13 -1
- package/dist/services/cache.d.ts.map +1 -1
- package/dist/services/cache.js +89 -16
- package/dist/services/cache.js.map +1 -1
- package/dist/services/context.d.ts +1 -1
- package/dist/services/context.d.ts.map +1 -1
- package/dist/services/context.js +1 -1
- package/dist/services/context.js.map +1 -1
- package/dist/services/extractor.d.ts.map +1 -1
- package/dist/services/extractor.js +122 -87
- package/dist/services/extractor.js.map +1 -1
- package/dist/services/fetcher/agents.d.ts +4 -0
- package/dist/services/fetcher/agents.d.ts.map +1 -0
- package/dist/services/fetcher/agents.js +111 -0
- package/dist/services/fetcher/agents.js.map +1 -0
- package/dist/services/fetcher/errors.d.ts +5 -0
- package/dist/services/fetcher/errors.d.ts.map +1 -0
- package/dist/services/fetcher/errors.js +71 -0
- package/dist/services/fetcher/errors.js.map +1 -0
- package/dist/services/fetcher/headers.d.ts +2 -0
- package/dist/services/fetcher/headers.d.ts.map +1 -0
- package/dist/services/fetcher/headers.js +28 -0
- package/dist/services/fetcher/headers.js.map +1 -0
- package/dist/services/fetcher/interceptors.d.ts +10 -0
- package/dist/services/fetcher/interceptors.d.ts.map +1 -0
- package/dist/services/fetcher/interceptors.js +82 -0
- package/dist/services/fetcher/interceptors.js.map +1 -0
- package/dist/services/fetcher/redirects.d.ts +6 -0
- package/dist/services/fetcher/redirects.d.ts.map +1 -0
- package/dist/services/fetcher/redirects.js +67 -0
- package/dist/services/fetcher/redirects.js.map +1 -0
- package/dist/services/fetcher/response.d.ts +5 -0
- package/dist/services/fetcher/response.d.ts.map +1 -0
- package/dist/services/fetcher/response.js +39 -0
- package/dist/services/fetcher/response.js.map +1 -0
- package/dist/services/fetcher/retry-policy.d.ts +28 -0
- package/dist/services/fetcher/retry-policy.d.ts.map +1 -0
- package/dist/services/fetcher/retry-policy.js +138 -0
- package/dist/services/fetcher/retry-policy.js.map +1 -0
- package/dist/services/fetcher.d.ts +2 -1
- package/dist/services/fetcher.d.ts.map +1 -1
- package/dist/services/fetcher.js +62 -315
- package/dist/services/fetcher.js.map +1 -1
- package/dist/services/logger.js +4 -4
- package/dist/services/logger.js.map +1 -1
- package/dist/services/parser.d.ts +1 -0
- package/dist/services/parser.d.ts.map +1 -1
- package/dist/services/parser.js +55 -35
- package/dist/services/parser.js.map +1 -1
- package/dist/tools/handlers/fetch-links/link-extractor.d.ts +4 -0
- package/dist/tools/handlers/fetch-links/link-extractor.d.ts.map +1 -0
- package/dist/tools/handlers/fetch-links/link-extractor.js +163 -0
- package/dist/tools/handlers/fetch-links/link-extractor.js.map +1 -0
- package/dist/tools/handlers/fetch-links.tool.d.ts.map +1 -1
- package/dist/tools/handlers/fetch-links.tool.js +78 -116
- package/dist/tools/handlers/fetch-links.tool.js.map +1 -1
- package/dist/tools/handlers/fetch-markdown.tool.d.ts +3 -13
- package/dist/tools/handlers/fetch-markdown.tool.d.ts.map +1 -1
- package/dist/tools/handlers/fetch-markdown.tool.js +74 -83
- package/dist/tools/handlers/fetch-markdown.tool.js.map +1 -1
- package/dist/tools/handlers/fetch-single.shared.d.ts +26 -0
- package/dist/tools/handlers/fetch-single.shared.d.ts.map +1 -0
- package/dist/tools/handlers/fetch-single.shared.js +49 -0
- package/dist/tools/handlers/fetch-single.shared.js.map +1 -0
- package/dist/tools/handlers/fetch-url.tool.d.ts.map +1 -1
- package/dist/tools/handlers/fetch-url.tool.js +82 -54
- package/dist/tools/handlers/fetch-url.tool.js.map +1 -1
- package/dist/tools/handlers/fetch-urls/processor.d.ts +13 -0
- package/dist/tools/handlers/fetch-urls/processor.d.ts.map +1 -0
- package/dist/tools/handlers/fetch-urls/processor.js +153 -0
- package/dist/tools/handlers/fetch-urls/processor.js.map +1 -0
- package/dist/tools/handlers/fetch-urls/response.d.ts +3 -0
- package/dist/tools/handlers/fetch-urls/response.d.ts.map +1 -0
- package/dist/tools/handlers/fetch-urls/response.js +58 -0
- package/dist/tools/handlers/fetch-urls/response.js.map +1 -0
- package/dist/tools/handlers/fetch-urls/validation.d.ts +6 -0
- package/dist/tools/handlers/fetch-urls/validation.d.ts.map +1 -0
- package/dist/tools/handlers/fetch-urls/validation.js +18 -0
- package/dist/tools/handlers/fetch-urls/validation.js.map +1 -0
- package/dist/tools/handlers/fetch-urls.tool.d.ts.map +1 -1
- package/dist/tools/handlers/fetch-urls.tool.js +104 -202
- package/dist/tools/handlers/fetch-urls.tool.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +36 -237
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/schemas.d.ts +357 -0
- package/dist/tools/schemas.d.ts.map +1 -0
- package/dist/tools/schemas.js +272 -0
- package/dist/tools/schemas.js.map +1 -0
- package/dist/tools/utils/cache-vary.d.ts +3 -0
- package/dist/tools/utils/cache-vary.d.ts.map +1 -0
- package/dist/tools/utils/cache-vary.js +44 -0
- package/dist/tools/utils/cache-vary.js.map +1 -0
- package/dist/tools/utils/common.d.ts +2 -2
- package/dist/tools/utils/common.d.ts.map +1 -1
- package/dist/tools/utils/common.js +5 -1
- package/dist/tools/utils/common.js.map +1 -1
- package/dist/tools/utils/content-transform.d.ts +16 -0
- package/dist/tools/utils/content-transform.d.ts.map +1 -0
- package/dist/tools/utils/content-transform.js +49 -0
- package/dist/tools/utils/content-transform.js.map +1 -0
- package/dist/tools/utils/fetch-pipeline.d.ts.map +1 -1
- package/dist/tools/utils/fetch-pipeline.js +32 -18
- package/dist/tools/utils/fetch-pipeline.js.map +1 -1
- package/dist/tools/utils/inline-content.d.ts +11 -0
- package/dist/tools/utils/inline-content.d.ts.map +1 -0
- package/dist/tools/utils/inline-content.js +39 -0
- package/dist/tools/utils/inline-content.js.map +1 -0
- package/dist/tools/utils/markdown-toc.d.ts +3 -0
- package/dist/tools/utils/markdown-toc.d.ts.map +1 -0
- package/dist/tools/utils/markdown-toc.js +35 -0
- package/dist/tools/utils/markdown-toc.js.map +1 -0
- package/dist/tools/utils/tool-response.d.ts +9 -0
- package/dist/tools/utils/tool-response.d.ts.map +1 -0
- package/dist/tools/utils/tool-response.js +19 -0
- package/dist/tools/utils/tool-response.js.map +1 -0
- package/dist/transformers/jsonl.transformer.d.ts.map +1 -1
- package/dist/transformers/jsonl.transformer.js +51 -28
- package/dist/transformers/jsonl.transformer.js.map +1 -1
- package/dist/transformers/markdown.transformer.d.ts.map +1 -1
- package/dist/transformers/markdown.transformer.js +82 -111
- package/dist/transformers/markdown.transformer.js.map +1 -1
- package/dist/utils/header-normalizer.d.ts +5 -0
- package/dist/utils/header-normalizer.d.ts.map +1 -0
- package/dist/utils/header-normalizer.js +25 -0
- package/dist/utils/header-normalizer.js.map +1 -0
- package/dist/utils/tool-error-handler.d.ts +1 -0
- package/dist/utils/tool-error-handler.d.ts.map +1 -1
- package/dist/utils/tool-error-handler.js +29 -1
- package/dist/utils/tool-error-handler.js.map +1 -1
- package/dist/utils/url-validator.d.ts +0 -3
- package/dist/utils/url-validator.d.ts.map +1 -1
- package/dist/utils/url-validator.js +97 -18
- package/dist/utils/url-validator.js.map +1 -1
- package/package.json +11 -6
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { FetchError } from '../../errors/app-error.js';
|
|
2
|
+
import { validateAndNormalizeUrl } from '../../utils/url-validator.js';
|
|
3
|
+
const REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);
|
|
4
|
+
function isRedirectStatus(status) {
|
|
5
|
+
return REDIRECT_STATUSES.has(status);
|
|
6
|
+
}
|
|
7
|
+
async function performFetchCycle(currentUrl, init, redirectLimit, redirectCount) {
|
|
8
|
+
const response = await fetch(currentUrl, { ...init, redirect: 'manual' });
|
|
9
|
+
if (!isRedirectStatus(response.status)) {
|
|
10
|
+
return { response };
|
|
11
|
+
}
|
|
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
|
+
}
|
|
21
|
+
void response.body?.cancel();
|
|
22
|
+
return {
|
|
23
|
+
response,
|
|
24
|
+
nextUrl: resolveRedirectTarget(currentUrl, location),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function annotateRedirectError(error, url) {
|
|
28
|
+
if (!error || typeof error !== 'object')
|
|
29
|
+
return;
|
|
30
|
+
error.requestUrl = url;
|
|
31
|
+
}
|
|
32
|
+
export function resolveRedirectTarget(baseUrl, location) {
|
|
33
|
+
if (!URL.canParse(location, baseUrl)) {
|
|
34
|
+
const error = new Error('Invalid redirect target');
|
|
35
|
+
error.code = 'EBADREDIRECT';
|
|
36
|
+
throw error;
|
|
37
|
+
}
|
|
38
|
+
const resolved = new URL(location, baseUrl);
|
|
39
|
+
if (resolved.username || resolved.password) {
|
|
40
|
+
const error = new Error('Redirect target includes credentials');
|
|
41
|
+
error.code = 'EBADREDIRECT';
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
44
|
+
return validateAndNormalizeUrl(resolved.href);
|
|
45
|
+
}
|
|
46
|
+
export async function fetchWithRedirects(url, init, maxRedirects) {
|
|
47
|
+
let currentUrl = url;
|
|
48
|
+
const redirectLimit = Math.max(0, maxRedirects);
|
|
49
|
+
for (let redirectCount = 0; redirectCount <= redirectLimit; redirectCount += 1) {
|
|
50
|
+
const { response, nextUrl } = await performFetchCycleSafely(currentUrl, init, redirectLimit, redirectCount);
|
|
51
|
+
if (!nextUrl) {
|
|
52
|
+
return { response, url: currentUrl };
|
|
53
|
+
}
|
|
54
|
+
currentUrl = nextUrl;
|
|
55
|
+
}
|
|
56
|
+
throw new FetchError('Too many redirects', currentUrl);
|
|
57
|
+
}
|
|
58
|
+
async function performFetchCycleSafely(currentUrl, init, redirectLimit, redirectCount) {
|
|
59
|
+
try {
|
|
60
|
+
return await performFetchCycle(currentUrl, init, redirectLimit, redirectCount);
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
annotateRedirectError(error, currentUrl);
|
|
64
|
+
throw error;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=redirects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redirects.js","sourceRoot":"","sources":["../../../src/services/fetcher/redirects.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../../src/services/fetcher/response.ts"],"names":[],"mappings":"AAmDA,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CASzC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { FetchError } from '../../errors/app-error.js';
|
|
2
|
+
function assertContentLengthWithinLimit(response, url, maxBytes) {
|
|
3
|
+
const contentLengthHeader = response.headers.get('content-length');
|
|
4
|
+
if (!contentLengthHeader)
|
|
5
|
+
return;
|
|
6
|
+
const contentLength = Number.parseInt(contentLengthHeader, 10);
|
|
7
|
+
if (Number.isNaN(contentLength) || contentLength <= maxBytes) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
throw new FetchError(`Response exceeds maximum size of ${maxBytes} bytes`, url);
|
|
11
|
+
}
|
|
12
|
+
async function readStreamWithLimit(stream, url, maxBytes) {
|
|
13
|
+
const reader = stream.getReader();
|
|
14
|
+
const decoder = new TextDecoder();
|
|
15
|
+
let total = 0;
|
|
16
|
+
let text = '';
|
|
17
|
+
for (;;) {
|
|
18
|
+
const { value, done } = await reader.read();
|
|
19
|
+
if (done)
|
|
20
|
+
break;
|
|
21
|
+
total += value.byteLength;
|
|
22
|
+
if (total > maxBytes) {
|
|
23
|
+
await reader.cancel();
|
|
24
|
+
throw new FetchError(`Response exceeds maximum size of ${maxBytes} bytes`, url);
|
|
25
|
+
}
|
|
26
|
+
text += decoder.decode(value, { stream: true });
|
|
27
|
+
}
|
|
28
|
+
text += decoder.decode();
|
|
29
|
+
return { text, size: total };
|
|
30
|
+
}
|
|
31
|
+
export async function readResponseText(response, url, maxBytes) {
|
|
32
|
+
assertContentLengthWithinLimit(response, url, maxBytes);
|
|
33
|
+
if (!response.body) {
|
|
34
|
+
const text = await response.text();
|
|
35
|
+
return { text, size: Buffer.byteLength(text) };
|
|
36
|
+
}
|
|
37
|
+
return readStreamWithLimit(response.body, url, maxBytes);
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=response.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response.js","sourceRoot":"","sources":["../../../src/services/fetcher/response.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEvD,SAAS,8BAA8B,CACrC,QAAkB,EAClB,GAAW,EACX,QAAgB;IAEhB,MAAM,mBAAmB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACnE,IAAI,CAAC,mBAAmB;QAAE,OAAO;IACjC,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;IAC/D,IAAI,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,aAAa,IAAI,QAAQ,EAAE,CAAC;QAC7D,OAAO;IACT,CAAC;IAED,MAAM,IAAI,UAAU,CAClB,oCAAoC,QAAQ,QAAQ,EACpD,GAAG,CACJ,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,MAAkC,EAClC,GAAW,EACX,QAAgB;IAEhB,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,IAAI,GAAG,EAAE,CAAC;IAEd,SAAS,CAAC;QACR,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5C,IAAI,IAAI;YAAE,MAAM;QAEhB,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC;QAE1B,IAAI,KAAK,GAAG,QAAQ,EAAE,CAAC;YACrB,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;YACtB,MAAM,IAAI,UAAU,CAClB,oCAAoC,QAAQ,QAAQ,EACpD,GAAG,CACJ,CAAC;QACJ,CAAC;QAED,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IACzB,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAkB,EAClB,GAAW,EACX,QAAgB;IAEhB,8BAA8B,CAAC,QAAQ,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;IAExD,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;IACjD,CAAC;IAED,OAAO,mBAAmB,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
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
|
+
}
|
|
28
|
+
//# sourceMappingURL=retry-policy.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { setTimeout } from 'node:timers/promises';
|
|
2
|
+
import { FetchError } from '../../errors/app-error.js';
|
|
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;
|
|
86
|
+
}
|
|
87
|
+
isClientError(error) {
|
|
88
|
+
const status = error.details.httpStatus;
|
|
89
|
+
return Boolean(status && status >= 400 && status < 500);
|
|
90
|
+
}
|
|
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,
|
|
102
|
+
attempt,
|
|
103
|
+
delay: `${delay}ms`,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
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;
|
|
124
|
+
}
|
|
125
|
+
isAbortTimeout(error) {
|
|
126
|
+
return (error instanceof Error &&
|
|
127
|
+
(error.name === 'AbortError' || error.name === 'TimeoutError'));
|
|
128
|
+
}
|
|
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);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=retry-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-policy.js","sourceRoot":"","sources":["../../../src/services/fetcher/retry-policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { FetchOptions } from '../config/types.js';
|
|
2
|
-
|
|
2
|
+
import { destroyAgents } from './fetcher/agents.js';
|
|
3
|
+
export { destroyAgents };
|
|
3
4
|
export declare function fetchUrlWithRetry(url: string, options?: FetchOptions, maxRetries?: number): Promise<string>;
|
|
4
5
|
//# sourceMappingURL=fetcher.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetcher.d.ts","sourceRoot":"","sources":["../../src/services/fetcher.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fetcher.d.ts","sourceRoot":"","sources":["../../src/services/fetcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIvD,OAAO,EAAE,aAAa,EAAc,MAAM,qBAAqB,CAAC;AAgBhE,OAAO,EAAE,aAAa,EAAE,CAAC;AA2FzB,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,YAAY,EACtB,UAAU,SAAI,GACb,OAAO,CAAC,MAAM,CAAC,CAWjB"}
|