@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.
Files changed (267) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +560 -0
  3. package/dist/constants/browser-headers.d.ts +48 -0
  4. package/dist/constants/browser-headers.d.ts.map +1 -0
  5. package/dist/constants/browser-headers.js +166 -0
  6. package/dist/constants/browser-headers.js.map +1 -0
  7. package/dist/index.d.ts +83 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +215 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/schemas/analyze-api.schema.d.ts +42 -0
  12. package/dist/schemas/analyze-api.schema.d.ts.map +1 -0
  13. package/dist/schemas/analyze-api.schema.js +23 -0
  14. package/dist/schemas/analyze-api.schema.js.map +1 -0
  15. package/dist/schemas/apple-docs.schema.d.ts +18 -0
  16. package/dist/schemas/apple-docs.schema.d.ts.map +1 -0
  17. package/dist/schemas/apple-docs.schema.js +10 -0
  18. package/dist/schemas/apple-docs.schema.js.map +1 -0
  19. package/dist/schemas/doc-content.schema.d.ts +24 -0
  20. package/dist/schemas/doc-content.schema.d.ts.map +1 -0
  21. package/dist/schemas/doc-content.schema.js +10 -0
  22. package/dist/schemas/doc-content.schema.js.map +1 -0
  23. package/dist/schemas/documentation-updates.schema.d.ts +27 -0
  24. package/dist/schemas/documentation-updates.schema.d.ts.map +1 -0
  25. package/dist/schemas/documentation-updates.schema.js +12 -0
  26. package/dist/schemas/documentation-updates.schema.js.map +1 -0
  27. package/dist/schemas/framework-symbols.schema.d.ts +24 -0
  28. package/dist/schemas/framework-symbols.schema.d.ts.map +1 -0
  29. package/dist/schemas/framework-symbols.schema.js +11 -0
  30. package/dist/schemas/framework-symbols.schema.js.map +1 -0
  31. package/dist/schemas/index.d.ts +15 -0
  32. package/dist/schemas/index.d.ts.map +1 -0
  33. package/dist/schemas/index.js +15 -0
  34. package/dist/schemas/index.js.map +1 -0
  35. package/dist/schemas/platform-compatibility.schema.d.ts +18 -0
  36. package/dist/schemas/platform-compatibility.schema.d.ts.map +1 -0
  37. package/dist/schemas/platform-compatibility.schema.js +8 -0
  38. package/dist/schemas/platform-compatibility.schema.js.map +1 -0
  39. package/dist/schemas/references.schema.d.ts +18 -0
  40. package/dist/schemas/references.schema.d.ts.map +1 -0
  41. package/dist/schemas/references.schema.js +9 -0
  42. package/dist/schemas/references.schema.js.map +1 -0
  43. package/dist/schemas/related-apis.schema.d.ts +21 -0
  44. package/dist/schemas/related-apis.schema.d.ts.map +1 -0
  45. package/dist/schemas/related-apis.schema.js +9 -0
  46. package/dist/schemas/related-apis.schema.js.map +1 -0
  47. package/dist/schemas/sample-code.schema.d.ts +21 -0
  48. package/dist/schemas/sample-code.schema.d.ts.map +1 -0
  49. package/dist/schemas/sample-code.schema.js +10 -0
  50. package/dist/schemas/sample-code.schema.js.map +1 -0
  51. package/dist/schemas/search.schema.d.ts +15 -0
  52. package/dist/schemas/search.schema.d.ts.map +1 -0
  53. package/dist/schemas/search.schema.js +8 -0
  54. package/dist/schemas/search.schema.js.map +1 -0
  55. package/dist/schemas/similar-apis.schema.d.ts +21 -0
  56. package/dist/schemas/similar-apis.schema.d.ts.map +1 -0
  57. package/dist/schemas/similar-apis.schema.js +9 -0
  58. package/dist/schemas/similar-apis.schema.js.map +1 -0
  59. package/dist/schemas/technologies.schema.d.ts +21 -0
  60. package/dist/schemas/technologies.schema.d.ts.map +1 -0
  61. package/dist/schemas/technologies.schema.js +10 -0
  62. package/dist/schemas/technologies.schema.js.map +1 -0
  63. package/dist/schemas/technology-overviews.schema.d.ts +24 -0
  64. package/dist/schemas/technology-overviews.schema.d.ts.map +1 -0
  65. package/dist/schemas/technology-overviews.schema.js +11 -0
  66. package/dist/schemas/technology-overviews.schema.js.map +1 -0
  67. package/dist/schemas/wwdc.schemas.d.ts +208 -0
  68. package/dist/schemas/wwdc.schemas.d.ts.map +1 -0
  69. package/dist/schemas/wwdc.schemas.js +97 -0
  70. package/dist/schemas/wwdc.schemas.js.map +1 -0
  71. package/dist/tools/definitions.d.ts +10 -0
  72. package/dist/tools/definitions.d.ts.map +1 -0
  73. package/dist/tools/definitions.js +690 -0
  74. package/dist/tools/definitions.js.map +1 -0
  75. package/dist/tools/doc-fetcher.d.ts +19 -0
  76. package/dist/tools/doc-fetcher.d.ts.map +1 -0
  77. package/dist/tools/doc-fetcher.js +487 -0
  78. package/dist/tools/doc-fetcher.js.map +1 -0
  79. package/dist/tools/doc-formatter.d.ts +69 -0
  80. package/dist/tools/doc-formatter.d.ts.map +1 -0
  81. package/dist/tools/doc-formatter.js +208 -0
  82. package/dist/tools/doc-formatter.js.map +1 -0
  83. package/dist/tools/find-similar-apis.d.ts +5 -0
  84. package/dist/tools/find-similar-apis.d.ts.map +1 -0
  85. package/dist/tools/find-similar-apis.js +275 -0
  86. package/dist/tools/find-similar-apis.js.map +1 -0
  87. package/dist/tools/get-documentation-updates.d.ts +5 -0
  88. package/dist/tools/get-documentation-updates.d.ts.map +1 -0
  89. package/dist/tools/get-documentation-updates.js +244 -0
  90. package/dist/tools/get-documentation-updates.js.map +1 -0
  91. package/dist/tools/get-platform-compatibility.d.ts +5 -0
  92. package/dist/tools/get-platform-compatibility.d.ts.map +1 -0
  93. package/dist/tools/get-platform-compatibility.js +205 -0
  94. package/dist/tools/get-platform-compatibility.js.map +1 -0
  95. package/dist/tools/get-related-apis.d.ts +5 -0
  96. package/dist/tools/get-related-apis.d.ts.map +1 -0
  97. package/dist/tools/get-related-apis.js +155 -0
  98. package/dist/tools/get-related-apis.js.map +1 -0
  99. package/dist/tools/get-sample-code.d.ts +5 -0
  100. package/dist/tools/get-sample-code.d.ts.map +1 -0
  101. package/dist/tools/get-sample-code.js +375 -0
  102. package/dist/tools/get-sample-code.js.map +1 -0
  103. package/dist/tools/get-technology-overviews.d.ts +5 -0
  104. package/dist/tools/get-technology-overviews.d.ts.map +1 -0
  105. package/dist/tools/get-technology-overviews.js +306 -0
  106. package/dist/tools/get-technology-overviews.js.map +1 -0
  107. package/dist/tools/handlers.d.ts +29 -0
  108. package/dist/tools/handlers.d.ts.map +1 -0
  109. package/dist/tools/handlers.js +350 -0
  110. package/dist/tools/handlers.js.map +1 -0
  111. package/dist/tools/list-technologies.d.ts +5 -0
  112. package/dist/tools/list-technologies.d.ts.map +1 -0
  113. package/dist/tools/list-technologies.js +165 -0
  114. package/dist/tools/list-technologies.js.map +1 -0
  115. package/dist/tools/resolve-references-batch.d.ts +5 -0
  116. package/dist/tools/resolve-references-batch.d.ts.map +1 -0
  117. package/dist/tools/resolve-references-batch.js +199 -0
  118. package/dist/tools/resolve-references-batch.js.map +1 -0
  119. package/dist/tools/search-framework-symbols.d.ts +7 -0
  120. package/dist/tools/search-framework-symbols.d.ts.map +1 -0
  121. package/dist/tools/search-framework-symbols.js +235 -0
  122. package/dist/tools/search-framework-symbols.js.map +1 -0
  123. package/dist/tools/search-parser.d.ts +15 -0
  124. package/dist/tools/search-parser.d.ts.map +1 -0
  125. package/dist/tools/search-parser.js +188 -0
  126. package/dist/tools/search-parser.js.map +1 -0
  127. package/dist/tools/search-result-parser.d.ts +52 -0
  128. package/dist/tools/search-result-parser.d.ts.map +1 -0
  129. package/dist/tools/search-result-parser.js +137 -0
  130. package/dist/tools/search-result-parser.js.map +1 -0
  131. package/dist/tools/tools-guide.d.ts +124 -0
  132. package/dist/tools/tools-guide.d.ts.map +1 -0
  133. package/dist/tools/tools-guide.js +389 -0
  134. package/dist/tools/tools-guide.js.map +1 -0
  135. package/dist/tools/wwdc/content-extractor.d.ts +9 -0
  136. package/dist/tools/wwdc/content-extractor.d.ts.map +1 -0
  137. package/dist/tools/wwdc/content-extractor.js +520 -0
  138. package/dist/tools/wwdc/content-extractor.js.map +1 -0
  139. package/dist/tools/wwdc/topics-extractor.d.ts +32 -0
  140. package/dist/tools/wwdc/topics-extractor.d.ts.map +1 -0
  141. package/dist/tools/wwdc/topics-extractor.js +146 -0
  142. package/dist/tools/wwdc/topics-extractor.js.map +1 -0
  143. package/dist/tools/wwdc/video-list-extractor.d.ts +13 -0
  144. package/dist/tools/wwdc/video-list-extractor.d.ts.map +1 -0
  145. package/dist/tools/wwdc/video-list-extractor.js +238 -0
  146. package/dist/tools/wwdc/video-list-extractor.js.map +1 -0
  147. package/dist/tools/wwdc/wwdc-handlers.d.ts +32 -0
  148. package/dist/tools/wwdc/wwdc-handlers.d.ts.map +1 -0
  149. package/dist/tools/wwdc/wwdc-handlers.js +791 -0
  150. package/dist/tools/wwdc/wwdc-handlers.js.map +1 -0
  151. package/dist/types/apple-docs.d.ts +112 -0
  152. package/dist/types/apple-docs.d.ts.map +1 -0
  153. package/dist/types/apple-docs.js +5 -0
  154. package/dist/types/apple-docs.js.map +1 -0
  155. package/dist/types/cache.d.ts +28 -0
  156. package/dist/types/cache.d.ts.map +1 -0
  157. package/dist/types/cache.js +5 -0
  158. package/dist/types/cache.js.map +1 -0
  159. package/dist/types/content-sections.d.ts +37 -0
  160. package/dist/types/content-sections.d.ts.map +1 -0
  161. package/dist/types/content-sections.js +5 -0
  162. package/dist/types/content-sections.js.map +1 -0
  163. package/dist/types/error.d.ts +39 -0
  164. package/dist/types/error.d.ts.map +1 -0
  165. package/dist/types/error.js +21 -0
  166. package/dist/types/error.js.map +1 -0
  167. package/dist/types/headers.d.ts +95 -0
  168. package/dist/types/headers.d.ts.map +1 -0
  169. package/dist/types/headers.js +5 -0
  170. package/dist/types/headers.js.map +1 -0
  171. package/dist/types/http.d.ts +31 -0
  172. package/dist/types/http.d.ts.map +1 -0
  173. package/dist/types/http.js +5 -0
  174. package/dist/types/http.js.map +1 -0
  175. package/dist/types/index.d.ts +11 -0
  176. package/dist/types/index.d.ts.map +1 -0
  177. package/dist/types/index.js +12 -0
  178. package/dist/types/index.js.map +1 -0
  179. package/dist/types/search.d.ts +62 -0
  180. package/dist/types/search.d.ts.map +1 -0
  181. package/dist/types/search.js +5 -0
  182. package/dist/types/search.js.map +1 -0
  183. package/dist/types/sections.d.ts +64 -0
  184. package/dist/types/sections.d.ts.map +1 -0
  185. package/dist/types/sections.js +5 -0
  186. package/dist/types/sections.js.map +1 -0
  187. package/dist/types/tools/platform.d.ts +33 -0
  188. package/dist/types/tools/platform.d.ts.map +1 -0
  189. package/dist/types/tools/platform.js +5 -0
  190. package/dist/types/tools/platform.js.map +1 -0
  191. package/dist/types/tools/sample-code.d.ts +23 -0
  192. package/dist/types/tools/sample-code.d.ts.map +1 -0
  193. package/dist/types/tools/sample-code.js +5 -0
  194. package/dist/types/tools/sample-code.js.map +1 -0
  195. package/dist/types/tools/technology.d.ts +18 -0
  196. package/dist/types/tools/technology.d.ts.map +1 -0
  197. package/dist/types/tools/technology.js +5 -0
  198. package/dist/types/tools/technology.js.map +1 -0
  199. package/dist/types/tools/updates.d.ts +23 -0
  200. package/dist/types/tools/updates.d.ts.map +1 -0
  201. package/dist/types/tools/updates.js +5 -0
  202. package/dist/types/tools/updates.js.map +1 -0
  203. package/dist/types/wwdc.d.ts +200 -0
  204. package/dist/types/wwdc.d.ts.map +1 -0
  205. package/dist/types/wwdc.js +5 -0
  206. package/dist/types/wwdc.js.map +1 -0
  207. package/dist/utils/cache-warmer.d.ts +22 -0
  208. package/dist/utils/cache-warmer.d.ts.map +1 -0
  209. package/dist/utils/cache-warmer.js +115 -0
  210. package/dist/utils/cache-warmer.js.map +1 -0
  211. package/dist/utils/cache.d.ts +109 -0
  212. package/dist/utils/cache.d.ts.map +1 -0
  213. package/dist/utils/cache.js +302 -0
  214. package/dist/utils/cache.js.map +1 -0
  215. package/dist/utils/constants.d.ts +178 -0
  216. package/dist/utils/constants.d.ts.map +1 -0
  217. package/dist/utils/constants.js +266 -0
  218. package/dist/utils/constants.js.map +1 -0
  219. package/dist/utils/error-handler.d.ts +80 -0
  220. package/dist/utils/error-handler.d.ts.map +1 -0
  221. package/dist/utils/error-handler.js +437 -0
  222. package/dist/utils/error-handler.js.map +1 -0
  223. package/dist/utils/framework-mapper.d.ts +84 -0
  224. package/dist/utils/framework-mapper.d.ts.map +1 -0
  225. package/dist/utils/framework-mapper.js +534 -0
  226. package/dist/utils/framework-mapper.js.map +1 -0
  227. package/dist/utils/http-client.d.ts +130 -0
  228. package/dist/utils/http-client.d.ts.map +1 -0
  229. package/dist/utils/http-client.js +464 -0
  230. package/dist/utils/http-client.js.map +1 -0
  231. package/dist/utils/http-headers-generator.d.ts +151 -0
  232. package/dist/utils/http-headers-generator.d.ts.map +1 -0
  233. package/dist/utils/http-headers-generator.js +407 -0
  234. package/dist/utils/http-headers-generator.js.map +1 -0
  235. package/dist/utils/logger.d.ts +44 -0
  236. package/dist/utils/logger.d.ts.map +1 -0
  237. package/dist/utils/logger.js +73 -0
  238. package/dist/utils/logger.js.map +1 -0
  239. package/dist/utils/preloader.d.ts +20 -0
  240. package/dist/utils/preloader.d.ts.map +1 -0
  241. package/dist/utils/preloader.js +82 -0
  242. package/dist/utils/preloader.js.map +1 -0
  243. package/dist/utils/rate-limiter.d.ts +28 -0
  244. package/dist/utils/rate-limiter.d.ts.map +1 -0
  245. package/dist/utils/rate-limiter.js +48 -0
  246. package/dist/utils/rate-limiter.js.map +1 -0
  247. package/dist/utils/topic-mapper.d.ts +18 -0
  248. package/dist/utils/topic-mapper.d.ts.map +1 -0
  249. package/dist/utils/topic-mapper.js +182 -0
  250. package/dist/utils/topic-mapper.js.map +1 -0
  251. package/dist/utils/url-converter.d.ts +22 -0
  252. package/dist/utils/url-converter.d.ts.map +1 -0
  253. package/dist/utils/url-converter.js +70 -0
  254. package/dist/utils/url-converter.js.map +1 -0
  255. package/dist/utils/user-agent-pool.d.ts +241 -0
  256. package/dist/utils/user-agent-pool.d.ts.map +1 -0
  257. package/dist/utils/user-agent-pool.js +557 -0
  258. package/dist/utils/user-agent-pool.js.map +1 -0
  259. package/dist/utils/wwdc-data-source-path.d.ts +9 -0
  260. package/dist/utils/wwdc-data-source-path.d.ts.map +1 -0
  261. package/dist/utils/wwdc-data-source-path.js +22 -0
  262. package/dist/utils/wwdc-data-source-path.js.map +1 -0
  263. package/dist/utils/wwdc-data-source.d.ts +36 -0
  264. package/dist/utils/wwdc-data-source.d.ts.map +1 -0
  265. package/dist/utils/wwdc-data-source.js +133 -0
  266. package/dist/utils/wwdc-data-source.js.map +1 -0
  267. 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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"}