@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,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"}
|