// Minimal service worker — required for PWA installability. // No caching: all requests pass through to the network. // Exists solely so browsers recognize the site as installable // (iOS/Android persist camera permissions after "Add to Home Screen"). // // IMPORTANT: /hubs/ (SignalR) requests are excluded from interception entirely. // Service worker fetch() wraps SSE/WebSocket responses in a buffered Response, // which prevents real-time streaming — SignalR handshakes time out as a result. const SKIP_PREFIXES = ['/hubs/', '/Kiosk/PollSession']; self.addEventListener('install', () => self.skipWaiting()); self.addEventListener('activate', e => e.waitUntil(self.clients.claim())); self.addEventListener('fetch', e => { const url = new URL(e.request.url); // Always skip cross-origin requests if (url.origin !== self.location.origin) return; // Skip SignalR hubs and kiosk polling — let the browser handle these directly if (SKIP_PREFIXES.some(p => url.pathname.startsWith(p))) return; // Passthrough: no caching, no modification e.respondWith(fetch(e.request)); });