diff --git a/furumi-node-player/client/public/sw.js b/furumi-node-player/client/public/sw.js index 6ef25be..a17ac24 100644 --- a/furumi-node-player/client/public/sw.js +++ b/furumi-node-player/client/public/sw.js @@ -1,22 +1,44 @@ -let bearerToken = null +const DB_NAME = 'furumi-sw' +const STORE = 'auth' +const KEY = 'bearer' -self.addEventListener('message', (e) => { - if (e.data?.type === 'SET_TOKEN') { - bearerToken = e.data.token +function openDB() { + return new Promise((resolve, reject) => { + const req = indexedDB.open(DB_NAME, 1) + req.onupgradeneeded = () => req.result.createObjectStore(STORE) + req.onsuccess = () => resolve(req.result) + req.onerror = () => reject(req.error) + }) +} + +async function getToken() { + try { + const db = await openDB() + return new Promise((resolve) => { + const tx = db.transaction(STORE, 'readonly') + const req = tx.objectStore(STORE).get(KEY) + req.onsuccess = () => resolve(req.result || null) + req.onerror = () => resolve(null) + }) + } catch { + return null } -}) +} self.addEventListener('fetch', (e) => { const url = new URL(e.request.url) - // Only intercept /api/ requests to the same origin if (url.origin !== self.location.origin || !url.pathname.startsWith('/api/')) return - if (!bearerToken) return - const authedRequest = new Request(e.request, { - headers: new Headers(e.request.headers), - }) - authedRequest.headers.set('Authorization', `Bearer ${bearerToken}`) - e.respondWith(fetch(authedRequest)) + e.respondWith( + (async () => { + const token = await getToken() + if (!token) return fetch(e.request) + + const headers = new Headers(e.request.headers) + headers.set('Authorization', `Bearer ${token}`) + return fetch(new Request(e.request, { headers })) + })() + ) }) self.addEventListener('install', () => self.skipWaiting()) diff --git a/furumi-node-player/client/src/furumiApi.ts b/furumi-node-player/client/src/furumiApi.ts index c37eee3..b7fc636 100644 --- a/furumi-node-player/client/src/furumiApi.ts +++ b/furumi-node-player/client/src/furumiApi.ts @@ -9,11 +9,14 @@ export const furumiApi = axios.create({ }) function sendTokenToSW(token: string) { - navigator.serviceWorker?.controller?.postMessage({ type: 'SET_TOKEN', token }) - // Also send to waiting/installing SW - navigator.serviceWorker?.ready.then((reg) => { - reg.active?.postMessage({ type: 'SET_TOKEN', token }) - }) + try { + const req = indexedDB.open('furumi-sw', 1) + req.onupgradeneeded = () => req.result.createObjectStore('auth') + req.onsuccess = () => { + const tx = req.result.transaction('auth', 'readwrite') + tx.objectStore('auth').put(token, 'bearer') + } + } catch { /* ignore */ } } export function setAuthToken(token: string) {