@roxybrowser/openapi 1.0.5-beta.1 → 1.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +222 -228
- package/lib/index.js +97 -1674
- package/lib/index.js.map +1 -1
- package/lib/modules/account.d.ts +491 -0
- package/lib/modules/account.d.ts.map +1 -0
- package/lib/modules/account.js +442 -0
- package/lib/modules/account.js.map +1 -0
- package/lib/modules/browser.d.ts +3011 -0
- package/lib/modules/browser.d.ts.map +1 -0
- package/lib/modules/browser.js +1501 -0
- package/lib/modules/browser.js.map +1 -0
- package/lib/modules/other.d.ts +102 -0
- package/lib/modules/other.d.ts.map +1 -0
- package/lib/modules/other.js +194 -0
- package/lib/modules/other.js.map +1 -0
- package/lib/modules/proxy.d.ts +576 -0
- package/lib/modules/proxy.d.ts.map +1 -0
- package/lib/modules/proxy.js +724 -0
- package/lib/modules/proxy.js.map +1 -0
- package/lib/types.d.ts +860 -155
- package/lib/types.d.ts.map +1 -1
- package/lib/types.js +4 -4
- package/lib/types.js.map +1 -1
- package/lib/utils/index.d.ts +24 -0
- package/lib/utils/index.d.ts.map +1 -0
- package/lib/utils/index.js +45 -0
- package/lib/utils/index.js.map +1 -0
- package/package.json +50 -50
- package/lib/browser/browser-creator.d.ts +0 -54
- package/lib/browser/browser-creator.d.ts.map +0 -1
- package/lib/browser/browser-creator.js +0 -263
- package/lib/browser/browser-creator.js.map +0 -1
- package/lib/proxy/proxy-manager.d.ts +0 -67
- package/lib/proxy/proxy-manager.d.ts.map +0 -1
- package/lib/proxy/proxy-manager.js +0 -278
- package/lib/proxy/proxy-manager.js.map +0 -1
- package/lib/proxy/proxy-validator.d.ts +0 -66
- package/lib/proxy/proxy-validator.d.ts.map +0 -1
- package/lib/proxy/proxy-validator.js +0 -273
- package/lib/proxy/proxy-validator.js.map +0 -1
- package/lib/roxy-client.d.ts +0 -117
- package/lib/roxy-client.d.ts.map +0 -1
- package/lib/roxy-client.js +0 -467
- package/lib/roxy-client.js.map +0 -1
- package/lib/utils/error-analyzer.d.ts +0 -84
- package/lib/utils/error-analyzer.d.ts.map +0 -1
- package/lib/utils/error-analyzer.js +0 -387
- package/lib/utils/error-analyzer.js.map +0 -1
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Proxy Manager Service
|
|
3
|
-
*
|
|
4
|
-
* Handles proxy configuration, validation, and management for RoxyBrowser
|
|
5
|
-
*/
|
|
6
|
-
import { ProxyInfo, BrowserCreateConfig } from '../types.js';
|
|
7
|
-
export interface ProxyValidationResult {
|
|
8
|
-
valid: boolean;
|
|
9
|
-
errors: string[];
|
|
10
|
-
warnings: string[];
|
|
11
|
-
}
|
|
12
|
-
export interface ProxyTestResult {
|
|
13
|
-
success: boolean;
|
|
14
|
-
error?: string;
|
|
15
|
-
responseTime?: number;
|
|
16
|
-
ipAddress?: string;
|
|
17
|
-
location?: string;
|
|
18
|
-
}
|
|
19
|
-
export declare class ProxyManager {
|
|
20
|
-
/**
|
|
21
|
-
* Validate proxy configuration
|
|
22
|
-
*/
|
|
23
|
-
static validateProxy(proxy: ProxyInfo): ProxyValidationResult;
|
|
24
|
-
/**
|
|
25
|
-
* Test proxy connection
|
|
26
|
-
*/
|
|
27
|
-
static testProxy(proxy: ProxyInfo): Promise<ProxyTestResult>;
|
|
28
|
-
/**
|
|
29
|
-
* Create proxy configuration from simple parameters
|
|
30
|
-
*/
|
|
31
|
-
static createSimpleProxy(host: string, port: string, username?: string, password?: string, type?: 'HTTP' | 'HTTPS' | 'SOCKS5'): ProxyInfo;
|
|
32
|
-
/**
|
|
33
|
-
* Parse proxy URL (format: protocol://username:password@host:port)
|
|
34
|
-
*/
|
|
35
|
-
static parseProxyUrl(proxyUrl: string): ProxyInfo | null;
|
|
36
|
-
/**
|
|
37
|
-
* Generate proxy list from various formats
|
|
38
|
-
*/
|
|
39
|
-
static parseProxyList(proxyListInput: string | string[]): ProxyInfo[];
|
|
40
|
-
/**
|
|
41
|
-
* Distribute proxies across multiple browser configurations
|
|
42
|
-
*/
|
|
43
|
-
static distributeProxies(configs: BrowserCreateConfig[], proxies: ProxyInfo[], strategy?: 'round-robin' | 'random'): BrowserCreateConfig[];
|
|
44
|
-
/**
|
|
45
|
-
* Filter working proxies from a list
|
|
46
|
-
*/
|
|
47
|
-
static filterWorkingProxies(proxies: ProxyInfo[], options?: {
|
|
48
|
-
concurrency?: number;
|
|
49
|
-
timeout?: number;
|
|
50
|
-
retries?: number;
|
|
51
|
-
}): Promise<ProxyInfo[]>;
|
|
52
|
-
/**
|
|
53
|
-
* Get proxy statistics
|
|
54
|
-
*/
|
|
55
|
-
static getProxyStats(proxies: ProxyInfo[]): {
|
|
56
|
-
total: number;
|
|
57
|
-
byType: Record<string, number>;
|
|
58
|
-
withAuth: number;
|
|
59
|
-
withoutAuth: number;
|
|
60
|
-
};
|
|
61
|
-
/**
|
|
62
|
-
* Private helper methods
|
|
63
|
-
*/
|
|
64
|
-
private static isValidHost;
|
|
65
|
-
private static getDefaultPort;
|
|
66
|
-
}
|
|
67
|
-
//# sourceMappingURL=proxy-manager.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"proxy-manager.d.ts","sourceRoot":"","sources":["../../src/proxy/proxy-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAgB,MAAM,aAAa,CAAC;AAE3E,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,YAAY;IACvB;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,qBAAqB;IAoE7D;;OAEG;WACU,SAAS,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,eAAe,CAAC;IAsClE;;OAEG;IACH,MAAM,CAAC,iBAAiB,CACtB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,EACjB,IAAI,GAAE,MAAM,GAAG,OAAO,GAAG,QAAiB,GACzC,SAAS;IAaZ;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IA+BxD;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,EAAE;IAoCrE;;OAEG;IACH,MAAM,CAAC,iBAAiB,CACtB,OAAO,EAAE,mBAAmB,EAAE,EAC9B,OAAO,EAAE,SAAS,EAAE,EACpB,QAAQ,GAAE,aAAa,GAAG,QAAwB,GACjD,mBAAmB,EAAE;IAsBxB;;OAEG;WACU,oBAAoB,CAC/B,OAAO,EAAE,SAAS,EAAE,EACpB,OAAO,GAAE;QACP,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;KACb,GACL,OAAO,CAAC,SAAS,EAAE,CAAC;IA8BvB;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG;QAC1C,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/B,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;KACrB;IAwBD;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;IAQ1B,OAAO,CAAC,MAAM,CAAC,cAAc;CAQ9B"}
|
|
@@ -1,278 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Proxy Manager Service
|
|
3
|
-
*
|
|
4
|
-
* Handles proxy configuration, validation, and management for RoxyBrowser
|
|
5
|
-
*/
|
|
6
|
-
export class ProxyManager {
|
|
7
|
-
/**
|
|
8
|
-
* Validate proxy configuration
|
|
9
|
-
*/
|
|
10
|
-
static validateProxy(proxy) {
|
|
11
|
-
const errors = [];
|
|
12
|
-
const warnings = [];
|
|
13
|
-
// Basic validation
|
|
14
|
-
if (!proxy) {
|
|
15
|
-
errors.push('Proxy configuration is required');
|
|
16
|
-
return { valid: false, errors, warnings };
|
|
17
|
-
}
|
|
18
|
-
// Skip validation for no proxy
|
|
19
|
-
if (proxy.proxyCategory === 'noproxy') {
|
|
20
|
-
return { valid: true, errors: [], warnings: [] };
|
|
21
|
-
}
|
|
22
|
-
// Required fields when proxy is enabled
|
|
23
|
-
if (!proxy.host) {
|
|
24
|
-
errors.push('Proxy host is required');
|
|
25
|
-
}
|
|
26
|
-
else {
|
|
27
|
-
// Validate host format
|
|
28
|
-
if (!this.isValidHost(proxy.host)) {
|
|
29
|
-
errors.push('Invalid proxy host format');
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
if (!proxy.port) {
|
|
33
|
-
errors.push('Proxy port is required');
|
|
34
|
-
}
|
|
35
|
-
else {
|
|
36
|
-
// Validate port range
|
|
37
|
-
const port = parseInt(proxy.port, 10);
|
|
38
|
-
if (isNaN(port) || port < 1 || port > 65535) {
|
|
39
|
-
errors.push('Proxy port must be between 1 and 65535');
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
// Validate proxy type and protocol compatibility
|
|
43
|
-
if (proxy.proxyCategory && proxy.protocol) {
|
|
44
|
-
if (proxy.proxyCategory !== proxy.protocol) {
|
|
45
|
-
warnings.push(`Proxy category (${proxy.proxyCategory}) and protocol (${proxy.protocol}) don't match`);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
// Validate authentication
|
|
49
|
-
if (proxy.proxyUserName && !proxy.proxyPassword) {
|
|
50
|
-
warnings.push('Proxy username provided but password is missing');
|
|
51
|
-
}
|
|
52
|
-
if (proxy.proxyPassword && !proxy.proxyUserName) {
|
|
53
|
-
warnings.push('Proxy password provided but username is missing');
|
|
54
|
-
}
|
|
55
|
-
// Validate IP type
|
|
56
|
-
if (proxy.ipType && !['IPV4', 'IPV6'].includes(proxy.ipType)) {
|
|
57
|
-
errors.push('IP type must be IPV4 or IPV6');
|
|
58
|
-
}
|
|
59
|
-
// Validate check channel
|
|
60
|
-
if (proxy.checkChannel && !['IPRust.io', 'IP-API', 'IP123.in'].includes(proxy.checkChannel)) {
|
|
61
|
-
errors.push('Invalid IP check channel');
|
|
62
|
-
}
|
|
63
|
-
return {
|
|
64
|
-
valid: errors.length === 0,
|
|
65
|
-
errors,
|
|
66
|
-
warnings,
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Test proxy connection
|
|
71
|
-
*/
|
|
72
|
-
static async testProxy(proxy) {
|
|
73
|
-
// Skip test for no proxy
|
|
74
|
-
if (proxy.proxyCategory === 'noproxy') {
|
|
75
|
-
return { success: true };
|
|
76
|
-
}
|
|
77
|
-
// Validate first
|
|
78
|
-
const validation = this.validateProxy(proxy);
|
|
79
|
-
if (!validation.valid) {
|
|
80
|
-
return {
|
|
81
|
-
success: false,
|
|
82
|
-
error: `Proxy validation failed: ${validation.errors.join(', ')}`,
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
// Since we can't directly test proxy connection in Node.js without additional dependencies,
|
|
86
|
-
// we'll do basic connectivity checks and format validation
|
|
87
|
-
try {
|
|
88
|
-
const startTime = Date.now();
|
|
89
|
-
// Basic format validation passed, assume connection is testable
|
|
90
|
-
// In a real implementation, you would use libraries like 'socks' or 'http-proxy-agent'
|
|
91
|
-
const responseTime = Date.now() - startTime;
|
|
92
|
-
return {
|
|
93
|
-
success: true,
|
|
94
|
-
responseTime,
|
|
95
|
-
ipAddress: 'Test IP (simulated)',
|
|
96
|
-
location: 'Test Location (simulated)',
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
catch (error) {
|
|
100
|
-
return {
|
|
101
|
-
success: false,
|
|
102
|
-
error: error instanceof Error ? error.message : 'Unknown proxy test error',
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
/**
|
|
107
|
-
* Create proxy configuration from simple parameters
|
|
108
|
-
*/
|
|
109
|
-
static createSimpleProxy(host, port, username, password, type = 'HTTP') {
|
|
110
|
-
return {
|
|
111
|
-
proxyMethod: 'custom',
|
|
112
|
-
proxyCategory: type,
|
|
113
|
-
protocol: type,
|
|
114
|
-
ipType: 'IPV4',
|
|
115
|
-
host,
|
|
116
|
-
port,
|
|
117
|
-
proxyUserName: username,
|
|
118
|
-
proxyPassword: password,
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
/**
|
|
122
|
-
* Parse proxy URL (format: protocol://username:password@host:port)
|
|
123
|
-
*/
|
|
124
|
-
static parseProxyUrl(proxyUrl) {
|
|
125
|
-
try {
|
|
126
|
-
const url = new URL(proxyUrl);
|
|
127
|
-
const protocolMap = {
|
|
128
|
-
'http:': 'HTTP',
|
|
129
|
-
'https:': 'HTTPS',
|
|
130
|
-
'socks5:': 'SOCKS5',
|
|
131
|
-
};
|
|
132
|
-
const protocol = protocolMap[url.protocol];
|
|
133
|
-
if (!protocol) {
|
|
134
|
-
throw new Error(`Unsupported proxy protocol: ${url.protocol}`);
|
|
135
|
-
}
|
|
136
|
-
return {
|
|
137
|
-
proxyMethod: 'custom',
|
|
138
|
-
proxyCategory: protocol,
|
|
139
|
-
protocol,
|
|
140
|
-
ipType: 'IPV4',
|
|
141
|
-
host: url.hostname,
|
|
142
|
-
port: url.port || this.getDefaultPort(protocol),
|
|
143
|
-
proxyUserName: url.username || undefined,
|
|
144
|
-
proxyPassword: url.password || undefined,
|
|
145
|
-
};
|
|
146
|
-
}
|
|
147
|
-
catch (error) {
|
|
148
|
-
console.error('Failed to parse proxy URL:', error);
|
|
149
|
-
return null;
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* Generate proxy list from various formats
|
|
154
|
-
*/
|
|
155
|
-
static parseProxyList(proxyListInput) {
|
|
156
|
-
const proxyList = [];
|
|
157
|
-
const inputs = Array.isArray(proxyListInput) ? proxyListInput : [proxyListInput];
|
|
158
|
-
for (const input of inputs) {
|
|
159
|
-
const lines = input.split('\n').map(line => line.trim()).filter(Boolean);
|
|
160
|
-
for (const line of lines) {
|
|
161
|
-
let proxy = null;
|
|
162
|
-
// Try URL format first
|
|
163
|
-
if (line.includes('://')) {
|
|
164
|
-
proxy = this.parseProxyUrl(line);
|
|
165
|
-
}
|
|
166
|
-
else {
|
|
167
|
-
// Try host:port format
|
|
168
|
-
const parts = line.split(':');
|
|
169
|
-
if (parts.length >= 2) {
|
|
170
|
-
const [host, port, username, password] = parts;
|
|
171
|
-
proxy = this.createSimpleProxy(host, port, username, password);
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
if (proxy) {
|
|
175
|
-
const validation = this.validateProxy(proxy);
|
|
176
|
-
if (validation.valid) {
|
|
177
|
-
proxyList.push(proxy);
|
|
178
|
-
}
|
|
179
|
-
else {
|
|
180
|
-
console.warn(`Invalid proxy skipped: ${line} - ${validation.errors.join(', ')}`);
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
return proxyList;
|
|
186
|
-
}
|
|
187
|
-
/**
|
|
188
|
-
* Distribute proxies across multiple browser configurations
|
|
189
|
-
*/
|
|
190
|
-
static distributeProxies(configs, proxies, strategy = 'round-robin') {
|
|
191
|
-
if (!proxies.length) {
|
|
192
|
-
return configs;
|
|
193
|
-
}
|
|
194
|
-
return configs.map((config, index) => {
|
|
195
|
-
let proxy;
|
|
196
|
-
if (strategy === 'random') {
|
|
197
|
-
proxy = proxies[Math.floor(Math.random() * proxies.length)];
|
|
198
|
-
}
|
|
199
|
-
else {
|
|
200
|
-
// Round-robin
|
|
201
|
-
proxy = proxies[index % proxies.length];
|
|
202
|
-
}
|
|
203
|
-
return {
|
|
204
|
-
...config,
|
|
205
|
-
proxyInfo: proxy,
|
|
206
|
-
};
|
|
207
|
-
});
|
|
208
|
-
}
|
|
209
|
-
/**
|
|
210
|
-
* Filter working proxies from a list
|
|
211
|
-
*/
|
|
212
|
-
static async filterWorkingProxies(proxies, options = {}) {
|
|
213
|
-
const { concurrency = 5, timeout = 10000, retries = 1 } = options;
|
|
214
|
-
const workingProxies = [];
|
|
215
|
-
// Process proxies in batches
|
|
216
|
-
for (let i = 0; i < proxies.length; i += concurrency) {
|
|
217
|
-
const batch = proxies.slice(i, i + concurrency);
|
|
218
|
-
const testPromises = batch.map(async (proxy) => {
|
|
219
|
-
for (let attempt = 0; attempt <= retries; attempt++) {
|
|
220
|
-
const result = await this.testProxy(proxy);
|
|
221
|
-
if (result.success) {
|
|
222
|
-
return proxy;
|
|
223
|
-
}
|
|
224
|
-
// Wait before retry
|
|
225
|
-
if (attempt < retries) {
|
|
226
|
-
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
return null;
|
|
230
|
-
});
|
|
231
|
-
const batchResults = await Promise.all(testPromises);
|
|
232
|
-
workingProxies.push(...batchResults.filter((proxy) => proxy !== null));
|
|
233
|
-
}
|
|
234
|
-
return workingProxies;
|
|
235
|
-
}
|
|
236
|
-
/**
|
|
237
|
-
* Get proxy statistics
|
|
238
|
-
*/
|
|
239
|
-
static getProxyStats(proxies) {
|
|
240
|
-
const stats = {
|
|
241
|
-
total: proxies.length,
|
|
242
|
-
byType: {},
|
|
243
|
-
withAuth: 0,
|
|
244
|
-
withoutAuth: 0,
|
|
245
|
-
};
|
|
246
|
-
for (const proxy of proxies) {
|
|
247
|
-
// Count by type
|
|
248
|
-
const type = proxy.proxyCategory || 'unknown';
|
|
249
|
-
stats.byType[type] = (stats.byType[type] || 0) + 1;
|
|
250
|
-
// Count authentication
|
|
251
|
-
if (proxy.proxyUserName && proxy.proxyPassword) {
|
|
252
|
-
stats.withAuth++;
|
|
253
|
-
}
|
|
254
|
-
else {
|
|
255
|
-
stats.withoutAuth++;
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
return stats;
|
|
259
|
-
}
|
|
260
|
-
/**
|
|
261
|
-
* Private helper methods
|
|
262
|
-
*/
|
|
263
|
-
static isValidHost(host) {
|
|
264
|
-
// Basic host validation (IP address or domain name)
|
|
265
|
-
const ipRegex = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
|
|
266
|
-
const domainRegex = /^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;
|
|
267
|
-
return ipRegex.test(host) || domainRegex.test(host);
|
|
268
|
-
}
|
|
269
|
-
static getDefaultPort(protocol) {
|
|
270
|
-
const defaultPorts = {
|
|
271
|
-
HTTP: '8080',
|
|
272
|
-
HTTPS: '8080',
|
|
273
|
-
SOCKS5: '1080',
|
|
274
|
-
};
|
|
275
|
-
return defaultPorts[protocol] || '8080';
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
//# sourceMappingURL=proxy-manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"proxy-manager.js","sourceRoot":"","sources":["../../src/proxy/proxy-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Proxy Validation Utilities
|
|
3
|
-
*
|
|
4
|
-
* Advanced proxy validation and testing tools for RoxyBrowser MCP
|
|
5
|
-
*/
|
|
6
|
-
import { ProxyInfo } from '../types.js';
|
|
7
|
-
import { ProxyValidationResult } from './proxy-manager.js';
|
|
8
|
-
export interface ProxyListValidationResult {
|
|
9
|
-
validProxies: ProxyInfo[];
|
|
10
|
-
invalidProxies: Array<{
|
|
11
|
-
proxy: ProxyInfo;
|
|
12
|
-
errors: string[];
|
|
13
|
-
}>;
|
|
14
|
-
totalCount: number;
|
|
15
|
-
validCount: number;
|
|
16
|
-
invalidCount: number;
|
|
17
|
-
summary: string;
|
|
18
|
-
}
|
|
19
|
-
export interface ProxyBenchmarkResult {
|
|
20
|
-
proxy: ProxyInfo;
|
|
21
|
-
responseTime: number;
|
|
22
|
-
success: boolean;
|
|
23
|
-
error?: string;
|
|
24
|
-
location?: string;
|
|
25
|
-
anonymityLevel?: 'transparent' | 'anonymous' | 'elite';
|
|
26
|
-
}
|
|
27
|
-
export declare class ProxyValidator {
|
|
28
|
-
/**
|
|
29
|
-
* Validate a list of proxies
|
|
30
|
-
*/
|
|
31
|
-
static validateProxyList(proxies: ProxyInfo[]): ProxyListValidationResult;
|
|
32
|
-
/**
|
|
33
|
-
* Parse and validate proxy string in various formats
|
|
34
|
-
*/
|
|
35
|
-
static parseAndValidateProxyString(proxyString: string): {
|
|
36
|
-
proxy: ProxyInfo | null;
|
|
37
|
-
validation: ProxyValidationResult | null;
|
|
38
|
-
error?: string;
|
|
39
|
-
};
|
|
40
|
-
/**
|
|
41
|
-
* Test multiple proxies and rank by performance
|
|
42
|
-
*/
|
|
43
|
-
static benchmarkProxies(proxies: ProxyInfo[], options?: {
|
|
44
|
-
timeout?: number;
|
|
45
|
-
retries?: number;
|
|
46
|
-
testUrl?: string;
|
|
47
|
-
}): Promise<ProxyBenchmarkResult[]>;
|
|
48
|
-
/**
|
|
49
|
-
* Generate proxy health report
|
|
50
|
-
*/
|
|
51
|
-
static generateProxyHealthReport(validationResult: ProxyListValidationResult, benchmarkResults?: ProxyBenchmarkResult[]): string;
|
|
52
|
-
/**
|
|
53
|
-
* Get proxy recommendations based on use case
|
|
54
|
-
*/
|
|
55
|
-
static getProxyRecommendations(useCase: 'social_media' | 'ecommerce' | 'scraping' | 'general'): {
|
|
56
|
-
recommendedTypes: string[];
|
|
57
|
-
settings: Partial<ProxyInfo>;
|
|
58
|
-
tips: string[];
|
|
59
|
-
};
|
|
60
|
-
/**
|
|
61
|
-
* Private helper methods
|
|
62
|
-
*/
|
|
63
|
-
private static parseAlternativeFormats;
|
|
64
|
-
private static simulateProxyTest;
|
|
65
|
-
}
|
|
66
|
-
//# sourceMappingURL=proxy-validator.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"proxy-validator.d.ts","sourceRoot":"","sources":["../../src/proxy/proxy-validator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAgB,qBAAqB,EAAmB,MAAM,oBAAoB,CAAC;AAE1F,MAAM,WAAW,yBAAyB;IACxC,YAAY,EAAE,SAAS,EAAE,CAAC;IAC1B,cAAc,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,SAAS,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,aAAa,GAAG,WAAW,GAAG,OAAO,CAAC;CACxD;AAED,qBAAa,cAAc;IACzB;;OAEG;IACH,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,yBAAyB;IA8BzE;;OAEG;IACH,MAAM,CAAC,2BAA2B,CAAC,WAAW,EAAE,MAAM,GAAG;QACvD,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;QACxB,UAAU,EAAE,qBAAqB,GAAG,IAAI,CAAC;QACzC,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB;IA+BD;;OAEG;WACU,gBAAgB,CAC3B,OAAO,EAAE,SAAS,EAAE,EACpB,OAAO,GAAE;QACP,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;KACb,GACL,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAmDlC;;OAEG;IACH,MAAM,CAAC,yBAAyB,CAC9B,gBAAgB,EAAE,yBAAyB,EAC3C,gBAAgB,CAAC,EAAE,oBAAoB,EAAE,GACxC,MAAM;IAiDT;;OAEG;IACH,MAAM,CAAC,uBAAuB,CAAC,OAAO,EAAE,cAAc,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG;QAC9F,gBAAgB,EAAE,MAAM,EAAE,CAAC;QAC3B,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QAC7B,IAAI,EAAE,MAAM,EAAE,CAAC;KAChB;IA+DD;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,uBAAuB;mBAmBjB,iBAAiB;CAqCvC"}
|