diff options
| author | joonhoekim <26rote@gmail.com> | 2025-11-03 10:39:51 +0900 |
|---|---|---|
| committer | joonhoekim <26rote@gmail.com> | 2025-11-03 10:39:51 +0900 |
| commit | 1c5dd9c10ce4264ab157f4a2479e2055a3487de4 (patch) | |
| tree | e05cefb406b87d6152a7c08a5b96057528c796b5 /lib | |
| parent | 98d178c8fe20a61a87e5d8f20e7d310ff6fefd6b (diff) | |
(김준회) 벤더 로그인화면 영상 더 크게 변경
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/service-worker/register.ts | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/lib/service-worker/register.ts b/lib/service-worker/register.ts new file mode 100644 index 00000000..0ae9ab2b --- /dev/null +++ b/lib/service-worker/register.ts @@ -0,0 +1,118 @@ +/** + * Service Worker 등록 유틸리티 + * + * 클라이언트 측에서 Service Worker를 등록하고 + * 캐시 상태를 확인할 수 있는 헬퍼 함수들 + */ + +export interface CacheStatus { + total: number; + cached: number; + urls: Array<{ url: string; cached: boolean }>; +} + +/** + * Service Worker 등록 + */ +export async function registerServiceWorker(): Promise<ServiceWorkerRegistration | null> { + if (typeof window === 'undefined' || !('serviceWorker' in navigator)) { + console.log('Service Worker not supported'); + 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<CacheStatus | null> { + 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<boolean> { + 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<boolean> { + 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; + } +} + |
