@brightdata/cli 0.1.3 → 0.1.5

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 (92) hide show
  1. package/README.md +410 -1
  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/add-mcp.test.d.ts +2 -0
  27. package/dist/__tests__/commands/add-mcp.test.d.ts.map +1 -0
  28. package/dist/__tests__/commands/add-mcp.test.js +138 -0
  29. package/dist/__tests__/commands/add-mcp.test.js.map +1 -0
  30. package/dist/__tests__/commands/browser.test.d.ts +2 -0
  31. package/dist/__tests__/commands/browser.test.d.ts.map +1 -0
  32. package/dist/__tests__/commands/browser.test.js +431 -0
  33. package/dist/__tests__/commands/browser.test.js.map +1 -0
  34. package/dist/__tests__/utils/browser-credentials.test.d.ts +2 -0
  35. package/dist/__tests__/utils/browser-credentials.test.d.ts.map +1 -0
  36. package/dist/__tests__/utils/browser-credentials.test.js +81 -0
  37. package/dist/__tests__/utils/browser-credentials.test.js.map +1 -0
  38. package/dist/__tests__/utils/mcp-config.test.d.ts +2 -0
  39. package/dist/__tests__/utils/mcp-config.test.d.ts.map +1 -0
  40. package/dist/__tests__/utils/mcp-config.test.js +154 -0
  41. package/dist/__tests__/utils/mcp-config.test.js.map +1 -0
  42. package/dist/browser/connection.d.ts +24 -0
  43. package/dist/browser/connection.d.ts.map +1 -0
  44. package/dist/browser/connection.js +55 -0
  45. package/dist/browser/connection.js.map +1 -0
  46. package/dist/browser/daemon.d.ts +130 -0
  47. package/dist/browser/daemon.d.ts.map +1 -0
  48. package/dist/browser/daemon.js +645 -0
  49. package/dist/browser/daemon.js.map +1 -0
  50. package/dist/browser/entrypoint.d.ts +20 -0
  51. package/dist/browser/entrypoint.d.ts.map +1 -0
  52. package/dist/browser/entrypoint.js +46 -0
  53. package/dist/browser/entrypoint.js.map +1 -0
  54. package/dist/browser/interaction.d.ts +32 -0
  55. package/dist/browser/interaction.d.ts.map +1 -0
  56. package/dist/browser/interaction.js +215 -0
  57. package/dist/browser/interaction.js.map +1 -0
  58. package/dist/browser/ipc.d.ts +52 -0
  59. package/dist/browser/ipc.d.ts.map +1 -0
  60. package/dist/browser/ipc.js +254 -0
  61. package/dist/browser/ipc.js.map +1 -0
  62. package/dist/browser/lifecycle.d.ts +31 -0
  63. package/dist/browser/lifecycle.d.ts.map +1 -0
  64. package/dist/browser/lifecycle.js +202 -0
  65. package/dist/browser/lifecycle.js.map +1 -0
  66. package/dist/browser/screenshot.d.ts +19 -0
  67. package/dist/browser/screenshot.d.ts.map +1 -0
  68. package/dist/browser/screenshot.js +44 -0
  69. package/dist/browser/screenshot.js.map +1 -0
  70. package/dist/browser/snapshot.d.ts +48 -0
  71. package/dist/browser/snapshot.d.ts.map +1 -0
  72. package/dist/browser/snapshot.js +490 -0
  73. package/dist/browser/snapshot.js.map +1 -0
  74. package/dist/commands/add-mcp.d.ts +18 -0
  75. package/dist/commands/add-mcp.d.ts.map +1 -0
  76. package/dist/commands/add-mcp.js +196 -0
  77. package/dist/commands/add-mcp.js.map +1 -0
  78. package/dist/commands/browser.d.ts +62 -0
  79. package/dist/commands/browser.d.ts.map +1 -0
  80. package/dist/commands/browser.js +615 -0
  81. package/dist/commands/browser.js.map +1 -0
  82. package/dist/index.js +40 -21
  83. package/dist/index.js.map +1 -1
  84. package/dist/utils/browser-credentials.d.ts +5 -0
  85. package/dist/utils/browser-credentials.d.ts.map +1 -0
  86. package/dist/utils/browser-credentials.js +53 -0
  87. package/dist/utils/browser-credentials.js.map +1 -0
  88. package/dist/utils/mcp-config.d.ts +15 -0
  89. package/dist/utils/mcp-config.d.ts.map +1 -0
  90. package/dist/utils/mcp-config.js +87 -0
  91. package/dist/utils/mcp-config.js.map +1 -0
  92. package/package.json +2 -1
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const mocks = vitest_1.vi.hoisted(() => ({
5
+ get: vitest_1.vi.fn(),
6
+ post: vitest_1.vi.fn(),
7
+ }));
8
+ vitest_1.vi.mock('../../utils/client', () => ({
9
+ get: mocks.get,
10
+ post: mocks.post,
11
+ }));
12
+ const browser_credentials_1 = require("../../utils/browser-credentials");
13
+ (0, vitest_1.describe)('utils/browser-credentials', () => {
14
+ (0, vitest_1.beforeEach)(() => {
15
+ vitest_1.vi.clearAllMocks();
16
+ });
17
+ (0, vitest_1.it)('does not create the browser zone when it already exists', async () => {
18
+ mocks.get.mockResolvedValueOnce([
19
+ { name: 'cli_browser', type: 'browser_api' },
20
+ ]);
21
+ await (0, vitest_1.expect)((0, browser_credentials_1.ensure_browser_zone)('api_key')).resolves.toBeUndefined();
22
+ (0, vitest_1.expect)(mocks.get).toHaveBeenCalledWith('api_key', '/zone/get_active_zones');
23
+ (0, vitest_1.expect)(mocks.post).not.toHaveBeenCalled();
24
+ });
25
+ (0, vitest_1.it)('creates the default browser zone when it is missing', async () => {
26
+ mocks.get.mockResolvedValueOnce([
27
+ { name: 'cli_unlocker', type: 'unblocker' },
28
+ ]);
29
+ mocks.post.mockResolvedValueOnce({});
30
+ await (0, browser_credentials_1.ensure_browser_zone)('api_key');
31
+ (0, vitest_1.expect)(mocks.post).toHaveBeenCalledWith('api_key', '/zone', {
32
+ zone: { name: 'cli_browser', type: 'browser_api' },
33
+ plan: { type: 'browser_api' },
34
+ });
35
+ });
36
+ (0, vitest_1.it)('creates a custom browser zone when an override is missing', async () => {
37
+ mocks.get.mockResolvedValueOnce([]);
38
+ mocks.post.mockResolvedValueOnce({});
39
+ await (0, browser_credentials_1.ensure_browser_zone)('api_key', ' browser_us ');
40
+ (0, vitest_1.expect)(mocks.post).toHaveBeenCalledWith('api_key', '/zone', {
41
+ zone: { name: 'browser_us', type: 'browser_api' },
42
+ plan: { type: 'browser_api' },
43
+ });
44
+ });
45
+ (0, vitest_1.it)('builds a CDP endpoint without country targeting', async () => {
46
+ mocks.get
47
+ .mockResolvedValueOnce({ customer: 'hl_123' })
48
+ .mockResolvedValueOnce({ passwords: ['secret'] });
49
+ await (0, vitest_1.expect)((0, browser_credentials_1.get_cdp_endpoint)('api_key', 'cli_browser'))
50
+ .resolves.toBe('wss://brd-customer-hl_123-zone-cli_browser:secret@'
51
+ + 'brd.superproxy.io:9222');
52
+ (0, vitest_1.expect)(mocks.get).toHaveBeenNthCalledWith(1, 'api_key', '/status');
53
+ (0, vitest_1.expect)(mocks.get).toHaveBeenNthCalledWith(2, 'api_key', '/zone/passwords?zone=cli_browser');
54
+ });
55
+ (0, vitest_1.it)('builds a CDP endpoint with normalized country targeting', async () => {
56
+ mocks.get
57
+ .mockResolvedValueOnce({ customer: 'hl_123' })
58
+ .mockResolvedValueOnce({ passwords: ['secret'] });
59
+ await (0, vitest_1.expect)((0, browser_credentials_1.get_cdp_endpoint)('api_key', ' cli_browser ', ' US '))
60
+ .resolves.toBe('wss://brd-customer-hl_123-zone-cli_browser-country-us:'
61
+ + 'secret@brd.superproxy.io:9222');
62
+ });
63
+ (0, vitest_1.it)('throws when the customer id is missing', async () => {
64
+ mocks.get.mockResolvedValueOnce({});
65
+ await (0, vitest_1.expect)((0, browser_credentials_1.get_cdp_endpoint)('api_key', 'cli_browser'))
66
+ .rejects.toThrow('Could not resolve Bright Data customer ID from /status.');
67
+ });
68
+ (0, vitest_1.it)('throws when the zone has no passwords', async () => {
69
+ mocks.get
70
+ .mockResolvedValueOnce({ customer: 'hl_123' })
71
+ .mockResolvedValueOnce({ passwords: [] });
72
+ await (0, vitest_1.expect)((0, browser_credentials_1.get_cdp_endpoint)('api_key', 'cli_browser'))
73
+ .rejects.toThrow('No browser password found for zone "cli_browser".');
74
+ });
75
+ (0, vitest_1.it)('rejects invalid country codes before making requests', async () => {
76
+ await (0, vitest_1.expect)((0, browser_credentials_1.get_cdp_endpoint)('api_key', 'cli_browser', 'usa'))
77
+ .rejects.toThrow('Browser country must be a 2-letter ISO code.');
78
+ (0, vitest_1.expect)(mocks.get).not.toHaveBeenCalled();
79
+ });
80
+ });
81
+ //# sourceMappingURL=browser-credentials.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-credentials.test.js","sourceRoot":"","sources":["../../../src/__tests__/utils/browser-credentials.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mcp-config.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-config.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/utils/mcp-config.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,154 @@
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 os_1 = __importDefault(require("os"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const vitest_1 = require("vitest");
10
+ const mcp_config_1 = require("../../utils/mcp-config");
11
+ const get_expected_entry = (api_key) => ({
12
+ command: 'npx',
13
+ args: ['@brightdata/mcp'],
14
+ env: {
15
+ API_TOKEN: api_key,
16
+ },
17
+ });
18
+ const mk_tmp_dir = () => fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'brightdata-mcp-config-'));
19
+ (0, vitest_1.describe)('utils/mcp-config', () => {
20
+ let tmp_dir = '';
21
+ (0, vitest_1.beforeEach)(() => {
22
+ tmp_dir = mk_tmp_dir();
23
+ });
24
+ (0, vitest_1.afterEach)(() => {
25
+ vitest_1.vi.restoreAllMocks();
26
+ delete process.env['CODEX_HOME'];
27
+ if (tmp_dir)
28
+ fs_1.default.rmSync(tmp_dir, { recursive: true, force: true });
29
+ });
30
+ (0, vitest_1.it)('creates a new config file when none exists', () => {
31
+ const file_path = path_1.default.join(tmp_dir, 'mcp.json');
32
+ (0, mcp_config_1.upsert_mcp_config)(file_path, 'new_key');
33
+ (0, vitest_1.expect)(JSON.parse(fs_1.default.readFileSync(file_path, 'utf8'))).toEqual({
34
+ mcpServers: {
35
+ 'bright-data': get_expected_entry('new_key'),
36
+ },
37
+ });
38
+ (0, vitest_1.expect)(fs_1.default.statSync(file_path).mode & 0o777).toBe(0o600);
39
+ });
40
+ (0, vitest_1.it)('merges the Bright Data server into an existing config', () => {
41
+ const file_path = path_1.default.join(tmp_dir, 'mcp.json');
42
+ fs_1.default.writeFileSync(file_path, JSON.stringify({
43
+ theme: 'light',
44
+ mcpServers: {
45
+ existing: {
46
+ command: 'node',
47
+ },
48
+ },
49
+ }, null, 4));
50
+ (0, mcp_config_1.upsert_mcp_config)(file_path, 'merged_key');
51
+ (0, vitest_1.expect)(JSON.parse(fs_1.default.readFileSync(file_path, 'utf8'))).toEqual({
52
+ theme: 'light',
53
+ mcpServers: {
54
+ existing: {
55
+ command: 'node',
56
+ },
57
+ 'bright-data': get_expected_entry('merged_key'),
58
+ },
59
+ });
60
+ });
61
+ (0, vitest_1.it)('overwrites an existing bright-data entry without removing other servers', () => {
62
+ const file_path = path_1.default.join(tmp_dir, 'mcp.json');
63
+ fs_1.default.writeFileSync(file_path, JSON.stringify({
64
+ mcpServers: {
65
+ 'bright-data': {
66
+ command: 'old-command',
67
+ args: ['old-package'],
68
+ env: {
69
+ API_TOKEN: 'old_key',
70
+ EXTRA: 'value',
71
+ },
72
+ },
73
+ existing: {
74
+ command: 'node',
75
+ },
76
+ },
77
+ }, null, 4));
78
+ (0, mcp_config_1.upsert_mcp_config)(file_path, 'fresh_key');
79
+ (0, vitest_1.expect)(JSON.parse(fs_1.default.readFileSync(file_path, 'utf8'))).toEqual({
80
+ mcpServers: {
81
+ 'bright-data': get_expected_entry('fresh_key'),
82
+ existing: {
83
+ command: 'node',
84
+ },
85
+ },
86
+ });
87
+ });
88
+ (0, vitest_1.it)('throws on invalid JSON unless overwrite_invalid is set', () => {
89
+ const file_path = path_1.default.join(tmp_dir, 'mcp.json');
90
+ fs_1.default.writeFileSync(file_path, '{invalid-json');
91
+ (0, vitest_1.expect)(() => (0, mcp_config_1.upsert_mcp_config)(file_path, 'api_key'))
92
+ .toThrow(mcp_config_1.Invalid_mcp_config_error);
93
+ (0, mcp_config_1.upsert_mcp_config)(file_path, 'api_key', { overwrite_invalid: true });
94
+ (0, vitest_1.expect)(JSON.parse(fs_1.default.readFileSync(file_path, 'utf8'))).toEqual({
95
+ mcpServers: {
96
+ 'bright-data': get_expected_entry('api_key'),
97
+ },
98
+ });
99
+ });
100
+ (0, vitest_1.it)('writes Claude Code global config to the home directory', () => {
101
+ const home_dir = path_1.default.join(tmp_dir, 'home');
102
+ const exists_sync = vitest_1.vi.spyOn(fs_1.default, 'existsSync').mockReturnValue(false);
103
+ const mkdir_sync = vitest_1.vi.spyOn(fs_1.default, 'mkdirSync')
104
+ .mockImplementation(() => undefined);
105
+ const write_file_sync = vitest_1.vi.spyOn(fs_1.default, 'writeFileSync')
106
+ .mockImplementation(() => undefined);
107
+ const chmod_sync = vitest_1.vi.spyOn(fs_1.default, 'chmodSync')
108
+ .mockImplementation(() => undefined);
109
+ vitest_1.vi.spyOn(os_1.default, 'homedir').mockReturnValue(home_dir);
110
+ (0, mcp_config_1.write_claude_code_mcp)('api_key', 'global');
111
+ (0, vitest_1.expect)(exists_sync).toHaveBeenCalled();
112
+ (0, vitest_1.expect)(mkdir_sync).toHaveBeenCalledWith(home_dir, { recursive: true });
113
+ (0, vitest_1.expect)(write_file_sync).toHaveBeenCalledWith(path_1.default.join(home_dir, '.claude.json'), vitest_1.expect.any(String), { mode: 0o600 });
114
+ (0, vitest_1.expect)(chmod_sync).toHaveBeenCalledWith(path_1.default.join(home_dir, '.claude.json'), 0o600);
115
+ });
116
+ (0, vitest_1.it)('writes Claude Code project config under the current directory', () => {
117
+ const project_dir = path_1.default.join(tmp_dir, 'project');
118
+ const write_file_sync = vitest_1.vi.spyOn(fs_1.default, 'writeFileSync')
119
+ .mockImplementation(() => undefined);
120
+ vitest_1.vi.spyOn(fs_1.default, 'existsSync').mockReturnValue(false);
121
+ vitest_1.vi.spyOn(fs_1.default, 'mkdirSync').mockImplementation(() => undefined);
122
+ vitest_1.vi.spyOn(fs_1.default, 'chmodSync').mockImplementation(() => undefined);
123
+ vitest_1.vi.spyOn(process, 'cwd').mockReturnValue(project_dir);
124
+ (0, mcp_config_1.write_claude_code_mcp)('api_key', 'project');
125
+ (0, vitest_1.expect)(write_file_sync).toHaveBeenCalledWith(path_1.default.join(project_dir, '.claude', 'settings.json'), vitest_1.expect.any(String), { mode: 0o600 });
126
+ });
127
+ (0, vitest_1.it)('writes Cursor config to the correct global and project paths', () => {
128
+ const home_dir = path_1.default.join(tmp_dir, 'home');
129
+ const project_dir = path_1.default.join(tmp_dir, 'project');
130
+ const write_file_sync = vitest_1.vi.spyOn(fs_1.default, 'writeFileSync')
131
+ .mockImplementation(() => undefined);
132
+ vitest_1.vi.spyOn(fs_1.default, 'existsSync').mockReturnValue(false);
133
+ vitest_1.vi.spyOn(fs_1.default, 'mkdirSync').mockImplementation(() => undefined);
134
+ vitest_1.vi.spyOn(fs_1.default, 'chmodSync').mockImplementation(() => undefined);
135
+ vitest_1.vi.spyOn(os_1.default, 'homedir').mockReturnValue(home_dir);
136
+ vitest_1.vi.spyOn(process, 'cwd').mockReturnValue(project_dir);
137
+ (0, mcp_config_1.write_cursor_mcp)('api_key', 'global');
138
+ (0, mcp_config_1.write_cursor_mcp)('api_key', 'project');
139
+ (0, vitest_1.expect)(write_file_sync).toHaveBeenNthCalledWith(1, path_1.default.join(home_dir, '.cursor', 'mcp.json'), vitest_1.expect.any(String), { mode: 0o600 });
140
+ (0, vitest_1.expect)(write_file_sync).toHaveBeenNthCalledWith(2, path_1.default.join(project_dir, '.cursor', 'mcp.json'), vitest_1.expect.any(String), { mode: 0o600 });
141
+ });
142
+ (0, vitest_1.it)('writes Codex config to CODEX_HOME when it is set', () => {
143
+ const codex_home = path_1.default.join(tmp_dir, 'codex-home');
144
+ const write_file_sync = vitest_1.vi.spyOn(fs_1.default, 'writeFileSync')
145
+ .mockImplementation(() => undefined);
146
+ vitest_1.vi.spyOn(fs_1.default, 'existsSync').mockReturnValue(false);
147
+ vitest_1.vi.spyOn(fs_1.default, 'mkdirSync').mockImplementation(() => undefined);
148
+ vitest_1.vi.spyOn(fs_1.default, 'chmodSync').mockImplementation(() => undefined);
149
+ process.env['CODEX_HOME'] = codex_home;
150
+ (0, mcp_config_1.write_codex_mcp)('api_key');
151
+ (0, vitest_1.expect)(write_file_sync).toHaveBeenCalledWith(path_1.default.join(codex_home, 'mcp.json'), vitest_1.expect.any(String), { mode: 0o600 });
152
+ });
153
+ });
154
+ //# sourceMappingURL=mcp-config.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-config.test.js","sourceRoot":"","sources":["../../../src/__tests__/utils/mcp-config.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { Browser, BrowserContext, Page } from 'playwright-core';
2
+ type Browser_connection_state = {
3
+ browser: Browser | null;
4
+ page: Page | null;
5
+ connected: boolean;
6
+ cdp_endpoint: string;
7
+ dom_refs: Map<string, string>;
8
+ };
9
+ type Browser_connection_deps = {
10
+ connect_over_cdp: (cdp_endpoint: string) => Promise<Browser>;
11
+ };
12
+ type Browser_connection_hooks = {
13
+ on_context?: (context: BrowserContext) => void;
14
+ on_page?: (page: Page) => void;
15
+ };
16
+ declare const clear_connection_state: (state: Browser_connection_state) => void;
17
+ declare const connect_browser: (state: Browser_connection_state, deps: Browser_connection_deps, hooks?: Browser_connection_hooks) => Promise<{
18
+ browser: Browser;
19
+ page: Page;
20
+ }>;
21
+ declare const ensure_connected: (state: Browser_connection_state, deps: Browser_connection_deps, hooks?: Browser_connection_hooks) => Promise<Page>;
22
+ export { clear_connection_state, connect_browser, ensure_connected, };
23
+ export type { Browser_connection_deps, Browser_connection_hooks, Browser_connection_state, };
24
+ //# sourceMappingURL=connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/browser/connection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAC,MAAM,iBAAiB,CAAC;AAEnE,KAAK,wBAAwB,GAAG;IAC5B,OAAO,EAAE,OAAO,GAAC,IAAI,CAAC;IACtB,IAAI,EAAE,IAAI,GAAC,IAAI,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC,CAAC;AAEF,KAAK,uBAAuB,GAAG;IAC3B,gBAAgB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9D,CAAC;AAEF,KAAK,wBAAwB,GAAG;IAC5B,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAG,IAAI,CAAC;IAC7C,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAG,IAAI,CAAC;CAChC,CAAC;AAEF,QAAA,MAAM,sBAAsB,GAAI,OAAO,wBAAwB,SAK9D,CAAC;AAmBF,QAAA,MAAM,eAAe,GACjB,OAAO,wBAAwB,EAC/B,MAAM,uBAAuB,EAC7B,QAAO,wBAA6B,KACrC,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAC,CAUxC,CAAC;AAEF,QAAA,MAAM,gBAAgB,GAClB,OAAO,wBAAwB,EAC/B,MAAM,uBAAuB,EAC7B,QAAO,wBAA6B,KACrC,OAAO,CAAC,IAAI,CAwBd,CAAC;AAEF,OAAO,EACH,sBAAsB,EACtB,eAAe,EACf,gBAAgB,GACnB,CAAC;AACF,YAAY,EACR,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,GAC3B,CAAC"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ensure_connected = exports.connect_browser = exports.clear_connection_state = void 0;
4
+ const clear_connection_state = (state) => {
5
+ state.browser = null;
6
+ state.page = null;
7
+ state.connected = false;
8
+ state.dom_refs.clear();
9
+ };
10
+ exports.clear_connection_state = clear_connection_state;
11
+ const resolve_page = async (browser, hooks = {}) => {
12
+ const contexts = browser.contexts();
13
+ const context = contexts[0] ?? await browser.newContext();
14
+ for (const existing_context of contexts)
15
+ hooks.on_context?.(existing_context);
16
+ if (!contexts.includes(context))
17
+ hooks.on_context?.(context);
18
+ const page = context.pages()[0] ?? await context.newPage();
19
+ hooks.on_page?.(page);
20
+ return page;
21
+ };
22
+ const connect_browser = async (state, deps, hooks = {}) => {
23
+ const browser = await deps.connect_over_cdp(state.cdp_endpoint);
24
+ browser.on('disconnected', () => {
25
+ if (state.browser && state.browser != browser)
26
+ return;
27
+ clear_connection_state(state);
28
+ });
29
+ const page = await resolve_page(browser, hooks);
30
+ return { browser, page };
31
+ };
32
+ exports.connect_browser = connect_browser;
33
+ const ensure_connected = async (state, deps, hooks = {}) => {
34
+ if (state.browser) {
35
+ try {
36
+ state.browser.contexts();
37
+ state.connected = true;
38
+ }
39
+ catch (_error) {
40
+ clear_connection_state(state);
41
+ }
42
+ }
43
+ if (!state.browser) {
44
+ const { browser, page } = await connect_browser(state, deps, hooks);
45
+ state.browser = browser;
46
+ state.page = page;
47
+ state.connected = true;
48
+ return page;
49
+ }
50
+ if (!state.page || state.page.isClosed())
51
+ state.page = await resolve_page(state.browser, hooks);
52
+ return state.page;
53
+ };
54
+ exports.ensure_connected = ensure_connected;
55
+ //# sourceMappingURL=connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/browser/connection.ts"],"names":[],"mappings":";;;AAmBA,MAAM,sBAAsB,GAAG,CAAC,KAA+B,EAAC,EAAE;IAC9D,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;IACrB,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;IACxB,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;AAC3B,CAAC,CAAC;AAkEE,wDAAsB;AAhE1B,MAAM,YAAY,GAAG,KAAK,EACtB,OAAgB,EAChB,QAAkC,EAAE,EACxB,EAAE;IACd,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IACpC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;IAE1D,KAAK,MAAM,gBAAgB,IAAI,QAAQ;QACnC,KAAK,CAAC,UAAU,EAAE,CAAC,gBAAgB,CAAC,CAAC;IACzC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC3B,KAAK,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,CAAC;IAEhC,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3D,KAAK,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;IACtB,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,KAAK,EACzB,KAA+B,EAC/B,IAA6B,EAC7B,QAAkC,EAAE,EACE,EAAE;IACxC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAChE,OAAO,CAAC,EAAE,CAAC,cAAc,EAAE,GAAE,EAAE;QAC3B,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,IAAI,OAAO;YACzC,OAAO;QACX,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAChD,OAAO,EAAC,OAAO,EAAE,IAAI,EAAC,CAAC;AAC3B,CAAC,CAAC;AAkCE,0CAAe;AAhCnB,MAAM,gBAAgB,GAAG,KAAK,EAC1B,KAA+B,EAC/B,IAA6B,EAC7B,QAAkC,EAAE,EACxB,EAAE;IACd,IAAI,KAAK,CAAC,OAAO,EACjB,CAAC;QACG,IAAI,CAAC;YACD,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YACzB,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;QAC3B,CAAC;QAAC,OAAM,MAAM,EAAE,CAAC;YACb,sBAAsB,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,EAClB,CAAC;QACG,MAAM,EAAC,OAAO,EAAE,IAAI,EAAC,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAClE,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;QACxB,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;QAClB,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;QACvB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE;QACpC,KAAK,CAAC,IAAI,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAE1D,OAAO,KAAK,CAAC,IAAI,CAAC;AACtB,CAAC,CAAC;AAKE,4CAAgB"}
@@ -0,0 +1,130 @@
1
+ import net from 'net';
2
+ import type { Browser, Page } from 'playwright-core';
3
+ declare const DEFAULT_SESSION_NAME = "default";
4
+ declare const DEFAULT_DAEMON_IDLE_TIMEOUT_MS = 600000;
5
+ declare const KEEPALIVE_INTERVAL = 30000;
6
+ type Json_object = Record<string, unknown>;
7
+ type Tracked_request = {
8
+ method: string;
9
+ url: string;
10
+ resource_type?: string;
11
+ status?: number;
12
+ };
13
+ type Daemon_request = {
14
+ id: string;
15
+ action: string;
16
+ params?: Json_object;
17
+ };
18
+ type Daemon_response = {
19
+ id: string;
20
+ success: boolean;
21
+ data?: unknown;
22
+ error?: string;
23
+ };
24
+ type Daemon_state = {
25
+ browser: Browser | null;
26
+ page: Page | null;
27
+ connected: boolean;
28
+ dom_refs: Map<string, string>;
29
+ requests: Map<string, Tracked_request>;
30
+ cdp_endpoint: string;
31
+ session_name: string;
32
+ idle_timer: NodeJS.Timeout | null;
33
+ keepalive_timer: NodeJS.Timeout | null;
34
+ };
35
+ type Unix_transport = {
36
+ kind: 'unix';
37
+ base_dir: string;
38
+ pid_path: string;
39
+ socket_path: string;
40
+ };
41
+ type Tcp_transport = {
42
+ kind: 'tcp';
43
+ base_dir: string;
44
+ host: '127.0.0.1';
45
+ pid_path: string;
46
+ port: number;
47
+ port_path: string;
48
+ };
49
+ type Daemon_transport = Unix_transport | Tcp_transport;
50
+ type Path_opts = {
51
+ daemon_dir?: string;
52
+ env?: NodeJS.ProcessEnv;
53
+ home_dir?: string;
54
+ platform?: NodeJS.Platform;
55
+ };
56
+ type Browser_daemon_opts = {
57
+ cdp_endpoint: string;
58
+ session_name?: string;
59
+ idle_timeout_ms?: number;
60
+ daemon_dir?: string;
61
+ env?: NodeJS.ProcessEnv;
62
+ home_dir?: string;
63
+ };
64
+ type Browser_daemon_deps = {
65
+ clear_interval?: typeof clearInterval;
66
+ clear_timeout?: typeof clearTimeout;
67
+ connect_over_cdp?: (cdp_endpoint: string) => Promise<Browser>;
68
+ create_server?: (listener?: (socket: net.Socket) => void) => net.Server;
69
+ pid?: () => number;
70
+ set_interval?: typeof setInterval;
71
+ set_timeout?: typeof setTimeout;
72
+ };
73
+ declare const normalize_session_name: (session_name: string | undefined) => string;
74
+ declare const parse_idle_timeout: (raw: string | undefined) => number | undefined;
75
+ declare const get_daemon_base_dir: (opts?: Path_opts) => string;
76
+ declare const get_port_for_session: (session_name: string) => number;
77
+ declare const get_daemon_transport: (session_name: string, opts?: Path_opts) => Daemon_transport;
78
+ declare class BrowserDaemon {
79
+ readonly state: Daemon_state;
80
+ private readonly active_contexts;
81
+ private readonly active_pages;
82
+ private readonly deps;
83
+ private readonly idle_timeout_ms;
84
+ private readonly request_ids;
85
+ private readonly transport;
86
+ private active_requests;
87
+ private request_counter;
88
+ private server;
89
+ private stop_promise;
90
+ constructor(opts: Browser_daemon_opts, deps?: Browser_daemon_deps);
91
+ get_transport(): Daemon_transport;
92
+ is_running(): boolean;
93
+ start(): Promise<void>;
94
+ stop(): Promise<void>;
95
+ handle_request(request: Daemon_request): Promise<Daemon_response>;
96
+ private begin_activity;
97
+ private end_activity;
98
+ private clear_idle_timer;
99
+ private schedule_idle_timer;
100
+ private clear_keepalive;
101
+ private start_keepalive;
102
+ private stop_internal;
103
+ private cleanup_transport_files;
104
+ private handle_socket;
105
+ private process_line;
106
+ private execute_request;
107
+ private handle_navigate;
108
+ private switch_cdp_endpoint;
109
+ private handle_history_navigation;
110
+ private handle_reload;
111
+ private handle_cookies;
112
+ private create_navigation_result;
113
+ private handle_snapshot;
114
+ private handle_screenshot;
115
+ private handle_network;
116
+ private handle_status;
117
+ private safe_page_title;
118
+ private ensure_connected;
119
+ private track_context;
120
+ private track_page;
121
+ private track_request;
122
+ private track_response;
123
+ private trim_tracked_requests;
124
+ private close_browser;
125
+ }
126
+ declare const create_daemon_from_env: (env?: NodeJS.ProcessEnv) => BrowserDaemon;
127
+ declare const start_daemon_from_env: (env?: NodeJS.ProcessEnv) => Promise<BrowserDaemon>;
128
+ export { BrowserDaemon, DEFAULT_DAEMON_IDLE_TIMEOUT_MS, KEEPALIVE_INTERVAL, DEFAULT_SESSION_NAME, create_daemon_from_env, get_daemon_base_dir, get_daemon_transport, get_port_for_session, normalize_session_name, parse_idle_timeout, start_daemon_from_env, };
129
+ export type { Browser_daemon_deps, Browser_daemon_opts, Daemon_request, Daemon_response, Daemon_state, Daemon_transport, Tracked_request, };
130
+ //# sourceMappingURL=daemon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/browser/daemon.ts"],"names":[],"mappings":"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"}