@brightdata/cli 0.1.4 → 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.
- package/README.md +354 -0
- package/dist/__tests__/browser/connection.test.d.ts +2 -0
- package/dist/__tests__/browser/connection.test.d.ts.map +1 -0
- package/dist/__tests__/browser/connection.test.js +168 -0
- package/dist/__tests__/browser/connection.test.js.map +1 -0
- package/dist/__tests__/browser/daemon.test.d.ts +2 -0
- package/dist/__tests__/browser/daemon.test.d.ts.map +1 -0
- package/dist/__tests__/browser/daemon.test.js +586 -0
- package/dist/__tests__/browser/daemon.test.js.map +1 -0
- package/dist/__tests__/browser/entrypoint.test.d.ts +2 -0
- package/dist/__tests__/browser/entrypoint.test.d.ts.map +1 -0
- package/dist/__tests__/browser/entrypoint.test.js +53 -0
- package/dist/__tests__/browser/entrypoint.test.js.map +1 -0
- package/dist/__tests__/browser/ipc.test.d.ts +2 -0
- package/dist/__tests__/browser/ipc.test.d.ts.map +1 -0
- package/dist/__tests__/browser/ipc.test.js +199 -0
- package/dist/__tests__/browser/ipc.test.js.map +1 -0
- package/dist/__tests__/browser/lifecycle.test.d.ts +2 -0
- package/dist/__tests__/browser/lifecycle.test.d.ts.map +1 -0
- package/dist/__tests__/browser/lifecycle.test.js +176 -0
- package/dist/__tests__/browser/lifecycle.test.js.map +1 -0
- package/dist/__tests__/browser/snapshot.test.d.ts +2 -0
- package/dist/__tests__/browser/snapshot.test.d.ts.map +1 -0
- package/dist/__tests__/browser/snapshot.test.js +202 -0
- package/dist/__tests__/browser/snapshot.test.js.map +1 -0
- package/dist/__tests__/commands/browser.test.d.ts +2 -0
- package/dist/__tests__/commands/browser.test.d.ts.map +1 -0
- package/dist/__tests__/commands/browser.test.js +431 -0
- package/dist/__tests__/commands/browser.test.js.map +1 -0
- package/dist/__tests__/utils/browser-credentials.test.d.ts +2 -0
- package/dist/__tests__/utils/browser-credentials.test.d.ts.map +1 -0
- package/dist/__tests__/utils/browser-credentials.test.js +81 -0
- package/dist/__tests__/utils/browser-credentials.test.js.map +1 -0
- package/dist/browser/connection.d.ts +24 -0
- package/dist/browser/connection.d.ts.map +1 -0
- package/dist/browser/connection.js +55 -0
- package/dist/browser/connection.js.map +1 -0
- package/dist/browser/daemon.d.ts +130 -0
- package/dist/browser/daemon.d.ts.map +1 -0
- package/dist/browser/daemon.js +645 -0
- package/dist/browser/daemon.js.map +1 -0
- package/dist/browser/entrypoint.d.ts +20 -0
- package/dist/browser/entrypoint.d.ts.map +1 -0
- package/dist/browser/entrypoint.js +46 -0
- package/dist/browser/entrypoint.js.map +1 -0
- package/dist/browser/interaction.d.ts +32 -0
- package/dist/browser/interaction.d.ts.map +1 -0
- package/dist/browser/interaction.js +215 -0
- package/dist/browser/interaction.js.map +1 -0
- package/dist/browser/ipc.d.ts +52 -0
- package/dist/browser/ipc.d.ts.map +1 -0
- package/dist/browser/ipc.js +254 -0
- package/dist/browser/ipc.js.map +1 -0
- package/dist/browser/lifecycle.d.ts +31 -0
- package/dist/browser/lifecycle.d.ts.map +1 -0
- package/dist/browser/lifecycle.js +202 -0
- package/dist/browser/lifecycle.js.map +1 -0
- package/dist/browser/screenshot.d.ts +19 -0
- package/dist/browser/screenshot.d.ts.map +1 -0
- package/dist/browser/screenshot.js +44 -0
- package/dist/browser/screenshot.js.map +1 -0
- package/dist/browser/snapshot.d.ts +48 -0
- package/dist/browser/snapshot.d.ts.map +1 -0
- package/dist/browser/snapshot.js +490 -0
- package/dist/browser/snapshot.js.map +1 -0
- package/dist/commands/browser.d.ts +62 -0
- package/dist/commands/browser.d.ts.map +1 -0
- package/dist/commands/browser.js +615 -0
- package/dist/commands/browser.js.map +1 -0
- package/dist/index.js +39 -25
- package/dist/index.js.map +1 -1
- package/dist/utils/browser-credentials.d.ts +5 -0
- package/dist/utils/browser-credentials.d.ts.map +1 -0
- package/dist/utils/browser-credentials.js +53 -0
- package/dist/utils/browser-credentials.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,254 @@
|
|
|
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
|
+
exports.send_command = exports.read_line = exports.parse_daemon_response = exports.parse_daemon_request = exports.normalize_session_name = exports.get_port_for_session = exports.get_daemon_transport = exports.get_daemon_base_dir = exports.connect_socket = exports.DEFAULT_SESSION_NAME = exports.DEFAULT_IPC_TIMEOUT_MS = void 0;
|
|
7
|
+
const net_1 = __importDefault(require("net"));
|
|
8
|
+
const os_1 = __importDefault(require("os"));
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const DEFAULT_SESSION_NAME = 'default';
|
|
11
|
+
exports.DEFAULT_SESSION_NAME = DEFAULT_SESSION_NAME;
|
|
12
|
+
const DEFAULT_IPC_TIMEOUT_MS = 30_000;
|
|
13
|
+
exports.DEFAULT_IPC_TIMEOUT_MS = DEFAULT_IPC_TIMEOUT_MS;
|
|
14
|
+
const WINDOWS_PORT_BASE = 49_152;
|
|
15
|
+
const WINDOWS_PORT_SPAN = 16_383;
|
|
16
|
+
const is_object = (value) => {
|
|
17
|
+
return !!value && typeof value == 'object' && !Array.isArray(value);
|
|
18
|
+
};
|
|
19
|
+
const get_path_api = (platform) => platform == 'win32' ? path_1.default.win32 : path_1.default.posix;
|
|
20
|
+
const normalize_session_name = (session_name) => {
|
|
21
|
+
const normalized = (session_name ?? DEFAULT_SESSION_NAME).trim();
|
|
22
|
+
if (!normalized)
|
|
23
|
+
throw new Error('Browser session name cannot be empty.');
|
|
24
|
+
if (!/^[A-Za-z0-9._-]+$/.test(normalized)) {
|
|
25
|
+
throw new Error('Browser session name may contain only letters, numbers, dots, '
|
|
26
|
+
+ 'underscores, and hyphens.');
|
|
27
|
+
}
|
|
28
|
+
return normalized;
|
|
29
|
+
};
|
|
30
|
+
exports.normalize_session_name = normalize_session_name;
|
|
31
|
+
const normalize_timeout_ms = (timeout_ms) => {
|
|
32
|
+
if (timeout_ms === undefined)
|
|
33
|
+
return DEFAULT_IPC_TIMEOUT_MS;
|
|
34
|
+
if (!Number.isFinite(timeout_ms) || timeout_ms < 0)
|
|
35
|
+
throw new Error('IPC timeout must be a non-negative number of milliseconds.');
|
|
36
|
+
return Math.floor(timeout_ms);
|
|
37
|
+
};
|
|
38
|
+
const get_daemon_base_dir = (opts = {}) => {
|
|
39
|
+
const platform = opts.platform ?? process.platform;
|
|
40
|
+
const env = opts.env ?? process.env;
|
|
41
|
+
const home_dir = opts.home_dir ?? os_1.default.homedir();
|
|
42
|
+
const path_api = get_path_api(platform);
|
|
43
|
+
const daemon_dir = opts.daemon_dir?.trim();
|
|
44
|
+
const env_daemon_dir = env['BRIGHTDATA_DAEMON_DIR']?.trim();
|
|
45
|
+
if (daemon_dir)
|
|
46
|
+
return daemon_dir;
|
|
47
|
+
if (env_daemon_dir)
|
|
48
|
+
return env_daemon_dir;
|
|
49
|
+
if (platform == 'darwin') {
|
|
50
|
+
return path_api.join(home_dir, 'Library', 'Application Support', 'brightdata-cli');
|
|
51
|
+
}
|
|
52
|
+
if (platform == 'win32')
|
|
53
|
+
return path_api.join(home_dir, 'AppData', 'Roaming', 'brightdata-cli');
|
|
54
|
+
const runtime_dir = env['XDG_RUNTIME_DIR']?.trim();
|
|
55
|
+
if (runtime_dir)
|
|
56
|
+
return path_api.join(runtime_dir, 'brightdata-cli');
|
|
57
|
+
return path_api.join(home_dir, '.brightdata-cli');
|
|
58
|
+
};
|
|
59
|
+
exports.get_daemon_base_dir = get_daemon_base_dir;
|
|
60
|
+
const get_port_for_session = (session_name) => {
|
|
61
|
+
let hash = 0;
|
|
62
|
+
for (let i = 0; i < session_name.length; i++) {
|
|
63
|
+
hash = ((hash << 5) - hash + session_name.charCodeAt(i)) | 0;
|
|
64
|
+
}
|
|
65
|
+
return WINDOWS_PORT_BASE + ((hash >>> 0) % WINDOWS_PORT_SPAN);
|
|
66
|
+
};
|
|
67
|
+
exports.get_port_for_session = get_port_for_session;
|
|
68
|
+
const get_daemon_transport = (session_name, opts = {}) => {
|
|
69
|
+
const normalized_session = normalize_session_name(session_name);
|
|
70
|
+
const platform = opts.platform ?? process.platform;
|
|
71
|
+
const base_dir = get_daemon_base_dir({ ...opts, platform });
|
|
72
|
+
const path_api = get_path_api(platform);
|
|
73
|
+
const pid_path = path_api.join(base_dir, `${normalized_session}.pid`);
|
|
74
|
+
if (platform == 'win32') {
|
|
75
|
+
const port = get_port_for_session(normalized_session);
|
|
76
|
+
return {
|
|
77
|
+
kind: 'tcp',
|
|
78
|
+
base_dir,
|
|
79
|
+
host: '127.0.0.1',
|
|
80
|
+
pid_path,
|
|
81
|
+
port,
|
|
82
|
+
port_path: path_api.join(base_dir, `${normalized_session}.port`),
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
kind: 'unix',
|
|
87
|
+
base_dir,
|
|
88
|
+
pid_path,
|
|
89
|
+
socket_path: path_api.join(base_dir, `${normalized_session}.sock`),
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
exports.get_daemon_transport = get_daemon_transport;
|
|
93
|
+
const parse_daemon_request = (value) => {
|
|
94
|
+
if (!is_object(value))
|
|
95
|
+
throw new Error('Daemon request must be an object.');
|
|
96
|
+
const { id, action, params } = value;
|
|
97
|
+
if (typeof id != 'string' || !id.trim())
|
|
98
|
+
throw new Error('Daemon request id must be a non-empty string.');
|
|
99
|
+
if (typeof action != 'string' || !action.trim())
|
|
100
|
+
throw new Error('Daemon request action must be a non-empty string.');
|
|
101
|
+
if (params !== undefined && !is_object(params))
|
|
102
|
+
throw new Error('Daemon request params must be an object when provided.');
|
|
103
|
+
return {
|
|
104
|
+
id: id.trim(),
|
|
105
|
+
action: action.trim(),
|
|
106
|
+
params,
|
|
107
|
+
};
|
|
108
|
+
};
|
|
109
|
+
exports.parse_daemon_request = parse_daemon_request;
|
|
110
|
+
const parse_daemon_response = (value) => {
|
|
111
|
+
if (!is_object(value))
|
|
112
|
+
throw new Error('Daemon response must be an object.');
|
|
113
|
+
const { id, success, error } = value;
|
|
114
|
+
if (typeof id != 'string' || !id.trim())
|
|
115
|
+
throw new Error('Daemon response id must be a non-empty string.');
|
|
116
|
+
if (typeof success != 'boolean')
|
|
117
|
+
throw new Error('Daemon response success must be a boolean.');
|
|
118
|
+
if (error !== undefined && typeof error != 'string')
|
|
119
|
+
throw new Error('Daemon response error must be a string when provided.');
|
|
120
|
+
return {
|
|
121
|
+
id: id.trim(),
|
|
122
|
+
success,
|
|
123
|
+
data: value['data'],
|
|
124
|
+
error,
|
|
125
|
+
};
|
|
126
|
+
};
|
|
127
|
+
exports.parse_daemon_response = parse_daemon_response;
|
|
128
|
+
const connect_socket = async (session_name, opts = {}) => {
|
|
129
|
+
const transport = opts.transport ?? get_daemon_transport(session_name, opts);
|
|
130
|
+
const timeout_ms = normalize_timeout_ms(opts.timeout_ms);
|
|
131
|
+
const socket = transport.kind == 'unix'
|
|
132
|
+
? net_1.default.createConnection(transport.socket_path)
|
|
133
|
+
: net_1.default.createConnection(transport.port, transport.host);
|
|
134
|
+
socket.setEncoding('utf8');
|
|
135
|
+
socket.setTimeout(timeout_ms);
|
|
136
|
+
await new Promise((resolve, reject) => {
|
|
137
|
+
const on_connect = () => {
|
|
138
|
+
cleanup();
|
|
139
|
+
resolve();
|
|
140
|
+
};
|
|
141
|
+
const on_error = (error) => {
|
|
142
|
+
cleanup();
|
|
143
|
+
socket.destroy();
|
|
144
|
+
reject(error);
|
|
145
|
+
};
|
|
146
|
+
const on_timeout = () => {
|
|
147
|
+
cleanup();
|
|
148
|
+
socket.destroy();
|
|
149
|
+
reject(new Error(`Timed out connecting to browser daemon session "${normalize_session_name(session_name)}".`));
|
|
150
|
+
};
|
|
151
|
+
const cleanup = () => {
|
|
152
|
+
socket.off('connect', on_connect);
|
|
153
|
+
socket.off('error', on_error);
|
|
154
|
+
socket.off('timeout', on_timeout);
|
|
155
|
+
};
|
|
156
|
+
socket.once('connect', on_connect);
|
|
157
|
+
socket.once('error', on_error);
|
|
158
|
+
socket.once('timeout', on_timeout);
|
|
159
|
+
});
|
|
160
|
+
return socket;
|
|
161
|
+
};
|
|
162
|
+
exports.connect_socket = connect_socket;
|
|
163
|
+
const read_line = async (socket) => {
|
|
164
|
+
return await new Promise((resolve, reject) => {
|
|
165
|
+
let buffer = '';
|
|
166
|
+
const on_data = (chunk) => {
|
|
167
|
+
buffer += chunk.toString();
|
|
168
|
+
const newline_index = buffer.indexOf('\n');
|
|
169
|
+
if (newline_index < 0)
|
|
170
|
+
return;
|
|
171
|
+
cleanup();
|
|
172
|
+
resolve(buffer.slice(0, newline_index));
|
|
173
|
+
};
|
|
174
|
+
const on_close = () => {
|
|
175
|
+
cleanup();
|
|
176
|
+
reject(new Error('Browser daemon closed the connection before sending a response.'));
|
|
177
|
+
};
|
|
178
|
+
const on_error = (error) => {
|
|
179
|
+
cleanup();
|
|
180
|
+
reject(error);
|
|
181
|
+
};
|
|
182
|
+
const on_timeout = () => {
|
|
183
|
+
cleanup();
|
|
184
|
+
reject(new Error('Timed out waiting for browser daemon response.'));
|
|
185
|
+
};
|
|
186
|
+
const cleanup = () => {
|
|
187
|
+
socket.off('data', on_data);
|
|
188
|
+
socket.off('close', on_close);
|
|
189
|
+
socket.off('end', on_close);
|
|
190
|
+
socket.off('error', on_error);
|
|
191
|
+
socket.off('timeout', on_timeout);
|
|
192
|
+
};
|
|
193
|
+
socket.on('data', on_data);
|
|
194
|
+
socket.once('close', on_close);
|
|
195
|
+
socket.once('end', on_close);
|
|
196
|
+
socket.once('error', on_error);
|
|
197
|
+
socket.once('timeout', on_timeout);
|
|
198
|
+
});
|
|
199
|
+
};
|
|
200
|
+
exports.read_line = read_line;
|
|
201
|
+
const write_line = async (socket, line) => {
|
|
202
|
+
await new Promise((resolve, reject) => {
|
|
203
|
+
const on_error = (error) => {
|
|
204
|
+
cleanup();
|
|
205
|
+
reject(error);
|
|
206
|
+
};
|
|
207
|
+
const on_timeout = () => {
|
|
208
|
+
cleanup();
|
|
209
|
+
reject(new Error('Timed out writing to the browser daemon socket.'));
|
|
210
|
+
};
|
|
211
|
+
const cleanup = () => {
|
|
212
|
+
socket.off('error', on_error);
|
|
213
|
+
socket.off('timeout', on_timeout);
|
|
214
|
+
};
|
|
215
|
+
socket.once('error', on_error);
|
|
216
|
+
socket.once('timeout', on_timeout);
|
|
217
|
+
socket.write(line, () => {
|
|
218
|
+
cleanup();
|
|
219
|
+
resolve(undefined);
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
};
|
|
223
|
+
const send_command = async (session_name, request, opts = {}) => {
|
|
224
|
+
const normalized_request = parse_daemon_request(request);
|
|
225
|
+
const socket = await connect_socket(session_name, opts);
|
|
226
|
+
try {
|
|
227
|
+
await write_line(socket, JSON.stringify(normalized_request) + '\n');
|
|
228
|
+
let line;
|
|
229
|
+
try {
|
|
230
|
+
line = await read_line(socket);
|
|
231
|
+
}
|
|
232
|
+
catch (error) {
|
|
233
|
+
throw error;
|
|
234
|
+
}
|
|
235
|
+
let parsed;
|
|
236
|
+
try {
|
|
237
|
+
parsed = JSON.parse(line);
|
|
238
|
+
}
|
|
239
|
+
catch (error) {
|
|
240
|
+
throw new Error('Browser daemon returned invalid JSON: '
|
|
241
|
+
+ error.message);
|
|
242
|
+
}
|
|
243
|
+
const response = parse_daemon_response(parsed);
|
|
244
|
+
if (response.id != normalized_request.id) {
|
|
245
|
+
throw new Error(`Browser daemon response id mismatch: expected "${normalized_request.id}", got "${response.id}".`);
|
|
246
|
+
}
|
|
247
|
+
return response;
|
|
248
|
+
}
|
|
249
|
+
finally {
|
|
250
|
+
socket.destroy();
|
|
251
|
+
}
|
|
252
|
+
};
|
|
253
|
+
exports.send_command = send_command;
|
|
254
|
+
//# sourceMappingURL=ipc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ipc.js","sourceRoot":"","sources":["../../src/browser/ipc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { spawn } from 'child_process';
|
|
2
|
+
import type { Daemon_request, Daemon_response, Daemon_transport, Ipc_opts } from './ipc';
|
|
3
|
+
declare const DEFAULT_DAEMON_STARTUP_TIMEOUT_MS = 15000;
|
|
4
|
+
declare const DEFAULT_LIVENESS_TIMEOUT_MS = 150;
|
|
5
|
+
type Daemon_opts = Ipc_opts & {
|
|
6
|
+
cdp_endpoint: string;
|
|
7
|
+
daemon_script?: string;
|
|
8
|
+
exec_path?: string;
|
|
9
|
+
idle_timeout_ms?: number;
|
|
10
|
+
startup_timeout_ms?: number;
|
|
11
|
+
};
|
|
12
|
+
type Lifecycle_deps = {
|
|
13
|
+
current_time?: () => number;
|
|
14
|
+
is_daemon_alive?: (session_name: string, opts?: Ipc_opts) => Promise<boolean>;
|
|
15
|
+
pause?: (ms: number) => Promise<void>;
|
|
16
|
+
resolve_daemon_script?: (opts: Daemon_opts) => string;
|
|
17
|
+
resolve_exec_path?: (opts: Daemon_opts) => string;
|
|
18
|
+
spawn_process?: typeof spawn;
|
|
19
|
+
wait_for_daemon?: (session_name: string, timeout_ms: number, opts?: Ipc_opts, deps?: Pick<Lifecycle_deps, 'current_time' | 'is_daemon_alive' | 'pause'>) => Promise<void>;
|
|
20
|
+
};
|
|
21
|
+
declare const format_transport: (transport: Daemon_transport) => string;
|
|
22
|
+
declare const cleanup_stale_files: (session_name: string, opts?: Ipc_opts) => void;
|
|
23
|
+
declare const is_daemon_alive: (session_name: string, opts?: Ipc_opts) => Promise<boolean>;
|
|
24
|
+
declare const wait_for_daemon: (session_name: string, timeout_ms?: number, opts?: Ipc_opts, deps?: Pick<Lifecycle_deps, "current_time" | "is_daemon_alive" | "pause">) => Promise<void>;
|
|
25
|
+
declare const resolve_daemon_script: (opts: Daemon_opts) => string;
|
|
26
|
+
declare const resolve_exec_path: (opts: Daemon_opts) => string;
|
|
27
|
+
declare const ensure_daemon: (session_name: string, opts: Daemon_opts, deps?: Lifecycle_deps) => Promise<void>;
|
|
28
|
+
declare const send_command: (session_name: string, request: Daemon_request, opts?: Ipc_opts) => Promise<Daemon_response>;
|
|
29
|
+
export { DEFAULT_DAEMON_STARTUP_TIMEOUT_MS, DEFAULT_LIVENESS_TIMEOUT_MS, cleanup_stale_files, ensure_daemon, format_transport, is_daemon_alive, resolve_daemon_script, resolve_exec_path, send_command, wait_for_daemon, };
|
|
30
|
+
export type { Daemon_opts, Lifecycle_deps };
|
|
31
|
+
//# sourceMappingURL=lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/browser/lifecycle.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,KAAK,EAAC,MAAM,eAAe,CAAC;AASpC,OAAO,KAAK,EACR,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,QAAQ,EACX,MAAM,OAAO,CAAC;AAEf,QAAA,MAAM,iCAAiC,QAAS,CAAC;AACjD,QAAA,MAAM,2BAA2B,MAAM,CAAC;AAGxC,KAAK,WAAW,GAAG,QAAQ,GAAG;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEF,KAAK,cAAc,GAAG;IAClB,YAAY,CAAC,EAAE,MAAI,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,QAAQ,KAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5E,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,qBAAqB,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAG,MAAM,CAAC;IACpD,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAG,MAAM,CAAC;IAChD,aAAa,CAAC,EAAE,OAAO,KAAK,CAAC;IAC7B,eAAe,CAAC,EAAE,CACd,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,QAAQ,EACf,IAAI,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,cAAc,GAAC,iBAAiB,GAAC,OAAO,CAAC,KACtE,OAAO,CAAC,IAAI,CAAC,CAAC;CACpB,CAAC;AAgDF,QAAA,MAAM,gBAAgB,GAAI,WAAW,gBAAgB,KAAG,MAIvD,CAAC;AAEF,QAAA,MAAM,mBAAmB,GAAI,cAAc,MAAM,EAAE,OAAM,QAAa,SAOrE,CAAC;AAEF,QAAA,MAAM,eAAe,GACjB,cAAc,MAAM,EACpB,OAAM,QAAa,KACpB,OAAO,CAAC,OAAO,CAWjB,CAAC;AAEF,QAAA,MAAM,eAAe,GACjB,cAAc,MAAM,EACpB,mBAA8C,EAC9C,OAAM,QAAa,EACnB,OAAM,IAAI,CAAC,cAAc,EAAE,cAAc,GAAC,iBAAiB,GAAC,OAAO,CAAM,KAC1E,OAAO,CAAC,IAAI,CAsBd,CAAC;AAEF,QAAA,MAAM,qBAAqB,GAAI,MAAM,WAAW,KAAG,MAclD,CAAC;AAEF,QAAA,MAAM,iBAAiB,GAAI,MAAM,WAAW,KAAG,MAS9C,CAAC;AA8BF,QAAA,MAAM,aAAa,GACf,cAAc,MAAM,EACpB,MAAM,WAAW,EACjB,OAAM,cAAmB,KAC1B,OAAO,CAAC,IAAI,CAwDd,CAAC;AAEF,QAAA,MAAM,YAAY,GACd,cAAc,MAAM,EACpB,SAAS,cAAc,EACvB,OAAM,QAAa,KACpB,OAAO,CAAC,eAAe,CAEzB,CAAC;AAEF,OAAO,EACH,iCAAiC,EACjC,2BAA2B,EAC3B,mBAAmB,EACnB,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,qBAAqB,EACrB,iBAAiB,EACjB,YAAY,EACZ,eAAe,GAClB,CAAC;AACF,YAAY,EAAC,WAAW,EAAE,cAAc,EAAC,CAAC"}
|
|
@@ -0,0 +1,202 @@
|
|
|
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
|
+
exports.wait_for_daemon = exports.send_command = exports.resolve_exec_path = exports.resolve_daemon_script = exports.is_daemon_alive = exports.format_transport = exports.ensure_daemon = exports.cleanup_stale_files = exports.DEFAULT_LIVENESS_TIMEOUT_MS = exports.DEFAULT_DAEMON_STARTUP_TIMEOUT_MS = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const child_process_1 = require("child_process");
|
|
10
|
+
const daemon_1 = require("./daemon");
|
|
11
|
+
const ipc_1 = require("./ipc");
|
|
12
|
+
const DEFAULT_DAEMON_STARTUP_TIMEOUT_MS = 15_000;
|
|
13
|
+
exports.DEFAULT_DAEMON_STARTUP_TIMEOUT_MS = DEFAULT_DAEMON_STARTUP_TIMEOUT_MS;
|
|
14
|
+
const DEFAULT_LIVENESS_TIMEOUT_MS = 150;
|
|
15
|
+
exports.DEFAULT_LIVENESS_TIMEOUT_MS = DEFAULT_LIVENESS_TIMEOUT_MS;
|
|
16
|
+
const DAEMON_POLL_INTERVAL_MS = 100;
|
|
17
|
+
const pause = async (ms) => {
|
|
18
|
+
await new Promise(resolve => setTimeout(resolve, ms));
|
|
19
|
+
};
|
|
20
|
+
const normalize_startup_timeout = (timeout_ms) => {
|
|
21
|
+
if (timeout_ms === undefined)
|
|
22
|
+
return DEFAULT_DAEMON_STARTUP_TIMEOUT_MS;
|
|
23
|
+
if (!Number.isFinite(timeout_ms) || timeout_ms < 0) {
|
|
24
|
+
throw new Error('Browser daemon startup timeout must be a non-negative number of '
|
|
25
|
+
+ 'milliseconds.');
|
|
26
|
+
}
|
|
27
|
+
return Math.floor(timeout_ms);
|
|
28
|
+
};
|
|
29
|
+
const ensure_transport_dir = (transport) => {
|
|
30
|
+
fs_1.default.mkdirSync(transport.base_dir, { recursive: true });
|
|
31
|
+
const write_probe = path_1.default.join(transport.base_dir, `.daemon-write-test-${process.pid}`);
|
|
32
|
+
try {
|
|
33
|
+
fs_1.default.writeFileSync(write_probe, '');
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
throw new Error(`Browser daemon directory "${transport.base_dir}" is not writable: `
|
|
37
|
+
+ `${error.message}`);
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
fs_1.default.rmSync(write_probe, { force: true });
|
|
41
|
+
}
|
|
42
|
+
if (transport.kind == 'unix' && transport.socket_path.length > 103) {
|
|
43
|
+
throw new Error(`Browser session "${path_1.default.basename(transport.socket_path, '.sock')}" `
|
|
44
|
+
+ `is too long for a Unix socket path `
|
|
45
|
+
+ `(${transport.socket_path.length} bytes). Use a shorter session `
|
|
46
|
+
+ 'name or daemon directory.');
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const format_transport = (transport) => {
|
|
50
|
+
if (transport.kind == 'unix')
|
|
51
|
+
return transport.socket_path;
|
|
52
|
+
return `${transport.host}:${transport.port}`;
|
|
53
|
+
};
|
|
54
|
+
exports.format_transport = format_transport;
|
|
55
|
+
const cleanup_stale_files = (session_name, opts = {}) => {
|
|
56
|
+
const transport = (0, ipc_1.get_daemon_transport)(session_name, opts);
|
|
57
|
+
fs_1.default.rmSync(transport.pid_path, { force: true });
|
|
58
|
+
if (transport.kind == 'unix')
|
|
59
|
+
fs_1.default.rmSync(transport.socket_path, { force: true });
|
|
60
|
+
else
|
|
61
|
+
fs_1.default.rmSync(transport.port_path, { force: true });
|
|
62
|
+
};
|
|
63
|
+
exports.cleanup_stale_files = cleanup_stale_files;
|
|
64
|
+
const is_daemon_alive = async (session_name, opts = {}) => {
|
|
65
|
+
try {
|
|
66
|
+
const socket = await (0, ipc_1.connect_socket)(session_name, {
|
|
67
|
+
...opts,
|
|
68
|
+
timeout_ms: opts.timeout_ms ?? DEFAULT_LIVENESS_TIMEOUT_MS,
|
|
69
|
+
});
|
|
70
|
+
socket.destroy();
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
catch (_error) {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
exports.is_daemon_alive = is_daemon_alive;
|
|
78
|
+
const wait_for_daemon = async (session_name, timeout_ms = DEFAULT_DAEMON_STARTUP_TIMEOUT_MS, opts = {}, deps = {}) => {
|
|
79
|
+
const startup_timeout_ms = normalize_startup_timeout(timeout_ms);
|
|
80
|
+
const now = deps.current_time ?? (() => Date.now());
|
|
81
|
+
const check_alive = deps.is_daemon_alive ?? is_daemon_alive;
|
|
82
|
+
const sleep = deps.pause ?? pause;
|
|
83
|
+
const deadline = now() + startup_timeout_ms;
|
|
84
|
+
while (true) {
|
|
85
|
+
if (await check_alive(session_name, opts))
|
|
86
|
+
return;
|
|
87
|
+
if (now() >= deadline)
|
|
88
|
+
break;
|
|
89
|
+
await sleep(Math.min(DAEMON_POLL_INTERVAL_MS, Math.max(0, deadline - now())));
|
|
90
|
+
}
|
|
91
|
+
const transport = opts.transport ?? (0, ipc_1.get_daemon_transport)(session_name, opts);
|
|
92
|
+
throw new Error(`Timed out waiting for browser daemon session `
|
|
93
|
+
+ `"${(0, ipc_1.normalize_session_name)(session_name)}" to start at `
|
|
94
|
+
+ `${format_transport(transport)}.`);
|
|
95
|
+
};
|
|
96
|
+
exports.wait_for_daemon = wait_for_daemon;
|
|
97
|
+
const resolve_daemon_script = (opts) => {
|
|
98
|
+
const override = opts.daemon_script?.trim();
|
|
99
|
+
if (override)
|
|
100
|
+
return override;
|
|
101
|
+
const compiled_entry = path_1.default.join(__dirname, '..', 'index.js');
|
|
102
|
+
if (fs_1.default.existsSync(compiled_entry))
|
|
103
|
+
return compiled_entry;
|
|
104
|
+
const fallback = process.argv[1]?.trim();
|
|
105
|
+
if (fallback)
|
|
106
|
+
return fallback;
|
|
107
|
+
throw new Error('Could not resolve the browser daemon entry script.');
|
|
108
|
+
};
|
|
109
|
+
exports.resolve_daemon_script = resolve_daemon_script;
|
|
110
|
+
const resolve_exec_path = (opts) => {
|
|
111
|
+
const resolved = opts.exec_path?.trim() || process.execPath;
|
|
112
|
+
if (!resolved) {
|
|
113
|
+
throw new Error('Could not resolve the Node.js executable for browser daemon spawn.');
|
|
114
|
+
}
|
|
115
|
+
return resolved;
|
|
116
|
+
};
|
|
117
|
+
exports.resolve_exec_path = resolve_exec_path;
|
|
118
|
+
const create_child_startup_guard = (child) => {
|
|
119
|
+
let cleanup = () => undefined;
|
|
120
|
+
const promise = new Promise((_, reject) => {
|
|
121
|
+
const on_error = (error) => {
|
|
122
|
+
cleanup();
|
|
123
|
+
reject(error);
|
|
124
|
+
};
|
|
125
|
+
const on_exit = (code, signal) => {
|
|
126
|
+
cleanup();
|
|
127
|
+
const suffix = code !== null
|
|
128
|
+
? ` with code ${code}`
|
|
129
|
+
: signal
|
|
130
|
+
? ` from signal ${signal}`
|
|
131
|
+
: '';
|
|
132
|
+
reject(new Error(`Browser daemon exited during startup${suffix}.`));
|
|
133
|
+
};
|
|
134
|
+
cleanup = () => {
|
|
135
|
+
child.off?.('error', on_error);
|
|
136
|
+
child.off?.('exit', on_exit);
|
|
137
|
+
};
|
|
138
|
+
child.once?.('error', on_error);
|
|
139
|
+
child.once?.('exit', on_exit);
|
|
140
|
+
});
|
|
141
|
+
return { cleanup, promise };
|
|
142
|
+
};
|
|
143
|
+
const ensure_daemon = async (session_name, opts, deps = {}) => {
|
|
144
|
+
const normalized_session_name = (0, ipc_1.normalize_session_name)(session_name);
|
|
145
|
+
const normalized_cdp_endpoint = opts.cdp_endpoint?.trim();
|
|
146
|
+
if (!normalized_cdp_endpoint)
|
|
147
|
+
throw new Error('Browser daemon CDP endpoint cannot be empty.');
|
|
148
|
+
const transport = opts.transport ?? (0, ipc_1.get_daemon_transport)(normalized_session_name, opts);
|
|
149
|
+
const check_alive = deps.is_daemon_alive ?? is_daemon_alive;
|
|
150
|
+
const await_daemon = deps.wait_for_daemon ?? wait_for_daemon;
|
|
151
|
+
if (await check_alive(normalized_session_name, { ...opts, transport }))
|
|
152
|
+
return;
|
|
153
|
+
cleanup_stale_files(normalized_session_name, { ...opts, transport });
|
|
154
|
+
ensure_transport_dir(transport);
|
|
155
|
+
const exec_path = (deps.resolve_exec_path ?? resolve_exec_path)(opts);
|
|
156
|
+
const daemon_script = (deps.resolve_daemon_script ?? resolve_daemon_script)(opts);
|
|
157
|
+
const spawn_process = deps.spawn_process ?? child_process_1.spawn;
|
|
158
|
+
const startup_timeout_ms = normalize_startup_timeout(opts.startup_timeout_ms);
|
|
159
|
+
const base_env = opts.env ?? process.env;
|
|
160
|
+
const child = spawn_process(exec_path, [daemon_script, '--daemon'], {
|
|
161
|
+
detached: true,
|
|
162
|
+
env: {
|
|
163
|
+
...base_env,
|
|
164
|
+
BRIGHTDATA_CDP_ENDPOINT: normalized_cdp_endpoint,
|
|
165
|
+
BRIGHTDATA_DAEMON: '1',
|
|
166
|
+
BRIGHTDATA_DAEMON_DIR: opts.daemon_dir ?? base_env['BRIGHTDATA_DAEMON_DIR'],
|
|
167
|
+
BRIGHTDATA_IDLE_TIMEOUT_MS: String(opts.idle_timeout_ms ?? base_env['BRIGHTDATA_IDLE_TIMEOUT_MS']
|
|
168
|
+
?? daemon_1.DEFAULT_DAEMON_IDLE_TIMEOUT_MS),
|
|
169
|
+
BRIGHTDATA_SESSION: normalized_session_name,
|
|
170
|
+
},
|
|
171
|
+
stdio: 'ignore',
|
|
172
|
+
windowsHide: true,
|
|
173
|
+
});
|
|
174
|
+
child.unref?.();
|
|
175
|
+
const guard = create_child_startup_guard(child);
|
|
176
|
+
try {
|
|
177
|
+
await Promise.race([
|
|
178
|
+
await_daemon(normalized_session_name, startup_timeout_ms, {
|
|
179
|
+
...opts,
|
|
180
|
+
transport,
|
|
181
|
+
}, deps),
|
|
182
|
+
guard.promise,
|
|
183
|
+
]);
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
try {
|
|
187
|
+
child.kill();
|
|
188
|
+
}
|
|
189
|
+
catch (_kill_error) { }
|
|
190
|
+
cleanup_stale_files(normalized_session_name, { ...opts, transport });
|
|
191
|
+
throw error;
|
|
192
|
+
}
|
|
193
|
+
finally {
|
|
194
|
+
guard.cleanup();
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
exports.ensure_daemon = ensure_daemon;
|
|
198
|
+
const send_command = async (session_name, request, opts = {}) => {
|
|
199
|
+
return (0, ipc_1.send_command)(session_name, request, opts);
|
|
200
|
+
};
|
|
201
|
+
exports.send_command = send_command;
|
|
202
|
+
//# sourceMappingURL=lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/browser/lifecycle.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,iDAAoC;AAEpC,qCAAwD;AACxD,+BAKe;AAQf,MAAM,iCAAiC,GAAG,MAAM,CAAC;AAmQ7C,8EAAiC;AAlQrC,MAAM,2BAA2B,GAAG,GAAG,CAAC;AAmQpC,kEAA2B;AAlQ/B,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAyBpC,MAAM,KAAK,GAAG,KAAK,EAAC,EAAU,EAAC,EAAE;IAC7B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAA,EAAE,CAAA,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AACxD,CAAC,CAAC;AAEF,MAAM,yBAAyB,GAAG,CAAC,UAA4B,EAAS,EAAE;IACtE,IAAI,UAAU,KAAK,SAAS;QACxB,OAAO,iCAAiC,CAAC;IAC7C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,CAAC,EAClD,CAAC;QACG,MAAM,IAAI,KAAK,CACX,kEAAkE;cACjE,eAAe,CACnB,CAAC;IACN,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;AAClC,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,SAA2B,EAAC,EAAE;IACxD,YAAE,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC;IAEpD,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CACzB,SAAS,CAAC,QAAQ,EAClB,sBAAsB,OAAO,CAAC,GAAG,EAAE,CACtC,CAAC;IACF,IAAI,CAAC;QACD,YAAE,CAAC,aAAa,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACtC,CAAC;IAAC,OAAM,KAAK,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACX,6BAA6B,SAAS,CAAC,QAAQ,qBAAqB;cACnE,GAAI,KAAe,CAAC,OAAO,EAAE,CACjC,CAAC;IACN,CAAC;YAAS,CAAC;QACP,YAAE,CAAC,MAAM,CAAC,WAAW,EAAE,EAAC,KAAK,EAAE,IAAI,EAAC,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,SAAS,CAAC,IAAI,IAAI,MAAM,IAAI,SAAS,CAAC,WAAW,CAAC,MAAM,GAAG,GAAG,EAClE,CAAC;QACG,MAAM,IAAI,KAAK,CACX,oBAAoB,cAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI;cACpE,qCAAqC;cACrC,IAAI,SAAS,CAAC,WAAW,CAAC,MAAM,iCAAiC;cACjE,2BAA2B,CAC/B,CAAC;IACN,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,SAA2B,EAAS,EAAE;IAC5D,IAAI,SAAS,CAAC,IAAI,IAAI,MAAM;QACxB,OAAO,SAAS,CAAC,WAAW,CAAC;IACjC,OAAO,GAAG,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;AACjD,CAAC,CAAC;AA0LE,4CAAgB;AAxLpB,MAAM,mBAAmB,GAAG,CAAC,YAAoB,EAAE,OAAiB,EAAE,EAAC,EAAE;IACrE,MAAM,SAAS,GAAG,IAAA,0BAAoB,EAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IAC3D,YAAE,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAC,KAAK,EAAE,IAAI,EAAC,CAAC,CAAC;IAC7C,IAAI,SAAS,CAAC,IAAI,IAAI,MAAM;QACxB,YAAE,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,EAAC,KAAK,EAAE,IAAI,EAAC,CAAC,CAAC;;QAEhD,YAAE,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,EAAC,KAAK,EAAE,IAAI,EAAC,CAAC,CAAC;AACtD,CAAC,CAAC;AA+KE,kDAAmB;AA7KvB,MAAM,eAAe,GAAG,KAAK,EACzB,YAAoB,EACpB,OAAiB,EAAE,EACJ,EAAE;IACjB,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAA,oBAAc,EAAC,YAAY,EAAE;YAC9C,GAAG,IAAI;YACP,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,2BAA2B;SAC7D,CAAC,CAAC;QACH,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,OAAM,MAAM,EAAE,CAAC;QACb,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC,CAAC;AAkKE,0CAAe;AAhKnB,MAAM,eAAe,GAAG,KAAK,EACzB,YAAoB,EACpB,UAAU,GAAG,iCAAiC,EAC9C,OAAiB,EAAE,EACnB,OAAuE,EAAE,EAC7D,EAAE;IACd,MAAM,kBAAkB,GAAG,yBAAyB,CAAC,UAAU,CAAC,CAAC;IACjE,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,IAAI,CAAC,GAAE,EAAE,CAAA,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAClD,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,IAAI,eAAe,CAAC;IAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC;IAClC,MAAM,QAAQ,GAAG,GAAG,EAAE,GAAG,kBAAkB,CAAC;IAE5C,OAAO,IAAI,EACX,CAAC;QACG,IAAI,MAAM,WAAW,CAAC,YAAY,EAAE,IAAI,CAAC;YACrC,OAAO;QACX,IAAI,GAAG,EAAE,IAAI,QAAQ;YACjB,MAAM;QACV,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,uBAAuB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,IAAA,0BAAoB,EAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IAC7E,MAAM,IAAI,KAAK,CACX,+CAA+C;UAC9C,IAAI,IAAA,4BAAsB,EAAC,YAAY,CAAC,gBAAgB;UACxD,GAAG,gBAAgB,CAAC,SAAS,CAAC,GAAG,CACrC,CAAC;AACN,CAAC,CAAC;AAyIE,0CAAe;AAvInB,MAAM,qBAAqB,GAAG,CAAC,IAAiB,EAAS,EAAE;IACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC;IAC5C,IAAI,QAAQ;QACR,OAAO,QAAQ,CAAC;IAEpB,MAAM,cAAc,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IAC9D,IAAI,YAAE,CAAC,UAAU,CAAC,cAAc,CAAC;QAC7B,OAAO,cAAc,CAAC;IAE1B,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IACzC,IAAI,QAAQ;QACR,OAAO,QAAQ,CAAC;IAEpB,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;AAC1E,CAAC,CAAC;AAsHE,sDAAqB;AApHzB,MAAM,iBAAiB,GAAG,CAAC,IAAiB,EAAS,EAAE;IACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,OAAO,CAAC,QAAQ,CAAC;IAC5D,IAAI,CAAC,QAAQ,EACb,CAAC;QACG,MAAM,IAAI,KAAK,CACX,oEAAoE,CACvE,CAAC;IACN,CAAC;IACD,OAAO,QAAQ,CAAC;AACpB,CAAC,CAAC;AA4GE,8CAAiB;AA1GrB,MAAM,0BAA0B,GAAG,CAAC,KAAmB,EAAC,EAAE;IACtD,IAAI,OAAO,GAAG,GAAE,EAAE,CAAA,SAAS,CAAC;IAC5B,MAAM,OAAO,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAC,EAAE;QAC5C,MAAM,QAAQ,GAAG,CAAC,KAAY,EAAC,EAAE;YAC7B,OAAO,EAAE,CAAC;YACV,MAAM,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,CAAC,IAAiB,EAAE,MAA2B,EAAC,EAAE;YAC9D,OAAO,EAAE,CAAC;YACV,MAAM,MAAM,GAAG,IAAI,KAAK,IAAI;gBACxB,CAAC,CAAC,cAAc,IAAI,EAAE;gBACtB,CAAC,CAAC,MAAM;oBACJ,CAAC,CAAC,gBAAgB,MAAM,EAAE;oBAC1B,CAAC,CAAC,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,KAAK,CAAC,uCAAuC,MAAM,GAAG,CAAC,CAAC,CAAC;QACxE,CAAC,CAAC;QAEF,OAAO,GAAG,GAAE,EAAE;YACV,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAC/B,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACjC,CAAC,CAAC;QAEF,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAChC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IACH,OAAO,EAAC,OAAO,EAAE,OAAO,EAAC,CAAC;AAC9B,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,KAAK,EACvB,YAAoB,EACpB,IAAiB,EACjB,OAAuB,EAAE,EACb,EAAE;IACd,MAAM,uBAAuB,GAAG,IAAA,4BAAsB,EAAC,YAAY,CAAC,CAAC;IACrE,MAAM,uBAAuB,GAAG,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC;IAC1D,IAAI,CAAC,uBAAuB;QACxB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAEpE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,IAAA,0BAAoB,EAAC,uBAAuB,EAAE,IAAI,CAAC,CAAC;IACxF,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,IAAI,eAAe,CAAC;IAC5D,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,IAAI,eAAe,CAAC;IAC7D,IAAI,MAAM,WAAW,CAAC,uBAAuB,EAAE,EAAC,GAAG,IAAI,EAAE,SAAS,EAAC,CAAC;QAChE,OAAO;IAEX,mBAAmB,CAAC,uBAAuB,EAAE,EAAC,GAAG,IAAI,EAAE,SAAS,EAAC,CAAC,CAAC;IACnE,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAEhC,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,iBAAiB,IAAI,iBAAiB,CAAC,CAAC,IAAI,CAAC,CAAC;IACtE,MAAM,aAAa,GAAG,CAAC,IAAI,CAAC,qBAAqB,IAAI,qBAAqB,CAAC,CAAC,IAAI,CAAC,CAAC;IAClF,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,qBAAK,CAAC;IAClD,MAAM,kBAAkB,GAAG,yBAAyB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC9E,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACzC,MAAM,KAAK,GAAG,aAAa,CAAC,SAAS,EAAE,CAAC,aAAa,EAAE,UAAU,CAAC,EAAE;QAChE,QAAQ,EAAE,IAAI;QACd,GAAG,EAAE;YACD,GAAG,QAAQ;YACX,uBAAuB,EAAE,uBAAuB;YAChD,iBAAiB,EAAE,GAAG;YACtB,qBAAqB,EAAE,IAAI,CAAC,UAAU,IAAI,QAAQ,CAAC,uBAAuB,CAAC;YAC3E,0BAA0B,EAAE,MAAM,CAC9B,IAAI,CAAC,eAAe,IAAI,QAAQ,CAAC,4BAA4B,CAAC;mBACvD,uCAA8B,CACxC;YACD,kBAAkB,EAAE,uBAAuB;SAC9C;QACD,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,IAAI;KACpB,CAAC,CAAC;IACH,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;IAEhB,MAAM,KAAK,GAAG,0BAA0B,CAAC,KAAK,CAAC,CAAC;IAChD,IAAI,CAAC;QACD,MAAM,OAAO,CAAC,IAAI,CAAC;YACf,YAAY,CAAC,uBAAuB,EAAE,kBAAkB,EAAE;gBACtD,GAAG,IAAI;gBACP,SAAS;aACZ,EAAE,IAAI,CAAC;YACR,KAAK,CAAC,OAAO;SAChB,CAAC,CAAC;IACP,CAAC;IAAC,OAAM,KAAK,EAAE,CAAC;QACZ,IAAI,CAAC;YACD,KAAK,CAAC,IAAI,EAAE,CAAC;QACjB,CAAC;QAAC,OAAM,WAAW,EAAE,CAAC,CAAA,CAAC;QACvB,mBAAmB,CAAC,uBAAuB,EAAE,EAAC,GAAG,IAAI,EAAE,SAAS,EAAC,CAAC,CAAC;QACnE,MAAM,KAAK,CAAC;IAChB,CAAC;YAAS,CAAC;QACP,KAAK,CAAC,OAAO,EAAE,CAAC;IACpB,CAAC;AACL,CAAC,CAAC;AAcE,sCAAa;AAZjB,MAAM,YAAY,GAAG,KAAK,EACtB,YAAoB,EACpB,OAAuB,EACvB,OAAiB,EAAE,EACI,EAAE;IACzB,OAAO,IAAA,kBAAgB,EAAC,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AACzD,CAAC,CAAC;AAWE,oCAAY"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Page } from 'playwright-core';
|
|
2
|
+
declare const SCREENSHOT_MIME_TYPE = "image/png";
|
|
3
|
+
type Screenshot_capture_opts = {
|
|
4
|
+
base64?: boolean;
|
|
5
|
+
full_page?: boolean;
|
|
6
|
+
path?: string;
|
|
7
|
+
};
|
|
8
|
+
type Screenshot_capture_result = {
|
|
9
|
+
base64?: string;
|
|
10
|
+
full_page: boolean;
|
|
11
|
+
mime_type: string;
|
|
12
|
+
path: string;
|
|
13
|
+
};
|
|
14
|
+
declare const normalize_screenshot_path: (file_path: string | undefined) => string | undefined;
|
|
15
|
+
declare const create_temp_screenshot_path: () => string;
|
|
16
|
+
declare const take_screenshot: (page: Page, opts?: Screenshot_capture_opts) => Promise<Screenshot_capture_result>;
|
|
17
|
+
export { create_temp_screenshot_path, normalize_screenshot_path, SCREENSHOT_MIME_TYPE, take_screenshot, };
|
|
18
|
+
export type { Screenshot_capture_opts, Screenshot_capture_result, };
|
|
19
|
+
//# sourceMappingURL=screenshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screenshot.d.ts","sourceRoot":"","sources":["../../src/browser/screenshot.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,iBAAiB,CAAC;AAE1C,QAAA,MAAM,oBAAoB,cAAc,CAAC;AAIzC,KAAK,uBAAuB,GAAG;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,KAAK,yBAAyB,GAAG;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,QAAA,MAAM,yBAAyB,GAAI,WAAW,MAAM,GAAC,SAAS,KAAG,MAAM,GAAC,SAOvE,CAAC;AAEF,QAAA,MAAM,2BAA2B,QAAO,MAOvC,CAAC;AAEF,QAAA,MAAM,eAAe,GACjB,MAAM,IAAI,EACV,OAAM,uBAA4B,KACnC,OAAO,CAAC,yBAAyB,CAenC,CAAC;AAEF,OAAO,EACH,2BAA2B,EAC3B,yBAAyB,EACzB,oBAAoB,EACpB,eAAe,GAClB,CAAC;AACF,YAAY,EACR,uBAAuB,EACvB,yBAAyB,GAC5B,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
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
|
+
exports.take_screenshot = exports.SCREENSHOT_MIME_TYPE = exports.normalize_screenshot_path = exports.create_temp_screenshot_path = void 0;
|
|
7
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
8
|
+
const fs_1 = __importDefault(require("fs"));
|
|
9
|
+
const os_1 = __importDefault(require("os"));
|
|
10
|
+
const path_1 = __importDefault(require("path"));
|
|
11
|
+
const SCREENSHOT_MIME_TYPE = 'image/png';
|
|
12
|
+
exports.SCREENSHOT_MIME_TYPE = SCREENSHOT_MIME_TYPE;
|
|
13
|
+
const SCREENSHOT_TMP_DIR = 'brightdata-cli';
|
|
14
|
+
const SCREENSHOT_TMP_PREFIX = 'browser-screenshot-';
|
|
15
|
+
const normalize_screenshot_path = (file_path) => {
|
|
16
|
+
if (file_path === undefined)
|
|
17
|
+
return undefined;
|
|
18
|
+
const normalized = file_path.trim();
|
|
19
|
+
if (!normalized)
|
|
20
|
+
throw new Error('Screenshot path cannot be empty.');
|
|
21
|
+
return path_1.default.resolve(normalized);
|
|
22
|
+
};
|
|
23
|
+
exports.normalize_screenshot_path = normalize_screenshot_path;
|
|
24
|
+
const create_temp_screenshot_path = () => {
|
|
25
|
+
const token = crypto_1.default.randomBytes(6).toString('hex');
|
|
26
|
+
return path_1.default.join(os_1.default.tmpdir(), SCREENSHOT_TMP_DIR, `${SCREENSHOT_TMP_PREFIX}${Date.now()}-${token}.png`);
|
|
27
|
+
};
|
|
28
|
+
exports.create_temp_screenshot_path = create_temp_screenshot_path;
|
|
29
|
+
const take_screenshot = async (page, opts = {}) => {
|
|
30
|
+
const full_page = opts.full_page === true;
|
|
31
|
+
const output_path = normalize_screenshot_path(opts.path)
|
|
32
|
+
?? create_temp_screenshot_path();
|
|
33
|
+
const buffer = await page.screenshot({ fullPage: full_page });
|
|
34
|
+
fs_1.default.mkdirSync(path_1.default.dirname(output_path), { recursive: true });
|
|
35
|
+
fs_1.default.writeFileSync(output_path, buffer);
|
|
36
|
+
return {
|
|
37
|
+
base64: opts.base64 === true ? buffer.toString('base64') : undefined,
|
|
38
|
+
full_page,
|
|
39
|
+
mime_type: SCREENSHOT_MIME_TYPE,
|
|
40
|
+
path: output_path,
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
exports.take_screenshot = take_screenshot;
|
|
44
|
+
//# sourceMappingURL=screenshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screenshot.js","sourceRoot":"","sources":["../../src/browser/screenshot.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAC5B,4CAAoB;AACpB,4CAAoB;AACpB,gDAAwB;AAGxB,MAAM,oBAAoB,GAAG,WAAW,CAAC;AA0DrC,oDAAoB;AAzDxB,MAAM,kBAAkB,GAAG,gBAAgB,CAAC;AAC5C,MAAM,qBAAqB,GAAG,qBAAqB,CAAC;AAepD,MAAM,yBAAyB,GAAG,CAAC,SAA2B,EAAmB,EAAE;IAC/E,IAAI,SAAS,KAAK,SAAS;QACvB,OAAO,SAAS,CAAC;IACrB,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;IACpC,IAAI,CAAC,UAAU;QACX,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACxD,OAAO,cAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AACpC,CAAC,CAAC;AAiCE,8DAAyB;AA/B7B,MAAM,2BAA2B,GAAG,GAAU,EAAE;IAC5C,MAAM,KAAK,GAAG,gBAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpD,OAAO,cAAI,CAAC,IAAI,CACZ,YAAE,CAAC,MAAM,EAAE,EACX,kBAAkB,EAClB,GAAG,qBAAqB,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,KAAK,MAAM,CACvD,CAAC;AACN,CAAC,CAAC;AAuBE,kEAA2B;AArB/B,MAAM,eAAe,GAAG,KAAK,EACzB,IAAU,EACV,OAAgC,EAAE,EACD,EAAE;IACnC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC;IAC1C,MAAM,WAAW,GAAG,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC;WACjD,2BAA2B,EAAE,CAAC;IACrC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,EAAC,QAAQ,EAAE,SAAS,EAAC,CAAC,CAAC;IAE5D,YAAE,CAAC,SAAS,CAAC,cAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC;IAC3D,YAAE,CAAC,aAAa,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAEtC,OAAO;QACH,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;QACpE,SAAS;QACT,SAAS,EAAE,oBAAoB;QAC/B,IAAI,EAAE,WAAW;KACpB,CAAC;AACN,CAAC,CAAC;AAME,0CAAe"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { Page } from 'playwright-core';
|
|
2
|
+
declare const DOM_REF_ATTRIBUTE = "data-bd-ref";
|
|
3
|
+
declare const CONTENT_BOUNDARY_HEADER = "BRIGHTDATA_BROWSER_CONTENT";
|
|
4
|
+
declare const CONTENT_BOUNDARY_FOOTER = "END_BRIGHTDATA_BROWSER_CONTENT";
|
|
5
|
+
declare const wrap_content: (content: string, origin: string) => string;
|
|
6
|
+
type Snapshot_capture_opts = {
|
|
7
|
+
compact?: boolean;
|
|
8
|
+
depth?: number;
|
|
9
|
+
interactive?: boolean;
|
|
10
|
+
selector?: string;
|
|
11
|
+
wrap?: boolean;
|
|
12
|
+
};
|
|
13
|
+
type Snapshot_ref = {
|
|
14
|
+
ref: string;
|
|
15
|
+
selector: string;
|
|
16
|
+
};
|
|
17
|
+
type Snapshot_node = {
|
|
18
|
+
children: Snapshot_node[];
|
|
19
|
+
interactive?: boolean;
|
|
20
|
+
level?: number;
|
|
21
|
+
name?: string;
|
|
22
|
+
placeholder?: string;
|
|
23
|
+
ref?: string;
|
|
24
|
+
role: string;
|
|
25
|
+
value?: string;
|
|
26
|
+
};
|
|
27
|
+
type Snapshot_capture_result = {
|
|
28
|
+
compact: boolean;
|
|
29
|
+
depth?: number;
|
|
30
|
+
interactive: boolean;
|
|
31
|
+
refs: Snapshot_ref[];
|
|
32
|
+
selector?: string;
|
|
33
|
+
snapshot: string;
|
|
34
|
+
title: string;
|
|
35
|
+
url: string;
|
|
36
|
+
wrap: boolean;
|
|
37
|
+
};
|
|
38
|
+
type Snapshot_text_opts = {
|
|
39
|
+
empty_label?: string;
|
|
40
|
+
nodes: Snapshot_node[];
|
|
41
|
+
title: string;
|
|
42
|
+
url: string;
|
|
43
|
+
};
|
|
44
|
+
declare const format_snapshot_text: (opts: Snapshot_text_opts) => string;
|
|
45
|
+
declare const capture_snapshot: (page: Page, opts?: Snapshot_capture_opts) => Promise<Snapshot_capture_result>;
|
|
46
|
+
export { CONTENT_BOUNDARY_FOOTER, CONTENT_BOUNDARY_HEADER, DOM_REF_ATTRIBUTE, capture_snapshot, format_snapshot_text, wrap_content, };
|
|
47
|
+
export type { Snapshot_capture_opts, Snapshot_capture_result, Snapshot_node, Snapshot_ref, Snapshot_text_opts, };
|
|
48
|
+
//# sourceMappingURL=snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/browser/snapshot.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,iBAAiB,CAAC;AAE1C,QAAA,MAAM,iBAAiB,gBAAgB,CAAC;AAExC,QAAA,MAAM,uBAAuB,+BAA+B,CAAC;AAC7D,QAAA,MAAM,uBAAuB,mCAAmC,CAAC;AAEjE,QAAA,MAAM,YAAY,GAAI,SAAS,MAAM,EAAE,QAAQ,MAAM,KAAG,MAOvD,CAAC;AAEF,KAAK,qBAAqB,GAAG;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,KAAK,YAAY,GAAG;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,KAAK,aAAa,GAAG;IACjB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAOF,KAAK,uBAAuB,GAAG;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,OAAO,CAAC;CACjB,CAAC;AAQF,KAAK,kBAAkB,GAAG;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACf,CAAC;AA8IF,QAAA,MAAM,oBAAoB,GAAI,MAAM,kBAAkB,KAAG,MAUxD,CAAC;AA2BF,QAAA,MAAM,gBAAgB,GAClB,MAAM,IAAI,EACV,OAAM,qBAA0B,KACjC,OAAO,CAAC,uBAAuB,CAmZjC,CAAC;AAEF,OAAO,EACH,uBAAuB,EACvB,uBAAuB,EACvB,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,YAAY,GACf,CAAC;AACF,YAAY,EACR,qBAAqB,EACrB,uBAAuB,EACvB,aAAa,EACb,YAAY,EACZ,kBAAkB,GACrB,CAAC"}
|