@brightdata/cli 0.1.4 → 0.1.6

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 (88) hide show
  1. package/README.md +354 -0
  2. package/dist/__tests__/browser/connection.test.d.ts +2 -0
  3. package/dist/__tests__/browser/connection.test.d.ts.map +1 -0
  4. package/dist/__tests__/browser/connection.test.js +168 -0
  5. package/dist/__tests__/browser/connection.test.js.map +1 -0
  6. package/dist/__tests__/browser/daemon.test.d.ts +2 -0
  7. package/dist/__tests__/browser/daemon.test.d.ts.map +1 -0
  8. package/dist/__tests__/browser/daemon.test.js +586 -0
  9. package/dist/__tests__/browser/daemon.test.js.map +1 -0
  10. package/dist/__tests__/browser/entrypoint.test.d.ts +2 -0
  11. package/dist/__tests__/browser/entrypoint.test.d.ts.map +1 -0
  12. package/dist/__tests__/browser/entrypoint.test.js +53 -0
  13. package/dist/__tests__/browser/entrypoint.test.js.map +1 -0
  14. package/dist/__tests__/browser/ipc.test.d.ts +2 -0
  15. package/dist/__tests__/browser/ipc.test.d.ts.map +1 -0
  16. package/dist/__tests__/browser/ipc.test.js +199 -0
  17. package/dist/__tests__/browser/ipc.test.js.map +1 -0
  18. package/dist/__tests__/browser/lifecycle.test.d.ts +2 -0
  19. package/dist/__tests__/browser/lifecycle.test.d.ts.map +1 -0
  20. package/dist/__tests__/browser/lifecycle.test.js +176 -0
  21. package/dist/__tests__/browser/lifecycle.test.js.map +1 -0
  22. package/dist/__tests__/browser/snapshot.test.d.ts +2 -0
  23. package/dist/__tests__/browser/snapshot.test.d.ts.map +1 -0
  24. package/dist/__tests__/browser/snapshot.test.js +202 -0
  25. package/dist/__tests__/browser/snapshot.test.js.map +1 -0
  26. package/dist/__tests__/commands/browser.test.d.ts +2 -0
  27. package/dist/__tests__/commands/browser.test.d.ts.map +1 -0
  28. package/dist/__tests__/commands/browser.test.js +431 -0
  29. package/dist/__tests__/commands/browser.test.js.map +1 -0
  30. package/dist/__tests__/utils/browser-credentials.test.d.ts +2 -0
  31. package/dist/__tests__/utils/browser-credentials.test.d.ts.map +1 -0
  32. package/dist/__tests__/utils/browser-credentials.test.js +81 -0
  33. package/dist/__tests__/utils/browser-credentials.test.js.map +1 -0
  34. package/dist/browser/connection.d.ts +24 -0
  35. package/dist/browser/connection.d.ts.map +1 -0
  36. package/dist/browser/connection.js +55 -0
  37. package/dist/browser/connection.js.map +1 -0
  38. package/dist/browser/daemon.d.ts +130 -0
  39. package/dist/browser/daemon.d.ts.map +1 -0
  40. package/dist/browser/daemon.js +645 -0
  41. package/dist/browser/daemon.js.map +1 -0
  42. package/dist/browser/entrypoint.d.ts +20 -0
  43. package/dist/browser/entrypoint.d.ts.map +1 -0
  44. package/dist/browser/entrypoint.js +46 -0
  45. package/dist/browser/entrypoint.js.map +1 -0
  46. package/dist/browser/interaction.d.ts +32 -0
  47. package/dist/browser/interaction.d.ts.map +1 -0
  48. package/dist/browser/interaction.js +215 -0
  49. package/dist/browser/interaction.js.map +1 -0
  50. package/dist/browser/ipc.d.ts +52 -0
  51. package/dist/browser/ipc.d.ts.map +1 -0
  52. package/dist/browser/ipc.js +254 -0
  53. package/dist/browser/ipc.js.map +1 -0
  54. package/dist/browser/lifecycle.d.ts +31 -0
  55. package/dist/browser/lifecycle.d.ts.map +1 -0
  56. package/dist/browser/lifecycle.js +202 -0
  57. package/dist/browser/lifecycle.js.map +1 -0
  58. package/dist/browser/screenshot.d.ts +19 -0
  59. package/dist/browser/screenshot.d.ts.map +1 -0
  60. package/dist/browser/screenshot.js +44 -0
  61. package/dist/browser/screenshot.js.map +1 -0
  62. package/dist/browser/snapshot.d.ts +48 -0
  63. package/dist/browser/snapshot.d.ts.map +1 -0
  64. package/dist/browser/snapshot.js +490 -0
  65. package/dist/browser/snapshot.js.map +1 -0
  66. package/dist/commands/browser.d.ts +62 -0
  67. package/dist/commands/browser.d.ts.map +1 -0
  68. package/dist/commands/browser.js +615 -0
  69. package/dist/commands/browser.js.map +1 -0
  70. package/dist/commands/scrape.d.ts.map +1 -1
  71. package/dist/commands/scrape.js +11 -1
  72. package/dist/commands/scrape.js.map +1 -1
  73. package/dist/commands/search.d.ts.map +1 -1
  74. package/dist/commands/search.js +53 -1
  75. package/dist/commands/search.js.map +1 -1
  76. package/dist/index.js +39 -25
  77. package/dist/index.js.map +1 -1
  78. package/dist/types/search.d.ts +30 -2
  79. package/dist/types/search.d.ts.map +1 -1
  80. package/dist/utils/browser-credentials.d.ts +5 -0
  81. package/dist/utils/browser-credentials.d.ts.map +1 -0
  82. package/dist/utils/browser-credentials.js +53 -0
  83. package/dist/utils/browser-credentials.js.map +1 -0
  84. package/dist/utils/client.d.ts +1 -0
  85. package/dist/utils/client.d.ts.map +1 -1
  86. package/dist/utils/client.js +2 -0
  87. package/dist/utils/client.js.map +1 -1
  88. package/package.json +2 -1
