@mweinbach/apple-docs-mcp 1.0.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/LICENSE +21 -0
- package/README.md +560 -0
- package/dist/constants/browser-headers.d.ts +48 -0
- package/dist/constants/browser-headers.d.ts.map +1 -0
- package/dist/constants/browser-headers.js +166 -0
- package/dist/constants/browser-headers.js.map +1 -0
- package/dist/index.d.ts +83 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +215 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/analyze-api.schema.d.ts +42 -0
- package/dist/schemas/analyze-api.schema.d.ts.map +1 -0
- package/dist/schemas/analyze-api.schema.js +23 -0
- package/dist/schemas/analyze-api.schema.js.map +1 -0
- package/dist/schemas/apple-docs.schema.d.ts +18 -0
- package/dist/schemas/apple-docs.schema.d.ts.map +1 -0
- package/dist/schemas/apple-docs.schema.js +10 -0
- package/dist/schemas/apple-docs.schema.js.map +1 -0
- package/dist/schemas/doc-content.schema.d.ts +24 -0
- package/dist/schemas/doc-content.schema.d.ts.map +1 -0
- package/dist/schemas/doc-content.schema.js +10 -0
- package/dist/schemas/doc-content.schema.js.map +1 -0
- package/dist/schemas/documentation-updates.schema.d.ts +27 -0
- package/dist/schemas/documentation-updates.schema.d.ts.map +1 -0
- package/dist/schemas/documentation-updates.schema.js +12 -0
- package/dist/schemas/documentation-updates.schema.js.map +1 -0
- package/dist/schemas/framework-symbols.schema.d.ts +24 -0
- package/dist/schemas/framework-symbols.schema.d.ts.map +1 -0
- package/dist/schemas/framework-symbols.schema.js +11 -0
- package/dist/schemas/framework-symbols.schema.js.map +1 -0
- package/dist/schemas/index.d.ts +15 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +15 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/platform-compatibility.schema.d.ts +18 -0
- package/dist/schemas/platform-compatibility.schema.d.ts.map +1 -0
- package/dist/schemas/platform-compatibility.schema.js +8 -0
- package/dist/schemas/platform-compatibility.schema.js.map +1 -0
- package/dist/schemas/references.schema.d.ts +18 -0
- package/dist/schemas/references.schema.d.ts.map +1 -0
- package/dist/schemas/references.schema.js +9 -0
- package/dist/schemas/references.schema.js.map +1 -0
- package/dist/schemas/related-apis.schema.d.ts +21 -0
- package/dist/schemas/related-apis.schema.d.ts.map +1 -0
- package/dist/schemas/related-apis.schema.js +9 -0
- package/dist/schemas/related-apis.schema.js.map +1 -0
- package/dist/schemas/sample-code.schema.d.ts +21 -0
- package/dist/schemas/sample-code.schema.d.ts.map +1 -0
- package/dist/schemas/sample-code.schema.js +10 -0
- package/dist/schemas/sample-code.schema.js.map +1 -0
- package/dist/schemas/search.schema.d.ts +15 -0
- package/dist/schemas/search.schema.d.ts.map +1 -0
- package/dist/schemas/search.schema.js +8 -0
- package/dist/schemas/search.schema.js.map +1 -0
- package/dist/schemas/similar-apis.schema.d.ts +21 -0
- package/dist/schemas/similar-apis.schema.d.ts.map +1 -0
- package/dist/schemas/similar-apis.schema.js +9 -0
- package/dist/schemas/similar-apis.schema.js.map +1 -0
- package/dist/schemas/technologies.schema.d.ts +21 -0
- package/dist/schemas/technologies.schema.d.ts.map +1 -0
- package/dist/schemas/technologies.schema.js +10 -0
- package/dist/schemas/technologies.schema.js.map +1 -0
- package/dist/schemas/technology-overviews.schema.d.ts +24 -0
- package/dist/schemas/technology-overviews.schema.d.ts.map +1 -0
- package/dist/schemas/technology-overviews.schema.js +11 -0
- package/dist/schemas/technology-overviews.schema.js.map +1 -0
- package/dist/schemas/wwdc.schemas.d.ts +208 -0
- package/dist/schemas/wwdc.schemas.d.ts.map +1 -0
- package/dist/schemas/wwdc.schemas.js +97 -0
- package/dist/schemas/wwdc.schemas.js.map +1 -0
- package/dist/tools/definitions.d.ts +10 -0
- package/dist/tools/definitions.d.ts.map +1 -0
- package/dist/tools/definitions.js +690 -0
- package/dist/tools/definitions.js.map +1 -0
- package/dist/tools/doc-fetcher.d.ts +19 -0
- package/dist/tools/doc-fetcher.d.ts.map +1 -0
- package/dist/tools/doc-fetcher.js +487 -0
- package/dist/tools/doc-fetcher.js.map +1 -0
- package/dist/tools/doc-formatter.d.ts +69 -0
- package/dist/tools/doc-formatter.d.ts.map +1 -0
- package/dist/tools/doc-formatter.js +208 -0
- package/dist/tools/doc-formatter.js.map +1 -0
- package/dist/tools/find-similar-apis.d.ts +5 -0
- package/dist/tools/find-similar-apis.d.ts.map +1 -0
- package/dist/tools/find-similar-apis.js +275 -0
- package/dist/tools/find-similar-apis.js.map +1 -0
- package/dist/tools/get-documentation-updates.d.ts +5 -0
- package/dist/tools/get-documentation-updates.d.ts.map +1 -0
- package/dist/tools/get-documentation-updates.js +244 -0
- package/dist/tools/get-documentation-updates.js.map +1 -0
- package/dist/tools/get-platform-compatibility.d.ts +5 -0
- package/dist/tools/get-platform-compatibility.d.ts.map +1 -0
- package/dist/tools/get-platform-compatibility.js +205 -0
- package/dist/tools/get-platform-compatibility.js.map +1 -0
- package/dist/tools/get-related-apis.d.ts +5 -0
- package/dist/tools/get-related-apis.d.ts.map +1 -0
- package/dist/tools/get-related-apis.js +155 -0
- package/dist/tools/get-related-apis.js.map +1 -0
- package/dist/tools/get-sample-code.d.ts +5 -0
- package/dist/tools/get-sample-code.d.ts.map +1 -0
- package/dist/tools/get-sample-code.js +375 -0
- package/dist/tools/get-sample-code.js.map +1 -0
- package/dist/tools/get-technology-overviews.d.ts +5 -0
- package/dist/tools/get-technology-overviews.d.ts.map +1 -0
- package/dist/tools/get-technology-overviews.js +306 -0
- package/dist/tools/get-technology-overviews.js.map +1 -0
- package/dist/tools/handlers.d.ts +29 -0
- package/dist/tools/handlers.d.ts.map +1 -0
- package/dist/tools/handlers.js +350 -0
- package/dist/tools/handlers.js.map +1 -0
- package/dist/tools/list-technologies.d.ts +5 -0
- package/dist/tools/list-technologies.d.ts.map +1 -0
- package/dist/tools/list-technologies.js +165 -0
- package/dist/tools/list-technologies.js.map +1 -0
- package/dist/tools/resolve-references-batch.d.ts +5 -0
- package/dist/tools/resolve-references-batch.d.ts.map +1 -0
- package/dist/tools/resolve-references-batch.js +199 -0
- package/dist/tools/resolve-references-batch.js.map +1 -0
- package/dist/tools/search-framework-symbols.d.ts +7 -0
- package/dist/tools/search-framework-symbols.d.ts.map +1 -0
- package/dist/tools/search-framework-symbols.js +235 -0
- package/dist/tools/search-framework-symbols.js.map +1 -0
- package/dist/tools/search-parser.d.ts +15 -0
- package/dist/tools/search-parser.d.ts.map +1 -0
- package/dist/tools/search-parser.js +188 -0
- package/dist/tools/search-parser.js.map +1 -0
- package/dist/tools/search-result-parser.d.ts +52 -0
- package/dist/tools/search-result-parser.d.ts.map +1 -0
- package/dist/tools/search-result-parser.js +137 -0
- package/dist/tools/search-result-parser.js.map +1 -0
- package/dist/tools/tools-guide.d.ts +124 -0
- package/dist/tools/tools-guide.d.ts.map +1 -0
- package/dist/tools/tools-guide.js +389 -0
- package/dist/tools/tools-guide.js.map +1 -0
- package/dist/tools/wwdc/content-extractor.d.ts +9 -0
- package/dist/tools/wwdc/content-extractor.d.ts.map +1 -0
- package/dist/tools/wwdc/content-extractor.js +520 -0
- package/dist/tools/wwdc/content-extractor.js.map +1 -0
- package/dist/tools/wwdc/topics-extractor.d.ts +32 -0
- package/dist/tools/wwdc/topics-extractor.d.ts.map +1 -0
- package/dist/tools/wwdc/topics-extractor.js +146 -0
- package/dist/tools/wwdc/topics-extractor.js.map +1 -0
- package/dist/tools/wwdc/video-list-extractor.d.ts +13 -0
- package/dist/tools/wwdc/video-list-extractor.d.ts.map +1 -0
- package/dist/tools/wwdc/video-list-extractor.js +238 -0
- package/dist/tools/wwdc/video-list-extractor.js.map +1 -0
- package/dist/tools/wwdc/wwdc-handlers.d.ts +32 -0
- package/dist/tools/wwdc/wwdc-handlers.d.ts.map +1 -0
- package/dist/tools/wwdc/wwdc-handlers.js +791 -0
- package/dist/tools/wwdc/wwdc-handlers.js.map +1 -0
- package/dist/types/apple-docs.d.ts +112 -0
- package/dist/types/apple-docs.d.ts.map +1 -0
- package/dist/types/apple-docs.js +5 -0
- package/dist/types/apple-docs.js.map +1 -0
- package/dist/types/cache.d.ts +28 -0
- package/dist/types/cache.d.ts.map +1 -0
- package/dist/types/cache.js +5 -0
- package/dist/types/cache.js.map +1 -0
- package/dist/types/content-sections.d.ts +37 -0
- package/dist/types/content-sections.d.ts.map +1 -0
- package/dist/types/content-sections.js +5 -0
- package/dist/types/content-sections.js.map +1 -0
- package/dist/types/error.d.ts +39 -0
- package/dist/types/error.d.ts.map +1 -0
- package/dist/types/error.js +21 -0
- package/dist/types/error.js.map +1 -0
- package/dist/types/headers.d.ts +95 -0
- package/dist/types/headers.d.ts.map +1 -0
- package/dist/types/headers.js +5 -0
- package/dist/types/headers.js.map +1 -0
- package/dist/types/http.d.ts +31 -0
- package/dist/types/http.d.ts.map +1 -0
- package/dist/types/http.js +5 -0
- package/dist/types/http.js.map +1 -0
- package/dist/types/index.d.ts +11 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +12 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/search.d.ts +62 -0
- package/dist/types/search.d.ts.map +1 -0
- package/dist/types/search.js +5 -0
- package/dist/types/search.js.map +1 -0
- package/dist/types/sections.d.ts +64 -0
- package/dist/types/sections.d.ts.map +1 -0
- package/dist/types/sections.js +5 -0
- package/dist/types/sections.js.map +1 -0
- package/dist/types/tools/platform.d.ts +33 -0
- package/dist/types/tools/platform.d.ts.map +1 -0
- package/dist/types/tools/platform.js +5 -0
- package/dist/types/tools/platform.js.map +1 -0
- package/dist/types/tools/sample-code.d.ts +23 -0
- package/dist/types/tools/sample-code.d.ts.map +1 -0
- package/dist/types/tools/sample-code.js +5 -0
- package/dist/types/tools/sample-code.js.map +1 -0
- package/dist/types/tools/technology.d.ts +18 -0
- package/dist/types/tools/technology.d.ts.map +1 -0
- package/dist/types/tools/technology.js +5 -0
- package/dist/types/tools/technology.js.map +1 -0
- package/dist/types/tools/updates.d.ts +23 -0
- package/dist/types/tools/updates.d.ts.map +1 -0
- package/dist/types/tools/updates.js +5 -0
- package/dist/types/tools/updates.js.map +1 -0
- package/dist/types/wwdc.d.ts +200 -0
- package/dist/types/wwdc.d.ts.map +1 -0
- package/dist/types/wwdc.js +5 -0
- package/dist/types/wwdc.js.map +1 -0
- package/dist/utils/cache-warmer.d.ts +22 -0
- package/dist/utils/cache-warmer.d.ts.map +1 -0
- package/dist/utils/cache-warmer.js +115 -0
- package/dist/utils/cache-warmer.js.map +1 -0
- package/dist/utils/cache.d.ts +109 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +302 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/constants.d.ts +178 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +266 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/error-handler.d.ts +80 -0
- package/dist/utils/error-handler.d.ts.map +1 -0
- package/dist/utils/error-handler.js +437 -0
- package/dist/utils/error-handler.js.map +1 -0
- package/dist/utils/framework-mapper.d.ts +84 -0
- package/dist/utils/framework-mapper.d.ts.map +1 -0
- package/dist/utils/framework-mapper.js +534 -0
- package/dist/utils/framework-mapper.js.map +1 -0
- package/dist/utils/http-client.d.ts +130 -0
- package/dist/utils/http-client.d.ts.map +1 -0
- package/dist/utils/http-client.js +464 -0
- package/dist/utils/http-client.js.map +1 -0
- package/dist/utils/http-headers-generator.d.ts +151 -0
- package/dist/utils/http-headers-generator.d.ts.map +1 -0
- package/dist/utils/http-headers-generator.js +407 -0
- package/dist/utils/http-headers-generator.js.map +1 -0
- package/dist/utils/logger.d.ts +44 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +73 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/preloader.d.ts +20 -0
- package/dist/utils/preloader.d.ts.map +1 -0
- package/dist/utils/preloader.js +82 -0
- package/dist/utils/preloader.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts +28 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +48 -0
- package/dist/utils/rate-limiter.js.map +1 -0
- package/dist/utils/topic-mapper.d.ts +18 -0
- package/dist/utils/topic-mapper.d.ts.map +1 -0
- package/dist/utils/topic-mapper.js +182 -0
- package/dist/utils/topic-mapper.js.map +1 -0
- package/dist/utils/url-converter.d.ts +22 -0
- package/dist/utils/url-converter.d.ts.map +1 -0
- package/dist/utils/url-converter.js +70 -0
- package/dist/utils/url-converter.js.map +1 -0
- package/dist/utils/user-agent-pool.d.ts +241 -0
- package/dist/utils/user-agent-pool.d.ts.map +1 -0
- package/dist/utils/user-agent-pool.js +557 -0
- package/dist/utils/user-agent-pool.js.map +1 -0
- package/dist/utils/wwdc-data-source-path.d.ts +9 -0
- package/dist/utils/wwdc-data-source-path.d.ts.map +1 -0
- package/dist/utils/wwdc-data-source-path.js +22 -0
- package/dist/utils/wwdc-data-source-path.js.map +1 -0
- package/dist/utils/wwdc-data-source.d.ts +36 -0
- package/dist/utils/wwdc-data-source.d.ts.map +1 -0
- package/dist/utils/wwdc-data-source.js +133 -0
- package/dist/utils/wwdc-data-source.js.map +1 -0
- package/package.json +83 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enhanced HTTP client with intelligent User-Agent rotation and browser-compatible headers
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - Smart User-Agent pool rotation with automatic failure recovery
|
|
6
|
+
* - Dynamic browser headers generation (Accept, Accept-Language, etc.)
|
|
7
|
+
* - Comprehensive retry logic with exponential backoff
|
|
8
|
+
* - Performance tracking and statistics collection
|
|
9
|
+
* - Rate limiting integration
|
|
10
|
+
* - Request timeout and error handling
|
|
11
|
+
*
|
|
12
|
+
* The client automatically rotates through a pool of Safari User-Agents and generates
|
|
13
|
+
* realistic browser headers to avoid detection and improve API reliability.
|
|
14
|
+
*
|
|
15
|
+
* @author Apple Docs MCP
|
|
16
|
+
* @version 1.0.0
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Configuration options for HTTP requests
|
|
20
|
+
*/
|
|
21
|
+
interface RequestOptions {
|
|
22
|
+
/** Request timeout in milliseconds */
|
|
23
|
+
timeout?: number;
|
|
24
|
+
/** Maximum number of retry attempts */
|
|
25
|
+
retries?: number;
|
|
26
|
+
/** Delay between retries in milliseconds */
|
|
27
|
+
retryDelay?: number;
|
|
28
|
+
/** Additional headers to include in the request */
|
|
29
|
+
headers?: Record<string, string>;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Performance statistics for HTTP client monitoring
|
|
33
|
+
*/
|
|
34
|
+
interface PerformanceStats {
|
|
35
|
+
/** Total number of requests made */
|
|
36
|
+
totalRequests: number;
|
|
37
|
+
/** Number of successful requests (2xx status) */
|
|
38
|
+
successfulRequests: number;
|
|
39
|
+
/** Number of failed requests */
|
|
40
|
+
failedRequests: number;
|
|
41
|
+
/** Total response time across all requests */
|
|
42
|
+
totalResponseTime: number;
|
|
43
|
+
/** Average response time per request */
|
|
44
|
+
averageResponseTime: number;
|
|
45
|
+
/** Success rate as a percentage (0-100) */
|
|
46
|
+
successRate: number;
|
|
47
|
+
/** Request count by HTTP status code */
|
|
48
|
+
requestsByStatus: Record<number, number>;
|
|
49
|
+
/** Request count by domain */
|
|
50
|
+
requestsByDomain: Record<string, number>;
|
|
51
|
+
}
|
|
52
|
+
declare class HttpClient {
|
|
53
|
+
private requestQueue;
|
|
54
|
+
private activeRequests;
|
|
55
|
+
private readonly maxConcurrentRequests;
|
|
56
|
+
private stats;
|
|
57
|
+
/**
|
|
58
|
+
* Make a GET request with timeout, retry logic, and browser-compatible headers
|
|
59
|
+
* Uses rotating User-Agent and matching headers for better request distribution
|
|
60
|
+
*/
|
|
61
|
+
get(url: string, options?: RequestOptions): Promise<Response>;
|
|
62
|
+
/**
|
|
63
|
+
* Execute request with concurrency control
|
|
64
|
+
*/
|
|
65
|
+
private executeWithQueue;
|
|
66
|
+
/**
|
|
67
|
+
* Fetch with retry logic, performance monitoring, and User-Agent rotation
|
|
68
|
+
* Each retry attempt uses a fresh User-Agent from the pool
|
|
69
|
+
*/
|
|
70
|
+
private fetchWithRetry;
|
|
71
|
+
/**
|
|
72
|
+
* Update performance statistics
|
|
73
|
+
*/
|
|
74
|
+
private updateStats;
|
|
75
|
+
/**
|
|
76
|
+
* Generate request headers with User-Agent rotation and browser compatibility
|
|
77
|
+
*/
|
|
78
|
+
private generateRequestHeaders;
|
|
79
|
+
/**
|
|
80
|
+
* Delay utility
|
|
81
|
+
*/
|
|
82
|
+
private delay;
|
|
83
|
+
/**
|
|
84
|
+
* Get JSON response with error handling
|
|
85
|
+
*/
|
|
86
|
+
getJson<T = unknown>(url: string, options?: RequestOptions): Promise<T>;
|
|
87
|
+
/**
|
|
88
|
+
* Get text response with error handling
|
|
89
|
+
*/
|
|
90
|
+
getText(url: string, options?: RequestOptions): Promise<string>;
|
|
91
|
+
/**
|
|
92
|
+
* Get current queue status
|
|
93
|
+
*/
|
|
94
|
+
getStatus(): {
|
|
95
|
+
activeRequests: number;
|
|
96
|
+
queuedRequests: number;
|
|
97
|
+
maxConcurrent: 5;
|
|
98
|
+
};
|
|
99
|
+
/**
|
|
100
|
+
* Get performance statistics
|
|
101
|
+
*/
|
|
102
|
+
getPerformanceStats(): PerformanceStats;
|
|
103
|
+
/**
|
|
104
|
+
* Get User-Agent pool statistics
|
|
105
|
+
*/
|
|
106
|
+
getUserAgentPoolStats(): {
|
|
107
|
+
readonly enabled: false;
|
|
108
|
+
readonly reason: "User-Agent pool initialization failed";
|
|
109
|
+
readonly fallbackAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36";
|
|
110
|
+
readonly poolStats?: undefined;
|
|
111
|
+
readonly agentStats?: undefined;
|
|
112
|
+
} | {
|
|
113
|
+
readonly enabled: true;
|
|
114
|
+
readonly poolStats: import("./user-agent-pool.js").PoolStats;
|
|
115
|
+
readonly agentStats: import("./user-agent-pool.js").AgentStats[];
|
|
116
|
+
readonly reason?: undefined;
|
|
117
|
+
readonly fallbackAgent?: undefined;
|
|
118
|
+
};
|
|
119
|
+
/**
|
|
120
|
+
* Reset performance statistics
|
|
121
|
+
*/
|
|
122
|
+
resetStats(): void;
|
|
123
|
+
/**
|
|
124
|
+
* Get formatted performance report
|
|
125
|
+
*/
|
|
126
|
+
getPerformanceReport(): string;
|
|
127
|
+
}
|
|
128
|
+
export declare const httpClient: HttpClient;
|
|
129
|
+
export {};
|
|
130
|
+
//# sourceMappingURL=http-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../../src/utils/http-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AASH;;GAEG;AACH,UAAU,cAAc;IACtB,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,UAAU,gBAAgB;IACxB,oCAAoC;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,iDAAiD;IACjD,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gCAAgC;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,8CAA8C;IAC9C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,wCAAwC;IACxC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,2CAA2C;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,8BAA8B;IAC9B,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1C;AA0DD,cAAM,UAAU;IACd,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAA0C;IAGhF,OAAO,CAAC,KAAK,CASX;IAEF;;;OAGG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAyBvE;;OAEG;YACW,gBAAgB;IA6B9B;;;OAGG;YACW,cAAc;IA0F5B;;OAEG;IACH,OAAO,CAAC,WAAW;IAgBnB;;OAEG;YACW,sBAAsB;IAmDpC;;OAEG;IACH,OAAO,CAAC,KAAK;IAIb;;OAEG;IACG,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,CAAC,CAAC;IAUjF;;OAEG;IACG,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,MAAM,CAAC;IAmCzE;;OAEG;IACH,SAAS;;;;;IAQT;;OAEG;IACH,mBAAmB,IAAI,gBAAgB;IAIvC;;OAEG;IACH,qBAAqB;;;;;;;;;;;;;IAiBrB;;OAEG;IACH,UAAU,IAAI,IAAI;IAalB;;OAEG;IACH,oBAAoB,IAAI,MAAM;CA4F/B;AAGD,eAAO,MAAM,UAAU,YAAmB,CAAC"}
|
|
@@ -0,0 +1,464 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enhanced HTTP client with intelligent User-Agent rotation and browser-compatible headers
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - Smart User-Agent pool rotation with automatic failure recovery
|
|
6
|
+
* - Dynamic browser headers generation (Accept, Accept-Language, etc.)
|
|
7
|
+
* - Comprehensive retry logic with exponential backoff
|
|
8
|
+
* - Performance tracking and statistics collection
|
|
9
|
+
* - Rate limiting integration
|
|
10
|
+
* - Request timeout and error handling
|
|
11
|
+
*
|
|
12
|
+
* The client automatically rotates through a pool of Safari User-Agents and generates
|
|
13
|
+
* realistic browser headers to avoid detection and improve API reliability.
|
|
14
|
+
*
|
|
15
|
+
* @author Apple Docs MCP
|
|
16
|
+
* @version 1.0.0
|
|
17
|
+
*/
|
|
18
|
+
import { REQUEST_CONFIG, ERROR_MESSAGES, PROCESSING_LIMITS, SAFARI_USER_AGENTS } from './constants.js';
|
|
19
|
+
import { handleFetchError } from './error-handler.js';
|
|
20
|
+
import { globalRateLimiter } from './rate-limiter.js';
|
|
21
|
+
import { UserAgentPool } from './user-agent-pool.js';
|
|
22
|
+
import { HttpHeadersGenerator } from './http-headers-generator.js';
|
|
23
|
+
// Global User-Agent pool instance
|
|
24
|
+
let userAgentPool = null;
|
|
25
|
+
// Global HTTP headers generator instance
|
|
26
|
+
let headersGenerator = null;
|
|
27
|
+
/**
|
|
28
|
+
* Initialize the User-Agent pool with Safari User-Agents
|
|
29
|
+
* Falls back to static User-Agent if initialization fails
|
|
30
|
+
*/
|
|
31
|
+
function initializeUserAgentPool() {
|
|
32
|
+
if (userAgentPool) {
|
|
33
|
+
return userAgentPool;
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
userAgentPool = new UserAgentPool([...SAFARI_USER_AGENTS], {
|
|
37
|
+
strategy: 'random',
|
|
38
|
+
disableDuration: 5 * 60 * 1000, // 5 minutes
|
|
39
|
+
failureThreshold: 3,
|
|
40
|
+
minSuccessRate: 0.5,
|
|
41
|
+
});
|
|
42
|
+
return userAgentPool;
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
// Fallback: Pool initialization failed, will use static User-Agent
|
|
46
|
+
console.warn('UserAgentPool initialization failed, falling back to static User-Agent:', error);
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Initialize the HTTP headers generator
|
|
52
|
+
* Falls back to basic headers if initialization fails
|
|
53
|
+
*/
|
|
54
|
+
function initializeHeadersGenerator() {
|
|
55
|
+
if (headersGenerator) {
|
|
56
|
+
return headersGenerator;
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
// Check environment variables for configuration
|
|
60
|
+
const config = {
|
|
61
|
+
enableSecFetch: process.env.DISABLE_SEC_FETCH !== 'true',
|
|
62
|
+
enableDNT: process.env.DISABLE_DNT !== 'true',
|
|
63
|
+
languageRotation: process.env.DISABLE_LANGUAGE_ROTATION !== 'true',
|
|
64
|
+
simpleMode: process.env.SIMPLE_HEADERS_MODE === 'true',
|
|
65
|
+
defaultAcceptLanguage: process.env.DEFAULT_ACCEPT_LANGUAGE || 'en-US,en;q=0.9',
|
|
66
|
+
};
|
|
67
|
+
headersGenerator = HttpHeadersGenerator.getInstance(config);
|
|
68
|
+
return headersGenerator;
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
console.warn('HttpHeadersGenerator initialization failed, falling back to basic headers:', error);
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
class HttpClient {
|
|
76
|
+
requestQueue = [];
|
|
77
|
+
activeRequests = 0;
|
|
78
|
+
maxConcurrentRequests = REQUEST_CONFIG.MAX_CONCURRENT_REQUESTS;
|
|
79
|
+
// Performance monitoring
|
|
80
|
+
stats = {
|
|
81
|
+
totalRequests: 0,
|
|
82
|
+
successfulRequests: 0,
|
|
83
|
+
failedRequests: 0,
|
|
84
|
+
totalResponseTime: 0,
|
|
85
|
+
averageResponseTime: 0,
|
|
86
|
+
successRate: 0,
|
|
87
|
+
requestsByStatus: {},
|
|
88
|
+
requestsByDomain: {},
|
|
89
|
+
};
|
|
90
|
+
/**
|
|
91
|
+
* Make a GET request with timeout, retry logic, and browser-compatible headers
|
|
92
|
+
* Uses rotating User-Agent and matching headers for better request distribution
|
|
93
|
+
*/
|
|
94
|
+
async get(url, options = {}) {
|
|
95
|
+
const { timeout = REQUEST_CONFIG.TIMEOUT, retries = REQUEST_CONFIG.MAX_RETRIES, retryDelay = REQUEST_CONFIG.RETRY_DELAY, headers = {}, } = options;
|
|
96
|
+
return this.executeWithQueue(async () => {
|
|
97
|
+
// Check rate limit
|
|
98
|
+
if (!globalRateLimiter.canMakeRequest()) {
|
|
99
|
+
throw new Error('Rate limit exceeded. Please try again later.');
|
|
100
|
+
}
|
|
101
|
+
// Generate headers with User-Agent rotation
|
|
102
|
+
const requestHeaders = await this.generateRequestHeaders(headers, 'application/json');
|
|
103
|
+
return this.fetchWithRetry(url, {
|
|
104
|
+
method: 'GET',
|
|
105
|
+
headers: requestHeaders,
|
|
106
|
+
signal: AbortSignal.timeout(timeout),
|
|
107
|
+
}, retries, retryDelay);
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Execute request with concurrency control
|
|
112
|
+
*/
|
|
113
|
+
async executeWithQueue(requestFn) {
|
|
114
|
+
return new Promise((resolve, reject) => {
|
|
115
|
+
const execute = async () => {
|
|
116
|
+
if (this.activeRequests >= this.maxConcurrentRequests) {
|
|
117
|
+
// Add to queue
|
|
118
|
+
this.requestQueue.push(execute);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
this.activeRequests++;
|
|
122
|
+
try {
|
|
123
|
+
const result = await requestFn();
|
|
124
|
+
resolve(result);
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
reject(error);
|
|
128
|
+
}
|
|
129
|
+
finally {
|
|
130
|
+
this.activeRequests--;
|
|
131
|
+
// Process next request in queue
|
|
132
|
+
const nextRequest = this.requestQueue.shift();
|
|
133
|
+
if (nextRequest) {
|
|
134
|
+
void nextRequest();
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
void execute();
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Fetch with retry logic, performance monitoring, and User-Agent rotation
|
|
143
|
+
* Each retry attempt uses a fresh User-Agent from the pool
|
|
144
|
+
*/
|
|
145
|
+
async fetchWithRetry(url, options, retries, retryDelay) {
|
|
146
|
+
const startTime = Date.now();
|
|
147
|
+
const domain = new URL(url).hostname;
|
|
148
|
+
let lastError = null;
|
|
149
|
+
let currentUserAgent = null;
|
|
150
|
+
// Update domain stats
|
|
151
|
+
this.stats.requestsByDomain[domain] = (this.stats.requestsByDomain[domain] || 0) + 1;
|
|
152
|
+
this.stats.totalRequests++;
|
|
153
|
+
// Initialize User-Agent pool
|
|
154
|
+
const pool = initializeUserAgentPool();
|
|
155
|
+
for (let attempt = 0; attempt <= retries; attempt++) {
|
|
156
|
+
try {
|
|
157
|
+
// Extract current User-Agent from pre-generated headers
|
|
158
|
+
currentUserAgent = options.headers?.['User-Agent'] || null;
|
|
159
|
+
const response = await fetch(url, options);
|
|
160
|
+
const responseTime = Date.now() - startTime;
|
|
161
|
+
// Update performance stats only if response is valid
|
|
162
|
+
if (response) {
|
|
163
|
+
this.updateStats(response.status, responseTime, true);
|
|
164
|
+
}
|
|
165
|
+
// Mark User-Agent success/failure in pool
|
|
166
|
+
if (pool && currentUserAgent) {
|
|
167
|
+
if (response?.ok) {
|
|
168
|
+
await pool.markSuccess(currentUserAgent);
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
await pool.markFailure(currentUserAgent, response?.status);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
if (!response?.ok) {
|
|
175
|
+
if (response && response.status === 404) {
|
|
176
|
+
throw new Error(`${ERROR_MESSAGES.NOT_FOUND} (${response.status})`);
|
|
177
|
+
}
|
|
178
|
+
if (response && response.status >= 500 && attempt < retries) {
|
|
179
|
+
// Retry on server errors
|
|
180
|
+
throw new Error(`Server error: ${response.status}`);
|
|
181
|
+
}
|
|
182
|
+
const status = response ? response.status : 'unknown';
|
|
183
|
+
const statusText = response ? response.statusText : 'No response';
|
|
184
|
+
throw new Error(`HTTP ${status}: ${statusText}`);
|
|
185
|
+
}
|
|
186
|
+
return response;
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
190
|
+
// Mark User-Agent failure in pool
|
|
191
|
+
if (pool && currentUserAgent) {
|
|
192
|
+
// Extract status code from error if available
|
|
193
|
+
const statusMatch = lastError.message.match(/HTTP (\d+):/);
|
|
194
|
+
const statusCode = statusMatch ? parseInt(statusMatch[1], 10) : undefined;
|
|
195
|
+
await pool.markFailure(currentUserAgent, statusCode);
|
|
196
|
+
}
|
|
197
|
+
// Don't retry on certain errors
|
|
198
|
+
if (error instanceof Error) {
|
|
199
|
+
if (error.name === 'AbortError') {
|
|
200
|
+
throw new Error(ERROR_MESSAGES.TIMEOUT);
|
|
201
|
+
}
|
|
202
|
+
if (error.message.includes('404')) {
|
|
203
|
+
throw error; // Don't retry 404s
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
// Wait before retry (except on last attempt)
|
|
207
|
+
if (attempt < retries) {
|
|
208
|
+
await this.delay(retryDelay * Math.pow(2, attempt)); // Exponential backoff
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// Update stats for failed request
|
|
213
|
+
const responseTime = Date.now() - startTime;
|
|
214
|
+
this.updateStats(0, responseTime, false);
|
|
215
|
+
throw lastError ?? new Error('Request failed after retries');
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Update performance statistics
|
|
219
|
+
*/
|
|
220
|
+
updateStats(statusCode, responseTime, success) {
|
|
221
|
+
if (success) {
|
|
222
|
+
this.stats.successfulRequests++;
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
this.stats.failedRequests++;
|
|
226
|
+
}
|
|
227
|
+
this.stats.totalResponseTime += responseTime;
|
|
228
|
+
this.stats.averageResponseTime = this.stats.totalResponseTime / this.stats.totalRequests;
|
|
229
|
+
this.stats.successRate = (this.stats.successfulRequests / this.stats.totalRequests) * 100;
|
|
230
|
+
if (statusCode > 0) {
|
|
231
|
+
this.stats.requestsByStatus[statusCode] = (this.stats.requestsByStatus[statusCode] || 0) + 1;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Generate request headers with User-Agent rotation and browser compatibility
|
|
236
|
+
*/
|
|
237
|
+
async generateRequestHeaders(customHeaders = {}, acceptOverride) {
|
|
238
|
+
let requestHeaders = {};
|
|
239
|
+
try {
|
|
240
|
+
// Initialize User-Agent pool and headers generator
|
|
241
|
+
const pool = initializeUserAgentPool();
|
|
242
|
+
const generator = initializeHeadersGenerator();
|
|
243
|
+
if (pool && generator) {
|
|
244
|
+
// Get next User-Agent with enhanced info
|
|
245
|
+
const userAgent = await pool.getNextUserAgent();
|
|
246
|
+
// Generate matching headers
|
|
247
|
+
const generatedHeaders = generator.generateHeaders(userAgent);
|
|
248
|
+
requestHeaders = { ...generatedHeaders };
|
|
249
|
+
// Update pool statistics on response
|
|
250
|
+
// Note: This is handled in fetchWithRetry error handling
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
// Fallback to basic headers
|
|
254
|
+
requestHeaders = {
|
|
255
|
+
'User-Agent': REQUEST_CONFIG.DEFAULT_SAFARI_USER_AGENT || REQUEST_CONFIG.USER_AGENT,
|
|
256
|
+
'Accept': acceptOverride || 'application/json',
|
|
257
|
+
'Accept-Encoding': 'gzip, deflate, br',
|
|
258
|
+
'Accept-Language': 'en-US,en;q=0.9',
|
|
259
|
+
'DNT': '1',
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
catch (error) {
|
|
264
|
+
// Fallback to basic headers on any error
|
|
265
|
+
console.warn('Failed to generate enhanced headers, falling back to basic:', error);
|
|
266
|
+
requestHeaders = {
|
|
267
|
+
'User-Agent': REQUEST_CONFIG.DEFAULT_SAFARI_USER_AGENT || REQUEST_CONFIG.USER_AGENT,
|
|
268
|
+
'Accept': acceptOverride || 'application/json',
|
|
269
|
+
'Accept-Encoding': 'gzip, deflate',
|
|
270
|
+
'Accept-Language': 'en-US,en;q=0.9',
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
// Override Accept header if specified
|
|
274
|
+
if (acceptOverride) {
|
|
275
|
+
requestHeaders['Accept'] = acceptOverride;
|
|
276
|
+
}
|
|
277
|
+
// Apply custom headers (highest priority)
|
|
278
|
+
return { ...requestHeaders, ...customHeaders };
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Delay utility
|
|
282
|
+
*/
|
|
283
|
+
delay(ms) {
|
|
284
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Get JSON response with error handling
|
|
288
|
+
*/
|
|
289
|
+
async getJson(url, options = {}) {
|
|
290
|
+
try {
|
|
291
|
+
const response = await this.get(url, options);
|
|
292
|
+
return await response.json();
|
|
293
|
+
}
|
|
294
|
+
catch (error) {
|
|
295
|
+
const appError = handleFetchError(error, url);
|
|
296
|
+
throw appError;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Get text response with error handling
|
|
301
|
+
*/
|
|
302
|
+
async getText(url, options = {}) {
|
|
303
|
+
const { timeout = REQUEST_CONFIG.TIMEOUT, retries = REQUEST_CONFIG.MAX_RETRIES, retryDelay = REQUEST_CONFIG.RETRY_DELAY, headers = {}, } = options;
|
|
304
|
+
try {
|
|
305
|
+
return this.executeWithQueue(async () => {
|
|
306
|
+
// Check rate limit
|
|
307
|
+
if (!globalRateLimiter.canMakeRequest()) {
|
|
308
|
+
throw new Error('Rate limit exceeded. Please try again later.');
|
|
309
|
+
}
|
|
310
|
+
// Generate headers with HTML Accept type
|
|
311
|
+
const requestHeaders = await this.generateRequestHeaders(headers, 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');
|
|
312
|
+
const response = await this.fetchWithRetry(url, {
|
|
313
|
+
method: 'GET',
|
|
314
|
+
headers: requestHeaders,
|
|
315
|
+
signal: AbortSignal.timeout(timeout),
|
|
316
|
+
}, retries, retryDelay);
|
|
317
|
+
return await response.text();
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
catch (error) {
|
|
321
|
+
const appError = handleFetchError(error, url);
|
|
322
|
+
throw appError;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Get current queue status
|
|
327
|
+
*/
|
|
328
|
+
getStatus() {
|
|
329
|
+
return {
|
|
330
|
+
activeRequests: this.activeRequests,
|
|
331
|
+
queuedRequests: this.requestQueue.length,
|
|
332
|
+
maxConcurrent: this.maxConcurrentRequests,
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Get performance statistics
|
|
337
|
+
*/
|
|
338
|
+
getPerformanceStats() {
|
|
339
|
+
return { ...this.stats };
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Get User-Agent pool statistics
|
|
343
|
+
*/
|
|
344
|
+
getUserAgentPoolStats() {
|
|
345
|
+
const pool = initializeUserAgentPool();
|
|
346
|
+
if (!pool) {
|
|
347
|
+
return {
|
|
348
|
+
enabled: false,
|
|
349
|
+
reason: 'User-Agent pool initialization failed',
|
|
350
|
+
fallbackAgent: REQUEST_CONFIG.USER_AGENT,
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
return {
|
|
354
|
+
enabled: true,
|
|
355
|
+
poolStats: pool.getStats(),
|
|
356
|
+
agentStats: pool.getAgentStats(),
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Reset performance statistics
|
|
361
|
+
*/
|
|
362
|
+
resetStats() {
|
|
363
|
+
this.stats = {
|
|
364
|
+
totalRequests: 0,
|
|
365
|
+
successfulRequests: 0,
|
|
366
|
+
failedRequests: 0,
|
|
367
|
+
totalResponseTime: 0,
|
|
368
|
+
averageResponseTime: 0,
|
|
369
|
+
successRate: 0,
|
|
370
|
+
requestsByStatus: {},
|
|
371
|
+
requestsByDomain: {},
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Get formatted performance report
|
|
376
|
+
*/
|
|
377
|
+
getPerformanceReport() {
|
|
378
|
+
const stats = this.getPerformanceStats();
|
|
379
|
+
let report = '# HTTP Client Performance Report\n\n';
|
|
380
|
+
// Overall Statistics
|
|
381
|
+
report += '## Overall Statistics\n\n';
|
|
382
|
+
report += `- **Total Requests:** ${stats.totalRequests}\n`;
|
|
383
|
+
report += `- **Successful Requests:** ${stats.successfulRequests}\n`;
|
|
384
|
+
report += `- **Failed Requests:** ${stats.failedRequests}\n`;
|
|
385
|
+
report += `- **Success Rate:** ${stats.successRate.toFixed(2)}%\n`;
|
|
386
|
+
report += `- **Average Response Time:** ${stats.averageResponseTime.toFixed(0)}ms\n\n`;
|
|
387
|
+
// Status Code Distribution
|
|
388
|
+
if (Object.keys(stats.requestsByStatus).length > 0) {
|
|
389
|
+
report += '## Response Status Codes\n\n';
|
|
390
|
+
Object.entries(stats.requestsByStatus)
|
|
391
|
+
.sort(([a], [b]) => parseInt(a) - parseInt(b))
|
|
392
|
+
.forEach(([status, count]) => {
|
|
393
|
+
const percentage = ((count / stats.totalRequests) * 100).toFixed(1);
|
|
394
|
+
report += `- **${status}:** ${count} requests (${percentage}%)\n`;
|
|
395
|
+
});
|
|
396
|
+
report += '\n';
|
|
397
|
+
}
|
|
398
|
+
// Domain Distribution
|
|
399
|
+
if (Object.keys(stats.requestsByDomain).length > 0) {
|
|
400
|
+
report += '## Requests by Domain\n\n';
|
|
401
|
+
Object.entries(stats.requestsByDomain)
|
|
402
|
+
.sort(([, a], [, b]) => b - a)
|
|
403
|
+
.forEach(([domain, count]) => {
|
|
404
|
+
const percentage = ((count / stats.totalRequests) * 100).toFixed(1);
|
|
405
|
+
report += `- **${domain}:** ${count} requests (${percentage}%)\n`;
|
|
406
|
+
});
|
|
407
|
+
report += '\n';
|
|
408
|
+
}
|
|
409
|
+
// User-Agent Pool Status
|
|
410
|
+
const uaPoolStats = this.getUserAgentPoolStats();
|
|
411
|
+
report += '## User-Agent Pool Status\n\n';
|
|
412
|
+
if (uaPoolStats.enabled) {
|
|
413
|
+
const poolStats = uaPoolStats.poolStats;
|
|
414
|
+
const agentStats = uaPoolStats.agentStats;
|
|
415
|
+
report += `✅ **Pool Active** - ${poolStats.enabled}/${poolStats.total} agents enabled\n`;
|
|
416
|
+
report += `- **Total Requests:** ${poolStats.totalRequests}\n`;
|
|
417
|
+
report += `- **Success Rate:** ${poolStats.successRate.toFixed(2)}%\n`;
|
|
418
|
+
report += `- **Health Score:** ${poolStats.healthScore}/100\n`;
|
|
419
|
+
report += `- **Strategy:** ${poolStats.strategy}\n\n`;
|
|
420
|
+
// Top performing agents
|
|
421
|
+
const topAgents = agentStats
|
|
422
|
+
.filter(agent => agent.totalRequests > 0)
|
|
423
|
+
.sort((a, b) => b.successRate - a.successRate)
|
|
424
|
+
.slice(0, 3);
|
|
425
|
+
if (topAgents.length > 0) {
|
|
426
|
+
report += '### Top Performing User-Agents\n\n';
|
|
427
|
+
topAgents.forEach((agent, index) => {
|
|
428
|
+
const shortAgent = agent.value.split(' ').slice(0, 4).join(' ') + '...';
|
|
429
|
+
report += `${index + 1}. ${shortAgent} - ${agent.successRate.toFixed(1)}% (${agent.totalRequests} requests)\n`;
|
|
430
|
+
});
|
|
431
|
+
report += '\n';
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
else {
|
|
435
|
+
report += `❌ **Pool Disabled** - ${uaPoolStats.reason}\n`;
|
|
436
|
+
report += `- **Fallback Agent:** ${uaPoolStats.fallbackAgent}\n\n`;
|
|
437
|
+
}
|
|
438
|
+
// Performance Insights
|
|
439
|
+
report += '## Performance Insights\n\n';
|
|
440
|
+
if (stats.successRate >= 95) {
|
|
441
|
+
report += '✅ **Excellent reliability** - Success rate above 95%\n';
|
|
442
|
+
}
|
|
443
|
+
else if (stats.successRate >= 90) {
|
|
444
|
+
report += '⚠️ **Good reliability** - Success rate above 90%\n';
|
|
445
|
+
}
|
|
446
|
+
else {
|
|
447
|
+
report += '❌ **Poor reliability** - Success rate below 90%\n';
|
|
448
|
+
}
|
|
449
|
+
if (stats.averageResponseTime < PROCESSING_LIMITS.RESPONSE_TIME_GOOD_THRESHOLD) {
|
|
450
|
+
report += '✅ **Fast response times** - Average under 1 second\n';
|
|
451
|
+
}
|
|
452
|
+
else if (stats.averageResponseTime < PROCESSING_LIMITS.RESPONSE_TIME_MODERATE_THRESHOLD) {
|
|
453
|
+
report += '⚠️ **Moderate response times** - Average under 3 seconds\n';
|
|
454
|
+
}
|
|
455
|
+
else {
|
|
456
|
+
report += '❌ **Slow response times** - Average over 3 seconds\n';
|
|
457
|
+
}
|
|
458
|
+
report += `\n*Report generated at ${new Date().toISOString()}*`;
|
|
459
|
+
return report;
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
// Export singleton instance
|
|
463
|
+
export const httpClient = new HttpClient();
|
|
464
|
+
//# sourceMappingURL=http-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../src/utils/http-client.ts"],"names":[],"mappings":"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"}
|