@j0hanz/superfetch 1.1.2 → 1.1.3
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 +98 -18
- package/dist/utils/url-validator.js.map +1 -1
- package/package.json +11 -6
|
@@ -1,105 +1,118 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { parseHTML } from 'linkedom';
|
|
2
2
|
import { Readability } from '@mozilla/readability';
|
|
3
3
|
import { truncateHtml } from '../utils/html-truncator.js';
|
|
4
4
|
import { logError, logWarn } from './logger.js';
|
|
5
|
-
function
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
5
|
+
function resolveMetaField(state, field) {
|
|
6
|
+
const sources = state[field];
|
|
7
|
+
return sources.og ?? sources.twitter ?? sources.standard;
|
|
8
|
+
}
|
|
9
|
+
function createMetaCollectorState() {
|
|
10
|
+
return {
|
|
11
|
+
title: {},
|
|
12
|
+
description: {},
|
|
13
|
+
author: {},
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function collectMetaTag(state, tag) {
|
|
17
|
+
const content = getMetaContent(tag);
|
|
18
|
+
if (!content)
|
|
19
|
+
return;
|
|
20
|
+
if (collectOpenGraphMeta(state, tag, content))
|
|
21
|
+
return;
|
|
22
|
+
if (collectTwitterMeta(state, tag, content))
|
|
23
|
+
return;
|
|
24
|
+
collectStandardMeta(state, tag, content);
|
|
25
|
+
}
|
|
26
|
+
function getMetaContent(tag) {
|
|
27
|
+
return tag.getAttribute('content')?.trim() ?? null;
|
|
28
|
+
}
|
|
29
|
+
function collectOpenGraphMeta(state, tag, content) {
|
|
30
|
+
const property = tag.getAttribute('property');
|
|
31
|
+
if (!property?.startsWith('og:'))
|
|
32
|
+
return false;
|
|
33
|
+
const key = property.replace('og:', '');
|
|
34
|
+
if (key === 'title')
|
|
35
|
+
state.title.og = content;
|
|
36
|
+
if (key === 'description')
|
|
37
|
+
state.description.og = content;
|
|
38
|
+
return true;
|
|
20
39
|
}
|
|
21
|
-
function
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
40
|
+
function collectTwitterMeta(state, tag, content) {
|
|
41
|
+
const name = tag.getAttribute('name');
|
|
42
|
+
if (!name?.startsWith('twitter:'))
|
|
43
|
+
return false;
|
|
44
|
+
const key = name.replace('twitter:', '');
|
|
45
|
+
if (key === 'title')
|
|
46
|
+
state.title.twitter = content;
|
|
47
|
+
if (key === 'description')
|
|
48
|
+
state.description.twitter = content;
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
function collectStandardMeta(state, tag, content) {
|
|
52
|
+
const name = tag.getAttribute('name');
|
|
53
|
+
if (name === 'description') {
|
|
54
|
+
state.description.standard = content;
|
|
55
|
+
}
|
|
56
|
+
if (name === 'author') {
|
|
57
|
+
state.author.standard = content;
|
|
34
58
|
}
|
|
35
|
-
return data;
|
|
36
59
|
}
|
|
37
|
-
function
|
|
38
|
-
const
|
|
39
|
-
const metaTags = document.querySelectorAll('meta[name][content]');
|
|
60
|
+
function scanMetaTags(document, state) {
|
|
61
|
+
const metaTags = document.querySelectorAll('meta');
|
|
40
62
|
for (const tag of metaTags) {
|
|
41
|
-
|
|
42
|
-
const content = tag.getAttribute('content')?.trim();
|
|
43
|
-
if (!name || !content)
|
|
44
|
-
continue;
|
|
45
|
-
if (name === 'description')
|
|
46
|
-
data.description = content;
|
|
47
|
-
else if (name === 'author')
|
|
48
|
-
data.author = content;
|
|
63
|
+
collectMetaTag(state, tag);
|
|
49
64
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
65
|
+
}
|
|
66
|
+
function ensureTitleFallback(document, state) {
|
|
67
|
+
if (state.title.standard)
|
|
68
|
+
return;
|
|
69
|
+
const titleEl = document.querySelector('title');
|
|
70
|
+
if (titleEl?.textContent) {
|
|
71
|
+
state.title.standard = titleEl.textContent.trim();
|
|
54
72
|
}
|
|
55
|
-
return data;
|
|
56
73
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
74
|
+
function extractMetadata(document) {
|
|
75
|
+
const state = createMetaCollectorState();
|
|
76
|
+
scanMetaTags(document, state);
|
|
77
|
+
ensureTitleFallback(document, state);
|
|
78
|
+
return {
|
|
79
|
+
title: resolveMetaField(state, 'title'),
|
|
80
|
+
description: resolveMetaField(state, 'description'),
|
|
81
|
+
author: resolveMetaField(state, 'author'),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
function extractArticle(document) {
|
|
85
|
+
try {
|
|
86
|
+
const reader = new Readability(document);
|
|
87
|
+
const parsed = reader.parse();
|
|
88
|
+
if (!parsed)
|
|
89
|
+
return null;
|
|
90
|
+
return {
|
|
91
|
+
title: parsed.title ?? undefined,
|
|
92
|
+
byline: parsed.byline ?? undefined,
|
|
93
|
+
content: parsed.content ?? '',
|
|
94
|
+
textContent: parsed.textContent ?? '',
|
|
95
|
+
excerpt: parsed.excerpt ?? undefined,
|
|
96
|
+
siteName: parsed.siteName ?? undefined,
|
|
97
|
+
};
|
|
62
98
|
}
|
|
63
|
-
|
|
64
|
-
|
|
99
|
+
catch (error) {
|
|
100
|
+
logError('Failed to extract article with Readability', error instanceof Error ? error : undefined);
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
export function extractContent(html, url, options = { extractArticle: true }) {
|
|
105
|
+
if (!isValidInput(html, url)) {
|
|
65
106
|
return { article: null, metadata: {} };
|
|
66
107
|
}
|
|
67
108
|
try {
|
|
68
|
-
// Truncate HTML to improve performance
|
|
69
109
|
const processedHtml = truncateHtml(html);
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
const
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
const metadata = {
|
|
77
|
-
title: ogData.title ?? twitterData.title ?? standardData.title,
|
|
78
|
-
description: ogData.description ??
|
|
79
|
-
twitterData.description ??
|
|
80
|
-
standardData.description,
|
|
81
|
-
author: standardData.author,
|
|
82
|
-
};
|
|
83
|
-
let article = null;
|
|
84
|
-
if (options.extractArticle) {
|
|
85
|
-
try {
|
|
86
|
-
const reader = new Readability(document);
|
|
87
|
-
const parsed = reader.parse();
|
|
88
|
-
if (parsed) {
|
|
89
|
-
article = {
|
|
90
|
-
title: parsed.title ?? undefined,
|
|
91
|
-
byline: parsed.byline ?? undefined,
|
|
92
|
-
content: parsed.content ?? '',
|
|
93
|
-
textContent: parsed.textContent ?? '',
|
|
94
|
-
excerpt: parsed.excerpt ?? undefined,
|
|
95
|
-
siteName: parsed.siteName ?? undefined,
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
catch (error) {
|
|
100
|
-
logError('Failed to extract article with Readability', error instanceof Error ? error : undefined);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
110
|
+
const { document } = parseHTML(processedHtml);
|
|
111
|
+
applyBaseUri(document, url);
|
|
112
|
+
const metadata = extractMetadata(document);
|
|
113
|
+
const article = options.extractArticle
|
|
114
|
+
? extractArticle(document)
|
|
115
|
+
: null;
|
|
103
116
|
return { article, metadata };
|
|
104
117
|
}
|
|
105
118
|
catch (error) {
|
|
@@ -107,4 +120,26 @@ export function extractContent(html, url, options = { extractArticle: true }) {
|
|
|
107
120
|
return { article: null, metadata: {} };
|
|
108
121
|
}
|
|
109
122
|
}
|
|
123
|
+
function isValidInput(html, url) {
|
|
124
|
+
if (!html || typeof html !== 'string') {
|
|
125
|
+
logWarn('extractContent called with invalid HTML input');
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
if (!url || typeof url !== 'string') {
|
|
129
|
+
logWarn('extractContent called with invalid URL');
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
return true;
|
|
133
|
+
}
|
|
134
|
+
function applyBaseUri(document, url) {
|
|
135
|
+
try {
|
|
136
|
+
Object.defineProperty(document, 'baseURI', {
|
|
137
|
+
value: url,
|
|
138
|
+
writable: true,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
// Ignore errors in setting baseURI
|
|
143
|
+
}
|
|
144
|
+
}
|
|
110
145
|
//# sourceMappingURL=extractor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extractor.js","sourceRoot":"","sources":["../../src/services/extractor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"extractor.js","sourceRoot":"","sources":["../../src/services/extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import dns from 'node:dns';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import { Agent } from 'undici';
|
|
4
|
+
import { isBlockedIp } from '../../utils/url-validator.js';
|
|
5
|
+
function resolveDns(hostname, options, callback) {
|
|
6
|
+
const { normalizedOptions, useAll, resolvedFamily } = buildLookupContext(options);
|
|
7
|
+
dns.lookup(hostname, { ...normalizedOptions, all: true }, createLookupCallback(hostname, resolvedFamily, useAll, callback));
|
|
8
|
+
}
|
|
9
|
+
function normalizeLookupOptions(options) {
|
|
10
|
+
return typeof options === 'number' ? { family: options } : options;
|
|
11
|
+
}
|
|
12
|
+
function buildLookupContext(options) {
|
|
13
|
+
const normalizedOptions = normalizeLookupOptions(options);
|
|
14
|
+
return {
|
|
15
|
+
normalizedOptions,
|
|
16
|
+
useAll: Boolean(normalizedOptions.all),
|
|
17
|
+
resolvedFamily: resolveFamily(normalizedOptions.family),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function createLookupCallback(hostname, resolvedFamily, useAll, callback) {
|
|
21
|
+
return (err, addresses) => {
|
|
22
|
+
handleLookupResult(err, addresses, hostname, resolvedFamily, useAll, callback);
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function resolveFamily(family) {
|
|
26
|
+
if (family === 'IPv4')
|
|
27
|
+
return 4;
|
|
28
|
+
if (family === 'IPv6')
|
|
29
|
+
return 6;
|
|
30
|
+
return family;
|
|
31
|
+
}
|
|
32
|
+
function normalizeLookupResults(addresses, family) {
|
|
33
|
+
if (Array.isArray(addresses)) {
|
|
34
|
+
return addresses;
|
|
35
|
+
}
|
|
36
|
+
return [{ address: addresses, family: family ?? 4 }];
|
|
37
|
+
}
|
|
38
|
+
function handleLookupResult(error, addresses, hostname, resolvedFamily, useAll, callback) {
|
|
39
|
+
if (error) {
|
|
40
|
+
callback(error, addresses);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const list = normalizeLookupResults(addresses, resolvedFamily);
|
|
44
|
+
const blockedError = findBlockedIpError(list, hostname);
|
|
45
|
+
if (blockedError) {
|
|
46
|
+
callback(blockedError, list);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const selection = selectLookupResult(list, useAll, hostname);
|
|
50
|
+
if (selection.error) {
|
|
51
|
+
callback(selection.error, selection.fallback);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
callback(null, selection.address, selection.family);
|
|
55
|
+
}
|
|
56
|
+
function selectLookupResult(list, useAll, hostname) {
|
|
57
|
+
if (list.length === 0) {
|
|
58
|
+
return {
|
|
59
|
+
error: createNoDnsResultsError(hostname),
|
|
60
|
+
fallback: [],
|
|
61
|
+
address: [],
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
if (useAll) {
|
|
65
|
+
return { address: list, fallback: list };
|
|
66
|
+
}
|
|
67
|
+
const first = list.at(0);
|
|
68
|
+
if (!first) {
|
|
69
|
+
return {
|
|
70
|
+
error: createNoDnsResultsError(hostname),
|
|
71
|
+
fallback: [],
|
|
72
|
+
address: [],
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
address: first.address,
|
|
77
|
+
family: first.family,
|
|
78
|
+
fallback: list,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function findBlockedIpError(list, hostname) {
|
|
82
|
+
for (const addr of list) {
|
|
83
|
+
const ip = typeof addr === 'string' ? addr : addr.address;
|
|
84
|
+
if (!isBlockedIp(ip)) {
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
const error = new Error(`Blocked IP detected for ${hostname}`);
|
|
88
|
+
error.code = 'EBLOCKED';
|
|
89
|
+
return error;
|
|
90
|
+
}
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
function createNoDnsResultsError(hostname) {
|
|
94
|
+
const error = new Error(`No DNS results returned for ${hostname}`);
|
|
95
|
+
error.code = 'ENODATA';
|
|
96
|
+
return error;
|
|
97
|
+
}
|
|
98
|
+
function getAgentOptions() {
|
|
99
|
+
const cpuCount = os.availableParallelism();
|
|
100
|
+
return {
|
|
101
|
+
keepAliveTimeout: 60000,
|
|
102
|
+
connections: Math.max(cpuCount * 2, 25),
|
|
103
|
+
pipelining: 1,
|
|
104
|
+
connect: { lookup: resolveDns },
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
export const dispatcher = new Agent(getAgentOptions());
|
|
108
|
+
export function destroyAgents() {
|
|
109
|
+
void dispatcher.close();
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=agents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../../../src/services/fetcher/agents.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,UAAU,CAAC;AAC3B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAE/B,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAE3D,SAAS,UAAU,CACjB,QAAgB,EAChB,OAA0B,EAC1B,QAIS;IAET,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,cAAc,EAAE,GACjD,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC9B,GAAG,CAAC,MAAM,CACR,QAAQ,EACR,EAAE,GAAG,iBAAiB,EAAE,GAAG,EAAE,IAAI,EAAE,EACnC,oBAAoB,CAAC,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,CAAC,CACjE,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAC7B,OAAmC;IAEnC,OAAO,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;AACrE,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAmC;IAK7D,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAC1D,OAAO;QACL,iBAAiB;QACjB,MAAM,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,CAAC;QACtC,cAAc,EAAE,aAAa,CAAC,iBAAiB,CAAC,MAAM,CAAC;KACxD,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAC3B,QAAgB,EAChB,cAAkC,EAClC,MAAe,EACf,QAIS;IAKT,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE;QACxB,kBAAkB,CAChB,GAAG,EACH,SAAS,EACT,QAAQ,EACR,cAAc,EACd,MAAM,EACN,QAAQ,CACT,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CACpB,MAAmC;IAEnC,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,CAAC,CAAC;IAChC,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,CAAC,CAAC;IAChC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,sBAAsB,CAC7B,SAAuC,EACvC,MAA0B;IAE1B,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,kBAAkB,CACzB,KAAmC,EACnC,SAAuC,EACvC,QAAgB,EAChB,cAAkC,EAClC,MAAe,EACf,QAIS;IAET,IAAI,KAAK,EAAE,CAAC;QACV,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAC3B,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,sBAAsB,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAC/D,MAAM,YAAY,GAAG,kBAAkB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACxD,IAAI,YAAY,EAAE,CAAC;QACjB,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QAC7B,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC7D,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;QACpB,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,kBAAkB,CACzB,IAAyB,EACzB,MAAe,EACf,QAAgB;IAOhB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO;YACL,KAAK,EAAE,uBAAuB,CAAC,QAAQ,CAAC;YACxC,QAAQ,EAAE,EAAE;YACZ,OAAO,EAAE,EAAE;SACZ,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC3C,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACzB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,KAAK,EAAE,uBAAuB,CAAC,QAAQ,CAAC;YACxC,QAAQ,EAAE,EAAE;YACZ,OAAO,EAAE,EAAE;SACZ,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,QAAQ,EAAE,IAAI;KACf,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CACzB,IAAyB,EACzB,QAAgB;IAEhB,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,EAAE,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;QAC1D,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC;YACrB,SAAS;QACX,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,KAAK,CACrB,2BAA2B,QAAQ,EAAE,CACb,CAAC;QAC3B,KAAK,CAAC,IAAI,GAAG,UAAU,CAAC;QACxB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,uBAAuB,CAAC,QAAgB;IAC/C,MAAM,KAAK,GAAG,IAAI,KAAK,CACrB,+BAA+B,QAAQ,EAAE,CACjB,CAAC;IAC3B,KAAK,CAAC,IAAI,GAAG,SAAS,CAAC;IACvB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe;IACtB,MAAM,QAAQ,GAAG,EAAE,CAAC,oBAAoB,EAAE,CAAC;IAC3C,OAAO;QACL,gBAAgB,EAAE,KAAK;QACvB,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,EAAE,EAAE,CAAC;QACvC,UAAU,EAAE,CAAC;QACb,OAAO,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE;KAChC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC;AAEvD,MAAM,UAAU,aAAa;IAC3B,KAAK,UAAU,CAAC,KAAK,EAAE,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { FetchError } from '../../errors/app-error.js';
|
|
2
|
+
export declare function createRateLimitError(url: string, headerValue: string | null): FetchError;
|
|
3
|
+
export declare function createHttpError(url: string, status: number, statusText: string): FetchError;
|
|
4
|
+
export declare function mapFetchError(error: unknown, fallbackUrl: string, timeoutMs: number): FetchError;
|
|
5
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/services/fetcher/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAoBvD,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,GAAG,IAAI,GACzB,UAAU,CAGZ;AAED,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,UAAU,CAEZ;AA4CD,wBAAgB,aAAa,CAC3B,KAAK,EAAE,OAAO,EACd,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,UAAU,CAiBZ"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { FetchError } from '../../errors/app-error.js';
|
|
2
|
+
function parseRetryAfter(header) {
|
|
3
|
+
if (!header)
|
|
4
|
+
return 60;
|
|
5
|
+
const parsed = parseInt(header, 10);
|
|
6
|
+
return Number.isNaN(parsed) ? 60 : parsed;
|
|
7
|
+
}
|
|
8
|
+
function createCanceledError(url) {
|
|
9
|
+
return new FetchError('Request was canceled', url, 499, {
|
|
10
|
+
reason: 'aborted',
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
function createTimeoutError(url, timeoutMs) {
|
|
14
|
+
return new FetchError(`Request timeout after ${timeoutMs}ms`, url, 504, {
|
|
15
|
+
timeout: timeoutMs,
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
export function createRateLimitError(url, headerValue) {
|
|
19
|
+
const retryAfter = parseRetryAfter(headerValue);
|
|
20
|
+
return new FetchError('Too many requests', url, 429, { retryAfter });
|
|
21
|
+
}
|
|
22
|
+
export function createHttpError(url, status, statusText) {
|
|
23
|
+
return new FetchError(`HTTP ${status}: ${statusText}`, url, status);
|
|
24
|
+
}
|
|
25
|
+
function createNetworkError(url, message) {
|
|
26
|
+
const details = message ? { message } : undefined;
|
|
27
|
+
return new FetchError(`Network error: Could not reach ${url}`, url, undefined, details ?? {});
|
|
28
|
+
}
|
|
29
|
+
function createUnknownError(url, message) {
|
|
30
|
+
return new FetchError(message, url);
|
|
31
|
+
}
|
|
32
|
+
function isAbortError(error) {
|
|
33
|
+
return (error instanceof Error &&
|
|
34
|
+
(error.name === 'AbortError' || error.name === 'TimeoutError'));
|
|
35
|
+
}
|
|
36
|
+
function isTimeoutError(error) {
|
|
37
|
+
return error instanceof Error && error.name === 'TimeoutError';
|
|
38
|
+
}
|
|
39
|
+
function isRecord(value) {
|
|
40
|
+
return value !== null && typeof value === 'object';
|
|
41
|
+
}
|
|
42
|
+
function getRequestUrl(record) {
|
|
43
|
+
const value = record.requestUrl;
|
|
44
|
+
return typeof value === 'string' ? value : null;
|
|
45
|
+
}
|
|
46
|
+
function resolveErrorUrl(error, fallback) {
|
|
47
|
+
if (error instanceof FetchError)
|
|
48
|
+
return error.url;
|
|
49
|
+
if (!isRecord(error))
|
|
50
|
+
return fallback;
|
|
51
|
+
const requestUrl = getRequestUrl(error);
|
|
52
|
+
if (requestUrl)
|
|
53
|
+
return requestUrl;
|
|
54
|
+
return fallback;
|
|
55
|
+
}
|
|
56
|
+
export function mapFetchError(error, fallbackUrl, timeoutMs) {
|
|
57
|
+
if (error instanceof FetchError)
|
|
58
|
+
return error;
|
|
59
|
+
const url = resolveErrorUrl(error, fallbackUrl);
|
|
60
|
+
if (isAbortError(error)) {
|
|
61
|
+
if (isTimeoutError(error)) {
|
|
62
|
+
return createTimeoutError(url, timeoutMs);
|
|
63
|
+
}
|
|
64
|
+
return createCanceledError(url);
|
|
65
|
+
}
|
|
66
|
+
if (error instanceof Error) {
|
|
67
|
+
return createNetworkError(url, error.message);
|
|
68
|
+
}
|
|
69
|
+
return createUnknownError(url, 'Unexpected error');
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/services/fetcher/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { config } from '../../config/index.js';
|
|
2
|
+
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
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=headers.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface FetchTelemetryContext {
|
|
2
|
+
requestId: string;
|
|
3
|
+
startTime: number;
|
|
4
|
+
url: string;
|
|
5
|
+
method: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function startFetchTelemetry(url: string, method: string): FetchTelemetryContext;
|
|
8
|
+
export declare function recordFetchResponse(context: FetchTelemetryContext, response: Response, contentSize?: number): void;
|
|
9
|
+
export declare function recordFetchError(context: FetchTelemetryContext, error: unknown, status?: number): void;
|
|
10
|
+
//# sourceMappingURL=interceptors.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import diagnosticsChannel from 'node:diagnostics_channel';
|
|
3
|
+
import { performance } from 'node:perf_hooks';
|
|
4
|
+
import { logDebug, logError, logWarn } from '../logger.js';
|
|
5
|
+
const fetchChannel = diagnosticsChannel.channel('superfetch.fetch');
|
|
6
|
+
export function startFetchTelemetry(url, method) {
|
|
7
|
+
const context = {
|
|
8
|
+
requestId: randomUUID(),
|
|
9
|
+
startTime: performance.now(),
|
|
10
|
+
url,
|
|
11
|
+
method: method.toUpperCase(),
|
|
12
|
+
};
|
|
13
|
+
if (fetchChannel.hasSubscribers) {
|
|
14
|
+
fetchChannel.publish({
|
|
15
|
+
type: 'start',
|
|
16
|
+
requestId: context.requestId,
|
|
17
|
+
method: context.method,
|
|
18
|
+
url: context.url,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
logDebug('HTTP Request', {
|
|
22
|
+
requestId: context.requestId,
|
|
23
|
+
method: context.method,
|
|
24
|
+
url: context.url,
|
|
25
|
+
});
|
|
26
|
+
return context;
|
|
27
|
+
}
|
|
28
|
+
export function recordFetchResponse(context, response, contentSize) {
|
|
29
|
+
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
|
+
}
|
|
40
|
+
logDebug('HTTP Response', {
|
|
41
|
+
requestId: context.requestId,
|
|
42
|
+
status: response.status,
|
|
43
|
+
url: context.url,
|
|
44
|
+
contentType,
|
|
45
|
+
duration: `${Math.round(duration)}ms`,
|
|
46
|
+
size: contentLength,
|
|
47
|
+
});
|
|
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
|
+
}
|
|
56
|
+
export function recordFetchError(context, error, status) {
|
|
57
|
+
const duration = performance.now() - context.startTime;
|
|
58
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
59
|
+
const code = typeof err.code === 'string'
|
|
60
|
+
? err.code
|
|
61
|
+
: undefined;
|
|
62
|
+
if (fetchChannel.hasSubscribers) {
|
|
63
|
+
fetchChannel.publish({
|
|
64
|
+
type: 'error',
|
|
65
|
+
requestId: context.requestId,
|
|
66
|
+
url: context.url,
|
|
67
|
+
error: err.message,
|
|
68
|
+
code,
|
|
69
|
+
status,
|
|
70
|
+
duration,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
const log = status === 429 ? logWarn : logError;
|
|
74
|
+
log('HTTP Request Error', {
|
|
75
|
+
requestId: context.requestId,
|
|
76
|
+
url: context.url,
|
|
77
|
+
status,
|
|
78
|
+
code,
|
|
79
|
+
error: err.message,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=interceptors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interceptors.js","sourceRoot":"","sources":["../../../src/services/fetcher/interceptors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function resolveRedirectTarget(baseUrl: string, location: string): string;
|
|
2
|
+
export declare function fetchWithRedirects(url: string, init: RequestInit, maxRedirects: number): Promise<{
|
|
3
|
+
response: Response;
|
|
4
|
+
url: string;
|
|
5
|
+
}>;
|
|
6
|
+
//# sourceMappingURL=redirects.d.ts.map
|
|
@@ -0,0 +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"}
|