@roxybrowser/openapi 1.0.5-beta.1 → 1.0.7

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 (47) hide show
  1. package/README.md +228 -228
  2. package/lib/index.js +93 -1670
  3. package/lib/index.js.map +1 -1
  4. package/lib/modules/account.d.ts +491 -0
  5. package/lib/modules/account.d.ts.map +1 -0
  6. package/lib/modules/account.js +442 -0
  7. package/lib/modules/account.js.map +1 -0
  8. package/lib/modules/browser.d.ts +3011 -0
  9. package/lib/modules/browser.d.ts.map +1 -0
  10. package/lib/modules/browser.js +1076 -0
  11. package/lib/modules/browser.js.map +1 -0
  12. package/lib/modules/other.d.ts +102 -0
  13. package/lib/modules/other.d.ts.map +1 -0
  14. package/lib/modules/other.js +194 -0
  15. package/lib/modules/other.js.map +1 -0
  16. package/lib/modules/proxy.d.ts +576 -0
  17. package/lib/modules/proxy.d.ts.map +1 -0
  18. package/lib/modules/proxy.js +713 -0
  19. package/lib/modules/proxy.js.map +1 -0
  20. package/lib/types.d.ts +860 -155
  21. package/lib/types.d.ts.map +1 -1
  22. package/lib/types.js +4 -4
  23. package/lib/types.js.map +1 -1
  24. package/lib/utils/error-analyzer.d.ts.map +1 -1
  25. package/lib/utils/error-analyzer.js +17 -15
  26. package/lib/utils/error-analyzer.js.map +1 -1
  27. package/lib/utils/index.d.ts +24 -0
  28. package/lib/utils/index.d.ts.map +1 -0
  29. package/lib/utils/index.js +45 -0
  30. package/lib/utils/index.js.map +1 -0
  31. package/package.json +50 -50
  32. package/lib/browser/browser-creator.d.ts +0 -54
  33. package/lib/browser/browser-creator.d.ts.map +0 -1
  34. package/lib/browser/browser-creator.js +0 -263
  35. package/lib/browser/browser-creator.js.map +0 -1
  36. package/lib/proxy/proxy-manager.d.ts +0 -67
  37. package/lib/proxy/proxy-manager.d.ts.map +0 -1
  38. package/lib/proxy/proxy-manager.js +0 -278
  39. package/lib/proxy/proxy-manager.js.map +0 -1
  40. package/lib/proxy/proxy-validator.d.ts +0 -66
  41. package/lib/proxy/proxy-validator.d.ts.map +0 -1
  42. package/lib/proxy/proxy-validator.js +0 -273
  43. package/lib/proxy/proxy-validator.js.map +0 -1
  44. package/lib/roxy-client.d.ts +0 -117
  45. package/lib/roxy-client.d.ts.map +0 -1
  46. package/lib/roxy-client.js +0 -467
  47. package/lib/roxy-client.js.map +0 -1
