@olib-ai/owl-browser-sdk 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/README.md +582 -0
- package/dist/browser.d.ts +163 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +252 -0
- package/dist/browser.js.map +1 -0
- package/dist/connection.d.ts +80 -0
- package/dist/connection.d.ts.map +1 -0
- package/dist/connection.js +641 -0
- package/dist/connection.js.map +1 -0
- package/dist/context.d.ts +443 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +1017 -0
- package/dist/context.js.map +1 -0
- package/dist/core.d.ts +64 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +131 -0
- package/dist/core.js.map +1 -0
- package/dist/errors.d.ts +83 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +150 -0
- package/dist/errors.js.map +1 -0
- package/dist/helpers.d.ts +11 -0
- package/dist/helpers.d.ts.map +1 -0
- package/dist/helpers.js +16 -0
- package/dist/helpers.js.map +1 -0
- package/dist/index.d.ts +53 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +68 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +514 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,641 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Connection abstraction for Owl Browser SDK
|
|
4
|
+
*
|
|
5
|
+
* Provides a unified interface for communicating with the browser,
|
|
6
|
+
* supporting both local (IPC) and remote (HTTP) modes.
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.HttpConnection = exports.LocalConnection = void 0;
|
|
43
|
+
exports.createConnection = createConnection;
|
|
44
|
+
const child_process_1 = require("child_process");
|
|
45
|
+
const path = __importStar(require("path"));
|
|
46
|
+
const fs = __importStar(require("fs"));
|
|
47
|
+
const http = __importStar(require("http"));
|
|
48
|
+
const https = __importStar(require("https"));
|
|
49
|
+
const errors_1 = require("./errors");
|
|
50
|
+
// License error detection patterns (matching output from native binary)
|
|
51
|
+
const LICENSE_ERROR_PATTERNS = {
|
|
52
|
+
NOT_FOUND: /LICENSE ERROR: No valid license found|License file not found/i,
|
|
53
|
+
EXPIRED: /LICENSE ERROR: License expired|license.*expired/i,
|
|
54
|
+
INVALID_SIGNATURE: /LICENSE ERROR: Invalid signature|signature.*invalid/i,
|
|
55
|
+
CORRUPTED: /LICENSE ERROR: Corrupted|license.*corrupted/i,
|
|
56
|
+
HARDWARE_MISMATCH: /LICENSE ERROR: Hardware mismatch|hardware.*mismatch/i,
|
|
57
|
+
TAMPERED: /LICENSE ERROR: Tampered|tampering.*detected/i,
|
|
58
|
+
DEBUG_DETECTED: /LICENSE ERROR: Debug|debugger.*detected/i,
|
|
59
|
+
CLOCK_MANIPULATED: /LICENSE ERROR: Clock|time.*manipulation/i,
|
|
60
|
+
SUBSCRIPTION_INACTIVE: /LICENSE ERROR: Subscription inactive|subscription.*inactive/i,
|
|
61
|
+
SUBSCRIPTION_CHECK_FAILED: /LICENSE ERROR: Subscription check failed|Could not validate subscription/i,
|
|
62
|
+
SEAT_EXCEEDED: /LICENSE ERROR: Seat|Maximum.*devices.*reached/i,
|
|
63
|
+
};
|
|
64
|
+
const FINGERPRINT_PATTERN = /Hardware fingerprint: ([a-fA-F0-9]+)/i;
|
|
65
|
+
/**
|
|
66
|
+
* Local connection using child process IPC (stdin/stdout)
|
|
67
|
+
*/
|
|
68
|
+
class LocalConnection {
|
|
69
|
+
constructor(config) {
|
|
70
|
+
this.browserProcess = null;
|
|
71
|
+
this.commandId = 0;
|
|
72
|
+
this.pendingCommands = new Map();
|
|
73
|
+
this.buffer = '';
|
|
74
|
+
// License error tracking
|
|
75
|
+
this.licenseError = null;
|
|
76
|
+
this.hardwareFingerprint = null;
|
|
77
|
+
this.browserPath = config.browserPath || this.detectBrowserPath();
|
|
78
|
+
this.initTimeout = config.initTimeout ?? 30000;
|
|
79
|
+
this.verbose = config.verbose ?? false;
|
|
80
|
+
this.instanceId = `browser_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Auto-detect browser binary path
|
|
84
|
+
*/
|
|
85
|
+
detectBrowserPath() {
|
|
86
|
+
const platform = process.platform;
|
|
87
|
+
const isLinux = platform === 'linux';
|
|
88
|
+
// Try common paths relative to SDK
|
|
89
|
+
const possiblePaths = isLinux
|
|
90
|
+
? [
|
|
91
|
+
// Linux paths
|
|
92
|
+
path.join(__dirname, '../../build/owl_browser'),
|
|
93
|
+
path.join(process.cwd(), 'node_modules/owl-browser/build/owl_browser'),
|
|
94
|
+
path.join(process.cwd(), 'build/owl_browser'),
|
|
95
|
+
]
|
|
96
|
+
: [
|
|
97
|
+
// macOS paths
|
|
98
|
+
path.join(__dirname, '../../build/Release/owl_browser.app/Contents/MacOS/owl_browser'),
|
|
99
|
+
path.join(process.cwd(), 'node_modules/owl-browser/build/Release/owl_browser.app/Contents/MacOS/owl_browser'),
|
|
100
|
+
path.join(process.cwd(), 'build/Release/owl_browser.app/Contents/MacOS/owl_browser'),
|
|
101
|
+
];
|
|
102
|
+
for (const browserPath of possiblePaths) {
|
|
103
|
+
if (fs.existsSync(browserPath)) {
|
|
104
|
+
return browserPath;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
throw new Error('Browser binary not found. Please build the browser first or provide browserPath in config.');
|
|
108
|
+
}
|
|
109
|
+
async initialize() {
|
|
110
|
+
if (!fs.existsSync(this.browserPath)) {
|
|
111
|
+
throw new Error(`Browser binary not found at: ${this.browserPath}`);
|
|
112
|
+
}
|
|
113
|
+
return new Promise((resolve, reject) => {
|
|
114
|
+
this.browserProcess = (0, child_process_1.spawn)(this.browserPath, ['--instance-id', this.instanceId], {
|
|
115
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
116
|
+
detached: false,
|
|
117
|
+
env: {
|
|
118
|
+
...process.env,
|
|
119
|
+
OWL_INSTANCE_ID: this.instanceId,
|
|
120
|
+
},
|
|
121
|
+
});
|
|
122
|
+
let initialized = false;
|
|
123
|
+
// Handle stdout
|
|
124
|
+
this.browserProcess.stdout.on('data', (data) => {
|
|
125
|
+
this.buffer += data.toString();
|
|
126
|
+
const lines = this.buffer.split('\n');
|
|
127
|
+
this.buffer = lines.pop() || '';
|
|
128
|
+
lines.forEach((line) => {
|
|
129
|
+
if (line.trim() === 'READY' && !initialized) {
|
|
130
|
+
initialized = true;
|
|
131
|
+
if (this.verbose) {
|
|
132
|
+
console.error(`[Browser] Ready (instance: ${this.instanceId}, PID: ${this.browserProcess.pid})`);
|
|
133
|
+
}
|
|
134
|
+
resolve();
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
this.handleResponse(line);
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
// Handle stderr
|
|
142
|
+
this.browserProcess.stderr.on('data', (data) => {
|
|
143
|
+
const output = data.toString();
|
|
144
|
+
if (output.includes('READY') && !initialized) {
|
|
145
|
+
initialized = true;
|
|
146
|
+
if (this.verbose) {
|
|
147
|
+
console.error(`[Browser] Ready from stderr (instance: ${this.instanceId})`);
|
|
148
|
+
}
|
|
149
|
+
resolve();
|
|
150
|
+
}
|
|
151
|
+
// Check for hardware fingerprint
|
|
152
|
+
const fingerprintMatch = output.match(FINGERPRINT_PATTERN);
|
|
153
|
+
if (fingerprintMatch) {
|
|
154
|
+
this.hardwareFingerprint = fingerprintMatch[1];
|
|
155
|
+
}
|
|
156
|
+
// Check for license errors
|
|
157
|
+
for (const [status, pattern] of Object.entries(LICENSE_ERROR_PATTERNS)) {
|
|
158
|
+
if (pattern.test(output)) {
|
|
159
|
+
this.licenseError = {
|
|
160
|
+
status: status,
|
|
161
|
+
message: output.trim(),
|
|
162
|
+
};
|
|
163
|
+
break;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
// Only show critical errors
|
|
167
|
+
if (output.includes('[ERROR]') && !output.includes('503') && !output.includes('Loading model')) {
|
|
168
|
+
if (this.verbose) {
|
|
169
|
+
console.error('[Browser]', output.trim());
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
// Handle errors
|
|
174
|
+
this.browserProcess.on('error', (err) => {
|
|
175
|
+
reject(new Error(`Failed to start browser: ${err.message}`));
|
|
176
|
+
});
|
|
177
|
+
// Handle exit
|
|
178
|
+
this.browserProcess.on('exit', (code) => {
|
|
179
|
+
if (code !== 0 && code !== null && this.verbose) {
|
|
180
|
+
console.error(`[Browser] Process exited with code ${code}`);
|
|
181
|
+
}
|
|
182
|
+
// Reject all pending commands
|
|
183
|
+
for (const [id, pending] of this.pendingCommands) {
|
|
184
|
+
pending.reject(new Error('Browser process exited'));
|
|
185
|
+
this.pendingCommands.delete(id);
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
// Timeout
|
|
189
|
+
setTimeout(() => {
|
|
190
|
+
if (!initialized) {
|
|
191
|
+
// Check if we have a license error
|
|
192
|
+
if (this.licenseError) {
|
|
193
|
+
reject(new errors_1.LicenseError(this.licenseError.message, this.licenseError.status, this.hardwareFingerprint || undefined));
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
reject(new errors_1.BrowserInitializationError('Browser initialization timeout'));
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}, this.initTimeout);
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Handle JSON response from browser
|
|
204
|
+
*/
|
|
205
|
+
handleResponse(line) {
|
|
206
|
+
if (!line.trim())
|
|
207
|
+
return;
|
|
208
|
+
try {
|
|
209
|
+
const response = JSON.parse(line);
|
|
210
|
+
const pending = this.pendingCommands.get(response.id);
|
|
211
|
+
if (pending) {
|
|
212
|
+
this.pendingCommands.delete(response.id);
|
|
213
|
+
if (response.error) {
|
|
214
|
+
pending.reject(new Error(response.error));
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
pending.resolve(response.result);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
catch (e) {
|
|
222
|
+
// Ignore non-JSON lines (logs, etc.)
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
async sendCommand(method, params = {}) {
|
|
226
|
+
if (!this.browserProcess) {
|
|
227
|
+
throw new errors_1.BrowserNotRunningError('Browser not initialized. Call initialize() first.');
|
|
228
|
+
}
|
|
229
|
+
const id = ++this.commandId;
|
|
230
|
+
const command = { id, method, ...params };
|
|
231
|
+
return new Promise((resolve, reject) => {
|
|
232
|
+
this.pendingCommands.set(id, { resolve, reject });
|
|
233
|
+
const commandStr = JSON.stringify(command);
|
|
234
|
+
if (this.verbose) {
|
|
235
|
+
console.error(`[Browser] Sending: ${method}`, params);
|
|
236
|
+
}
|
|
237
|
+
this.browserProcess.stdin.write(commandStr + '\n');
|
|
238
|
+
// Timeout after 30 seconds
|
|
239
|
+
setTimeout(() => {
|
|
240
|
+
if (this.pendingCommands.has(id)) {
|
|
241
|
+
this.pendingCommands.delete(id);
|
|
242
|
+
reject(new errors_1.CommandTimeoutError(method));
|
|
243
|
+
}
|
|
244
|
+
}, 30000);
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
async shutdown() {
|
|
248
|
+
if (this.browserProcess) {
|
|
249
|
+
const pid = this.browserProcess.pid;
|
|
250
|
+
if (this.verbose) {
|
|
251
|
+
console.error(`[Browser] Shutting down process (PID: ${pid})...`);
|
|
252
|
+
}
|
|
253
|
+
// Send shutdown command to browser (graceful)
|
|
254
|
+
try {
|
|
255
|
+
await this.sendCommand('shutdown', {});
|
|
256
|
+
if (this.verbose) {
|
|
257
|
+
console.error('[Browser] Sent shutdown command');
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
catch (err) {
|
|
261
|
+
if (this.verbose) {
|
|
262
|
+
console.error('[Browser] Failed to send shutdown command:', err.message);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
// Close stdin
|
|
266
|
+
this.browserProcess.stdin.end();
|
|
267
|
+
// Wait for graceful termination (3 seconds)
|
|
268
|
+
const waitForExit = new Promise((resolve) => {
|
|
269
|
+
const timeout = setTimeout(() => {
|
|
270
|
+
if (this.verbose) {
|
|
271
|
+
console.error('[Browser] Did not exit gracefully, force killing...');
|
|
272
|
+
}
|
|
273
|
+
resolve(false);
|
|
274
|
+
}, 3000);
|
|
275
|
+
this.browserProcess.once('exit', () => {
|
|
276
|
+
clearTimeout(timeout);
|
|
277
|
+
if (this.verbose) {
|
|
278
|
+
console.error('[Browser] Exited gracefully');
|
|
279
|
+
}
|
|
280
|
+
resolve(true);
|
|
281
|
+
});
|
|
282
|
+
});
|
|
283
|
+
const graceful = await waitForExit;
|
|
284
|
+
// Force kill if still alive
|
|
285
|
+
if (!graceful && pid) {
|
|
286
|
+
try {
|
|
287
|
+
process.kill(pid, 'SIGKILL');
|
|
288
|
+
if (this.verbose) {
|
|
289
|
+
console.error(`[Browser] Force killed process (PID: ${pid})`);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
catch (err) {
|
|
293
|
+
// Process already dead
|
|
294
|
+
if (this.verbose) {
|
|
295
|
+
console.error('[Browser] Process already terminated');
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
this.browserProcess = null;
|
|
300
|
+
if (this.verbose) {
|
|
301
|
+
console.error('[Browser] Shutdown complete');
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
isRunning() {
|
|
306
|
+
return this.browserProcess !== null && this.browserProcess.exitCode === null;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
exports.LocalConnection = LocalConnection;
|
|
310
|
+
// ==================== HTTP CONNECTION ====================
|
|
311
|
+
/**
|
|
312
|
+
* HTTP connection using REST API to remote browser server
|
|
313
|
+
*/
|
|
314
|
+
class HttpConnection {
|
|
315
|
+
constructor(config) {
|
|
316
|
+
this.connected = false;
|
|
317
|
+
if (!config.http) {
|
|
318
|
+
throw new Error('HTTP configuration is required for HTTP connection mode');
|
|
319
|
+
}
|
|
320
|
+
this.baseUrl = config.http.baseUrl.replace(/\/$/, ''); // Remove trailing slash
|
|
321
|
+
this.token = config.http.token;
|
|
322
|
+
this.timeout = config.http.timeout ?? config.initTimeout ?? 30000;
|
|
323
|
+
this.verbose = config.verbose ?? false;
|
|
324
|
+
}
|
|
325
|
+
async initialize() {
|
|
326
|
+
// Check server health
|
|
327
|
+
try {
|
|
328
|
+
const health = await this.httpRequest('GET', '/health');
|
|
329
|
+
if (this.verbose) {
|
|
330
|
+
console.error(`[HTTP] Connected to server: ${this.baseUrl}`);
|
|
331
|
+
console.error(`[HTTP] Server status: ${health.status}, browser ready: ${health.browser_ready}`);
|
|
332
|
+
}
|
|
333
|
+
if (health.status !== 'healthy') {
|
|
334
|
+
throw new errors_1.BrowserInitializationError(`Server is not healthy: ${health.status}`);
|
|
335
|
+
}
|
|
336
|
+
if (!health.browser_ready) {
|
|
337
|
+
// Check for license error
|
|
338
|
+
if (health.browser_state === 'license_error') {
|
|
339
|
+
throw new errors_1.LicenseError(health.license_message || 'Browser license error', health.license_status, health.hardware_fingerprint);
|
|
340
|
+
}
|
|
341
|
+
throw new errors_1.BrowserInitializationError(`Browser is not ready: ${health.browser_state}`);
|
|
342
|
+
}
|
|
343
|
+
this.connected = true;
|
|
344
|
+
}
|
|
345
|
+
catch (error) {
|
|
346
|
+
if (error instanceof errors_1.LicenseError || error instanceof errors_1.BrowserInitializationError) {
|
|
347
|
+
throw error;
|
|
348
|
+
}
|
|
349
|
+
throw new errors_1.BrowserInitializationError(`Failed to connect to browser server at ${this.baseUrl}: ${error.message}`);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Map SDK method names to HTTP API tool names
|
|
354
|
+
*/
|
|
355
|
+
mapMethodToTool(method) {
|
|
356
|
+
// Map internal SDK method names to HTTP API tool names
|
|
357
|
+
const methodToToolMap = {
|
|
358
|
+
createContext: 'browser_create_context',
|
|
359
|
+
releaseContext: 'browser_close_context',
|
|
360
|
+
navigate: 'browser_navigate',
|
|
361
|
+
reload: 'browser_reload',
|
|
362
|
+
goBack: 'browser_go_back',
|
|
363
|
+
goForward: 'browser_go_forward',
|
|
364
|
+
click: 'browser_click',
|
|
365
|
+
type: 'browser_type',
|
|
366
|
+
pick: 'browser_pick',
|
|
367
|
+
pressKey: 'browser_press_key',
|
|
368
|
+
submitForm: 'browser_submit_form',
|
|
369
|
+
highlight: 'browser_highlight',
|
|
370
|
+
extractText: 'browser_extract_text',
|
|
371
|
+
getHTML: 'browser_get_html',
|
|
372
|
+
getMarkdown: 'browser_get_markdown',
|
|
373
|
+
extractJSON: 'browser_extract_json',
|
|
374
|
+
detectWebsiteType: 'browser_detect_site',
|
|
375
|
+
summarizePage: 'browser_summarize_page',
|
|
376
|
+
listTemplates: 'browser_list_templates',
|
|
377
|
+
queryPage: 'browser_query_page',
|
|
378
|
+
llmStatus: 'browser_llm_status',
|
|
379
|
+
getLLMStatus: 'browser_llm_status',
|
|
380
|
+
executeNLA: 'browser_nla',
|
|
381
|
+
screenshot: 'browser_screenshot',
|
|
382
|
+
startVideoRecording: 'browser_start_video_recording',
|
|
383
|
+
pauseVideoRecording: 'browser_pause_video_recording',
|
|
384
|
+
resumeVideoRecording: 'browser_resume_video_recording',
|
|
385
|
+
stopVideoRecording: 'browser_stop_video_recording',
|
|
386
|
+
getVideoRecordingStats: 'browser_get_video_recording_stats',
|
|
387
|
+
scrollBy: 'browser_scroll_by',
|
|
388
|
+
scrollTo: 'browser_scroll_by', // scrollTo can use scrollBy
|
|
389
|
+
scrollToElement: 'browser_scroll_to_element',
|
|
390
|
+
scrollToTop: 'browser_scroll_to_top',
|
|
391
|
+
scrollToBottom: 'browser_scroll_to_bottom',
|
|
392
|
+
waitForSelector: 'browser_wait_for_selector',
|
|
393
|
+
waitForTimeout: 'browser_wait',
|
|
394
|
+
getCurrentURL: 'browser_get_page_info',
|
|
395
|
+
getPageTitle: 'browser_get_page_info',
|
|
396
|
+
getPageInfo: 'browser_get_page_info',
|
|
397
|
+
setViewport: 'browser_set_viewport',
|
|
398
|
+
getViewport: 'browser_get_page_info',
|
|
399
|
+
getDemographics: 'browser_get_demographics',
|
|
400
|
+
getLocation: 'browser_get_location',
|
|
401
|
+
getDateTime: 'browser_get_datetime',
|
|
402
|
+
getWeather: 'browser_get_weather',
|
|
403
|
+
detectCaptcha: 'browser_detect_captcha',
|
|
404
|
+
classifyCaptcha: 'browser_classify_captcha',
|
|
405
|
+
solveTextCaptcha: 'browser_solve_text_captcha',
|
|
406
|
+
solveImageCaptcha: 'browser_solve_image_captcha',
|
|
407
|
+
solveCaptcha: 'browser_solve_captcha',
|
|
408
|
+
getCookies: 'browser_get_cookies',
|
|
409
|
+
setCookie: 'browser_set_cookie',
|
|
410
|
+
deleteCookies: 'browser_delete_cookies',
|
|
411
|
+
setProxy: 'browser_set_proxy',
|
|
412
|
+
getProxyStatus: 'browser_get_proxy_status',
|
|
413
|
+
connectProxy: 'browser_connect_proxy',
|
|
414
|
+
disconnectProxy: 'browser_disconnect_proxy',
|
|
415
|
+
saveProfile: 'browser_save_profile',
|
|
416
|
+
getProfile: 'browser_get_profile',
|
|
417
|
+
updateProfileCookies: 'browser_update_profile_cookies',
|
|
418
|
+
shutdown: 'shutdown', // Special case - no HTTP equivalent
|
|
419
|
+
getHomepage: 'browser_get_page_info', // Homepage is local-only feature
|
|
420
|
+
};
|
|
421
|
+
return methodToToolMap[method] || method;
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* Map SDK parameters to HTTP API parameters
|
|
425
|
+
*/
|
|
426
|
+
mapParams(method, params) {
|
|
427
|
+
const mapped = {};
|
|
428
|
+
for (const [key, value] of Object.entries(params)) {
|
|
429
|
+
if (value === undefined || value === null)
|
|
430
|
+
continue;
|
|
431
|
+
// Map common parameter name differences
|
|
432
|
+
switch (key) {
|
|
433
|
+
case 'context_id':
|
|
434
|
+
mapped.context_id = value;
|
|
435
|
+
break;
|
|
436
|
+
case 'clean_level':
|
|
437
|
+
mapped.clean_level = value;
|
|
438
|
+
break;
|
|
439
|
+
case 'include_links':
|
|
440
|
+
mapped.include_links = value;
|
|
441
|
+
break;
|
|
442
|
+
case 'include_images':
|
|
443
|
+
mapped.include_images = value;
|
|
444
|
+
break;
|
|
445
|
+
case 'max_length':
|
|
446
|
+
mapped.max_length = value;
|
|
447
|
+
break;
|
|
448
|
+
case 'template_name':
|
|
449
|
+
mapped.template = value;
|
|
450
|
+
break;
|
|
451
|
+
case 'force_refresh':
|
|
452
|
+
mapped.force_refresh = value;
|
|
453
|
+
break;
|
|
454
|
+
case 'query':
|
|
455
|
+
// For NLA, map query to command
|
|
456
|
+
if (method === 'executeNLA') {
|
|
457
|
+
mapped.command = value;
|
|
458
|
+
}
|
|
459
|
+
else {
|
|
460
|
+
mapped.query = value;
|
|
461
|
+
}
|
|
462
|
+
break;
|
|
463
|
+
case 'ignore_cache':
|
|
464
|
+
mapped.ignore_cache = value;
|
|
465
|
+
break;
|
|
466
|
+
case 'border_color':
|
|
467
|
+
mapped.border_color = value;
|
|
468
|
+
break;
|
|
469
|
+
case 'background_color':
|
|
470
|
+
mapped.background_color = value;
|
|
471
|
+
break;
|
|
472
|
+
case 'max_attempts':
|
|
473
|
+
mapped.max_attempts = value;
|
|
474
|
+
break;
|
|
475
|
+
case 'cookie_name':
|
|
476
|
+
mapped.cookie_name = value;
|
|
477
|
+
break;
|
|
478
|
+
case 'block_webrtc':
|
|
479
|
+
mapped.block_webrtc = value;
|
|
480
|
+
break;
|
|
481
|
+
case 'spoof_timezone':
|
|
482
|
+
mapped.spoof_timezone = value;
|
|
483
|
+
break;
|
|
484
|
+
case 'spoof_language':
|
|
485
|
+
mapped.spoof_language = value;
|
|
486
|
+
break;
|
|
487
|
+
case 'timezone_override':
|
|
488
|
+
mapped.timezone_override = value;
|
|
489
|
+
break;
|
|
490
|
+
case 'language_override':
|
|
491
|
+
mapped.language_override = value;
|
|
492
|
+
break;
|
|
493
|
+
case 'profile_path':
|
|
494
|
+
mapped.profile_path = value;
|
|
495
|
+
break;
|
|
496
|
+
default:
|
|
497
|
+
mapped[key] = value;
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
return mapped;
|
|
501
|
+
}
|
|
502
|
+
async sendCommand(method, params = {}) {
|
|
503
|
+
if (!this.connected) {
|
|
504
|
+
throw new errors_1.BrowserNotRunningError('Not connected to browser server. Call initialize() first.');
|
|
505
|
+
}
|
|
506
|
+
// Handle special methods that don't map to HTTP endpoints
|
|
507
|
+
if (method === 'shutdown') {
|
|
508
|
+
// No-op for HTTP mode - server manages browser lifecycle
|
|
509
|
+
if (this.verbose) {
|
|
510
|
+
console.error('[HTTP] Shutdown requested - closing client connection');
|
|
511
|
+
}
|
|
512
|
+
this.connected = false;
|
|
513
|
+
return;
|
|
514
|
+
}
|
|
515
|
+
if (method === 'getHomepage') {
|
|
516
|
+
// Homepage is a local-only feature, return empty for HTTP mode
|
|
517
|
+
return '';
|
|
518
|
+
}
|
|
519
|
+
const tool = this.mapMethodToTool(method);
|
|
520
|
+
const mappedParams = this.mapParams(method, params);
|
|
521
|
+
if (this.verbose) {
|
|
522
|
+
console.error(`[HTTP] Sending: ${tool}`, mappedParams);
|
|
523
|
+
}
|
|
524
|
+
try {
|
|
525
|
+
const response = await this.httpRequest('POST', `/execute/${tool}`, mappedParams);
|
|
526
|
+
if (!response.success) {
|
|
527
|
+
throw new Error(response.error || 'Unknown error');
|
|
528
|
+
}
|
|
529
|
+
// Handle special return value transformations
|
|
530
|
+
if (method === 'getCurrentURL' || method === 'getPageTitle') {
|
|
531
|
+
// These methods call getPageInfo but need specific fields
|
|
532
|
+
if (method === 'getCurrentURL') {
|
|
533
|
+
return response.result?.url || response.result;
|
|
534
|
+
}
|
|
535
|
+
if (method === 'getPageTitle') {
|
|
536
|
+
return response.result?.title || response.result;
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
return response.result;
|
|
540
|
+
}
|
|
541
|
+
catch (error) {
|
|
542
|
+
if (this.verbose) {
|
|
543
|
+
console.error(`[HTTP] Error for ${tool}:`, error.message);
|
|
544
|
+
}
|
|
545
|
+
throw error;
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
async shutdown() {
|
|
549
|
+
this.connected = false;
|
|
550
|
+
if (this.verbose) {
|
|
551
|
+
console.error('[HTTP] Client disconnected');
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
isRunning() {
|
|
555
|
+
return this.connected;
|
|
556
|
+
}
|
|
557
|
+
/**
|
|
558
|
+
* Make an HTTP request to the browser server
|
|
559
|
+
*/
|
|
560
|
+
httpRequest(method, path, body) {
|
|
561
|
+
return new Promise((resolve, reject) => {
|
|
562
|
+
const url = new URL(path, this.baseUrl);
|
|
563
|
+
const isHttps = url.protocol === 'https:';
|
|
564
|
+
const lib = isHttps ? https : http;
|
|
565
|
+
const bodyStr = body ? JSON.stringify(body) : '';
|
|
566
|
+
const headers = {
|
|
567
|
+
'Content-Type': 'application/json',
|
|
568
|
+
};
|
|
569
|
+
// Add Content-Length for POST requests
|
|
570
|
+
if (method === 'POST' && bodyStr) {
|
|
571
|
+
headers['Content-Length'] = String(Buffer.byteLength(bodyStr));
|
|
572
|
+
}
|
|
573
|
+
// Add auth header for non-health endpoints
|
|
574
|
+
if (path !== '/health') {
|
|
575
|
+
headers['Authorization'] = `Bearer ${this.token}`;
|
|
576
|
+
}
|
|
577
|
+
const options = {
|
|
578
|
+
hostname: url.hostname,
|
|
579
|
+
port: url.port || (isHttps ? 443 : 80),
|
|
580
|
+
path: url.pathname + url.search,
|
|
581
|
+
method,
|
|
582
|
+
headers,
|
|
583
|
+
timeout: this.timeout,
|
|
584
|
+
};
|
|
585
|
+
const req = lib.request(options, (res) => {
|
|
586
|
+
let data = '';
|
|
587
|
+
res.on('data', (chunk) => {
|
|
588
|
+
data += chunk;
|
|
589
|
+
});
|
|
590
|
+
res.on('end', () => {
|
|
591
|
+
try {
|
|
592
|
+
const json = JSON.parse(data);
|
|
593
|
+
// Handle HTTP error status codes
|
|
594
|
+
if (res.statusCode && res.statusCode >= 400) {
|
|
595
|
+
if (res.statusCode === 401) {
|
|
596
|
+
reject(new Error('Authentication failed: Invalid or missing token'));
|
|
597
|
+
}
|
|
598
|
+
else if (res.statusCode === 503 && json.license_status) {
|
|
599
|
+
reject(new errors_1.LicenseError(json.license_message || 'License error', json.license_status, json.hardware_fingerprint));
|
|
600
|
+
}
|
|
601
|
+
else {
|
|
602
|
+
reject(new Error(json.error || `HTTP ${res.statusCode}`));
|
|
603
|
+
}
|
|
604
|
+
return;
|
|
605
|
+
}
|
|
606
|
+
resolve(json);
|
|
607
|
+
}
|
|
608
|
+
catch (e) {
|
|
609
|
+
reject(new Error(`Invalid JSON response: ${data.substring(0, 100)}`));
|
|
610
|
+
}
|
|
611
|
+
});
|
|
612
|
+
});
|
|
613
|
+
req.on('error', (err) => {
|
|
614
|
+
reject(new Error(`HTTP request failed: ${err.message}`));
|
|
615
|
+
});
|
|
616
|
+
req.on('timeout', () => {
|
|
617
|
+
req.destroy();
|
|
618
|
+
reject(new errors_1.CommandTimeoutError(`HTTP ${method} ${path}`));
|
|
619
|
+
});
|
|
620
|
+
if (bodyStr) {
|
|
621
|
+
req.write(bodyStr);
|
|
622
|
+
}
|
|
623
|
+
req.end();
|
|
624
|
+
});
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
exports.HttpConnection = HttpConnection;
|
|
628
|
+
/**
|
|
629
|
+
* Factory function to create the appropriate connection based on config
|
|
630
|
+
*/
|
|
631
|
+
function createConnection(config) {
|
|
632
|
+
const mode = config.mode || 'local';
|
|
633
|
+
if (mode === 'http') {
|
|
634
|
+
if (!config.http) {
|
|
635
|
+
throw new Error('HTTP configuration is required for HTTP connection mode');
|
|
636
|
+
}
|
|
637
|
+
return new HttpConnection(config);
|
|
638
|
+
}
|
|
639
|
+
return new LocalConnection(config);
|
|
640
|
+
}
|
|
641
|
+
//# sourceMappingURL=connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"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"}
|