@@ -0,0 +1,586 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const fs_1 = __importDefault(require("fs"));
7
+ const net_1 = __importDefault(require("net"));
8
+ const os_1 = __importDefault(require("os"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const events_1 = require("events");
11
+ const vitest_1 = require("vitest");
12
+ const daemon_1 = require("../../browser/daemon");
13
+ class Mock_response {
14
+ mock_request;
15
+ mock_status;
16
+ constructor(mock_request, mock_status) {
17
+ this.mock_request = mock_request;
18
+ this.mock_status = mock_status;
19
+ }
20
+ request() {
21
+ return this.mock_request;
22
+ }
23
+ status() {
24
+ return this.mock_status;
25
+ }
26
+ }
27
+ class Mock_page extends events_1.EventEmitter {
28
+ closed = false;
29
+ current_title = 'Blank';
30
+ current_url = 'about:blank';
31
+ mock_context = null;
32
+ screenshot_opts = null;
33
+ constructor(mock_context) {
34
+ super();
35
+ this.mock_context = mock_context ?? null;
36
+ }
37
+ set_context(mock_context) {
38
+ this.mock_context = mock_context;
39
+ }
40
+ set_location(url) {
41
+ this.current_url = url;
42
+ this.current_title = `Title for ${url}`;
43
+ }
44
+ async goto(url) {
45
+ this.set_location(url);
46
+ return { status: () => 200 };
47
+ }
48
+ async goBack() {
49
+ this.set_location('https://example.com/back');
50
+ return { status: () => 200 };
51
+ }
52
+ async goForward() {
53
+ this.set_location('https://example.com/forward');
54
+ return { status: () => 200 };
55
+ }
56
+ async reload() {
57
+ this.current_title = `Title for ${this.current_url}`;
58
+ return { status: () => 200 };
59
+ }
60
+ async screenshot(opts) {
61
+ this.screenshot_opts = opts ?? {};
62
+ return Buffer.from(opts?.fullPage ? 'full-page-image' : 'viewport-image');
63
+ }
64
+ async evaluate(_fn, arg) {
65
+ return {
66
+ nodes: [
67
+ {
68
+ children: [],
69
+ level: 1,
70
+ name: 'Welcome',
71
+ role: 'heading',
72
+ },
73
+ {
74
+ children: [
75
+ {
76
+ children: [],
77
+ interactive: true,
78
+ name: 'Pricing',
79
+ ref: 'e1',
80
+ role: 'link',
81
+ },
82
+ ],
83
+ role: 'navigation',
84
+ },
85
+ {
86
+ children: [
87
+ {
88
+ children: [],
89
+ interactive: true,
90
+ name: 'Buy',
91
+ ref: 'e2',
92
+ role: 'button',
93
+ },
94
+ ],
95
+ role: 'main',
96
+ },
97
+ ],
98
+ refs: [
99
+ { ref: 'e1', selector: `[${arg.attr_name}="e1"]` },
100
+ { ref: 'e2', selector: `[${arg.attr_name}="e2"]` },
101
+ ],
102
+ };
103
+ }
104
+ context() {
105
+ if (!this.mock_context)
106
+ throw new Error('Mock page has no context.');
107
+ return this.mock_context;
108
+ }
109
+ isClosed() {
110
+ return this.closed;
111
+ }
112
+ async title() {
113
+ return this.current_title;
114
+ }
115
+ url() {
116
+ return this.current_url;
117
+ }
118
+ close_page() {
119
+ this.closed = true;
120
+ this.emit('close');
121
+ }
122
+ last_screenshot_opts() {
123
+ return this.screenshot_opts;
124
+ }
125
+ }
126
+ class Mock_context extends events_1.EventEmitter {
127
+ mock_cookies;
128
+ mock_pages;
129
+ constructor(mock_pages = [], mock_cookies = []) {
130
+ super();
131
+ this.mock_cookies = mock_cookies;
132
+ this.mock_pages = [];
133
+ const pages = mock_pages.length ? mock_pages : [new Mock_page()];
134
+ for (const page of pages)
135
+ this.attach_page(page);
136
+ }
137
+ attach_page(page) {
138
+ page.set_context(this);
139
+ this.mock_pages.push(page);
140
+ }
141
+ async newPage() {
142
+ const page = new Mock_page(this);
143
+ this.mock_pages.push(page);
144
+ this.emit('page', page);
145
+ return page;
146
+ }
147
+ async cookies() {
148
+ return this.mock_cookies;
149
+ }
150
+ pages() {
151
+ return this.mock_pages;
152
+ }
153
+ first_page() {
154
+ return this.mock_pages[0];
155
+ }
156
+ }
157
+ class Mock_browser extends events_1.EventEmitter {
158
+ connected = true;
159
+ contexts_calls = 0;
160
+ contexts_error = null;
161
+ mock_contexts;
162
+ constructor(mock_contexts = [new Mock_context()]) {
163
+ super();
164
+ this.mock_contexts = mock_contexts;
165
+ }
166
+ async close() {
167
+ this.connected = false;
168
+ this.emit('disconnected');
169
+ }
170
+ contexts() {
171
+ this.contexts_calls++;
172
+ if (this.contexts_error)
173
+ throw this.contexts_error;
174
+ return this.mock_contexts;
175
+ }
176
+ isConnected() {
177
+ return this.connected;
178
+ }
179
+ async newContext() {
180
+ const context = new Mock_context([]);
181
+ this.mock_contexts.push(context);
182
+ return context;
183
+ }
184
+ break_health_check(message = 'stale browser') {
185
+ this.contexts_error = new Error(message);
186
+ }
187
+ contexts_call_count() {
188
+ return this.contexts_calls;
189
+ }
190
+ disconnect() {
191
+ this.connected = false;
192
+ this.emit('disconnected');
193
+ }
194
+ first_context() {
195
+ return this.mock_contexts[0];
196
+ }
197
+ }
198
+ const mk_tmp_dir = () => fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'bdata-daemon-'));
199
+ const read_line = async (socket) => {
200
+ return await new Promise((resolve, reject) => {
201
+ let buffer = '';
202
+ const on_data = (chunk) => {
203
+ buffer += chunk.toString();
204
+ const newline_index = buffer.indexOf('\n');
205
+ if (newline_index >= 0) {
206
+ cleanup();
207
+ resolve(buffer.slice(0, newline_index));
208
+ }
209
+ };
210
+ const on_error = (error) => {
211
+ cleanup();
212
+ reject(error);
213
+ };
214
+ const on_end = () => {
215
+ cleanup();
216
+ reject(new Error('Socket closed before a response was received.'));
217
+ };
218
+ const cleanup = () => {
219
+ socket.off('data', on_data);
220
+ socket.off('error', on_error);
221
+ socket.off('end', on_end);
222
+ };
223
+ socket.on('data', on_data);
224
+ socket.on('error', on_error);
225
+ socket.on('end', on_end);
226
+ });
227
+ };
228
+ (0, vitest_1.describe)('browser/daemon', () => {
229
+ let tmp_dir = '';
230
+ (0, vitest_1.beforeEach)(() => {
231
+ tmp_dir = mk_tmp_dir();
232
+ });
233
+ (0, vitest_1.afterEach)(() => {
234
+ vitest_1.vi.useRealTimers();
235
+ fs_1.default.rmSync(tmp_dir, { recursive: true, force: true });
236
+ });
237
+ (0, vitest_1.it)('normalizes and validates session names', () => {
238
+ (0, vitest_1.expect)((0, daemon_1.normalize_session_name)(' shop.us-1 ')).toBe('shop.us-1');
239
+ (0, vitest_1.expect)(() => (0, daemon_1.normalize_session_name)('../bad'))
240
+ .toThrow('Browser session name may contain only letters');
241
+ });
242
+ (0, vitest_1.it)('resolves daemon directories and transports per platform', () => {
243
+ (0, vitest_1.expect)((0, daemon_1.get_daemon_base_dir)({
244
+ env: { XDG_RUNTIME_DIR: '/run/user/1000' },
245
+ home_dir: '/home/tester',
246
+ platform: 'linux',
247
+ })).toBe('/run/user/1000/brightdata-cli');
248
+ (0, vitest_1.expect)((0, daemon_1.get_daemon_base_dir)({
249
+ home_dir: '/Users/tester',
250
+ platform: 'darwin',
251
+ })).toBe('/Users/tester/Library/Application Support/brightdata-cli');
252
+ (0, vitest_1.expect)((0, daemon_1.get_daemon_transport)('shop', {
253
+ home_dir: 'C:\\Users\\tester',
254
+ platform: 'win32',
255
+ })).toMatchObject({
256
+ host: '127.0.0.1',
257
+ kind: 'tcp',
258
+ port: (0, daemon_1.get_port_for_session)('shop'),
259
+ });
260
+ });
261
+ (0, vitest_1.it)('parses daemon env and idle timeout defaults', async () => {
262
+ (0, vitest_1.expect)((0, daemon_1.parse_idle_timeout)(undefined)).toBe(undefined);
263
+ (0, vitest_1.expect)((0, daemon_1.parse_idle_timeout)('2500')).toBe(2500);
264
+ (0, vitest_1.expect)(() => (0, daemon_1.create_daemon_from_env)({}))
265
+ .toThrow('BRIGHTDATA_CDP_ENDPOINT is required');
266
+ const daemon = (0, daemon_1.create_daemon_from_env)({
267
+ BRIGHTDATA_CDP_ENDPOINT: 'wss://example.test',
268
+ BRIGHTDATA_SESSION: 'demo',
269
+ });
270
+ const transport = daemon.get_transport();
271
+ (0, vitest_1.expect)(transport.kind).toBe(process.platform == 'win32' ? 'tcp' : 'unix');
272
+ (0, vitest_1.expect)(daemon.state.session_name).toBe('demo');
273
+ const default_daemon = new daemon_1.BrowserDaemon({
274
+ cdp_endpoint: 'wss://example.test',
275
+ daemon_dir: tmp_dir,
276
+ });
277
+ const response = await default_daemon.handle_request({
278
+ id: 'status-1',
279
+ action: 'status',
280
+ });
281
+ (0, vitest_1.expect)(response.success).toBe(true);
282
+ (0, vitest_1.expect)(response.data.idle_timeout_ms)
283
+ .toBe(daemon_1.DEFAULT_DAEMON_IDLE_TIMEOUT_MS);
284
+ });
285
+ (0, vitest_1.it)('connects, navigates, and tracks network requests', async () => {
286
+ const mock_browser = new Mock_browser();
287
+ const connect_over_cdp = vitest_1.vi.fn(async () => mock_browser);
288
+ const daemon = new daemon_1.BrowserDaemon({
289
+ cdp_endpoint: 'wss://example.test',
290
+ daemon_dir: tmp_dir,
291
+ idle_timeout_ms: 0,
292
+ session_name: 'stateful',
293
+ }, { connect_over_cdp });
294
+ const navigate = await daemon.handle_request({
295
+ id: 'nav-1',
296
+ action: 'navigate',
297
+ params: { url: 'https://example.com' },
298
+ });
299
+ (0, vitest_1.expect)(navigate).toMatchObject({
300
+ id: 'nav-1',
301
+ success: true,
302
+ data: {
303
+ status: 200,
304
+ title: 'Title for https://example.com',
305
+ url: 'https://example.com',
306
+ },
307
+ });
308
+ (0, vitest_1.expect)(connect_over_cdp).toHaveBeenCalledTimes(1);
309
+ const page = mock_browser.first_context().first_page();
310
+ const request = {
311
+ method: () => 'GET',
312
+ url: () => 'https://example.com/',
313
+ };
314
+ page.emit('request', request);
315
+ page.emit('response', new Mock_response(request, 200));
316
+ const network = await daemon.handle_request({
317
+ id: 'net-1',
318
+ action: 'network',
319
+ });
320
+ (0, vitest_1.expect)(network).toMatchObject({
321
+ id: 'net-1',
322
+ success: true,
323
+ data: {
324
+ requests: [
325
+ {
326
+ id: 'r1',
327
+ method: 'GET',
328
+ status: 200,
329
+ url: 'https://example.com/',
330
+ },
331
+ ],
332
+ },
333
+ });
334
+ mock_browser.disconnect();
335
+ const status = await daemon.handle_request({
336
+ id: 'status-2',
337
+ action: 'status',
338
+ });
339
+ (0, vitest_1.expect)(status).toMatchObject({
340
+ id: 'status-2',
341
+ success: true,
342
+ data: {
343
+ connected: false,
344
+ current_title: null,
345
+ current_url: null,
346
+ },
347
+ });
348
+ await daemon.stop();
349
+ });
350
+ (0, vitest_1.it)('captures snapshot text and refreshes daemon DOM refs', async () => {
351
+ const mock_browser = new Mock_browser();
352
+ const connect_over_cdp = vitest_1.vi.fn(async () => mock_browser);
353
+ const daemon = new daemon_1.BrowserDaemon({
354
+ cdp_endpoint: 'wss://example.test',
355
+ daemon_dir: tmp_dir,
356
+ idle_timeout_ms: 0,
357
+ session_name: 'snapshot-actions',
358
+ }, { connect_over_cdp });
359
+ await daemon.handle_request({
360
+ id: 'nav-snapshot',
361
+ action: 'navigate',
362
+ params: { url: 'https://example.com' },
363
+ });
364
+ const snapshot = await daemon.handle_request({
365
+ id: 'snapshot-1',
366
+ action: 'snapshot',
367
+ params: {
368
+ compact: true,
369
+ depth: 1,
370
+ selector: '#checkout',
371
+ },
372
+ });
373
+ (0, vitest_1.expect)(snapshot).toMatchObject({
374
+ id: 'snapshot-1',
375
+ success: true,
376
+ data: {
377
+ compact: true,
378
+ depth: 1,
379
+ interactive: false,
380
+ ref_count: 2,
381
+ selector: '#checkout',
382
+ title: 'Title for https://example.com',
383
+ url: 'https://example.com',
384
+ },
385
+ });
386
+ (0, vitest_1.expect)(snapshot.data.snapshot).toContain('- navigation');
387
+ (0, vitest_1.expect)(snapshot.data.snapshot).toContain('link "Pricing" [ref=e1]');
388
+ (0, vitest_1.expect)(snapshot.data.snapshot).toContain('button "Buy" [ref=e2]');
389
+ (0, vitest_1.expect)(daemon.state.dom_refs.get('e1')).toBe('[data-bd-ref="e1"]');
390
+ (0, vitest_1.expect)(daemon.state.dom_refs.get('e2')).toBe('[data-bd-ref="e2"]');
391
+ await daemon.stop();
392
+ });
393
+ (0, vitest_1.it)('supports back, forward, reload, and cookies actions', async () => {
394
+ const cookies = [{ name: 'session', value: 'abc' }];
395
+ const mock_browser = new Mock_browser([
396
+ new Mock_context([], cookies),
397
+ ]);
398
+ const connect_over_cdp = vitest_1.vi.fn(async () => mock_browser);
399
+ const daemon = new daemon_1.BrowserDaemon({
400
+ cdp_endpoint: 'wss://example.test',
401
+ daemon_dir: tmp_dir,
402
+ idle_timeout_ms: 0,
403
+ session_name: 'navigation-actions',
404
+ }, { connect_over_cdp });
405
+ await daemon.handle_request({
406
+ id: 'nav-seed',
407
+ action: 'navigate',
408
+ params: { url: 'https://example.com' },
409
+ });
410
+ const back = await daemon.handle_request({
411
+ id: 'back-1',
412
+ action: 'back',
413
+ });
414
+ (0, vitest_1.expect)(back).toMatchObject({
415
+ id: 'back-1',
416
+ success: true,
417
+ data: {
418
+ status: 200,
419
+ title: 'Title for https://example.com/back',
420
+ url: 'https://example.com/back',
421
+ },
422
+ });
423
+ const forward = await daemon.handle_request({
424
+ id: 'forward-1',
425
+ action: 'forward',
426
+ });
427
+ (0, vitest_1.expect)(forward).toMatchObject({
428
+ id: 'forward-1',
429
+ success: true,
430
+ data: {
431
+ status: 200,
432
+ title: 'Title for https://example.com/forward',
433
+ url: 'https://example.com/forward',
434
+ },
435
+ });
436
+ const reload = await daemon.handle_request({
437
+ id: 'reload-1',
438
+ action: 'reload',
439
+ });
440
+ (0, vitest_1.expect)(reload).toMatchObject({
441
+ id: 'reload-1',
442
+ success: true,
443
+ data: {
444
+ status: 200,
445
+ title: 'Title for https://example.com/forward',
446
+ url: 'https://example.com/forward',
447
+ },
448
+ });
449
+ const cookie_response = await daemon.handle_request({
450
+ id: 'cookies-1',
451
+ action: 'cookies',
452
+ });
453
+ (0, vitest_1.expect)(cookie_response).toMatchObject({
454
+ id: 'cookies-1',
455
+ success: true,
456
+ data: { cookies },
457
+ });
458
+ await daemon.stop();
459
+ });
460
+ (0, vitest_1.it)('captures screenshots and returns the saved file path', async () => {
461
+ const mock_browser = new Mock_browser();
462
+ const connect_over_cdp = vitest_1.vi.fn(async () => mock_browser);
463
+ const daemon = new daemon_1.BrowserDaemon({
464
+ cdp_endpoint: 'wss://example.test',
465
+ daemon_dir: tmp_dir,
466
+ idle_timeout_ms: 0,
467
+ session_name: 'screenshot-actions',
468
+ }, { connect_over_cdp });
469
+ const output_path = path_1.default.join(tmp_dir, 'captures', 'page.png');
470
+ const screenshot = await daemon.handle_request({
471
+ id: 'screenshot-1',
472
+ action: 'screenshot',
473
+ params: {
474
+ base64: true,
475
+ full_page: true,
476
+ path: output_path,
477
+ },
478
+ });
479
+ (0, vitest_1.expect)(screenshot).toMatchObject({
480
+ id: 'screenshot-1',
481
+ success: true,
482
+ data: {
483
+ base64: Buffer.from('full-page-image').toString('base64'),
484
+ full_page: true,
485
+ mime_type: 'image/png',
486
+ path: output_path,
487
+ },
488
+ });
489
+ const page = mock_browser.first_context().first_page();
490
+ (0, vitest_1.expect)(page.last_screenshot_opts()).toEqual({ fullPage: true });
491
+ (0, vitest_1.expect)(fs_1.default.readFileSync(output_path, 'utf8')).toBe('full-page-image');
492
+ await daemon.stop();
493
+ });
494
+ (0, vitest_1.it)('starts and clears the keepalive interval with the daemon lifecycle', async () => {
495
+ vitest_1.vi.useFakeTimers();
496
+ const set_interval = vitest_1.vi.fn((handler, timeout) => setInterval(handler, timeout));
497
+ const clear_interval = vitest_1.vi.fn((interval) => {
498
+ clearInterval(interval);
499
+ });
500
+ const daemon = new daemon_1.BrowserDaemon({
501
+ cdp_endpoint: 'wss://example.test',
502
+ daemon_dir: tmp_dir,
503
+ idle_timeout_ms: 0,
504
+ session_name: 'keepalive-lifecycle',
505
+ }, {
506
+ clear_interval: clear_interval,
507
+ set_interval: set_interval,
508
+ });
509
+ await daemon.start();
510
+ (0, vitest_1.expect)(set_interval).toHaveBeenCalledWith(vitest_1.expect.any(Function), daemon_1.KEEPALIVE_INTERVAL);
511
+ await daemon.stop();
512
+ (0, vitest_1.expect)(clear_interval).toHaveBeenCalledTimes(1);
513
+ });
514
+ (0, vitest_1.it)('pings the browser on keepalive and clears stale state on health-check failure', async () => {
515
+ vitest_1.vi.useFakeTimers();
516
+ const mock_browser = new Mock_browser();
517
+ const connect_over_cdp = vitest_1.vi.fn(async () => mock_browser);
518
+ const daemon = new daemon_1.BrowserDaemon({
519
+ cdp_endpoint: 'wss://example.test',
520
+ daemon_dir: tmp_dir,
521
+ idle_timeout_ms: 0,
522
+ session_name: 'keepalive-health',
523
+ }, { connect_over_cdp });
524
+ await daemon.start();
525
+ await daemon.handle_request({
526
+ id: 'nav-keepalive',
527
+ action: 'navigate',
528
+ params: { url: 'https://example.com' },
529
+ });
530
+ const before_tick = mock_browser.contexts_call_count();
531
+ await vitest_1.vi.advanceTimersByTimeAsync(daemon_1.KEEPALIVE_INTERVAL);
532
+ (0, vitest_1.expect)(mock_browser.contexts_call_count()).toBeGreaterThan(before_tick);
533
+ mock_browser.break_health_check();
534
+ await vitest_1.vi.advanceTimersByTimeAsync(daemon_1.KEEPALIVE_INTERVAL);
535
+ const status = await daemon.handle_request({
536
+ id: 'status-keepalive',
537
+ action: 'status',
538
+ });
539
+ (0, vitest_1.expect)(status).toMatchObject({
540
+ id: 'status-keepalive',
541
+ success: true,
542
+ data: {
543
+ connected: false,
544
+ current_title: null,
545
+ current_url: null,
546
+ },
547
+ });
548
+ await daemon.stop();
549
+ });
550
+ (0, vitest_1.it)('serves requests over the daemon listener', async () => {
551
+ if (process.platform == 'win32')
552
+ return;
553
+ const daemon = new daemon_1.BrowserDaemon({
554
+ cdp_endpoint: 'wss://example.test',
555
+ daemon_dir: tmp_dir,
556
+ idle_timeout_ms: 0,
557
+ session_name: 'socket-test',
558
+ });
559
+ await daemon.start();
560
+ const transport = daemon.get_transport();
561
+ (0, vitest_1.expect)(transport.kind).toBe('unix');
562
+ const socket = net_1.default.createConnection(transport.socket_path);
563
+ socket.write(JSON.stringify({ id: 'sock-1', action: 'status' }) + '\n');
564
+ const response = JSON.parse(await read_line(socket));
565
+ (0, vitest_1.expect)(response.success).toBe(true);
566
+ (0, vitest_1.expect)(response.data.session_name).toBe('socket-test');
567
+ socket.end();
568
+ await daemon.stop();
569
+ });
570
+ (0, vitest_1.it)('shuts down after the idle timeout', async () => {
571
+ vitest_1.vi.useFakeTimers();
572
+ const daemon = new daemon_1.BrowserDaemon({
573
+ cdp_endpoint: 'wss://example.test',
574
+ daemon_dir: tmp_dir,
575
+ idle_timeout_ms: 25,
576
+ session_name: 'idle-test',
577
+ });
578
+ await daemon.start();
579
+ (0, vitest_1.expect)(daemon.is_running()).toBe(true);
580
+ await vitest_1.vi.advanceTimersByTimeAsync(30);
581
+ (0, vitest_1.expect)(daemon.is_running()).toBe(false);
582
+ const transport = daemon.get_transport();
583
+ (0, vitest_1.expect)(fs_1.default.existsSync(transport.pid_path)).toBe(false);
584
+ });
585
+ });
586
+ //# sourceMappingURL=daemon.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.test.js","sourceRoot":"","sources":["../../../src/__tests__/browser/daemon.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=entrypoint.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entrypoint.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/browser/entrypoint.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const entrypoint_1 = require("../../browser/entrypoint");
5
+ (0, vitest_1.describe)('browser/entrypoint', () => {
6
+ (0, vitest_1.it)('detects daemon mode from argv or environment', () => {
7
+ (0, vitest_1.expect)((0, entrypoint_1.is_browser_daemon_process)(['node', 'dist/index.js', '--daemon'], {})).toBe(true);
8
+ (0, vitest_1.expect)((0, entrypoint_1.is_browser_daemon_process)(['node', 'dist/index.js'], { BRIGHTDATA_DAEMON: '1' })).toBe(true);
9
+ (0, vitest_1.expect)((0, entrypoint_1.is_browser_daemon_process)(['node', 'dist/index.js'], {})).toBe(false);
10
+ });
11
+ (0, vitest_1.it)('registers platform-appropriate shutdown signals', () => {
12
+ (0, vitest_1.expect)((0, entrypoint_1.get_browser_daemon_signals)('linux'))
13
+ .toEqual(['SIGHUP', 'SIGINT', 'SIGTERM']);
14
+ (0, vitest_1.expect)((0, entrypoint_1.get_browser_daemon_signals)('win32'))
15
+ .toEqual(['SIGINT', 'SIGTERM']);
16
+ });
17
+ (0, vitest_1.it)('does nothing when the process is not in daemon mode', async () => {
18
+ const start_daemon = vitest_1.vi.fn();
19
+ await (0, vitest_1.expect)((0, entrypoint_1.maybe_run_browser_daemon)({
20
+ argv: ['node', 'dist/index.js'],
21
+ env: {},
22
+ start_daemon,
23
+ })).resolves.toBe(false);
24
+ (0, vitest_1.expect)(start_daemon).not.toHaveBeenCalled();
25
+ });
26
+ (0, vitest_1.it)('starts the daemon and stops it on shutdown signals', async () => {
27
+ const listeners = {};
28
+ const exit = vitest_1.vi.fn();
29
+ const stop = vitest_1.vi.fn(async () => undefined);
30
+ const start_daemon = vitest_1.vi.fn(async () => ({ stop }));
31
+ await (0, vitest_1.expect)((0, entrypoint_1.maybe_run_browser_daemon)({
32
+ argv: ['node', 'dist/index.js', '--daemon'],
33
+ env: { BRIGHTDATA_CDP_ENDPOINT: 'wss://example.test' },
34
+ exit,
35
+ once: (event, listener) => {
36
+ listeners[event] = listener;
37
+ return process;
38
+ },
39
+ platform: 'linux',
40
+ start_daemon,
41
+ })).resolves.toBe(true);
42
+ (0, vitest_1.expect)(start_daemon).toHaveBeenCalledWith({
43
+ BRIGHTDATA_CDP_ENDPOINT: 'wss://example.test',
44
+ });
45
+ (0, vitest_1.expect)(listeners['SIGTERM']).toBeTypeOf('function');
46
+ listeners['SIGTERM']?.();
47
+ await vitest_1.vi.waitFor(() => {
48
+ (0, vitest_1.expect)(stop).toHaveBeenCalledTimes(1);
49
+ (0, vitest_1.expect)(exit).toHaveBeenCalledWith(0);
50
+ });
51
+ });
52
+ });
53
+ //# sourceMappingURL=entrypoint.test.js.map