@push.rocks/smartpuppeteer 2.0.7 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2468 @@
1
+ import { getEnvAwareBrowserInstance } from './smartpuppeteer.classes.smartpuppeteer.js';
2
+ import * as plugins from './smartpuppeteer.plugins.js';
3
+ const defaultViewport = {
4
+ width: 800,
5
+ height: 600,
6
+ deviceScaleFactor: 1,
7
+ };
8
+ const maxViewportWidth = 4096;
9
+ const maxViewportHeight = 4096;
10
+ const maxDeviceScaleFactor = 3;
11
+ const maxViewportPixelArea = 8294400;
12
+ const maxSelectorLength = 4096;
13
+ const maxTextLength = 32768;
14
+ const maxUrlLength = 16384;
15
+ const maxTimeoutMs = 60000;
16
+ const maxOutstandingFrames = 3;
17
+ const maxQueuedPublicOperations = 64;
18
+ const maxQueuedInternalOperations = 128;
19
+ const maxEvaluationScriptBytes = 262144;
20
+ const maxEvaluationOutputBytes = 1048576;
21
+ const maxEvaluationDepth = 32;
22
+ const maxEvaluationNodes = 50000;
23
+ const maxEvaluationStringBytes = 262144;
24
+ const maxEvaluationArrayLength = 10000;
25
+ const maxEvaluationObjectKeys = 10000;
26
+ const evaluationBootstrapKey = '__smartpuppeteerEvaluate';
27
+ const evaluationCancelKey = '__smartpuppeteerCancel';
28
+ const evaluationCleanupKey = '__smartpuppeteerCleanup';
29
+ const validateBoundedString = (value, name, minLength, maxLength) => {
30
+ if (typeof value !== 'string'
31
+ || value.length < minLength
32
+ || value.length > maxLength) {
33
+ throw new Error(`${name} must contain between ${minLength} and ${maxLength} characters`);
34
+ }
35
+ return value;
36
+ };
37
+ const validateFiniteNumber = (value, name, minimum, maximum) => {
38
+ if (typeof value !== 'number'
39
+ || !Number.isFinite(value)
40
+ || value < minimum
41
+ || value > maximum) {
42
+ throw new Error(`${name} must be a finite number between ${minimum} and ${maximum}`);
43
+ }
44
+ return value;
45
+ };
46
+ const validateInteger = (value, name, minimum, maximum) => {
47
+ const validatedValue = validateFiniteNumber(value, name, minimum, maximum);
48
+ if (!Number.isInteger(validatedValue)) {
49
+ throw new Error(`${name} must be an integer`);
50
+ }
51
+ return validatedValue;
52
+ };
53
+ const validateOptionalBoolean = (value, name) => {
54
+ if (value !== undefined && typeof value !== 'boolean') {
55
+ throw new Error(`${name} must be a boolean`);
56
+ }
57
+ };
58
+ const truncate = (value, maxLength) => {
59
+ if (value.length <= maxLength) {
60
+ return value;
61
+ }
62
+ return `${value.slice(0, Math.max(0, maxLength - 3))}...`;
63
+ };
64
+ const normalizeErrorMessage = (error) => {
65
+ if (error instanceof Error) {
66
+ return truncate(error.message, 2048);
67
+ }
68
+ return truncate(String(error), 2048);
69
+ };
70
+ const normalizeAbortReason = (signal) => {
71
+ return signal.reason ?? new Error('The browser operation was aborted');
72
+ };
73
+ const readUint32 = (data, offset) => {
74
+ return (data[offset] * 0x1000000
75
+ + data[offset + 1] * 0x10000
76
+ + data[offset + 2] * 0x100
77
+ + data[offset + 3]);
78
+ };
79
+ const readImageDimensions = (data, format, fallback) => {
80
+ if (format === 'png'
81
+ && data.length >= 24
82
+ && data[0] === 0x89
83
+ && data[1] === 0x50
84
+ && data[2] === 0x4e
85
+ && data[3] === 0x47) {
86
+ return {
87
+ width: readUint32(data, 16),
88
+ height: readUint32(data, 20),
89
+ };
90
+ }
91
+ if (format === 'jpeg' && data.length >= 4 && data[0] === 0xff && data[1] === 0xd8) {
92
+ let offset = 2;
93
+ while (offset + 8 < data.length) {
94
+ if (data[offset] !== 0xff) {
95
+ offset += 1;
96
+ continue;
97
+ }
98
+ const marker = data[offset + 1];
99
+ if (marker === 0xd8 || marker === 0xd9) {
100
+ offset += 2;
101
+ continue;
102
+ }
103
+ const segmentLength = (data[offset + 2] << 8) + data[offset + 3];
104
+ if (segmentLength < 2 || offset + segmentLength + 2 > data.length) {
105
+ break;
106
+ }
107
+ if (marker === 0xc0
108
+ || marker === 0xc1
109
+ || marker === 0xc2
110
+ || marker === 0xc3
111
+ || marker === 0xc5
112
+ || marker === 0xc6
113
+ || marker === 0xc7
114
+ || marker === 0xc9
115
+ || marker === 0xca
116
+ || marker === 0xcb
117
+ || marker === 0xcd
118
+ || marker === 0xce
119
+ || marker === 0xcf) {
120
+ return {
121
+ height: (data[offset + 5] << 8) + data[offset + 6],
122
+ width: (data[offset + 7] << 8) + data[offset + 8],
123
+ };
124
+ }
125
+ offset += segmentLength + 2;
126
+ }
127
+ }
128
+ return fallback;
129
+ };
130
+ const normalizeViewport = (viewport) => {
131
+ const normalizedViewport = {
132
+ width: validateInteger(viewport.width, 'viewport.width', 1, maxViewportWidth),
133
+ height: validateInteger(viewport.height, 'viewport.height', 1, maxViewportHeight),
134
+ deviceScaleFactor: validateFiniteNumber(viewport.deviceScaleFactor, 'viewport.deviceScaleFactor', 0.25, maxDeviceScaleFactor),
135
+ };
136
+ const physicalWidth = Math.ceil(normalizedViewport.width * normalizedViewport.deviceScaleFactor);
137
+ const physicalHeight = Math.ceil(normalizedViewport.height * normalizedViewport.deviceScaleFactor);
138
+ if (physicalWidth * physicalHeight > maxViewportPixelArea) {
139
+ throw new Error(`viewport pixel area must not exceed ${maxViewportPixelArea} physical pixels`);
140
+ }
141
+ return normalizedViewport;
142
+ };
143
+ const createPuppeteerViewport = (viewport) => ({
144
+ ...viewport,
145
+ isMobile: false,
146
+ isLandscape: false,
147
+ hasTouch: false,
148
+ });
149
+ export class LiveBrowserSession {
150
+ constructor(optionsArg = {}) {
151
+ this.eventListeners = new Set();
152
+ this.tabs = new Map();
153
+ this.tabIdsByPage = new WeakMap();
154
+ this.outstandingFrames = new Map();
155
+ this.operationQueue = [];
156
+ this.operationRunning = false;
157
+ this.admittedPublicOperations = 0;
158
+ this.admittedInternalOperations = 0;
159
+ this.status = 'stopped';
160
+ this.activeTabId = null;
161
+ this.viewport = { ...defaultViewport };
162
+ this.viewportRevision = 1;
163
+ this.tabSequence = 0;
164
+ this.frameSequence = 0;
165
+ this.evaluationSequence = 0;
166
+ this.normalStopRequested = false;
167
+ if (optionsArg.launchOptions?.protocol
168
+ && optionsArg.launchOptions.protocol !== 'cdp') {
169
+ throw new Error('LiveBrowserSession only supports Puppeteer CDP transport');
170
+ }
171
+ if (optionsArg.launchOptions?.browser
172
+ && optionsArg.launchOptions.browser !== 'chrome') {
173
+ throw new Error('LiveBrowserSession requires Chromium');
174
+ }
175
+ if (optionsArg.launchOptions && 'signal' in optionsArg.launchOptions) {
176
+ throw new Error('LiveBrowserSession owns launch cancellation; launchOptions.signal is unsupported');
177
+ }
178
+ validateOptionalBoolean(optionsArg.allowEvaluation, 'allowEvaluation');
179
+ for (const [name, value] of Object.entries(optionsArg.security ?? {})) {
180
+ validateOptionalBoolean(value, `security.${name}`);
181
+ }
182
+ const launchViewport = optionsArg.launchOptions?.defaultViewport;
183
+ const viewport = normalizeViewport(optionsArg.viewport
184
+ ?? (launchViewport
185
+ ? {
186
+ width: launchViewport.width,
187
+ height: launchViewport.height,
188
+ deviceScaleFactor: launchViewport.deviceScaleFactor ?? 1,
189
+ }
190
+ : defaultViewport));
191
+ this.options = {
192
+ ...optionsArg,
193
+ launchOptions: {
194
+ ...optionsArg.launchOptions,
195
+ args: [...(optionsArg.launchOptions?.args ?? [])],
196
+ defaultViewport: createPuppeteerViewport(viewport),
197
+ ...(optionsArg.security?.denyDownloads
198
+ ? { downloadBehavior: { policy: 'deny' } }
199
+ : {}),
200
+ },
201
+ viewport,
202
+ screencast: optionsArg.screencast ? { ...optionsArg.screencast } : undefined,
203
+ security: optionsArg.security ? { ...optionsArg.security } : undefined,
204
+ };
205
+ this.viewport = { ...viewport };
206
+ this.validateScreencastOptions();
207
+ }
208
+ onEvent(listener) {
209
+ if (typeof listener !== 'function') {
210
+ throw new Error('listener must be a function');
211
+ }
212
+ this.eventListeners.add(listener);
213
+ return () => {
214
+ this.eventListeners.delete(listener);
215
+ };
216
+ }
217
+ getState() {
218
+ return {
219
+ status: this.status,
220
+ activeTabId: this.activeTabId,
221
+ viewportRevision: this.viewportRevision,
222
+ viewport: { ...this.viewport },
223
+ tabs: [...this.tabs.values()].map((tab) => this.createTabState(tab)),
224
+ ...(this.lastError ? { lastError: { ...this.lastError } } : {}),
225
+ };
226
+ }
227
+ async start(operationOptions = {}) {
228
+ return this.enqueuePublicOperation(async (signal) => {
229
+ if (this.status === 'running' || this.status === 'starting') {
230
+ return;
231
+ }
232
+ this.normalStopRequested = false;
233
+ this.lastError = undefined;
234
+ this.viewportRevision = 1;
235
+ const browserLifetimeController = new AbortController();
236
+ this.browserLifetimeController = browserLifetimeController;
237
+ this.status = 'starting';
238
+ this.emitState();
239
+ try {
240
+ if (signal.aborted) {
241
+ throw signal.reason;
242
+ }
243
+ if (browserLifetimeController.signal.aborted) {
244
+ throw browserLifetimeController.signal.reason;
245
+ }
246
+ const abortBrowserLaunch = () => {
247
+ if (!browserLifetimeController.signal.aborted) {
248
+ browserLifetimeController.abort(normalizeAbortReason(signal));
249
+ }
250
+ };
251
+ signal.addEventListener('abort', abortBrowserLaunch, { once: true });
252
+ try {
253
+ this.browser = await getEnvAwareBrowserInstance({
254
+ forceNoSandbox: this.options.forceNoSandbox,
255
+ requireSandbox: this.options.requireSandbox,
256
+ usePipe: this.options.usePipe,
257
+ launchOptions: {
258
+ ...this.options.launchOptions,
259
+ protocol: 'cdp',
260
+ signal: browserLifetimeController.signal,
261
+ },
262
+ });
263
+ }
264
+ finally {
265
+ signal.removeEventListener('abort', abortBrowserLaunch);
266
+ }
267
+ if (signal.aborted) {
268
+ throw signal.reason;
269
+ }
270
+ this.browserContext = this.browser.defaultBrowserContext();
271
+ await this.configureBrowserSecurity(this.browser);
272
+ this.browserDisconnectedListener = () => {
273
+ if (this.normalStopRequested || this.status === 'stopped' || this.status === 'stopping') {
274
+ return;
275
+ }
276
+ const error = {
277
+ code: 'browser_disconnected',
278
+ message: 'The Chromium process disconnected',
279
+ fatal: true,
280
+ };
281
+ this.emitError(error);
282
+ void this.requestShutdown(error).catch((cleanupError) => {
283
+ this.emitError({
284
+ code: 'browser_disconnect_cleanup_failed',
285
+ message: normalizeErrorMessage(cleanupError),
286
+ fatal: true,
287
+ });
288
+ });
289
+ };
290
+ this.browser.on('disconnected', this.browserDisconnectedListener);
291
+ const initialPages = await this.browserContext.pages();
292
+ if (initialPages.length === 0) {
293
+ initialPages.push(await this.browserContext.newPage());
294
+ }
295
+ const initialPage = initialPages[0];
296
+ if (initialPage.url() !== 'about:blank') {
297
+ await initialPage.goto('about:blank');
298
+ }
299
+ for (const page of initialPages) {
300
+ await this.registerPage(page);
301
+ }
302
+ const firstTab = this.tabs.values().next().value;
303
+ if (!firstTab) {
304
+ throw new Error('Chromium did not provide an initial page');
305
+ }
306
+ this.activeTabId = firstTab.id;
307
+ await firstTab.page.bringToFront();
308
+ this.status = 'running';
309
+ this.emitState();
310
+ await this.startScreencast(firstTab);
311
+ if (signal.aborted) {
312
+ throw normalizeAbortReason(signal);
313
+ }
314
+ }
315
+ catch (error) {
316
+ if (signal.aborted || this.normalStopRequested) {
317
+ await this.stopInternal();
318
+ throw error;
319
+ }
320
+ const startError = {
321
+ code: 'start_failed',
322
+ message: normalizeErrorMessage(error),
323
+ fatal: true,
324
+ };
325
+ this.emitError(startError);
326
+ await this.stopInternal(startError);
327
+ throw error;
328
+ }
329
+ }, operationOptions);
330
+ }
331
+ async stop() {
332
+ this.normalStopRequested = true;
333
+ return this.requestShutdown();
334
+ }
335
+ async acknowledgeFrame(acknowledgement) {
336
+ if (!acknowledgement || typeof acknowledgement !== 'object') {
337
+ return { accepted: false };
338
+ }
339
+ const { tabId, sequence, generation, viewportRevision } = acknowledgement;
340
+ if (typeof tabId !== 'string'
341
+ || tabId.length < 1
342
+ || tabId.length > 128
343
+ || !Number.isInteger(sequence)
344
+ || sequence < 1
345
+ || !Number.isInteger(generation)
346
+ || generation < 0
347
+ || !Number.isInteger(viewportRevision)
348
+ || viewportRevision < 1) {
349
+ return { accepted: false };
350
+ }
351
+ const outstandingFrame = this.outstandingFrames.get(sequence);
352
+ if (!outstandingFrame) {
353
+ return { accepted: false };
354
+ }
355
+ if (outstandingFrame.tabId !== tabId
356
+ || outstandingFrame.generation !== generation
357
+ || outstandingFrame.viewportRevision !== viewportRevision) {
358
+ return { accepted: false };
359
+ }
360
+ const tab = this.tabs.get(outstandingFrame.tabId);
361
+ if (!tab
362
+ || this.activeTabId !== tab.id
363
+ || tab.generation !== outstandingFrame.generation
364
+ || this.viewportRevision !== outstandingFrame.viewportRevision
365
+ || tab.cdpSession !== outstandingFrame.cdpSession
366
+ || outstandingFrame.cdpSession.detached) {
367
+ this.outstandingFrames.delete(sequence);
368
+ await this.acknowledgeCdpFrame(outstandingFrame);
369
+ return { accepted: false };
370
+ }
371
+ this.outstandingFrames.delete(sequence);
372
+ return {
373
+ accepted: await this.acknowledgeCdpFrame(outstandingFrame),
374
+ };
375
+ }
376
+ async createTab(optionsArg = {}, operationOptions = {}) {
377
+ const url = optionsArg.url === undefined ? undefined : this.validateUrl(optionsArg.url);
378
+ const activate = optionsArg.activate ?? true;
379
+ validateOptionalBoolean(optionsArg.activate, 'activate');
380
+ const timeout = this.validateTimeout(optionsArg.timeoutMs, 30000);
381
+ const waitUntil = this.validateWaitUntil(optionsArg.waitUntil);
382
+ return this.enqueuePublicOperation(async (signal) => {
383
+ const context = this.requireBrowserContext();
384
+ const previousActiveTabId = this.activeTabId;
385
+ let page;
386
+ let tab;
387
+ try {
388
+ page = await context.newPage();
389
+ if (signal.aborted) {
390
+ throw signal.reason;
391
+ }
392
+ tab = await this.registerPage(page);
393
+ if (url !== undefined) {
394
+ await this.navigateTab(tab, async () => {
395
+ await tab.page.goto(url, { timeout, waitUntil, signal });
396
+ }, signal);
397
+ }
398
+ if (activate) {
399
+ await this.activateTabInternal(tab.id);
400
+ }
401
+ else {
402
+ const previousActiveTab = previousActiveTabId
403
+ ? this.tabs.get(previousActiveTabId)
404
+ : undefined;
405
+ if (previousActiveTab && !previousActiveTab.page.isClosed()) {
406
+ await previousActiveTab.page.bringToFront();
407
+ }
408
+ this.emitState();
409
+ }
410
+ return this.createTabState(tab);
411
+ }
412
+ catch (error) {
413
+ if (page) {
414
+ const rollbackError = await this.rollbackCreatedPage(page, tab, previousActiveTabId);
415
+ if (rollbackError) {
416
+ throw new AggregateError([error, rollbackError], 'Tab creation failed and its page could not be closed cleanly');
417
+ }
418
+ }
419
+ throw error;
420
+ }
421
+ }, operationOptions);
422
+ }
423
+ async activateTab(tabId, operationOptions = {}) {
424
+ return this.enqueuePublicOperation(async () => {
425
+ await this.activateTabInternal(tabId);
426
+ }, operationOptions);
427
+ }
428
+ async closeTab(tabId, operationOptions = {}) {
429
+ return this.enqueuePublicOperation(async () => {
430
+ const tab = this.requireTab(tabId);
431
+ const wasActive = this.activeTabId === tab.id;
432
+ if (wasActive) {
433
+ await this.stopScreencast(tab);
434
+ }
435
+ else {
436
+ await this.retireOutstandingFrames((frame) => frame.tabId === tab.id);
437
+ }
438
+ try {
439
+ if (!tab.page.isClosed()) {
440
+ await tab.page.close();
441
+ }
442
+ }
443
+ catch (error) {
444
+ if (wasActive
445
+ && this.status === 'running'
446
+ && this.activeTabId === tab.id
447
+ && tab.status === 'open') {
448
+ await this.startScreencast(tab);
449
+ }
450
+ this.emitState();
451
+ throw error;
452
+ }
453
+ tab.closing = true;
454
+ this.removePageListeners(tab);
455
+ this.tabs.delete(tab.id);
456
+ this.tabIdsByPage.delete(tab.page);
457
+ if (wasActive) {
458
+ this.activeTabId = null;
459
+ await this.activateReplacementTab();
460
+ }
461
+ else {
462
+ this.emitState();
463
+ }
464
+ }, operationOptions);
465
+ }
466
+ async navigate(optionsArg, operationOptions = {}) {
467
+ const url = this.validateUrl(optionsArg.url);
468
+ return this.enqueuePublicOperation(async (signal) => {
469
+ const tab = this.resolveNavigationTab(optionsArg.tabId);
470
+ await this.navigateTab(tab, async () => {
471
+ await tab.page.goto(url, this.createPuppeteerNavigationOptions(optionsArg, signal));
472
+ }, signal);
473
+ }, operationOptions);
474
+ }
475
+ async back(optionsArg = {}, operationOptions = {}) {
476
+ return this.enqueuePublicOperation(async (signal) => {
477
+ const tab = this.resolveNavigationTab(optionsArg.tabId);
478
+ await this.navigateTab(tab, async () => {
479
+ await tab.page.goBack(this.createPuppeteerNavigationOptions(optionsArg, signal));
480
+ }, signal);
481
+ }, operationOptions);
482
+ }
483
+ async forward(optionsArg = {}, operationOptions = {}) {
484
+ return this.enqueuePublicOperation(async (signal) => {
485
+ const tab = this.resolveNavigationTab(optionsArg.tabId);
486
+ await this.navigateTab(tab, async () => {
487
+ await tab.page.goForward(this.createPuppeteerNavigationOptions(optionsArg, signal));
488
+ }, signal);
489
+ }, operationOptions);
490
+ }
491
+ async reload(optionsArg = {}, operationOptions = {}) {
492
+ return this.enqueuePublicOperation(async (signal) => {
493
+ const tab = this.resolveNavigationTab(optionsArg.tabId);
494
+ await this.navigateTab(tab, async () => {
495
+ await tab.page.reload(this.createPuppeteerNavigationOptions(optionsArg, signal));
496
+ }, signal);
497
+ }, operationOptions);
498
+ }
499
+ async setViewport(viewportArg, operationOptions = {}) {
500
+ const viewport = normalizeViewport(viewportArg);
501
+ return this.enqueuePublicOperation(async (signal) => {
502
+ const tab = this.requireActiveTab();
503
+ await this.stopScreencast(tab);
504
+ try {
505
+ if (signal.aborted) {
506
+ throw signal.reason;
507
+ }
508
+ await tab.page.setViewport(createPuppeteerViewport(viewport));
509
+ this.viewport = { ...viewport };
510
+ this.viewportRevision += 1;
511
+ tab.appliedViewportRevision = this.viewportRevision;
512
+ this.emitState();
513
+ }
514
+ finally {
515
+ if (this.status === 'running' && this.activeTabId === tab.id && tab.status === 'open') {
516
+ await this.startScreencast(tab);
517
+ }
518
+ }
519
+ }, operationOptions);
520
+ }
521
+ async dispatchMouse(input) {
522
+ const { tab, cdpSession } = this.requireRawInputTarget(input);
523
+ this.validateCoordinates(input.x, input.y);
524
+ const type = input.type === 'move'
525
+ ? 'mouseMoved'
526
+ : input.type === 'down'
527
+ ? 'mousePressed'
528
+ : input.type === 'up'
529
+ ? 'mouseReleased'
530
+ : undefined;
531
+ if (!type) {
532
+ throw new Error('mouse input type must be move, down, or up');
533
+ }
534
+ const allowedButtons = ['none', 'left', 'middle', 'right', 'back', 'forward'];
535
+ const button = input.button ?? (type === 'mouseMoved' ? 'none' : 'left');
536
+ if (!allowedButtons.includes(button)) {
537
+ throw new Error('mouse button is invalid');
538
+ }
539
+ const buttons = input.buttons === undefined
540
+ ? undefined
541
+ : validateInteger(input.buttons, 'buttons', 0, 31);
542
+ const clickCount = input.clickCount === undefined
543
+ ? undefined
544
+ : validateInteger(input.clickCount, 'clickCount', 0, 3);
545
+ try {
546
+ await cdpSession.send('Input.dispatchMouseEvent', {
547
+ type,
548
+ x: input.x,
549
+ y: input.y,
550
+ button,
551
+ buttons,
552
+ clickCount,
553
+ modifiers: this.createModifierMask(input.modifiers),
554
+ pointerType: 'mouse',
555
+ });
556
+ }
557
+ catch (error) {
558
+ this.handlePossibleCdpDisconnection(tab, cdpSession, error);
559
+ throw error;
560
+ }
561
+ }
562
+ async dispatchWheel(input) {
563
+ const { tab, cdpSession } = this.requireRawInputTarget(input);
564
+ this.validateCoordinates(input.x, input.y);
565
+ validateFiniteNumber(input.deltaX, 'deltaX', -1000000, 1000000);
566
+ validateFiniteNumber(input.deltaY, 'deltaY', -1000000, 1000000);
567
+ try {
568
+ await cdpSession.send('Input.dispatchMouseEvent', {
569
+ type: 'mouseWheel',
570
+ x: input.x,
571
+ y: input.y,
572
+ deltaX: input.deltaX,
573
+ deltaY: input.deltaY,
574
+ modifiers: this.createModifierMask(input.modifiers),
575
+ pointerType: 'mouse',
576
+ });
577
+ }
578
+ catch (error) {
579
+ this.handlePossibleCdpDisconnection(tab, cdpSession, error);
580
+ throw error;
581
+ }
582
+ }
583
+ async dispatchKey(input) {
584
+ const { tab, cdpSession } = this.requireRawInputTarget(input);
585
+ const type = input.type === 'down'
586
+ ? 'keyDown'
587
+ : input.type === 'up'
588
+ ? 'keyUp'
589
+ : undefined;
590
+ if (!type) {
591
+ throw new Error('key input type must be down or up');
592
+ }
593
+ const key = validateBoundedString(input.key, 'key', 1, 64);
594
+ const code = input.code === undefined
595
+ ? undefined
596
+ : validateBoundedString(input.code, 'code', 1, 64);
597
+ const text = input.text === undefined
598
+ ? undefined
599
+ : validateBoundedString(input.text, 'text', 0, 1024);
600
+ const unmodifiedText = input.unmodifiedText === undefined
601
+ ? undefined
602
+ : validateBoundedString(input.unmodifiedText, 'unmodifiedText', 0, 1024);
603
+ const windowsVirtualKeyCode = input.windowsVirtualKeyCode === undefined
604
+ ? undefined
605
+ : validateInteger(input.windowsVirtualKeyCode, 'windowsVirtualKeyCode', 0, 65535);
606
+ const nativeVirtualKeyCode = input.nativeVirtualKeyCode === undefined
607
+ ? undefined
608
+ : validateInteger(input.nativeVirtualKeyCode, 'nativeVirtualKeyCode', 0, 65535);
609
+ const location = input.location === undefined
610
+ ? undefined
611
+ : validateInteger(input.location, 'location', 0, 3);
612
+ validateOptionalBoolean(input.autoRepeat, 'autoRepeat');
613
+ validateOptionalBoolean(input.isKeypad, 'isKeypad');
614
+ try {
615
+ await cdpSession.send('Input.dispatchKeyEvent', {
616
+ type,
617
+ key,
618
+ code,
619
+ text,
620
+ unmodifiedText,
621
+ windowsVirtualKeyCode,
622
+ nativeVirtualKeyCode,
623
+ autoRepeat: input.autoRepeat,
624
+ isKeypad: input.isKeypad,
625
+ location,
626
+ modifiers: this.createModifierMask(input.modifiers),
627
+ });
628
+ }
629
+ catch (error) {
630
+ this.handlePossibleCdpDisconnection(tab, cdpSession, error);
631
+ throw error;
632
+ }
633
+ }
634
+ async insertText(input) {
635
+ const { tab, cdpSession } = this.requireRawInputTarget(input);
636
+ const text = validateBoundedString(input.text, 'text', 0, maxTextLength);
637
+ try {
638
+ await cdpSession.send('Input.insertText', { text });
639
+ }
640
+ catch (error) {
641
+ this.handlePossibleCdpDisconnection(tab, cdpSession, error);
642
+ throw error;
643
+ }
644
+ }
645
+ async captureSnapshot(optionsArg = {}, operationOptions = {}) {
646
+ const format = optionsArg.format ?? 'jpeg';
647
+ if (format !== 'jpeg' && format !== 'png') {
648
+ throw new Error('snapshot format must be jpeg or png');
649
+ }
650
+ const quality = optionsArg.quality === undefined
651
+ ? undefined
652
+ : validateInteger(optionsArg.quality, 'quality', 0, 100);
653
+ if (format === 'png' && quality !== undefined) {
654
+ throw new Error('quality is only supported for jpeg snapshots');
655
+ }
656
+ if ('fullPage' in optionsArg) {
657
+ throw new Error('fullPage snapshots are not supported by LiveBrowserSession');
658
+ }
659
+ return this.enqueuePublicOperation(async (signal) => {
660
+ const tab = this.resolveActionTab(optionsArg.tabId);
661
+ await this.ensureTabViewport(tab);
662
+ const capturedTab = this.resolveActionTab(tab.id);
663
+ if (signal.aborted) {
664
+ throw signal.reason;
665
+ }
666
+ const viewport = { ...this.viewport };
667
+ const viewportRevision = this.viewportRevision;
668
+ const data = await capturedTab.page.screenshot({
669
+ type: format,
670
+ ...(format === 'jpeg' && quality !== undefined ? { quality } : {}),
671
+ });
672
+ if (signal.aborted) {
673
+ throw signal.reason;
674
+ }
675
+ const dimensions = readImageDimensions(data, format, {
676
+ width: Math.round(viewport.width * viewport.deviceScaleFactor),
677
+ height: Math.round(viewport.height * viewport.deviceScaleFactor),
678
+ });
679
+ return {
680
+ tabId: capturedTab.id,
681
+ viewportRevision,
682
+ viewport,
683
+ format,
684
+ mimeType: format === 'jpeg' ? 'image/jpeg' : 'image/png',
685
+ ...dimensions,
686
+ data,
687
+ };
688
+ }, operationOptions);
689
+ }
690
+ async observe(optionsArg = {}, operationOptions = {}) {
691
+ const maxCharacters = optionsArg.maxCharacters === undefined
692
+ ? 12000
693
+ : validateInteger(optionsArg.maxCharacters, 'maxCharacters', 256, 50000);
694
+ return this.enqueuePublicOperation(async (signal) => {
695
+ const tab = this.resolveActionTab(optionsArg.tabId);
696
+ await this.ensureTabViewport(tab);
697
+ const observedTab = this.resolveActionTab(tab.id);
698
+ if (signal.aborted) {
699
+ throw signal.reason;
700
+ }
701
+ await this.refreshTab(observedTab);
702
+ const accessibilitySnapshot = await observedTab.page.accessibility.snapshot({
703
+ interestingOnly: true,
704
+ });
705
+ if (signal.aborted) {
706
+ throw signal.reason;
707
+ }
708
+ const header = [
709
+ `Tab: ${observedTab.id}`,
710
+ `Status: ${observedTab.status}`,
711
+ `Title: ${observedTab.title}`,
712
+ `URL: ${observedTab.url}`,
713
+ 'Accessibility:',
714
+ ];
715
+ const lines = [...header];
716
+ let reachedTraversalLimit = false;
717
+ const appendNode = (node, depth) => {
718
+ if (lines.join('\n').length >= maxCharacters) {
719
+ reachedTraversalLimit = true;
720
+ return;
721
+ }
722
+ const details = [node.role];
723
+ if (node.name) {
724
+ details.push(`"${truncate(node.name, 512)}"`);
725
+ }
726
+ if (node.value !== undefined) {
727
+ details.push(`value="${truncate(String(node.value), 512)}"`);
728
+ }
729
+ for (const property of [
730
+ 'disabled',
731
+ 'expanded',
732
+ 'focused',
733
+ 'readonly',
734
+ 'required',
735
+ 'selected',
736
+ 'checked',
737
+ 'pressed',
738
+ ]) {
739
+ const value = node[property];
740
+ if (value !== undefined && value !== false) {
741
+ details.push(`${property}=${String(value)}`);
742
+ }
743
+ }
744
+ lines.push(`${' '.repeat(Math.min(depth, 20))}- ${details.join(' ')}`);
745
+ for (const child of node.children ?? []) {
746
+ appendNode(child, depth + 1);
747
+ if (reachedTraversalLimit) {
748
+ break;
749
+ }
750
+ }
751
+ };
752
+ if (accessibilitySnapshot) {
753
+ appendNode(accessibilitySnapshot, 0);
754
+ }
755
+ else {
756
+ lines.push('- No accessibility nodes');
757
+ }
758
+ const unboundedText = lines.join('\n');
759
+ const truncatedText = unboundedText.length > maxCharacters
760
+ ? unboundedText.slice(0, maxCharacters)
761
+ : unboundedText;
762
+ const state = this.getState();
763
+ return {
764
+ tabId: observedTab.id,
765
+ url: observedTab.url,
766
+ title: observedTab.title,
767
+ tab: this.createTabState(observedTab),
768
+ state,
769
+ text: truncatedText,
770
+ truncated: reachedTraversalLimit || unboundedText.length > maxCharacters,
771
+ };
772
+ }, operationOptions);
773
+ }
774
+ async evaluate(expressionArg, optionsArg = {}, operationOptions = {}) {
775
+ if (!this.options.allowEvaluation) {
776
+ throw new Error('LiveBrowserSession evaluation is disabled');
777
+ }
778
+ const expression = validateBoundedString(expressionArg, 'expression', 1, maxEvaluationScriptBytes);
779
+ const expressionBytes = new TextEncoder().encode(expression).byteLength;
780
+ if (expressionBytes > maxEvaluationScriptBytes) {
781
+ throw new Error(`expression must not exceed ${maxEvaluationScriptBytes} UTF-8 bytes`);
782
+ }
783
+ const evaluationOptions = this.normalizeEvaluationOptions(optionsArg);
784
+ const evaluationId = ++this.evaluationSequence;
785
+ const cancellationKey = `__smartpuppeteerCancel${evaluationId}`;
786
+ const evaluationExpression = this.createEvaluationExpression(expression, evaluationOptions, cancellationKey);
787
+ return this.enqueuePublicOperation(async (signal) => {
788
+ const tab = this.resolveActionTab(optionsArg.tabId);
789
+ const cdpSession = await tab.page.createCDPSession();
790
+ let executionContextId;
791
+ let cancellationPromise;
792
+ let terminationPromise;
793
+ let timeoutHandle;
794
+ let evaluationTimedOut = false;
795
+ const terminateEvaluation = () => {
796
+ terminationPromise ??= cdpSession.send('Runtime.terminateExecution').then(() => undefined);
797
+ };
798
+ const cancelEvaluation = () => {
799
+ if (executionContextId === undefined) {
800
+ return;
801
+ }
802
+ cancellationPromise ??= cdpSession.send('Runtime.evaluate', {
803
+ expression: `globalThis[${JSON.stringify(evaluationCancelKey)}]?.(${JSON.stringify(cancellationKey)})`,
804
+ contextId: executionContextId,
805
+ returnByValue: true,
806
+ awaitPromise: false,
807
+ includeCommandLineAPI: false,
808
+ userGesture: false,
809
+ disableBreaks: true,
810
+ }).then(() => undefined);
811
+ };
812
+ signal.addEventListener('abort', cancelEvaluation, { once: true });
813
+ let evaluationError;
814
+ let evaluationFailed = false;
815
+ try {
816
+ if (signal.aborted) {
817
+ throw normalizeAbortReason(signal);
818
+ }
819
+ executionContextId = tab.evaluationExecutionContextId;
820
+ if (executionContextId === undefined) {
821
+ const frameTreeResponse = await cdpSession.send('Page.getFrameTree');
822
+ if (signal.aborted) {
823
+ throw normalizeAbortReason(signal);
824
+ }
825
+ const isolatedWorld = await cdpSession.send('Page.createIsolatedWorld', {
826
+ frameId: frameTreeResponse.frameTree.frame.id,
827
+ worldName: 'smartpuppeteer-evaluation',
828
+ grantUniveralAccess: false,
829
+ });
830
+ executionContextId = isolatedWorld.executionContextId;
831
+ tab.evaluationExecutionContextId = executionContextId;
832
+ }
833
+ if (signal.aborted) {
834
+ throw normalizeAbortReason(signal);
835
+ }
836
+ const bootstrapResponse = await cdpSession.send('Runtime.evaluate', {
837
+ expression: this.createEvaluationBootstrapExpression(),
838
+ contextId: executionContextId,
839
+ returnByValue: true,
840
+ awaitPromise: true,
841
+ includeCommandLineAPI: false,
842
+ userGesture: false,
843
+ disableBreaks: true,
844
+ });
845
+ if (bootstrapResponse.exceptionDetails) {
846
+ throw new Error(this.readCdpExceptionMessage(bootstrapResponse.exceptionDetails));
847
+ }
848
+ if (signal.aborted) {
849
+ throw normalizeAbortReason(signal);
850
+ }
851
+ timeoutHandle = setTimeout(() => {
852
+ evaluationTimedOut = true;
853
+ terminateEvaluation();
854
+ }, evaluationOptions.timeoutMs + 250);
855
+ const evaluationResponse = await cdpSession.send('Runtime.evaluate', {
856
+ expression: evaluationExpression,
857
+ contextId: executionContextId,
858
+ returnByValue: true,
859
+ awaitPromise: true,
860
+ timeout: evaluationOptions.timeoutMs + 250,
861
+ includeCommandLineAPI: false,
862
+ userGesture: false,
863
+ disableBreaks: true,
864
+ allowUnsafeEvalBlockedByCSP: true,
865
+ });
866
+ if (evaluationTimedOut) {
867
+ throw new Error(`Evaluation timed out after ${evaluationOptions.timeoutMs}ms`);
868
+ }
869
+ if (signal.aborted) {
870
+ throw normalizeAbortReason(signal);
871
+ }
872
+ if (evaluationResponse.exceptionDetails) {
873
+ throw new Error(this.readCdpExceptionMessage(evaluationResponse.exceptionDetails));
874
+ }
875
+ const envelope = evaluationResponse.result.value;
876
+ if (!envelope || typeof envelope !== 'object' || typeof envelope.ok !== 'boolean') {
877
+ throw new Error('Evaluation returned an invalid result envelope');
878
+ }
879
+ if (!envelope.ok) {
880
+ throw new Error(typeof envelope.error === 'string'
881
+ ? truncate(envelope.error, 2048)
882
+ : 'Evaluation failed');
883
+ }
884
+ if (typeof envelope.json !== 'string') {
885
+ throw new Error('Evaluation returned an invalid JSON result');
886
+ }
887
+ if (new TextEncoder().encode(envelope.json).byteLength > evaluationOptions.maxOutputBytes) {
888
+ throw new Error('Evaluation result exceeded maxOutputBytes during transfer');
889
+ }
890
+ return JSON.parse(envelope.json);
891
+ }
892
+ catch (error) {
893
+ evaluationError = error;
894
+ evaluationFailed = true;
895
+ throw error;
896
+ }
897
+ finally {
898
+ signal.removeEventListener('abort', cancelEvaluation);
899
+ if (timeoutHandle) {
900
+ clearTimeout(timeoutHandle);
901
+ }
902
+ const cleanupErrors = [];
903
+ if (cancellationPromise) {
904
+ try {
905
+ await cancellationPromise;
906
+ }
907
+ catch (error) {
908
+ cleanupErrors.push(error);
909
+ }
910
+ }
911
+ if (terminationPromise) {
912
+ try {
913
+ await terminationPromise;
914
+ }
915
+ catch (error) {
916
+ cleanupErrors.push(error);
917
+ }
918
+ }
919
+ if (executionContextId !== undefined && !cdpSession.detached) {
920
+ try {
921
+ await cdpSession.send('Runtime.evaluate', {
922
+ expression: `globalThis[${JSON.stringify(evaluationCleanupKey)}]?.(${JSON.stringify(cancellationKey)})`,
923
+ contextId: executionContextId,
924
+ returnByValue: true,
925
+ awaitPromise: false,
926
+ includeCommandLineAPI: false,
927
+ userGesture: false,
928
+ disableBreaks: true,
929
+ });
930
+ }
931
+ catch {
932
+ // Navigation destroys the old execution context and its cancellation registry.
933
+ }
934
+ }
935
+ if (!cdpSession.detached) {
936
+ try {
937
+ await cdpSession.detach();
938
+ }
939
+ catch (error) {
940
+ cleanupErrors.push(error);
941
+ }
942
+ }
943
+ if (cleanupErrors.length > 0) {
944
+ throw new AggregateError(evaluationFailed ? [evaluationError, ...cleanupErrors] : cleanupErrors, 'Evaluation cleanup was incomplete');
945
+ }
946
+ }
947
+ }, operationOptions);
948
+ }
949
+ async click(optionsArg, operationOptions = {}) {
950
+ const selector = validateBoundedString(optionsArg.selector, 'selector', 1, maxSelectorLength);
951
+ const timeout = this.validateTimeout(optionsArg.timeoutMs);
952
+ const allowedButtons = ['left', 'middle', 'right'];
953
+ if (optionsArg.button !== undefined && !allowedButtons.includes(optionsArg.button)) {
954
+ throw new Error('click button is invalid');
955
+ }
956
+ const clickCount = optionsArg.clickCount === undefined
957
+ ? undefined
958
+ : validateInteger(optionsArg.clickCount, 'clickCount', 1, 3);
959
+ return this.enqueuePublicOperation(async (signal) => {
960
+ const tab = this.requireSemanticActionTarget(optionsArg);
961
+ await this.ensureTabViewport(tab);
962
+ const actionTab = this.requireSemanticActionTarget(optionsArg);
963
+ await actionTab.page.locator(selector).setTimeout(timeout).click({
964
+ button: optionsArg.button,
965
+ count: clickCount,
966
+ signal,
967
+ });
968
+ await this.refreshTab(actionTab);
969
+ this.emitState();
970
+ }, operationOptions);
971
+ }
972
+ async fill(optionsArg, operationOptions = {}) {
973
+ const selector = validateBoundedString(optionsArg.selector, 'selector', 1, maxSelectorLength);
974
+ const text = validateBoundedString(optionsArg.text, 'text', 0, maxTextLength);
975
+ const timeout = this.validateTimeout(optionsArg.timeoutMs);
976
+ return this.enqueuePublicOperation(async (signal) => {
977
+ const tab = this.requireSemanticActionTarget(optionsArg);
978
+ await this.ensureTabViewport(tab);
979
+ const actionTab = this.requireSemanticActionTarget(optionsArg);
980
+ await actionTab.page.locator(selector).setTimeout(timeout).fill(text, { signal });
981
+ await this.refreshTab(actionTab);
982
+ this.emitState();
983
+ }, operationOptions);
984
+ }
985
+ async press(optionsArg, operationOptions = {}) {
986
+ const selector = validateBoundedString(optionsArg.selector, 'selector', 1, maxSelectorLength);
987
+ const key = validateBoundedString(optionsArg.key, 'key', 1, 64);
988
+ const timeout = this.validateTimeout(optionsArg.timeoutMs);
989
+ return this.enqueuePublicOperation(async (signal) => {
990
+ const tab = this.requireSemanticActionTarget(optionsArg);
991
+ await this.ensureTabViewport(tab);
992
+ const actionTab = this.requireSemanticActionTarget(optionsArg);
993
+ const element = await actionTab.page.waitForSelector(selector, {
994
+ visible: true,
995
+ timeout,
996
+ signal,
997
+ });
998
+ if (!element) {
999
+ throw new Error(`No visible element matched selector: ${selector}`);
1000
+ }
1001
+ try {
1002
+ await element.press(key);
1003
+ }
1004
+ finally {
1005
+ await element.dispose();
1006
+ }
1007
+ await this.refreshTab(actionTab);
1008
+ this.emitState();
1009
+ }, operationOptions);
1010
+ }
1011
+ enqueuePublicOperation(operation, operationOptions = {}) {
1012
+ const callerSignal = operationOptions.signal;
1013
+ if (callerSignal !== undefined
1014
+ && (typeof callerSignal !== 'object'
1015
+ || typeof callerSignal.addEventListener !== 'function'
1016
+ || typeof callerSignal.removeEventListener !== 'function')) {
1017
+ return Promise.reject(new Error('operationOptions.signal must be an AbortSignal'));
1018
+ }
1019
+ if (callerSignal?.aborted) {
1020
+ return Promise.reject(normalizeAbortReason(callerSignal));
1021
+ }
1022
+ if (this.status === 'stopping'
1023
+ || this.normalStopRequested
1024
+ || (this.status === 'stopped' && this.operationRunning)) {
1025
+ return Promise.reject(new Error('LiveBrowserSession is stopping'));
1026
+ }
1027
+ if (this.admittedPublicOperations >= maxQueuedPublicOperations) {
1028
+ return Promise.reject(new Error('LiveBrowserSession operation queue is full'));
1029
+ }
1030
+ this.admittedPublicOperations += 1;
1031
+ return this.enqueueQueuedOperation('public', operation, false, callerSignal);
1032
+ }
1033
+ enqueueInternalOperation(operation, priority = false) {
1034
+ if (this.status === 'stopped' || this.status === 'stopping') {
1035
+ return Promise.reject(new Error('LiveBrowserSession is stopping'));
1036
+ }
1037
+ this.admittedInternalOperations += 1;
1038
+ return this.enqueueQueuedOperation('internal', operation, priority);
1039
+ }
1040
+ enqueueQueuedOperation(kind, operation, priority = false, callerSignal) {
1041
+ return new Promise((resolve, reject) => {
1042
+ const queuedOperation = {
1043
+ kind,
1044
+ state: 'queued',
1045
+ controller: new AbortController(),
1046
+ run: operation,
1047
+ resolve: (value) => resolve(value),
1048
+ reject,
1049
+ capacityReleased: false,
1050
+ };
1051
+ if (callerSignal) {
1052
+ const onCallerAbort = () => {
1053
+ const abortReason = normalizeAbortReason(callerSignal);
1054
+ if (queuedOperation.state === 'queued') {
1055
+ const operationIndex = this.operationQueue.indexOf(queuedOperation);
1056
+ if (operationIndex >= 0) {
1057
+ this.operationQueue.splice(operationIndex, 1);
1058
+ }
1059
+ queuedOperation.controller.abort(abortReason);
1060
+ queuedOperation.reject(abortReason);
1061
+ this.finalizeQueuedOperation(queuedOperation);
1062
+ this.drainOperationQueue();
1063
+ }
1064
+ else if (queuedOperation.state === 'active') {
1065
+ queuedOperation.controller.abort(abortReason);
1066
+ }
1067
+ };
1068
+ callerSignal.addEventListener('abort', onCallerAbort, { once: true });
1069
+ queuedOperation.removeCallerAbortListener = () => {
1070
+ callerSignal.removeEventListener('abort', onCallerAbort);
1071
+ };
1072
+ if (callerSignal.aborted) {
1073
+ onCallerAbort();
1074
+ }
1075
+ }
1076
+ if (queuedOperation.state !== 'queued') {
1077
+ return;
1078
+ }
1079
+ if (priority) {
1080
+ this.operationQueue.unshift(queuedOperation);
1081
+ }
1082
+ else {
1083
+ this.operationQueue.push(queuedOperation);
1084
+ }
1085
+ this.drainOperationQueue();
1086
+ });
1087
+ }
1088
+ drainOperationQueue() {
1089
+ if (this.operationRunning) {
1090
+ return;
1091
+ }
1092
+ const queuedOperation = this.operationQueue.shift();
1093
+ if (!queuedOperation) {
1094
+ return;
1095
+ }
1096
+ this.operationRunning = true;
1097
+ this.activeOperation = queuedOperation;
1098
+ queuedOperation.state = 'active';
1099
+ void this.executeQueuedOperation(queuedOperation).catch((error) => {
1100
+ this.operationRunning = false;
1101
+ this.activeOperation = undefined;
1102
+ this.emitError({
1103
+ code: 'operation_scheduler_failed',
1104
+ message: normalizeErrorMessage(error),
1105
+ fatal: true,
1106
+ });
1107
+ this.drainOperationQueue();
1108
+ });
1109
+ }
1110
+ async executeQueuedOperation(queuedOperation) {
1111
+ try {
1112
+ if (queuedOperation.controller.signal.aborted) {
1113
+ throw queuedOperation.controller.signal.reason;
1114
+ }
1115
+ const value = await queuedOperation.run(queuedOperation.controller.signal);
1116
+ if (queuedOperation.controller.signal.aborted) {
1117
+ throw queuedOperation.controller.signal.reason;
1118
+ }
1119
+ queuedOperation.resolve(value);
1120
+ }
1121
+ catch (error) {
1122
+ queuedOperation.reject(error);
1123
+ }
1124
+ finally {
1125
+ this.finalizeQueuedOperation(queuedOperation);
1126
+ if (this.activeOperation === queuedOperation) {
1127
+ this.activeOperation = undefined;
1128
+ }
1129
+ this.operationRunning = false;
1130
+ if (this.status === 'stopped'
1131
+ && !this.operationQueue.some((operation) => operation.kind === 'shutdown')) {
1132
+ this.normalStopRequested = false;
1133
+ }
1134
+ this.drainOperationQueue();
1135
+ }
1136
+ }
1137
+ finalizeQueuedOperation(queuedOperation) {
1138
+ if (queuedOperation.state === 'settled') {
1139
+ return;
1140
+ }
1141
+ queuedOperation.state = 'settled';
1142
+ queuedOperation.removeCallerAbortListener?.();
1143
+ queuedOperation.removeCallerAbortListener = undefined;
1144
+ if (queuedOperation.capacityReleased) {
1145
+ return;
1146
+ }
1147
+ queuedOperation.capacityReleased = true;
1148
+ if (queuedOperation.kind === 'public') {
1149
+ this.admittedPublicOperations -= 1;
1150
+ }
1151
+ else if (queuedOperation.kind === 'internal') {
1152
+ this.admittedInternalOperations -= 1;
1153
+ }
1154
+ }
1155
+ cancelQueuedOperations(error) {
1156
+ for (const queuedOperation of this.operationQueue.splice(0)) {
1157
+ queuedOperation.controller.abort(error);
1158
+ queuedOperation.reject(error);
1159
+ this.finalizeQueuedOperation(queuedOperation);
1160
+ }
1161
+ }
1162
+ beginShutdown(abortActiveOperation) {
1163
+ if (this.status !== 'stopped' && this.status !== 'stopping') {
1164
+ this.status = 'stopping';
1165
+ this.emitState();
1166
+ }
1167
+ const shutdownError = new Error('LiveBrowserSession is stopping');
1168
+ if (abortActiveOperation
1169
+ && this.activeOperation
1170
+ && this.activeOperation.kind !== 'shutdown') {
1171
+ this.activeOperation.controller.abort(shutdownError);
1172
+ }
1173
+ if (this.browserLifetimeController && !this.browserLifetimeController.signal.aborted) {
1174
+ this.browserLifetimeController.abort(shutdownError);
1175
+ }
1176
+ this.cancelQueuedOperations(shutdownError);
1177
+ }
1178
+ requestShutdown(error) {
1179
+ if (this.status === 'stopped') {
1180
+ return Promise.resolve();
1181
+ }
1182
+ if (this.shutdownPromise) {
1183
+ return this.shutdownPromise;
1184
+ }
1185
+ this.beginShutdown(true);
1186
+ const shutdownPromise = this.enqueueQueuedOperation('shutdown', async () => this.stopInternal(error), true);
1187
+ this.shutdownPromise = shutdownPromise;
1188
+ void shutdownPromise.then(() => {
1189
+ if (this.shutdownPromise === shutdownPromise) {
1190
+ this.shutdownPromise = undefined;
1191
+ }
1192
+ }, () => {
1193
+ if (this.shutdownPromise === shutdownPromise) {
1194
+ this.shutdownPromise = undefined;
1195
+ }
1196
+ });
1197
+ return shutdownPromise;
1198
+ }
1199
+ scheduleOperation(operation, errorCode, tabId, priority = false) {
1200
+ if (this.admittedInternalOperations >= maxQueuedInternalOperations) {
1201
+ const queueError = new Error('LiveBrowserSession internal operation queue is full');
1202
+ const liveBrowserError = {
1203
+ code: 'internal_operation_queue_full',
1204
+ message: queueError.message,
1205
+ fatal: priority,
1206
+ ...(tabId ? { tabId } : {}),
1207
+ };
1208
+ this.emitError(liveBrowserError);
1209
+ if (priority) {
1210
+ void this.requestShutdown(liveBrowserError).catch((error) => {
1211
+ this.emitError({
1212
+ code: 'queue_overflow_shutdown_failed',
1213
+ message: normalizeErrorMessage(error),
1214
+ fatal: true,
1215
+ });
1216
+ });
1217
+ }
1218
+ return false;
1219
+ }
1220
+ void this.enqueueInternalOperation(operation, priority).catch((error) => {
1221
+ if (this.status === 'stopped'
1222
+ || this.status === 'stopping'
1223
+ || this.normalStopRequested) {
1224
+ return;
1225
+ }
1226
+ this.emitError({
1227
+ code: errorCode,
1228
+ message: normalizeErrorMessage(error),
1229
+ fatal: false,
1230
+ ...(tabId ? { tabId } : {}),
1231
+ });
1232
+ });
1233
+ return true;
1234
+ }
1235
+ emitEvent(event) {
1236
+ for (const listener of [...this.eventListeners]) {
1237
+ try {
1238
+ listener(event);
1239
+ }
1240
+ catch {
1241
+ // A consumer listener must not interrupt browser lifecycle cleanup.
1242
+ }
1243
+ }
1244
+ }
1245
+ emitState() {
1246
+ this.emitEvent({
1247
+ type: 'state',
1248
+ state: this.getState(),
1249
+ });
1250
+ }
1251
+ emitError(error) {
1252
+ if (error.fatal) {
1253
+ this.lastError = { ...error };
1254
+ }
1255
+ this.emitEvent({
1256
+ type: 'error',
1257
+ error: { ...error },
1258
+ });
1259
+ this.emitState();
1260
+ }
1261
+ createTabState(tab) {
1262
+ return {
1263
+ id: tab.id,
1264
+ url: tab.url,
1265
+ title: tab.title,
1266
+ active: this.activeTabId === tab.id,
1267
+ status: tab.status,
1268
+ generation: tab.generation,
1269
+ appliedViewportRevision: tab.appliedViewportRevision,
1270
+ streaming: tab.streaming,
1271
+ };
1272
+ }
1273
+ async stopInternal(error) {
1274
+ if (this.status === 'stopped') {
1275
+ return;
1276
+ }
1277
+ this.status = 'stopping';
1278
+ if (error) {
1279
+ this.lastError = { ...error };
1280
+ }
1281
+ this.emitState();
1282
+ if (this.browserLifetimeController && !this.browserLifetimeController.signal.aborted) {
1283
+ this.browserLifetimeController.abort(new Error('LiveBrowserSession is stopping'));
1284
+ }
1285
+ const browser = this.browser;
1286
+ if (browser && this.browserDisconnectedListener) {
1287
+ browser.off('disconnected', this.browserDisconnectedListener);
1288
+ }
1289
+ this.browserDisconnectedListener = undefined;
1290
+ const shutdownErrors = [];
1291
+ for (const tab of [...this.tabs.values()]) {
1292
+ tab.closing = true;
1293
+ const securityCdpSession = tab.securityCdpSession;
1294
+ tab.securityCdpSession = undefined;
1295
+ if (securityCdpSession && !securityCdpSession.detached) {
1296
+ try {
1297
+ await securityCdpSession.detach();
1298
+ }
1299
+ catch {
1300
+ // Browser lifetime cancellation may close the target before explicit detach settles.
1301
+ }
1302
+ }
1303
+ try {
1304
+ await this.stopScreencast(tab);
1305
+ }
1306
+ catch (cleanupError) {
1307
+ shutdownErrors.push(cleanupError);
1308
+ }
1309
+ try {
1310
+ this.removePageListeners(tab);
1311
+ }
1312
+ catch (cleanupError) {
1313
+ shutdownErrors.push(cleanupError);
1314
+ }
1315
+ }
1316
+ try {
1317
+ await this.retireOutstandingFrames(() => true);
1318
+ }
1319
+ catch (cleanupError) {
1320
+ shutdownErrors.push(cleanupError);
1321
+ }
1322
+ if (browser) {
1323
+ try {
1324
+ await browser.close();
1325
+ }
1326
+ catch (closeError) {
1327
+ shutdownErrors.push(closeError);
1328
+ }
1329
+ }
1330
+ for (const tab of this.tabs.values()) {
1331
+ this.tabIdsByPage.delete(tab.page);
1332
+ }
1333
+ this.tabs.clear();
1334
+ this.outstandingFrames.clear();
1335
+ this.browser = undefined;
1336
+ this.browserContext = undefined;
1337
+ this.browserLifetimeController = undefined;
1338
+ this.activeTabId = null;
1339
+ this.status = 'stopped';
1340
+ this.emitState();
1341
+ if (shutdownErrors.length > 0 && !error) {
1342
+ throw new AggregateError(shutdownErrors, 'LiveBrowserSession shutdown was incomplete');
1343
+ }
1344
+ }
1345
+ async configureBrowserSecurity(browser) {
1346
+ if (!this.options.security?.denyPermissions) {
1347
+ return;
1348
+ }
1349
+ const cdpSession = await browser.target().createCDPSession();
1350
+ try {
1351
+ await cdpSession.send('Browser.grantPermissions', { permissions: [] });
1352
+ }
1353
+ finally {
1354
+ if (!cdpSession.detached) {
1355
+ await cdpSession.detach();
1356
+ }
1357
+ }
1358
+ }
1359
+ requireBrowserContext() {
1360
+ if (this.status !== 'running' || !this.browserContext) {
1361
+ throw new Error('LiveBrowserSession is not running');
1362
+ }
1363
+ return this.browserContext;
1364
+ }
1365
+ requireTab(tabId) {
1366
+ validateBoundedString(tabId, 'tabId', 1, 128);
1367
+ const tab = this.tabs.get(tabId);
1368
+ if (!tab) {
1369
+ throw new Error(`Unknown tab: ${tabId}`);
1370
+ }
1371
+ return tab;
1372
+ }
1373
+ requireActiveTab() {
1374
+ if (this.status !== 'running' || !this.activeTabId) {
1375
+ throw new Error('LiveBrowserSession has no active tab');
1376
+ }
1377
+ const tab = this.requireTab(this.activeTabId);
1378
+ if (tab.status !== 'open' || tab.page.isClosed()) {
1379
+ throw new Error(`Active tab is not available: ${tab.id}`);
1380
+ }
1381
+ return tab;
1382
+ }
1383
+ resolveActionTab(tabId) {
1384
+ if (this.status !== 'running') {
1385
+ throw new Error('LiveBrowserSession is not running');
1386
+ }
1387
+ const tab = tabId ? this.requireTab(tabId) : this.requireActiveTab();
1388
+ if (tab.status !== 'open' || tab.page.isClosed()) {
1389
+ throw new Error(`Tab is not available: ${tab.id}`);
1390
+ }
1391
+ return tab;
1392
+ }
1393
+ resolveNavigationTab(tabId) {
1394
+ return this.resolveActionTab(tabId);
1395
+ }
1396
+ async ensureTabViewport(tab) {
1397
+ if (tab.appliedViewportRevision === this.viewportRevision) {
1398
+ return;
1399
+ }
1400
+ const shouldRestartScreencast = this.activeTabId === tab.id && tab.streaming;
1401
+ if (shouldRestartScreencast) {
1402
+ await this.stopScreencast(tab);
1403
+ }
1404
+ try {
1405
+ await tab.page.setViewport(createPuppeteerViewport(this.viewport));
1406
+ tab.appliedViewportRevision = this.viewportRevision;
1407
+ }
1408
+ finally {
1409
+ if (shouldRestartScreencast
1410
+ && this.status === 'running'
1411
+ && this.activeTabId === tab.id
1412
+ && tab.status === 'open'
1413
+ && !tab.page.isClosed()) {
1414
+ await this.startScreencast(tab);
1415
+ }
1416
+ }
1417
+ }
1418
+ async registerPage(page) {
1419
+ const existingTabId = this.tabIdsByPage.get(page);
1420
+ if (existingTabId) {
1421
+ return this.requireTab(existingTabId);
1422
+ }
1423
+ if (page.isClosed()) {
1424
+ throw new Error('Cannot register a closed page');
1425
+ }
1426
+ const tab = {
1427
+ id: `tab-${++this.tabSequence}`,
1428
+ page,
1429
+ url: truncate(page.url(), 4096),
1430
+ title: '',
1431
+ status: 'open',
1432
+ generation: 0,
1433
+ appliedViewportRevision: 0,
1434
+ streaming: false,
1435
+ streamInvalidated: true,
1436
+ navigationInProgress: false,
1437
+ closing: false,
1438
+ stateUpdateQueued: false,
1439
+ stateUpdatePending: false,
1440
+ navigationResetPending: false,
1441
+ removeListeners: [],
1442
+ };
1443
+ this.tabs.set(tab.id, tab);
1444
+ this.tabIdsByPage.set(page, tab.id);
1445
+ try {
1446
+ if (this.options.security?.denyFileChoosers) {
1447
+ const securityCdpSession = await page.createCDPSession();
1448
+ tab.securityCdpSession = securityCdpSession;
1449
+ await securityCdpSession.send('Page.enable', {
1450
+ enableFileChooserOpenedEvent: true,
1451
+ });
1452
+ await securityCdpSession.send('Page.setInterceptFileChooserDialog', {
1453
+ enabled: true,
1454
+ cancel: true,
1455
+ });
1456
+ }
1457
+ await this.ensureTabViewport(tab);
1458
+ await this.refreshTab(tab);
1459
+ const onPopup = (popup) => {
1460
+ if (!popup
1461
+ || this.normalStopRequested
1462
+ || this.status === 'stopped'
1463
+ || this.status === 'stopping') {
1464
+ return;
1465
+ }
1466
+ const popupWasScheduled = this.scheduleOperation(async () => {
1467
+ if (popup.isClosed()) {
1468
+ return;
1469
+ }
1470
+ const previousActiveTabId = this.activeTabId;
1471
+ let popupTab;
1472
+ try {
1473
+ popupTab = await this.registerPage(popup);
1474
+ await this.activateTabInternal(popupTab.id);
1475
+ }
1476
+ catch (error) {
1477
+ const rollbackError = await this.rollbackCreatedPage(popup, popupTab, previousActiveTabId);
1478
+ if (rollbackError) {
1479
+ throw new AggregateError([error, rollbackError], 'Popup registration rollback failed');
1480
+ }
1481
+ throw error;
1482
+ }
1483
+ }, 'popup_registration_failed', tab.id);
1484
+ if (!popupWasScheduled) {
1485
+ const popupError = {
1486
+ code: 'popup_registration_capacity_exceeded',
1487
+ message: 'A popup could not be admitted to the internal operation queue',
1488
+ fatal: true,
1489
+ tabId: tab.id,
1490
+ };
1491
+ this.emitError(popupError);
1492
+ void this.requestShutdown(popupError).catch((shutdownError) => {
1493
+ this.emitError({
1494
+ code: 'untracked_popup_shutdown_failed',
1495
+ message: normalizeErrorMessage(shutdownError),
1496
+ fatal: true,
1497
+ tabId: tab.id,
1498
+ });
1499
+ });
1500
+ }
1501
+ };
1502
+ const onFrameNavigated = (frame) => {
1503
+ if (frame !== page.mainFrame() || tab.closing) {
1504
+ return;
1505
+ }
1506
+ tab.evaluationExecutionContextId = undefined;
1507
+ const navigationReset = !tab.navigationInProgress;
1508
+ if (navigationReset) {
1509
+ tab.streamInvalidated = true;
1510
+ this.retireFramesForTabInBackground(tab.id);
1511
+ }
1512
+ this.requestTabStateUpdate(tab, navigationReset);
1513
+ };
1514
+ const onLoad = () => {
1515
+ this.requestTabStateUpdate(tab, false);
1516
+ };
1517
+ const onClose = () => {
1518
+ tab.streamInvalidated = true;
1519
+ this.retireFramesForTabInBackground(tab.id);
1520
+ if (tab.closing || this.normalStopRequested) {
1521
+ return;
1522
+ }
1523
+ this.scheduleOperation(async () => {
1524
+ await this.handleUnexpectedPageClose(tab);
1525
+ }, 'page_close_cleanup_failed', tab.id, true);
1526
+ };
1527
+ const onCrash = (error) => {
1528
+ tab.streamInvalidated = true;
1529
+ this.retireFramesForTabInBackground(tab.id);
1530
+ if (tab.closing || this.normalStopRequested) {
1531
+ return;
1532
+ }
1533
+ this.scheduleOperation(async () => {
1534
+ if (!this.tabs.has(tab.id) || tab.status === 'crashed') {
1535
+ return;
1536
+ }
1537
+ await this.stopScreencast(tab);
1538
+ tab.status = 'crashed';
1539
+ const wasActive = this.activeTabId === tab.id;
1540
+ if (wasActive) {
1541
+ this.activeTabId = null;
1542
+ }
1543
+ this.emitError({
1544
+ code: 'page_crashed',
1545
+ message: normalizeErrorMessage(error),
1546
+ fatal: false,
1547
+ tabId: tab.id,
1548
+ });
1549
+ if (wasActive) {
1550
+ await this.activateReplacementTab();
1551
+ }
1552
+ }, 'page_crash_cleanup_failed', tab.id, true);
1553
+ };
1554
+ const onPageError = (error) => {
1555
+ if (tab.closing || this.normalStopRequested) {
1556
+ return;
1557
+ }
1558
+ this.emitError({
1559
+ code: 'page_error',
1560
+ message: normalizeErrorMessage(error),
1561
+ fatal: false,
1562
+ tabId: tab.id,
1563
+ });
1564
+ };
1565
+ page.on('popup', onPopup);
1566
+ page.on('framenavigated', onFrameNavigated);
1567
+ page.on('load', onLoad);
1568
+ page.on('close', onClose);
1569
+ page.on('error', onCrash);
1570
+ page.on('pageerror', onPageError);
1571
+ tab.removeListeners.push(() => page.off('popup', onPopup), () => page.off('framenavigated', onFrameNavigated), () => page.off('load', onLoad), () => page.off('close', onClose), () => page.off('error', onCrash), () => page.off('pageerror', onPageError));
1572
+ return tab;
1573
+ }
1574
+ catch (error) {
1575
+ if (tab.securityCdpSession && !tab.securityCdpSession.detached) {
1576
+ try {
1577
+ await tab.securityCdpSession.detach();
1578
+ }
1579
+ catch {
1580
+ // The page may have closed while security setup was failing.
1581
+ }
1582
+ }
1583
+ this.removePageListeners(tab);
1584
+ this.tabs.delete(tab.id);
1585
+ this.tabIdsByPage.delete(page);
1586
+ throw error;
1587
+ }
1588
+ }
1589
+ removePageListeners(tab) {
1590
+ for (const removeListener of tab.removeListeners.splice(0)) {
1591
+ removeListener();
1592
+ }
1593
+ }
1594
+ retireFramesForTabInBackground(tabId) {
1595
+ void this.retireOutstandingFrames((frame) => frame.tabId === tabId).catch((error) => {
1596
+ if (this.status === 'running' && !this.normalStopRequested) {
1597
+ this.emitError({
1598
+ code: 'frame_retirement_failed',
1599
+ message: normalizeErrorMessage(error),
1600
+ fatal: false,
1601
+ tabId,
1602
+ });
1603
+ }
1604
+ });
1605
+ }
1606
+ requestTabStateUpdate(tab, navigationReset) {
1607
+ if (!this.tabs.has(tab.id) || tab.closing) {
1608
+ return;
1609
+ }
1610
+ tab.stateUpdatePending = true;
1611
+ tab.navigationResetPending ||= navigationReset;
1612
+ if (tab.stateUpdateQueued) {
1613
+ return;
1614
+ }
1615
+ tab.stateUpdateQueued = true;
1616
+ const wasScheduled = this.scheduleOperation(async () => {
1617
+ try {
1618
+ const shouldResetNavigation = tab.navigationResetPending;
1619
+ tab.stateUpdatePending = false;
1620
+ tab.navigationResetPending = false;
1621
+ if (!this.tabs.has(tab.id) || tab.closing) {
1622
+ return;
1623
+ }
1624
+ if (shouldResetNavigation && this.activeTabId === tab.id) {
1625
+ await this.stopScreencast(tab);
1626
+ }
1627
+ await this.refreshTab(tab);
1628
+ this.emitState();
1629
+ if (shouldResetNavigation
1630
+ && this.activeTabId === tab.id
1631
+ && this.status === 'running'
1632
+ && tab.status === 'open') {
1633
+ await this.startScreencast(tab);
1634
+ }
1635
+ }
1636
+ finally {
1637
+ tab.stateUpdateQueued = false;
1638
+ if (tab.stateUpdatePending
1639
+ && this.tabs.has(tab.id)
1640
+ && this.status === 'running'
1641
+ && !tab.closing) {
1642
+ this.requestTabStateUpdate(tab, false);
1643
+ }
1644
+ }
1645
+ }, 'page_state_update_failed', tab.id);
1646
+ if (!wasScheduled) {
1647
+ tab.stateUpdateQueued = false;
1648
+ }
1649
+ }
1650
+ async rollbackCreatedPage(page, tab, previousActiveTabId) {
1651
+ const rollbackErrors = [];
1652
+ if (tab) {
1653
+ try {
1654
+ await this.stopScreencast(tab);
1655
+ }
1656
+ catch (error) {
1657
+ rollbackErrors.push(error);
1658
+ }
1659
+ tab.closing = true;
1660
+ }
1661
+ try {
1662
+ if (!page.isClosed()) {
1663
+ await page.close();
1664
+ }
1665
+ }
1666
+ catch (error) {
1667
+ rollbackErrors.push(error);
1668
+ }
1669
+ const pageClosed = page.isClosed();
1670
+ if (tab) {
1671
+ if (pageClosed) {
1672
+ this.removePageListeners(tab);
1673
+ this.tabs.delete(tab.id);
1674
+ this.tabIdsByPage.delete(tab.page);
1675
+ }
1676
+ else {
1677
+ tab.closing = false;
1678
+ try {
1679
+ await this.refreshTab(tab);
1680
+ }
1681
+ catch (error) {
1682
+ rollbackErrors.push(error);
1683
+ }
1684
+ }
1685
+ }
1686
+ else {
1687
+ this.tabIdsByPage.delete(page);
1688
+ if (!pageClosed) {
1689
+ const rollbackError = {
1690
+ code: 'untracked_page_rollback_failed',
1691
+ message: 'A failed page registration could not close its Chromium page',
1692
+ fatal: true,
1693
+ };
1694
+ if (!this.normalStopRequested && this.status === 'running') {
1695
+ this.emitError(rollbackError);
1696
+ }
1697
+ this.normalStopRequested = true;
1698
+ this.beginShutdown(false);
1699
+ try {
1700
+ await this.stopInternal();
1701
+ }
1702
+ catch (error) {
1703
+ rollbackErrors.push(error);
1704
+ }
1705
+ }
1706
+ }
1707
+ const previousActiveTab = previousActiveTabId
1708
+ ? this.tabs.get(previousActiveTabId)
1709
+ : undefined;
1710
+ this.activeTabId = previousActiveTab?.id ?? null;
1711
+ if (previousActiveTab
1712
+ && previousActiveTab.status === 'open'
1713
+ && !previousActiveTab.page.isClosed()) {
1714
+ try {
1715
+ await this.ensureTabViewport(previousActiveTab);
1716
+ await previousActiveTab.page.bringToFront();
1717
+ if (this.status === 'running' && !previousActiveTab.streaming) {
1718
+ await this.startScreencast(previousActiveTab);
1719
+ }
1720
+ }
1721
+ catch (error) {
1722
+ rollbackErrors.push(error);
1723
+ }
1724
+ }
1725
+ this.emitState();
1726
+ if (rollbackErrors.length === 0) {
1727
+ return undefined;
1728
+ }
1729
+ return new AggregateError(rollbackErrors, 'Failed to roll back a new tab');
1730
+ }
1731
+ async handleUnexpectedPageClose(tab) {
1732
+ if (!this.tabs.has(tab.id)) {
1733
+ return;
1734
+ }
1735
+ await this.stopScreencast(tab);
1736
+ this.removePageListeners(tab);
1737
+ this.tabs.delete(tab.id);
1738
+ this.tabIdsByPage.delete(tab.page);
1739
+ if (this.activeTabId === tab.id) {
1740
+ this.activeTabId = null;
1741
+ await this.activateReplacementTab();
1742
+ }
1743
+ else {
1744
+ this.emitState();
1745
+ }
1746
+ }
1747
+ async activateTabInternal(tabId) {
1748
+ const tab = this.requireTab(tabId);
1749
+ if (tab.status !== 'open' || tab.page.isClosed()) {
1750
+ throw new Error(`Tab is not available: ${tab.id}`);
1751
+ }
1752
+ if (this.activeTabId === tab.id && tab.streaming) {
1753
+ await tab.page.bringToFront();
1754
+ return;
1755
+ }
1756
+ const currentTab = this.activeTabId ? this.tabs.get(this.activeTabId) : undefined;
1757
+ if (currentTab) {
1758
+ await this.stopScreencast(currentTab);
1759
+ }
1760
+ try {
1761
+ await this.ensureTabViewport(tab);
1762
+ await tab.page.bringToFront();
1763
+ this.activeTabId = tab.id;
1764
+ this.emitState();
1765
+ if (this.status === 'running') {
1766
+ await this.startScreencast(tab);
1767
+ }
1768
+ }
1769
+ catch (error) {
1770
+ if (currentTab && this.tabs.has(currentTab.id) && !currentTab.page.isClosed()) {
1771
+ this.activeTabId = currentTab.id;
1772
+ await this.ensureTabViewport(currentTab);
1773
+ await currentTab.page.bringToFront();
1774
+ if (this.status === 'running' && !currentTab.streaming) {
1775
+ await this.startScreencast(currentTab);
1776
+ }
1777
+ }
1778
+ this.emitState();
1779
+ throw error;
1780
+ }
1781
+ }
1782
+ async activateReplacementTab() {
1783
+ const attemptedTabIds = new Set();
1784
+ while (true) {
1785
+ const replacementTab = [...this.tabs.values()].find((tab) => (!attemptedTabIds.has(tab.id)
1786
+ && tab.status === 'open'
1787
+ && !tab.page.isClosed()));
1788
+ if (!replacementTab) {
1789
+ this.activeTabId = null;
1790
+ this.normalStopRequested = true;
1791
+ this.beginShutdown(false);
1792
+ await this.stopInternal();
1793
+ return;
1794
+ }
1795
+ attemptedTabIds.add(replacementTab.id);
1796
+ try {
1797
+ await this.activateTabInternal(replacementTab.id);
1798
+ return;
1799
+ }
1800
+ catch (error) {
1801
+ this.activeTabId = null;
1802
+ this.emitError({
1803
+ code: 'replacement_tab_activation_failed',
1804
+ message: normalizeErrorMessage(error),
1805
+ fatal: false,
1806
+ tabId: replacementTab.id,
1807
+ });
1808
+ }
1809
+ }
1810
+ }
1811
+ async navigateTab(tab, navigation, signal) {
1812
+ const isActive = this.activeTabId === tab.id;
1813
+ tab.evaluationExecutionContextId = undefined;
1814
+ tab.navigationInProgress = true;
1815
+ if (isActive) {
1816
+ await this.stopScreencast(tab);
1817
+ }
1818
+ try {
1819
+ if (signal.aborted) {
1820
+ throw signal.reason;
1821
+ }
1822
+ await navigation();
1823
+ }
1824
+ finally {
1825
+ tab.navigationInProgress = false;
1826
+ if (this.tabs.has(tab.id) && !tab.page.isClosed()) {
1827
+ await this.refreshTab(tab);
1828
+ this.emitState();
1829
+ if (isActive
1830
+ && this.activeTabId === tab.id
1831
+ && this.status === 'running'
1832
+ && tab.status === 'open') {
1833
+ await this.startScreencast(tab);
1834
+ }
1835
+ }
1836
+ }
1837
+ }
1838
+ createPuppeteerNavigationOptions(options, signal) {
1839
+ return {
1840
+ timeout: this.validateTimeout(options.timeoutMs, 30000),
1841
+ waitUntil: this.validateWaitUntil(options.waitUntil),
1842
+ signal,
1843
+ };
1844
+ }
1845
+ async refreshTab(tab) {
1846
+ if (tab.page.isClosed()) {
1847
+ return;
1848
+ }
1849
+ tab.url = truncate(tab.page.url(), 4096);
1850
+ try {
1851
+ tab.title = truncate(await tab.page.title(), 1024);
1852
+ }
1853
+ catch (error) {
1854
+ if (!tab.page.isClosed() && !tab.closing) {
1855
+ throw error;
1856
+ }
1857
+ }
1858
+ }
1859
+ async startScreencast(tab) {
1860
+ if (this.status !== 'running'
1861
+ || this.activeTabId !== tab.id
1862
+ || tab.status !== 'open'
1863
+ || tab.page.isClosed()
1864
+ || tab.streaming) {
1865
+ return;
1866
+ }
1867
+ await this.ensureTabViewport(tab);
1868
+ const cdpSession = await tab.page.createCDPSession();
1869
+ const generation = tab.generation + 1;
1870
+ const frameListener = (event) => {
1871
+ this.handleScreencastFrame(tab, cdpSession, generation, event);
1872
+ };
1873
+ const cdpConnection = cdpSession.connection();
1874
+ const cdpSessionDetachedListener = (detachedSession) => {
1875
+ if (detachedSession !== cdpSession) {
1876
+ return;
1877
+ }
1878
+ this.handlePossibleCdpDisconnection(tab, cdpSession, new Error('The tab CDP session disconnected'));
1879
+ };
1880
+ tab.cdpSession = cdpSession;
1881
+ tab.cdpConnection = cdpConnection;
1882
+ tab.screencastFrameListener = frameListener;
1883
+ tab.cdpSessionDetachedListener = cdpSessionDetachedListener;
1884
+ tab.generation = generation;
1885
+ tab.streaming = true;
1886
+ tab.streamInvalidated = false;
1887
+ cdpSession.on('Page.screencastFrame', frameListener);
1888
+ cdpConnection?.on(plugins.puppeteer.CDPSessionEvent.SessionDetached, cdpSessionDetachedListener);
1889
+ const format = this.options.screencast?.format ?? 'jpeg';
1890
+ try {
1891
+ await cdpSession.send('Page.startScreencast', {
1892
+ format,
1893
+ quality: this.options.screencast?.quality ?? 80,
1894
+ maxWidth: this.options.screencast?.maxWidth,
1895
+ maxHeight: this.options.screencast?.maxHeight,
1896
+ everyNthFrame: this.options.screencast?.everyNthFrame ?? 1,
1897
+ });
1898
+ this.emitState();
1899
+ }
1900
+ catch (error) {
1901
+ tab.streaming = false;
1902
+ tab.streamInvalidated = true;
1903
+ tab.cdpSession = undefined;
1904
+ tab.cdpConnection = undefined;
1905
+ tab.screencastFrameListener = undefined;
1906
+ tab.cdpSessionDetachedListener = undefined;
1907
+ cdpSession.off('Page.screencastFrame', frameListener);
1908
+ cdpConnection?.off(plugins.puppeteer.CDPSessionEvent.SessionDetached, cdpSessionDetachedListener);
1909
+ if (!cdpSession.detached) {
1910
+ try {
1911
+ await cdpSession.detach();
1912
+ }
1913
+ catch {
1914
+ // The target may have closed while screencast startup was failing.
1915
+ }
1916
+ }
1917
+ throw error;
1918
+ }
1919
+ }
1920
+ async stopScreencast(tab) {
1921
+ const cdpSession = tab.cdpSession;
1922
+ const cdpConnection = tab.cdpConnection;
1923
+ const frameListener = tab.screencastFrameListener;
1924
+ const cdpSessionDetachedListener = tab.cdpSessionDetachedListener;
1925
+ tab.streaming = false;
1926
+ tab.streamInvalidated = true;
1927
+ tab.cdpSession = undefined;
1928
+ tab.cdpConnection = undefined;
1929
+ tab.screencastFrameListener = undefined;
1930
+ tab.cdpSessionDetachedListener = undefined;
1931
+ await this.retireOutstandingFrames((frame) => frame.tabId === tab.id);
1932
+ if (!cdpSession) {
1933
+ return;
1934
+ }
1935
+ if (!cdpSession.detached) {
1936
+ try {
1937
+ await cdpSession.send('Page.stopScreencast');
1938
+ }
1939
+ catch {
1940
+ // Page close and browser disconnect detach the target before cleanup runs.
1941
+ }
1942
+ }
1943
+ await this.retireOutstandingFrames((frame) => frame.tabId === tab.id);
1944
+ if (frameListener) {
1945
+ cdpSession.off('Page.screencastFrame', frameListener);
1946
+ }
1947
+ if (cdpConnection && cdpSessionDetachedListener) {
1948
+ cdpConnection.off(plugins.puppeteer.CDPSessionEvent.SessionDetached, cdpSessionDetachedListener);
1949
+ }
1950
+ if (!cdpSession.detached) {
1951
+ try {
1952
+ await cdpSession.detach();
1953
+ }
1954
+ catch {
1955
+ // A concurrent page close can detach the session first.
1956
+ }
1957
+ }
1958
+ }
1959
+ handleScreencastFrame(tab, cdpSession, generation, event) {
1960
+ if (this.status !== 'running'
1961
+ || this.activeTabId !== tab.id
1962
+ || tab.status !== 'open'
1963
+ || tab.streamInvalidated
1964
+ || !tab.streaming
1965
+ || tab.generation !== generation
1966
+ || tab.appliedViewportRevision !== this.viewportRevision
1967
+ || tab.cdpSession !== cdpSession) {
1968
+ this.acknowledgeCdpFrameInBackground({
1969
+ tabId: tab.id,
1970
+ generation,
1971
+ viewportRevision: this.viewportRevision,
1972
+ cdpSessionId: event.sessionId,
1973
+ cdpSession,
1974
+ });
1975
+ return;
1976
+ }
1977
+ const format = this.options.screencast?.format ?? 'jpeg';
1978
+ const data = new Uint8Array(plugins.Buffer.from(event.data, 'base64'));
1979
+ const dimensions = readImageDimensions(data, format, {
1980
+ width: Math.max(1, Math.round(event.metadata.deviceWidth)),
1981
+ height: Math.max(1, Math.round(event.metadata.deviceHeight)),
1982
+ });
1983
+ const sequence = ++this.frameSequence;
1984
+ const outstandingFrame = {
1985
+ tabId: tab.id,
1986
+ generation,
1987
+ viewportRevision: this.viewportRevision,
1988
+ cdpSessionId: event.sessionId,
1989
+ cdpSession,
1990
+ };
1991
+ while (this.outstandingFrames.size >= maxOutstandingFrames) {
1992
+ const oldestFrameEntry = this.outstandingFrames.entries().next().value;
1993
+ if (!oldestFrameEntry) {
1994
+ break;
1995
+ }
1996
+ this.outstandingFrames.delete(oldestFrameEntry[0]);
1997
+ this.acknowledgeCdpFrameInBackground(oldestFrameEntry[1]);
1998
+ }
1999
+ this.outstandingFrames.set(sequence, outstandingFrame);
2000
+ const frame = {
2001
+ tabId: tab.id,
2002
+ sequence,
2003
+ generation,
2004
+ viewportRevision: this.viewportRevision,
2005
+ viewport: { ...this.viewport },
2006
+ format,
2007
+ mimeType: format === 'jpeg' ? 'image/jpeg' : 'image/png',
2008
+ ...dimensions,
2009
+ metadata: {
2010
+ offsetTop: event.metadata.offsetTop,
2011
+ pageScaleFactor: event.metadata.pageScaleFactor,
2012
+ deviceWidth: event.metadata.deviceWidth,
2013
+ deviceHeight: event.metadata.deviceHeight,
2014
+ scrollOffsetX: event.metadata.scrollOffsetX,
2015
+ scrollOffsetY: event.metadata.scrollOffsetY,
2016
+ ...(event.metadata.timestamp !== undefined
2017
+ ? { timestamp: event.metadata.timestamp }
2018
+ : {}),
2019
+ },
2020
+ data,
2021
+ };
2022
+ this.emitEvent({ type: 'frame', frame });
2023
+ }
2024
+ async acknowledgeCdpFrame(frame) {
2025
+ if (frame.cdpSession.detached) {
2026
+ this.handleFrameAcknowledgementFailure(frame, new Error('CDP session detached before frame acknowledgement'));
2027
+ return false;
2028
+ }
2029
+ try {
2030
+ await frame.cdpSession.send('Page.screencastFrameAck', {
2031
+ sessionId: frame.cdpSessionId,
2032
+ });
2033
+ return true;
2034
+ }
2035
+ catch (error) {
2036
+ this.handleFrameAcknowledgementFailure(frame, error);
2037
+ return false;
2038
+ }
2039
+ }
2040
+ acknowledgeCdpFrameInBackground(frame) {
2041
+ void this.acknowledgeCdpFrame(frame);
2042
+ }
2043
+ handleFrameAcknowledgementFailure(frame, error) {
2044
+ const tab = this.tabs.get(frame.tabId);
2045
+ const isCurrentStream = Boolean(tab
2046
+ && tab.cdpSession === frame.cdpSession
2047
+ && !tab.streamInvalidated);
2048
+ if (isCurrentStream
2049
+ && this.status === 'running'
2050
+ && !this.normalStopRequested) {
2051
+ this.emitError({
2052
+ code: 'frame_acknowledgement_failed',
2053
+ message: normalizeErrorMessage(error),
2054
+ fatal: false,
2055
+ tabId: frame.tabId,
2056
+ });
2057
+ }
2058
+ if (tab) {
2059
+ this.handlePossibleCdpDisconnection(tab, frame.cdpSession, error);
2060
+ }
2061
+ }
2062
+ async retireOutstandingFrames(predicate) {
2063
+ const acknowledgements = [];
2064
+ for (const [sequence, frame] of this.outstandingFrames) {
2065
+ if (!predicate(frame)) {
2066
+ continue;
2067
+ }
2068
+ this.outstandingFrames.delete(sequence);
2069
+ acknowledgements.push(this.acknowledgeCdpFrame(frame));
2070
+ }
2071
+ await Promise.all(acknowledgements);
2072
+ }
2073
+ handlePossibleCdpDisconnection(tab, cdpSession, error) {
2074
+ if (this.normalStopRequested
2075
+ || this.status !== 'running'
2076
+ || tab.cdpSession !== cdpSession
2077
+ || tab.streamInvalidated
2078
+ || !cdpSession.detached) {
2079
+ return;
2080
+ }
2081
+ tab.streamInvalidated = true;
2082
+ this.retireFramesForTabInBackground(tab.id);
2083
+ this.scheduleOperation(async () => {
2084
+ if (!this.tabs.has(tab.id) || tab.cdpSession !== cdpSession) {
2085
+ return;
2086
+ }
2087
+ await this.stopScreencast(tab);
2088
+ tab.status = 'crashed';
2089
+ const wasActive = this.activeTabId === tab.id;
2090
+ if (wasActive) {
2091
+ this.activeTabId = null;
2092
+ }
2093
+ this.emitError({
2094
+ code: 'cdp_disconnected',
2095
+ message: normalizeErrorMessage(error),
2096
+ fatal: false,
2097
+ tabId: tab.id,
2098
+ });
2099
+ if (wasActive) {
2100
+ await this.activateReplacementTab();
2101
+ }
2102
+ }, 'cdp_disconnect_cleanup_failed', tab.id, true);
2103
+ }
2104
+ requireRawInputTarget(input) {
2105
+ const tab = this.requireInputTarget(input, true);
2106
+ const cdpSession = tab.cdpSession;
2107
+ if (!tab.streaming || tab.streamInvalidated || !cdpSession || cdpSession.detached) {
2108
+ throw new Error(`Tab input transport is not available: ${tab.id}`);
2109
+ }
2110
+ return { tab, cdpSession };
2111
+ }
2112
+ requireSemanticActionTarget(input) {
2113
+ return this.requireInputTarget(input, false);
2114
+ }
2115
+ requireInputTarget(input, requireActive) {
2116
+ if (this.status !== 'running') {
2117
+ throw new Error('LiveBrowserSession is not running');
2118
+ }
2119
+ const tab = this.requireTab(input.tabId);
2120
+ if (requireActive && this.activeTabId !== tab.id) {
2121
+ throw new Error(`Tab is not active: ${tab.id}`);
2122
+ }
2123
+ if (!Number.isInteger(input.generation) || input.generation !== tab.generation) {
2124
+ throw new Error(`Stale tab generation ${input.generation}; current generation is ${tab.generation}`);
2125
+ }
2126
+ if (input.viewportRevision !== this.viewportRevision) {
2127
+ throw new Error(`Stale viewport revision ${input.viewportRevision}; current revision is ${this.viewportRevision}`);
2128
+ }
2129
+ if (tab.status !== 'open' || tab.page.isClosed()) {
2130
+ throw new Error(`Tab is not available: ${tab.id}`);
2131
+ }
2132
+ return tab;
2133
+ }
2134
+ validateCoordinates(x, y) {
2135
+ validateFiniteNumber(x, 'x', 0, this.viewport.width);
2136
+ validateFiniteNumber(y, 'y', 0, this.viewport.height);
2137
+ if (x >= this.viewport.width) {
2138
+ throw new Error(`x must be less than viewport width ${this.viewport.width}`);
2139
+ }
2140
+ if (y >= this.viewport.height) {
2141
+ throw new Error(`y must be less than viewport height ${this.viewport.height}`);
2142
+ }
2143
+ }
2144
+ createModifierMask(modifiers) {
2145
+ if (modifiers === undefined) {
2146
+ return 0;
2147
+ }
2148
+ if (!modifiers || typeof modifiers !== 'object' || Array.isArray(modifiers)) {
2149
+ throw new Error('modifiers must be an object');
2150
+ }
2151
+ const allowedKeys = new Set(['alt', 'control', 'meta', 'shift']);
2152
+ for (const key of Object.keys(modifiers)) {
2153
+ if (!allowedKeys.has(key)) {
2154
+ throw new Error(`Unknown modifier: ${key}`);
2155
+ }
2156
+ }
2157
+ validateOptionalBoolean(modifiers.alt, 'modifiers.alt');
2158
+ validateOptionalBoolean(modifiers.control, 'modifiers.control');
2159
+ validateOptionalBoolean(modifiers.meta, 'modifiers.meta');
2160
+ validateOptionalBoolean(modifiers.shift, 'modifiers.shift');
2161
+ return ((modifiers.alt ? 1 : 0)
2162
+ | (modifiers.control ? 2 : 0)
2163
+ | (modifiers.meta ? 4 : 0)
2164
+ | (modifiers.shift ? 8 : 0));
2165
+ }
2166
+ validateUrl(url) {
2167
+ const validatedUrl = validateBoundedString(url, 'url', 1, maxUrlLength);
2168
+ let parsedUrl;
2169
+ try {
2170
+ parsedUrl = new URL(validatedUrl);
2171
+ }
2172
+ catch {
2173
+ throw new Error('url must be absolute');
2174
+ }
2175
+ if (this.options.security?.httpNavigationOnly
2176
+ && parsedUrl.protocol !== 'http:'
2177
+ && parsedUrl.protocol !== 'https:') {
2178
+ throw new Error('url protocol must be http or https');
2179
+ }
2180
+ return validatedUrl;
2181
+ }
2182
+ normalizeEvaluationOptions(options) {
2183
+ return {
2184
+ timeoutMs: options.timeoutMs === undefined
2185
+ ? 5000
2186
+ : validateInteger(options.timeoutMs, 'timeoutMs', 1, 30000),
2187
+ maxOutputBytes: options.maxOutputBytes === undefined
2188
+ ? 262144
2189
+ : validateInteger(options.maxOutputBytes, 'maxOutputBytes', 1, maxEvaluationOutputBytes),
2190
+ maxDepth: options.maxDepth === undefined
2191
+ ? 16
2192
+ : validateInteger(options.maxDepth, 'maxDepth', 1, maxEvaluationDepth),
2193
+ maxNodes: options.maxNodes === undefined
2194
+ ? 10000
2195
+ : validateInteger(options.maxNodes, 'maxNodes', 1, maxEvaluationNodes),
2196
+ maxStringBytes: options.maxStringBytes === undefined
2197
+ ? 65536
2198
+ : validateInteger(options.maxStringBytes, 'maxStringBytes', 0, maxEvaluationStringBytes),
2199
+ maxArrayLength: options.maxArrayLength === undefined
2200
+ ? 1000
2201
+ : validateInteger(options.maxArrayLength, 'maxArrayLength', 0, maxEvaluationArrayLength),
2202
+ maxObjectKeys: options.maxObjectKeys === undefined
2203
+ ? 1000
2204
+ : validateInteger(options.maxObjectKeys, 'maxObjectKeys', 0, maxEvaluationObjectKeys),
2205
+ };
2206
+ }
2207
+ readCdpExceptionMessage(exceptionDetails) {
2208
+ const description = exceptionDetails.exception?.description;
2209
+ if (typeof description === 'string' && description.length > 0) {
2210
+ return truncate(description, 2048);
2211
+ }
2212
+ return truncate(exceptionDetails.text, 2048);
2213
+ }
2214
+ createEvaluationBootstrapExpression() {
2215
+ const bootstrapKeyLiteral = JSON.stringify(evaluationBootstrapKey);
2216
+ const cancelKeyLiteral = JSON.stringify(evaluationCancelKey);
2217
+ const cleanupKeyLiteral = JSON.stringify(evaluationCleanupKey);
2218
+ return `(() => {
2219
+ 'use strict';
2220
+ if (typeof globalThis[${bootstrapKeyLiteral}] === 'function') {
2221
+ return true;
2222
+ }
2223
+ const safeGlobalThis = globalThis;
2224
+ const SafeArray = Array;
2225
+ const SafeError = Error;
2226
+ const SafeFunction = Function;
2227
+ const SafeJSON = JSON;
2228
+ const SafeMap = Map;
2229
+ const SafeNumber = Number;
2230
+ const SafeObject = Object;
2231
+ const SafePromise = Promise;
2232
+ const SafeString = String;
2233
+ const SafeTextEncoder = TextEncoder;
2234
+ const SafeWeakSet = WeakSet;
2235
+ const SafeClearTimeout = clearTimeout;
2236
+ const SafeSetTimeout = setTimeout;
2237
+ const safeCreate = SafeObject.create;
2238
+ const safeDefineProperty = SafeObject.defineProperty;
2239
+ const safeGetOwnPropertyDescriptor = SafeObject.getOwnPropertyDescriptor;
2240
+ const safeGetOwnPropertySymbols = SafeObject.getOwnPropertySymbols;
2241
+ const safeGetPrototypeOf = SafeObject.getPrototypeOf;
2242
+ const safeIsArray = SafeArray.isArray;
2243
+ const safeIsFinite = SafeNumber.isFinite;
2244
+ const safeKeys = SafeObject.keys;
2245
+ const safeSetPrototypeOf = SafeObject.setPrototypeOf;
2246
+ const safeStringify = SafeJSON.stringify;
2247
+ const safeMapDelete = SafeFunction.prototype.call.bind(SafeMap.prototype.delete);
2248
+ const safeMapGet = SafeFunction.prototype.call.bind(SafeMap.prototype.get);
2249
+ const safeMapSet = SafeFunction.prototype.call.bind(SafeMap.prototype.set);
2250
+ const safePromiseThen = SafeFunction.prototype.call.bind(SafePromise.prototype.then);
2251
+ const safeWeakSetAdd = SafeFunction.prototype.call.bind(SafeWeakSet.prototype.add);
2252
+ const safeWeakSetHas = SafeFunction.prototype.call.bind(SafeWeakSet.prototype.has);
2253
+ const safeEncode = SafeFunction.prototype.call.bind(SafeTextEncoder.prototype.encode);
2254
+ const encoder = new SafeTextEncoder();
2255
+ const cancellationHandlers = new SafeMap();
2256
+
2257
+ const createEnvelope = (ok, value) => {
2258
+ const envelope = safeCreate(null);
2259
+ envelope.ok = ok;
2260
+ if (ok) {
2261
+ envelope.json = value;
2262
+ } else {
2263
+ envelope.error = value;
2264
+ }
2265
+ return envelope;
2266
+ };
2267
+ const byteLength = (value) => safeEncode(encoder, value).byteLength;
2268
+ const cancelEvaluation = (cancellationKey) => {
2269
+ const handler = safeMapGet(cancellationHandlers, cancellationKey);
2270
+ if (typeof handler === 'function') {
2271
+ handler();
2272
+ }
2273
+ return safeMapDelete(cancellationHandlers, cancellationKey);
2274
+ };
2275
+ const evaluate = async (source, options, cancellationKey) => {
2276
+ const seen = new SafeWeakSet();
2277
+ let visitedNodes = 0;
2278
+ const normalize = (value, depth) => {
2279
+ visitedNodes += 1;
2280
+ if (visitedNodes > options.maxNodes) {
2281
+ throw new SafeError('Evaluation result exceeded maxNodes');
2282
+ }
2283
+ if (depth > options.maxDepth) {
2284
+ throw new SafeError('Evaluation result exceeded maxDepth');
2285
+ }
2286
+ if (value === null || typeof value === 'boolean') {
2287
+ return value;
2288
+ }
2289
+ if (typeof value === 'number') {
2290
+ if (!safeIsFinite(value)) {
2291
+ throw new SafeError('Evaluation result contains a non-finite number');
2292
+ }
2293
+ return value;
2294
+ }
2295
+ if (typeof value === 'string') {
2296
+ if (byteLength(value) > options.maxStringBytes) {
2297
+ throw new SafeError('Evaluation result string exceeded maxStringBytes');
2298
+ }
2299
+ return value;
2300
+ }
2301
+ if (typeof value !== 'object') {
2302
+ throw new SafeError('Evaluation result contains a non-JSON value');
2303
+ }
2304
+ if (safeWeakSetHas(seen, value)) {
2305
+ throw new SafeError('Evaluation result contains a cycle or repeated object');
2306
+ }
2307
+ safeWeakSetAdd(seen, value);
2308
+
2309
+ if (safeIsArray(value)) {
2310
+ if (value.length > options.maxArrayLength) {
2311
+ throw new SafeError('Evaluation result array exceeded maxArrayLength');
2312
+ }
2313
+ const keys = safeKeys(value);
2314
+ if (keys.length !== value.length) {
2315
+ throw new SafeError('Evaluation result contains a sparse or extended array');
2316
+ }
2317
+ const output = SafeArray(value.length);
2318
+ safeSetPrototypeOf(output, null);
2319
+ for (let index = 0; index < value.length; index += 1) {
2320
+ const descriptor = safeGetOwnPropertyDescriptor(value, SafeString(index));
2321
+ if (!descriptor || !('value' in descriptor)) {
2322
+ throw new SafeError('Evaluation result contains an array accessor');
2323
+ }
2324
+ output[index] = normalize(descriptor.value, depth + 1);
2325
+ }
2326
+ return output;
2327
+ }
2328
+
2329
+ const prototype = safeGetPrototypeOf(value);
2330
+ if (prototype !== SafeObject.prototype && prototype !== null) {
2331
+ throw new SafeError('Evaluation result contains a non-plain object');
2332
+ }
2333
+ if (safeGetOwnPropertySymbols(value).length > 0) {
2334
+ throw new SafeError('Evaluation result contains symbol properties');
2335
+ }
2336
+ const keys = safeKeys(value);
2337
+ if (keys.length > options.maxObjectKeys) {
2338
+ throw new SafeError('Evaluation result object exceeded maxObjectKeys');
2339
+ }
2340
+ const output = safeCreate(null);
2341
+ for (let index = 0; index < keys.length; index += 1) {
2342
+ const key = keys[index];
2343
+ if (byteLength(key) > options.maxStringBytes) {
2344
+ throw new SafeError('Evaluation result key exceeded maxStringBytes');
2345
+ }
2346
+ const descriptor = safeGetOwnPropertyDescriptor(value, key);
2347
+ if (!descriptor || !('value' in descriptor)) {
2348
+ throw new SafeError('Evaluation result contains an object accessor');
2349
+ }
2350
+ output[key] = normalize(descriptor.value, depth + 1);
2351
+ }
2352
+ return output;
2353
+ };
2354
+
2355
+ try {
2356
+ const execute = SafeFunction(
2357
+ '\"use strict\"; return (async () => (' + source + '\\n))();',
2358
+ );
2359
+ const boundedExecution = new SafePromise((resolve, reject) => {
2360
+ let timeout;
2361
+ safeMapSet(cancellationHandlers, cancellationKey, () => {
2362
+ if (timeout !== undefined) {
2363
+ SafeClearTimeout(timeout);
2364
+ }
2365
+ reject(new SafeError('Evaluation cancelled'));
2366
+ });
2367
+ timeout = SafeSetTimeout(() => {
2368
+ reject(new SafeError('Evaluation timed out after ' + options.timeoutMs + 'ms'));
2369
+ }, options.timeoutMs);
2370
+ safePromiseThen(
2371
+ execute(),
2372
+ (value) => {
2373
+ SafeClearTimeout(timeout);
2374
+ resolve(value);
2375
+ },
2376
+ (error) => {
2377
+ SafeClearTimeout(timeout);
2378
+ reject(error);
2379
+ },
2380
+ );
2381
+ });
2382
+ let normalizedResult;
2383
+ try {
2384
+ normalizedResult = normalize(await boundedExecution, 0);
2385
+ } finally {
2386
+ safeMapDelete(cancellationHandlers, cancellationKey);
2387
+ }
2388
+ const json = safeStringify(normalizedResult);
2389
+ if (typeof json !== 'string' || byteLength(json) > options.maxOutputBytes) {
2390
+ throw new SafeError('Evaluation result exceeded maxOutputBytes');
2391
+ }
2392
+ return createEnvelope(true, json);
2393
+ } catch (error) {
2394
+ let message = 'Evaluation failed';
2395
+ if (typeof error === 'string') {
2396
+ message = error;
2397
+ } else if (error && typeof error === 'object') {
2398
+ const descriptor = safeGetOwnPropertyDescriptor(error, 'message');
2399
+ if (descriptor && 'value' in descriptor && typeof descriptor.value === 'string') {
2400
+ message = descriptor.value;
2401
+ }
2402
+ }
2403
+ if (byteLength(message) > 2048) {
2404
+ message = 'Evaluation failed with an oversized error';
2405
+ }
2406
+ return createEnvelope(false, message);
2407
+ }
2408
+ };
2409
+
2410
+ for (const [key, value] of [
2411
+ [${bootstrapKeyLiteral}, evaluate],
2412
+ [${cancelKeyLiteral}, cancelEvaluation],
2413
+ [${cleanupKeyLiteral}, cancelEvaluation],
2414
+ ]) {
2415
+ safeDefineProperty(safeGlobalThis, key, {
2416
+ value,
2417
+ configurable: false,
2418
+ enumerable: false,
2419
+ writable: false,
2420
+ });
2421
+ }
2422
+ return true;
2423
+ })()`;
2424
+ }
2425
+ createEvaluationExpression(expression, options, cancellationKey) {
2426
+ return `globalThis[${JSON.stringify(evaluationBootstrapKey)}](${JSON.stringify(expression)}, ${JSON.stringify(options)}, ${JSON.stringify(cancellationKey)})`;
2427
+ }
2428
+ validateTimeout(timeoutMs, defaultValue = 5000) {
2429
+ if (timeoutMs === undefined) {
2430
+ return defaultValue;
2431
+ }
2432
+ return validateInteger(timeoutMs, 'timeoutMs', 1, maxTimeoutMs);
2433
+ }
2434
+ validateWaitUntil(waitUntil) {
2435
+ const validatedWaitUntil = waitUntil ?? 'load';
2436
+ if (!['load', 'domcontentloaded', 'networkidle0', 'networkidle2'].includes(validatedWaitUntil)) {
2437
+ throw new Error('waitUntil must be load, domcontentloaded, networkidle0, or networkidle2');
2438
+ }
2439
+ return validatedWaitUntil;
2440
+ }
2441
+ validateScreencastOptions() {
2442
+ const options = this.options.screencast;
2443
+ if (!options) {
2444
+ return;
2445
+ }
2446
+ if (options.format !== undefined && options.format !== 'jpeg' && options.format !== 'png') {
2447
+ throw new Error('screencast.format must be jpeg or png');
2448
+ }
2449
+ if (options.quality !== undefined) {
2450
+ validateInteger(options.quality, 'screencast.quality', 0, 100);
2451
+ }
2452
+ if (options.maxWidth !== undefined) {
2453
+ validateInteger(options.maxWidth, 'screencast.maxWidth', 1, maxViewportWidth);
2454
+ }
2455
+ if (options.maxHeight !== undefined) {
2456
+ validateInteger(options.maxHeight, 'screencast.maxHeight', 1, maxViewportHeight);
2457
+ }
2458
+ if (options.maxWidth !== undefined
2459
+ && options.maxHeight !== undefined
2460
+ && options.maxWidth * options.maxHeight > maxViewportPixelArea) {
2461
+ throw new Error(`screencast pixel area must not exceed ${maxViewportPixelArea} pixels`);
2462
+ }
2463
+ if (options.everyNthFrame !== undefined) {
2464
+ validateInteger(options.everyNthFrame, 'screencast.everyNthFrame', 1, 100);
2465
+ }
2466
+ }
2467
+ }
2468
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRwdXBwZXRlZXIuY2xhc3Nlcy5saXZlYnJvd3NlcnNlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydHB1cHBldGVlci5jbGFzc2VzLmxpdmVicm93c2Vyc2Vzc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQWlDeEYsT0FBTyxLQUFLLE9BQU8sTUFBTSw2QkFBNkIsQ0FBQztBQUV2RCxNQUFNLGVBQWUsR0FBeUI7SUFDNUMsS0FBSyxFQUFFLEdBQUc7SUFDVixNQUFNLEVBQUUsR0FBRztJQUNYLGlCQUFpQixFQUFFLENBQUM7Q0FDckIsQ0FBQztBQUVGLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0FBQzlCLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDO0FBQy9CLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO0FBQy9CLE1BQU0sb0JBQW9CLEdBQUcsT0FBTyxDQUFDO0FBQ3JDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDO0FBQy9CLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQztBQUM1QixNQUFNLFlBQVksR0FBRyxLQUFLLENBQUM7QUFDM0IsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDO0FBQzNCLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO0FBQy9CLE1BQU0seUJBQXlCLEdBQUcsRUFBRSxDQUFDO0FBQ3JDLE1BQU0sMkJBQTJCLEdBQUcsR0FBRyxDQUFDO0FBQ3hDLE1BQU0sd0JBQXdCLEdBQUcsTUFBTSxDQUFDO0FBQ3hDLE1BQU0sd0JBQXdCLEdBQUcsT0FBTyxDQUFDO0FBQ3pDLE1BQU0sa0JBQWtCLEdBQUcsRUFBRSxDQUFDO0FBQzlCLE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxDQUFDO0FBQ2pDLE1BQU0sd0JBQXdCLEdBQUcsTUFBTSxDQUFDO0FBQ3hDLE1BQU0sd0JBQXdCLEdBQUcsS0FBSyxD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