From ffc59599945ed2f8edf50da273be063248493d5d Mon Sep 17 00:00:00 2001 From: webadderall <131426131+webadderall@users.noreply.github.com> Date: Sat, 18 Apr 2026 18:22:49 +1000 Subject: [PATCH] fix: address CodeRabbit review feedback - Fix telemetry drift reset: use nextExpectedMs - now for delay instead of stale drift value after baseline reset (avoids 1ms rapid sample) - Use RECORDER_TIMESLICE_MS for mic fallback recorder (was hardcoded 1000) - Return requested timeMs in extensionHost getCursorAt boundary clamps - Remove premature null of webcam URL to prevent flicker on path change - Use fs.realpath in IPC get-local-media-url to match media server check --- electron/ipc/cursor/telemetry.ts | 2 +- electron/ipc/register/project.ts | 9 +++++++-- src/components/video-editor/VideoEditor.tsx | 1 - src/hooks/useScreenRecorder.ts | 2 +- src/lib/extensions/extensionHost.ts | 4 ++-- 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/electron/ipc/cursor/telemetry.ts b/electron/ipc/cursor/telemetry.ts index 4ab9be89..aa6f4784 100644 --- a/electron/ipc/cursor/telemetry.ts +++ b/electron/ipc/cursor/telemetry.ts @@ -177,7 +177,7 @@ export function startCursorSampling() { nextExpectedMs = now + CURSOR_SAMPLE_INTERVAL_MS; } - const delay = Math.max(1, CURSOR_SAMPLE_INTERVAL_MS - drift); + const delay = Math.max(1, nextExpectedMs - now); setCursorCaptureInterval(setTimeout(tick, delay)); }; diff --git a/electron/ipc/register/project.ts b/electron/ipc/register/project.ts index 1831247b..a6e9d4c9 100644 --- a/electron/ipc/register/project.ts +++ b/electron/ipc/register/project.ts @@ -379,12 +379,17 @@ export function registerProjectHandlers() { } }); - ipcMain.handle('get-local-media-url', (_, filePath: string) => { + ipcMain.handle('get-local-media-url', async (_, filePath: string) => { const baseUrl = getMediaServerBaseUrl(); if (!baseUrl || !filePath) { return { success: false as const }; } - const resolved = path.resolve(filePath); + let resolved: string; + try { + resolved = await fs.realpath(path.resolve(filePath)); + } catch { + return { success: false as const }; + } if (!approvedLocalReadPaths.has(resolved)) { console.warn(`[get-local-media-url] Blocked unapproved path: ${resolved}`); return { success: false as const }; diff --git a/src/components/video-editor/VideoEditor.tsx b/src/components/video-editor/VideoEditor.tsx index d4932609..cefb383b 100644 --- a/src/components/video-editor/VideoEditor.tsx +++ b/src/components/video-editor/VideoEditor.tsx @@ -1807,7 +1807,6 @@ export default function VideoEditor() { setResolvedWebcamVideoUrl(null); return; } - setResolvedWebcamVideoUrl(null); void resolveVideoUrl(webcam.sourcePath).then((url) => { if (!cancelled) setResolvedWebcamVideoUrl(url); }); diff --git a/src/hooks/useScreenRecorder.ts b/src/hooks/useScreenRecorder.ts index 5835f943..92684579 100644 --- a/src/hooks/useScreenRecorder.ts +++ b/src/hooks/useScreenRecorder.ts @@ -968,7 +968,7 @@ export function useScreenRecorder(): UseScreenRecorderReturn { micFallbackChunks.current.push(event.data); } }; - recorder.start(1000); + recorder.start(RECORDER_TIMESLICE_MS); micFallbackRecorder.current = recorder; } catch (micError) { console.warn("Browser microphone fallback failed:", micError); diff --git a/src/lib/extensions/extensionHost.ts b/src/lib/extensions/extensionHost.ts index f7f7919e..9361c22d 100644 --- a/src/lib/extensions/extensionHost.ts +++ b/src/lib/extensions/extensionHost.ts @@ -854,8 +854,8 @@ export class ExtensionHost { const t = host._cursorTelemetry; if (!t || t.length === 0) return null; - if (timeMs <= t[0].timeMs) return { ...t[0] }; - if (timeMs >= t[t.length - 1].timeMs) return { ...t[t.length - 1] }; + if (timeMs <= t[0].timeMs) return { ...t[0], timeMs }; + if (timeMs >= t[t.length - 1].timeMs) return { ...t[t.length - 1], timeMs }; let lo = 0; let hi = t.length - 1;