paper-search-cli 0.3.1 → 0.3.2
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 +1 -1
- package/README.zh.md +1 -1
- package/dist/capabilities/body-snippet-search/handler.d.ts +9 -0
- package/dist/capabilities/body-snippet-search/handler.d.ts.map +1 -0
- package/dist/capabilities/body-snippet-search/handler.js +17 -0
- package/dist/capabilities/body-snippet-search/handler.js.map +1 -0
- package/dist/capabilities/body-snippet-search/index.d.ts +7 -0
- package/dist/capabilities/body-snippet-search/index.d.ts.map +1 -0
- package/dist/capabilities/body-snippet-search/index.js +6 -0
- package/dist/capabilities/body-snippet-search/index.js.map +1 -0
- package/dist/capabilities/body-snippet-search/schemas.d.ts +36 -0
- package/dist/capabilities/body-snippet-search/schemas.d.ts.map +1 -0
- package/dist/capabilities/body-snippet-search/schemas.js +16 -0
- package/dist/capabilities/body-snippet-search/schemas.js.map +1 -0
- package/dist/capabilities/body-snippet-search/service.d.ts +4 -0
- package/dist/capabilities/body-snippet-search/service.d.ts.map +1 -0
- package/dist/capabilities/body-snippet-search/service.js +4 -0
- package/dist/capabilities/body-snippet-search/service.js.map +1 -0
- package/dist/capabilities/body-snippet-search/tools.d.ts +187 -0
- package/dist/capabilities/body-snippet-search/tools.d.ts.map +1 -0
- package/dist/capabilities/body-snippet-search/tools.js +49 -0
- package/dist/capabilities/body-snippet-search/tools.js.map +1 -0
- package/dist/capabilities/body-snippet-search/types.d.ts +14 -0
- package/dist/capabilities/body-snippet-search/types.d.ts.map +1 -0
- package/dist/capabilities/body-snippet-search/types.js +2 -0
- package/dist/capabilities/body-snippet-search/types.js.map +1 -0
- package/dist/capabilities/citation-expansion/CitationService.d.ts +47 -0
- package/dist/capabilities/citation-expansion/CitationService.d.ts.map +1 -0
- package/dist/capabilities/citation-expansion/CitationService.js +243 -0
- package/dist/capabilities/citation-expansion/CitationService.js.map +1 -0
- package/dist/capabilities/citation-expansion/handler.d.ts +36 -0
- package/dist/capabilities/citation-expansion/handler.d.ts.map +1 -0
- package/dist/capabilities/citation-expansion/handler.js +44 -0
- package/dist/capabilities/citation-expansion/handler.js.map +1 -0
- package/dist/capabilities/citation-expansion/index.d.ts +6 -0
- package/dist/capabilities/citation-expansion/index.d.ts.map +1 -0
- package/dist/capabilities/citation-expansion/index.js +5 -0
- package/dist/capabilities/citation-expansion/index.js.map +1 -0
- package/dist/capabilities/citation-expansion/schemas.d.ts +28 -0
- package/dist/capabilities/citation-expansion/schemas.d.ts.map +1 -0
- package/dist/capabilities/citation-expansion/schemas.js +13 -0
- package/dist/capabilities/citation-expansion/schemas.js.map +1 -0
- package/dist/capabilities/citation-expansion/tools.d.ts +82 -0
- package/dist/capabilities/citation-expansion/tools.d.ts.map +1 -0
- package/dist/capabilities/citation-expansion/tools.js +48 -0
- package/dist/capabilities/citation-expansion/tools.js.map +1 -0
- package/dist/capabilities/citation-expansion/types.d.ts +22 -0
- package/dist/capabilities/citation-expansion/types.d.ts.map +1 -0
- package/dist/capabilities/citation-expansion/types.js +2 -0
- package/dist/capabilities/citation-expansion/types.js.map +1 -0
- package/dist/capabilities/journal-metrics/JournalMetricsService.d.ts +3 -0
- package/dist/capabilities/journal-metrics/JournalMetricsService.d.ts.map +1 -0
- package/dist/capabilities/journal-metrics/JournalMetricsService.js +142 -0
- package/dist/capabilities/journal-metrics/JournalMetricsService.js.map +1 -0
- package/dist/capabilities/journal-metrics/handler.d.ts +12 -0
- package/dist/capabilities/journal-metrics/handler.d.ts.map +1 -0
- package/dist/capabilities/journal-metrics/handler.js +38 -0
- package/dist/capabilities/journal-metrics/handler.js.map +1 -0
- package/dist/capabilities/journal-metrics/index.d.ts +6 -0
- package/dist/capabilities/journal-metrics/index.d.ts.map +1 -0
- package/dist/capabilities/journal-metrics/index.js +5 -0
- package/dist/capabilities/journal-metrics/index.js.map +1 -0
- package/dist/capabilities/journal-metrics/schemas.d.ts +28 -0
- package/dist/capabilities/journal-metrics/schemas.d.ts.map +1 -0
- package/dist/capabilities/journal-metrics/schemas.js +13 -0
- package/dist/capabilities/journal-metrics/schemas.js.map +1 -0
- package/dist/capabilities/journal-metrics/tools.d.ts +67 -0
- package/dist/capabilities/journal-metrics/tools.d.ts.map +1 -0
- package/dist/capabilities/journal-metrics/tools.js +27 -0
- package/dist/capabilities/journal-metrics/tools.js.map +1 -0
- package/dist/capabilities/journal-metrics/types.d.ts +36 -0
- package/dist/capabilities/journal-metrics/types.d.ts.map +1 -0
- package/dist/capabilities/journal-metrics/types.js +2 -0
- package/dist/capabilities/journal-metrics/types.js.map +1 -0
- package/dist/capabilities/metadata-search/MultiSourceSearchService.d.ts +9 -0
- package/dist/capabilities/metadata-search/MultiSourceSearchService.d.ts.map +1 -0
- package/dist/capabilities/metadata-search/MultiSourceSearchService.js +78 -0
- package/dist/capabilities/metadata-search/MultiSourceSearchService.js.map +1 -0
- package/dist/capabilities/metadata-search/handler.d.ts +23 -0
- package/dist/capabilities/metadata-search/handler.d.ts.map +1 -0
- package/dist/capabilities/metadata-search/handler.js +163 -0
- package/dist/capabilities/metadata-search/handler.js.map +1 -0
- package/dist/capabilities/metadata-search/index.d.ts +6 -0
- package/dist/capabilities/metadata-search/index.d.ts.map +1 -0
- package/dist/capabilities/metadata-search/index.js +5 -0
- package/dist/capabilities/metadata-search/index.js.map +1 -0
- package/dist/capabilities/metadata-search/schemas.d.ts +83 -0
- package/dist/capabilities/metadata-search/schemas.d.ts.map +1 -0
- package/dist/capabilities/metadata-search/schemas.js +81 -0
- package/dist/capabilities/metadata-search/schemas.js.map +1 -0
- package/dist/capabilities/metadata-search/tools.d.ts +178 -0
- package/dist/capabilities/metadata-search/tools.d.ts.map +1 -0
- package/dist/capabilities/metadata-search/tools.js +75 -0
- package/dist/capabilities/metadata-search/tools.js.map +1 -0
- package/dist/capabilities/metadata-search/types.d.ts +13 -0
- package/dist/capabilities/metadata-search/types.d.ts.map +1 -0
- package/dist/capabilities/metadata-search/types.js +2 -0
- package/dist/capabilities/metadata-search/types.js.map +1 -0
- package/dist/capabilities/pdf-discovery/DownloadTier.d.ts +22 -0
- package/dist/capabilities/pdf-discovery/DownloadTier.d.ts.map +1 -0
- package/dist/capabilities/pdf-discovery/DownloadTier.js +2 -0
- package/dist/capabilities/pdf-discovery/DownloadTier.js.map +1 -0
- package/dist/capabilities/pdf-discovery/OpenAccessFallbackService.d.ts +10 -0
- package/dist/capabilities/pdf-discovery/OpenAccessFallbackService.d.ts.map +1 -0
- package/dist/capabilities/pdf-discovery/OpenAccessFallbackService.js +53 -0
- package/dist/capabilities/pdf-discovery/OpenAccessFallbackService.js.map +1 -0
- package/dist/capabilities/pdf-discovery/handler.d.ts +19 -0
- package/dist/capabilities/pdf-discovery/handler.d.ts.map +1 -0
- package/dist/capabilities/pdf-discovery/handler.js +56 -0
- package/dist/capabilities/pdf-discovery/handler.js.map +1 -0
- package/dist/capabilities/pdf-discovery/index.d.ts +7 -0
- package/dist/capabilities/pdf-discovery/index.d.ts.map +1 -0
- package/dist/capabilities/pdf-discovery/index.js +5 -0
- package/dist/capabilities/pdf-discovery/index.js.map +1 -0
- package/dist/capabilities/pdf-discovery/schemas.d.ts +37 -0
- package/dist/capabilities/pdf-discovery/schemas.d.ts.map +1 -0
- package/dist/capabilities/pdf-discovery/schemas.js +22 -0
- package/dist/capabilities/pdf-discovery/schemas.js.map +1 -0
- package/dist/capabilities/pdf-discovery/tiers/directPdfUrl.d.ts +3 -0
- package/dist/capabilities/pdf-discovery/tiers/directPdfUrl.d.ts.map +1 -0
- package/dist/capabilities/pdf-discovery/tiers/directPdfUrl.js +27 -0
- package/dist/capabilities/pdf-discovery/tiers/directPdfUrl.js.map +1 -0
- package/dist/capabilities/pdf-discovery/tiers/primary.d.ts +3 -0
- package/dist/capabilities/pdf-discovery/tiers/primary.d.ts.map +1 -0
- package/dist/capabilities/pdf-discovery/tiers/primary.js +21 -0
- package/dist/capabilities/pdf-discovery/tiers/primary.js.map +1 -0
- package/dist/capabilities/pdf-discovery/tiers/repositories.d.ts +3 -0
- package/dist/capabilities/pdf-discovery/tiers/repositories.d.ts.map +1 -0
- package/dist/capabilities/pdf-discovery/tiers/repositories.js +35 -0
- package/dist/capabilities/pdf-discovery/tiers/repositories.js.map +1 -0
- package/dist/capabilities/pdf-discovery/tiers/scihub.d.ts +3 -0
- package/dist/capabilities/pdf-discovery/tiers/scihub.d.ts.map +1 -0
- package/dist/capabilities/pdf-discovery/tiers/scihub.js +21 -0
- package/dist/capabilities/pdf-discovery/tiers/scihub.js.map +1 -0
- package/dist/capabilities/pdf-discovery/tiers/unpaywall.d.ts +3 -0
- package/dist/capabilities/pdf-discovery/tiers/unpaywall.d.ts.map +1 -0
- package/dist/capabilities/pdf-discovery/tiers/unpaywall.js +29 -0
- package/dist/capabilities/pdf-discovery/tiers/unpaywall.js.map +1 -0
- package/dist/capabilities/pdf-discovery/tools.d.ts +114 -0
- package/dist/capabilities/pdf-discovery/tools.d.ts.map +1 -0
- package/dist/capabilities/pdf-discovery/tools.js +42 -0
- package/dist/capabilities/pdf-discovery/tools.js.map +1 -0
- package/dist/capabilities/pdf-discovery/types.d.ts +19 -0
- package/dist/capabilities/pdf-discovery/types.d.ts.map +1 -0
- package/dist/capabilities/pdf-discovery/types.js +2 -0
- package/dist/capabilities/pdf-discovery/types.js.map +1 -0
- package/dist/cli.js +6 -6
- package/dist/cli.js.map +1 -1
- package/dist/core/capabilityProfile.d.ts +1 -17
- package/dist/core/capabilityProfile.d.ts.map +1 -1
- package/dist/core/capabilityProfile.js +1 -166
- package/dist/core/capabilityProfile.js.map +1 -1
- package/dist/core/diagnostics.d.ts +1 -42
- package/dist/core/diagnostics.d.ts.map +1 -1
- package/dist/core/diagnostics.js +1 -585
- package/dist/core/diagnostics.js.map +1 -1
- package/dist/core/handleToolCall.d.ts +1 -0
- package/dist/core/handleToolCall.d.ts.map +1 -1
- package/dist/core/handleToolCall.js +265 -509
- package/dist/core/handleToolCall.js.map +1 -1
- package/dist/core/httpPolicies.d.ts +2 -0
- package/dist/core/httpPolicies.d.ts.map +1 -0
- package/dist/core/httpPolicies.js +2 -0
- package/dist/core/httpPolicies.js.map +1 -0
- package/dist/core/liveSmoke.d.ts +1 -41
- package/dist/core/liveSmoke.d.ts.map +1 -1
- package/dist/core/liveSmoke.js +1 -225
- package/dist/core/liveSmoke.js.map +1 -1
- package/dist/core/platformFactories.d.ts +2 -0
- package/dist/core/platformFactories.d.ts.map +1 -0
- package/dist/core/platformFactories.js +2 -0
- package/dist/core/platformFactories.js.map +1 -0
- package/dist/core/platformMetadata.d.ts +1 -27
- package/dist/core/platformMetadata.d.ts.map +1 -1
- package/dist/core/platformMetadata.js +1 -257
- package/dist/core/platformMetadata.js.map +1 -1
- package/dist/core/schemas.d.ts +10 -202
- package/dist/core/schemas.d.ts.map +1 -1
- package/dist/core/schemas.js +11 -118
- package/dist/core/schemas.js.map +1 -1
- package/dist/core/searchers.d.ts +24 -24
- package/dist/core/searchers.d.ts.map +1 -1
- package/dist/core/searchers.js +14 -79
- package/dist/core/searchers.js.map +1 -1
- package/dist/core/textReports.d.ts +1 -20
- package/dist/core/textReports.d.ts.map +1 -1
- package/dist/core/textReports.js +1 -84
- package/dist/core/textReports.js.map +1 -1
- package/dist/core/tools.d.ts.map +1 -1
- package/dist/core/tools.js +15 -237
- package/dist/core/tools.js.map +1 -1
- package/dist/infrastructure/cache/RequestCache.d.ts +26 -0
- package/dist/infrastructure/cache/RequestCache.d.ts.map +1 -0
- package/dist/infrastructure/cache/RequestCache.js +66 -0
- package/dist/infrastructure/cache/RequestCache.js.map +1 -0
- package/dist/infrastructure/http/ErrorHandler.d.ts +99 -0
- package/dist/infrastructure/http/ErrorHandler.d.ts.map +1 -0
- package/dist/infrastructure/http/ErrorHandler.js +266 -0
- package/dist/infrastructure/http/ErrorHandler.js.map +1 -0
- package/dist/infrastructure/http/HttpClient.d.ts +31 -0
- package/dist/infrastructure/http/HttpClient.d.ts.map +1 -0
- package/dist/infrastructure/http/HttpClient.js +50 -0
- package/dist/infrastructure/http/HttpClient.js.map +1 -0
- package/dist/infrastructure/pdf/PDFExtractor.d.ts +34 -0
- package/dist/infrastructure/pdf/PDFExtractor.d.ts.map +1 -0
- package/dist/infrastructure/pdf/PDFExtractor.js +130 -0
- package/dist/infrastructure/pdf/PDFExtractor.js.map +1 -0
- package/dist/infrastructure/pdf/PdfDownload.d.ts +7 -0
- package/dist/infrastructure/pdf/PdfDownload.d.ts.map +1 -0
- package/dist/infrastructure/pdf/PdfDownload.js +175 -0
- package/dist/infrastructure/pdf/PdfDownload.js.map +1 -0
- package/dist/infrastructure/rate-limit/RateLimiter.d.ts +50 -0
- package/dist/infrastructure/rate-limit/RateLimiter.d.ts.map +1 -0
- package/dist/infrastructure/rate-limit/RateLimiter.js +128 -0
- package/dist/infrastructure/rate-limit/RateLimiter.js.map +1 -0
- package/dist/infrastructure/security/SecurityUtils.d.ts +80 -0
- package/dist/infrastructure/security/SecurityUtils.d.ts.map +1 -0
- package/dist/infrastructure/security/SecurityUtils.js +357 -0
- package/dist/infrastructure/security/SecurityUtils.js.map +1 -0
- package/dist/management/capability-profile/index.d.ts +18 -0
- package/dist/management/capability-profile/index.d.ts.map +1 -0
- package/dist/management/capability-profile/index.js +167 -0
- package/dist/management/capability-profile/index.js.map +1 -0
- package/dist/management/config/index.d.ts +2 -0
- package/dist/management/config/index.d.ts.map +1 -0
- package/dist/management/config/index.js +2 -0
- package/dist/management/config/index.js.map +1 -0
- package/dist/management/diagnostics/index.d.ts +43 -0
- package/dist/management/diagnostics/index.d.ts.map +1 -0
- package/dist/management/diagnostics/index.js +586 -0
- package/dist/management/diagnostics/index.js.map +1 -0
- package/dist/management/reports/index.d.ts +21 -0
- package/dist/management/reports/index.d.ts.map +1 -0
- package/dist/management/reports/index.js +85 -0
- package/dist/management/reports/index.js.map +1 -0
- package/dist/management/skills/index.d.ts +2 -0
- package/dist/management/skills/index.d.ts.map +1 -0
- package/dist/management/skills/index.js +2 -0
- package/dist/management/skills/index.js.map +1 -0
- package/dist/management/smoke/index.d.ts +42 -0
- package/dist/management/smoke/index.d.ts.map +1 -0
- package/dist/management/smoke/index.js +226 -0
- package/dist/management/smoke/index.js.map +1 -0
- package/dist/registry/aliases.d.ts +2 -0
- package/dist/registry/aliases.d.ts.map +1 -0
- package/dist/registry/aliases.js +2 -0
- package/dist/registry/aliases.js.map +1 -0
- package/dist/registry/httpPolicies.d.ts +3 -0
- package/dist/registry/httpPolicies.d.ts.map +1 -0
- package/dist/registry/httpPolicies.js +17 -0
- package/dist/registry/httpPolicies.js.map +1 -0
- package/dist/registry/platformFactories.d.ts +8 -0
- package/dist/registry/platformFactories.d.ts.map +1 -0
- package/dist/registry/platformFactories.js +55 -0
- package/dist/registry/platformFactories.js.map +1 -0
- package/dist/registry/platformMetadata.d.ts +39 -0
- package/dist/registry/platformMetadata.d.ts.map +1 -0
- package/dist/registry/platformMetadata.js +321 -0
- package/dist/registry/platformMetadata.js.map +1 -0
- package/dist/services/CitationService.d.ts +2 -65
- package/dist/services/CitationService.d.ts.map +1 -1
- package/dist/services/CitationService.js +1 -242
- package/dist/services/CitationService.js.map +1 -1
- package/dist/services/JournalMetricsService.d.ts +2 -37
- package/dist/services/JournalMetricsService.d.ts.map +1 -1
- package/dist/services/JournalMetricsService.js +1 -141
- package/dist/services/JournalMetricsService.js.map +1 -1
- package/dist/services/MultiSourceSearchService.d.ts +2 -18
- package/dist/services/MultiSourceSearchService.d.ts.map +1 -1
- package/dist/services/MultiSourceSearchService.js +1 -77
- package/dist/services/MultiSourceSearchService.js.map +1 -1
- package/dist/services/OpenAccessFallbackService.d.ts +3 -40
- package/dist/services/OpenAccessFallbackService.d.ts.map +1 -1
- package/dist/services/OpenAccessFallbackService.js +1 -146
- package/dist/services/OpenAccessFallbackService.js.map +1 -1
- package/dist/utils/ErrorHandler.d.ts +2 -98
- package/dist/utils/ErrorHandler.d.ts.map +1 -1
- package/dist/utils/ErrorHandler.js +2 -265
- package/dist/utils/ErrorHandler.js.map +1 -1
- package/dist/utils/HttpClient.d.ts +1 -5
- package/dist/utils/HttpClient.d.ts.map +1 -1
- package/dist/utils/HttpClient.js +1 -29
- package/dist/utils/HttpClient.js.map +1 -1
- package/dist/utils/PDFExtractor.d.ts +2 -33
- package/dist/utils/PDFExtractor.d.ts.map +1 -1
- package/dist/utils/PDFExtractor.js +2 -129
- package/dist/utils/PDFExtractor.js.map +1 -1
- package/dist/utils/PdfDownload.d.ts +1 -6
- package/dist/utils/PdfDownload.d.ts.map +1 -1
- package/dist/utils/PdfDownload.js +1 -141
- package/dist/utils/PdfDownload.js.map +1 -1
- package/dist/utils/RateLimiter.d.ts +1 -49
- package/dist/utils/RateLimiter.d.ts.map +1 -1
- package/dist/utils/RateLimiter.js +1 -127
- package/dist/utils/RateLimiter.js.map +1 -1
- package/dist/utils/RequestCache.d.ts +2 -25
- package/dist/utils/RequestCache.d.ts.map +1 -1
- package/dist/utils/RequestCache.js +2 -65
- package/dist/utils/RequestCache.js.map +1 -1
- package/dist/utils/SecurityUtils.d.ts +2 -79
- package/dist/utils/SecurityUtils.d.ts.map +1 -1
- package/dist/utils/SecurityUtils.js +2 -356
- package/dist/utils/SecurityUtils.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified Error Handler for API requests
|
|
3
|
+
* Provides consistent error handling across all platforms
|
|
4
|
+
*/
|
|
5
|
+
import { sanitizeRequest, maskSensitiveData } from '../security/SecurityUtils.js';
|
|
6
|
+
import { logError as loggerError, logDebug } from '../../utils/Logger.js';
|
|
7
|
+
/**
|
|
8
|
+
* API Error codes and their meanings
|
|
9
|
+
*/
|
|
10
|
+
export const HTTP_ERROR_CODES = {
|
|
11
|
+
400: 'Bad Request - Invalid parameters or syntax',
|
|
12
|
+
401: 'Unauthorized - Invalid or missing API key',
|
|
13
|
+
403: 'Forbidden - Access denied or rate limit exceeded',
|
|
14
|
+
404: 'Not Found - Resource does not exist',
|
|
15
|
+
405: 'Method Not Allowed - HTTP method not supported',
|
|
16
|
+
408: 'Request Timeout - Server took too long to respond',
|
|
17
|
+
429: 'Too Many Requests - Rate limit exceeded',
|
|
18
|
+
500: 'Internal Server Error - Server error',
|
|
19
|
+
502: 'Bad Gateway - Server communication error',
|
|
20
|
+
503: 'Service Unavailable - Server temporarily unavailable',
|
|
21
|
+
504: 'Gateway Timeout - Server timeout'
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Custom API Error class with detailed information
|
|
25
|
+
*/
|
|
26
|
+
export class ApiError extends Error {
|
|
27
|
+
status;
|
|
28
|
+
platform;
|
|
29
|
+
operation;
|
|
30
|
+
timestamp;
|
|
31
|
+
retryable;
|
|
32
|
+
details;
|
|
33
|
+
constructor(options) {
|
|
34
|
+
super(options.message);
|
|
35
|
+
this.name = 'ApiError';
|
|
36
|
+
this.status = options.status;
|
|
37
|
+
this.platform = options.platform;
|
|
38
|
+
this.operation = options.operation;
|
|
39
|
+
this.timestamp = new Date().toISOString();
|
|
40
|
+
this.details = options.details;
|
|
41
|
+
// Determine if error is retryable
|
|
42
|
+
this.retryable = this.isRetryable(options.status);
|
|
43
|
+
}
|
|
44
|
+
isRetryable(status) {
|
|
45
|
+
if (!status)
|
|
46
|
+
return true;
|
|
47
|
+
// Retryable: rate limits, timeouts, server errors
|
|
48
|
+
return [408, 429, 500, 502, 503, 504].includes(status);
|
|
49
|
+
}
|
|
50
|
+
toJSON() {
|
|
51
|
+
return {
|
|
52
|
+
name: this.name,
|
|
53
|
+
message: this.message,
|
|
54
|
+
status: this.status,
|
|
55
|
+
platform: this.platform,
|
|
56
|
+
operation: this.operation,
|
|
57
|
+
timestamp: this.timestamp,
|
|
58
|
+
retryable: this.retryable
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Error Handler class for unified error processing
|
|
64
|
+
*/
|
|
65
|
+
export class ErrorHandler {
|
|
66
|
+
platform;
|
|
67
|
+
verbose;
|
|
68
|
+
constructor(platform, verbose = false) {
|
|
69
|
+
this.platform = platform;
|
|
70
|
+
this.verbose = verbose || process.env.NODE_ENV === 'development';
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Handle HTTP errors from axios or similar libraries
|
|
74
|
+
*/
|
|
75
|
+
handleHttpError(error, operation) {
|
|
76
|
+
const status = error.response?.status;
|
|
77
|
+
const responseMessage = this.extractErrorMessage(error);
|
|
78
|
+
const url = error.config?.url;
|
|
79
|
+
const method = error.config?.method?.toUpperCase() || 'GET';
|
|
80
|
+
// Sanitize sensitive data before logging
|
|
81
|
+
const sanitizedConfig = sanitizeRequest(error.config);
|
|
82
|
+
const sanitizedUrl = url ? this.sanitizeUrl(url) : 'unknown';
|
|
83
|
+
// Log error details (sanitized)
|
|
84
|
+
this.logError({
|
|
85
|
+
status,
|
|
86
|
+
message: responseMessage,
|
|
87
|
+
url: sanitizedUrl,
|
|
88
|
+
method,
|
|
89
|
+
operation,
|
|
90
|
+
config: this.verbose ? sanitizedConfig : undefined,
|
|
91
|
+
responseData: this.verbose ? error.response?.data : undefined
|
|
92
|
+
});
|
|
93
|
+
// Create user-friendly error message
|
|
94
|
+
const userMessage = this.createUserMessage(status, responseMessage, operation);
|
|
95
|
+
throw new ApiError({
|
|
96
|
+
message: userMessage,
|
|
97
|
+
status,
|
|
98
|
+
platform: this.platform,
|
|
99
|
+
operation,
|
|
100
|
+
details: this.verbose ? { url: sanitizedUrl, method } : undefined
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Handle generic errors
|
|
105
|
+
*/
|
|
106
|
+
handleError(error, operation) {
|
|
107
|
+
if (error.response) {
|
|
108
|
+
// HTTP error
|
|
109
|
+
this.handleHttpError(error, operation);
|
|
110
|
+
}
|
|
111
|
+
const message = error.message || 'Unknown error occurred';
|
|
112
|
+
this.logError({
|
|
113
|
+
message,
|
|
114
|
+
operation,
|
|
115
|
+
stack: this.verbose ? error.stack : undefined
|
|
116
|
+
});
|
|
117
|
+
throw new ApiError({
|
|
118
|
+
message: `${this.platform} ${operation} failed: ${message}`,
|
|
119
|
+
platform: this.platform,
|
|
120
|
+
operation
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Extract error message from various error formats
|
|
125
|
+
*/
|
|
126
|
+
extractErrorMessage(error) {
|
|
127
|
+
// Try different error message locations
|
|
128
|
+
const candidates = [
|
|
129
|
+
error.response?.data?.message,
|
|
130
|
+
error.response?.data?.error?.message,
|
|
131
|
+
error.response?.data?.error?.error_description,
|
|
132
|
+
error.response?.data?.error,
|
|
133
|
+
error.response?.data?.detail,
|
|
134
|
+
error.response?.data?.['service-error']?.status?.statusText,
|
|
135
|
+
error.response?.data?.apiMessage,
|
|
136
|
+
error.response?.statusText,
|
|
137
|
+
error.message
|
|
138
|
+
];
|
|
139
|
+
for (const candidate of candidates) {
|
|
140
|
+
if (candidate && typeof candidate === 'string') {
|
|
141
|
+
return candidate;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return 'Unknown error';
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Create user-friendly error message
|
|
148
|
+
*/
|
|
149
|
+
createUserMessage(status, message, operation) {
|
|
150
|
+
const statusDesc = status ? HTTP_ERROR_CODES[status] : '';
|
|
151
|
+
// Platform-specific messages
|
|
152
|
+
if (status === 401) {
|
|
153
|
+
if (/not authorized|insufficient|permission|entitlement|access.*requested/i.test(message)) {
|
|
154
|
+
return `${this.platform}: API key was accepted but does not have permission for this API product, view, or resource.`;
|
|
155
|
+
}
|
|
156
|
+
return `${this.platform}: Invalid or missing API key. Please check your credentials.`;
|
|
157
|
+
}
|
|
158
|
+
if (status === 403) {
|
|
159
|
+
return `${this.platform}: Access forbidden. This may be due to rate limiting or insufficient permissions.`;
|
|
160
|
+
}
|
|
161
|
+
if (status === 404) {
|
|
162
|
+
return `${this.platform}: Resource not found. The requested item may not exist.`;
|
|
163
|
+
}
|
|
164
|
+
if (status === 429) {
|
|
165
|
+
return `${this.platform}: Rate limit exceeded. Please wait before making more requests.`;
|
|
166
|
+
}
|
|
167
|
+
if (status && status >= 500) {
|
|
168
|
+
return `${this.platform}: Server error (${status}). The service may be temporarily unavailable.`;
|
|
169
|
+
}
|
|
170
|
+
// Generic message
|
|
171
|
+
const prefix = `${this.platform} ${operation} failed`;
|
|
172
|
+
const statusInfo = status ? ` (${status}${statusDesc ? ': ' + statusDesc : ''})` : '';
|
|
173
|
+
return `${prefix}${statusInfo}: ${maskSensitiveData(message)}`;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Sanitize URL for logging
|
|
177
|
+
*/
|
|
178
|
+
sanitizeUrl(url) {
|
|
179
|
+
try {
|
|
180
|
+
const urlObj = new URL(url);
|
|
181
|
+
// Remove sensitive query parameters
|
|
182
|
+
const sensitiveParams = ['api_key', 'apikey', 'key', 'token', 'secret', 'auth'];
|
|
183
|
+
sensitiveParams.forEach(param => {
|
|
184
|
+
if (urlObj.searchParams.has(param)) {
|
|
185
|
+
urlObj.searchParams.set(param, '***');
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
return urlObj.toString();
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
// If URL parsing fails, mask the entire thing
|
|
192
|
+
return '***sanitized-url***';
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Log error with consistent format
|
|
197
|
+
*/
|
|
198
|
+
logError(details) {
|
|
199
|
+
loggerError(`[${this.platform}] Error:`, {
|
|
200
|
+
timestamp: new Date().toISOString(),
|
|
201
|
+
...details
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Check if an error is retryable
|
|
206
|
+
*/
|
|
207
|
+
static isRetryable(error) {
|
|
208
|
+
if (error instanceof ApiError) {
|
|
209
|
+
return error.retryable;
|
|
210
|
+
}
|
|
211
|
+
const status = error.response?.status;
|
|
212
|
+
if (!status)
|
|
213
|
+
return true;
|
|
214
|
+
return [408, 429, 500, 502, 503, 504].includes(status);
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Get suggested retry delay based on error
|
|
218
|
+
*/
|
|
219
|
+
static getRetryDelay(error, attempt = 1) {
|
|
220
|
+
const status = error.response?.status || error.status;
|
|
221
|
+
// For rate limiting, check Retry-After header
|
|
222
|
+
if (status === 429) {
|
|
223
|
+
const retryAfter = error.response?.headers?.['retry-after'];
|
|
224
|
+
if (retryAfter) {
|
|
225
|
+
const seconds = parseInt(retryAfter, 10);
|
|
226
|
+
if (!isNaN(seconds)) {
|
|
227
|
+
return seconds * 1000;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
// Default: exponential backoff for rate limits
|
|
231
|
+
return Math.min(60000, 1000 * Math.pow(2, attempt));
|
|
232
|
+
}
|
|
233
|
+
// For server errors, use exponential backoff
|
|
234
|
+
if (status && status >= 500) {
|
|
235
|
+
return Math.min(30000, 1000 * Math.pow(2, attempt));
|
|
236
|
+
}
|
|
237
|
+
// Default delay
|
|
238
|
+
return 1000 * attempt;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Retry a function with exponential backoff and full jitter
|
|
242
|
+
*/
|
|
243
|
+
static async retryWithBackoff(fn, options = {}) {
|
|
244
|
+
const { maxRetries = 3, initialDelayMs = 1000, maxDelayMs = 30000, context = 'operation' } = options;
|
|
245
|
+
let lastError;
|
|
246
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
247
|
+
try {
|
|
248
|
+
return await fn();
|
|
249
|
+
}
|
|
250
|
+
catch (error) {
|
|
251
|
+
lastError = error;
|
|
252
|
+
if (attempt >= maxRetries || !ErrorHandler.isRetryable(error)) {
|
|
253
|
+
throw error;
|
|
254
|
+
}
|
|
255
|
+
// Exponential backoff with full jitter
|
|
256
|
+
const baseDelay = Math.min(maxDelayMs, initialDelayMs * Math.pow(2, attempt));
|
|
257
|
+
const jitteredDelay = Math.floor(Math.random() * baseDelay);
|
|
258
|
+
logDebug(`[Retry] ${context} attempt ${attempt + 1}/${maxRetries} failed, retrying in ${jitteredDelay}ms`);
|
|
259
|
+
await new Promise(resolve => setTimeout(resolve, jitteredDelay));
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
throw lastError;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
export default ErrorHandler;
|
|
266
|
+
//# sourceMappingURL=ErrorHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorHandler.js","sourceRoot":"","sources":["../../../src/infrastructure/http/ErrorHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type AxiosRequestConfig } from 'axios';
|
|
2
|
+
export interface HttpPolicy {
|
|
3
|
+
rateLimit?: {
|
|
4
|
+
rps: number;
|
|
5
|
+
burst?: number;
|
|
6
|
+
};
|
|
7
|
+
cache?: {
|
|
8
|
+
ttlMs: number;
|
|
9
|
+
maxSize?: number;
|
|
10
|
+
};
|
|
11
|
+
timeoutMs?: number;
|
|
12
|
+
retry?: {
|
|
13
|
+
maxRetries: number;
|
|
14
|
+
};
|
|
15
|
+
userAgent?: string;
|
|
16
|
+
validateStatus?: (status: number) => boolean;
|
|
17
|
+
}
|
|
18
|
+
export interface HttpRequestConfig extends AxiosRequestConfig {
|
|
19
|
+
cacheKey?: string;
|
|
20
|
+
}
|
|
21
|
+
export declare class HttpClient {
|
|
22
|
+
private readonly policy;
|
|
23
|
+
constructor(policy?: HttpPolicy);
|
|
24
|
+
request<T>(config: HttpRequestConfig): Promise<T>;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Initializes global HTTP/HTTPS and SOCKS proxy agents for Axios
|
|
28
|
+
* based on standard proxy environment variables.
|
|
29
|
+
*/
|
|
30
|
+
export declare function setupGlobalProxy(): void;
|
|
31
|
+
//# sourceMappingURL=HttpClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HttpClient.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/http/HttpClient.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,KAAK,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAKvD,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,KAAK,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;CAC9C;AAED,MAAM,WAAW,iBAAkB,SAAQ,kBAAkB;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,UAAU;IACT,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,GAAE,UAAe;IAE9C,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,CAAC,CAAC;CAcxD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAuBvC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
import { HttpsProxyAgent } from 'https-proxy-agent';
|
|
3
|
+
import { SocksProxyAgent } from 'socks-proxy-agent';
|
|
4
|
+
import { logDebug } from '../../utils/Logger.js';
|
|
5
|
+
export class HttpClient {
|
|
6
|
+
policy;
|
|
7
|
+
constructor(policy = {}) {
|
|
8
|
+
this.policy = policy;
|
|
9
|
+
}
|
|
10
|
+
async request(config) {
|
|
11
|
+
const response = await axios.request({
|
|
12
|
+
...config,
|
|
13
|
+
timeout: config.timeout ?? this.policy.timeoutMs,
|
|
14
|
+
validateStatus: config.validateStatus ?? this.policy.validateStatus,
|
|
15
|
+
headers: this.policy.userAgent
|
|
16
|
+
? {
|
|
17
|
+
...config.headers,
|
|
18
|
+
'User-Agent': this.policy.userAgent
|
|
19
|
+
}
|
|
20
|
+
: config.headers
|
|
21
|
+
});
|
|
22
|
+
return response.data;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Initializes global HTTP/HTTPS and SOCKS proxy agents for Axios
|
|
27
|
+
* based on standard proxy environment variables.
|
|
28
|
+
*/
|
|
29
|
+
export function setupGlobalProxy() {
|
|
30
|
+
const proxy = process.env.HTTPS_PROXY ||
|
|
31
|
+
process.env.HTTP_PROXY ||
|
|
32
|
+
process.env.https_proxy ||
|
|
33
|
+
process.env.http_proxy;
|
|
34
|
+
if (!proxy) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
logDebug(`Configuring global HTTP/HTTPS proxy: ${proxy}`);
|
|
39
|
+
const agent = proxy.startsWith('socks')
|
|
40
|
+
? new SocksProxyAgent(proxy)
|
|
41
|
+
: new HttpsProxyAgent(proxy);
|
|
42
|
+
// Inject agent as default for both http and https protocols
|
|
43
|
+
axios.defaults.httpAgent = agent;
|
|
44
|
+
axios.defaults.httpsAgent = agent;
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
logDebug(`Failed to initialize global proxy agent: ${error.message}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=HttpClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HttpClient.js","sourceRoot":"","sources":["../../../src/infrastructure/http/HttpClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAkC,MAAM,OAAO,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAejD,MAAM,OAAO,UAAU;IACQ;IAA7B,YAA6B,SAAqB,EAAE;QAAvB,WAAM,GAAN,MAAM,CAAiB;IAAG,CAAC;IAExD,KAAK,CAAC,OAAO,CAAI,MAAyB;QACxC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAI;YACtC,GAAG,MAAM;YACT,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS;YAChD,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc;YACnE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;gBAC5B,CAAC,CAAC;oBACE,GAAG,MAAM,CAAC,OAAO;oBACjB,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;iBACpC;gBACH,CAAC,CAAC,MAAM,CAAC,OAAO;SACnB,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,KAAK,GACT,OAAO,CAAC,GAAG,CAAC,WAAW;QACvB,OAAO,CAAC,GAAG,CAAC,UAAU;QACtB,OAAO,CAAC,GAAG,CAAC,WAAW;QACvB,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IAEzB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,QAAQ,CAAC,wCAAwC,KAAK,EAAE,CAAC,CAAC;QAC1D,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC;YACrC,CAAC,CAAC,IAAI,eAAe,CAAC,KAAK,CAAC;YAC5B,CAAC,CAAC,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC;QAE/B,4DAA4D;QAC5D,KAAK,CAAC,QAAQ,CAAC,SAAS,GAAG,KAAK,CAAC;QACjC,KAAK,CAAC,QAAQ,CAAC,UAAU,GAAG,KAAK,CAAC;IACpC,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,QAAQ,CAAC,4CAA4C,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACxE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export interface PDFExtractOptions {
|
|
2
|
+
maxPages?: number;
|
|
3
|
+
cleanText?: boolean;
|
|
4
|
+
}
|
|
5
|
+
export interface PDFExtractResult {
|
|
6
|
+
text: string;
|
|
7
|
+
numPages: number;
|
|
8
|
+
info?: any;
|
|
9
|
+
metadata?: any;
|
|
10
|
+
}
|
|
11
|
+
export declare class PDFExtractor {
|
|
12
|
+
/**
|
|
13
|
+
* Download PDF from URL and extract text
|
|
14
|
+
*/
|
|
15
|
+
extractFromUrl(url: string, options?: PDFExtractOptions): Promise<PDFExtractResult>;
|
|
16
|
+
/**
|
|
17
|
+
* Extract text from PDF file
|
|
18
|
+
*/
|
|
19
|
+
extractFromFile(filePath: string, options?: PDFExtractOptions): Promise<PDFExtractResult>;
|
|
20
|
+
/**
|
|
21
|
+
* Extract text from PDF buffer
|
|
22
|
+
*/
|
|
23
|
+
extractFromBuffer(buffer: Buffer, options?: PDFExtractOptions): Promise<PDFExtractResult>;
|
|
24
|
+
/**
|
|
25
|
+
* Clean extracted text
|
|
26
|
+
*/
|
|
27
|
+
private cleanText;
|
|
28
|
+
/**
|
|
29
|
+
* Download PDF and save to file
|
|
30
|
+
*/
|
|
31
|
+
downloadPdf(url: string, savePath: string): Promise<string>;
|
|
32
|
+
}
|
|
33
|
+
export default PDFExtractor;
|
|
34
|
+
//# sourceMappingURL=PDFExtractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PDFExtractor.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/pdf/PDFExtractor.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,QAAQ,CAAC,EAAE,GAAG,CAAC;CAChB;AAED,qBAAa,YAAY;IACvB;;OAEG;IACG,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAyB7F;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAgBnG;;OAEG;IACG,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA8BnG;;OAEG;IACH,OAAO,CAAC,SAAS;IAcjB;;OAEG;IACG,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAkClE;AAED,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
// @ts-ignore - pdf-parse doesn't have type definitions
|
|
5
|
+
import pdf from 'pdf-parse';
|
|
6
|
+
import { logDebug, logWarn } from '../../utils/Logger.js';
|
|
7
|
+
import { TIMEOUTS, USER_AGENT } from '../../config/constants.js';
|
|
8
|
+
export class PDFExtractor {
|
|
9
|
+
/**
|
|
10
|
+
* Download PDF from URL and extract text
|
|
11
|
+
*/
|
|
12
|
+
async extractFromUrl(url, options = {}) {
|
|
13
|
+
try {
|
|
14
|
+
logDebug(`Downloading PDF from: ${url}`);
|
|
15
|
+
const response = await axios.get(url, {
|
|
16
|
+
responseType: 'arraybuffer',
|
|
17
|
+
timeout: TIMEOUTS.DOWNLOAD,
|
|
18
|
+
headers: {
|
|
19
|
+
'User-Agent': USER_AGENT,
|
|
20
|
+
'Accept': 'application/pdf'
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
if (response.status !== 200) {
|
|
24
|
+
throw new Error(`Failed to download PDF: HTTP ${response.status}`);
|
|
25
|
+
}
|
|
26
|
+
const buffer = Buffer.from(response.data);
|
|
27
|
+
return await this.extractFromBuffer(buffer, options);
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
logWarn(`Error downloading PDF from ${url}:`, error.message);
|
|
31
|
+
throw error;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Extract text from PDF file
|
|
36
|
+
*/
|
|
37
|
+
async extractFromFile(filePath, options = {}) {
|
|
38
|
+
try {
|
|
39
|
+
if (!fs.existsSync(filePath)) {
|
|
40
|
+
throw new Error(`PDF file not found: ${filePath}`);
|
|
41
|
+
}
|
|
42
|
+
logDebug(`Extracting text from PDF file: ${filePath}`);
|
|
43
|
+
const dataBuffer = fs.readFileSync(filePath);
|
|
44
|
+
return await this.extractFromBuffer(dataBuffer, options);
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
logWarn(`Error extracting PDF from file ${filePath}:`, error.message);
|
|
48
|
+
throw error;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Extract text from PDF buffer
|
|
53
|
+
*/
|
|
54
|
+
async extractFromBuffer(buffer, options = {}) {
|
|
55
|
+
try {
|
|
56
|
+
const pdfOptions = {};
|
|
57
|
+
if (options.maxPages) {
|
|
58
|
+
pdfOptions.max = options.maxPages;
|
|
59
|
+
}
|
|
60
|
+
const data = await pdf(buffer, pdfOptions);
|
|
61
|
+
let text = data.text;
|
|
62
|
+
if (options.cleanText !== false) {
|
|
63
|
+
text = this.cleanText(text);
|
|
64
|
+
}
|
|
65
|
+
logDebug(`Extracted ${data.numpages} pages, ${text.length} characters`);
|
|
66
|
+
return {
|
|
67
|
+
text,
|
|
68
|
+
numPages: data.numpages,
|
|
69
|
+
info: data.info,
|
|
70
|
+
metadata: data.metadata
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
logWarn('Error parsing PDF:', error.message);
|
|
75
|
+
throw error;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Clean extracted text
|
|
80
|
+
*/
|
|
81
|
+
cleanText(text) {
|
|
82
|
+
return text
|
|
83
|
+
// Remove excessive whitespace
|
|
84
|
+
.replace(/\s+/g, ' ')
|
|
85
|
+
// Remove page numbers (common patterns)
|
|
86
|
+
.replace(/\n\s*\d+\s*\n/g, '\n')
|
|
87
|
+
// Remove headers/footers (lines with only numbers or short text)
|
|
88
|
+
.replace(/\n\s*[\w\s]{1,30}\s*\n/g, '\n')
|
|
89
|
+
// Normalize line breaks
|
|
90
|
+
.replace(/\n{3,}/g, '\n\n')
|
|
91
|
+
// Trim
|
|
92
|
+
.trim();
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Download PDF and save to file
|
|
96
|
+
*/
|
|
97
|
+
async downloadPdf(url, savePath) {
|
|
98
|
+
try {
|
|
99
|
+
logDebug(`Downloading PDF from ${url} to ${savePath}`);
|
|
100
|
+
// Ensure directory exists
|
|
101
|
+
const dir = path.dirname(savePath);
|
|
102
|
+
if (!fs.existsSync(dir)) {
|
|
103
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
104
|
+
}
|
|
105
|
+
const response = await axios.get(url, {
|
|
106
|
+
responseType: 'stream',
|
|
107
|
+
timeout: TIMEOUTS.DOWNLOAD,
|
|
108
|
+
headers: {
|
|
109
|
+
'User-Agent': USER_AGENT,
|
|
110
|
+
'Accept': 'application/pdf'
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
const writer = fs.createWriteStream(savePath);
|
|
114
|
+
response.data.pipe(writer);
|
|
115
|
+
return new Promise((resolve, reject) => {
|
|
116
|
+
writer.on('finish', () => {
|
|
117
|
+
logDebug(`PDF saved to: ${savePath}`);
|
|
118
|
+
resolve(savePath);
|
|
119
|
+
});
|
|
120
|
+
writer.on('error', reject);
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
logWarn(`Error downloading PDF:`, error.message);
|
|
125
|
+
throw error;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
export default PDFExtractor;
|
|
130
|
+
//# sourceMappingURL=PDFExtractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PDFExtractor.js","sourceRoot":"","sources":["../../../src/infrastructure/pdf/PDFExtractor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,uDAAuD;AACvD,OAAO,GAAG,MAAM,WAAW,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAcjE,MAAM,OAAO,YAAY;IACvB;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,GAAW,EAAE,UAA6B,EAAE;QAC/D,IAAI,CAAC;YACH,QAAQ,CAAC,yBAAyB,GAAG,EAAE,CAAC,CAAC;YAEzC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;gBACpC,YAAY,EAAE,aAAa;gBAC3B,OAAO,EAAE,QAAQ,CAAC,QAAQ;gBAC1B,OAAO,EAAE;oBACP,YAAY,EAAE,UAAU;oBACxB,QAAQ,EAAE,iBAAiB;iBAC5B;aACF,CAAC,CAAC;YAEH,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,MAAM,IAAI,KAAK,CAAC,gCAAgC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YACrE,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC1C,OAAO,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,8BAA8B,GAAG,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7D,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,QAAgB,EAAE,UAA6B,EAAE;QACrE,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7B,MAAM,IAAI,KAAK,CAAC,uBAAuB,QAAQ,EAAE,CAAC,CAAC;YACrD,CAAC;YAED,QAAQ,CAAC,kCAAkC,QAAQ,EAAE,CAAC,CAAC;YAEvD,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YAC7C,OAAO,MAAM,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,kCAAkC,QAAQ,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACtE,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,MAAc,EAAE,UAA6B,EAAE;QACrE,IAAI,CAAC;YACH,MAAM,UAAU,GAAQ,EAAE,CAAC;YAE3B,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACrB,UAAU,CAAC,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC;YACpC,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;YAE3C,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YAErB,IAAI,OAAO,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;gBAChC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC9B,CAAC;YAED,QAAQ,CAAC,aAAa,IAAI,CAAC,QAAQ,WAAW,IAAI,CAAC,MAAM,aAAa,CAAC,CAAC;YAExE,OAAO;gBACL,IAAI;gBACJ,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;aACxB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,oBAAoB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7C,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,IAAY;QAC5B,OAAO,IAAI;YACT,8BAA8B;aAC7B,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;YACrB,wCAAwC;aACvC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC;YAChC,iEAAiE;aAChE,OAAO,CAAC,yBAAyB,EAAE,IAAI,CAAC;YACzC,wBAAwB;aACvB,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC;YAC3B,OAAO;aACN,IAAI,EAAE,CAAC;IACZ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,GAAW,EAAE,QAAgB;QAC7C,IAAI,CAAC;YACH,QAAQ,CAAC,wBAAwB,GAAG,OAAO,QAAQ,EAAE,CAAC,CAAC;YAEvD,0BAA0B;YAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzC,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;gBACpC,YAAY,EAAE,QAAQ;gBACtB,OAAO,EAAE,QAAQ,CAAC,QAAQ;gBAC1B,OAAO,EAAE;oBACP,YAAY,EAAE,UAAU;oBACxB,QAAQ,EAAE,iBAAiB;iBAC5B;aACF,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;YAC9C,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAE3B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACrC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;oBACvB,QAAQ,CAAC,iBAAiB,QAAQ,EAAE,CAAC,CAAC;oBACtC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACpB,CAAC,CAAC,CAAC;gBACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC7B,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,wBAAwB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACjD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF;AAED,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export interface PdfDownloadOptions {
|
|
2
|
+
headers?: Record<string, string>;
|
|
3
|
+
}
|
|
4
|
+
export declare function safeFilename(value: string, fallback?: string): string;
|
|
5
|
+
export declare function isPdfBuffer(buffer: Buffer, contentType?: string): boolean;
|
|
6
|
+
export declare function downloadPdfFromUrl(pdfUrl: string, savePath: string, filenameHint: string, options?: PdfDownloadOptions): Promise<string>;
|
|
7
|
+
//# sourceMappingURL=PdfDownload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PdfDownload.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/pdf/PdfDownload.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAU,GAAG,MAAM,CAGtE;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,SAAK,GAAG,OAAO,CAErE;AAyCD,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,MAAM,CAAC,CA2IjB"}
|