@push.rocks/smartbrowser 2.0.11 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1408 @@
1
+ const maxInputQueueLength = 128;
2
+ const maxPendingAcknowledgements = 16;
3
+ const maxInputReleaseAttempts = 2;
4
+ const maxFrameDimension = 12288;
5
+ const maxFramePixelArea = 8294400;
6
+ const maxFrameByteLength = (maxFramePixelArea * 4) + 1048576;
7
+ const maxViewportWidth = 4096;
8
+ const maxViewportHeight = 4096;
9
+ const maxDeviceScaleFactor = 3;
10
+ const coordinateEdgeInset = 0.001;
11
+ const defaultOperationTimeoutMs = 10000;
12
+ class LiveBrowserOperationTimeoutError extends Error {
13
+ }
14
+ class LiveBrowserRunAbortedError extends Error {
15
+ }
16
+ class LiveBrowserFrameProtocolError extends Error {
17
+ }
18
+ class LiveBrowserFrameIntegrityError extends Error {
19
+ }
20
+ const viewportEquals = (firstArg, secondArg) => (firstArg.width === secondArg.width
21
+ && firstArg.height === secondArg.height
22
+ && firstArg.deviceScaleFactor === secondArg.deviceScaleFactor);
23
+ const createModifiers = (eventArg) => ({
24
+ alt: eventArg.altKey,
25
+ control: eventArg.ctrlKey,
26
+ meta: eventArg.metaKey,
27
+ shift: eventArg.shiftKey,
28
+ });
29
+ const createFrameAcknowledgementRequest = (frameArg) => ({
30
+ tabId: frameArg.tabId,
31
+ sequence: frameArg.sequence,
32
+ generation: frameArg.generation,
33
+ viewportRevision: frameArg.viewportRevision,
34
+ });
35
+ const createInputIdentity = (displayedFrameArg) => ({
36
+ tabId: displayedFrameArg.tabId,
37
+ generation: displayedFrameArg.generation,
38
+ viewportRevision: displayedFrameArg.viewportRevision,
39
+ });
40
+ const getErrorMessage = (errorArg) => (errorArg instanceof Error ? errorArg.message : String(errorArg));
41
+ /**
42
+ * Renders transport-neutral live browser frames and maps DOM input back to the
43
+ * currently displayed SmartPuppeteer frame identity.
44
+ */
45
+ export class LiveBrowserCanvasRenderer {
46
+ constructor(optionsArg) {
47
+ this.lifecycleTail = Promise.resolve();
48
+ this.runEpoch = 0;
49
+ this.running = false;
50
+ this.suspended = false;
51
+ this.stopping = false;
52
+ this.interruptionRequested = false;
53
+ this.operationControllers = new Set();
54
+ this.acceptingFrames = false;
55
+ this.focusWasAdjusted = false;
56
+ this.focusHadTabIndex = false;
57
+ this.focusTabIndexValue = null;
58
+ this.highestFrameSequence = -1;
59
+ this.acknowledgementPromises = new Set();
60
+ this.rawDecodeSettlementPromises = new Set();
61
+ this.inputBlocked = true;
62
+ this.inputCommands = [];
63
+ this.inputProcessing = false;
64
+ this.inputIdleResolvers = [];
65
+ this.inputResetTail = Promise.resolve();
66
+ this.inputResetCount = 0;
67
+ this.inputOverflowRecoveryPending = false;
68
+ this.pressedKeys = new Map();
69
+ this.pressedMouseButtons = new Map();
70
+ this.capturedPointerIds = new Set();
71
+ this.viewportProcessing = false;
72
+ this.canvas = optionsArg.canvas;
73
+ this.client = optionsArg.client;
74
+ this.focusTarget = optionsArg.focusTarget ?? this.canvas;
75
+ this.resizeTarget = optionsArg.resizeTarget;
76
+ this.getDeviceScaleFactor = optionsArg.getDeviceScaleFactor
77
+ ?? (() => window.devicePixelRatio || 1);
78
+ this.operationTimeoutMs = this.validateTimeout(optionsArg.operationTimeoutMs ?? defaultOperationTimeoutMs, 'operationTimeoutMs');
79
+ this.frameDecodeTimeoutMs = this.validateTimeout(optionsArg.frameDecodeTimeoutMs ?? this.operationTimeoutMs, 'frameDecodeTimeoutMs');
80
+ this.onError = optionsArg.onError;
81
+ this.onFrameRendered = optionsArg.onFrameRendered;
82
+ this.initialCanvasWidth = this.canvas.width;
83
+ this.initialCanvasHeight = this.canvas.height;
84
+ const canvasContext = this.canvas.getContext('2d');
85
+ if (!canvasContext) {
86
+ throw new Error('LiveBrowserCanvasRenderer requires a 2D canvas context');
87
+ }
88
+ this.canvasContext = canvasContext;
89
+ }
90
+ get isRunning() {
91
+ return this.running;
92
+ }
93
+ get isSuspended() {
94
+ return this.suspended;
95
+ }
96
+ start() {
97
+ return this.enqueueLifecycle(async () => {
98
+ if (this.running) {
99
+ return;
100
+ }
101
+ if (this.suspended) {
102
+ throw new Error('Live browser renderer is suspended; call resume() to start a fresh run');
103
+ }
104
+ await this.startRun(false);
105
+ });
106
+ }
107
+ stop() {
108
+ this.interruptRun(this.runEpoch);
109
+ return this.enqueueLifecycle(async () => {
110
+ const runEpoch = this.runEpoch;
111
+ this.interruptRun(runEpoch);
112
+ if (this.stopping) {
113
+ await this.finishRun(runEpoch, false);
114
+ return;
115
+ }
116
+ if (!this.suspended) {
117
+ return;
118
+ }
119
+ this.suspended = false;
120
+ this.restoreCanvasAndFocus();
121
+ });
122
+ }
123
+ /**
124
+ * Aborts the current transport generation without replaying input recovery.
125
+ */
126
+ suspend() {
127
+ this.interruptRun(this.runEpoch);
128
+ return this.enqueueLifecycle(async () => {
129
+ const runEpoch = this.runEpoch;
130
+ this.interruptRun(runEpoch);
131
+ if (!this.stopping) {
132
+ return;
133
+ }
134
+ await this.finishRun(runEpoch, true);
135
+ });
136
+ }
137
+ /**
138
+ * Starts a new transport generation that requires new state and a new frame.
139
+ */
140
+ resume() {
141
+ return this.enqueueLifecycle(async () => {
142
+ if (this.running) {
143
+ return;
144
+ }
145
+ if (!this.suspended) {
146
+ throw new Error('Live browser renderer is not suspended');
147
+ }
148
+ await this.startRun(true);
149
+ });
150
+ }
151
+ /**
152
+ * Sends arbitrary committed text, including text produced by an external IME.
153
+ */
154
+ async insertText(textArg) {
155
+ const displayedFrame = this.requireInputFrame();
156
+ const inputIdentity = createInputIdentity(displayedFrame);
157
+ await this.enqueueInputCommand({
158
+ kind: 'text',
159
+ runEpoch: this.runEpoch,
160
+ execute: async (optionsArg) => {
161
+ await this.client.insertText({
162
+ ...inputIdentity,
163
+ text: textArg,
164
+ }, optionsArg);
165
+ },
166
+ });
167
+ }
168
+ /**
169
+ * Reads the configured stable resize target and requests the corresponding
170
+ * remote CSS viewport. Intrinsic canvas dimensions are never used here.
171
+ */
172
+ syncViewport() {
173
+ if (!this.running || this.stopping || this.interruptionRequested || !this.resizeTarget) {
174
+ return;
175
+ }
176
+ const width = Math.floor(this.resizeTarget.clientWidth);
177
+ const height = Math.floor(this.resizeTarget.clientHeight);
178
+ this.queueViewport(width, height, this.runEpoch);
179
+ }
180
+ enqueueLifecycle(operationArg) {
181
+ const operation = this.lifecycleTail.then(operationArg, operationArg);
182
+ this.lifecycleTail = operation.then(() => undefined, () => undefined);
183
+ return operation;
184
+ }
185
+ async startRun(resumingArg) {
186
+ await Promise.all([...this.rawDecodeSettlementPromises]);
187
+ const runEpoch = ++this.runEpoch;
188
+ this.runController = new AbortController();
189
+ this.running = true;
190
+ this.suspended = false;
191
+ this.stopping = false;
192
+ this.interruptionRequested = false;
193
+ this.acceptingFrames = true;
194
+ this.inputBlocked = true;
195
+ this.state = undefined;
196
+ this.displayedFrame = undefined;
197
+ this.highestFrameSequence = -1;
198
+ this.clearCanvas();
199
+ try {
200
+ this.makeFocusTargetFocusable();
201
+ this.installDomListeners(runEpoch);
202
+ this.unsubscribe = this.client.onEvent((eventArg) => {
203
+ this.handleEvent(eventArg, runEpoch);
204
+ });
205
+ this.applyState(this.client.getState(), runEpoch);
206
+ this.installResizeObserver(runEpoch);
207
+ }
208
+ catch (error) {
209
+ this.interruptRun(runEpoch);
210
+ await this.finishRun(runEpoch, resumingArg);
211
+ throw error;
212
+ }
213
+ }
214
+ interruptRun(runEpochArg) {
215
+ if (runEpochArg !== this.runEpoch
216
+ || (!this.running && !this.stopping)) {
217
+ return;
218
+ }
219
+ this.running = false;
220
+ this.stopping = true;
221
+ this.interruptionRequested = true;
222
+ this.acceptingFrames = false;
223
+ this.inputBlocked = true;
224
+ this.pendingViewport = undefined;
225
+ this.queuedFrame = undefined;
226
+ this.displayedFrame = undefined;
227
+ this.resizeFence = undefined;
228
+ this.releasePointerCaptures();
229
+ this.clearCanvas();
230
+ const interruptionError = new LiveBrowserRunAbortedError(`Live browser renderer run ${runEpochArg} was interrupted`);
231
+ this.runController?.abort(interruptionError);
232
+ for (const controller of this.operationControllers) {
233
+ controller.abort(interruptionError);
234
+ }
235
+ const abandonedCommands = this.inputCommands.splice(0);
236
+ for (const command of abandonedCommands) {
237
+ command.reject(interruptionError);
238
+ }
239
+ this.pressedKeys.clear();
240
+ this.pressedMouseButtons.clear();
241
+ this.inputOverflowRecoveryPending = false;
242
+ }
243
+ async finishRun(runEpochArg, suspendArg) {
244
+ if (runEpochArg !== this.runEpoch) {
245
+ return;
246
+ }
247
+ try {
248
+ this.resizeObserver?.disconnect();
249
+ this.resizeObserver = undefined;
250
+ this.listenerController?.abort();
251
+ this.listenerController = undefined;
252
+ const unsubscribe = this.unsubscribe;
253
+ this.unsubscribe = undefined;
254
+ if (unsubscribe) {
255
+ try {
256
+ unsubscribe();
257
+ }
258
+ catch (error) {
259
+ this.reportError({
260
+ code: 'renderer_cleanup_failed',
261
+ message: `Could not unsubscribe the live browser renderer: ${getErrorMessage(error)}`,
262
+ cause: error,
263
+ }, runEpochArg);
264
+ }
265
+ }
266
+ await Promise.allSettled([
267
+ this.viewportProcessingPromise,
268
+ this.inputResetTail,
269
+ this.waitForInputIdle(),
270
+ this.frameProcessingPromise,
271
+ ...this.acknowledgementPromises,
272
+ ]);
273
+ }
274
+ finally {
275
+ for (const controller of this.operationControllers) {
276
+ controller.abort(new LiveBrowserRunAbortedError(`Live browser renderer run ${runEpochArg} finished`));
277
+ }
278
+ this.operationControllers.clear();
279
+ this.runController = undefined;
280
+ this.running = false;
281
+ this.suspended = suspendArg;
282
+ this.acceptingFrames = false;
283
+ this.state = undefined;
284
+ this.displayedFrame = undefined;
285
+ this.highestFrameSequence = -1;
286
+ this.queuedFrame = undefined;
287
+ this.frameProcessingPromise = undefined;
288
+ this.acknowledgementPromises.clear();
289
+ this.resizeFence = undefined;
290
+ this.pendingViewport = undefined;
291
+ this.inFlightViewport = undefined;
292
+ this.viewportProcessing = false;
293
+ this.viewportProcessingPromise = undefined;
294
+ this.inputResetPromise = undefined;
295
+ this.inputResetTail = Promise.resolve();
296
+ this.inputResetCount = 0;
297
+ this.inputBlocked = true;
298
+ this.pressedKeys.clear();
299
+ this.pressedMouseButtons.clear();
300
+ this.releasePointerCaptures();
301
+ const abandonedCommands = this.inputCommands.splice(0);
302
+ for (const command of abandonedCommands) {
303
+ command.reject(new Error('Live browser renderer stopped before dispatching input'));
304
+ }
305
+ const inputIdleResolvers = this.inputIdleResolvers;
306
+ this.inputIdleResolvers = [];
307
+ for (const resolver of inputIdleResolvers) {
308
+ resolver();
309
+ }
310
+ this.restoreCanvasAndFocus();
311
+ this.interruptionRequested = false;
312
+ this.stopping = false;
313
+ }
314
+ }
315
+ restoreCanvasAndFocus() {
316
+ this.canvas.width = this.initialCanvasWidth;
317
+ this.canvas.height = this.initialCanvasHeight;
318
+ this.restoreFocusTarget();
319
+ }
320
+ installDomListeners(runEpochArg) {
321
+ const listenerController = new AbortController();
322
+ const signal = listenerController.signal;
323
+ this.listenerController = listenerController;
324
+ this.canvas.addEventListener('pointerdown', (eventArg) => {
325
+ this.handlePointerDown(eventArg, runEpochArg);
326
+ }, { signal });
327
+ this.canvas.addEventListener('pointermove', (eventArg) => {
328
+ this.handlePointerMove(eventArg, runEpochArg);
329
+ }, { signal });
330
+ this.canvas.addEventListener('pointerup', (eventArg) => {
331
+ this.handlePointerUp(eventArg, runEpochArg);
332
+ }, { signal });
333
+ this.canvas.addEventListener('pointercancel', (eventArg) => {
334
+ this.releasePointerCapture(eventArg.pointerId);
335
+ void this.scheduleInputReset(false, runEpochArg);
336
+ }, { signal });
337
+ this.canvas.addEventListener('lostpointercapture', (eventArg) => {
338
+ this.capturedPointerIds.delete(eventArg.pointerId);
339
+ if (this.pressedMouseButtons.size > 0) {
340
+ void this.scheduleInputReset(false, runEpochArg);
341
+ }
342
+ }, { signal });
343
+ this.canvas.addEventListener('contextmenu', (eventArg) => {
344
+ eventArg.preventDefault();
345
+ }, { signal });
346
+ this.canvas.addEventListener('wheel', (eventArg) => {
347
+ this.handleWheel(eventArg, runEpochArg);
348
+ }, { passive: false, signal });
349
+ this.focusTarget.addEventListener('keydown', (eventArg) => {
350
+ this.handleKey(eventArg, 'down', runEpochArg);
351
+ }, { signal });
352
+ this.focusTarget.addEventListener('keyup', (eventArg) => {
353
+ this.handleKey(eventArg, 'up', runEpochArg);
354
+ }, { signal });
355
+ this.focusTarget.addEventListener('compositionend', (eventArg) => {
356
+ if (!this.inputBlocked && eventArg.data) {
357
+ void this.insertText(eventArg.data).catch(() => undefined);
358
+ }
359
+ }, { signal });
360
+ window.addEventListener('blur', () => {
361
+ void this.scheduleInputReset(false, runEpochArg);
362
+ }, { signal });
363
+ window.addEventListener('resize', () => {
364
+ this.syncViewport();
365
+ }, { signal });
366
+ document.addEventListener('visibilitychange', () => {
367
+ if (document.visibilityState === 'hidden') {
368
+ void this.scheduleInputReset(false, runEpochArg);
369
+ }
370
+ }, { signal });
371
+ }
372
+ installResizeObserver(runEpochArg) {
373
+ if (!this.resizeTarget) {
374
+ return;
375
+ }
376
+ this.resizeObserver = new ResizeObserver((entriesArg) => {
377
+ const matchingEntry = entriesArg.find((entryArg) => entryArg.target === this.resizeTarget);
378
+ if (!matchingEntry) {
379
+ return;
380
+ }
381
+ this.queueViewport(Math.floor(matchingEntry.contentRect.width), Math.floor(matchingEntry.contentRect.height), runEpochArg);
382
+ });
383
+ this.resizeObserver.observe(this.resizeTarget);
384
+ this.syncViewport();
385
+ }
386
+ handleEvent(eventArg, runEpochArg) {
387
+ if (eventArg.type === 'frame') {
388
+ this.queueFrame(eventArg.frame, runEpochArg);
389
+ return;
390
+ }
391
+ if (!this.running || runEpochArg !== this.runEpoch) {
392
+ return;
393
+ }
394
+ if (eventArg.type === 'state') {
395
+ this.applyState(eventArg.state, runEpochArg);
396
+ return;
397
+ }
398
+ this.reportError({
399
+ code: 'remote_browser_error',
400
+ message: `${eventArg.error.code}: ${eventArg.error.message}`,
401
+ cause: eventArg.error,
402
+ }, runEpochArg);
403
+ }
404
+ applyState(stateArg, runEpochArg) {
405
+ if (!this.running || runEpochArg !== this.runEpoch) {
406
+ return;
407
+ }
408
+ this.state = stateArg;
409
+ if (this.displayedFrame && this.isStateAheadOfDisplayedFrame(stateArg, this.displayedFrame)) {
410
+ this.displayedFrame = undefined;
411
+ this.clearCanvas();
412
+ void this.scheduleInputReset(false, runEpochArg);
413
+ return;
414
+ }
415
+ this.updateInputAvailability();
416
+ }
417
+ isStateAheadOfDisplayedFrame(stateArg, displayedFrameArg) {
418
+ if (stateArg.status !== 'running' || stateArg.activeTabId !== displayedFrameArg.tabId) {
419
+ return true;
420
+ }
421
+ const activeTab = stateArg.tabs.find((tabArg) => tabArg.id === displayedFrameArg.tabId);
422
+ if (!activeTab || activeTab.status !== 'open') {
423
+ return true;
424
+ }
425
+ return stateArg.viewportRevision > displayedFrameArg.viewportRevision
426
+ || activeTab.generation > displayedFrameArg.generation;
427
+ }
428
+ queueFrame(frameArg, runEpochArg) {
429
+ if (!this.running || !this.acceptingFrames || runEpochArg !== this.runEpoch) {
430
+ return;
431
+ }
432
+ try {
433
+ this.validateFrame(frameArg);
434
+ if (frameArg.sequence <= this.highestFrameSequence) {
435
+ throw new LiveBrowserFrameProtocolError(`frame.sequence ${frameArg.sequence} must be strictly greater than current run high-water ${this.highestFrameSequence}`);
436
+ }
437
+ }
438
+ catch (error) {
439
+ this.requestSuspend(runEpochArg);
440
+ this.reportError({
441
+ code: 'frame_render_failed',
442
+ message: `Rejected invalid live browser frame: ${getErrorMessage(error)}`,
443
+ cause: error,
444
+ frame: frameArg,
445
+ }, runEpochArg);
446
+ return;
447
+ }
448
+ this.highestFrameSequence = frameArg.sequence;
449
+ const frameWork = {
450
+ frame: frameArg,
451
+ runEpoch: runEpochArg,
452
+ acknowledgementAttempted: false,
453
+ };
454
+ if (this.queuedFrame) {
455
+ const supersededFrame = this.queuedFrame;
456
+ this.queuedFrame = undefined;
457
+ void this.acknowledgeFrame(supersededFrame);
458
+ }
459
+ this.queuedFrame = frameWork;
460
+ this.ensureFrameProcessor();
461
+ }
462
+ ensureFrameProcessor() {
463
+ if (this.frameProcessingPromise || !this.queuedFrame) {
464
+ return;
465
+ }
466
+ const processingPromise = this.processFrameQueue().finally(() => {
467
+ if (this.frameProcessingPromise === processingPromise) {
468
+ this.frameProcessingPromise = undefined;
469
+ if (this.queuedFrame) {
470
+ this.ensureFrameProcessor();
471
+ }
472
+ }
473
+ });
474
+ this.frameProcessingPromise = processingPromise;
475
+ }
476
+ async processFrameQueue() {
477
+ while (this.queuedFrame) {
478
+ const frameWork = this.queuedFrame;
479
+ this.queuedFrame = undefined;
480
+ await this.processFrame(frameWork);
481
+ }
482
+ }
483
+ async processFrame(frameWorkArg) {
484
+ const { frame, runEpoch } = frameWorkArg;
485
+ let imageBitmap;
486
+ let terminalFailure = false;
487
+ let terminalError;
488
+ try {
489
+ if (!this.canRenderFrame(frame, runEpoch)) {
490
+ return;
491
+ }
492
+ const frameBytes = new Uint8Array(frame.data.byteLength);
493
+ frameBytes.set(frame.data);
494
+ imageBitmap = await this.decodeFrame(new Blob([frameBytes.buffer], {
495
+ type: frame.mimeType,
496
+ }), runEpoch);
497
+ if (imageBitmap.width !== frame.width || imageBitmap.height !== frame.height) {
498
+ throw new LiveBrowserFrameIntegrityError(`decoded frame dimensions ${imageBitmap.width}x${imageBitmap.height} do not match ${frame.width}x${frame.height}`);
499
+ }
500
+ if (!this.canRenderFrame(frame, runEpoch) || frame.sequence !== this.highestFrameSequence) {
501
+ return;
502
+ }
503
+ this.canvas.width = frame.width;
504
+ this.canvas.height = frame.height;
505
+ this.canvasContext.clearRect(0, 0, frame.width, frame.height);
506
+ this.canvasContext.drawImage(imageBitmap, 0, 0, frame.width, frame.height);
507
+ this.displayedFrame = {
508
+ tabId: frame.tabId,
509
+ sequence: frame.sequence,
510
+ generation: frame.generation,
511
+ viewportRevision: frame.viewportRevision,
512
+ viewport: { ...frame.viewport },
513
+ };
514
+ if (this.resizeFence
515
+ && !this.viewportProcessing
516
+ && frame.viewportRevision >= this.resizeFence.minimumViewportRevision
517
+ && viewportEquals(frame.viewport, this.resizeFence.target)) {
518
+ this.resizeFence = undefined;
519
+ }
520
+ this.updateInputAvailability();
521
+ this.callFrameRendered(frame, runEpoch);
522
+ }
523
+ catch (error) {
524
+ if (error instanceof LiveBrowserRunAbortedError) {
525
+ return;
526
+ }
527
+ terminalFailure = true;
528
+ terminalError = error;
529
+ }
530
+ finally {
531
+ imageBitmap?.close();
532
+ await this.acknowledgeFrame(frameWorkArg);
533
+ if (terminalFailure) {
534
+ this.requestSuspend(runEpoch);
535
+ this.reportError({
536
+ code: 'frame_render_failed',
537
+ message: `Could not render live browser frame: ${getErrorMessage(terminalError)}`,
538
+ cause: terminalError,
539
+ frame,
540
+ }, runEpoch);
541
+ }
542
+ }
543
+ }
544
+ canRenderFrame(frameArg, runEpochArg) {
545
+ if (!this.running
546
+ || !this.acceptingFrames
547
+ || runEpochArg !== this.runEpoch
548
+ || this.viewportProcessing) {
549
+ return false;
550
+ }
551
+ const state = this.state;
552
+ if (!state || state.status !== 'running' || state.activeTabId !== frameArg.tabId) {
553
+ return false;
554
+ }
555
+ const activeTab = state.tabs.find((tabArg) => tabArg.id === frameArg.tabId);
556
+ if (!activeTab || activeTab.status !== 'open') {
557
+ return false;
558
+ }
559
+ if (state.viewportRevision > frameArg.viewportRevision
560
+ || activeTab.generation > frameArg.generation) {
561
+ return false;
562
+ }
563
+ if (this.resizeFence) {
564
+ return frameArg.viewportRevision >= this.resizeFence.minimumViewportRevision
565
+ && viewportEquals(frameArg.viewport, this.resizeFence.target);
566
+ }
567
+ return true;
568
+ }
569
+ acknowledgeFrame(frameWorkArg) {
570
+ if (frameWorkArg.acknowledgementAttempted) {
571
+ return Promise.resolve();
572
+ }
573
+ frameWorkArg.acknowledgementAttempted = true;
574
+ if (!this.isRunActive(frameWorkArg.runEpoch)) {
575
+ return Promise.resolve();
576
+ }
577
+ if (this.acknowledgementPromises.size >= maxPendingAcknowledgements) {
578
+ this.requestSuspend(frameWorkArg.runEpoch);
579
+ this.reportError({
580
+ code: 'frame_acknowledgement_failed',
581
+ message: `Live browser frame acknowledgement capacity of ${maxPendingAcknowledgements} was reached`,
582
+ }, frameWorkArg.runEpoch);
583
+ return Promise.resolve();
584
+ }
585
+ const acknowledgement = this.runClientOperation((optionsArg) => this.client.acknowledgeFrame(createFrameAcknowledgementRequest(frameWorkArg.frame), optionsArg), 'frame acknowledgement', frameWorkArg.runEpoch)
586
+ .then(() => undefined)
587
+ .catch((error) => {
588
+ if (error instanceof LiveBrowserRunAbortedError) {
589
+ return;
590
+ }
591
+ this.requestSuspend(frameWorkArg.runEpoch);
592
+ this.reportError({
593
+ code: 'frame_acknowledgement_failed',
594
+ message: `Could not acknowledge live browser frame: ${getErrorMessage(error)}`,
595
+ cause: error,
596
+ frame: frameWorkArg.frame,
597
+ }, frameWorkArg.runEpoch);
598
+ });
599
+ let trackedAcknowledgement;
600
+ trackedAcknowledgement = acknowledgement.finally(() => {
601
+ this.acknowledgementPromises.delete(trackedAcknowledgement);
602
+ });
603
+ this.acknowledgementPromises.add(trackedAcknowledgement);
604
+ return trackedAcknowledgement;
605
+ }
606
+ handlePointerDown(eventArg, runEpochArg) {
607
+ if (eventArg.pointerType && eventArg.pointerType !== 'mouse') {
608
+ return;
609
+ }
610
+ const button = this.getMouseButton(eventArg.button);
611
+ if (!button) {
612
+ return;
613
+ }
614
+ const displayedFrame = this.getInputFrame();
615
+ if (!displayedFrame || runEpochArg !== this.runEpoch) {
616
+ return;
617
+ }
618
+ eventArg.preventDefault();
619
+ const coordinates = this.mapCoordinates(eventArg, displayedFrame.viewport);
620
+ if (!coordinates) {
621
+ return;
622
+ }
623
+ this.focusTarget.focus({ preventScroll: true });
624
+ try {
625
+ this.canvas.setPointerCapture(eventArg.pointerId);
626
+ this.capturedPointerIds.add(eventArg.pointerId);
627
+ }
628
+ catch {
629
+ // Pointer capture may already have been released by the browser.
630
+ }
631
+ const input = {
632
+ ...createInputIdentity(displayedFrame),
633
+ type: 'down',
634
+ ...coordinates,
635
+ button,
636
+ buttons: eventArg.buttons,
637
+ clickCount: Math.min(3, Math.max(1, eventArg.detail || 1)),
638
+ modifiers: createModifiers(eventArg),
639
+ };
640
+ void this.enqueueInputCommand({
641
+ kind: 'mouse',
642
+ runEpoch: runEpochArg,
643
+ execute: async (optionsArg) => this.client.dispatchMouse(input, optionsArg),
644
+ onAttempt: () => this.pressedMouseButtons.set(button, input),
645
+ }).catch(() => undefined);
646
+ }
647
+ handlePointerMove(eventArg, runEpochArg) {
648
+ if (eventArg.pointerType && eventArg.pointerType !== 'mouse') {
649
+ return;
650
+ }
651
+ const displayedFrame = this.getInputFrame();
652
+ if (!displayedFrame || runEpochArg !== this.runEpoch) {
653
+ return;
654
+ }
655
+ eventArg.preventDefault();
656
+ const coordinates = this.mapCoordinates(eventArg, displayedFrame.viewport);
657
+ if (!coordinates) {
658
+ this.releasePointerCapture(eventArg.pointerId);
659
+ void this.scheduleInputReset(false, runEpochArg);
660
+ return;
661
+ }
662
+ const input = {
663
+ ...createInputIdentity(displayedFrame),
664
+ type: 'move',
665
+ ...coordinates,
666
+ button: 'none',
667
+ buttons: eventArg.buttons,
668
+ modifiers: createModifiers(eventArg),
669
+ };
670
+ void this.enqueueInputCommand({
671
+ kind: 'mouseMove',
672
+ runEpoch: runEpochArg,
673
+ execute: async (optionsArg) => this.client.dispatchMouse(input, optionsArg),
674
+ }).catch(() => undefined);
675
+ }
676
+ handlePointerUp(eventArg, runEpochArg) {
677
+ if (eventArg.pointerType && eventArg.pointerType !== 'mouse') {
678
+ return;
679
+ }
680
+ const button = this.getMouseButton(eventArg.button);
681
+ const displayedFrame = this.getInputFrame();
682
+ if (!button || !displayedFrame || runEpochArg !== this.runEpoch) {
683
+ this.releasePointerCapture(eventArg.pointerId);
684
+ return;
685
+ }
686
+ eventArg.preventDefault();
687
+ const coordinates = this.mapCoordinates(eventArg, displayedFrame.viewport);
688
+ if (!coordinates) {
689
+ this.releasePointerCapture(eventArg.pointerId);
690
+ void this.scheduleInputReset(false, runEpochArg);
691
+ return;
692
+ }
693
+ const input = {
694
+ ...createInputIdentity(displayedFrame),
695
+ type: 'up',
696
+ ...coordinates,
697
+ button,
698
+ buttons: eventArg.buttons,
699
+ clickCount: Math.min(3, Math.max(1, eventArg.detail || 1)),
700
+ modifiers: createModifiers(eventArg),
701
+ };
702
+ void this.enqueueInputCommand({
703
+ kind: 'mouse',
704
+ runEpoch: runEpochArg,
705
+ execute: async (optionsArg) => this.client.dispatchMouse(input, optionsArg),
706
+ onSuccess: () => this.pressedMouseButtons.delete(button),
707
+ }).catch(() => undefined);
708
+ this.releasePointerCapture(eventArg.pointerId);
709
+ }
710
+ handleWheel(eventArg, runEpochArg) {
711
+ const displayedFrame = this.getInputFrame();
712
+ if (!displayedFrame || runEpochArg !== this.runEpoch) {
713
+ return;
714
+ }
715
+ eventArg.preventDefault();
716
+ const coordinates = this.mapCoordinates(eventArg, displayedFrame.viewport);
717
+ if (!coordinates) {
718
+ return;
719
+ }
720
+ const multiplier = eventArg.deltaMode === WheelEvent.DOM_DELTA_LINE
721
+ ? 16
722
+ : eventArg.deltaMode === WheelEvent.DOM_DELTA_PAGE
723
+ ? displayedFrame.viewport.height
724
+ : 1;
725
+ const clampDelta = (valueArg) => Math.max(-1000000, Math.min(1000000, valueArg));
726
+ void this.enqueueInputCommand({
727
+ kind: 'wheel',
728
+ runEpoch: runEpochArg,
729
+ execute: async (optionsArg) => this.client.dispatchWheel({
730
+ ...createInputIdentity(displayedFrame),
731
+ ...coordinates,
732
+ deltaX: clampDelta(eventArg.deltaX * multiplier),
733
+ deltaY: clampDelta(eventArg.deltaY * multiplier),
734
+ modifiers: createModifiers(eventArg),
735
+ }, optionsArg),
736
+ }).catch(() => undefined);
737
+ }
738
+ handleKey(eventArg, typeArg, runEpochArg) {
739
+ const displayedFrame = this.getInputFrame();
740
+ if (!displayedFrame
741
+ || runEpochArg !== this.runEpoch
742
+ || eventArg.isComposing
743
+ || eventArg.key === 'Process') {
744
+ return;
745
+ }
746
+ eventArg.preventDefault();
747
+ const text = typeArg === 'down'
748
+ && eventArg.key.length === 1
749
+ && !eventArg.metaKey
750
+ && (!eventArg.ctrlKey || eventArg.altKey)
751
+ ? eventArg.key
752
+ : undefined;
753
+ const input = {
754
+ ...createInputIdentity(displayedFrame),
755
+ type: typeArg,
756
+ key: eventArg.key,
757
+ code: eventArg.code || undefined,
758
+ text,
759
+ windowsVirtualKeyCode: eventArg.keyCode || undefined,
760
+ autoRepeat: eventArg.repeat,
761
+ isKeypad: eventArg.location === KeyboardEvent.DOM_KEY_LOCATION_NUMPAD,
762
+ location: eventArg.location,
763
+ modifiers: createModifiers(eventArg),
764
+ };
765
+ const keyIdentity = eventArg.code || eventArg.key;
766
+ void this.enqueueInputCommand({
767
+ kind: 'key',
768
+ runEpoch: runEpochArg,
769
+ execute: async (optionsArg) => this.client.dispatchKey(input, optionsArg),
770
+ onAttempt: typeArg === 'down'
771
+ ? () => this.pressedKeys.set(keyIdentity, input)
772
+ : undefined,
773
+ onSuccess: () => {
774
+ if (typeArg === 'up') {
775
+ this.pressedKeys.delete(keyIdentity);
776
+ }
777
+ },
778
+ }).catch(() => undefined);
779
+ }
780
+ mapCoordinates(eventArg, viewportArg) {
781
+ const canvasBounds = this.canvas.getBoundingClientRect();
782
+ if (canvasBounds.width <= 0 || canvasBounds.height <= 0) {
783
+ return undefined;
784
+ }
785
+ const x = ((eventArg.clientX - canvasBounds.left) / canvasBounds.width) * viewportArg.width;
786
+ const y = ((eventArg.clientY - canvasBounds.top) / canvasBounds.height) * viewportArg.height;
787
+ return {
788
+ x: Math.max(0, Math.min(viewportArg.width - coordinateEdgeInset, x)),
789
+ y: Math.max(0, Math.min(viewportArg.height - coordinateEdgeInset, y)),
790
+ };
791
+ }
792
+ getMouseButton(buttonArg) {
793
+ return buttonArg === 0
794
+ ? 'left'
795
+ : buttonArg === 1
796
+ ? 'middle'
797
+ : buttonArg === 2
798
+ ? 'right'
799
+ : buttonArg === 3
800
+ ? 'back'
801
+ : buttonArg === 4
802
+ ? 'forward'
803
+ : undefined;
804
+ }
805
+ getInputFrame() {
806
+ return this.inputBlocked || !this.isDisplayedFrameCurrent()
807
+ ? undefined
808
+ : this.displayedFrame;
809
+ }
810
+ requireInputFrame() {
811
+ const displayedFrame = this.getInputFrame();
812
+ if (!displayedFrame) {
813
+ throw new Error('Live browser input is unavailable until a current frame is displayed');
814
+ }
815
+ return displayedFrame;
816
+ }
817
+ isDisplayedFrameCurrent() {
818
+ const state = this.state;
819
+ const displayedFrame = this.displayedFrame;
820
+ if (!state || !displayedFrame || state.status !== 'running') {
821
+ return false;
822
+ }
823
+ if (state.activeTabId !== displayedFrame.tabId
824
+ || state.viewportRevision > displayedFrame.viewportRevision) {
825
+ return false;
826
+ }
827
+ const activeTab = state.tabs.find((tabArg) => tabArg.id === displayedFrame.tabId);
828
+ return Boolean(activeTab
829
+ && activeTab.status === 'open'
830
+ && activeTab.generation <= displayedFrame.generation);
831
+ }
832
+ enqueueInputCommand(commandArg) {
833
+ if (!this.running || this.inputBlocked || commandArg.runEpoch !== this.runEpoch) {
834
+ return Promise.reject(new Error('Live browser input is currently blocked'));
835
+ }
836
+ return new Promise((resolve, reject) => {
837
+ const command = {
838
+ ...commandArg,
839
+ resolve,
840
+ reject,
841
+ };
842
+ const lastCommand = this.inputCommands.at(-1);
843
+ if (command.kind === 'mouseMove' && lastCommand?.kind === 'mouseMove') {
844
+ lastCommand.resolve();
845
+ this.inputCommands[this.inputCommands.length - 1] = command;
846
+ }
847
+ else if (this.inputCommands.length >= maxInputQueueLength) {
848
+ if (command.kind === 'mouseMove') {
849
+ resolve();
850
+ return;
851
+ }
852
+ const error = new Error('Live browser input queue reached its capacity');
853
+ this.reportError({
854
+ code: 'input_queue_capacity_exceeded',
855
+ message: error.message,
856
+ cause: error,
857
+ }, command.runEpoch);
858
+ reject(error);
859
+ this.recoverFromInputOverflow(command.runEpoch);
860
+ return;
861
+ }
862
+ else {
863
+ this.inputCommands.push(command);
864
+ }
865
+ this.processInputCommands();
866
+ });
867
+ }
868
+ processInputCommands() {
869
+ if (this.inputProcessing) {
870
+ return;
871
+ }
872
+ this.inputProcessing = true;
873
+ void (async () => {
874
+ try {
875
+ while (this.inputCommands.length > 0) {
876
+ const command = this.inputCommands.shift();
877
+ if (!this.isRunActive(command.runEpoch)) {
878
+ command.reject(new LiveBrowserRunAbortedError(`Live browser input belongs to inactive run ${command.runEpoch}`));
879
+ continue;
880
+ }
881
+ try {
882
+ command.onAttempt?.();
883
+ await this.runClientOperation(command.execute, 'input dispatch', command.runEpoch);
884
+ if (!this.isRunActive(command.runEpoch)) {
885
+ throw new LiveBrowserRunAbortedError(`Live browser input belongs to inactive run ${command.runEpoch}`);
886
+ }
887
+ command.onSuccess?.();
888
+ command.resolve();
889
+ }
890
+ catch (error) {
891
+ command.reject(error);
892
+ if (error instanceof LiveBrowserRunAbortedError) {
893
+ continue;
894
+ }
895
+ if (error instanceof LiveBrowserOperationTimeoutError) {
896
+ this.requestSuspend(command.runEpoch);
897
+ }
898
+ this.reportError({
899
+ code: 'input_dispatch_failed',
900
+ message: `Could not dispatch live browser input: ${getErrorMessage(error)}`,
901
+ cause: error,
902
+ }, command.runEpoch);
903
+ const abandonedCommands = this.inputCommands.splice(0);
904
+ for (const abandonedCommand of abandonedCommands) {
905
+ abandonedCommand.reject(new Error('Live browser input was abandoned after a dispatch failure'));
906
+ }
907
+ if (!(error instanceof LiveBrowserOperationTimeoutError) && !this.stopping) {
908
+ void this.scheduleInputReset(false, command.runEpoch);
909
+ }
910
+ }
911
+ }
912
+ }
913
+ finally {
914
+ this.inputProcessing = false;
915
+ if (this.inputCommands.length > 0) {
916
+ this.processInputCommands();
917
+ }
918
+ else {
919
+ const resolvers = this.inputIdleResolvers;
920
+ this.inputIdleResolvers = [];
921
+ for (const resolver of resolvers) {
922
+ resolver();
923
+ }
924
+ }
925
+ }
926
+ })();
927
+ }
928
+ waitForInputIdle() {
929
+ if (!this.inputProcessing && this.inputCommands.length === 0) {
930
+ return Promise.resolve();
931
+ }
932
+ return new Promise((resolve) => {
933
+ this.inputIdleResolvers.push(resolve);
934
+ });
935
+ }
936
+ scheduleInputReset(clearDisplayArg, runEpochArg) {
937
+ if (runEpochArg !== this.runEpoch || this.stopping) {
938
+ return Promise.resolve();
939
+ }
940
+ this.inputBlocked = true;
941
+ this.releasePointerCaptures();
942
+ if (clearDisplayArg) {
943
+ this.displayedFrame = undefined;
944
+ this.clearCanvas();
945
+ }
946
+ if (this.inputResetPromise) {
947
+ return this.inputResetPromise;
948
+ }
949
+ this.inputResetCount++;
950
+ let resetOperation;
951
+ resetOperation = this.inputResetTail.then(async () => {
952
+ await this.waitForInputIdle();
953
+ await this.releasePressedInput(runEpochArg);
954
+ }).finally(() => {
955
+ this.inputResetCount--;
956
+ if (this.inputResetPromise === resetOperation) {
957
+ this.inputResetPromise = undefined;
958
+ }
959
+ this.updateInputAvailability();
960
+ });
961
+ this.inputResetPromise = resetOperation;
962
+ this.inputResetTail = resetOperation.then(() => undefined, () => undefined);
963
+ return resetOperation;
964
+ }
965
+ recoverFromInputOverflow(runEpochArg) {
966
+ if (this.inputOverflowRecoveryPending) {
967
+ return;
968
+ }
969
+ this.inputOverflowRecoveryPending = true;
970
+ this.inputBlocked = true;
971
+ void this.scheduleInputReset(false, runEpochArg).finally(() => {
972
+ this.inputOverflowRecoveryPending = false;
973
+ });
974
+ }
975
+ async releasePressedInput(runEpochArg) {
976
+ for (const [keyIdentity, pressedKey] of [...this.pressedKeys.entries()]) {
977
+ const released = await this.tryInputRelease((optionsArg) => this.client.dispatchKey({
978
+ ...pressedKey,
979
+ type: 'up',
980
+ text: undefined,
981
+ autoRepeat: false,
982
+ modifiers: {},
983
+ }, optionsArg), runEpochArg);
984
+ if (released && this.pressedKeys.get(keyIdentity) === pressedKey) {
985
+ this.pressedKeys.delete(keyIdentity);
986
+ }
987
+ }
988
+ for (const [button, pressedButton] of [...this.pressedMouseButtons.entries()]) {
989
+ const released = await this.tryInputRelease((optionsArg) => this.client.dispatchMouse({
990
+ ...pressedButton,
991
+ type: 'up',
992
+ buttons: 0,
993
+ clickCount: 1,
994
+ modifiers: {},
995
+ }, optionsArg), runEpochArg);
996
+ if (released && this.pressedMouseButtons.get(button) === pressedButton) {
997
+ this.pressedMouseButtons.delete(button);
998
+ }
999
+ }
1000
+ }
1001
+ async tryInputRelease(operationArg, runEpochArg) {
1002
+ let lastError;
1003
+ for (let attempt = 0; attempt < maxInputReleaseAttempts; attempt++) {
1004
+ try {
1005
+ await this.runClientOperation(operationArg, 'input release', runEpochArg);
1006
+ return true;
1007
+ }
1008
+ catch (error) {
1009
+ if (error instanceof LiveBrowserRunAbortedError) {
1010
+ return false;
1011
+ }
1012
+ lastError = error;
1013
+ }
1014
+ }
1015
+ this.requestSuspend(runEpochArg);
1016
+ this.reportInputReleaseError(lastError, runEpochArg);
1017
+ return false;
1018
+ }
1019
+ reportInputReleaseError(errorArg, runEpochArg) {
1020
+ this.reportError({
1021
+ code: 'input_dispatch_failed',
1022
+ message: `Could not release live browser input: ${getErrorMessage(errorArg)}`,
1023
+ cause: errorArg,
1024
+ }, runEpochArg);
1025
+ }
1026
+ queueViewport(widthArg, heightArg, runEpochArg) {
1027
+ if (!this.running
1028
+ || this.stopping
1029
+ || this.interruptionRequested
1030
+ || runEpochArg !== this.runEpoch
1031
+ || widthArg <= 0
1032
+ || heightArg <= 0) {
1033
+ return;
1034
+ }
1035
+ const deviceScaleFactor = this.getDeviceScaleFactor();
1036
+ if (!Number.isFinite(deviceScaleFactor) || deviceScaleFactor <= 0) {
1037
+ this.reportError({
1038
+ code: 'viewport_update_failed',
1039
+ message: 'Live browser device scale factor must be a positive finite number',
1040
+ }, runEpochArg);
1041
+ return;
1042
+ }
1043
+ const viewport = {
1044
+ width: widthArg,
1045
+ height: heightArg,
1046
+ deviceScaleFactor,
1047
+ };
1048
+ if (this.pendingViewport && viewportEquals(viewport, this.pendingViewport)) {
1049
+ return;
1050
+ }
1051
+ if (this.inFlightViewport && viewportEquals(viewport, this.inFlightViewport)) {
1052
+ this.pendingViewport = undefined;
1053
+ return;
1054
+ }
1055
+ if (!this.inFlightViewport
1056
+ && this.resizeFence
1057
+ && viewportEquals(viewport, this.resizeFence.target)) {
1058
+ this.pendingViewport = undefined;
1059
+ return;
1060
+ }
1061
+ if (!this.inFlightViewport
1062
+ && !this.resizeFence
1063
+ && this.state
1064
+ && viewportEquals(viewport, this.state.viewport)) {
1065
+ this.pendingViewport = undefined;
1066
+ this.updateInputAvailability();
1067
+ return;
1068
+ }
1069
+ this.pendingViewport = viewport;
1070
+ this.inputBlocked = true;
1071
+ this.ensureViewportProcessor(runEpochArg);
1072
+ }
1073
+ ensureViewportProcessor(runEpochArg) {
1074
+ if (this.viewportProcessingPromise || !this.pendingViewport) {
1075
+ return;
1076
+ }
1077
+ const processingPromise = this.processViewportQueue(runEpochArg).finally(() => {
1078
+ if (this.viewportProcessingPromise === processingPromise) {
1079
+ this.viewportProcessingPromise = undefined;
1080
+ if (this.pendingViewport
1081
+ && this.running
1082
+ && !this.stopping
1083
+ && runEpochArg === this.runEpoch) {
1084
+ this.ensureViewportProcessor(runEpochArg);
1085
+ }
1086
+ }
1087
+ });
1088
+ this.viewportProcessingPromise = processingPromise;
1089
+ }
1090
+ async processViewportQueue(runEpochArg) {
1091
+ this.viewportProcessing = true;
1092
+ try {
1093
+ while (this.pendingViewport
1094
+ && this.running
1095
+ && !this.stopping
1096
+ && runEpochArg === this.runEpoch) {
1097
+ const viewport = this.pendingViewport;
1098
+ this.pendingViewport = undefined;
1099
+ this.inFlightViewport = viewport;
1100
+ if (!this.resizeFence && this.state && viewportEquals(viewport, this.state.viewport)) {
1101
+ this.inFlightViewport = undefined;
1102
+ continue;
1103
+ }
1104
+ await this.scheduleInputReset(true, runEpochArg);
1105
+ if (!this.running || this.stopping || runEpochArg !== this.runEpoch) {
1106
+ return;
1107
+ }
1108
+ const currentRevision = this.state?.viewportRevision ?? 0;
1109
+ const previousMinimumRevision = this.resizeFence?.minimumViewportRevision ?? currentRevision;
1110
+ try {
1111
+ await this.runClientOperation((optionsArg) => this.client.setViewport(viewport, optionsArg), 'viewport update', runEpochArg);
1112
+ if (!this.running || this.stopping || runEpochArg !== this.runEpoch) {
1113
+ return;
1114
+ }
1115
+ this.resizeFence = {
1116
+ target: viewport,
1117
+ minimumViewportRevision: Math.max(currentRevision, previousMinimumRevision) + 1,
1118
+ };
1119
+ }
1120
+ catch (error) {
1121
+ if (runEpochArg === this.runEpoch && !(error instanceof LiveBrowserRunAbortedError)) {
1122
+ this.resizeFence = undefined;
1123
+ if (error instanceof LiveBrowserOperationTimeoutError) {
1124
+ this.requestSuspend(runEpochArg);
1125
+ }
1126
+ this.reportError({
1127
+ code: 'viewport_update_failed',
1128
+ message: `Could not update live browser viewport: ${getErrorMessage(error)}`,
1129
+ cause: error,
1130
+ }, runEpochArg);
1131
+ }
1132
+ }
1133
+ finally {
1134
+ if (this.inFlightViewport && viewportEquals(this.inFlightViewport, viewport)) {
1135
+ this.inFlightViewport = undefined;
1136
+ }
1137
+ }
1138
+ }
1139
+ }
1140
+ finally {
1141
+ this.viewportProcessing = false;
1142
+ this.updateInputAvailability();
1143
+ }
1144
+ }
1145
+ updateInputAvailability() {
1146
+ this.inputBlocked = !(this.running
1147
+ && this.acceptingFrames
1148
+ && !this.viewportProcessing
1149
+ && !this.resizeFence
1150
+ && this.inputResetCount === 0
1151
+ && this.isDisplayedFrameCurrent());
1152
+ }
1153
+ makeFocusTargetFocusable() {
1154
+ this.focusWasAdjusted = false;
1155
+ if (this.focusTarget.tabIndex >= 0) {
1156
+ return;
1157
+ }
1158
+ this.focusHadTabIndex = this.focusTarget.hasAttribute('tabindex');
1159
+ this.focusTabIndexValue = this.focusTarget.getAttribute('tabindex');
1160
+ this.focusTarget.setAttribute('tabindex', '0');
1161
+ this.focusWasAdjusted = true;
1162
+ }
1163
+ restoreFocusTarget() {
1164
+ if (!this.focusWasAdjusted) {
1165
+ return;
1166
+ }
1167
+ if (this.focusHadTabIndex && this.focusTabIndexValue !== null) {
1168
+ this.focusTarget.setAttribute('tabindex', this.focusTabIndexValue);
1169
+ }
1170
+ else {
1171
+ this.focusTarget.removeAttribute('tabindex');
1172
+ }
1173
+ this.focusWasAdjusted = false;
1174
+ }
1175
+ clearCanvas() {
1176
+ this.canvasContext.clearRect(0, 0, this.canvas.width, this.canvas.height);
1177
+ }
1178
+ callFrameRendered(frameArg, runEpochArg) {
1179
+ if (!this.onFrameRendered || runEpochArg !== this.runEpoch || !this.running) {
1180
+ return;
1181
+ }
1182
+ try {
1183
+ this.onFrameRendered(frameArg);
1184
+ }
1185
+ catch (error) {
1186
+ this.reportError({
1187
+ code: 'renderer_callback_failed',
1188
+ message: `Live browser frame callback failed: ${getErrorMessage(error)}`,
1189
+ cause: error,
1190
+ frame: frameArg,
1191
+ }, runEpochArg);
1192
+ }
1193
+ }
1194
+ reportError(errorArg, runEpochArg) {
1195
+ if (!this.onError || runEpochArg !== this.runEpoch) {
1196
+ return;
1197
+ }
1198
+ try {
1199
+ this.onError(errorArg);
1200
+ }
1201
+ catch {
1202
+ // Consumer error reporting must not break renderer cleanup.
1203
+ }
1204
+ }
1205
+ requestSuspend(runEpochArg) {
1206
+ if (!this.isRunActive(runEpochArg) || this.interruptionRequested) {
1207
+ return;
1208
+ }
1209
+ this.interruptRun(runEpochArg);
1210
+ void this.suspend();
1211
+ }
1212
+ validateTimeout(timeoutArg, nameArg) {
1213
+ if (!Number.isFinite(timeoutArg) || timeoutArg <= 0) {
1214
+ throw new Error(`${nameArg} must be a positive finite number`);
1215
+ }
1216
+ return timeoutArg;
1217
+ }
1218
+ runClientOperation(operationArg, operationNameArg, runEpochArg) {
1219
+ return this.runAbortableOperation((signalArg) => operationArg({ signal: signalArg }), this.operationTimeoutMs, operationNameArg, runEpochArg);
1220
+ }
1221
+ runAbortableOperation(operationArg, timeoutMsArg, operationNameArg, runEpochArg) {
1222
+ const runController = this.runController;
1223
+ if (!runController
1224
+ || !this.isRunActive(runEpochArg)
1225
+ || runController.signal.aborted) {
1226
+ return Promise.reject(new LiveBrowserRunAbortedError(`Cannot start ${operationNameArg} for inactive run ${runEpochArg}`));
1227
+ }
1228
+ const operationController = new AbortController();
1229
+ this.operationControllers.add(operationController);
1230
+ const abortFromRun = () => {
1231
+ const reason = runController.signal.reason instanceof Error
1232
+ ? runController.signal.reason
1233
+ : new LiveBrowserRunAbortedError(`Live browser renderer run ${runEpochArg} was interrupted`);
1234
+ operationController.abort(reason);
1235
+ };
1236
+ runController.signal.addEventListener('abort', abortFromRun, { once: true });
1237
+ const timeout = globalThis.setTimeout(() => {
1238
+ operationController.abort(new LiveBrowserOperationTimeoutError(`${operationNameArg} timed out after ${timeoutMsArg}ms`));
1239
+ }, timeoutMsArg);
1240
+ let abortOperation = () => undefined;
1241
+ const operation = new Promise((resolve, reject) => {
1242
+ let settled = false;
1243
+ const settle = (callbackArg) => {
1244
+ if (!settled) {
1245
+ settled = true;
1246
+ callbackArg();
1247
+ }
1248
+ };
1249
+ abortOperation = () => {
1250
+ const reason = operationController.signal.reason instanceof Error
1251
+ ? operationController.signal.reason
1252
+ : new LiveBrowserRunAbortedError(`${operationNameArg} was aborted`);
1253
+ settle(() => reject(reason));
1254
+ };
1255
+ operationController.signal.addEventListener('abort', abortOperation, { once: true });
1256
+ let operationResult;
1257
+ try {
1258
+ operationResult = operationArg(operationController.signal);
1259
+ }
1260
+ catch (error) {
1261
+ settle(() => reject(error));
1262
+ return;
1263
+ }
1264
+ operationResult.then((valueArg) => {
1265
+ settle(() => resolve(valueArg));
1266
+ }, (errorArg) => {
1267
+ settle(() => reject(errorArg));
1268
+ });
1269
+ }).finally(() => {
1270
+ globalThis.clearTimeout(timeout);
1271
+ runController.signal.removeEventListener('abort', abortFromRun);
1272
+ operationController.signal.removeEventListener('abort', abortOperation);
1273
+ this.operationControllers.delete(operationController);
1274
+ });
1275
+ return operation;
1276
+ }
1277
+ async decodeFrame(blobArg, runEpochArg) {
1278
+ let decodeOperation;
1279
+ try {
1280
+ decodeOperation = createImageBitmap(blobArg);
1281
+ }
1282
+ catch (error) {
1283
+ throw error;
1284
+ }
1285
+ let rawDecodeSettlementPromise;
1286
+ rawDecodeSettlementPromise = decodeOperation.then(() => undefined, () => undefined).finally(() => {
1287
+ this.rawDecodeSettlementPromises.delete(rawDecodeSettlementPromise);
1288
+ });
1289
+ this.rawDecodeSettlementPromises.add(rawDecodeSettlementPromise);
1290
+ try {
1291
+ return await this.runAbortableOperation(async () => decodeOperation, this.frameDecodeTimeoutMs, 'frame decode', runEpochArg);
1292
+ }
1293
+ catch (error) {
1294
+ if (error instanceof LiveBrowserOperationTimeoutError
1295
+ || error instanceof LiveBrowserRunAbortedError) {
1296
+ void decodeOperation.then((lateBitmapArg) => lateBitmapArg.close(), () => undefined);
1297
+ throw error;
1298
+ }
1299
+ throw new LiveBrowserFrameIntegrityError(`frame bytes could not be decoded: ${getErrorMessage(error)}`, { cause: error });
1300
+ }
1301
+ }
1302
+ isRunActive(runEpochArg) {
1303
+ return Boolean(this.running
1304
+ && !this.stopping
1305
+ && runEpochArg === this.runEpoch
1306
+ && this.runController
1307
+ && !this.runController.signal.aborted);
1308
+ }
1309
+ validateFrame(frameArg) {
1310
+ if (!frameArg || typeof frameArg !== 'object') {
1311
+ throw new LiveBrowserFrameProtocolError('frame must be an object');
1312
+ }
1313
+ if (typeof frameArg.tabId !== 'string'
1314
+ || frameArg.tabId.length === 0
1315
+ || frameArg.tabId.length > 4096) {
1316
+ throw new LiveBrowserFrameProtocolError('frame.tabId must be a non-empty bounded string');
1317
+ }
1318
+ this.validateProtocolInteger(frameArg.sequence, 'frame.sequence', 1);
1319
+ this.validateProtocolInteger(frameArg.generation, 'frame.generation', 1);
1320
+ this.validateProtocolInteger(frameArg.viewportRevision, 'frame.viewportRevision', 1);
1321
+ this.validateViewport(frameArg.viewport, 'frame.viewport');
1322
+ if (frameArg.format !== 'jpeg' && frameArg.format !== 'png') {
1323
+ throw new LiveBrowserFrameProtocolError('frame.format must be jpeg or png');
1324
+ }
1325
+ const expectedMimeType = frameArg.format === 'jpeg' ? 'image/jpeg' : 'image/png';
1326
+ if (frameArg.mimeType !== expectedMimeType) {
1327
+ throw new LiveBrowserFrameProtocolError(`frame.mimeType must be ${expectedMimeType} for ${frameArg.format}`);
1328
+ }
1329
+ this.validateProtocolInteger(frameArg.width, 'frame.width', 1, maxFrameDimension);
1330
+ this.validateProtocolInteger(frameArg.height, 'frame.height', 1, maxFrameDimension);
1331
+ if (frameArg.width * frameArg.height > maxFramePixelArea) {
1332
+ throw new LiveBrowserFrameProtocolError(`frame pixel area must not exceed ${maxFramePixelArea}`);
1333
+ }
1334
+ if (!(frameArg.data instanceof Uint8Array)) {
1335
+ throw new LiveBrowserFrameProtocolError('frame.data must be a Uint8Array');
1336
+ }
1337
+ if (frameArg.data.byteLength === 0 || frameArg.data.byteLength > maxFrameByteLength) {
1338
+ throw new LiveBrowserFrameProtocolError(`frame.data byte length must be between 1 and ${maxFrameByteLength}`);
1339
+ }
1340
+ const metadata = frameArg.metadata;
1341
+ if (!metadata || typeof metadata !== 'object') {
1342
+ throw new LiveBrowserFrameProtocolError('frame.metadata must be an object');
1343
+ }
1344
+ this.validateProtocolNumber(metadata.offsetTop, 'frame.metadata.offsetTop');
1345
+ this.validateProtocolNumber(metadata.pageScaleFactor, 'frame.metadata.pageScaleFactor', true);
1346
+ this.validateProtocolNumber(metadata.deviceWidth, 'frame.metadata.deviceWidth', true);
1347
+ this.validateProtocolNumber(metadata.deviceHeight, 'frame.metadata.deviceHeight', true);
1348
+ if (metadata.deviceWidth > maxFrameDimension
1349
+ || metadata.deviceHeight > maxFrameDimension
1350
+ || metadata.deviceWidth * metadata.deviceHeight > maxFramePixelArea) {
1351
+ throw new LiveBrowserFrameProtocolError(`frame metadata dimensions must fit within ${maxFramePixelArea} pixels`);
1352
+ }
1353
+ this.validateProtocolNumber(metadata.scrollOffsetX, 'frame.metadata.scrollOffsetX');
1354
+ this.validateProtocolNumber(metadata.scrollOffsetY, 'frame.metadata.scrollOffsetY');
1355
+ if (metadata.timestamp !== undefined) {
1356
+ this.validateProtocolNumber(metadata.timestamp, 'frame.metadata.timestamp');
1357
+ }
1358
+ }
1359
+ validateViewport(viewportArg, nameArg) {
1360
+ if (!viewportArg || typeof viewportArg !== 'object') {
1361
+ throw new LiveBrowserFrameProtocolError(`${nameArg} must be an object`);
1362
+ }
1363
+ this.validateProtocolInteger(viewportArg.width, `${nameArg}.width`, 1, maxViewportWidth);
1364
+ this.validateProtocolInteger(viewportArg.height, `${nameArg}.height`, 1, maxViewportHeight);
1365
+ this.validateProtocolNumber(viewportArg.deviceScaleFactor, `${nameArg}.deviceScaleFactor`, true);
1366
+ if (viewportArg.deviceScaleFactor > maxDeviceScaleFactor) {
1367
+ throw new LiveBrowserFrameProtocolError(`${nameArg}.deviceScaleFactor must not exceed ${maxDeviceScaleFactor}`);
1368
+ }
1369
+ const physicalArea = viewportArg.width
1370
+ * viewportArg.height
1371
+ * viewportArg.deviceScaleFactor
1372
+ * viewportArg.deviceScaleFactor;
1373
+ if (physicalArea > maxFramePixelArea) {
1374
+ throw new LiveBrowserFrameProtocolError(`${nameArg} physical pixel area must not exceed ${maxFramePixelArea}`);
1375
+ }
1376
+ }
1377
+ validateProtocolInteger(valueArg, nameArg, minimumArg, maximumArg = Number.MAX_SAFE_INTEGER) {
1378
+ if (!Number.isSafeInteger(valueArg)
1379
+ || valueArg < minimumArg
1380
+ || valueArg > maximumArg) {
1381
+ throw new LiveBrowserFrameProtocolError(`${nameArg} must be an integer between ${minimumArg} and ${maximumArg}`);
1382
+ }
1383
+ }
1384
+ validateProtocolNumber(valueArg, nameArg, positiveArg = false) {
1385
+ if (!Number.isFinite(valueArg) || (positiveArg && valueArg <= 0)) {
1386
+ throw new LiveBrowserFrameProtocolError(`${nameArg} must be a ${positiveArg ? 'positive ' : ''}finite number`);
1387
+ }
1388
+ }
1389
+ releasePointerCapture(pointerIdArg) {
1390
+ this.capturedPointerIds.delete(pointerIdArg);
1391
+ try {
1392
+ if (this.canvas.hasPointerCapture(pointerIdArg)) {
1393
+ this.canvas.releasePointerCapture(pointerIdArg);
1394
+ }
1395
+ }
1396
+ catch {
1397
+ // Pointer capture may already have been released by the browser.
1398
+ }
1399
+ }
1400
+ releasePointerCaptures() {
1401
+ const pointerIds = [...this.capturedPointerIds];
1402
+ this.capturedPointerIds.clear();
1403
+ for (const pointerId of pointerIds) {
1404
+ this.releasePointerCapture(pointerId);
1405
+ }
1406
+ }
1407
+ }
1408
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5saXZlYnJvd3NlcmNhbnZhc3JlbmRlcmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfd2ViL2NsYXNzZXMubGl2ZWJyb3dzZXJjYW52YXNyZW5kZXJlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpQkEsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLENBQUM7QUFDaEMsTUFBTSwwQkFBMEIsR0FBRyxFQUFFLENBQUM7QUFDdEMsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLENBQUM7QUFDbEMsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUM7QUFDaEMsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUM7QUFDbEMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztBQUM3RCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQztBQUM5QixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQztBQUMvQixNQUFNLG9CQUFvQixHQUFHLENBQUMsQ0FBQztBQUMvQixNQUFNLG1CQUFtQixHQUFHLEtBQUssQ0FBQztBQUNsQyxNQUFNLHlCQUF5QixHQUFHLEtBQUssQ0FBQztBQUV4QyxNQUFNLGdDQUFpQyxTQUFRLEtBQUs7Q0FBRztBQUN2RCxNQUFNLDBCQUEyQixTQUFRLEtBQUs7Q0FBRztBQUNqRCxNQUFNLDZCQUE4QixTQUFRLEtBQUs7Q0FBRztBQUNwRCxNQUFNLDhCQUErQixTQUFRLEtBQUs7Q0FBRztBQThCckQsTUFBTSxjQUFjLEdBQUcsQ0FDckIsUUFBOEIsRUFDOUIsU0FBK0IsRUFDdEIsRUFBRSxDQUFDLENBQ1osUUFBUSxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsS0FBSztPQUMvQixRQUFRLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxNQUFNO09BQ3BDLFFBQVEsQ0FBQyxpQkFBaUIsS0FBSyxTQUFTLENBQUMsaUJBQWlCLENBQzlELENBQUM7QUFFRixNQUFNLGVBQWUs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