From 4123acda00b45330b767490aa646a28abb916472 Mon Sep 17 00:00:00 2001 From: Eric W Date: Thu, 26 Mar 2026 19:55:12 -0400 Subject: [PATCH] Fix 100% browser CPU on live dashboard caused by unstable SWR default The `= {}` destructuring default in useDeferredStreamMetadata created a new object reference every render while the SWR key was null (during the 2-second defer delay). This triggered an infinite re-render loop through useCameraLiveMode's useEffect dependency on streamMetadata. Replace with a module-level EMPTY_METADATA constant for referential stability. Upstream bug introduced in #21072 (97b29d17). Co-Authored-By: Claude Opus 4.6 --- web/src/hooks/use-deferred-stream-metadata.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web/src/hooks/use-deferred-stream-metadata.ts b/web/src/hooks/use-deferred-stream-metadata.ts index 8e68b6a6a..44bd1bb0c 100644 --- a/web/src/hooks/use-deferred-stream-metadata.ts +++ b/web/src/hooks/use-deferred-stream-metadata.ts @@ -5,6 +5,7 @@ import { LiveStreamMetadata } from "@/types/live"; const FETCH_TIMEOUT_MS = 10000; const DEFER_DELAY_MS = 2000; +const EMPTY_METADATA: { [key: string]: LiveStreamMetadata } = {}; /** * Hook that fetches go2rtc stream metadata with deferred loading. @@ -77,7 +78,7 @@ export default function useDeferredStreamMetadata(streamNames: string[]) { return metadata; }, []); - const { data: metadata = {} } = useSWR<{ + const { data: metadata = EMPTY_METADATA } = useSWR<{ [key: string]: LiveStreamMetadata; }>(swrKey, fetcher, { revalidateOnFocus: false,