From 6236d2a13d10a78d4640fae92b0a24357d517237 Mon Sep 17 00:00:00 2001 From: Marcus Schiesser Date: Thu, 19 Mar 2026 20:03:55 +0800 Subject: [PATCH] fix: handle export and camera access edge cases --- package-lock.json | 4 ++++ src/lib/exporter/frameRenderer.ts | 6 +++--- src/lib/requestCameraAccess.ts | 15 ++++++++++++--- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 38d3e0c..58e37a3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -73,6 +73,10 @@ "vite-plugin-electron": "^0.28.6", "vite-plugin-electron-renderer": "^0.14.5", "vitest": "^4.0.16" + }, + "engines": { + "node": "22.22.1", + "npm": "10.9.4" } }, "node_modules/@alloc/quick-lru": { diff --git a/src/lib/exporter/frameRenderer.ts b/src/lib/exporter/frameRenderer.ts index 5ce5bfa..b928df2 100644 --- a/src/lib/exporter/frameRenderer.ts +++ b/src/lib/exporter/frameRenderer.ts @@ -336,7 +336,7 @@ export class FrameRenderer { } // Apply layout - this.updateLayout(); + this.updateLayout(webcamFrame); const timeMs = this.currentVideoTime * 1000; const TICKS_PER_FRAME = 1; @@ -400,7 +400,7 @@ export class FrameRenderer { } } - private updateLayout(): void { + private updateLayout(webcamFrame?: VideoFrame | null): void { if (!this.app || !this.videoSprite || !this.maskGraphics || !this.videoContainer) return; const { width, height } = this.config; @@ -426,7 +426,7 @@ export class FrameRenderer { canvasSize: { width, height }, maxContentSize: { width: viewportWidth, height: viewportHeight }, screenSize: { width: croppedVideoWidth, height: croppedVideoHeight }, - webcamSize: this.config.webcamSize, + webcamSize: webcamFrame ? this.config.webcamSize : null, layoutPreset: this.config.webcamLayoutPreset, }); if (!compositeLayout) return; diff --git a/src/lib/requestCameraAccess.ts b/src/lib/requestCameraAccess.ts index ed18f6f..2494224 100644 --- a/src/lib/requestCameraAccess.ts +++ b/src/lib/requestCameraAccess.ts @@ -15,9 +15,18 @@ function getDeniedStatus(error: unknown) { export async function requestCameraAccess(): Promise { if (window.electronAPI?.requestCameraAccess) { - const electronResult = await window.electronAPI.requestCameraAccess(); - if (!electronResult.success || !electronResult.granted) { - return electronResult; + try { + const electronResult = await window.electronAPI.requestCameraAccess(); + if (!electronResult.success || !electronResult.granted) { + return electronResult; + } + } catch (error) { + return { + success: false, + granted: false, + status: "error", + error: String(error), + }; } }