From e2147bec63cf167e703c9fcdf91279427cb367ad Mon Sep 17 00:00:00 2001 From: Prayas Lashkari Date: Tue, 17 Mar 2026 13:48:31 -0400 Subject: [PATCH] feat: enhance restart recording functionality to prevent concurrent restarts --- src/hooks/useScreenRecorder.ts | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/hooks/useScreenRecorder.ts b/src/hooks/useScreenRecorder.ts index a69da59..cce4df2 100644 --- a/src/hooks/useScreenRecorder.ts +++ b/src/hooks/useScreenRecorder.ts @@ -63,6 +63,7 @@ export function useScreenRecorder(): UseScreenRecorderReturn { const chunks = useRef([]); const startTime = useRef(0); const discardRecording = useRef(false); + const restarting = useRef(false); const selectMimeType = () => { const preferred = [ @@ -378,22 +379,26 @@ export function useScreenRecorder(): UseScreenRecorderReturn { }; const restartRecording = async () => { - if (!recording) return; + if (restarting.current) return; + + const recorder = mediaRecorder.current; + if (!recorder || recorder.state !== "recording") return; + + restarting.current = true; discardRecording.current = true; - // Wait for the old recorder's onstop to fully complete before starting - // a new session, so the discard logic doesn't race with new chunks. const waitForStop = new Promise((resolve) => { - if (mediaRecorder.current) { - mediaRecorder.current.addEventListener("stop", () => resolve(), { once: true }); - } else { - resolve(); - } + recorder.addEventListener("stop", () => resolve(), { once: true }); }); stopRecording.current(); await waitForStop; - await startRecording(); + + try { + await startRecording(); + } finally { + restarting.current = false; + } }; return {