@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,557 @@
1
+ /**
2
+ * User-Agent Pool Manager for rotating user agents to avoid detection
3
+ *
4
+ * Provides robust management of multiple User-Agent strings with:
5
+ * - Multiple rotation strategies (random, sequential, smart)
6
+ * - Automatic error handling and recovery
7
+ * - Performance statistics and monitoring
8
+ * - Thread-safe concurrent access
9
+ * - Browser type detection and header generation support
10
+ *
11
+ * @author Apple Docs MCP
12
+ * @version 1.0.0
13
+ */
14
+ import { parseUserAgent } from './http-headers-generator.js';
15
+ /**
16
+ * Default configuration values
17
+ */
18
+ const DEFAULT_CONFIG = {
19
+ strategy: 'random',
20
+ disableDuration: 5 * 60 * 1000, // 5 minutes
21
+ failureThreshold: 3,
22
+ minSuccessRate: 0.5, // 50%
23
+ };
24
+ /**
25
+ * User-Agent Pool Manager
26
+ *
27
+ * Manages a pool of User-Agent strings with rotation, error handling,
28
+ * and automatic recovery capabilities.
29
+ *
30
+ * @example
31
+ * ```typescript
32
+ * const pool = new UserAgentPool([
33
+ * 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
34
+ * 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36'
35
+ * ]);
36
+ *
37
+ * const userAgent = pool.getNext();
38
+ * // ... make request ...
39
+ * if (response.ok) {
40
+ * pool.markSuccess(userAgent);
41
+ * } else {
42
+ * pool.markFailure(userAgent, response.status);
43
+ * }
44
+ * ```
45
+ */
46
+ export class UserAgentPool {
47
+ agents = [];
48
+ currentIndex = 0;
49
+ config;
50
+ mutex = new AsyncMutex();
51
+ /**
52
+ * Create a new User-Agent pool
53
+ *
54
+ * @param agents - Array of User-Agent strings to manage
55
+ * @param config - Configuration options
56
+ * @throws {Error} When agents array is empty or contains invalid values
57
+ */
58
+ constructor(agents, config = {}) {
59
+ if (!agents || agents.length === 0) {
60
+ throw new Error('User-Agent pool cannot be empty');
61
+ }
62
+ // Validate and normalize agents
63
+ const validAgents = agents.filter(agent => typeof agent === 'string' && agent.trim().length > 0);
64
+ if (validAgents.length === 0) {
65
+ throw new Error('No valid User-Agent strings provided');
66
+ }
67
+ this.config = { ...DEFAULT_CONFIG, ...config };
68
+ // Initialize agents
69
+ this.agents = validAgents.map(value => ({
70
+ value: value.trim(),
71
+ isEnabled: true,
72
+ successCount: 0,
73
+ failureCount: 0,
74
+ consecutiveFailures: 0,
75
+ }));
76
+ // Remove duplicates
77
+ this.removeDuplicates();
78
+ if (this.agents.length === 0) {
79
+ throw new Error('No unique User-Agent strings after deduplication');
80
+ }
81
+ // Randomize initial order for better distribution
82
+ if (this.config.strategy === 'random') {
83
+ this.shuffleAgents();
84
+ }
85
+ }
86
+ /**
87
+ * Get the next User-Agent string using the configured strategy
88
+ *
89
+ * This method is thread-safe and handles automatic recovery of disabled agents.
90
+ *
91
+ * @returns The next User-Agent string to use
92
+ * @throws {Error} When no User-Agents are available
93
+ */
94
+ async getNext() {
95
+ return this.mutex.runExclusive(async () => {
96
+ // First, try to recover any disabled agents that should be re-enabled
97
+ this.recoverDisabledAgents();
98
+ // Get available agents
99
+ const enabledAgents = this.agents.filter(agent => agent.isEnabled);
100
+ if (enabledAgents.length === 0) {
101
+ // Emergency fallback: re-enable the least bad agent
102
+ const fallbackAgent = this.selectFallbackAgent();
103
+ if (fallbackAgent) {
104
+ fallbackAgent.isEnabled = true;
105
+ fallbackAgent.disabledUntil = undefined;
106
+ fallbackAgent.consecutiveFailures = 0;
107
+ return this.selectAndUseAgent(fallbackAgent);
108
+ }
109
+ throw new Error('No User-Agents available in pool');
110
+ }
111
+ // Select next agent based on strategy
112
+ const selectedAgent = this.selectByStrategy(enabledAgents);
113
+ return this.selectAndUseAgent(selectedAgent);
114
+ });
115
+ }
116
+ /**
117
+ * Mark a User-Agent as having failed a request
118
+ *
119
+ * @param userAgent - The User-Agent string that failed
120
+ * @param statusCode - HTTP status code of the failure (optional)
121
+ */
122
+ async markFailure(userAgent, statusCode) {
123
+ return this.mutex.runExclusive(async () => {
124
+ const agent = this.findAgent(userAgent);
125
+ if (!agent) {
126
+ return;
127
+ }
128
+ agent.failureCount++;
129
+ agent.consecutiveFailures++;
130
+ // Determine if this failure should disable the agent
131
+ const shouldDisable = this.shouldDisableAgent(agent, statusCode);
132
+ if (shouldDisable) {
133
+ agent.isEnabled = false;
134
+ agent.disabledUntil = new Date(Date.now() + this.config.disableDuration);
135
+ }
136
+ });
137
+ }
138
+ /**
139
+ * Mark a User-Agent as having succeeded a request
140
+ *
141
+ * @param userAgent - The User-Agent string that succeeded
142
+ */
143
+ async markSuccess(userAgent) {
144
+ return this.mutex.runExclusive(async () => {
145
+ const agent = this.findAgent(userAgent);
146
+ if (!agent) {
147
+ return;
148
+ }
149
+ agent.successCount++;
150
+ agent.consecutiveFailures = 0; // Reset consecutive failures
151
+ // Re-enable agent if it was disabled and now has good performance
152
+ if (!agent.isEnabled && this.getAgentSuccessRate(agent) >= this.config.minSuccessRate) {
153
+ agent.isEnabled = true;
154
+ agent.disabledUntil = undefined;
155
+ }
156
+ });
157
+ }
158
+ /**
159
+ * Add a new User-Agent to the pool
160
+ *
161
+ * @param userAgent - The User-Agent string to add
162
+ * @throws {Error} When User-Agent is invalid or already exists
163
+ */
164
+ async addAgent(userAgent) {
165
+ return this.mutex.runExclusive(async () => {
166
+ if (!userAgent || typeof userAgent !== 'string' || userAgent.trim().length === 0) {
167
+ throw new Error('Invalid User-Agent string');
168
+ }
169
+ const normalizedAgent = userAgent.trim();
170
+ if (this.agents.some(agent => agent.value === normalizedAgent)) {
171
+ throw new Error('User-Agent already exists in pool');
172
+ }
173
+ this.agents.push({
174
+ value: normalizedAgent,
175
+ isEnabled: true,
176
+ successCount: 0,
177
+ failureCount: 0,
178
+ consecutiveFailures: 0,
179
+ });
180
+ });
181
+ }
182
+ /**
183
+ * Remove a User-Agent from the pool
184
+ *
185
+ * @param userAgent - The User-Agent string to remove
186
+ * @throws {Error} When trying to remove the last User-Agent
187
+ */
188
+ async removeAgent(userAgent) {
189
+ return this.mutex.runExclusive(async () => {
190
+ if (this.agents.length <= 1) {
191
+ throw new Error('Cannot remove the last User-Agent from pool');
192
+ }
193
+ const index = this.agents.findIndex(agent => agent.value === userAgent);
194
+ if (index === -1) {
195
+ throw new Error('User-Agent not found in pool');
196
+ }
197
+ this.agents.splice(index, 1);
198
+ // Adjust current index if needed
199
+ if (this.currentIndex >= this.agents.length) {
200
+ this.currentIndex = 0;
201
+ }
202
+ });
203
+ }
204
+ /**
205
+ * Get statistics for all User-Agents in the pool
206
+ *
207
+ * @returns Array of statistics for each User-Agent
208
+ */
209
+ getAgentStats() {
210
+ return this.agents.map(agent => ({
211
+ value: agent.value,
212
+ successCount: agent.successCount,
213
+ failureCount: agent.failureCount,
214
+ successRate: this.getAgentSuccessRate(agent),
215
+ totalRequests: agent.successCount + agent.failureCount,
216
+ isEnabled: agent.isEnabled,
217
+ lastUsed: agent.lastUsed,
218
+ consecutiveFailures: agent.consecutiveFailures,
219
+ }));
220
+ }
221
+ /**
222
+ * Get overall pool statistics
223
+ *
224
+ * @returns Pool-wide statistics
225
+ */
226
+ getStats() {
227
+ const enabledCount = this.agents.filter(agent => agent.isEnabled).length;
228
+ const totalRequests = this.agents.reduce((sum, agent) => sum + agent.successCount + agent.failureCount, 0);
229
+ const totalSuccesses = this.agents.reduce((sum, agent) => sum + agent.successCount, 0);
230
+ const successRate = totalRequests > 0 ? (totalSuccesses / totalRequests) * 100 : 0;
231
+ const healthScore = this.calculateHealthScore();
232
+ return {
233
+ total: this.agents.length,
234
+ enabled: enabledCount,
235
+ disabled: this.agents.length - enabledCount,
236
+ totalRequests,
237
+ successRate,
238
+ strategy: this.config.strategy,
239
+ healthScore,
240
+ };
241
+ }
242
+ /**
243
+ * Reset all statistics while keeping the User-Agents
244
+ */
245
+ async resetStats() {
246
+ return this.mutex.runExclusive(async () => {
247
+ for (const agent of this.agents) {
248
+ agent.successCount = 0;
249
+ agent.failureCount = 0;
250
+ agent.consecutiveFailures = 0;
251
+ agent.lastUsed = undefined;
252
+ agent.isEnabled = true;
253
+ agent.disabledUntil = undefined;
254
+ }
255
+ });
256
+ }
257
+ /**
258
+ * Get the current configuration
259
+ *
260
+ * @returns Current pool configuration
261
+ */
262
+ getConfig() {
263
+ return { ...this.config };
264
+ }
265
+ /**
266
+ * Get the next User-Agent as a structured UserAgent object
267
+ *
268
+ * This method provides enhanced information about the User-Agent including
269
+ * browser type, version, OS details, and architecture information.
270
+ *
271
+ * @returns Promise resolving to a UserAgent object with parsed information
272
+ * @throws {Error} When no User-Agents are available
273
+ */
274
+ async getNextUserAgent() {
275
+ const userAgentString = await this.getNext();
276
+ return parseUserAgent(userAgentString);
277
+ }
278
+ /**
279
+ * Get a random User-Agent string filtered by browser type
280
+ *
281
+ * @param browserType - Desired browser type
282
+ * @returns Promise resolving to a User-Agent string of the specified type
283
+ * @throws {Error} When no User-Agents of the specified type are available
284
+ */
285
+ async getByBrowserType(browserType) {
286
+ return this.mutex.runExclusive(async () => {
287
+ // First, try to recover any disabled agents
288
+ this.recoverDisabledAgents();
289
+ // Filter agents by browser type
290
+ const matchingAgents = this.agents.filter(agent => {
291
+ if (!agent.isEnabled) {
292
+ return false;
293
+ }
294
+ const parsed = parseUserAgent(agent.value);
295
+ return parsed.browserType === browserType;
296
+ });
297
+ if (matchingAgents.length === 0) {
298
+ throw new Error(`No enabled User-Agents available for browser type: ${browserType}`);
299
+ }
300
+ // Select using configured strategy
301
+ const selectedAgent = this.selectByStrategy(matchingAgents);
302
+ return this.selectAndUseAgent(selectedAgent);
303
+ });
304
+ }
305
+ /**
306
+ * Get a random User-Agent object filtered by browser type
307
+ *
308
+ * @param browserType - Desired browser type
309
+ * @returns Promise resolving to a UserAgent object of the specified type
310
+ * @throws {Error} When no User-Agents of the specified type are available
311
+ */
312
+ async getUserAgentByBrowserType(browserType) {
313
+ const userAgentString = await this.getByBrowserType(browserType);
314
+ return parseUserAgent(userAgentString);
315
+ }
316
+ /**
317
+ * Get statistics grouped by browser type
318
+ *
319
+ * @returns Statistics organized by browser type
320
+ */
321
+ getStatsByBrowserType() {
322
+ const stats = {};
323
+ // Initialize all browser types
324
+ const browserTypes = ['chrome', 'firefox', 'safari', 'edge'];
325
+ browserTypes.forEach(type => {
326
+ stats[type] = { count: 0, enabled: 0, totalRequests: 0, successCount: 0 };
327
+ });
328
+ // Aggregate stats by browser type
329
+ this.agents.forEach(agent => {
330
+ const parsed = parseUserAgent(agent.value);
331
+ const browserType = parsed.browserType;
332
+ stats[browserType].count++;
333
+ if (agent.isEnabled) {
334
+ stats[browserType].enabled++;
335
+ }
336
+ stats[browserType].totalRequests += agent.successCount + agent.failureCount;
337
+ stats[browserType].successCount += agent.successCount;
338
+ });
339
+ // Calculate success rates and return
340
+ const result = {};
341
+ browserTypes.forEach(type => {
342
+ const browserStats = stats[type];
343
+ result[type] = {
344
+ count: browserStats.count,
345
+ enabled: browserStats.enabled,
346
+ successRate: browserStats.totalRequests > 0
347
+ ? (browserStats.successCount / browserStats.totalRequests) * 100
348
+ : 0,
349
+ };
350
+ });
351
+ return result;
352
+ }
353
+ /**
354
+ * Get all available browser types in the pool
355
+ *
356
+ * @returns Array of browser types present in the pool
357
+ */
358
+ getAvailableBrowserTypes() {
359
+ const browserTypes = new Set();
360
+ this.agents.forEach(agent => {
361
+ const parsed = parseUserAgent(agent.value);
362
+ browserTypes.add(parsed.browserType);
363
+ });
364
+ return Array.from(browserTypes);
365
+ }
366
+ // Private helper methods
367
+ selectByStrategy(enabledAgents) {
368
+ switch (this.config.strategy) {
369
+ case 'sequential':
370
+ return this.selectSequential(enabledAgents);
371
+ case 'smart':
372
+ return this.selectSmart(enabledAgents);
373
+ case 'random':
374
+ default:
375
+ return this.selectRandom(enabledAgents);
376
+ }
377
+ }
378
+ selectRandom(agents) {
379
+ const randomIndex = Math.floor(Math.random() * agents.length);
380
+ return agents[randomIndex];
381
+ }
382
+ selectSequential(agents) {
383
+ // Find the next enabled agent in sequence
384
+ const enabledIndices = agents.map(agent => this.agents.indexOf(agent));
385
+ enabledIndices.sort((a, b) => a - b);
386
+ // Find current position in enabled agents
387
+ let nextIndex = enabledIndices.find(index => index > this.currentIndex);
388
+ if (nextIndex === undefined) {
389
+ nextIndex = enabledIndices[0]; // Wrap around
390
+ }
391
+ this.currentIndex = nextIndex;
392
+ return this.agents[nextIndex];
393
+ }
394
+ selectSmart(agents) {
395
+ // Smart selection prioritizes:
396
+ // 1. Agents with higher success rates
397
+ // 2. Agents used less recently
398
+ // 3. Agents with fewer total requests (for load balancing)
399
+ const now = Date.now();
400
+ const scores = agents.map(agent => {
401
+ const successRate = this.getAgentSuccessRate(agent);
402
+ const totalRequests = agent.successCount + agent.failureCount;
403
+ // Time since last use (higher is better)
404
+ const timeSinceLastUse = agent.lastUsed ?
405
+ Math.min(now - agent.lastUsed.getTime(), 3600000) : 3600000; // Cap at 1 hour
406
+ // Calculate composite score
407
+ const successScore = successRate * 0.4; // 40% weight on success rate
408
+ const recencyScore = (timeSinceLastUse / 3600000) * 0.3; // 30% weight on recency
409
+ const balanceScore = totalRequests > 0 ? (1 / Math.log(totalRequests + 1)) * 0.3 : 0.3; // 30% weight on load balancing
410
+ return successScore + recencyScore + balanceScore;
411
+ });
412
+ // Select agent with highest score
413
+ const maxScore = Math.max(...scores);
414
+ const bestAgentIndex = scores.indexOf(maxScore);
415
+ return agents[bestAgentIndex];
416
+ }
417
+ selectAndUseAgent(agent) {
418
+ agent.lastUsed = new Date();
419
+ return agent.value;
420
+ }
421
+ findAgent(userAgent) {
422
+ return this.agents.find(agent => agent.value === userAgent);
423
+ }
424
+ shouldDisableAgent(agent, statusCode) {
425
+ // Always disable on consecutive failures above threshold
426
+ if (agent.consecutiveFailures >= this.config.failureThreshold) {
427
+ return true;
428
+ }
429
+ // Consider specific status codes
430
+ if (statusCode) {
431
+ // 403 Forbidden or 429 Too Many Requests should disable immediately
432
+ if (statusCode === 403 || statusCode === 429) {
433
+ return true;
434
+ }
435
+ }
436
+ // Disable if success rate is too low (with minimum sample size)
437
+ const totalRequests = agent.successCount + agent.failureCount;
438
+ if (totalRequests >= 10 && this.getAgentSuccessRate(agent) < this.config.minSuccessRate) {
439
+ return true;
440
+ }
441
+ return false;
442
+ }
443
+ getAgentSuccessRate(agent) {
444
+ const total = agent.successCount + agent.failureCount;
445
+ return total > 0 ? agent.successCount / total : 1.0; // Default to 100% for unused agents
446
+ }
447
+ recoverDisabledAgents() {
448
+ const now = new Date();
449
+ for (const agent of this.agents) {
450
+ if (!agent.isEnabled && agent.disabledUntil && now >= agent.disabledUntil) {
451
+ agent.isEnabled = true;
452
+ agent.disabledUntil = undefined;
453
+ agent.consecutiveFailures = 0; // Reset consecutive failures on recovery
454
+ }
455
+ }
456
+ }
457
+ selectFallbackAgent() {
458
+ if (this.agents.length === 0) {
459
+ return null;
460
+ }
461
+ // Find the agent with the best success rate, or the one disabled most recently
462
+ return this.agents.reduce((best, current) => {
463
+ if (!best) {
464
+ return current;
465
+ }
466
+ const bestRate = this.getAgentSuccessRate(best);
467
+ const currentRate = this.getAgentSuccessRate(current);
468
+ if (currentRate > bestRate) {
469
+ return current;
470
+ }
471
+ if (currentRate === bestRate) {
472
+ // If rates are equal, prefer the one disabled more recently (likely to recover sooner)
473
+ if (!current.disabledUntil) {
474
+ return current;
475
+ }
476
+ if (!best.disabledUntil) {
477
+ return best;
478
+ }
479
+ return current.disabledUntil > best.disabledUntil ? current : best;
480
+ }
481
+ return best;
482
+ });
483
+ }
484
+ calculateHealthScore() {
485
+ if (this.agents.length === 0) {
486
+ return 0;
487
+ }
488
+ const enabledRatio = this.agents.filter(agent => agent.isEnabled).length / this.agents.length;
489
+ const avgSuccessRate = this.agents.reduce((sum, agent) => sum + this.getAgentSuccessRate(agent), 0) / this.agents.length;
490
+ // Health score combines enabled ratio and average success rate
491
+ return Math.round((enabledRatio * 0.4 + avgSuccessRate * 0.6) * 100);
492
+ }
493
+ removeDuplicates() {
494
+ const seen = new Set();
495
+ this.agents = this.agents.filter(agent => {
496
+ if (seen.has(agent.value)) {
497
+ return false;
498
+ }
499
+ seen.add(agent.value);
500
+ return true;
501
+ });
502
+ }
503
+ shuffleAgents() {
504
+ for (let i = this.agents.length - 1; i > 0; i--) {
505
+ const j = Math.floor(Math.random() * (i + 1));
506
+ [this.agents[i], this.agents[j]] = [this.agents[j], this.agents[i]];
507
+ }
508
+ }
509
+ }
510
+ /**
511
+ * Simple async mutex for thread-safe operations
512
+ *
513
+ * Ensures that only one async operation can modify the pool state at a time.
514
+ */
515
+ class AsyncMutex {
516
+ mutex = Promise.resolve();
517
+ runExclusive(fn) {
518
+ const result = this.mutex.then(fn);
519
+ this.mutex = result.then(() => { }, () => { }); // Always resolve mutex regardless of result
520
+ return result;
521
+ }
522
+ }
523
+ /**
524
+ * Pre-defined User-Agent strings for common browsers
525
+ * Covers Chrome, Firefox, Safari, and Edge across different platforms
526
+ */
527
+ export const COMMON_USER_AGENTS = {
528
+ // Chrome User-Agents
529
+ CHROME_MAC_INTEL: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36',
530
+ CHROME_MAC_APPLE: 'Mozilla/5.0 (Macintosh; arm64 Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36',
531
+ CHROME_WINDOWS: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36',
532
+ CHROME_LINUX: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36',
533
+ // Firefox User-Agents
534
+ FIREFOX_MAC_INTEL: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:122.0) Gecko/20100101 Firefox/122.0',
535
+ FIREFOX_MAC_APPLE: 'Mozilla/5.0 (Macintosh; arm64 Mac OS X 10.15; rv:122.0) Gecko/20100101 Firefox/122.0',
536
+ FIREFOX_WINDOWS: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0',
537
+ FIREFOX_LINUX: 'Mozilla/5.0 (X11; Linux x86_64; rv:122.0) Gecko/20100101 Firefox/122.0',
538
+ // Safari User-Agents (using constants from constants.ts)
539
+ SAFARI_MAC_INTEL_15_1: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 15_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.1 Safari/605.1.15',
540
+ SAFARI_MAC_APPLE_15_1: 'Mozilla/5.0 (Macintosh; arm64 Mac OS X 15_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.1 Safari/605.1.15',
541
+ SAFARI_MAC_INTEL_14_7: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 14_7_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.6.1 Safari/605.1.15',
542
+ SAFARI_MAC_APPLE_14_7: 'Mozilla/5.0 (Macintosh; arm64 Mac OS X 14_7_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.6.1 Safari/605.1.15',
543
+ // Edge User-Agents
544
+ EDGE_WINDOWS: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0',
545
+ EDGE_MAC_INTEL: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0',
546
+ EDGE_MAC_APPLE: 'Mozilla/5.0 (Macintosh; arm64 Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0',
547
+ };
548
+ /**
549
+ * Create a default User-Agent pool with common browser agents
550
+ *
551
+ * @param config - Configuration options for the pool
552
+ * @returns A new UserAgentPool instance with common User-Agents
553
+ */
554
+ export function createDefaultPool(config = {}) {
555
+ return new UserAgentPool(Object.values(COMMON_USER_AGENTS), config);
556
+ }
557
+ //# sourceMappingURL=user-agent-pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-agent-pool.js","sourceRoot":"","sources":["../../src/utils/user-agent-pool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Separate module for handling data directory path resolution
3
+ * This is isolated to avoid import.meta.url issues in tests
4
+ */
5
+ /**
6
+ * Get the WWDC data directory path
7
+ */
8
+ export declare function getWWDCDataDirectory(): string;
9
+ //# sourceMappingURL=wwdc-data-source-path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wwdc-data-source-path.d.ts","sourceRoot":"","sources":["../../src/utils/wwdc-data-source-path.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAa7C"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Separate module for handling data directory path resolution
3
+ * This is isolated to avoid import.meta.url issues in tests
4
+ */
5
+ import path from 'path';
6
+ import { fileURLToPath } from 'url';
7
+ /**
8
+ * Get the WWDC data directory path
9
+ */
10
+ export function getWWDCDataDirectory() {
11
+ // In test environment, use current working directory
12
+ if (process.env.NODE_ENV === 'test' || process.env.JEST_WORKER_ID) {
13
+ return path.resolve(process.cwd(), 'data/wwdc');
14
+ }
15
+ // In production, use import.meta.url
16
+ const currentFilePath = fileURLToPath(import.meta.url);
17
+ const currentDirPath = path.dirname(currentFilePath);
18
+ // After build, data is copied to dist/data
19
+ // The compiled JS is in dist/utils/, so data is at ../data
20
+ return path.resolve(currentDirPath, '../data/wwdc');
21
+ }
22
+ //# sourceMappingURL=wwdc-data-source-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wwdc-data-source-path.js","sourceRoot":"","sources":["../../src/utils/wwdc-data-source-path.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,qDAAqD;IACrD,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;QAClE,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;IAClD,CAAC;IAED,qCAAqC;IACrC,MAAM,eAAe,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvD,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAErD,2CAA2C;IAC3C,2DAA2D;IAC3D,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;AACtD,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * WWDC Data Source - Loads data from bundled JSON files
3
+ *
4
+ * This module provides functions to load WWDC video data from
5
+ * JSON files that are bundled with the npm package.
6
+ */
7
+ import type { WWDCVideo, GlobalMetadata, TopicIndex, YearIndex } from '../types/wwdc.js';
8
+ /**
9
+ * Load global metadata (index.json)
10
+ */
11
+ export declare function loadGlobalMetadata(): Promise<GlobalMetadata>;
12
+ /**
13
+ * Load topic index
14
+ */
15
+ export declare function loadTopicIndex(topicId: string): Promise<TopicIndex>;
16
+ /**
17
+ * Load year index
18
+ */
19
+ export declare function loadYearIndex(year: string): Promise<YearIndex>;
20
+ /**
21
+ * Load individual video data
22
+ */
23
+ export declare function loadVideoData(year: string, videoId: string): Promise<WWDCVideo>;
24
+ /**
25
+ * Load all videos list
26
+ */
27
+ export declare function loadAllVideos(): Promise<WWDCVideo[]>;
28
+ /**
29
+ * Clear the WWDC data cache
30
+ */
31
+ export declare function clearDataCache(): void;
32
+ /**
33
+ * Check if WWDC data is available
34
+ */
35
+ export declare function isDataAvailable(): Promise<boolean>;
36
+ //# sourceMappingURL=wwdc-data-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wwdc-data-source.d.ts","sourceRoot":"","sources":["../../src/utils/wwdc-data-source.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AA4CzF;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,cAAc,CAAC,CAQlE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAQzE;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAQpE;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAQrF;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAQ1D;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAGrC;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAQxD"}