From c766df6164ce5dcde6b3aa617d8d29c436d7fc7e Mon Sep 17 00:00:00 2001 From: amhsirak Date: Mon, 6 Jan 2025 11:55:15 +0530 Subject: [PATCH] feat: emit screenshot using screenshot queue --- .../classes/RemoteBrowser.ts | 42 +++++++++++++++---- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/server/src/browser-management/classes/RemoteBrowser.ts b/server/src/browser-management/classes/RemoteBrowser.ts index 53df4900..62958fe1 100644 --- a/server/src/browser-management/classes/RemoteBrowser.ts +++ b/server/src/browser-management/classes/RemoteBrowser.ts @@ -614,11 +614,39 @@ export class RemoteBrowser { * @param payload the screenshot binary data * @returns void */ - private emitScreenshot = (payload: any): void => { - this.performanceMonitor.measureEmitPerformance(() => { - const dataWithMimeType = ('data:image/jpeg;base64,').concat(payload); - this.socket.emit('screencast', dataWithMimeType); - logger.log('debug', `Screenshot emitted`); - }); - }; + private emitScreenshot = throttle(async (payload: Buffer): Promise => { + if (this.isProcessingScreenshot) { + if (this.screenshotQueue.length < SCREENCAST_CONFIG.maxQueueSize) { + this.screenshotQueue.push(payload); + } + return; + } + + this.isProcessingScreenshot = true; + + try { + await this.performanceMonitor.measureEmitPerformance(async () => { + const optimizedScreenshot = await this.optimizeScreenshot(payload); + const base64Data = optimizedScreenshot.toString('base64'); + const dataWithMimeType = `data:image/jpeg;base64,${base64Data}`; + + await new Promise((resolve) => { + this.socket.emit('screencast', dataWithMimeType, () => resolve()); + }); + }); + } catch (error) { + logger.error('Screenshot emission failed:', error); + } finally { + this.isProcessingScreenshot = false; + + // Process next screenshot in queue if any + if (this.screenshotQueue.length > 0) { + const nextScreenshot = this.screenshotQueue.shift(); + if (nextScreenshot) { + this.emitScreenshot(nextScreenshot); + } + } + } + }, 1000 / SCREENCAST_CONFIG.targetFPS); + }