@olib-ai/owl-browser-sdk 1.2.2 → 1.2.4
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 +116 -3
- package/dist/browser.d.ts +99 -1
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +131 -1
- package/dist/browser.js.map +1 -1
- package/dist/connection.d.ts +17 -1
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +230 -14
- package/dist/connection.js.map +1 -1
- package/dist/context.d.ts +411 -15
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +1175 -69
- package/dist/context.js.map +1 -1
- package/dist/core.d.ts +3 -2
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js +14 -0
- package/dist/core.js.map +1 -1
- package/dist/errors.d.ts +134 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +201 -1
- package/dist/errors.js.map +1 -1
- package/dist/flow.d.ts +60 -0
- package/dist/flow.d.ts.map +1 -0
- package/dist/flow.js +376 -0
- package/dist/flow.js.map +1 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -1
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +507 -6
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -297,6 +297,14 @@ await page.keyboardCombo('c', ['ctrl']); // Ctrl+C (copy)
|
|
|
297
297
|
await page.keyboardCombo('v', ['ctrl']); // Ctrl+V (paste)
|
|
298
298
|
await page.keyboardCombo('z', ['ctrl']); // Ctrl+Z (undo)
|
|
299
299
|
await page.keyboardCombo('s', ['ctrl', 'shift']); // Ctrl+Shift+S
|
|
300
|
+
|
|
301
|
+
// Human-like mouse movement (anti-bot detection)
|
|
302
|
+
await page.mouseMove(100, 100, 500, 300); // Move from (100,100) to (500,300)
|
|
303
|
+
await page.mouseMove(100, 100, 500, 300, 50); // With 50 intermediate steps
|
|
304
|
+
await page.mouseMove(100, 100, 500, 300, 0, [ // With stop points
|
|
305
|
+
[200, 150],
|
|
306
|
+
[350, 250]
|
|
307
|
+
]);
|
|
300
308
|
```
|
|
301
309
|
|
|
302
310
|
#### Element State Checks
|
|
@@ -844,7 +852,12 @@ import {
|
|
|
844
852
|
RateLimitError,
|
|
845
853
|
IPBlockedError,
|
|
846
854
|
LicenseError,
|
|
847
|
-
BrowserInitializationError
|
|
855
|
+
BrowserInitializationError,
|
|
856
|
+
ActionError,
|
|
857
|
+
ActionStatus,
|
|
858
|
+
ElementNotFoundError,
|
|
859
|
+
NavigationError,
|
|
860
|
+
FirewallError
|
|
848
861
|
} from '@olib-ai/owl-browser-sdk';
|
|
849
862
|
|
|
850
863
|
async function withErrorHandling() {
|
|
@@ -863,9 +876,34 @@ async function withErrorHandling() {
|
|
|
863
876
|
await page.goto('https://example.com');
|
|
864
877
|
|
|
865
878
|
// Your automation code...
|
|
879
|
+
await page.click('non-existent button');
|
|
866
880
|
|
|
867
881
|
} catch (error) {
|
|
868
|
-
if (error instanceof
|
|
882
|
+
if (error instanceof ElementNotFoundError) {
|
|
883
|
+
// Element was not found on the page
|
|
884
|
+
console.error('Element not found:', error.message);
|
|
885
|
+
} else if (error instanceof NavigationError) {
|
|
886
|
+
// Navigation failed (timeout, page load error, etc.)
|
|
887
|
+
console.error('Navigation failed:', error.message);
|
|
888
|
+
} else if (error instanceof ActionError) {
|
|
889
|
+
// Generic action error with detailed status
|
|
890
|
+
console.error('Action failed:', error.message);
|
|
891
|
+
console.error('Status:', error.status);
|
|
892
|
+
console.error('Selector:', error.selector);
|
|
893
|
+
// Check specific error types
|
|
894
|
+
if (error.isElementNotFound()) {
|
|
895
|
+
console.error('Could not find element');
|
|
896
|
+
} else if (error.isNavigationError()) {
|
|
897
|
+
console.error('Navigation issue');
|
|
898
|
+
} else if (error.isTimeout()) {
|
|
899
|
+
console.error('Operation timed out');
|
|
900
|
+
}
|
|
901
|
+
} else if (error instanceof FirewallError) {
|
|
902
|
+
// Web firewall/bot protection detected
|
|
903
|
+
console.error('Firewall detected:', error.provider);
|
|
904
|
+
console.error('Challenge type:', error.challengeType);
|
|
905
|
+
console.error('URL:', error.url);
|
|
906
|
+
} else if (error instanceof AuthenticationError) {
|
|
869
907
|
// 401 - Invalid or expired token
|
|
870
908
|
console.error('Auth failed:', error.message);
|
|
871
909
|
console.error('Reason:', error.reason);
|
|
@@ -887,17 +925,92 @@ async function withErrorHandling() {
|
|
|
887
925
|
}
|
|
888
926
|
```
|
|
889
927
|
|
|
928
|
+
### Action Result Validation
|
|
929
|
+
|
|
930
|
+
The browser returns structured `ActionResult` responses for browser actions, providing detailed information about success or failure:
|
|
931
|
+
|
|
932
|
+
```typescript
|
|
933
|
+
import {
|
|
934
|
+
ActionStatus,
|
|
935
|
+
ActionResult,
|
|
936
|
+
ActionError,
|
|
937
|
+
isActionResult,
|
|
938
|
+
throwIfActionFailed
|
|
939
|
+
} from '@olib-ai/owl-browser-sdk';
|
|
940
|
+
|
|
941
|
+
// ActionStatus enum values
|
|
942
|
+
ActionStatus.OK // Action succeeded
|
|
943
|
+
ActionStatus.ELEMENT_NOT_FOUND // Element not found on page
|
|
944
|
+
ActionStatus.ELEMENT_NOT_VISIBLE // Element exists but not visible
|
|
945
|
+
ActionStatus.ELEMENT_NOT_INTERACTABLE // Element not interactable
|
|
946
|
+
ActionStatus.NAVIGATION_FAILED // Navigation failed
|
|
947
|
+
ActionStatus.NAVIGATION_TIMEOUT // Navigation timed out
|
|
948
|
+
ActionStatus.PAGE_LOAD_ERROR // Page failed to load
|
|
949
|
+
ActionStatus.FIREWALL_DETECTED // Web firewall/bot protection detected
|
|
950
|
+
ActionStatus.CAPTCHA_DETECTED // CAPTCHA challenge detected
|
|
951
|
+
ActionStatus.CLICK_FAILED // Click action failed
|
|
952
|
+
ActionStatus.TYPE_FAILED // Type action failed
|
|
953
|
+
ActionStatus.CONTEXT_NOT_FOUND // Browser context not found
|
|
954
|
+
ActionStatus.INVALID_SELECTOR // Invalid selector provided
|
|
955
|
+
ActionStatus.TIMEOUT // Operation timed out
|
|
956
|
+
|
|
957
|
+
// ActionResult interface
|
|
958
|
+
interface ActionResult {
|
|
959
|
+
success: boolean;
|
|
960
|
+
status: ActionStatus | string;
|
|
961
|
+
message: string;
|
|
962
|
+
selector?: string; // The selector that failed (for element errors)
|
|
963
|
+
url?: string; // URL involved (for navigation errors)
|
|
964
|
+
http_status?: number; // HTTP status code (for navigation)
|
|
965
|
+
error_code?: string; // Browser error code
|
|
966
|
+
element_count?: number; // Elements found (for multiple_elements error)
|
|
967
|
+
}
|
|
968
|
+
|
|
969
|
+
// Helper functions
|
|
970
|
+
if (isActionResult(result)) {
|
|
971
|
+
if (!result.success) {
|
|
972
|
+
throwIfActionFailed(result); // Throws appropriate exception
|
|
973
|
+
}
|
|
974
|
+
}
|
|
975
|
+
```
|
|
976
|
+
|
|
890
977
|
### Exception Types
|
|
891
978
|
|
|
892
979
|
| Exception | HTTP Code | Description |
|
|
893
980
|
|-----------|-----------|-------------|
|
|
981
|
+
| `ActionError` | - | Browser action failed with status code and details |
|
|
982
|
+
| `ElementNotFoundError` | - | Element not found on page |
|
|
983
|
+
| `NavigationError` | - | Navigation failed (timeout, load error) |
|
|
984
|
+
| `FirewallError` | - | Web firewall/bot protection detected (Cloudflare, Akamai, etc.) |
|
|
985
|
+
| `ContextError` | - | Browser context not found |
|
|
894
986
|
| `AuthenticationError` | 401 | Invalid/expired token or JWT signature mismatch |
|
|
895
987
|
| `RateLimitError` | 429 | Too many requests, includes `retryAfter` in seconds |
|
|
896
988
|
| `IPBlockedError` | 403 | Client IP not in whitelist |
|
|
897
989
|
| `LicenseError` | 503 | Browser license validation failed |
|
|
898
990
|
| `BrowserInitializationError` | - | Failed to start/connect to browser |
|
|
899
991
|
| `CommandTimeoutError` | - | Operation timed out |
|
|
900
|
-
|
|
992
|
+
|
|
993
|
+
### FirewallError Properties
|
|
994
|
+
|
|
995
|
+
| Property | Type | Description |
|
|
996
|
+
|----------|------|-------------|
|
|
997
|
+
| `url` | `string` | The URL where the firewall was detected |
|
|
998
|
+
| `provider` | `string` | Firewall provider (Cloudflare, Akamai, Imperva, etc.) |
|
|
999
|
+
| `challengeType` | `string?` | Type of challenge (JS Challenge, CAPTCHA, etc.) |
|
|
1000
|
+
|
|
1001
|
+
The browser automatically detects web firewalls including Cloudflare, Akamai, Imperva, PerimeterX, DataDome, and AWS WAF.
|
|
1002
|
+
|
|
1003
|
+
### ActionError Properties
|
|
1004
|
+
|
|
1005
|
+
| Property | Type | Description |
|
|
1006
|
+
|----------|------|-------------|
|
|
1007
|
+
| `status` | `ActionStatus` | Status code (e.g., `element_not_found`) |
|
|
1008
|
+
| `message` | `string` | Human-readable error message |
|
|
1009
|
+
| `selector` | `string?` | The selector that failed |
|
|
1010
|
+
| `url` | `string?` | URL involved in navigation errors |
|
|
1011
|
+
| `httpStatus` | `number?` | HTTP status code |
|
|
1012
|
+
| `errorCode` | `string?` | Browser error code |
|
|
1013
|
+
| `elementCount` | `number?` | Number of elements found |
|
|
901
1014
|
|
|
902
1015
|
## Performance Tips
|
|
903
1016
|
|
package/dist/browser.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { BrowserContext } from './context';
|
|
2
|
-
import type { BrowserConfig, LLMStatus, DemographicsInfo, LocationInfo, DateTimeInfo, WeatherInfo, ContextOptions } from './types';
|
|
2
|
+
import type { BrowserConfig, LLMStatus, DemographicsInfo, LocationInfo, DateTimeInfo, WeatherInfo, ContextOptions, BrowserProfile, LicenseStatusResponse, LicenseInfo, HardwareFingerprint, LiveStreamInfo } from './types';
|
|
3
3
|
/**
|
|
4
4
|
* Main Browser class for automation
|
|
5
5
|
*
|
|
@@ -75,6 +75,18 @@ export declare class Browser {
|
|
|
75
75
|
* Get all active pages
|
|
76
76
|
*/
|
|
77
77
|
pages(): BrowserContext[];
|
|
78
|
+
/**
|
|
79
|
+
* List all active context IDs from the browser
|
|
80
|
+
* This queries the browser directly, useful for debugging
|
|
81
|
+
* @returns Array of context ID strings
|
|
82
|
+
*
|
|
83
|
+
* @example
|
|
84
|
+
* ```typescript
|
|
85
|
+
* const contextIds = await browser.listContexts();
|
|
86
|
+
* console.log(`Active contexts: ${contextIds.join(', ')}`);
|
|
87
|
+
* ```
|
|
88
|
+
*/
|
|
89
|
+
listContexts(): Promise<string[]>;
|
|
78
90
|
/**
|
|
79
91
|
* Check if on-device LLM is ready
|
|
80
92
|
*/
|
|
@@ -147,6 +159,92 @@ export declare class Browser {
|
|
|
147
159
|
* ```
|
|
148
160
|
*/
|
|
149
161
|
getHomepage(): Promise<string>;
|
|
162
|
+
/**
|
|
163
|
+
* Create a new browser profile with randomized fingerprint
|
|
164
|
+
* @param name - Human-readable name for the profile
|
|
165
|
+
*
|
|
166
|
+
* @example
|
|
167
|
+
* ```typescript
|
|
168
|
+
* const profile = await browser.createProfile('My Profile');
|
|
169
|
+
* console.log(`Created profile: ${profile.profileId}`);
|
|
170
|
+
* ```
|
|
171
|
+
*/
|
|
172
|
+
createProfile(name?: string): Promise<BrowserProfile>;
|
|
173
|
+
/**
|
|
174
|
+
* List all active live streams across all contexts
|
|
175
|
+
*
|
|
176
|
+
* @example
|
|
177
|
+
* ```typescript
|
|
178
|
+
* const streams = await browser.listLiveStreams();
|
|
179
|
+
* for (const stream of streams) {
|
|
180
|
+
* console.log(`Stream ${stream.contextId}: ${stream.fps}fps, ${stream.subscribers} viewers`);
|
|
181
|
+
* }
|
|
182
|
+
* ```
|
|
183
|
+
*/
|
|
184
|
+
listLiveStreams(): Promise<LiveStreamInfo[]>;
|
|
185
|
+
/**
|
|
186
|
+
* Get current license status
|
|
187
|
+
*
|
|
188
|
+
* @example
|
|
189
|
+
* ```typescript
|
|
190
|
+
* const status = await browser.getLicenseStatus();
|
|
191
|
+
* if (status.valid) {
|
|
192
|
+
* console.log('License is active');
|
|
193
|
+
* } else {
|
|
194
|
+
* console.log(`License issue: ${status.status}`);
|
|
195
|
+
* }
|
|
196
|
+
* ```
|
|
197
|
+
*/
|
|
198
|
+
getLicenseStatus(): Promise<LicenseStatusResponse>;
|
|
199
|
+
/**
|
|
200
|
+
* Get detailed license information
|
|
201
|
+
*
|
|
202
|
+
* @example
|
|
203
|
+
* ```typescript
|
|
204
|
+
* const info = await browser.getLicenseInfo();
|
|
205
|
+
* console.log(`License: ${info.licenseId}`);
|
|
206
|
+
* console.log(`Expires: ${info.expiresAt}`);
|
|
207
|
+
* console.log(`Features: ${info.features.join(', ')}`);
|
|
208
|
+
* ```
|
|
209
|
+
*/
|
|
210
|
+
getLicenseInfo(): Promise<LicenseInfo>;
|
|
211
|
+
/**
|
|
212
|
+
* Get hardware fingerprint for license binding
|
|
213
|
+
*
|
|
214
|
+
* @example
|
|
215
|
+
* ```typescript
|
|
216
|
+
* const hw = await browser.getHardwareFingerprint();
|
|
217
|
+
* console.log(`Hardware ID: ${hw.fingerprint}`);
|
|
218
|
+
* ```
|
|
219
|
+
*/
|
|
220
|
+
getHardwareFingerprint(): Promise<HardwareFingerprint>;
|
|
221
|
+
/**
|
|
222
|
+
* Add/activate a license
|
|
223
|
+
* @param licensePath - Path to the license file (.olic)
|
|
224
|
+
* @param licenseContent - Base64-encoded license content (alternative to path)
|
|
225
|
+
*
|
|
226
|
+
* @example
|
|
227
|
+
* ```typescript
|
|
228
|
+
* // From file
|
|
229
|
+
* await browser.addLicense({ licensePath: '/path/to/license.olic' });
|
|
230
|
+
*
|
|
231
|
+
* // From base64 content
|
|
232
|
+
* await browser.addLicense({ licenseContent: 'base64encodedcontent...' });
|
|
233
|
+
* ```
|
|
234
|
+
*/
|
|
235
|
+
addLicense(options: {
|
|
236
|
+
licensePath?: string;
|
|
237
|
+
licenseContent?: string;
|
|
238
|
+
}): Promise<void>;
|
|
239
|
+
/**
|
|
240
|
+
* Remove the current license
|
|
241
|
+
*
|
|
242
|
+
* @example
|
|
243
|
+
* ```typescript
|
|
244
|
+
* await browser.removeLicense();
|
|
245
|
+
* ```
|
|
246
|
+
*/
|
|
247
|
+
removeLicense(): Promise<void>;
|
|
150
248
|
/**
|
|
151
249
|
* Close all contexts and shutdown browser
|
|
152
250
|
*/
|
package/dist/browser.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,KAAK,EACV,aAAa,EAEb,SAAS,EACT,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,cAAc,EACf,MAAM,SAAS,CAAC;AAEjB;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,OAAO;IAClB,OAAO,CAAC,IAAI,CAAc;IAC1B,OAAO,CAAC,QAAQ,CAA6C;IAC7D,OAAO,CAAC,UAAU,CAAS;gBAEf,MAAM,CAAC,EAAE,aAAa;IAIlC;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB7B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2CG;IACG,OAAO,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,KAAK,EACV,aAAa,EAEb,SAAS,EACT,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,cAAc,EACd,cAAc,EACd,qBAAqB,EACrB,WAAW,EACX,mBAAmB,EACnB,cAAc,EACf,MAAM,SAAS,CAAC;AAEjB;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,OAAO;IAClB,OAAO,CAAC,IAAI,CAAc;IAC1B,OAAO,CAAC,QAAQ,CAA6C;IAC7D,OAAO,CAAC,UAAU,CAAS;gBAEf,MAAM,CAAC,EAAE,aAAa;IAIlC;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB7B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2CG;IACG,OAAO,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IAahE;;OAEG;IACH,KAAK,IAAI,cAAc,EAAE;IAIzB;;;;;;;;;;OAUG;IACG,YAAY,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAOvC;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,SAAS,CAAC;IAOxC;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAOxC;;;;;;;;;;OAUG;IACG,eAAe,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAOlD;;;;;;;;;;;OAWG;IACG,WAAW,IAAI,OAAO,CAAC,YAAY,CAAC;IAO1C;;;;;;;;;OASG;IACG,WAAW,IAAI,OAAO,CAAC,YAAY,CAAC;IAO1C;;;;;;;;;;;;OAYG;IACG,UAAU,IAAI,OAAO,CAAC,WAAW,CAAC;IAOxC;;;;;;;;;;;;OAYG;IACG,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;IASpC;;;;;;;;;OASG;IACG,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAW3D;;;;;;;;;;OAUG;IACG,eAAe,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IASlD;;;;;;;;;;;;OAYG;IACG,gBAAgB,IAAI,OAAO,CAAC,qBAAqB,CAAC;IAKxD;;;;;;;;;;OAUG;IACG,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC;IAI5C;;;;;;;;OAQG;IACG,sBAAsB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAI5D;;;;;;;;;;;;;OAaG;IACG,UAAU,CAAC,OAAO,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAO3F;;;;;;;OAOG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAIpC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB5B;;OAEG;IACH,OAAO,CAAC,WAAW;IAMnB;;OAEG;IACH,SAAS,IAAI,OAAO;CAGrB"}
|
package/dist/browser.js
CHANGED
|
@@ -94,7 +94,8 @@ class Browser {
|
|
|
94
94
|
if (!this.isLaunched) {
|
|
95
95
|
throw new Error('Browser not launched. Call launch() first.');
|
|
96
96
|
}
|
|
97
|
-
const
|
|
97
|
+
const contextInfo = await this.core.createContext(options);
|
|
98
|
+
const contextId = contextInfo.context_id;
|
|
98
99
|
const context = new context_1.BrowserContext(contextId, this.core);
|
|
99
100
|
this.contexts.set(contextId, context);
|
|
100
101
|
return context;
|
|
@@ -105,6 +106,23 @@ class Browser {
|
|
|
105
106
|
pages() {
|
|
106
107
|
return Array.from(this.contexts.values());
|
|
107
108
|
}
|
|
109
|
+
/**
|
|
110
|
+
* List all active context IDs from the browser
|
|
111
|
+
* This queries the browser directly, useful for debugging
|
|
112
|
+
* @returns Array of context ID strings
|
|
113
|
+
*
|
|
114
|
+
* @example
|
|
115
|
+
* ```typescript
|
|
116
|
+
* const contextIds = await browser.listContexts();
|
|
117
|
+
* console.log(`Active contexts: ${contextIds.join(', ')}`);
|
|
118
|
+
* ```
|
|
119
|
+
*/
|
|
120
|
+
async listContexts() {
|
|
121
|
+
if (!this.isLaunched) {
|
|
122
|
+
throw new Error('Browser not launched. Call launch() first.');
|
|
123
|
+
}
|
|
124
|
+
return await this.core.sendCommand('listContexts', {});
|
|
125
|
+
}
|
|
108
126
|
/**
|
|
109
127
|
* Check if on-device LLM is ready
|
|
110
128
|
*/
|
|
@@ -212,6 +230,118 @@ class Browser {
|
|
|
212
230
|
}
|
|
213
231
|
return await this.core.getHomepage();
|
|
214
232
|
}
|
|
233
|
+
// ==================== PROFILE MANAGEMENT ====================
|
|
234
|
+
/**
|
|
235
|
+
* Create a new browser profile with randomized fingerprint
|
|
236
|
+
* @param name - Human-readable name for the profile
|
|
237
|
+
*
|
|
238
|
+
* @example
|
|
239
|
+
* ```typescript
|
|
240
|
+
* const profile = await browser.createProfile('My Profile');
|
|
241
|
+
* console.log(`Created profile: ${profile.profileId}`);
|
|
242
|
+
* ```
|
|
243
|
+
*/
|
|
244
|
+
async createProfile(name) {
|
|
245
|
+
if (!this.isLaunched) {
|
|
246
|
+
throw new Error('Browser not launched. Call launch() first.');
|
|
247
|
+
}
|
|
248
|
+
return await this.core.sendCommand('createProfile', {
|
|
249
|
+
name,
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
// ==================== LIVE STREAMING ====================
|
|
253
|
+
/**
|
|
254
|
+
* List all active live streams across all contexts
|
|
255
|
+
*
|
|
256
|
+
* @example
|
|
257
|
+
* ```typescript
|
|
258
|
+
* const streams = await browser.listLiveStreams();
|
|
259
|
+
* for (const stream of streams) {
|
|
260
|
+
* console.log(`Stream ${stream.contextId}: ${stream.fps}fps, ${stream.subscribers} viewers`);
|
|
261
|
+
* }
|
|
262
|
+
* ```
|
|
263
|
+
*/
|
|
264
|
+
async listLiveStreams() {
|
|
265
|
+
if (!this.isLaunched) {
|
|
266
|
+
throw new Error('Browser not launched. Call launch() first.');
|
|
267
|
+
}
|
|
268
|
+
return await this.core.sendCommand('listLiveStreams', {});
|
|
269
|
+
}
|
|
270
|
+
// ==================== LICENSE MANAGEMENT ====================
|
|
271
|
+
/**
|
|
272
|
+
* Get current license status
|
|
273
|
+
*
|
|
274
|
+
* @example
|
|
275
|
+
* ```typescript
|
|
276
|
+
* const status = await browser.getLicenseStatus();
|
|
277
|
+
* if (status.valid) {
|
|
278
|
+
* console.log('License is active');
|
|
279
|
+
* } else {
|
|
280
|
+
* console.log(`License issue: ${status.status}`);
|
|
281
|
+
* }
|
|
282
|
+
* ```
|
|
283
|
+
*/
|
|
284
|
+
async getLicenseStatus() {
|
|
285
|
+
// License methods work even before launch
|
|
286
|
+
return await this.core.sendCommand('getLicenseStatus', {});
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Get detailed license information
|
|
290
|
+
*
|
|
291
|
+
* @example
|
|
292
|
+
* ```typescript
|
|
293
|
+
* const info = await browser.getLicenseInfo();
|
|
294
|
+
* console.log(`License: ${info.licenseId}`);
|
|
295
|
+
* console.log(`Expires: ${info.expiresAt}`);
|
|
296
|
+
* console.log(`Features: ${info.features.join(', ')}`);
|
|
297
|
+
* ```
|
|
298
|
+
*/
|
|
299
|
+
async getLicenseInfo() {
|
|
300
|
+
return await this.core.sendCommand('getLicenseInfo', {});
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Get hardware fingerprint for license binding
|
|
304
|
+
*
|
|
305
|
+
* @example
|
|
306
|
+
* ```typescript
|
|
307
|
+
* const hw = await browser.getHardwareFingerprint();
|
|
308
|
+
* console.log(`Hardware ID: ${hw.fingerprint}`);
|
|
309
|
+
* ```
|
|
310
|
+
*/
|
|
311
|
+
async getHardwareFingerprint() {
|
|
312
|
+
return await this.core.sendCommand('getHardwareFingerprint', {});
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Add/activate a license
|
|
316
|
+
* @param licensePath - Path to the license file (.olic)
|
|
317
|
+
* @param licenseContent - Base64-encoded license content (alternative to path)
|
|
318
|
+
*
|
|
319
|
+
* @example
|
|
320
|
+
* ```typescript
|
|
321
|
+
* // From file
|
|
322
|
+
* await browser.addLicense({ licensePath: '/path/to/license.olic' });
|
|
323
|
+
*
|
|
324
|
+
* // From base64 content
|
|
325
|
+
* await browser.addLicense({ licenseContent: 'base64encodedcontent...' });
|
|
326
|
+
* ```
|
|
327
|
+
*/
|
|
328
|
+
async addLicense(options) {
|
|
329
|
+
await this.core.sendCommand('addLicense', {
|
|
330
|
+
license_path: options.licensePath,
|
|
331
|
+
license_content: options.licenseContent,
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Remove the current license
|
|
336
|
+
*
|
|
337
|
+
* @example
|
|
338
|
+
* ```typescript
|
|
339
|
+
* await browser.removeLicense();
|
|
340
|
+
* ```
|
|
341
|
+
*/
|
|
342
|
+
async removeLicense() {
|
|
343
|
+
await this.core.sendCommand('removeLicense', {});
|
|
344
|
+
}
|
|
215
345
|
/**
|
|
216
346
|
* Close all contexts and shutdown browser
|
|
217
347
|
*/
|
package/dist/browser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":";;;AAAA,iCAAqC;AACrC,uCAA2C;
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":";;;AAAA,iCAAqC;AACrC,uCAA2C;AAiB3C;;;;;;;;;;;;;;;;GAgBG;AACH,MAAa,OAAO;IAKlB,YAAY,MAAsB;QAH1B,aAAQ,GAAmC,IAAI,GAAG,EAAE,CAAC;QACrD,eAAU,GAAG,KAAK,CAAC;QAGzB,IAAI,CAAC,IAAI,GAAG,IAAI,kBAAW,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM;QACV,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QAEvB,wBAAwB;QACxB,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;YAC9B,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;YAC/B,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2CG;IACH,KAAK,CAAC,OAAO,CAAC,OAAwB;QACpC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC3D,MAAM,SAAS,GAAG,WAAW,CAAC,UAAU,CAAC;QACzC,MAAM,OAAO,GAAG,IAAI,wBAAc,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACzD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAEtC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK;QACH,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,YAAY;QAChB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IACzD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY;QAChB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa;QACjB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;IACzC,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,eAAe;QACnB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;IAC3C,CAAC;IAED;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,WAAW;QACf,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IACvC,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,WAAW;QACf,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IACvC,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,UAAU;QACd,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;IACtC,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,WAAW;QACf,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IACvC,CAAC;IAED,+DAA+D;IAE/D;;;;;;;;;OASG;IACH,KAAK,CAAC,aAAa,CAAC,IAAa;QAC/B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE;YAClD,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAED,2DAA2D;IAE3D;;;;;;;;;;OAUG;IACH,KAAK,CAAC,eAAe;QACnB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,+DAA+D;IAE/D;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,gBAAgB;QACpB,0CAA0C;QAC1C,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,cAAc;QAClB,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,sBAAsB;QAC1B,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;IACnE,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,KAAK,CAAC,UAAU,CAAC,OAA0D;QACzE,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE;YACxC,YAAY,EAAE,OAAO,CAAC,WAAW;YACjC,eAAe,EAAE,OAAO,CAAC,cAAc;SACxC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,aAAa;QACjB,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QAED,qBAAqB;QACrB,KAAK,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACjD,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACxB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,uCAAuC;YACzC,CAAC;QACH,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QAEtB,mBAAmB;QACnB,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED;;OAEG;IACK,WAAW;QACjB,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;IAClD,CAAC;CACF;AApYD,0BAoYC"}
|
package/dist/connection.d.ts
CHANGED
|
@@ -34,7 +34,9 @@ export interface BrowserConnection {
|
|
|
34
34
|
isRunning(): boolean;
|
|
35
35
|
}
|
|
36
36
|
/**
|
|
37
|
-
* Local connection using child process IPC (stdin/stdout)
|
|
37
|
+
* Local connection using child process IPC (stdin/stdout or Unix domain socket)
|
|
38
|
+
* On Linux/macOS, uses multi-IPC Unix domain sockets for parallel command processing
|
|
39
|
+
* Each context gets its own dedicated socket for true parallelism
|
|
38
40
|
*/
|
|
39
41
|
export declare class LocalConnection implements BrowserConnection {
|
|
40
42
|
private browserProcess;
|
|
@@ -45,6 +47,11 @@ export declare class LocalConnection implements BrowserConnection {
|
|
|
45
47
|
private browserPath;
|
|
46
48
|
private initTimeout;
|
|
47
49
|
private verbose;
|
|
50
|
+
private socketPath;
|
|
51
|
+
private contextSockets;
|
|
52
|
+
private contextSocketBuffers;
|
|
53
|
+
private defaultSocket;
|
|
54
|
+
private defaultSocketBuffer;
|
|
48
55
|
private licenseError;
|
|
49
56
|
private hardwareFingerprint;
|
|
50
57
|
constructor(config: BrowserConfig);
|
|
@@ -57,7 +64,16 @@ export declare class LocalConnection implements BrowserConnection {
|
|
|
57
64
|
* Handle JSON response from browser
|
|
58
65
|
*/
|
|
59
66
|
private handleResponse;
|
|
67
|
+
/**
|
|
68
|
+
* Connect to the multi-IPC Unix domain socket (default socket for non-context commands)
|
|
69
|
+
*/
|
|
70
|
+
private connectToSocket;
|
|
71
|
+
/**
|
|
72
|
+
* Get or create a socket for a specific context (enables parallel command processing)
|
|
73
|
+
*/
|
|
74
|
+
private getOrCreateContextSocket;
|
|
60
75
|
sendCommand(method: string, params?: Record<string, any>): Promise<any>;
|
|
76
|
+
private setupTimeout;
|
|
61
77
|
shutdown(): Promise<void>;
|
|
62
78
|
isRunning(): boolean;
|
|
63
79
|
}
|
package/dist/connection.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,OAAO,KAAK,EAAE,aAAa,EAA6E,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"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"}
|