- 1// Service Worker for persistent audio across pages
- 2const CACHE_NAME = 'paranormal-fm-v1';
- 3const AUDIO_STATE_KEY = 'paranormal_fm_audio_state';
- 4
- 5// Install event
- 6self.addEventListener('install', (event) => {
- 7 console.log('Paranormal FM Service Worker installing...');
- 8 self.skipWaiting();
- 9});
- 10
- 11// Activate event
- 12self.addEventListener('activate', (event) => {
- 13 console.log('Paranormal FM Service Worker activated');
- 14 event.waitUntil(self.clients.claim());
- 15});
- 16
- 17// Audio state management
- 18let audioState = {
- 19 isPlaying: false,
- 20 currentTime: 0,
- 21 volume: 1,
- 22 streamUrl: '',
- 23 lastUpdate: Date.now()
- 24};
- 25
- 26// Message handling for audio state
- 27self.addEventListener('message', (event) => {
- 28 const { type, data } = event.data;
- 29
- 30 switch (type) {
- 31 case 'AUDIO_STATE_UPDATE':
- 32 audioState = { ...audioState, ...data, lastUpdate: Date.now() };
- 33 console.log('Service Worker: Audio state updated', audioState);
- 34
- 35 // Broadcast to all clients
- 36 self.clients.matchAll().then(clients => {
- 37 clients.forEach(client => {
- 38 client.postMessage({
- 39 type: 'AUDIO_STATE_SYNC',
- 40 data: audioState
- 41 });
- 42 });
- 43 });
- 44 break;
- 45
- 46 case 'GET_AUDIO_STATE':
- 47 event.ports[0].postMessage({
- 48 type: 'AUDIO_STATE_RESPONSE',
- 49 data: audioState
- 50 });
- 51 break;
- 52
- 53 case 'AUDIO_PLAY':
- 54 audioState.isPlaying = true;
- 55 audioState.lastUpdate = Date.now();
- 56 broadcastToClients('AUDIO_PLAY_COMMAND', audioState);
- 57 break;
- 58
- 59 case 'AUDIO_PAUSE':
- 60 audioState.isPlaying = false;
- 61 audioState.lastUpdate = Date.now();
- 62 broadcastToClients('AUDIO_PAUSE_COMMAND', audioState);
- 63 break;
- 64 }
- 65});
- 66
- 67function broadcastToClients(type, data) {
- 68 self.clients.matchAll().then(clients => {
- 69 clients.forEach(client => {
- 70 client.postMessage({ type, data });
- 71 });
- 72 });
- 73}
- 74
- 75// Keep service worker alive
- 76self.addEventListener('fetch', (event) => {
- 77 // Just return the request as-is, but keeps SW active
- 78 event.respondWith(fetch(event.request));
- 79});
Raw Paste