@j0hanz/superfetch 1.0.6 → 1.1.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.
- package/README.md +200 -36
- package/dist/config/index.d.ts +5 -5
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +38 -19
- package/dist/config/index.js.map +1 -1
- package/dist/config/types.d.ts +98 -57
- package/dist/config/types.d.ts.map +1 -1
- package/dist/errors/app-error.d.ts +4 -28
- package/dist/errors/app-error.d.ts.map +1 -1
- package/dist/errors/app-error.js +10 -51
- package/dist/errors/app-error.js.map +1 -1
- package/dist/index.js +10 -55
- 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 +12 -14
- package/dist/middleware/error-handler.js.map +1 -1
- package/dist/middleware/rate-limiter.d.ts.map +1 -1
- package/dist/middleware/rate-limiter.js +0 -8
- package/dist/middleware/rate-limiter.js.map +1 -1
- package/dist/parsers/base-html-element-parser.d.ts +43 -0
- package/dist/parsers/base-html-element-parser.d.ts.map +1 -0
- package/dist/parsers/base-html-element-parser.js +59 -0
- package/dist/parsers/base-html-element-parser.js.map +1 -0
- package/dist/parsers/heading-element-parser.d.ts +14 -0
- package/dist/parsers/heading-element-parser.d.ts.map +1 -0
- package/dist/parsers/heading-element-parser.js +26 -0
- package/dist/parsers/heading-element-parser.js.map +1 -0
- package/dist/parsers/image-element-parser.d.ts +16 -0
- package/dist/parsers/image-element-parser.d.ts.map +1 -0
- package/dist/parsers/image-element-parser.js +33 -0
- package/dist/parsers/image-element-parser.js.map +1 -0
- package/dist/parsers/link-element-parser.d.ts +15 -0
- package/dist/parsers/link-element-parser.d.ts.map +1 -0
- package/dist/parsers/link-element-parser.js +28 -0
- package/dist/parsers/link-element-parser.js.map +1 -0
- package/dist/parsers/open-graph-parser.d.ts +17 -0
- package/dist/parsers/open-graph-parser.d.ts.map +1 -0
- package/dist/parsers/open-graph-parser.js +41 -0
- package/dist/parsers/open-graph-parser.js.map +1 -0
- package/dist/parsers/schema-org-parser.d.ts +17 -0
- package/dist/parsers/schema-org-parser.d.ts.map +1 -0
- package/dist/parsers/schema-org-parser.js +32 -0
- package/dist/parsers/schema-org-parser.js.map +1 -0
- package/dist/parsers/standard-meta-parser.d.ts +18 -0
- package/dist/parsers/standard-meta-parser.d.ts.map +1 -0
- package/dist/parsers/standard-meta-parser.js +32 -0
- package/dist/parsers/standard-meta-parser.js.map +1 -0
- package/dist/parsers/twitter-card-parser.d.ts +17 -0
- package/dist/parsers/twitter-card-parser.d.ts.map +1 -0
- package/dist/parsers/twitter-card-parser.js +41 -0
- package/dist/parsers/twitter-card-parser.js.map +1 -0
- package/dist/resources/cached-content.d.ts +0 -1
- package/dist/resources/cached-content.d.ts.map +1 -1
- package/dist/resources/cached-content.js +3 -9
- package/dist/resources/cached-content.js.map +1 -1
- package/dist/resources/index.d.ts.map +1 -1
- package/dist/resources/index.js +8 -8
- package/dist/resources/index.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +10 -10
- package/dist/server.js.map +1 -1
- package/dist/services/cache.d.ts +0 -28
- package/dist/services/cache.d.ts.map +1 -1
- package/dist/services/cache.js +10 -173
- package/dist/services/cache.js.map +1 -1
- package/dist/services/extractor.d.ts +1 -11
- package/dist/services/extractor.d.ts.map +1 -1
- package/dist/services/extractor.js +86 -84
- package/dist/services/extractor.js.map +1 -1
- package/dist/services/fetcher.d.ts +2 -13
- package/dist/services/fetcher.d.ts.map +1 -1
- package/dist/services/fetcher.js +48 -79
- package/dist/services/fetcher.js.map +1 -1
- package/dist/services/logger.d.ts +5 -4
- package/dist/services/logger.d.ts.map +1 -1
- package/dist/services/logger.js +27 -42
- package/dist/services/logger.js.map +1 -1
- package/dist/services/parser.d.ts.map +1 -1
- package/dist/services/parser.js +35 -26
- package/dist/services/parser.js.map +1 -1
- package/dist/services/session-manager.d.ts +18 -0
- package/dist/services/session-manager.d.ts.map +1 -0
- package/dist/services/session-manager.js +73 -0
- package/dist/services/session-manager.js.map +1 -0
- package/dist/strategies/exponential-backoff-strategy.d.ts +13 -0
- package/dist/strategies/exponential-backoff-strategy.d.ts.map +1 -0
- package/dist/strategies/exponential-backoff-strategy.js +32 -0
- package/dist/strategies/exponential-backoff-strategy.js.map +1 -0
- package/dist/tools/handlers/fetch-links.tool.d.ts +2 -9
- package/dist/tools/handlers/fetch-links.tool.d.ts.map +1 -1
- package/dist/tools/handlers/fetch-links.tool.js +0 -1
- package/dist/tools/handlers/fetch-links.tool.js.map +1 -1
- package/dist/tools/handlers/fetch-markdown.tool.d.ts +5 -2
- package/dist/tools/handlers/fetch-markdown.tool.d.ts.map +1 -1
- package/dist/tools/handlers/fetch-markdown.tool.js +23 -33
- package/dist/tools/handlers/fetch-markdown.tool.js.map +1 -1
- package/dist/tools/handlers/fetch-url.tool.d.ts +2 -9
- package/dist/tools/handlers/fetch-url.tool.d.ts.map +1 -1
- package/dist/tools/handlers/fetch-url.tool.js +15 -20
- package/dist/tools/handlers/fetch-url.tool.js.map +1 -1
- package/dist/tools/handlers/fetch-urls.tool.d.ts +2 -9
- package/dist/tools/handlers/fetch-urls.tool.d.ts.map +1 -1
- package/dist/tools/handlers/fetch-urls.tool.js +124 -105
- 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 +0 -4
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/utils/common.d.ts +6 -7
- package/dist/tools/utils/common.d.ts.map +1 -1
- package/dist/tools/utils/common.js +8 -8
- package/dist/tools/utils/common.js.map +1 -1
- package/dist/tools/utils/fetch-pipeline.d.ts +8 -0
- package/dist/tools/utils/fetch-pipeline.d.ts.map +1 -1
- package/dist/tools/utils/fetch-pipeline.js +47 -79
- package/dist/tools/utils/fetch-pipeline.js.map +1 -1
- package/dist/transformers/jsonl.transformer.d.ts +1 -1
- package/dist/transformers/jsonl.transformer.d.ts.map +1 -1
- package/dist/transformers/jsonl.transformer.js +15 -10
- 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 +58 -62
- package/dist/transformers/markdown.transformer.js.map +1 -1
- package/dist/utils/concurrency.d.ts +2 -5
- package/dist/utils/concurrency.d.ts.map +1 -1
- package/dist/utils/concurrency.js +19 -19
- package/dist/utils/concurrency.js.map +1 -1
- package/dist/utils/content-cleaner.d.ts +0 -25
- package/dist/utils/content-cleaner.d.ts.map +1 -1
- package/dist/utils/content-cleaner.js +12 -187
- package/dist/utils/content-cleaner.js.map +1 -1
- package/dist/utils/html-truncator.d.ts +2 -0
- package/dist/utils/html-truncator.d.ts.map +1 -0
- package/dist/utils/html-truncator.js +14 -0
- package/dist/utils/html-truncator.js.map +1 -0
- package/dist/utils/language-detector.d.ts +0 -3
- package/dist/utils/language-detector.d.ts.map +1 -1
- package/dist/utils/language-detector.js +0 -11
- package/dist/utils/language-detector.js.map +1 -1
- package/dist/utils/sanitizer.d.ts.map +1 -1
- package/dist/utils/sanitizer.js +7 -5
- package/dist/utils/sanitizer.js.map +1 -1
- package/dist/utils/tool-error-handler.d.ts.map +1 -1
- package/dist/utils/tool-error-handler.js +15 -42
- package/dist/utils/tool-error-handler.js.map +1 -1
- package/dist/utils/url-validator.d.ts +0 -9
- package/dist/utils/url-validator.d.ts.map +1 -1
- package/dist/utils/url-validator.js +14 -33
- package/dist/utils/url-validator.js.map +1 -1
- package/package.json +3 -4
|
@@ -1,78 +1,60 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { JSDOM, VirtualConsole } from 'jsdom';
|
|
1
|
+
import { JSDOM } from 'jsdom';
|
|
3
2
|
import { Readability } from '@mozilla/readability';
|
|
4
|
-
import {
|
|
5
|
-
import { preserveCardLinks } from './card-extractor.js';
|
|
3
|
+
import { truncateHtml } from '../utils/html-truncator.js';
|
|
6
4
|
import { logError, logWarn } from './logger.js';
|
|
7
|
-
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
const content = $(selector).attr('content');
|
|
23
|
-
if (content)
|
|
24
|
-
return content;
|
|
25
|
-
}
|
|
26
|
-
return undefined;
|
|
27
|
-
};
|
|
28
|
-
const title = getMetaContent([
|
|
29
|
-
'meta[property="og:title"]',
|
|
30
|
-
'meta[name="twitter:title"]',
|
|
31
|
-
]) ??
|
|
32
|
-
($('title').text() || undefined);
|
|
33
|
-
const description = getMetaContent([
|
|
34
|
-
'meta[property="og:description"]',
|
|
35
|
-
'meta[name="twitter:description"]',
|
|
36
|
-
'meta[name="description"]',
|
|
37
|
-
]);
|
|
38
|
-
const author = getMetaContent([
|
|
39
|
-
'meta[name="author"]',
|
|
40
|
-
'meta[property="article:author"]',
|
|
41
|
-
]);
|
|
42
|
-
return { title, description, author };
|
|
5
|
+
function extractOpenGraph(document) {
|
|
6
|
+
const data = {};
|
|
7
|
+
const ogTags = document.querySelectorAll('meta[property^="og:"]');
|
|
8
|
+
for (const tag of ogTags) {
|
|
9
|
+
const property = tag.getAttribute('property');
|
|
10
|
+
const content = tag.getAttribute('content')?.trim();
|
|
11
|
+
if (!property || !content)
|
|
12
|
+
continue;
|
|
13
|
+
const key = property.replace('og:', '');
|
|
14
|
+
if (key === 'title')
|
|
15
|
+
data.title = content;
|
|
16
|
+
else if (key === 'description')
|
|
17
|
+
data.description = content;
|
|
18
|
+
}
|
|
19
|
+
return data;
|
|
43
20
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
return null;
|
|
58
|
-
return {
|
|
59
|
-
title: article.title ?? undefined,
|
|
60
|
-
byline: article.byline ?? undefined,
|
|
61
|
-
content: article.content ?? '',
|
|
62
|
-
textContent: article.textContent ?? '',
|
|
63
|
-
excerpt: article.excerpt ?? undefined,
|
|
64
|
-
siteName: article.siteName ?? undefined,
|
|
65
|
-
};
|
|
21
|
+
function extractTwitterCard(document) {
|
|
22
|
+
const data = {};
|
|
23
|
+
const twitterTags = document.querySelectorAll('meta[name^="twitter:"]');
|
|
24
|
+
for (const tag of twitterTags) {
|
|
25
|
+
const name = tag.getAttribute('name');
|
|
26
|
+
const content = tag.getAttribute('content')?.trim();
|
|
27
|
+
if (!name || !content)
|
|
28
|
+
continue;
|
|
29
|
+
const key = name.replace('twitter:', '');
|
|
30
|
+
if (key === 'title')
|
|
31
|
+
data.title = content;
|
|
32
|
+
else if (key === 'description')
|
|
33
|
+
data.description = content;
|
|
66
34
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
35
|
+
return data;
|
|
36
|
+
}
|
|
37
|
+
function extractStandardMeta(document) {
|
|
38
|
+
const data = {};
|
|
39
|
+
const metaTags = document.querySelectorAll('meta[name][content]');
|
|
40
|
+
for (const tag of metaTags) {
|
|
41
|
+
const name = tag.getAttribute('name');
|
|
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;
|
|
49
|
+
}
|
|
50
|
+
if (!data.title) {
|
|
51
|
+
const titleEl = document.querySelector('title');
|
|
52
|
+
if (titleEl?.textContent)
|
|
53
|
+
data.title = titleEl.textContent.trim();
|
|
70
54
|
}
|
|
55
|
+
return data;
|
|
71
56
|
}
|
|
72
|
-
|
|
73
|
-
* Main extraction function - uses Cheerio for metadata (fast)
|
|
74
|
-
* and lazy-loads JSDOM only when article extraction is needed
|
|
75
|
-
*/
|
|
57
|
+
// Main extraction function
|
|
76
58
|
export function extractContent(html, url, options = { extractArticle: true }) {
|
|
77
59
|
if (!html || typeof html !== 'string') {
|
|
78
60
|
logWarn('extractContent called with invalid HTML input');
|
|
@@ -82,22 +64,42 @@ export function extractContent(html, url, options = { extractArticle: true }) {
|
|
|
82
64
|
logWarn('extractContent called with invalid URL');
|
|
83
65
|
return { article: null, metadata: {} };
|
|
84
66
|
}
|
|
85
|
-
let processedHtml = html;
|
|
86
|
-
if (html.length > config.constants.maxHtmlSize) {
|
|
87
|
-
logWarn('HTML content exceeds maximum size for extraction, truncating', {
|
|
88
|
-
size: html.length,
|
|
89
|
-
maxSize: config.constants.maxHtmlSize,
|
|
90
|
-
});
|
|
91
|
-
processedHtml = html.substring(0, config.constants.maxHtmlSize);
|
|
92
|
-
}
|
|
93
67
|
try {
|
|
94
|
-
//
|
|
95
|
-
const
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
const
|
|
99
|
-
|
|
100
|
-
|
|
68
|
+
// Truncate HTML to improve performance
|
|
69
|
+
const processedHtml = truncateHtml(html);
|
|
70
|
+
// Parse HTML with JSDOM
|
|
71
|
+
const dom = new JSDOM(processedHtml, { url });
|
|
72
|
+
const { document } = dom.window;
|
|
73
|
+
const ogData = extractOpenGraph(document);
|
|
74
|
+
const twitterData = extractTwitterCard(document);
|
|
75
|
+
const standardData = extractStandardMeta(document);
|
|
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
|
+
}
|
|
101
103
|
return { article, metadata };
|
|
102
104
|
}
|
|
103
105
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extractor.js","sourceRoot":"","sources":["../../src/services/extractor.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"extractor.js","sourceRoot":"","sources":["../../src/services/extractor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAE9B,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAQnD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEhD,SAAS,gBAAgB,CAAC,QAAkB;IAK1C,MAAM,IAAI,GAA6C,EAAE,CAAC;IAC1D,MAAM,MAAM,GAAG,QAAQ,CAAC,gBAAgB,CAAC,uBAAuB,CAAC,CAAC;IAElE,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC;QACpD,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO;YAAE,SAAS;QAEpC,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACxC,IAAI,GAAG,KAAK,OAAO;YAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;aACrC,IAAI,GAAG,KAAK,aAAa;YAAE,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC;IAC7D,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAkB;IAI5C,MAAM,IAAI,GAA6C,EAAE,CAAC;IAC1D,MAAM,WAAW,GAAG,QAAQ,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,CAAC;IAExE,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC;QACpD,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO;YAAE,SAAS;QAEhC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QACzC,IAAI,GAAG,KAAK,OAAO;YAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;aACrC,IAAI,GAAG,KAAK,aAAa;YAAE,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC;IAC7D,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAkB;IAK7C,MAAM,IAAI,GAA8D,EAAE,CAAC;IAE3E,MAAM,QAAQ,GAAG,QAAQ,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,CAAC;IAClE,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC;QACpD,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO;YAAE,SAAS;QAEhC,IAAI,IAAI,KAAK,aAAa;YAAE,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC;aAClD,IAAI,IAAI,KAAK,QAAQ;YAAE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;IACpD,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,OAAO,EAAE,WAAW;YAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;IACpE,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,2BAA2B;AAC3B,MAAM,UAAU,cAAc,CAC5B,IAAY,EACZ,GAAW,EACX,UAAwC,EAAE,cAAc,EAAE,IAAI,EAAE;IAEhE,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,OAAO,CAAC,+CAA+C,CAAC,CAAC;QACzD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IACzC,CAAC;IAED,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,CAAC,wCAAwC,CAAC,CAAC;QAClD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IACzC,CAAC;IAED,IAAI,CAAC;QACH,uCAAuC;QACvC,MAAM,aAAa,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QACzC,wBAAwB;QACxB,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,aAAa,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QAC9C,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;QAChC,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,WAAW,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,YAAY,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QAEnD,MAAM,QAAQ,GAAsB;YAClC,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,WAAW,CAAC,KAAK,IAAI,YAAY,CAAC,KAAK;YAC9D,WAAW,EACT,MAAM,CAAC,WAAW;gBAClB,WAAW,CAAC,WAAW;gBACvB,YAAY,CAAC,WAAW;YAC1B,MAAM,EAAE,YAAY,CAAC,MAAM;SAC5B,CAAC;QACF,IAAI,OAAO,GAA4B,IAAI,CAAC;QAC5C,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;gBACzC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;gBAE9B,IAAI,MAAM,EAAE,CAAC;oBACX,OAAO,GAAG;wBACR,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,SAAS;wBAChC,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,SAAS;wBAClC,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE;wBAC7B,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,EAAE;wBACrC,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,SAAS;wBACpC,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,SAAS;qBACvC,CAAC;gBACJ,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,QAAQ,CACN,4CAA4C,EAC5C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAC3C,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,QAAQ,CACN,2BAA2B,EAC3B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAC3C,CAAC;QACF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IACzC,CAAC;AACH,CAAC"}
|
|
@@ -1,15 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
export interface FetchOptions {
|
|
3
|
-
/** Custom HTTP headers to include in the request */
|
|
4
|
-
customHeaders?: Record<string, string>;
|
|
5
|
-
/** AbortSignal for request cancellation */
|
|
6
|
-
signal?: AbortSignal;
|
|
7
|
-
/** Per-request timeout override in milliseconds */
|
|
8
|
-
timeout?: number;
|
|
9
|
-
}
|
|
1
|
+
import type { FetchOptions } from '../config/types.js';
|
|
10
2
|
export declare function destroyAgents(): void;
|
|
11
|
-
export declare function fetchUrlWithRetry(url: string, options?: FetchOptions, maxRetries?: number
|
|
12
|
-
html: string;
|
|
13
|
-
fromHtmlCache: boolean;
|
|
14
|
-
}>;
|
|
3
|
+
export declare function fetchUrlWithRetry(url: string, options?: FetchOptions, maxRetries?: number): Promise<string>;
|
|
15
4
|
//# 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":"AAWA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAgEvD,wBAAgB,aAAa,IAAI,IAAI,CAGpC;AAwND,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,YAAY,EACtB,UAAU,SAAI,GACb,OAAO,CAAC,MAAM,CAAC,CA4CjB"}
|
package/dist/services/fetcher.js
CHANGED
|
@@ -4,11 +4,9 @@ import http from 'http';
|
|
|
4
4
|
import https from 'https';
|
|
5
5
|
import os from 'os';
|
|
6
6
|
import { config } from '../config/index.js';
|
|
7
|
-
import {
|
|
7
|
+
import { FetchError } from '../errors/app-error.js';
|
|
8
8
|
import { validateResolvedIps } from '../utils/url-validator.js';
|
|
9
|
-
import { getHtml, setHtml } from './cache.js';
|
|
10
9
|
import { logDebug, logError, logWarn } from './logger.js';
|
|
11
|
-
// Use Symbol for request timings (20-30% faster than WeakMap)
|
|
12
10
|
const REQUEST_START_TIME = Symbol('requestStartTime');
|
|
13
11
|
const REQUEST_ID = Symbol('requestId');
|
|
14
12
|
const BLOCKED_HEADERS = new Set([
|
|
@@ -34,19 +32,8 @@ function sanitizeHeaders(headers) {
|
|
|
34
32
|
}
|
|
35
33
|
return Object.keys(sanitized).length > 0 ? sanitized : undefined;
|
|
36
34
|
}
|
|
37
|
-
/**
|
|
38
|
-
* Calculate exponential backoff delay with jitter.
|
|
39
|
-
* Safe for attempt values up to 20 (2^19 = 524288 < Number.MAX_SAFE_INTEGER).
|
|
40
|
-
* Current max retries is 10, well within safe bounds.
|
|
41
|
-
*/
|
|
42
|
-
function calculateBackoff(attempt, maxDelay = 10000) {
|
|
43
|
-
const baseDelay = Math.min(1000 * Math.pow(2, attempt - 1), maxDelay);
|
|
44
|
-
const jitter = baseDelay * 0.25 * (Math.random() * 2 - 1);
|
|
45
|
-
return Math.round(baseDelay + jitter);
|
|
46
|
-
}
|
|
47
|
-
// Dynamic connection pool sizing based on CPU cores (2-4x throughput on multi-core)
|
|
48
35
|
const CPU_COUNT = os.cpus().length;
|
|
49
|
-
const MAX_SOCKETS = Math.max(CPU_COUNT * 2, 25);
|
|
36
|
+
const MAX_SOCKETS = Math.max(CPU_COUNT * 2, 25);
|
|
50
37
|
const MAX_FREE_SOCKETS = Math.max(Math.floor(CPU_COUNT * 0.5), 10);
|
|
51
38
|
const httpAgent = new http.Agent({
|
|
52
39
|
keepAlive: true,
|
|
@@ -82,7 +69,6 @@ const client = axios.create({
|
|
|
82
69
|
validateStatus: (status) => status >= 200 && status < 300,
|
|
83
70
|
});
|
|
84
71
|
client.interceptors.request.use((requestConfig) => {
|
|
85
|
-
// Store timing and request ID using Symbols (faster than WeakMap)
|
|
86
72
|
const timedConfig = requestConfig;
|
|
87
73
|
timedConfig[REQUEST_START_TIME] = Date.now();
|
|
88
74
|
timedConfig[REQUEST_ID] = crypto.randomUUID().substring(0, 8);
|
|
@@ -101,7 +87,6 @@ client.interceptors.response.use((response) => {
|
|
|
101
87
|
const startTime = timedConfig[REQUEST_START_TIME];
|
|
102
88
|
const requestId = timedConfig[REQUEST_ID];
|
|
103
89
|
const duration = startTime ? Date.now() - startTime : 0;
|
|
104
|
-
// Clean up timing and tracing data
|
|
105
90
|
if (timedConfig[REQUEST_START_TIME] !== undefined) {
|
|
106
91
|
timedConfig[REQUEST_START_TIME] = undefined;
|
|
107
92
|
}
|
|
@@ -118,7 +103,6 @@ client.interceptors.response.use((response) => {
|
|
|
118
103
|
duration: `${duration}ms`,
|
|
119
104
|
size: response.headers['content-length'],
|
|
120
105
|
});
|
|
121
|
-
// Log slow requests
|
|
122
106
|
if (duration > 5000) {
|
|
123
107
|
logWarn('Slow HTTP request detected', {
|
|
124
108
|
requestId,
|
|
@@ -126,33 +110,26 @@ client.interceptors.response.use((response) => {
|
|
|
126
110
|
duration: `${duration}ms`,
|
|
127
111
|
});
|
|
128
112
|
}
|
|
129
|
-
// Early content-type validation before processing
|
|
130
|
-
if (contentTypeStr && !isHtmlContentType(contentTypeStr)) {
|
|
131
|
-
throw new FetchError(`Unexpected content type: ${contentTypeStr}. Expected HTML content.`, response.config.url ?? 'unknown');
|
|
132
|
-
}
|
|
133
113
|
return response;
|
|
134
114
|
}, (error) => {
|
|
135
115
|
const url = error.config?.url ?? 'unknown';
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
logDebug('HTTP Request Canceled (timeout signal)', { url });
|
|
144
|
-
throw new TimeoutError(config.fetcher.timeout, true);
|
|
116
|
+
if (isCancel(error) ||
|
|
117
|
+
error.name === 'AbortError' ||
|
|
118
|
+
error.name === 'CanceledError') {
|
|
119
|
+
logDebug('HTTP Request Aborted/Canceled', { url });
|
|
120
|
+
throw new FetchError('Request was canceled', url, 499, {
|
|
121
|
+
reason: 'aborted',
|
|
122
|
+
});
|
|
145
123
|
}
|
|
146
124
|
if (error.code === 'ECONNABORTED' || error.code === 'ETIMEDOUT') {
|
|
147
125
|
logError('HTTP Timeout', { url, timeout: config.fetcher.timeout });
|
|
148
|
-
throw new
|
|
126
|
+
throw new FetchError(`Request timeout after ${config.fetcher.timeout}ms`, url, 504, { timeout: config.fetcher.timeout });
|
|
149
127
|
}
|
|
150
128
|
if (error.response) {
|
|
151
129
|
const { status, statusText, headers } = error.response;
|
|
152
|
-
// Handle 429 Too Many Requests with Retry-After header
|
|
153
130
|
if (status === 429) {
|
|
154
131
|
const retryAfterHeader = headers['retry-after'];
|
|
155
|
-
let retryAfterSeconds = 60;
|
|
132
|
+
let retryAfterSeconds = 60;
|
|
156
133
|
if (retryAfterHeader) {
|
|
157
134
|
const parsed = parseInt(retryAfterHeader, 10);
|
|
158
135
|
if (!isNaN(parsed)) {
|
|
@@ -163,7 +140,9 @@ client.interceptors.response.use((response) => {
|
|
|
163
140
|
url,
|
|
164
141
|
retryAfter: `${retryAfterSeconds}s`,
|
|
165
142
|
});
|
|
166
|
-
throw new
|
|
143
|
+
throw new FetchError('Too many requests', url, 429, {
|
|
144
|
+
retryAfter: retryAfterSeconds,
|
|
145
|
+
});
|
|
167
146
|
}
|
|
168
147
|
logError('HTTP Error Response', { url, status, statusText });
|
|
169
148
|
throw new FetchError(`HTTP ${status}: ${statusText}`, url, status);
|
|
@@ -176,7 +155,6 @@ client.interceptors.response.use((response) => {
|
|
|
176
155
|
throw new FetchError(error.message, url);
|
|
177
156
|
});
|
|
178
157
|
async function fetchUrl(url, options) {
|
|
179
|
-
// DNS rebinding protection: validate resolved IPs before fetching
|
|
180
158
|
try {
|
|
181
159
|
const urlObj = new URL(url);
|
|
182
160
|
await validateResolvedIps(urlObj.hostname);
|
|
@@ -192,13 +170,10 @@ async function fetchUrl(url, options) {
|
|
|
192
170
|
url,
|
|
193
171
|
responseType: 'text',
|
|
194
172
|
};
|
|
195
|
-
// Apply per-request timeout via AbortSignal.timeout() if provided
|
|
196
|
-
// This is cleaner than axios timeout as it properly cancels the request
|
|
197
173
|
if (options?.signal) {
|
|
198
174
|
requestConfig.signal = options.signal;
|
|
199
175
|
}
|
|
200
176
|
else if (options?.timeout) {
|
|
201
|
-
// Use AbortSignal.timeout() for per-request timeout (Node 17.3+)
|
|
202
177
|
requestConfig.signal = AbortSignal.timeout(options.timeout);
|
|
203
178
|
}
|
|
204
179
|
const sanitized = sanitizeHeaders(options?.customHeaders);
|
|
@@ -213,53 +188,51 @@ async function fetchUrl(url, options) {
|
|
|
213
188
|
return response.data;
|
|
214
189
|
}
|
|
215
190
|
catch (error) {
|
|
216
|
-
if (error instanceof FetchError
|
|
217
|
-
error instanceof TimeoutError ||
|
|
218
|
-
error instanceof AbortError ||
|
|
219
|
-
error instanceof RateLimitError) {
|
|
191
|
+
if (error instanceof FetchError) {
|
|
220
192
|
throw error;
|
|
221
193
|
}
|
|
222
194
|
throw new FetchError(`Unexpected error: ${error instanceof Error ? error.message : 'Unknown'}`, url);
|
|
223
195
|
}
|
|
224
196
|
}
|
|
225
|
-
function
|
|
226
|
-
const
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
197
|
+
function calculateRetryDelay(attempt) {
|
|
198
|
+
const baseDelayMs = 1000;
|
|
199
|
+
const maxDelayMs = 10000;
|
|
200
|
+
const jitterFactor = 0.25;
|
|
201
|
+
const exponentialDelay = Math.min(baseDelayMs * Math.pow(2, attempt - 1), maxDelayMs);
|
|
202
|
+
const jitter = exponentialDelay * jitterFactor * (Math.random() * 2 - 1);
|
|
203
|
+
return Math.round(exponentialDelay + jitter);
|
|
230
204
|
}
|
|
231
|
-
|
|
232
|
-
if (
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
205
|
+
function shouldRetryError(attempt, maxRetries, error) {
|
|
206
|
+
if (attempt >= maxRetries)
|
|
207
|
+
return false;
|
|
208
|
+
// Don't retry aborted requests
|
|
209
|
+
if (error instanceof FetchError && error.details.reason === 'aborted')
|
|
210
|
+
return false;
|
|
211
|
+
// Don't retry on client errors (4xx except 429)
|
|
212
|
+
if (error instanceof FetchError) {
|
|
213
|
+
const status = error.details.httpStatus;
|
|
214
|
+
if (status && status >= 400 && status < 500 && status !== 429)
|
|
215
|
+
return false;
|
|
238
216
|
}
|
|
217
|
+
return true;
|
|
218
|
+
}
|
|
219
|
+
export async function fetchUrlWithRetry(url, options, maxRetries = 3) {
|
|
239
220
|
const retries = Math.min(Math.max(1, maxRetries), 10);
|
|
240
221
|
let lastError = new Error(`Failed to fetch ${url}`);
|
|
241
222
|
for (let attempt = 1; attempt <= retries; attempt++) {
|
|
242
|
-
// Check if aborted before attempting (early exit for batch operations)
|
|
243
223
|
if (options?.signal?.aborted) {
|
|
244
|
-
|
|
245
|
-
throw abortError;
|
|
224
|
+
throw new FetchError('Request was aborted before execution', url);
|
|
246
225
|
}
|
|
247
226
|
try {
|
|
248
|
-
|
|
249
|
-
setHtml(url, html);
|
|
250
|
-
logDebug('HTML Cache Set', { url });
|
|
251
|
-
return { html, fromHtmlCache: false };
|
|
227
|
+
return await fetchUrl(url, options);
|
|
252
228
|
}
|
|
253
229
|
catch (error) {
|
|
254
230
|
lastError = error instanceof Error ? error : new Error(String(error));
|
|
255
|
-
//
|
|
256
|
-
if (error instanceof
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
if (error instanceof RateLimitError) {
|
|
261
|
-
if (attempt < retries) {
|
|
262
|
-
const waitTime = Math.min(error.retryAfter * 1000, 30000); // Cap at 30s
|
|
231
|
+
// Handle rate limiting with smart retry (429 with Retry-After)
|
|
232
|
+
if (error instanceof FetchError && error.details.httpStatus === 429) {
|
|
233
|
+
const retryAfter = error.details.retryAfter;
|
|
234
|
+
if (attempt < retries && retryAfter) {
|
|
235
|
+
const waitTime = Math.min(retryAfter * 1000, 30000);
|
|
263
236
|
logWarn('Rate limited, waiting before retry', {
|
|
264
237
|
url,
|
|
265
238
|
attempt,
|
|
@@ -270,18 +243,14 @@ export async function fetchUrlWithRetry(url, options, maxRetries = 3, skipCache
|
|
|
270
243
|
}
|
|
271
244
|
throw error;
|
|
272
245
|
}
|
|
273
|
-
if (
|
|
274
|
-
const
|
|
275
|
-
// Don't retry client errors (except 429 which is handled above)
|
|
276
|
-
if (status >= 400 && status < 500 && status !== 429) {
|
|
277
|
-
throw error;
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
if (attempt < retries) {
|
|
281
|
-
const delay = calculateBackoff(attempt);
|
|
246
|
+
if (shouldRetryError(attempt, retries, lastError)) {
|
|
247
|
+
const delay = calculateRetryDelay(attempt);
|
|
282
248
|
logDebug('Retrying request', { url, attempt, delay: `${delay}ms` });
|
|
283
249
|
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
284
250
|
}
|
|
251
|
+
else {
|
|
252
|
+
throw error;
|
|
253
|
+
}
|
|
285
254
|
}
|
|
286
255
|
}
|
|
287
256
|
throw new FetchError(`Failed after ${retries} attempts: ${lastError.message}`, url);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetcher.js","sourceRoot":"","sources":["../../src/services/fetcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAGZ,QAAQ,GACT,MAAM,OAAO,CAAC;AACf,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,OAAO,EACL,UAAU,EACV,UAAU,EACV,cAAc,EACd,YAAY,GACb,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEhE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAY1D,8DAA8D;AAC9D,MAAM,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;AACtD,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;AAQvC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,MAAM;IACN,eAAe;IACf,QAAQ;IACR,iBAAiB;IACjB,WAAW;IACX,qBAAqB;CACtB,CAAC,CAAC;AAEH,SAAS,eAAe,CACtB,OAAgC;IAEhC,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAEpE,MAAM,SAAS,GAA2B,EAAE,CAAC;IAC7C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YAC5C,yCAAyC;YACzC,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/C,SAAS;YACX,CAAC;YACD,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACzB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AACnE,CAAC;AAED;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,OAAe,EAAE,QAAQ,GAAG,KAAK;IACzD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IACtE,MAAM,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,CAAC;AACxC,CAAC;AAED,oFAAoF;AACpF,MAAM,SAAS,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC;AACnC,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,+BAA+B;AAChF,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;AAEnE,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC;IAC/B,SAAS,EAAE,IAAI;IACf,UAAU,EAAE,WAAW;IACvB,cAAc,EAAE,gBAAgB;IAChC,OAAO,EAAE,KAAK;IACd,UAAU,EAAE,MAAM;CACnB,CAAC,CAAC;AAEH,MAAM,UAAU,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC;IACjC,SAAS,EAAE,IAAI;IACf,UAAU,EAAE,WAAW;IACvB,cAAc,EAAE,gBAAgB;IAChC,OAAO,EAAE,KAAK;IACd,UAAU,EAAE,MAAM;CACnB,CAAC,CAAC;AAEH,MAAM,UAAU,aAAa;IAC3B,SAAS,CAAC,OAAO,EAAE,CAAC;IACpB,UAAU,CAAC,OAAO,EAAE,CAAC;AACvB,CAAC;AAED,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO;IAC/B,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,YAAY;IACzC,gBAAgB,EAAE,MAAM,CAAC,OAAO,CAAC,gBAAgB;IACjD,SAAS;IACT,UAAU;IACV,OAAO,EAAE;QACP,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS;QACtC,MAAM,EACJ,4EAA4E;QAC9E,iBAAiB,EAAE,gBAAgB;QACnC,iBAAiB,EAAE,mBAAmB;QACtC,UAAU,EAAE,YAAY;KACzB;IACD,cAAc,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG;CAC1D,CAAC,CAAC;AAEH,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAC7B,CAAC,aAAa,EAAE,EAAE;IAChB,kEAAkE;IAClE,MAAM,WAAW,GAAG,aAAwC,CAAC;IAC7D,WAAW,CAAC,kBAAkB,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7C,WAAW,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAE9D,QAAQ,CAAC,cAAc,EAAE;QACvB,SAAS,EAAE,WAAW,CAAC,UAAU,CAAC;QAClC,MAAM,EAAE,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE;QAC3C,GAAG,EAAE,aAAa,CAAC,GAAG;KACvB,CAAC,CAAC;IACH,OAAO,aAAa,CAAC;AACvB,CAAC,EACD,CAAC,KAAiB,EAAE,EAAE;IACpB,QAAQ,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;IACtC,MAAM,KAAK,CAAC;AACd,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAC9B,CAAC,QAAQ,EAAE,EAAE;IACX,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAiC,CAAC;IAC/D,MAAM,SAAS,GAAG,WAAW,CAAC,kBAAkB,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAExD,mCAAmC;IACnC,IAAI,WAAW,CAAC,kBAAkB,CAAC,KAAK,SAAS,EAAE,CAAC;QAClD,WAAW,CAAC,kBAAkB,CAAC,GAAG,SAAS,CAAC;IAC9C,CAAC;IACD,IAAI,WAAW,CAAC,UAAU,CAAC,KAAK,SAAS,EAAE,CAAC;QAC1C,WAAW,CAAC,UAAU,CAAC,GAAG,SAAS,CAAC;IACtC,CAAC;IAED,MAAM,WAAW,GAAY,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC9D,MAAM,cAAc,GAClB,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;IAE5D,QAAQ,CAAC,eAAe,EAAE;QACxB,SAAS;QACT,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,SAAS;QACrC,WAAW,EAAE,cAAc;QAC3B,QAAQ,EAAE,GAAG,QAAQ,IAAI;QACzB,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC;KACzC,CAAC,CAAC;IAEH,oBAAoB;IACpB,IAAI,QAAQ,GAAG,IAAI,EAAE,CAAC;QACpB,OAAO,CAAC,4BAA4B,EAAE;YACpC,SAAS;YACT,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,SAAS;YACrC,QAAQ,EAAE,GAAG,QAAQ,IAAI;SAC1B,CAAC,CAAC;IACL,CAAC;IAED,kDAAkD;IAClD,IAAI,cAAc,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,UAAU,CAClB,4BAA4B,cAAc,0BAA0B,EACpE,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,SAAS,CACjC,CAAC;IACJ,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC,EACD,CAAC,KAAiB,EAAE,EAAE;IACpB,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC;IAE3C,gDAAgD;IAChD,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QACnD,QAAQ,CAAC,sBAAsB,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QAC1C,MAAM,IAAI,UAAU,CAAC,sBAAsB,CAAC,CAAC;IAC/C,CAAC;IAED,kDAAkD;IAClD,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;QACnC,QAAQ,CAAC,wCAAwC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QAC5D,MAAM,IAAI,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAChE,QAAQ,CAAC,cAAc,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACnE,MAAM,IAAI,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnB,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC;QAEvD,uDAAuD;QACvD,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACnB,MAAM,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAuB,CAAC;YACtE,IAAI,iBAAiB,GAAG,EAAE,CAAC,CAAC,qBAAqB;YAEjD,IAAI,gBAAgB,EAAE,CAAC;gBACrB,MAAM,MAAM,GAAG,QAAQ,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;gBAC9C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;oBACnB,iBAAiB,GAAG,MAAM,CAAC;gBAC7B,CAAC;YACH,CAAC;YAED,OAAO,CAAC,wBAAwB,EAAE;gBAChC,GAAG;gBACH,UAAU,EAAE,GAAG,iBAAiB,GAAG;aACpC,CAAC,CAAC;YACH,MAAM,IAAI,cAAc,CAAC,iBAAiB,CAAC,CAAC;QAC9C,CAAC;QAED,QAAQ,CAAC,qBAAqB,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;QAC7D,MAAM,IAAI,UAAU,CAAC,QAAQ,MAAM,KAAK,UAAU,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,QAAQ,CAAC,oBAAoB,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1D,MAAM,IAAI,UAAU,CAAC,kCAAkC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;IACrE,CAAC;IAED,QAAQ,CAAC,oBAAoB,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAChE,MAAM,IAAI,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAC3C,CAAC,CACF,CAAC;AAEF,KAAK,UAAU,QAAQ,CAAC,GAAW,EAAE,OAAsB;IACzD,kEAAkE;IAClE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,mBAAmB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,MAAM,IAAI,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC3C,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IAED,MAAM,aAAa,GAAuB;QACxC,MAAM,EAAE,KAAK;QACb,GAAG;QACH,YAAY,EAAE,MAAM;KACrB,CAAC;IAEF,kEAAkE;IAClE,wEAAwE;IACxE,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;QACpB,aAAa,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IACxC,CAAC;SAAM,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC;QAC5B,iEAAiE;QACjE,aAAa,CAAC,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAC1D,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,eAAe,GACnB,aAAa,CAAC,OAAO,IAAI,OAAO,aAAa,CAAC,OAAO,KAAK,QAAQ;YAChE,CAAC,CAAE,aAAa,CAAC,OAAkC;YACnD,CAAC,CAAC,EAAE,CAAC;QACT,aAAa,CAAC,OAAO,GAAG,EAAE,GAAG,eAAe,EAAE,GAAG,SAAS,EAAE,CAAC;IAC/D,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAS,aAAa,CAAC,CAAC;QAC7D,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IACE,KAAK,YAAY,UAAU;YAC3B,KAAK,YAAY,YAAY;YAC7B,KAAK,YAAY,UAAU;YAC3B,KAAK,YAAY,cAAc,EAC/B,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QAED,MAAM,IAAI,UAAU,CAClB,qBAAqB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,EACzE,GAAG,CACJ,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,WAAmB;IAC5C,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;IAC7C,OAAO,CACL,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC;QAChC,UAAU,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QACxC,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC,CAClC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,GAAW,EACX,OAAsB,EACtB,UAAU,GAAG,CAAC,EACd,SAAS,GAAG,KAAK;IAEjB,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,UAAU,EAAE,CAAC;YACf,QAAQ,CAAC,gBAAgB,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;YACpC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;QACnD,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;IACtD,IAAI,SAAS,GAAU,IAAI,KAAK,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAC;IAE3D,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC;QACpD,uEAAuE;QACvE,IAAI,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;YAC7B,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,sCAAsC,CAAC,CAAC;YAC1E,MAAM,UAAU,CAAC;QACnB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACnB,QAAQ,CAAC,gBAAgB,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;YAEpC,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;QACxC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAEtE,0CAA0C;YAC1C,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;gBAChC,MAAM,KAAK,CAAC;YACd,CAAC;YAED,wCAAwC;YACxC,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;gBACpC,IAAI,OAAO,GAAG,OAAO,EAAE,CAAC;oBACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,aAAa;oBACxE,OAAO,CAAC,oCAAoC,EAAE;wBAC5C,GAAG;wBACH,OAAO;wBACP,QAAQ,EAAE,GAAG,QAAQ,IAAI;qBAC1B,CAAC,CAAC;oBACH,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;oBAC9D,SAAS;gBACX,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;YAED,IAAI,KAAK,YAAY,UAAU,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;gBACpD,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC;gBAChC,gEAAgE;gBAChE,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;oBACpD,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;YAED,IAAI,OAAO,GAAG,OAAO,EAAE,CAAC;gBACtB,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;gBACxC,QAAQ,CAAC,kBAAkB,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC;gBACpE,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,IAAI,UAAU,CAClB,gBAAgB,OAAO,cAAc,SAAS,CAAC,OAAO,EAAE,EACxD,GAAG,CACJ,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"fetcher.js","sourceRoot":"","sources":["../../src/services/fetcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
export declare function
|
|
3
|
-
export declare function
|
|
4
|
-
export declare function
|
|
1
|
+
import type { LogMetadata } from '../config/types.js';
|
|
2
|
+
export declare function logInfo(message: string, meta?: LogMetadata): void;
|
|
3
|
+
export declare function logDebug(message: string, meta?: LogMetadata): void;
|
|
4
|
+
export declare function logWarn(message: string, meta?: LogMetadata): void;
|
|
5
|
+
export declare function logError(message: string, error?: Error | LogMetadata): void;
|
|
5
6
|
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/services/logger.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/services/logger.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAY,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAwBhE,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,IAAI,CAIjE;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,IAAI,CAIlE;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,IAAI,CAIjE;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,WAAW,GAAG,IAAI,CAS3E"}
|
package/dist/services/logger.js
CHANGED
|
@@ -1,56 +1,41 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import path from 'path';
|
|
3
|
-
import winston from 'winston';
|
|
4
1
|
import { config } from '../config/index.js';
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
maxsize: 5242880,
|
|
21
|
-
maxFiles: 5,
|
|
22
|
-
}),
|
|
23
|
-
new winston.transports.File({
|
|
24
|
-
filename: path.join(logsDir, 'error.log'),
|
|
25
|
-
level: 'error',
|
|
26
|
-
maxsize: 5242880,
|
|
27
|
-
maxFiles: 5,
|
|
28
|
-
}),
|
|
29
|
-
],
|
|
30
|
-
});
|
|
31
|
-
if (process.env.NODE_ENV !== 'production') {
|
|
32
|
-
logger.add(new winston.transports.Console({
|
|
33
|
-
format: winston.format.combine(winston.format.colorize(), winston.format.simple()),
|
|
34
|
-
}));
|
|
2
|
+
function formatMetadata(meta) {
|
|
3
|
+
return meta && Object.keys(meta).length > 0 ? ` ${JSON.stringify(meta)}` : '';
|
|
4
|
+
}
|
|
5
|
+
function createTimestamp() {
|
|
6
|
+
return new Date().toISOString();
|
|
7
|
+
}
|
|
8
|
+
function formatLogEntry(level, message, meta) {
|
|
9
|
+
return `[${createTimestamp()}] ${level.toUpperCase()}: ${message}${formatMetadata(meta)}`;
|
|
10
|
+
}
|
|
11
|
+
function shouldLog(level) {
|
|
12
|
+
if (!config.logging.enabled)
|
|
13
|
+
return false;
|
|
14
|
+
if (level === 'debug')
|
|
15
|
+
return config.logging.level === 'debug';
|
|
16
|
+
return true;
|
|
35
17
|
}
|
|
36
18
|
export function logInfo(message, meta) {
|
|
37
|
-
if (
|
|
38
|
-
|
|
19
|
+
if (shouldLog('info')) {
|
|
20
|
+
console.log(formatLogEntry('info', message, meta));
|
|
21
|
+
}
|
|
39
22
|
}
|
|
40
23
|
export function logDebug(message, meta) {
|
|
41
|
-
if (
|
|
42
|
-
|
|
24
|
+
if (shouldLog('debug')) {
|
|
25
|
+
console.debug(formatLogEntry('debug', message, meta));
|
|
26
|
+
}
|
|
43
27
|
}
|
|
44
28
|
export function logWarn(message, meta) {
|
|
45
|
-
if (
|
|
46
|
-
|
|
29
|
+
if (shouldLog('warn')) {
|
|
30
|
+
console.warn(formatLogEntry('warn', message, meta));
|
|
31
|
+
}
|
|
47
32
|
}
|
|
48
33
|
export function logError(message, error) {
|
|
49
|
-
if (!
|
|
34
|
+
if (!shouldLog('error'))
|
|
50
35
|
return;
|
|
51
36
|
const errorMeta = error instanceof Error
|
|
52
37
|
? { error: error.message, stack: error.stack }
|
|
53
|
-
: error;
|
|
54
|
-
|
|
38
|
+
: (error ?? {});
|
|
39
|
+
console.error(formatLogEntry('error', message, errorMeta));
|
|
55
40
|
}
|
|
56
41
|
//# sourceMappingURL=logger.js.map
|