/** * Service Worker 등록 유틸리티 * * 클라이언트 측에서 Service Worker를 등록하고 * 캐시 상태를 확인할 수 있는 헬퍼 함수들 */ export interface CacheStatus { total: number; cached: number; urls: Array<{ url: string; cached: boolean }>; } /** * Service Worker 등록 */ export async function registerServiceWorker(): Promise { if (typeof window === 'undefined' || !('serviceWorker' in navigator)) { console.log('Service Worker not supported (supports https or localhost only)'); return null; } try { const registration = await navigator.serviceWorker.register('/service-worker.js', { scope: '/', }); console.log('Service Worker registered:', registration); // 업데이트 확인 registration.addEventListener('updatefound', () => { const newWorker = registration.installing; console.log('Service Worker update found'); newWorker?.addEventListener('statechange', () => { if (newWorker.state === 'installed' && navigator.serviceWorker.controller) { console.log('New Service Worker available. Refresh to update.'); // 필요시 사용자에게 알림 표시 가능 } }); }); return registration; } catch (error) { console.error('Service Worker registration failed:', error); return null; } } /** * Service Worker 캐시 상태 확인 */ export async function getCacheStatus(): Promise { if (typeof window === 'undefined' || !navigator.serviceWorker.controller) { return null; } return new Promise((resolve) => { const messageChannel = new MessageChannel(); messageChannel.port1.onmessage = (event) => { resolve(event.data); }; navigator.serviceWorker.controller.postMessage( { type: 'GET_CACHE_STATUS' }, [messageChannel.port2] ); // 타임아웃 설정 (3초) setTimeout(() => resolve(null), 3000); }); } /** * Service Worker 캐시 삭제 */ export async function clearCache(): Promise { if (typeof window === 'undefined' || !navigator.serviceWorker.controller) { return false; } return new Promise((resolve) => { const messageChannel = new MessageChannel(); messageChannel.port1.onmessage = (event) => { resolve(event.data.success); }; navigator.serviceWorker.controller.postMessage( { type: 'CLEAR_CACHE' }, [messageChannel.port2] ); setTimeout(() => resolve(false), 3000); }); } /** * Service Worker 등록 해제 */ export async function unregisterServiceWorker(): Promise { if (typeof window === 'undefined' || !('serviceWorker' in navigator)) { return false; } try { const registrations = await navigator.serviceWorker.getRegistrations(); for (const registration of registrations) { await registration.unregister(); } return true; } catch (error) { console.error('Service Worker unregistration failed:', error); return false; } }