@@ -1,467 +0,0 @@
1
- /**
2
- * RoxyBrowser API Client
3
- *
4
- * HTTP client for RoxyBrowser REST API with authentication and error handling
5
- */
6
- import { RoxyApiError, ConfigError, } from "./types.js";
7
- export class RoxyClient {
8
- config;
9
- constructor(config) {
10
- // Validate required configuration
11
- if (!config.apiKey?.trim()) {
12
- throw new ConfigError("API key is required");
13
- }
14
- if (!config.apiHost?.trim()) {
15
- throw new ConfigError("API host is required");
16
- }
17
- this.config = {
18
- apiHost: config.apiHost.replace(/\/$/, ""), // Remove trailing slash
19
- apiKey: config.apiKey,
20
- timeout: config.timeout ?? 30000,
21
- };
22
- }
23
- /**
24
- * Make authenticated HTTP request to RoxyBrowser API
25
- */
26
- async makeRequest(endpoint, options = {}) {
27
- const url = `${this.config.apiHost}${endpoint}`;
28
- const controller = new AbortController();
29
- const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);
30
- try {
31
- const response = await fetch(url, {
32
- ...options,
33
- headers: {
34
- "Content-Type": "application/json",
35
- token: this.config.apiKey, // RoxyBrowser uses 'token' header
36
- ...options.headers,
37
- },
38
- signal: controller.signal,
39
- });
40
- clearTimeout(timeoutId);
41
- if (!response.ok) {
42
- const responseText = await response.text().catch(() => "Unknown error");
43
- throw new RoxyApiError(`HTTP ${response.status}: ${response.statusText}`, response.status, responseText, undefined // originalError
44
- );
45
- }
46
- const data = await response.json();
47
- // Check API response code
48
- if (data.code !== 0) {
49
- // Enhanced error message with both Chinese and English
50
- let errorMessage = data.msg || "API request failed";
51
- // Special handling for code 409 with quota error
52
- if (data.code === 409 && data.msg && data.msg.includes('额度不足')) {
53
- const remainingQuota = typeof data.data === 'number' ? data.data : 0;
54
- errorMessage = `窗口额度不足 / Insufficient profiles quota. 剩余额度 / Remaining: ${remainingQuota}. 请前往 RoxyBrowser 购买窗口套餐 / Please purchase more profiles in RoxyBrowser.`;
55
- }
56
- throw new RoxyApiError(errorMessage, data.code, data, undefined // originalError
57
- );
58
- }
59
- return data.data;
60
- }
61
- catch (error) {
62
- clearTimeout(timeoutId);
63
- if (error instanceof RoxyApiError) {
64
- throw error;
65
- }
66
- if (error instanceof Error) {
67
- if (error.name === "AbortError") {
68
- throw new RoxyApiError(`Request timeout after ${this.config.timeout}ms`, 408, undefined, error // originalError
69
- );
70
- }
71
- // Enhanced network error handling with pattern detection
72
- throw new RoxyApiError(`Network error: ${error.message}`, 0, undefined, error // originalError for pattern analysis
73
- );
74
- }
75
- throw new RoxyApiError("Unknown error occurred", 0, error, error instanceof Error ? error : undefined);
76
- }
77
- }
78
- /**
79
- * Get list of workspaces and projects
80
- */
81
- async getWorkspaces(pageIndex = 1, pageSize = 15) {
82
- const params = new URLSearchParams({
83
- page_index: pageIndex.toString(),
84
- page_size: pageSize.toString(),
85
- });
86
- return this.makeRequest(`/browser/workspace?${params}`, {
87
- method: "GET",
88
- });
89
- }
90
- /**
91
- * Get list of browsers in workspace/project
92
- */
93
- async getBrowsers(params) {
94
- const searchParams = new URLSearchParams();
95
- searchParams.append("workspaceId", params.workspaceId.toString());
96
- if (params.dirIds)
97
- searchParams.append("dirIds", params.dirIds);
98
- if (params.windowName)
99
- searchParams.append("windowName", params.windowName);
100
- if (params.sortNums)
101
- searchParams.append("sortNums", params.sortNums);
102
- if (params.os)
103
- searchParams.append("os", params.os);
104
- if (params.projectIds)
105
- searchParams.append("projectIds", params.projectIds);
106
- if (params.windowRemark)
107
- searchParams.append("windowRemark", params.windowRemark);
108
- if (params.page_index)
109
- searchParams.append("page_index", params.page_index.toString());
110
- if (params.page_size)
111
- searchParams.append("page_size", params.page_size.toString());
112
- return this.makeRequest(`/browser/list_v3?${searchParams}`, {
113
- method: "GET",
114
- });
115
- }
116
- /**
117
- * Open a single browser
118
- */
119
- async openBrowser(params) {
120
- return this.makeRequest("/browser/open", {
121
- method: "POST",
122
- body: JSON.stringify(params),
123
- });
124
- }
125
- /**
126
- * Open multiple browsers in batch with enhanced error handling and retry logic
127
- */
128
- async openBrowsers(workspaceId, dirIds, args, options = {}) {
129
- const { maxRetries = 2, retryDelay = 1000 } = options;
130
- const successes = [];
131
- const failures = [];
132
- // Open browsers in parallel with reasonable concurrency
133
- const BATCH_SIZE = 5;
134
- for (let i = 0; i < dirIds.length; i += BATCH_SIZE) {
135
- const batch = dirIds.slice(i, i + BATCH_SIZE);
136
- const batchPromises = batch.map(async (dirId) => {
137
- let lastError = null;
138
- let lastErrorCode = undefined;
139
- // Retry logic for each browser
140
- for (let attempt = 0; attempt <= maxRetries; attempt++) {
141
- try {
142
- const result = await this.openBrowser({ workspaceId, dirId, args });
143
- return { dirId, result };
144
- }
145
- catch (error) {
146
- lastError =
147
- error instanceof Error ? error : new Error("Unknown error");
148
- // Capture error code if available
149
- if (error instanceof RoxyApiError) {
150
- lastErrorCode = error.code;
151
- // Don't retry non-retryable errors
152
- if (!error.isRetryable()) {
153
- break;
154
- }
155
- }
156
- // Don't wait after the last attempt
157
- if (attempt < maxRetries) {
158
- await new Promise((resolve) => setTimeout(resolve, retryDelay * (attempt + 1)));
159
- }
160
- }
161
- }
162
- // All attempts failed
163
- const isRetryable = lastError instanceof RoxyApiError ? lastError.isRetryable() : true;
164
- return {
165
- dirId,
166
- error: lastError?.message || "Unknown error",
167
- errorCode: lastErrorCode,
168
- retryable: isRetryable,
169
- };
170
- });
171
- const batchResults = await Promise.all(batchPromises);
172
- for (const item of batchResults) {
173
- if ("result" in item && item.result) {
174
- successes.push(item.result);
175
- }
176
- else if ("error" in item) {
177
- failures.push({
178
- dirId: item.dirId,
179
- error: item.error,
180
- errorCode: item.errorCode,
181
- retryable: "retryable" in item ? item.retryable : true,
182
- });
183
- }
184
- }
185
- }
186
- // Enhanced error reporting
187
- if (failures.length > 0) {
188
- const retryableErrors = failures.filter((e) => e.retryable);
189
- const nonRetryableErrors = failures.filter((e) => !e.retryable);
190
- console.warn(`Browser opening completed with ${failures.length} errors:`);
191
- if (retryableErrors.length > 0) {
192
- console.warn(` - ${retryableErrors.length} retryable errors (could retry later)`);
193
- }
194
- if (nonRetryableErrors.length > 0) {
195
- console.warn(` - ${nonRetryableErrors.length} non-retryable errors (require intervention)`);
196
- }
197
- }
198
- return { successes, failures };
199
- }
200
- /**
201
- * Close a single browser
202
- */
203
- async closeBrowser(params) {
204
- await this.makeRequest("/browser/close", {
205
- method: "POST",
206
- body: JSON.stringify(params),
207
- });
208
- }
209
- /**
210
- * Close multiple browsers in batch
211
- */
212
- async closeBrowsers(dirIds) {
213
- const results = [];
214
- // Close browsers in parallel
215
- const closePromises = dirIds.map(async (dirId) => {
216
- try {
217
- await this.closeBrowser({ dirId });
218
- return { dirId, success: true };
219
- }
220
- catch (error) {
221
- const errorMsg = error instanceof Error ? error.message : "Unknown error";
222
- return { dirId, success: false, error: errorMsg };
223
- }
224
- });
225
- const closeResults = await Promise.all(closePromises);
226
- results.push(...closeResults);
227
- return results;
228
- }
229
- /**
230
- * Create a single browser
231
- */
232
- async createBrowser(config) {
233
- return this.makeRequest("/browser/create", {
234
- method: "POST",
235
- body: JSON.stringify(config),
236
- });
237
- }
238
- /**
239
- * Create multiple browsers in batch
240
- */
241
- async createBrowsers(configs) {
242
- const results = [];
243
- const errors = [];
244
- // Create browsers in parallel with reasonable concurrency
245
- const BATCH_SIZE = 3;
246
- for (let i = 0; i < configs.length; i += BATCH_SIZE) {
247
- const batch = configs.slice(i, i + BATCH_SIZE);
248
- const batchPromises = batch.map(async (config, batchIndex) => {
249
- try {
250
- const result = await this.createBrowser(config);
251
- return {
252
- dirId: result.dirId,
253
- windowName: config.windowName || `Browser-${i + batchIndex + 1}`,
254
- success: true,
255
- };
256
- }
257
- catch (error) {
258
- const errorMsg = error instanceof Error ? error.message : "Unknown error";
259
- errors.push({ config, error: errorMsg });
260
- return {
261
- dirId: "",
262
- windowName: config.windowName || `Browser-${i + batchIndex + 1}`,
263
- success: false,
264
- error: errorMsg,
265
- };
266
- }
267
- });
268
- const batchResults = await Promise.all(batchPromises);
269
- results.push(...batchResults);
270
- // Add small delay between batches to avoid overwhelming the API
271
- if (i + BATCH_SIZE < configs.length) {
272
- await new Promise((resolve) => setTimeout(resolve, 1000));
273
- }
274
- }
275
- const successCount = results.filter((r) => r.success).length;
276
- const failureCount = results.filter((r) => !r.success).length;
277
- // If there were errors and some successes, log warnings
278
- if (errors.length > 0) {
279
- console.warn(`${errors.length} browser creation(s) failed:`, errors);
280
- }
281
- return {
282
- results,
283
- successCount,
284
- failureCount,
285
- total: configs.length,
286
- };
287
- }
288
- /**
289
- * Get browser details by ID
290
- */
291
- async getBrowserDetail(workspaceId, dirId) {
292
- const params = new URLSearchParams({
293
- workspaceId: workspaceId.toString(),
294
- dirId,
295
- });
296
- const response = await this.makeRequest(`/browser/detail?${params}`, {
297
- method: "GET",
298
- });
299
- // API returns { rows: [browser object], total: 1 }, extract first browser
300
- if (response.rows && response.rows.length > 0) {
301
- return response.rows[0];
302
- }
303
- throw new Error('Browser not found or no data returned');
304
- }
305
- /**
306
- * Update/modify existing browser
307
- */
308
- async updateBrowser(config) {
309
- await this.makeRequest("/browser/mdf", {
310
- method: "POST",
311
- body: JSON.stringify(config),
312
- });
313
- }
314
- /**
315
- * Delete browsers
316
- */
317
- async deleteBrowsers(workspaceId, dirIds) {
318
- await this.makeRequest("/browser/delete", {
319
- method: "POST",
320
- body: JSON.stringify({ workspaceId, dirIds }),
321
- });
322
- }
323
- /**
324
- * Random fingerprint for browser
325
- */
326
- async randomBrowserFingerprint(workspaceId, dirId) {
327
- await this.makeRequest("/browser/random_env", {
328
- method: "POST",
329
- body: JSON.stringify({ workspaceId, dirId }),
330
- });
331
- }
332
- /**
333
- * Clear browser local cache
334
- */
335
- async clearBrowserLocalCache(dirIds) {
336
- await this.makeRequest("/browser/clear_local_cache", {
337
- method: "POST",
338
- body: JSON.stringify({ dirIds }),
339
- });
340
- }
341
- /**
342
- * Clear browser server cache
343
- */
344
- async clearBrowserServerCache(workspaceId, dirIds) {
345
- await this.makeRequest("/browser/clear_server_cache", {
346
- method: "POST",
347
- body: JSON.stringify({ workspaceId, dirIds }),
348
- });
349
- }
350
- /**
351
- * Get account list
352
- */
353
- async getAccounts(params) {
354
- const searchParams = new URLSearchParams();
355
- searchParams.append("workspaceId", params.workspaceId.toString());
356
- if (params.accountId)
357
- searchParams.append("accountId", params.accountId.toString());
358
- if (params.page_index)
359
- searchParams.append("page_index", params.page_index.toString());
360
- if (params.page_size)
361
- searchParams.append("page_size", params.page_size.toString());
362
- return this.makeRequest(`/browser/account?${searchParams}`, {
363
- method: "GET",
364
- });
365
- }
366
- /**
367
- * Get label list
368
- */
369
- async getLabels(workspaceId) {
370
- const params = new URLSearchParams({
371
- workspaceId: workspaceId.toString(),
372
- });
373
- return this.makeRequest(`/browser/label?${params}`, {
374
- method: "GET",
375
- });
376
- }
377
- /**
378
- * Get connection info for opened browsers
379
- */
380
- async getConnectionInfo(dirIds) {
381
- const params = new URLSearchParams();
382
- if (dirIds && dirIds.length > 0) {
383
- params.append("dirIds", dirIds.join(","));
384
- }
385
- const queryString = params.toString();
386
- const endpoint = queryString
387
- ? `/browser/connection_info?${queryString}`
388
- : "/browser/connection_info";
389
- return this.makeRequest(endpoint, {
390
- method: "GET",
391
- });
392
- }
393
- /**
394
- * Test API connectivity with detailed diagnostics
395
- */
396
- async testConnection() {
397
- try {
398
- await this.makeRequest("/health");
399
- return true;
400
- }
401
- catch (error) {
402
- console.error("Connection test failed:", error);
403
- return false;
404
- }
405
- }
406
- /**
407
- * Perform comprehensive API diagnostics
408
- */
409
- async performDiagnostics() {
410
- const result = {
411
- connected: false,
412
- authentication: false,
413
- workspaceAccess: false,
414
- errors: [],
415
- recommendations: [],
416
- };
417
- // Test 1: Basic connectivity
418
- try {
419
- await this.makeRequest("/health");
420
- result.connected = true;
421
- }
422
- catch (error) {
423
- result.connected = false;
424
- if (error instanceof RoxyApiError) {
425
- result.errors.push(`Connection failed: ${error.getExplanation()}`);
426
- result.recommendations.push(...error.getTroubleshootingSteps());
427
- }
428
- else {
429
- result.errors.push(`Network error: ${error instanceof Error ? error.message : "Unknown error"}`);
430
- result.recommendations.push("Check if RoxyBrowser is running", "Verify API host configuration", "Check network connectivity");
431
- }
432
- }
433
- // Test 2: Authentication (if connected)
434
- if (result.connected) {
435
- try {
436
- await this.getWorkspaces(1, 1);
437
- result.authentication = true;
438
- result.workspaceAccess = true;
439
- }
440
- catch (error) {
441
- if (error instanceof RoxyApiError) {
442
- if (error.code === 401) {
443
- result.authentication = false;
444
- result.errors.push("Authentication failed: Invalid API key");
445
- result.recommendations.push("Check ROXY_API_KEY environment variable", "Verify API key in RoxyBrowser settings", "Ensure API is enabled in RoxyBrowser");
446
- }
447
- else if (error.code === 403) {
448
- result.authentication = true;
449
- result.workspaceAccess = false;
450
- result.errors.push("Access denied: Insufficient permissions");
451
- result.recommendations.push("Check API key permissions", "Verify workspace access rights");
452
- }
453
- else {
454
- result.authentication = true;
455
- result.errors.push(`API error: ${error.getExplanation()}`);
456
- result.recommendations.push(...error.getTroubleshootingSteps());
457
- }
458
- }
459
- else {
460
- result.errors.push(`Unexpected error: ${error instanceof Error ? error.message : "Unknown error"}`);
461
- }
462
- }
463
- }
464
- return result;
465
- }
466
- }
467
- //# sourceMappingURL=roxy-client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"roxy-client.js","sourceRoot":"","sources":["../src/roxy-client.ts"],"names":[],"mappings":"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"}