From 2cac34795e122364092c99062827f0178ecf4dc2 Mon Sep 17 00:00:00 2001 From: maziggy Date: Thu, 5 Feb 2026 11:05:46 +0100 Subject: [PATCH] Fix Safari camera stream failing with Service Worker error Camera streams on macOS Safari were failing with "FetchEvent.respondWith received an error: Load failed" because the Service Worker was intercepting MJPEG streaming responses. Safari has known issues handling continuous streaming responses through Service Workers. - Add exclusion for /camera/stream and /camera/snapshot URLs in SW fetch handler - Bump cache version to v24 to force SW update on clients The camera components already have robust error handling with reconnect logic, so bypassing the SW for these endpoints is safe and improves performance. --- frontend/public/sw.js | 9 +++++++-- static/sw.js | 9 +++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/frontend/public/sw.js b/frontend/public/sw.js index 674403521..e9631fb1f 100644 --- a/frontend/public/sw.js +++ b/frontend/public/sw.js @@ -1,6 +1,6 @@ // Bambuddy Service Worker -const CACHE_NAME = 'bambuddy-v23'; -const STATIC_CACHE = 'bambuddy-static-v23'; +const CACHE_NAME = 'bambuddy-v24'; +const STATIC_CACHE = 'bambuddy-static-v24'; // Static assets to cache on install const STATIC_ASSETS = [ @@ -62,6 +62,11 @@ self.addEventListener('fetch', (event) => { return; } + // Skip camera stream/snapshot requests - Safari has issues with streaming through SW + if (url.pathname.includes('/camera/stream') || url.pathname.includes('/camera/snapshot')) { + return; + } + // API requests - network first, no cache (real-time data is critical) if (url.pathname.startsWith('/api/')) { event.respondWith( diff --git a/static/sw.js b/static/sw.js index 674403521..e9631fb1f 100644 --- a/static/sw.js +++ b/static/sw.js @@ -1,6 +1,6 @@ // Bambuddy Service Worker -const CACHE_NAME = 'bambuddy-v23'; -const STATIC_CACHE = 'bambuddy-static-v23'; +const CACHE_NAME = 'bambuddy-v24'; +const STATIC_CACHE = 'bambuddy-static-v24'; // Static assets to cache on install const STATIC_ASSETS = [ @@ -62,6 +62,11 @@ self.addEventListener('fetch', (event) => { return; } + // Skip camera stream/snapshot requests - Safari has issues with streaming through SW + if (url.pathname.includes('/camera/stream') || url.pathname.includes('/camera/snapshot')) { + return; + } + // API requests - network first, no cache (real-time data is critical) if (url.pathname.startsWith('/api/')) { event.respondWith(