@cloudsignal/pwa-sdk 1.2.1 → 1.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/fingerprint.ts","../src/DeviceDetector.ts","../src/ServiceWorkerManager.ts","../src/InstallationManager.ts","../src/utils/jwt-auth.ts","../src/utils/storage.ts","../src/PushNotificationManager.ts","../src/HeartbeatManager.ts","../src/WakeLockManager.ts","../src/OfflineQueueManager.ts","../src/IOSInstallBannerI18n.ts","../src/IOSInstallBanner.ts","../src/CloudSignalPWA.ts","../src/NotificationPermissionPrompt.ts","../src/index.ts"],"names":["vendor","renderer","screen","makeAuthenticatedRequest","newInterval","STORAGE_KEY","DEFAULT_STYLES"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Browser Fingerprinting Utilities\n * Generate unique device identifiers for registration deduplication\n */\n\n/**\n * Generate a browser fingerprint using multiple signals\n * This is used to identify the same browser across sessions\n * \n * @returns Fingerprint string or null if generation fails\n */\nexport async function generateBrowserFingerprint(): Promise<string | null> {\n try {\n const components: string[] = []\n\n // Screen dimensions\n components.push(`${screen.width}x${screen.height}`)\n components.push(`${screen.colorDepth}`)\n\n // Timezone\n components.push(Intl.DateTimeFormat().resolvedOptions().timeZone)\n\n // Language\n components.push(navigator.language)\n\n // Platform\n components.push(navigator.platform)\n\n // Hardware concurrency\n if (navigator.hardwareConcurrency) {\n components.push(navigator.hardwareConcurrency.toString())\n }\n\n // Device memory (if available)\n if ((navigator as any).deviceMemory) {\n components.push((navigator as any).deviceMemory.toString())\n }\n\n // Canvas fingerprint\n const canvasFingerprint = getCanvasFingerprint()\n if (canvasFingerprint) {\n components.push(canvasFingerprint)\n }\n\n // WebGL fingerprint\n const webglFingerprint = getWebGLFingerprint()\n if (webglFingerprint) {\n components.push(webglFingerprint)\n }\n\n // Audio fingerprint\n const audioFingerprint = await getAudioFingerprint()\n if (audioFingerprint) {\n components.push(audioFingerprint)\n }\n\n // Combine all components and hash\n const combined = components.join('|')\n const hash = await hashString(combined)\n\n return hash\n } catch (error) {\n console.warn('Browser fingerprint generation failed:', error)\n return null\n }\n}\n\n/**\n * Get canvas fingerprint\n */\nfunction getCanvasFingerprint(): string | null {\n try {\n const canvas = document.createElement('canvas')\n const ctx = canvas.getContext('2d')\n if (!ctx) return null\n\n canvas.width = 200\n canvas.height = 50\n\n // Draw some text with specific styling\n ctx.textBaseline = 'alphabetic'\n ctx.fillStyle = '#f60'\n ctx.fillRect(125, 1, 62, 20)\n ctx.fillStyle = '#069'\n ctx.font = '11pt Arial'\n ctx.fillText('CloudSignal PWA', 2, 15)\n ctx.fillStyle = 'rgba(102, 204, 0, 0.7)'\n ctx.font = '18pt Arial'\n ctx.fillText('CloudSignal PWA', 4, 45)\n\n // Get data URL and extract relevant part\n const dataUrl = canvas.toDataURL()\n return dataUrl.slice(-50)\n } catch {\n return null\n }\n}\n\n/**\n * Get WebGL fingerprint\n */\nfunction getWebGLFingerprint(): string | null {\n try {\n const canvas = document.createElement('canvas')\n const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl')\n if (!gl) return null\n\n const webglCtx = gl as WebGLRenderingContext\n\n // Get renderer info\n const debugInfo = webglCtx.getExtension('WEBGL_debug_renderer_info')\n if (debugInfo) {\n const vendor = webglCtx.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL)\n const renderer = webglCtx.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL)\n return `${vendor}~${renderer}`\n }\n\n // Fallback to basic info\n const vendor = webglCtx.getParameter(webglCtx.VENDOR)\n const renderer = webglCtx.getParameter(webglCtx.RENDERER)\n return `${vendor}~${renderer}`\n } catch {\n return null\n }\n}\n\n/**\n * Get audio fingerprint using AudioContext\n */\nasync function getAudioFingerprint(): Promise<string | null> {\n try {\n const AudioContextClass = window.AudioContext || (window as any).webkitAudioContext\n if (!AudioContextClass) return null\n\n const audioContext = new AudioContextClass()\n const oscillator = audioContext.createOscillator()\n const analyser = audioContext.createAnalyser()\n const gainNode = audioContext.createGain()\n const scriptProcessor = audioContext.createScriptProcessor(4096, 1, 1)\n\n gainNode.gain.value = 0 // Mute\n oscillator.type = 'triangle'\n oscillator.connect(analyser)\n analyser.connect(scriptProcessor)\n scriptProcessor.connect(gainNode)\n gainNode.connect(audioContext.destination)\n\n oscillator.start(0)\n\n // Wait a bit for processing\n await new Promise(resolve => setTimeout(resolve, 100))\n\n const frequencyData = new Uint8Array(analyser.frequencyBinCount)\n analyser.getByteFrequencyData(frequencyData)\n\n // Calculate a simple hash from frequency data\n let sum = 0\n for (let i = 0; i < frequencyData.length; i++) {\n sum += frequencyData[i]\n }\n\n oscillator.stop()\n await audioContext.close()\n\n return sum.toString(36)\n } catch {\n return null\n }\n}\n\n/**\n * Hash a string using SHA-256\n */\nasync function hashString(str: string): Promise<string> {\n const encoder = new TextEncoder()\n const data = encoder.encode(str)\n const hashBuffer = await crypto.subtle.digest('SHA-256', data)\n const hashArray = Array.from(new Uint8Array(hashBuffer))\n return hashArray.map(b => b.toString(16).padStart(2, '0')).join('')\n}\n\n/**\n * Generate a simple tracking ID from device info\n * Less privacy-invasive than full fingerprinting\n */\nexport function generateTrackingId(\n os: string,\n osVersion: string,\n browser: string,\n browserVersion: string,\n deviceModel: string\n): string {\n const parts = [\n os,\n osVersion,\n browser,\n browserVersion,\n deviceModel,\n ].filter(Boolean)\n\n return parts.join('_').replace(/[^a-zA-Z0-9_]/g, '_')\n}\n","/**\n * DeviceDetector - Comprehensive Platform and Device Detection\n * Ported from bubble-pwa-complete-handler.js with TypeScript support\n */\n\nimport type {\n DeviceInfo,\n PlatformInfo,\n ScreenInfo,\n NetworkInfo,\n PWACapabilities,\n PWASupportLevel,\n NotificationPermissionState,\n} from './types'\nimport { generateTrackingId } from './utils/fingerprint'\n\n/**\n * DeviceDetector class for comprehensive device and platform detection\n */\nexport class DeviceDetector {\n private cachedInfo: DeviceInfo | null = null\n\n /**\n * Get comprehensive device information\n */\n getDeviceInfo(): DeviceInfo {\n if (this.cachedInfo) {\n return this.cachedInfo\n }\n\n const platform = this.getPlatformInfo()\n const screen = this.getScreenInfo()\n const network = this.getNetworkInfo()\n const capabilities = this.getCapabilities()\n\n const info: DeviceInfo = {\n // Operating System\n os: platform.os,\n osVersion: platform.osVersion,\n\n // Device\n deviceType: platform.deviceType,\n deviceModel: platform.deviceModel,\n isMobile: this.isMobile(),\n isTablet: this.isTablet(),\n isDesktop: this.isDesktop(),\n isWebView: platform.isWebView,\n\n // Browser\n browser: platform.browser,\n browserVersion: platform.browserVersion,\n\n // Platform Flags\n isIOS: platform.os === 'iOS',\n isAndroid: platform.os === 'Android',\n isMacOS: platform.os === 'macOS',\n isWindows: platform.os === 'Windows',\n isLinux: platform.os === 'Linux',\n\n // Screen\n screenWidth: screen.width,\n screenHeight: screen.height,\n pixelRatio: screen.pixelRatio,\n\n // PWA Capabilities\n supportLevel: capabilities.supportLevel,\n hasNotificationPermission: capabilities.notifications,\n hasPushManager: capabilities.push,\n hasServiceWorker: capabilities.serviceWorker,\n hasShareAPI: capabilities.share,\n hasBadgeAPI: capabilities.badge,\n\n // Permissions\n notificationPermission: this.getNotificationPermission(),\n\n // Network\n isOnline: network.isOnline,\n connectionType: network.connectionType,\n\n // Analytics\n platformIcon: this.getPlatformIcon(platform.os, platform.deviceType),\n userAgent: platform.userAgent,\n trackingId: generateTrackingId(\n platform.os,\n platform.osVersion,\n platform.browser,\n platform.browserVersion,\n platform.deviceModel\n ),\n }\n\n this.cachedInfo = info\n return info\n }\n\n /**\n * Clear cached device info (useful when network/permissions change)\n */\n clearCache(): void {\n this.cachedInfo = null\n }\n\n /**\n * Get platform-specific information\n */\n getPlatformInfo(): PlatformInfo {\n const userAgent = navigator.userAgent\n const platform = navigator.platform\n\n let os = 'Unknown'\n let osVersion = 'Unknown'\n let browser = 'Unknown'\n let browserVersion = 'Unknown'\n let deviceType = 'Unknown'\n let deviceModel = 'Unknown'\n let isWebView = false\n\n // Operating System Detection\n if (/iPad|iPhone|iPod/.test(userAgent) && !(window as any).MSStream) {\n os = 'iOS'\n const iosMatch = userAgent.match(/OS (\\d+)_(\\d+)_?(\\d+)?/)\n if (iosMatch) {\n osVersion = `${iosMatch[1]}.${iosMatch[2]}${iosMatch[3] ? '.' + iosMatch[3] : ''}`\n }\n if (/iPad/.test(userAgent)) {\n deviceType = 'iPad'\n deviceModel = this.detectiPadModel(userAgent)\n } else if (/iPhone/.test(userAgent)) {\n deviceType = 'iPhone'\n deviceModel = this.detectiPhoneModel(userAgent)\n } else if (/iPod/.test(userAgent)) {\n deviceType = 'iPod'\n deviceModel = 'iPod Touch'\n }\n } else if (/Android/.test(userAgent)) {\n os = 'Android'\n const androidMatch = userAgent.match(/Android (\\d+\\.?\\d*\\.?\\d*)/)\n if (androidMatch) {\n osVersion = androidMatch[1]\n }\n const deviceInfo = this.detectAndroidDevice(userAgent)\n deviceType = deviceInfo.type\n deviceModel = deviceInfo.model\n } else if (/Mac/.test(platform)) {\n os = 'macOS'\n const macMatch = userAgent.match(/Mac OS X (\\d+)[_.](\\d+)[_.]?(\\d+)?/)\n if (macMatch) {\n osVersion = `${macMatch[1]}.${macMatch[2]}${macMatch[3] ? '.' + macMatch[3] : ''}`\n }\n deviceType = 'Desktop'\n deviceModel = 'Mac'\n } else if (/Win/.test(platform)) {\n os = 'Windows'\n const winMatch = userAgent.match(/Windows NT (\\d+\\.\\d+)/)\n if (winMatch) {\n osVersion = this.getWindowsVersion(winMatch[1])\n }\n deviceType = 'Desktop'\n deviceModel = 'PC'\n } else if (/Linux/.test(platform)) {\n os = 'Linux'\n deviceType = 'Desktop'\n deviceModel = 'Linux PC'\n if (/Ubuntu/.test(userAgent)) osVersion = 'Ubuntu'\n else if (/Fedora/.test(userAgent)) osVersion = 'Fedora'\n else if (/Debian/.test(userAgent)) osVersion = 'Debian'\n }\n\n // Browser Detection\n if (/Chrome/.test(userAgent) && !/Edg/.test(userAgent) && !/OPR/.test(userAgent)) {\n browser = 'Chrome'\n const chromeMatch = userAgent.match(/Chrome\\/(\\d+\\.?\\d*\\.?\\d*\\.?\\d*)/)\n if (chromeMatch) browserVersion = chromeMatch[1]\n } else if (/Safari/.test(userAgent) && !/Chrome/.test(userAgent)) {\n browser = 'Safari'\n const safariMatch = userAgent.match(/Version\\/(\\d+\\.?\\d*\\.?\\d*)/)\n if (safariMatch) browserVersion = safariMatch[1]\n } else if (/Firefox/.test(userAgent)) {\n browser = 'Firefox'\n const firefoxMatch = userAgent.match(/Firefox\\/(\\d+\\.?\\d*\\.?\\d*)/)\n if (firefoxMatch) browserVersion = firefoxMatch[1]\n } else if (/Edg/.test(userAgent)) {\n browser = 'Edge'\n const edgeMatch = userAgent.match(/Edg\\/(\\d+\\.?\\d*\\.?\\d*\\.?\\d*)/)\n if (edgeMatch) browserVersion = edgeMatch[1]\n } else if (/OPR/.test(userAgent) || /Opera/.test(userAgent)) {\n browser = 'Opera'\n const operaMatch = userAgent.match(/(?:OPR|Opera)\\/(\\d+\\.?\\d*\\.?\\d*)/)\n if (operaMatch) browserVersion = operaMatch[1]\n } else if (/SamsungBrowser/.test(userAgent)) {\n browser = 'Samsung Internet'\n const samsungMatch = userAgent.match(/SamsungBrowser\\/(\\d+\\.?\\d*)/)\n if (samsungMatch) browserVersion = samsungMatch[1]\n }\n\n // WebView Detection\n isWebView = this.detectWebView(userAgent)\n\n return {\n os,\n osVersion,\n browser,\n browserVersion,\n deviceType,\n deviceModel,\n isWebView,\n userAgent,\n }\n }\n\n /**\n * Get screen information\n */\n getScreenInfo(): ScreenInfo {\n return {\n width: screen.width,\n height: screen.height,\n pixelRatio: window.devicePixelRatio || 1,\n orientation: screen.width > screen.height ? 'landscape' : 'portrait',\n }\n }\n\n /**\n * Get network information\n */\n getNetworkInfo(): NetworkInfo {\n const connection = (navigator as any).connection\n \n return {\n isOnline: navigator.onLine,\n connectionType: connection?.effectiveType || 'unknown',\n effectiveType: connection?.effectiveType,\n downlink: connection?.downlink,\n rtt: connection?.rtt,\n saveData: connection?.saveData,\n }\n }\n\n /**\n * Get PWA capabilities\n */\n getCapabilities(): PWACapabilities {\n const capabilities: PWACapabilities = {\n serviceWorker: 'serviceWorker' in navigator,\n push: 'PushManager' in window,\n notifications: 'Notification' in window,\n backgroundSync: 'serviceWorker' in navigator && 'SyncManager' in window,\n badge: 'setAppBadge' in navigator,\n share: 'share' in navigator,\n shareTarget: 'launchQueue' in window,\n fileSystemAccess: 'showOpenFilePicker' in window,\n contactPicker: 'ContactsManager' in window,\n periodicSync: 'serviceWorker' in navigator && 'PeriodicSyncManager' in window,\n supportLevel: 'none',\n }\n\n // Determine support level\n if (capabilities.serviceWorker && capabilities.push && capabilities.notifications) {\n capabilities.supportLevel = 'full'\n } else if (capabilities.serviceWorker && capabilities.notifications) {\n capabilities.supportLevel = 'partial'\n } else if (capabilities.serviceWorker) {\n capabilities.supportLevel = 'basic'\n }\n\n return capabilities\n }\n\n /**\n * Get notification permission state\n */\n getNotificationPermission(): NotificationPermissionState {\n if (!('Notification' in window)) {\n return 'denied'\n }\n return Notification.permission as NotificationPermissionState\n }\n\n /**\n * Check if device is mobile\n */\n isMobile(): boolean {\n const userAgent = navigator.userAgent\n return /Android|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test(userAgent)\n }\n\n /**\n * Check if device is tablet\n */\n isTablet(): boolean {\n const userAgent = navigator.userAgent\n return /iPad|Android(?!.*Mobile)|Tablet/i.test(userAgent)\n }\n\n /**\n * Check if device is desktop\n */\n isDesktop(): boolean {\n return !this.isMobile() && !this.isTablet()\n }\n\n /**\n * Get platform icon emoji\n */\n private getPlatformIcon(os: string, deviceType: string): string {\n if (os === 'iOS' || deviceType === 'iPhone' || deviceType === 'iPad') {\n return '📱'\n }\n if (os === 'Android') {\n return '🤖'\n }\n if (os === 'macOS') {\n return '💻'\n }\n return '🖥️'\n }\n\n /**\n * Detect iPhone model from user agent\n */\n private detectiPhoneModel(userAgent: string): string {\n // iPhone detection is limited due to Apple's privacy measures\n // We can make educated guesses based on screen size and iOS version\n const screenHeight = screen.height\n const screenWidth = screen.width\n const pixelRatio = window.devicePixelRatio || 1\n\n // Sort by common screen dimensions\n if (screenHeight === 932 || screenWidth === 932) return 'iPhone 15 Pro Max/14 Pro Max'\n if (screenHeight === 896 || screenWidth === 896) return 'iPhone 15 Pro/14 Pro/11 Pro Max'\n if (screenHeight === 852 || screenWidth === 852) return 'iPhone 15/14'\n if (screenHeight === 844 || screenWidth === 844) return 'iPhone 13/12'\n if (screenHeight === 812 || screenWidth === 812) return 'iPhone X/XS/11 Pro'\n if (screenHeight === 736 || screenWidth === 736) return 'iPhone 8 Plus'\n if (screenHeight === 667 || screenWidth === 667) return 'iPhone 8/SE'\n if (screenHeight === 568 || screenWidth === 568) return 'iPhone SE (1st)'\n\n return 'iPhone'\n }\n\n /**\n * Detect iPad model from user agent\n */\n private detectiPadModel(userAgent: string): string {\n const screenWidth = screen.width\n const screenHeight = screen.height\n const pixelRatio = window.devicePixelRatio || 1\n\n // iPad Pro 12.9\"\n if ((screenHeight === 1366 || screenWidth === 1366) && pixelRatio === 2) {\n return 'iPad Pro 12.9\"'\n }\n // iPad Pro 11\"\n if ((screenHeight === 1194 || screenWidth === 1194) && pixelRatio === 2) {\n return 'iPad Pro 11\"'\n }\n // iPad Air / iPad 10th gen\n if ((screenHeight === 1180 || screenWidth === 1180) && pixelRatio === 2) {\n return 'iPad Air/10th Gen'\n }\n // iPad mini\n if ((screenHeight === 1133 || screenWidth === 1133) && pixelRatio === 2) {\n return 'iPad mini'\n }\n // Standard iPad\n if ((screenHeight === 1024 || screenWidth === 1024)) {\n return 'iPad'\n }\n\n return 'iPad'\n }\n\n /**\n * Detect Android device model\n */\n private detectAndroidDevice(userAgent: string): { type: string; model: string } {\n let type = 'Phone'\n let model = 'Android Device'\n\n // Check if tablet\n if (/Tablet|SM-T|Tab|GT-P|MediaPad/i.test(userAgent)) {\n type = 'Tablet'\n }\n\n // Samsung devices\n if (/SM-S9\\d{2}/i.test(userAgent)) model = 'Samsung Galaxy S24'\n else if (/SM-S91\\d/i.test(userAgent)) model = 'Samsung Galaxy S23'\n else if (/SM-S90\\d/i.test(userAgent)) model = 'Samsung Galaxy S22'\n else if (/SM-G99\\d/i.test(userAgent)) model = 'Samsung Galaxy S21'\n else if (/SM-N9\\d{2}/i.test(userAgent)) model = 'Samsung Galaxy Note'\n else if (/SM-A\\d{2}/i.test(userAgent)) model = 'Samsung Galaxy A Series'\n else if (/SM-/i.test(userAgent)) {\n const match = userAgent.match(/SM-[A-Z]\\d+/i)\n if (match) model = `Samsung ${match[0]}`\n }\n\n // Google Pixel\n if (/Pixel 8/i.test(userAgent)) model = 'Google Pixel 8'\n else if (/Pixel 7/i.test(userAgent)) model = 'Google Pixel 7'\n else if (/Pixel 6/i.test(userAgent)) model = 'Google Pixel 6'\n else if (/Pixel/i.test(userAgent)) model = 'Google Pixel'\n\n // OnePlus\n if (/OnePlus/i.test(userAgent)) {\n const match = userAgent.match(/OnePlus[\\s]?(\\w+)/i)\n model = match ? `OnePlus ${match[1]}` : 'OnePlus'\n }\n\n // Xiaomi\n if (/Xiaomi|Redmi|POCO|Mi\\s/i.test(userAgent)) {\n if (/Redmi/i.test(userAgent)) model = 'Xiaomi Redmi'\n else if (/POCO/i.test(userAgent)) model = 'Xiaomi POCO'\n else model = 'Xiaomi'\n }\n\n // Huawei\n if (/HUAWEI|Honor/i.test(userAgent)) {\n model = /Honor/i.test(userAgent) ? 'Honor' : 'Huawei'\n }\n\n // OPPO\n if (/OPPO/i.test(userAgent)) model = 'OPPO'\n\n // Vivo\n if (/vivo/i.test(userAgent)) model = 'Vivo'\n\n return { type, model }\n }\n\n /**\n * Get Windows version from NT version\n */\n private getWindowsVersion(ntVersion: string): string {\n const versionMap: Record<string, string> = {\n '10.0': 'Windows 10/11',\n '6.3': 'Windows 8.1',\n '6.2': 'Windows 8',\n '6.1': 'Windows 7',\n '6.0': 'Windows Vista',\n '5.1': 'Windows XP',\n }\n return versionMap[ntVersion] || `Windows NT ${ntVersion}`\n }\n\n /**\n * Detect if running in WebView\n */\n private detectWebView(userAgent: string): boolean {\n // Facebook WebView\n if (/FBAN|FBAV/i.test(userAgent)) return true\n // Instagram WebView\n if (/Instagram/i.test(userAgent)) return true\n // LinkedIn WebView\n if (/LinkedIn/i.test(userAgent)) return true\n // Twitter WebView\n if (/Twitter/i.test(userAgent)) return true\n // WeChat WebView\n if (/MicroMessenger/i.test(userAgent)) return true\n // Snapchat WebView\n if (/Snapchat/i.test(userAgent)) return true\n // TikTok WebView\n if (/BytedanceWebview|TikTok/i.test(userAgent)) return true\n // Generic WebView detection\n if (/wv|WebView/i.test(userAgent)) return true\n\n return false\n }\n}\n\n// Export singleton instance\nexport const deviceDetector = new DeviceDetector()\n","/**\n * ServiceWorkerManager - Service Worker Registration and Management\n */\n\nimport type { ServiceWorkerConfig } from './types'\n\nexport interface ServiceWorkerManagerOptions {\n config?: ServiceWorkerConfig\n onRegistered?: (registration: ServiceWorkerRegistration) => void\n onUpdated?: (registration: ServiceWorkerRegistration) => void\n onError?: (error: Error) => void\n debug?: boolean\n}\n\n/**\n * ServiceWorkerManager handles service worker registration, updates, and communication\n */\nexport class ServiceWorkerManager {\n private registration: ServiceWorkerRegistration | null = null\n private config: ServiceWorkerConfig\n private debug: boolean\n private onRegistered?: (registration: ServiceWorkerRegistration) => void\n private onUpdated?: (registration: ServiceWorkerRegistration) => void\n private onError?: (error: Error) => void\n\n constructor(options: ServiceWorkerManagerOptions = {}) {\n this.config = {\n path: '/service-worker.js',\n scope: '/',\n autoRegister: true,\n updateBehavior: 'auto',\n ...options.config,\n }\n this.debug = options.debug ?? false\n this.onRegistered = options.onRegistered\n this.onUpdated = options.onUpdated\n this.onError = options.onError\n }\n\n /**\n * Check if service workers are supported\n */\n isSupported(): boolean {\n return 'serviceWorker' in navigator\n }\n\n /**\n * Get the current service worker registration\n */\n getRegistration(): ServiceWorkerRegistration | null {\n return this.registration\n }\n\n /**\n * Register the service worker\n */\n async register(): Promise<ServiceWorkerRegistration | null> {\n if (!this.isSupported()) {\n this.log('Service workers not supported')\n return null\n }\n\n try {\n // Determine path and scope based on environment\n const { path, scope } = this.getPathAndScope()\n \n this.log(`Registering service worker: ${path} with scope ${scope}`)\n\n const registration = await navigator.serviceWorker.register(path, { scope })\n this.registration = registration\n\n // Set up update handling\n registration.addEventListener('updatefound', () => {\n this.handleUpdateFound(registration)\n })\n\n // Wait for the service worker to be ready\n await navigator.serviceWorker.ready\n\n this.log('Service worker registered successfully')\n this.onRegistered?.(registration)\n\n return registration\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n this.log(`Service worker registration failed: ${err.message}`, 'error')\n this.onError?.(err)\n return null\n }\n }\n\n /**\n * Unregister the service worker\n */\n async unregister(): Promise<boolean> {\n if (!this.registration) {\n return false\n }\n\n try {\n const result = await this.registration.unregister()\n if (result) {\n this.registration = null\n this.log('Service worker unregistered')\n }\n return result\n } catch (error) {\n this.log(`Failed to unregister service worker: ${error}`, 'error')\n return false\n }\n }\n\n /**\n * Check for service worker updates\n */\n async checkForUpdate(): Promise<void> {\n if (!this.registration) {\n return\n }\n\n try {\n await this.registration.update()\n this.log('Checked for service worker update')\n } catch (error) {\n this.log(`Failed to check for update: ${error}`, 'error')\n }\n }\n\n /**\n * Wait for service worker to be ready\n */\n async waitForReady(timeout: number = 5000): Promise<ServiceWorkerRegistration | null> {\n if (!this.isSupported()) {\n return null\n }\n\n const timeoutPromise = new Promise<null>((resolve) => {\n setTimeout(() => resolve(null), timeout)\n })\n\n try {\n const registration = await Promise.race([\n navigator.serviceWorker.ready,\n timeoutPromise,\n ])\n\n if (registration) {\n this.registration = registration\n }\n\n return registration\n } catch {\n return null\n }\n }\n\n /**\n * Send a message to the service worker\n */\n postMessage(message: any): void {\n if (!this.registration?.active) {\n this.log('No active service worker to send message to', 'warn')\n return\n }\n\n this.registration.active.postMessage(message)\n }\n\n /**\n * Clear app badge via service worker\n */\n clearBadge(): void {\n this.postMessage({ type: 'CLEAR_BADGE' })\n }\n\n /**\n * Set app badge via service worker\n */\n setBadge(count: number): void {\n this.postMessage({ type: 'SET_BADGE', count })\n }\n\n /**\n * Handle service worker update found\n */\n private handleUpdateFound(registration: ServiceWorkerRegistration): void {\n const newWorker = registration.installing\n\n if (!newWorker) {\n return\n }\n\n newWorker.addEventListener('statechange', () => {\n if (newWorker.state === 'installed' && navigator.serviceWorker.controller) {\n this.log('New service worker available')\n \n if (this.config.updateBehavior === 'auto') {\n // Auto-activate new service worker\n newWorker.postMessage({ type: 'SKIP_WAITING' })\n }\n\n this.onUpdated?.(registration)\n }\n })\n }\n\n /**\n * Get service worker path and scope based on environment\n * Handles Bubble.io version-live/version-test paths\n */\n private getPathAndScope(): { path: string; scope: string } {\n // Use configured values if provided\n if (this.config.path && this.config.scope) {\n return { path: this.config.path, scope: this.config.scope }\n }\n\n try {\n const pathname = window.location.pathname || '/'\n\n // Bubble.io specific paths\n if (pathname.startsWith('/version-live')) {\n return {\n path: '/version-live/service-worker.js',\n scope: '/version-live/',\n }\n }\n if (pathname.startsWith('/version-test')) {\n return {\n path: '/version-test/service-worker.js',\n scope: '/version-test/',\n }\n }\n } catch {\n // Ignore errors\n }\n\n // Default\n return {\n path: this.config.path || '/service-worker.js',\n scope: this.config.scope || '/',\n }\n }\n\n /**\n * Log message if debug is enabled\n */\n private log(message: string, level: 'log' | 'warn' | 'error' = 'log'): void {\n if (!this.debug) return\n const prefix = '[CloudSignal PWA SW]'\n console[level](`${prefix} ${message}`)\n }\n}\n","/**\n * InstallationManager - PWA Installation Detection and Prompts\n */\n\nimport type {\n InstallationState,\n InstallResult,\n BeforeInstallPromptEvent,\n DisplayMode,\n} from './types'\n\nexport interface InstallationManagerOptions {\n onInstallAvailable?: (event: BeforeInstallPromptEvent) => void\n onInstallAccepted?: (result: InstallResult) => void\n onInstallDismissed?: (result: InstallResult) => void\n onInstalled?: () => void\n debug?: boolean\n}\n\n/**\n * InstallationManager handles PWA installation detection and prompts\n */\nexport class InstallationManager {\n private deferredPrompt: BeforeInstallPromptEvent | null = null\n private isInstalled: boolean = false\n private debug: boolean\n private onInstallAvailable?: (event: BeforeInstallPromptEvent) => void\n private onInstallAccepted?: (result: InstallResult) => void\n private onInstallDismissed?: (result: InstallResult) => void\n private onInstalled?: () => void\n\n constructor(options: InstallationManagerOptions = {}) {\n this.debug = options.debug ?? false\n this.onInstallAvailable = options.onInstallAvailable\n this.onInstallAccepted = options.onInstallAccepted\n this.onInstallDismissed = options.onInstallDismissed\n this.onInstalled = options.onInstalled\n\n this.detectInstallationStatus()\n }\n\n /**\n * Initialize event listeners\n */\n initialize(): void {\n // Listen for install prompt\n window.addEventListener('beforeinstallprompt', (event) => {\n event.preventDefault()\n this.deferredPrompt = event as BeforeInstallPromptEvent\n this.log('Install prompt available')\n this.onInstallAvailable?.(this.deferredPrompt)\n })\n\n // Listen for app installed\n window.addEventListener('appinstalled', () => {\n this.isInstalled = true\n this.deferredPrompt = null\n this.log('PWA was installed')\n this.onInstalled?.()\n })\n\n // Listen for display mode changes\n if (window.matchMedia) {\n const standaloneQuery = window.matchMedia('(display-mode: standalone)')\n standaloneQuery.addEventListener('change', (e) => {\n if (e.matches) {\n this.isInstalled = true\n this.log('App is now running in standalone mode')\n }\n })\n }\n }\n\n /**\n * Get current installation state\n */\n getState(): InstallationState {\n const displayMode = this.getDisplayMode()\n const isIOS = this.isIOSDevice()\n const isSafari = this.isSafariBrowser()\n\n return {\n isInstalled: this.isInstalled || displayMode !== 'browser',\n canBeInstalled: this.deferredPrompt !== null,\n needsManualInstall: isIOS && isSafari && !this.isInstalled,\n showManualInstructions: isIOS && isSafari && !this.isInstalled,\n installSteps: this.getInstallSteps(),\n displayMode,\n }\n }\n\n /**\n * Show the install prompt\n */\n async showInstallPrompt(): Promise<InstallResult> {\n if (!this.deferredPrompt) {\n this.log('No install prompt available', 'warn')\n return {\n accepted: false,\n outcome: 'dismissed',\n }\n }\n\n try {\n // Show the prompt\n await this.deferredPrompt.prompt()\n\n // Wait for the user's response\n const { outcome, platform } = await this.deferredPrompt.userChoice\n\n const result: InstallResult = {\n accepted: outcome === 'accepted',\n outcome,\n platform,\n }\n\n if (outcome === 'accepted') {\n this.log('User accepted install prompt')\n this.isInstalled = true\n this.onInstallAccepted?.(result)\n } else {\n this.log('User dismissed install prompt')\n this.onInstallDismissed?.(result)\n }\n\n // Clear the deferred prompt\n this.deferredPrompt = null\n\n return result\n } catch (error) {\n this.log(`Error showing install prompt: ${error}`, 'error')\n return {\n accepted: false,\n outcome: 'dismissed',\n }\n }\n }\n\n /**\n * Check if install prompt is available\n */\n canInstall(): boolean {\n return this.deferredPrompt !== null\n }\n\n /**\n * Check if PWA is installed\n */\n isPWAInstalled(): boolean {\n return this.isInstalled || this.getDisplayMode() !== 'browser'\n }\n\n /**\n * Get current display mode\n */\n getDisplayMode(): DisplayMode {\n if (window.matchMedia('(display-mode: standalone)').matches) {\n return 'standalone'\n }\n if (window.matchMedia('(display-mode: minimal-ui)').matches) {\n return 'minimal-ui'\n }\n if (window.matchMedia('(display-mode: fullscreen)').matches) {\n return 'fullscreen'\n }\n\n // iOS Safari standalone check\n if ((navigator as any).standalone === true) {\n return 'standalone'\n }\n\n return 'browser'\n }\n\n /**\n * Get installation steps for current platform\n */\n getInstallSteps(): string[] {\n if (this.isIOSDevice()) {\n return [\n 'Tap the Share button in Safari',\n 'Scroll down and tap \"Add to Home Screen\"',\n 'Tap \"Add\" to install the app',\n ]\n }\n\n if (this.isAndroidDevice()) {\n return [\n 'Tap the menu (three dots) in your browser',\n 'Tap \"Install App\" or \"Add to Home Screen\"',\n 'Follow the prompts to install',\n ]\n }\n\n // Desktop\n return [\n 'Click the install icon in the address bar',\n 'Or use the browser menu to install the app',\n 'Click \"Install\" when prompted',\n ]\n }\n\n /**\n * Detect initial installation status\n */\n private detectInstallationStatus(): void {\n // Check display mode\n if (this.getDisplayMode() !== 'browser') {\n this.isInstalled = true\n return\n }\n\n // iOS Safari standalone check\n if ((navigator as any).standalone === true) {\n this.isInstalled = true\n return\n }\n\n // Check for related apps (if available)\n if ('getInstalledRelatedApps' in navigator) {\n (navigator as any).getInstalledRelatedApps()\n .then((apps: any[]) => {\n if (apps.length > 0) {\n this.isInstalled = true\n }\n })\n .catch(() => {\n // Ignore errors\n })\n }\n }\n\n /**\n * Check if device is iOS\n */\n private isIOSDevice(): boolean {\n return /iPad|iPhone|iPod/.test(navigator.userAgent) && !(window as any).MSStream\n }\n\n /**\n * Check if device is Android\n */\n private isAndroidDevice(): boolean {\n return /Android/i.test(navigator.userAgent)\n }\n\n /**\n * Check if browser is Safari\n */\n private isSafariBrowser(): boolean {\n const userAgent = navigator.userAgent\n return /Safari/i.test(userAgent) && !/Chrome|CriOS|FxiOS/i.test(userAgent)\n }\n\n /**\n * Log message if debug is enabled\n */\n private log(message: string, level: 'log' | 'warn' | 'error' = 'log'): void {\n if (!this.debug) return\n const prefix = '[CloudSignal PWA Install]'\n console[level](`${prefix} ${message}`)\n }\n}\n","/**\n * JWT Authentication Utilities\n * Implements CloudSignal's JWT-based authentication for user-linked registrations\n */\n\n/**\n * Auth mode type\n */\nexport type AuthMode = 'hmac' | 'jwt'\n\n/**\n * JWT auth configuration\n */\nexport interface JWTAuthConfig {\n /** JWT token from identity provider (Supabase, Firebase, Auth0, etc.) */\n token: string\n /** Organization ID (still needed for provider config lookup) */\n organizationId: string\n /** Callback to refresh token when expired */\n onTokenExpired?: () => Promise<string>\n}\n\n/**\n * Generate authentication headers for JWT-based requests\n * \n * @param token - JWT token from identity provider\n * @param organizationId - Organization UUID\n * @returns Headers object with Bearer token and org ID\n */\nexport function generateJWTHeaders(\n token: string,\n organizationId: string\n): Record<string, string> {\n return {\n 'Authorization': `Bearer ${token}`,\n 'X-CloudSignal-Organization-ID': organizationId,\n 'Content-Type': 'application/json',\n }\n}\n\n/**\n * Make an authenticated request using JWT\n * Handles token refresh on 401 errors\n * \n * @param config - JWT auth configuration\n * @param method - HTTP method\n * @param url - Request URL\n * @param body - Request body (optional)\n * @returns Fetch Response\n */\nexport async function makeJWTAuthenticatedRequest(\n config: JWTAuthConfig,\n method: string,\n url: string,\n body?: Record<string, any>\n): Promise<Response> {\n const bodyStr = body ? JSON.stringify(body) : undefined\n \n let headers = generateJWTHeaders(config.token, config.organizationId)\n\n const options: RequestInit = {\n method,\n headers,\n }\n\n if (bodyStr) {\n options.body = bodyStr\n }\n\n let response = await fetch(url, options)\n\n // Handle token expiration - retry once with refreshed token\n if (response.status === 401 && config.onTokenExpired) {\n try {\n const newToken = await config.onTokenExpired()\n if (newToken) {\n // Retry with new token\n headers = generateJWTHeaders(newToken, config.organizationId)\n options.headers = headers\n response = await fetch(url, options)\n }\n } catch (refreshError) {\n // Token refresh failed, return original 401 response\n console.warn('[CloudSignal PWA] Token refresh failed:', refreshError)\n }\n }\n\n return response\n}\n\n/**\n * Auth context that can be passed to managers\n */\nexport interface AuthContext {\n mode: AuthMode\n organizationId: string\n // HMAC mode\n organizationSecret?: string\n // JWT mode\n userToken?: string\n onTokenExpired?: () => Promise<string>\n}\n\n/**\n * Create auth context from config\n * Determines auth mode based on provided credentials\n * \n * @param config - Configuration object\n * @returns Auth context with detected mode\n */\nexport function createAuthContext(config: {\n organizationId: string\n organizationSecret?: string\n userToken?: string\n onTokenExpired?: () => Promise<string>\n}): AuthContext {\n // JWT mode takes precedence if userToken is provided\n if (config.userToken) {\n return {\n mode: 'jwt',\n organizationId: config.organizationId,\n userToken: config.userToken,\n onTokenExpired: config.onTokenExpired,\n }\n }\n\n // Default to HMAC mode\n if (!config.organizationSecret) {\n throw new Error('Either userToken or organizationSecret is required')\n }\n\n return {\n mode: 'hmac',\n organizationId: config.organizationId,\n organizationSecret: config.organizationSecret,\n }\n}\n\n/**\n * Make authenticated request using auth context\n * Automatically selects HMAC or JWT based on context mode\n * \n * @param authContext - Auth context\n * @param method - HTTP method\n * @param url - Request URL\n * @param body - Request body (optional)\n * @param onTokenExpired - Token refresh callback (overrides context for this call)\n * @returns Fetch Response\n */\nexport async function makeAuthenticatedRequestWithContext(\n authContext: AuthContext,\n method: string,\n url: string,\n body?: Record<string, any>,\n onTokenExpired?: () => Promise<string>\n): Promise<Response> {\n if (authContext.mode === 'jwt') {\n if (!authContext.userToken) {\n throw new Error('userToken required for JWT auth mode')\n }\n return makeJWTAuthenticatedRequest(\n {\n token: authContext.userToken,\n organizationId: authContext.organizationId,\n // Allow override of token expired callback\n onTokenExpired: onTokenExpired || authContext.onTokenExpired,\n },\n method,\n url,\n body\n )\n }\n\n // HMAC mode - use existing utility\n const { makeAuthenticatedRequest } = await import('./hmac')\n if (!authContext.organizationSecret) {\n throw new Error('organizationSecret required for HMAC auth mode')\n }\n return makeAuthenticatedRequest(\n authContext.organizationId,\n authContext.organizationSecret,\n method,\n url,\n body\n )\n}\n\n/**\n * Update token in auth context (for JWT mode)\n * Returns a new context with updated token\n * \n * @param authContext - Current auth context\n * @param newToken - New JWT token\n * @returns Updated auth context\n */\nexport function updateAuthToken(\n authContext: AuthContext,\n newToken: string\n): AuthContext {\n if (authContext.mode !== 'jwt') {\n // Switch to JWT mode\n return {\n mode: 'jwt',\n organizationId: authContext.organizationId,\n userToken: newToken,\n onTokenExpired: authContext.onTokenExpired,\n }\n }\n\n return {\n ...authContext,\n userToken: newToken,\n }\n}\n","/**\n * Storage Utilities\n * LocalStorage and IndexedDB helpers with type safety\n */\n\nconst STORAGE_PREFIX = 'cloudsignal_pwa_'\n\n/**\n * Get item from localStorage with type safety\n */\nexport function getStorageItem<T>(key: string, defaultValue?: T): T | null {\n try {\n const fullKey = `${STORAGE_PREFIX}${key}`\n const item = localStorage.getItem(fullKey)\n if (item === null) return defaultValue ?? null\n return JSON.parse(item) as T\n } catch {\n return defaultValue ?? null\n }\n}\n\n/**\n * Set item in localStorage\n */\nexport function setStorageItem<T>(key: string, value: T): boolean {\n try {\n const fullKey = `${STORAGE_PREFIX}${key}`\n localStorage.setItem(fullKey, JSON.stringify(value))\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Remove item from localStorage\n */\nexport function removeStorageItem(key: string): boolean {\n try {\n const fullKey = `${STORAGE_PREFIX}${key}`\n localStorage.removeItem(fullKey)\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Get registration ID from storage\n */\nexport function getRegistrationId(organizationId: string, serviceId: string): string | null {\n const key = `registration_${organizationId}_${serviceId}`\n return getStorageItem<string>(key)\n}\n\n/**\n * Set registration ID in storage\n */\nexport function setRegistrationId(\n organizationId: string,\n serviceId: string,\n registrationId: string\n): boolean {\n const key = `registration_${organizationId}_${serviceId}`\n return setStorageItem(key, registrationId)\n}\n\n/**\n * Remove registration ID from storage\n */\nexport function removeRegistrationId(organizationId: string, serviceId: string): boolean {\n const key = `registration_${organizationId}_${serviceId}`\n return removeStorageItem(key)\n}\n\n/**\n * Check if installation is registered\n */\nexport function isInstallationRegistered(organizationId: string, serviceId: string): boolean {\n const key = `install_registered_${organizationId}_${serviceId}`\n return getStorageItem<boolean>(key) === true\n}\n\n/**\n * Mark installation as registered\n */\nexport function markInstallationRegistered(\n organizationId: string,\n serviceId: string,\n registrationId: string\n): boolean {\n const key = `install_registered_${organizationId}_${serviceId}`\n setStorageItem(`install_id_${organizationId}_${serviceId}`, registrationId)\n return setStorageItem(key, true)\n}\n\n/**\n * IndexedDB Storage for Service Worker\n * Provides persistent storage for badge counts, notifications, etc.\n */\nexport class IndexedDBStorage {\n private dbName: string\n private dbVersion: number\n private db: IDBDatabase | null = null\n\n constructor(dbName: string = 'CloudSignalPWA', dbVersion: number = 1) {\n this.dbName = dbName\n this.dbVersion = dbVersion\n }\n\n /**\n * Initialize the database\n */\n async init(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(this.dbName, this.dbVersion)\n\n request.onerror = () => reject(request.error)\n request.onsuccess = () => {\n this.db = request.result\n resolve(this.db)\n }\n\n request.onupgradeneeded = (event) => {\n const db = (event.target as IDBOpenDBRequest).result\n\n // Badge count store\n if (!db.objectStoreNames.contains('badge')) {\n db.createObjectStore('badge')\n }\n\n // Notifications history store\n if (!db.objectStoreNames.contains('notifications')) {\n const notificationStore = db.createObjectStore('notifications', {\n keyPath: 'id',\n autoIncrement: true,\n })\n notificationStore.createIndex('timestamp', 'timestamp', { unique: false })\n notificationStore.createIndex('read', 'read', { unique: false })\n }\n\n // User preferences store\n if (!db.objectStoreNames.contains('userPreferences')) {\n db.createObjectStore('userPreferences')\n }\n\n // Sync queue for offline actions\n if (!db.objectStoreNames.contains('syncQueue')) {\n const syncStore = db.createObjectStore('syncQueue', {\n keyPath: 'id',\n autoIncrement: true,\n })\n syncStore.createIndex('timestamp', 'timestamp', { unique: false })\n }\n }\n })\n }\n\n /**\n * Ensure database connection\n */\n private async ensureConnection(): Promise<void> {\n if (!this.db) {\n await this.init()\n }\n }\n\n /**\n * Promisify IDBRequest\n */\n private promisifyRequest<T>(request: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n request.onsuccess = () => resolve(request.result)\n request.onerror = () => reject(request.error)\n })\n }\n\n /**\n * Get badge count\n */\n async getBadgeCount(): Promise<number> {\n await this.ensureConnection()\n const transaction = this.db!.transaction(['badge'], 'readonly')\n const store = transaction.objectStore('badge')\n const count = await this.promisifyRequest(store.get('count'))\n return count || 0\n }\n\n /**\n * Set badge count\n */\n async setBadgeCount(count: number): Promise<void> {\n await this.ensureConnection()\n const transaction = this.db!.transaction(['badge'], 'readwrite')\n const store = transaction.objectStore('badge')\n await this.promisifyRequest(store.put(count, 'count'))\n }\n\n /**\n * Increment badge count\n */\n async incrementBadgeCount(increment: number = 1): Promise<number> {\n const currentCount = await this.getBadgeCount()\n const newCount = Math.max(0, currentCount + increment)\n await this.setBadgeCount(newCount)\n return newCount\n }\n\n /**\n * Save notification to history\n */\n async saveNotification(notification: Record<string, any>): Promise<number> {\n await this.ensureConnection()\n const transaction = this.db!.transaction(['notifications'], 'readwrite')\n const store = transaction.objectStore('notifications')\n\n const notificationData = {\n ...notification,\n timestamp: Date.now(),\n read: false,\n }\n\n const key = await this.promisifyRequest(store.add(notificationData))\n return key as number\n }\n\n /**\n * Get recent notifications\n */\n async getRecentNotifications(limit: number = 50): Promise<any[]> {\n await this.ensureConnection()\n const transaction = this.db!.transaction(['notifications'], 'readonly')\n const store = transaction.objectStore('notifications')\n const index = store.index('timestamp')\n\n const notifications: any[] = []\n const cursor = index.openCursor(null, 'prev')\n\n return new Promise((resolve, reject) => {\n cursor.onsuccess = (event) => {\n const result = (event.target as IDBRequest).result\n if (result && notifications.length < limit) {\n notifications.push(result.value)\n result.continue()\n } else {\n resolve(notifications)\n }\n }\n cursor.onerror = () => reject(cursor.error)\n })\n }\n\n /**\n * Mark notification as read\n */\n async markNotificationAsRead(notificationId: number): Promise<void> {\n await this.ensureConnection()\n const transaction = this.db!.transaction(['notifications'], 'readwrite')\n const store = transaction.objectStore('notifications')\n\n const notification = await this.promisifyRequest(store.get(notificationId))\n if (notification) {\n notification.read = true\n await this.promisifyRequest(store.put(notification))\n }\n }\n\n /**\n * Get user preference\n */\n async getUserPreference<T>(key: string): Promise<T | null> {\n await this.ensureConnection()\n const transaction = this.db!.transaction(['userPreferences'], 'readonly')\n const store = transaction.objectStore('userPreferences')\n return this.promisifyRequest(store.get(key))\n }\n\n /**\n * Set user preference\n */\n async setUserPreference<T>(key: string, value: T): Promise<void> {\n await this.ensureConnection()\n const transaction = this.db!.transaction(['userPreferences'], 'readwrite')\n const store = transaction.objectStore('userPreferences')\n await this.promisifyRequest(store.put(value, key))\n }\n\n /**\n * Add item to sync queue\n */\n async addToSyncQueue(action: Record<string, any>): Promise<number> {\n await this.ensureConnection()\n const transaction = this.db!.transaction(['syncQueue'], 'readwrite')\n const store = transaction.objectStore('syncQueue')\n\n const queueItem = {\n ...action,\n timestamp: Date.now(),\n retries: 0,\n }\n\n const key = await this.promisifyRequest(store.add(queueItem))\n return key as number\n }\n\n /**\n * Get sync queue items\n */\n async getSyncQueue(): Promise<any[]> {\n await this.ensureConnection()\n const transaction = this.db!.transaction(['syncQueue'], 'readonly')\n const store = transaction.objectStore('syncQueue')\n return this.promisifyRequest(store.getAll())\n }\n\n /**\n * Remove item from sync queue\n */\n async removeFromSyncQueue(id: number): Promise<void> {\n await this.ensureConnection()\n const transaction = this.db!.transaction(['syncQueue'], 'readwrite')\n const store = transaction.objectStore('syncQueue')\n await this.promisifyRequest(store.delete(id))\n }\n}\n","/**\n * PushNotificationManager - Push Notification Registration and Management\n */\n\nimport type {\n Registration,\n RegisterOptions,\n NotificationPreferences,\n RegistrationStatusResponse,\n PushSubscriptionData,\n PWAServiceConfig,\n AuthMode,\n} from './types'\nimport { makeAuthenticatedRequest, isValidUUID } from './utils/hmac'\nimport {\n type AuthContext,\n createAuthContext,\n makeAuthenticatedRequestWithContext,\n updateAuthToken,\n} from './utils/jwt-auth'\nimport { generateBrowserFingerprint } from './utils/fingerprint'\nimport { setRegistrationId, getRegistrationId, removeRegistrationId } from './utils/storage'\nimport { DeviceDetector } from './DeviceDetector'\n\nexport interface PushNotificationManagerOptions {\n serviceUrl: string\n organizationId: string\n /** Organization secret for HMAC auth (optional if userToken provided) */\n organizationSecret?: string\n /** JWT token for authenticated user mode (optional if organizationSecret provided) */\n userToken?: string\n /** Callback to refresh JWT when expired */\n onTokenExpired?: () => Promise<string>\n serviceId: string\n debug?: boolean\n onRegistered?: (registration: Registration) => void\n onUnregistered?: () => void\n onError?: (error: Error) => void\n onPermissionDenied?: () => void\n}\n\n/**\n * PushNotificationManager handles push notification registration with CloudSignal backend\n */\nexport class PushNotificationManager {\n private serviceUrl: string\n private organizationId: string\n private serviceId: string\n private debug: boolean\n private deviceDetector: DeviceDetector\n private serviceWorkerRegistration: ServiceWorkerRegistration | null = null\n private pushSubscription: PushSubscription | null = null\n private registrationId: string | null = null\n private vapidPublicKey: string | null = null\n private authContext: AuthContext\n \n private onRegistered?: (registration: Registration) => void\n private onUnregistered?: () => void\n private onError?: (error: Error) => void\n private onPermissionDenied?: () => void\n private onTokenExpired?: () => Promise<string>\n\n constructor(options: PushNotificationManagerOptions) {\n this.serviceUrl = options.serviceUrl\n this.organizationId = options.organizationId\n this.serviceId = options.serviceId\n this.debug = options.debug ?? false\n this.deviceDetector = new DeviceDetector()\n \n // Initialize auth context (supports both HMAC and JWT)\n this.authContext = createAuthContext({\n organizationId: options.organizationId,\n organizationSecret: options.organizationSecret,\n userToken: options.userToken,\n })\n \n this.onRegistered = options.onRegistered\n this.onUnregistered = options.onUnregistered\n this.onError = options.onError\n this.onPermissionDenied = options.onPermissionDenied\n this.onTokenExpired = options.onTokenExpired\n\n // Load cached registration ID\n this.registrationId = getRegistrationId(this.organizationId, this.serviceId)\n }\n\n /**\n * Set service worker registration\n */\n setServiceWorkerRegistration(registration: ServiceWorkerRegistration): void {\n this.serviceWorkerRegistration = registration\n }\n\n /**\n * Set VAPID public key from config\n */\n setVapidPublicKey(key: string): void {\n this.vapidPublicKey = key\n }\n\n /**\n * Get current registration ID\n */\n getRegistrationId(): string | null {\n return this.registrationId\n }\n\n /**\n * Check if registered for push notifications\n */\n isRegistered(): boolean {\n return this.registrationId !== null\n }\n\n /**\n * Get current authentication mode\n */\n getAuthMode(): AuthMode {\n return this.authContext.mode\n }\n\n /**\n * Update JWT token (for token refresh or upgrading from HMAC to JWT)\n */\n updateToken(token: string): void {\n this.authContext = updateAuthToken(this.authContext, token)\n this.log(`Auth mode: ${this.authContext.mode}`)\n }\n\n /**\n * Register for push notifications\n */\n async register(options: RegisterOptions = {}): Promise<Registration | null> {\n try {\n // Check for required service worker\n if (!this.serviceWorkerRegistration) {\n throw new Error('Service worker not registered')\n }\n\n // Check for VAPID key\n if (!this.vapidPublicKey) {\n throw new Error('VAPID public key not set. Call downloadConfig() first.')\n }\n\n // Request notification permission\n const permission = await this.requestPermission()\n if (permission !== 'granted') {\n this.log('Notification permission denied')\n this.onPermissionDenied?.()\n return null\n }\n\n // Subscribe to push notifications\n const subscription = await this.subscribeToPush()\n if (!subscription) {\n throw new Error('Failed to subscribe to push notifications')\n }\n\n this.pushSubscription = subscription\n\n // Generate browser fingerprint\n const fingerprint = await generateBrowserFingerprint()\n\n // Get device info\n const deviceInfo = this.deviceDetector.getDeviceInfo()\n const platformInfo = this.deviceDetector.getPlatformInfo()\n\n // Prepare registration data\n const subscriptionJson = subscription.toJSON()\n const registrationData: PushSubscriptionData = {\n serviceId: this.serviceId,\n userEmail: options.userEmail,\n userId: isValidUUID(options.userId) ? options.userId : undefined,\n endpoint: subscription.endpoint,\n keys: {\n p256dh: subscriptionJson.keys?.p256dh || '',\n auth: subscriptionJson.keys?.auth || '',\n },\n browserFingerprint: fingerprint || undefined,\n deviceType: deviceInfo.deviceType,\n deviceModel: deviceInfo.deviceModel,\n browserName: platformInfo.browser,\n browserVersion: platformInfo.browserVersion,\n osName: platformInfo.os,\n osVersion: platformInfo.osVersion,\n userAgent: platformInfo.userAgent,\n displayMode: 'standalone',\n isInstalled: true,\n timezone: options.timezone || Intl.DateTimeFormat().resolvedOptions().timeZone,\n language: options.language || navigator.language || 'en-US',\n }\n\n // Send to backend\n const url = `${this.serviceUrl}/api/v1/registration/register`\n const response = await makeAuthenticatedRequestWithContext(\n this.authContext,\n 'POST',\n url,\n registrationData as any,\n this.onTokenExpired\n )\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Registration failed: ${response.status} - ${errorText}`)\n }\n\n const result = await response.json()\n\n // Store registration ID\n this.registrationId = result.registration_id\n setRegistrationId(this.organizationId, this.serviceId, this.registrationId!)\n\n const registration: Registration = {\n registrationId: result.registration_id,\n status: result.status || 'active',\n createdAt: result.created_at || new Date().toISOString(),\n isActive: true,\n }\n\n this.log(`Push registration successful: ${registration.registrationId}`)\n this.onRegistered?.(registration)\n\n return registration\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n this.log(`Push registration failed: ${err.message}`, 'error')\n this.onError?.(err)\n return null\n }\n }\n\n /**\n * Unregister from push notifications\n */\n async unregister(): Promise<boolean> {\n try {\n if (!this.registrationId) {\n this.log('No registration to unregister')\n return true\n }\n\n // Unsubscribe from push\n if (this.pushSubscription) {\n await this.pushSubscription.unsubscribe()\n this.pushSubscription = null\n }\n\n // Notify backend\n const url = `${this.serviceUrl}/api/v1/registration/unregister`\n const response = await makeAuthenticatedRequestWithContext(\n this.authContext,\n 'POST',\n url,\n { registration_id: this.registrationId },\n this.onTokenExpired\n )\n\n if (!response.ok) {\n this.log(`Backend unregistration failed: ${response.status}`, 'warn')\n }\n\n // Clear local storage\n removeRegistrationId(this.organizationId, this.serviceId)\n this.registrationId = null\n\n this.log('Push unregistration successful')\n this.onUnregistered?.()\n\n return true\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n this.log(`Push unregistration failed: ${err.message}`, 'error')\n this.onError?.(err)\n return false\n }\n }\n\n /**\n * Update notification preferences\n */\n async updatePreferences(preferences: NotificationPreferences): Promise<boolean> {\n try {\n if (!this.registrationId) {\n throw new Error('Not registered for push notifications')\n }\n\n const url = `${this.serviceUrl}/api/v1/registration/update`\n const response = await makeAuthenticatedRequestWithContext(\n this.authContext,\n 'POST',\n url,\n {\n registration_id: this.registrationId,\n notification_topics: preferences.topics,\n timezone: preferences.timezone,\n language: preferences.language,\n is_active: preferences.isActive,\n },\n this.onTokenExpired\n )\n\n if (!response.ok) {\n throw new Error(`Update failed: ${response.status}`)\n }\n\n this.log('Preferences updated successfully')\n return true\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n this.log(`Failed to update preferences: ${err.message}`, 'error')\n this.onError?.(err)\n return false\n }\n }\n\n /**\n * Check registration status\n */\n async checkStatus(): Promise<RegistrationStatusResponse | null> {\n try {\n if (!this.registrationId) {\n return null\n }\n\n const url = `${this.serviceUrl}/api/v1/registration/status/${this.registrationId}`\n const response = await makeAuthenticatedRequestWithContext(\n this.authContext,\n 'GET',\n url,\n undefined,\n this.onTokenExpired\n )\n\n if (!response.ok) {\n if (response.status === 404) {\n // Registration no longer exists\n removeRegistrationId(this.organizationId, this.serviceId)\n this.registrationId = null\n return null\n }\n throw new Error(`Status check failed: ${response.status}`)\n }\n\n const status = await response.json()\n return {\n registrationId: status.registration_id,\n status: status.status,\n isActive: status.is_active,\n isOnline: status.is_online,\n lastActive: status.last_active,\n lastSeenOnline: status.last_seen_online,\n lastHeartbeat: status.last_heartbeat,\n installationDate: status.installation_date,\n notificationCount: status.notification_count,\n deviceInfo: status.device_info,\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n this.log(`Status check failed: ${err.message}`, 'error')\n return null\n }\n }\n\n /**\n * Request notification permission\n */\n async requestPermission(): Promise<NotificationPermission> {\n if (!('Notification' in window)) {\n return 'denied'\n }\n\n if (Notification.permission === 'granted') {\n return 'granted'\n }\n\n if (Notification.permission === 'denied') {\n return 'denied'\n }\n\n return await Notification.requestPermission()\n }\n\n /**\n * Subscribe to push notifications\n */\n private async subscribeToPush(): Promise<PushSubscription | null> {\n if (!this.serviceWorkerRegistration || !this.vapidPublicKey) {\n return null\n }\n\n try {\n // Check for existing subscription\n let subscription = await this.serviceWorkerRegistration.pushManager.getSubscription()\n\n if (!subscription) {\n // Create new subscription\n const applicationServerKey = this.urlBase64ToUint8Array(this.vapidPublicKey)\n \n subscription = await this.serviceWorkerRegistration.pushManager.subscribe({\n userVisibleOnly: true,\n applicationServerKey: applicationServerKey.buffer as ArrayBuffer,\n })\n }\n\n return subscription\n } catch (error) {\n this.log(`Push subscription failed: ${error}`, 'error')\n return null\n }\n }\n\n /**\n * Convert base64 VAPID key to Uint8Array\n */\n private urlBase64ToUint8Array(base64String: string): Uint8Array {\n const padding = '='.repeat((4 - (base64String.length % 4)) % 4)\n const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/')\n const rawData = atob(base64)\n const outputArray = new Uint8Array(rawData.length)\n for (let i = 0; i < rawData.length; ++i) {\n outputArray[i] = rawData.charCodeAt(i)\n }\n return outputArray\n }\n\n /**\n * Log message if debug is enabled\n */\n private log(message: string, level: 'log' | 'warn' | 'error' = 'log'): void {\n if (!this.debug) return\n const prefix = '[CloudSignal PWA Push]'\n console[level](`${prefix} ${message}`)\n }\n}\n","/**\n * HeartbeatManager - Online Status Tracking via Periodic Heartbeat\n * Now with network and battery awareness for optimal performance\n */\n\nimport type { HeartbeatConfig, AuthMode } from './types'\nimport type {\n AdaptiveHeartbeatConfig,\n NetworkConnectionInfo,\n BatteryInfo,\n} from './types/wakelock'\nimport { makeAuthenticatedRequest, isValidUUID } from './utils/hmac'\nimport {\n type AuthContext,\n createAuthContext,\n makeAuthenticatedRequestWithContext,\n updateAuthToken,\n} from './utils/jwt-auth'\n\nexport interface HeartbeatManagerOptions {\n serviceUrl: string\n organizationId: string\n /** Organization secret for HMAC auth (optional if userToken provided) */\n organizationSecret?: string\n /** JWT token for authenticated user mode (optional if organizationSecret provided) */\n userToken?: string\n /** Callback to refresh JWT when expired */\n onTokenExpired?: () => Promise<string>\n config?: HeartbeatConfig\n adaptiveConfig?: AdaptiveHeartbeatConfig\n debug?: boolean\n onHeartbeatSent?: () => void\n onHeartbeatError?: (error: Error) => void\n onIntervalChanged?: (newInterval: number, reason: string) => void\n onPausedForBattery?: () => void\n onResumedFromBattery?: () => void\n}\n\n/**\n * Default intervals by connection type (in milliseconds)\n */\nconst DEFAULT_INTERVALS: Record<string, number> = {\n '4g': 30000, // 30 seconds\n '3g': 60000, // 60 seconds\n '2g': 120000, // 2 minutes\n 'slow-2g': 180000, // 3 minutes\n 'unknown': 30000, // Default\n}\n\n/**\n * HeartbeatManager sends periodic heartbeats to track online status\n * Now with adaptive intervals based on network quality and battery level\n */\nexport class HeartbeatManager {\n private serviceUrl: string\n private organizationId: string\n private config: Required<HeartbeatConfig>\n private adaptiveConfig: Required<AdaptiveHeartbeatConfig>\n private debug: boolean\n private registrationId: string | null = null\n private intervalId: ReturnType<typeof setInterval> | null = null\n private isRunning: boolean = false\n private isPausedForBattery: boolean = false\n private currentInterval: number\n private visibilityHandler: (() => void) | null = null\n private connectionChangeHandler: (() => void) | null = null\n private batteryManager: any = null\n private authContext: AuthContext\n \n private onHeartbeatSent?: () => void\n private onHeartbeatError?: (error: Error) => void\n private onIntervalChanged?: (newInterval: number, reason: string) => void\n private onPausedForBattery?: () => void\n private onResumedFromBattery?: () => void\n private onTokenExpired?: () => Promise<string>\n\n constructor(options: HeartbeatManagerOptions) {\n this.serviceUrl = options.serviceUrl\n this.organizationId = options.organizationId\n this.debug = options.debug ?? false\n this.onHeartbeatSent = options.onHeartbeatSent\n this.onHeartbeatError = options.onHeartbeatError\n this.onIntervalChanged = options.onIntervalChanged\n this.onPausedForBattery = options.onPausedForBattery\n this.onResumedFromBattery = options.onResumedFromBattery\n this.onTokenExpired = options.onTokenExpired\n\n // Initialize auth context (supports both HMAC and JWT)\n this.authContext = createAuthContext({\n organizationId: options.organizationId,\n organizationSecret: options.organizationSecret,\n userToken: options.userToken,\n })\n\n this.config = {\n enabled: options.config?.enabled ?? true,\n interval: options.config?.interval ?? 30000, // 30 seconds\n autoStart: options.config?.autoStart ?? true,\n stopOnHidden: options.config?.stopOnHidden ?? true,\n }\n\n this.adaptiveConfig = {\n adaptToNetwork: options.adaptiveConfig?.adaptToNetwork ?? true,\n adaptToBattery: options.adaptiveConfig?.adaptToBattery ?? true,\n batteryPauseThreshold: options.adaptiveConfig?.batteryPauseThreshold ?? 0.15,\n intervals: {\n ...DEFAULT_INTERVALS,\n ...options.adaptiveConfig?.intervals,\n },\n }\n\n this.currentInterval = this.config.interval\n }\n\n /**\n * Set the registration ID for heartbeat requests\n */\n setRegistrationId(registrationId: string): void {\n this.registrationId = registrationId\n \n // Auto-start if configured and not already running\n if (this.config.autoStart && !this.isRunning && this.config.enabled) {\n this.start()\n }\n }\n\n /**\n * Start sending heartbeats\n */\n start(): void {\n if (this.isRunning) {\n this.log('Heartbeat already running')\n return\n }\n\n if (!this.registrationId || !isValidUUID(this.registrationId)) {\n this.log('Cannot start heartbeat: no valid registration ID', 'warn')\n return\n }\n\n if (!this.config.enabled) {\n this.log('Heartbeat is disabled')\n return\n }\n\n this.isRunning = true\n\n // Calculate initial interval based on network\n this.updateIntervalForNetwork()\n\n this.log(`Starting heartbeat with interval ${this.currentInterval}ms`)\n\n // Send initial heartbeat\n this.sendHeartbeat()\n\n // Set up interval\n this.startInterval()\n\n // Set up visibility handler if configured\n if (this.config.stopOnHidden) {\n this.setupVisibilityHandler()\n }\n\n // Set up network change listener\n if (this.adaptiveConfig.adaptToNetwork) {\n this.setupNetworkChangeHandler()\n }\n\n // Set up battery monitoring\n if (this.adaptiveConfig.adaptToBattery) {\n this.setupBatteryMonitoring()\n }\n }\n\n /**\n * Stop sending heartbeats\n */\n stop(): void {\n if (!this.isRunning) {\n return\n }\n\n this.isRunning = false\n this.isPausedForBattery = false\n\n if (this.intervalId) {\n clearInterval(this.intervalId)\n this.intervalId = null\n }\n\n if (this.visibilityHandler) {\n document.removeEventListener('visibilitychange', this.visibilityHandler)\n this.visibilityHandler = null\n }\n\n if (this.connectionChangeHandler) {\n const connection = (navigator as any).connection\n if (connection) {\n connection.removeEventListener('change', this.connectionChangeHandler)\n }\n this.connectionChangeHandler = null\n }\n\n this.log('Heartbeat stopped')\n }\n\n /**\n * Check if heartbeat is running\n */\n isHeartbeatRunning(): boolean {\n return this.isRunning\n }\n\n /**\n * Get current authentication mode\n */\n getAuthMode(): AuthMode {\n return this.authContext.mode\n }\n\n /**\n * Update JWT token (for token refresh or upgrading from HMAC to JWT)\n */\n updateToken(token: string): void {\n this.authContext = updateAuthToken(this.authContext, token)\n this.log(`Auth mode: ${this.authContext.mode}`)\n }\n\n /**\n * Send a single heartbeat\n */\n async sendHeartbeat(): Promise<boolean> {\n if (!this.registrationId || !isValidUUID(this.registrationId)) {\n this.log('Cannot send heartbeat: no valid registration ID', 'warn')\n return false\n }\n\n try {\n const url = `${this.serviceUrl}/api/v1/registration/heartbeat/${this.registrationId}`\n \n const response = await makeAuthenticatedRequestWithContext(\n this.authContext,\n 'POST',\n url,\n undefined,\n this.onTokenExpired\n )\n\n if (!response.ok) {\n throw new Error(`Heartbeat failed: ${response.status}`)\n }\n\n this.log('Heartbeat sent successfully')\n this.onHeartbeatSent?.()\n return true\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n this.log(`Heartbeat failed: ${err.message}`, 'error')\n this.onHeartbeatError?.(err)\n return false\n }\n }\n\n /**\n * Update heartbeat configuration\n */\n updateConfig(config: Partial<HeartbeatConfig>): void {\n const wasRunning = this.isRunning\n \n if (wasRunning) {\n this.stop()\n }\n\n this.config = {\n ...this.config,\n ...config,\n }\n\n if (wasRunning && this.config.enabled) {\n this.start()\n }\n }\n\n /**\n * Get current network connection info\n */\n getNetworkInfo(): NetworkConnectionInfo {\n const connection = (navigator as any).connection\n if (!connection) {\n return {}\n }\n\n return {\n effectiveType: connection.effectiveType,\n saveData: connection.saveData,\n downlink: connection.downlink,\n rtt: connection.rtt,\n }\n }\n\n /**\n * Get current battery info (if available)\n */\n async getBatteryInfo(): Promise<BatteryInfo | null> {\n try {\n if (!('getBattery' in navigator)) {\n return null\n }\n\n const battery = await (navigator as any).getBattery()\n return {\n level: battery.level,\n charging: battery.charging,\n }\n } catch {\n return null\n }\n }\n\n /**\n * Get current heartbeat interval\n */\n getCurrentInterval(): number {\n return this.currentInterval\n }\n\n /**\n * Check if heartbeat is paused due to low battery\n */\n isPausedDueToBattery(): boolean {\n return this.isPausedForBattery\n }\n\n // ============================================\n // Private interval management\n // ============================================\n\n /**\n * Start the heartbeat interval\n */\n private startInterval(): void {\n if (this.intervalId) {\n clearInterval(this.intervalId)\n }\n\n this.intervalId = setInterval(() => {\n this.sendHeartbeat()\n }, this.currentInterval)\n }\n\n /**\n * Update interval based on network conditions\n */\n private updateIntervalForNetwork(): void {\n if (!this.adaptiveConfig.adaptToNetwork) {\n this.currentInterval = this.config.interval\n return\n }\n\n const connection = (navigator as any).connection\n if (!connection) {\n this.currentInterval = this.config.interval\n return\n }\n\n // Check save data preference\n if (connection.saveData) {\n const newInterval = Math.max(this.currentInterval, 120000) // At least 2 minutes\n if (newInterval !== this.currentInterval) {\n this.currentInterval = newInterval\n this.log(`Interval increased to ${newInterval}ms (saveData enabled)`)\n this.onIntervalChanged?.(newInterval, 'saveData')\n }\n return\n }\n\n // Adjust based on connection type\n const effectiveType = connection.effectiveType || 'unknown'\n const newInterval = this.adaptiveConfig.intervals[effectiveType] || this.config.interval\n\n if (newInterval !== this.currentInterval) {\n const oldInterval = this.currentInterval\n this.currentInterval = newInterval\n this.log(`Interval changed from ${oldInterval}ms to ${newInterval}ms (${effectiveType})`)\n this.onIntervalChanged?.(newInterval, effectiveType)\n }\n }\n\n /**\n * Set up network change handler\n */\n private setupNetworkChangeHandler(): void {\n const connection = (navigator as any).connection\n if (!connection) {\n return\n }\n\n this.connectionChangeHandler = () => {\n const oldInterval = this.currentInterval\n this.updateIntervalForNetwork()\n\n // Restart interval if it changed\n if (oldInterval !== this.currentInterval && this.isRunning && !this.isPausedForBattery) {\n this.startInterval()\n }\n }\n\n connection.addEventListener('change', this.connectionChangeHandler)\n }\n\n /**\n * Set up battery monitoring\n */\n private async setupBatteryMonitoring(): Promise<void> {\n try {\n if (!('getBattery' in navigator)) {\n return\n }\n\n this.batteryManager = await (navigator as any).getBattery()\n\n const checkBattery = () => {\n if (!this.batteryManager) return\n\n const level = this.batteryManager.level\n const charging = this.batteryManager.charging\n\n // If battery is low and not charging, pause heartbeat\n if (level <= this.adaptiveConfig.batteryPauseThreshold && !charging) {\n if (!this.isPausedForBattery && this.isRunning) {\n this.isPausedForBattery = true\n if (this.intervalId) {\n clearInterval(this.intervalId)\n this.intervalId = null\n }\n this.log(`Heartbeat paused (battery at ${Math.round(level * 100)}%)`)\n this.onPausedForBattery?.()\n }\n } else {\n // Resume if was paused for battery\n if (this.isPausedForBattery && this.isRunning) {\n this.isPausedForBattery = false\n this.startInterval()\n this.log(`Heartbeat resumed (battery at ${Math.round(level * 100)}%)`)\n this.onResumedFromBattery?.()\n }\n }\n }\n\n // Check initial state\n checkBattery()\n\n // Listen for changes\n this.batteryManager.addEventListener('levelchange', checkBattery)\n this.batteryManager.addEventListener('chargingchange', checkBattery)\n } catch {\n // Battery API not available\n }\n }\n\n /**\n * Set up visibility change handler\n */\n private setupVisibilityHandler(): void {\n this.visibilityHandler = () => {\n if (document.hidden) {\n // Page is hidden, pause heartbeat\n if (this.intervalId) {\n clearInterval(this.intervalId)\n this.intervalId = null\n }\n this.log('Heartbeat paused (page hidden)')\n } else {\n // Page is visible, resume heartbeat\n if (this.isRunning && !this.intervalId && !this.isPausedForBattery) {\n this.sendHeartbeat() // Send immediately\n this.startInterval()\n this.log('Heartbeat resumed (page visible)')\n }\n }\n }\n\n document.addEventListener('visibilitychange', this.visibilityHandler)\n }\n\n /**\n * Log message if debug is enabled\n */\n private log(message: string, level: 'log' | 'warn' | 'error' = 'log'): void {\n if (!this.debug) return\n const prefix = '[CloudSignal PWA Heartbeat]'\n console[level](`${prefix} ${message}`)\n }\n}\n","/**\n * WakeLockManager - Screen Wake Lock API wrapper\n * Prevents device screen from dimming/locking when needed\n */\n\nimport type {\n WakeLockConfig,\n WakeLockState,\n WakeLockAcquiredEvent,\n WakeLockReleasedEvent,\n WakeLockErrorEvent,\n} from './types/wakelock'\n\nexport interface WakeLockManagerOptions {\n config?: WakeLockConfig\n debug?: boolean\n onAcquired?: (event: WakeLockAcquiredEvent) => void\n onReleased?: (event: WakeLockReleasedEvent) => void\n onError?: (event: WakeLockErrorEvent) => void\n}\n\n/**\n * WakeLockManager provides a simple API for the Screen Wake Lock API\n * with automatic reacquisition when the page becomes visible again\n */\nexport class WakeLockManager {\n private wakeLock: WakeLockSentinel | null = null\n private config: Required<WakeLockConfig>\n private debug: boolean\n private visibilityHandler: (() => void) | null = null\n private releaseHandler: (() => void) | null = null\n private shouldReacquire: boolean = false\n\n private onAcquired?: (event: WakeLockAcquiredEvent) => void\n private onReleased?: (event: WakeLockReleasedEvent) => void\n private onError?: (event: WakeLockErrorEvent) => void\n\n constructor(options: WakeLockManagerOptions = {}) {\n this.debug = options.debug ?? false\n this.onAcquired = options.onAcquired\n this.onReleased = options.onReleased\n this.onError = options.onError\n\n this.config = {\n enabled: options.config?.enabled ?? true,\n autoReacquire: options.config?.autoReacquire ?? true,\n }\n }\n\n /**\n * Check if Screen Wake Lock API is supported\n */\n isSupported(): boolean {\n return 'wakeLock' in navigator\n }\n\n /**\n * Get current wake lock state\n */\n getState(): WakeLockState {\n return {\n isActive: this.wakeLock !== null && !this.wakeLock.released,\n isSupported: this.isSupported(),\n type: 'screen',\n acquiredAt: this.wakeLock && !this.wakeLock.released ? Date.now() : undefined,\n }\n }\n\n /**\n * Acquire a screen wake lock\n * Prevents the screen from dimming or locking\n */\n async acquire(): Promise<boolean> {\n if (!this.config.enabled) {\n this.log('Wake lock is disabled')\n return false\n }\n\n if (!this.isSupported()) {\n this.log('Wake Lock API not supported')\n this.onError?.({\n timestamp: Date.now(),\n error: 'Wake Lock API not supported',\n errorName: 'NotSupportedError',\n })\n return false\n }\n\n // Already have an active lock\n if (this.wakeLock && !this.wakeLock.released) {\n this.log('Wake lock already active')\n return true\n }\n\n try {\n this.wakeLock = await navigator.wakeLock.request('screen')\n this.shouldReacquire = true\n\n // Set up release handler\n this.releaseHandler = () => {\n this.handleRelease('system')\n }\n this.wakeLock.addEventListener('release', this.releaseHandler)\n\n // Set up visibility change handler for auto-reacquire\n if (this.config.autoReacquire) {\n this.setupVisibilityHandler()\n }\n\n this.log('Wake lock acquired')\n this.onAcquired?.({ timestamp: Date.now() })\n\n return true\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n this.log(`Failed to acquire wake lock: ${err.message}`, 'error')\n this.onError?.({\n timestamp: Date.now(),\n error: err.message,\n errorName: err.name,\n })\n return false\n }\n }\n\n /**\n * Release the screen wake lock\n */\n async release(): Promise<void> {\n this.shouldReacquire = false\n\n if (!this.wakeLock) {\n return\n }\n\n try {\n // Remove the event listener before releasing to prevent double-firing\n if (this.releaseHandler) {\n this.wakeLock.removeEventListener('release', this.releaseHandler)\n this.releaseHandler = null\n }\n\n await this.wakeLock.release()\n this.wakeLock = null\n\n this.log('Wake lock released manually')\n this.onReleased?.({ timestamp: Date.now(), reason: 'manual' })\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n this.log(`Failed to release wake lock: ${err.message}`, 'error')\n }\n\n // Clean up visibility handler\n this.removeVisibilityHandler()\n }\n\n /**\n * Toggle wake lock on/off\n */\n async toggle(): Promise<boolean> {\n if (this.wakeLock && !this.wakeLock.released) {\n await this.release()\n return false\n } else {\n return this.acquire()\n }\n }\n\n /**\n * Check if wake lock is currently active\n */\n isActive(): boolean {\n return this.wakeLock !== null && !this.wakeLock.released\n }\n\n /**\n * Destroy the manager and release any held locks\n */\n async destroy(): Promise<void> {\n await this.release()\n this.removeVisibilityHandler()\n }\n\n // ============================================\n // Private methods\n // ============================================\n\n /**\n * Handle wake lock release (from system)\n */\n private handleRelease(reason: 'visibility' | 'system'): void {\n this.wakeLock = null\n this.log(`Wake lock released by ${reason}`)\n this.onReleased?.({ timestamp: Date.now(), reason })\n }\n\n /**\n * Set up visibility change handler for auto-reacquire\n */\n private setupVisibilityHandler(): void {\n if (this.visibilityHandler) {\n return\n }\n\n this.visibilityHandler = async () => {\n if (document.visibilityState === 'visible' && this.shouldReacquire) {\n // Page became visible, try to reacquire\n this.log('Page visible, attempting to reacquire wake lock')\n await this.acquire()\n } else if (document.visibilityState === 'hidden' && this.wakeLock) {\n // Page became hidden, the lock will be released automatically\n // We just need to track that we want to reacquire\n this.log('Page hidden, wake lock will be released')\n }\n }\n\n document.addEventListener('visibilitychange', this.visibilityHandler)\n }\n\n /**\n * Remove visibility change handler\n */\n private removeVisibilityHandler(): void {\n if (this.visibilityHandler) {\n document.removeEventListener('visibilitychange', this.visibilityHandler)\n this.visibilityHandler = null\n }\n }\n\n /**\n * Log message if debug is enabled\n */\n private log(message: string, level: 'log' | 'warn' | 'error' = 'log'): void {\n if (!this.debug && level === 'log') return\n const prefix = '[CloudSignal PWA WakeLock]'\n console[level](`${prefix} ${message}`)\n }\n}\n\n// WakeLock types are now available in lib.dom.d.ts (TypeScript 4.4+)\n// If you're using an older version, you may need to add these declarations\n","/**\n * OfflineQueueManager - Queue and retry failed requests when offline\n * Uses IndexedDB for persistence across sessions\n */\n\nimport type {\n QueuedRequest,\n QueuedRequestType,\n OfflineQueueConfig,\n QueueProcessResult,\n OfflineQueueStats,\n} from './types/offline'\n\nconst DB_NAME = 'CloudSignalPWA'\nconst DB_VERSION = 2\nconst STORE_NAME = 'offlineQueue'\n\nexport interface OfflineQueueManagerOptions {\n config?: OfflineQueueConfig\n debug?: boolean\n onRequestQueued?: (request: QueuedRequest) => void\n onRequestProcessed?: (result: QueueProcessResult) => void\n onQueueEmpty?: () => void\n onError?: (error: Error) => void\n}\n\n/**\n * OfflineQueueManager handles queuing failed requests and retrying them\n * when the network connection is restored\n */\nexport class OfflineQueueManager {\n private db: IDBDatabase | null = null\n private config: Required<OfflineQueueConfig>\n private debug: boolean\n private isProcessing: boolean = false\n private onlineHandler: (() => void) | null = null\n\n private onRequestQueued?: (request: QueuedRequest) => void\n private onRequestProcessed?: (result: QueueProcessResult) => void\n private onQueueEmpty?: () => void\n private onError?: (error: Error) => void\n\n constructor(options: OfflineQueueManagerOptions = {}) {\n this.debug = options.debug ?? false\n this.onRequestQueued = options.onRequestQueued\n this.onRequestProcessed = options.onRequestProcessed\n this.onQueueEmpty = options.onQueueEmpty\n this.onError = options.onError\n\n this.config = {\n enabled: options.config?.enabled ?? true,\n maxQueueSize: options.config?.maxQueueSize ?? 100,\n maxAge: options.config?.maxAge ?? 24 * 60 * 60 * 1000, // 24 hours\n baseRetryDelay: options.config?.baseRetryDelay ?? 1000,\n maxRetryDelay: options.config?.maxRetryDelay ?? 60000,\n defaultMaxRetries: options.config?.defaultMaxRetries ?? 5,\n processOnOnline: options.config?.processOnOnline ?? true,\n }\n }\n\n /**\n * Initialize the offline queue manager\n */\n async initialize(): Promise<void> {\n if (!this.config.enabled) {\n this.log('Offline queue is disabled')\n return\n }\n\n try {\n await this.openDatabase()\n\n // Set up online listener\n if (this.config.processOnOnline) {\n this.onlineHandler = () => {\n this.log('Network online, processing queue')\n this.processQueue()\n }\n window.addEventListener('online', this.onlineHandler)\n }\n\n // Clean up old requests\n await this.cleanupOldRequests()\n\n this.log('Offline queue manager initialized')\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n this.log(`Failed to initialize: ${err.message}`, 'error')\n this.onError?.(err)\n }\n }\n\n /**\n * Destroy the manager and clean up listeners\n */\n destroy(): void {\n if (this.onlineHandler) {\n window.removeEventListener('online', this.onlineHandler)\n this.onlineHandler = null\n }\n\n if (this.db) {\n this.db.close()\n this.db = null\n }\n }\n\n /**\n * Add a request to the queue\n */\n async queueRequest(\n url: string,\n method: QueuedRequest['method'],\n options: {\n headers?: Record<string, string>\n body?: string\n requestType?: QueuedRequestType\n priority?: number\n maxRetries?: number\n metadata?: Record<string, any>\n } = {}\n ): Promise<number | null> {\n if (!this.config.enabled || !this.db) {\n return null\n }\n\n try {\n // Check queue size\n const stats = await this.getStats()\n if (stats.totalQueued >= this.config.maxQueueSize) {\n this.log('Queue is full, removing oldest request')\n await this.removeOldestRequest()\n }\n\n const request: QueuedRequest = {\n url,\n method,\n headers: options.headers,\n body: options.body,\n queuedAt: Date.now(),\n retryCount: 0,\n maxRetries: options.maxRetries ?? this.config.defaultMaxRetries,\n requestType: options.requestType ?? 'custom',\n priority: options.priority ?? 0,\n metadata: options.metadata,\n }\n\n const id = await this.addToStore(request)\n request.id = id\n\n this.log(`Queued request: ${method} ${url} (id: ${id})`)\n this.onRequestQueued?.(request)\n\n return id\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n this.log(`Failed to queue request: ${err.message}`, 'error')\n this.onError?.(err)\n return null\n }\n }\n\n /**\n * Process all queued requests\n */\n async processQueue(): Promise<QueueProcessResult[]> {\n if (!this.config.enabled || !this.db || this.isProcessing) {\n return []\n }\n\n if (!navigator.onLine) {\n this.log('Offline, skipping queue processing')\n return []\n }\n\n this.isProcessing = true\n const results: QueueProcessResult[] = []\n\n try {\n const requests = await this.getAllRequests()\n\n // Sort by priority (higher first), then by queuedAt (older first)\n requests.sort((a, b) => {\n if (a.priority !== b.priority) {\n return b.priority - a.priority\n }\n return a.queuedAt - b.queuedAt\n })\n\n this.log(`Processing ${requests.length} queued requests`)\n\n for (const request of requests) {\n if (!navigator.onLine) {\n this.log('Went offline during processing, stopping')\n break\n }\n\n const result = await this.processRequest(request)\n results.push(result)\n\n if (result.success || !result.shouldRetry) {\n await this.removeFromStore(request.id!)\n } else {\n await this.updateRetryCount(request)\n }\n\n this.onRequestProcessed?.(result)\n\n // Small delay between requests\n await this.delay(100)\n }\n\n const remainingCount = await this.getQueueCount()\n if (remainingCount === 0) {\n this.onQueueEmpty?.()\n }\n\n this.log(`Processed ${results.length} requests, ${remainingCount} remaining`)\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n this.log(`Error processing queue: ${err.message}`, 'error')\n this.onError?.(err)\n } finally {\n this.isProcessing = false\n }\n\n return results\n }\n\n /**\n * Process a single queued request\n */\n private async processRequest(request: QueuedRequest): Promise<QueueProcessResult> {\n const result: QueueProcessResult = {\n id: request.id!,\n success: false,\n shouldRetry: false,\n }\n\n try {\n const response = await fetch(request.url, {\n method: request.method,\n headers: request.headers,\n body: request.body,\n })\n\n result.statusCode = response.status\n result.success = response.ok\n\n if (!response.ok) {\n // Determine if we should retry based on status code\n result.shouldRetry = this.shouldRetryStatus(response.status, request)\n result.error = `HTTP ${response.status}`\n }\n\n this.log(`Request ${request.id}: ${result.success ? 'success' : 'failed'} (${response.status})`)\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n result.error = err.message\n result.shouldRetry = request.retryCount < request.maxRetries\n\n this.log(`Request ${request.id} failed: ${err.message}`, 'error')\n }\n\n return result\n }\n\n /**\n * Determine if a request should be retried based on status code\n */\n private shouldRetryStatus(status: number, request: QueuedRequest): boolean {\n if (request.retryCount >= request.maxRetries) {\n return false\n }\n\n // Retry on server errors and some client errors\n if (status >= 500) return true\n if (status === 408) return true // Request Timeout\n if (status === 429) return true // Too Many Requests\n if (status === 0) return true // Network error\n\n return false\n }\n\n /**\n * Update retry count and schedule next retry\n */\n private async updateRetryCount(request: QueuedRequest): Promise<void> {\n request.retryCount++\n\n const transaction = this.db!.transaction([STORE_NAME], 'readwrite')\n const store = transaction.objectStore(STORE_NAME)\n await this.promisifyRequest(store.put(request))\n }\n\n /**\n * Get queue statistics\n */\n async getStats(): Promise<OfflineQueueStats> {\n const stats: OfflineQueueStats = {\n totalQueued: 0,\n byType: {\n registration: 0,\n heartbeat: 0,\n analytics: 0,\n preferences: 0,\n unregister: 0,\n custom: 0,\n },\n }\n\n if (!this.db) {\n return stats\n }\n\n try {\n const requests = await this.getAllRequests()\n stats.totalQueued = requests.length\n\n for (const request of requests) {\n stats.byType[request.requestType]++\n\n if (!stats.oldestRequest || request.queuedAt < stats.oldestRequest) {\n stats.oldestRequest = request.queuedAt\n }\n if (!stats.newestRequest || request.queuedAt > stats.newestRequest) {\n stats.newestRequest = request.queuedAt\n }\n }\n } catch (error) {\n this.log(`Failed to get stats: ${error}`, 'error')\n }\n\n return stats\n }\n\n /**\n * Clear all queued requests\n */\n async clearQueue(): Promise<void> {\n if (!this.db) return\n\n const transaction = this.db.transaction([STORE_NAME], 'readwrite')\n const store = transaction.objectStore(STORE_NAME)\n await this.promisifyRequest(store.clear())\n\n this.log('Queue cleared')\n }\n\n /**\n * Check if queue has pending requests\n */\n async hasPendingRequests(): Promise<boolean> {\n const count = await this.getQueueCount()\n return count > 0\n }\n\n /**\n * Get number of queued requests\n */\n async getQueueCount(): Promise<number> {\n if (!this.db) return 0\n\n const transaction = this.db.transaction([STORE_NAME], 'readonly')\n const store = transaction.objectStore(STORE_NAME)\n return this.promisifyRequest(store.count())\n }\n\n // ============================================\n // Private IndexedDB methods\n // ============================================\n\n private async openDatabase(): Promise<void> {\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(DB_NAME, DB_VERSION)\n\n request.onerror = () => reject(request.error)\n request.onsuccess = () => {\n this.db = request.result\n resolve()\n }\n\n request.onupgradeneeded = (event) => {\n const db = (event.target as IDBOpenDBRequest).result\n\n // Create offline queue store if it doesn't exist\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n const store = db.createObjectStore(STORE_NAME, {\n keyPath: 'id',\n autoIncrement: true,\n })\n store.createIndex('queuedAt', 'queuedAt', { unique: false })\n store.createIndex('requestType', 'requestType', { unique: false })\n store.createIndex('priority', 'priority', { unique: false })\n }\n\n // Keep existing stores from service worker\n if (!db.objectStoreNames.contains('badge')) {\n db.createObjectStore('badge')\n }\n if (!db.objectStoreNames.contains('notifications')) {\n const notificationStore = db.createObjectStore('notifications', {\n keyPath: 'id',\n autoIncrement: true,\n })\n notificationStore.createIndex('timestamp', 'timestamp', { unique: false })\n notificationStore.createIndex('read', 'read', { unique: false })\n }\n if (!db.objectStoreNames.contains('userPreferences')) {\n db.createObjectStore('userPreferences')\n }\n if (!db.objectStoreNames.contains('syncQueue')) {\n const syncStore = db.createObjectStore('syncQueue', {\n keyPath: 'id',\n autoIncrement: true,\n })\n syncStore.createIndex('timestamp', 'timestamp', { unique: false })\n }\n }\n })\n }\n\n private async addToStore(request: QueuedRequest): Promise<number> {\n const transaction = this.db!.transaction([STORE_NAME], 'readwrite')\n const store = transaction.objectStore(STORE_NAME)\n return this.promisifyRequest(store.add(request)) as Promise<number>\n }\n\n private async removeFromStore(id: number): Promise<void> {\n const transaction = this.db!.transaction([STORE_NAME], 'readwrite')\n const store = transaction.objectStore(STORE_NAME)\n await this.promisifyRequest(store.delete(id))\n }\n\n private async getAllRequests(): Promise<QueuedRequest[]> {\n const transaction = this.db!.transaction([STORE_NAME], 'readonly')\n const store = transaction.objectStore(STORE_NAME)\n return this.promisifyRequest(store.getAll())\n }\n\n private async removeOldestRequest(): Promise<void> {\n const transaction = this.db!.transaction([STORE_NAME], 'readwrite')\n const store = transaction.objectStore(STORE_NAME)\n const index = store.index('queuedAt')\n\n const cursor = index.openCursor()\n return new Promise((resolve, reject) => {\n cursor.onsuccess = (event) => {\n const result = (event.target as IDBRequest).result\n if (result) {\n store.delete(result.primaryKey)\n resolve()\n } else {\n resolve()\n }\n }\n cursor.onerror = () => reject(cursor.error)\n })\n }\n\n private async cleanupOldRequests(): Promise<void> {\n const cutoffTime = Date.now() - this.config.maxAge\n\n const transaction = this.db!.transaction([STORE_NAME], 'readwrite')\n const store = transaction.objectStore(STORE_NAME)\n const index = store.index('queuedAt')\n\n const range = IDBKeyRange.upperBound(cutoffTime)\n const cursor = index.openCursor(range)\n\n let deletedCount = 0\n\n return new Promise((resolve) => {\n cursor.onsuccess = (event) => {\n const result = (event.target as IDBRequest).result\n if (result) {\n store.delete(result.primaryKey)\n deletedCount++\n result.continue()\n } else {\n if (deletedCount > 0) {\n this.log(`Cleaned up ${deletedCount} old requests`)\n }\n resolve()\n }\n }\n cursor.onerror = () => resolve()\n })\n }\n\n private promisifyRequest<T>(request: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n request.onsuccess = () => resolve(request.result)\n request.onerror = () => reject(request.error)\n })\n }\n\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n }\n\n private log(message: string, level: 'log' | 'warn' | 'error' = 'log'): void {\n if (!this.debug && level === 'log') return\n const prefix = '[CloudSignal PWA OfflineQueue]'\n console[level](`${prefix} ${message}`)\n }\n}\n","/**\n * IOSInstallBanner Internationalization (i18n)\n * Language translations for iOS install instructions\n */\n\n/**\n * Supported language codes\n */\nexport type IOSBannerLanguage =\n | 'en' | 'es' | 'fr' | 'de' | 'it' | 'pt' | 'nl'\n | 'ru' | 'zh' | 'ja' | 'ko' | 'ar' | 'he' | 'hi'\n | 'tr' | 'pl' | 'sv' | 'da' | 'no' | 'fi'\n\n/**\n * Language strings interface\n */\nexport interface IOSBannerStrings {\n title: string\n description: string\n buttonText: string\n closeText: string\n step1: string\n step2: string\n step3: string\n shareIconHint: string\n shareIconDescription: string\n}\n\n/**\n * Built-in language translations (20 languages)\n */\nexport const IOS_BANNER_TRANSLATIONS: Record<IOSBannerLanguage, IOSBannerStrings> = {\n en: {\n title: 'Install this app',\n description: 'Add this app to your home screen for the best experience.',\n buttonText: 'Show me how',\n closeText: 'Not now',\n step1: 'Tap the Share button at the bottom of Safari',\n step2: 'Scroll down and tap \"Add to Home Screen\"',\n step3: 'Tap \"Add\" in the top right corner',\n shareIconHint: 'Look for the Share icon',\n shareIconDescription: \"It's the square with an arrow pointing up\",\n },\n es: {\n title: 'Instalar esta aplicación',\n description: 'Añade esta aplicación a tu pantalla de inicio para una mejor experiencia.',\n buttonText: 'Mostrar cómo',\n closeText: 'Ahora no',\n step1: 'Toca el botón Compartir en la parte inferior de Safari',\n step2: 'Desplázate hacia abajo y toca \"Añadir a pantalla de inicio\"',\n step3: 'Toca \"Añadir\" en la esquina superior derecha',\n shareIconHint: 'Busca el icono de Compartir',\n shareIconDescription: 'Es el cuadrado con una flecha apuntando hacia arriba',\n },\n fr: {\n title: 'Installer cette application',\n description: \"Ajoutez cette application à votre écran d'accueil pour une meilleure expérience.\",\n buttonText: 'Montrez-moi comment',\n closeText: 'Pas maintenant',\n step1: 'Appuyez sur le bouton Partager en bas de Safari',\n step2: 'Faites défiler vers le bas et appuyez sur \"Sur l\\'écran d\\'accueil\"',\n step3: 'Appuyez sur \"Ajouter\" dans le coin supérieur droit',\n shareIconHint: \"Recherchez l'icône Partager\",\n shareIconDescription: \"C'est le carré avec une flèche pointant vers le haut\",\n },\n de: {\n title: 'Diese App installieren',\n description: 'Fügen Sie diese App zu Ihrem Startbildschirm hinzu für das beste Erlebnis.',\n buttonText: 'Zeig mir wie',\n closeText: 'Nicht jetzt',\n step1: 'Tippen Sie auf die Teilen-Schaltfläche unten in Safari',\n step2: 'Scrollen Sie nach unten und tippen Sie auf \"Zum Home-Bildschirm\"',\n step3: 'Tippen Sie oben rechts auf \"Hinzufügen\"',\n shareIconHint: 'Suchen Sie das Teilen-Symbol',\n shareIconDescription: 'Es ist das Quadrat mit einem Pfeil nach oben',\n },\n it: {\n title: 'Installa questa app',\n description: \"Aggiungi questa app alla schermata Home per un'esperienza migliore.\",\n buttonText: 'Mostrami come',\n closeText: 'Non ora',\n step1: 'Tocca il pulsante Condividi nella parte inferiore di Safari',\n step2: 'Scorri verso il basso e tocca \"Aggiungi a Home\"',\n step3: \"Tocca \\\"Aggiungi\\\" nell'angolo in alto a destra\",\n shareIconHint: \"Cerca l'icona Condividi\",\n shareIconDescription: \"È il quadrato con una freccia che punta verso l'alto\",\n },\n pt: {\n title: 'Instalar este aplicativo',\n description: 'Adicione este aplicativo à tela inicial para a melhor experiência.',\n buttonText: 'Mostre-me como',\n closeText: 'Agora não',\n step1: 'Toque no botão Compartilhar na parte inferior do Safari',\n step2: 'Role para baixo e toque em \"Adicionar à Tela de Início\"',\n step3: 'Toque em \"Adicionar\" no canto superior direito',\n shareIconHint: 'Procure o ícone Compartilhar',\n shareIconDescription: 'É o quadrado com uma seta apontando para cima',\n },\n nl: {\n title: 'Installeer deze app',\n description: 'Voeg deze app toe aan je beginscherm voor de beste ervaring.',\n buttonText: 'Laat me zien hoe',\n closeText: 'Niet nu',\n step1: 'Tik op de Deel-knop onderaan Safari',\n step2: 'Scroll naar beneden en tik op \"Zet op beginscherm\"',\n step3: 'Tik rechtsboven op \"Voeg toe\"',\n shareIconHint: 'Zoek het Deel-icoon',\n shareIconDescription: 'Het is het vierkant met een pijl omhoog',\n },\n ru: {\n title: 'Установить приложение',\n description: 'Добавьте это приложение на главный экран для лучшего опыта.',\n buttonText: 'Покажите как',\n closeText: 'Не сейчас',\n step1: 'Нажмите кнопку \"Поделиться\" внизу Safari',\n step2: 'Прокрутите вниз и нажмите \"На экран Домой\"',\n step3: 'Нажмите \"Добавить\" в правом верхнем углу',\n shareIconHint: 'Найдите значок \"Поделиться\"',\n shareIconDescription: 'Это квадрат со стрелкой вверх',\n },\n zh: {\n title: '安装此应用',\n description: '将此应用添加到主屏幕以获得最佳体验。',\n buttonText: '显示方法',\n closeText: '暂时不要',\n step1: '点击Safari底部的分享按钮',\n step2: '向下滚动并点击\"添加到主屏幕\"',\n step3: '点击右上角的\"添加\"',\n shareIconHint: '找到分享图标',\n shareIconDescription: '是一个带有向上箭头的方框',\n },\n ja: {\n title: 'このアプリをインストール',\n description: 'ホーム画面に追加して最高の体験を。',\n buttonText: '方法を見る',\n closeText: '今はしない',\n step1: 'Safariの下部にある共有ボタンをタップ',\n step2: '下にスクロールして「ホーム画面に追加」をタップ',\n step3: '右上の「追加」をタップ',\n shareIconHint: '共有アイコンを探してください',\n shareIconDescription: '上向き矢印のある四角形です',\n },\n ko: {\n title: '이 앱 설치',\n description: '최고의 경験을 위해 홈 화면에 추가하세요.',\n buttonText: '방법 보기',\n closeText: '나중에',\n step1: 'Safari 하단의 공유 버튼을 탭하세요',\n step2: '아래로 스크롤하여 \"홈 화면에 추가\"를 탭하세요',\n step3: '오른쪽 상단의 \"추가\"를 탭하세요',\n shareIconHint: '공유 아이콘을 찾으세요',\n shareIconDescription: '위쪽 화살표가 있는 사각형입니다',\n },\n ar: {\n title: 'تثبيت هذا التطبيق',\n description: 'أضف هذا التطبيق إلى الشاشة الرئيسية للحصول على أفضل تجربة.',\n buttonText: 'أرني كيف',\n closeText: 'ليس الآن',\n step1: 'اضغط على زر المشاركة في أسفل Safari',\n step2: 'مرر لأسفل واضغط على \"إضافة إلى الشاشة الرئيسية\"',\n step3: 'اضغط على \"إضافة\" في الزاوية العلوية اليمنى',\n shareIconHint: 'ابحث عن أيقونة المشاركة',\n shareIconDescription: 'هو مربع مع سهم يشير لأعلى',\n },\n he: {\n title: 'התקן אפליקציה זו',\n description: 'הוסף אפליקציה זו למסך הבית לחוויה הטובה ביותר.',\n buttonText: 'הראה לי איך',\n closeText: 'לא עכשיו',\n step1: 'הקש על כפתור השיתוף בתחתית Safari',\n step2: 'גלול למטה והקש על \"הוסף למסך הבית\"',\n step3: 'הקש על \"הוסף\" בפינה הימנית העליונה',\n shareIconHint: 'חפש את סמל השיתוף',\n shareIconDescription: 'זה ריבוע עם חץ מצביע למעלה',\n },\n hi: {\n title: 'यह ऐप इंस्टॉल करें',\n description: 'बेहतर अनुभव के लिए इस ऐप को होम स्क्रीन पर जोड़ें।',\n buttonText: 'मुझे दिखाओ कैसे',\n closeText: 'अभी नहीं',\n step1: 'Safari के नीचे शेयर बटन पर टैप करें',\n step2: 'नीचे स्क्रॉल करें और \"होम स्क्रीन में जोड़ें\" पर टैप करें',\n step3: 'ऊपर दाएं कोने में \"जोड़ें\" पर टैप करें',\n shareIconHint: 'शेयर आइकन खोजें',\n shareIconDescription: 'यह ऊपर की ओर तीर वाला वर्ग है',\n },\n tr: {\n title: 'Bu uygulamayı yükle',\n description: 'En iyi deneyim için bu uygulamayı ana ekranınıza ekleyin.',\n buttonText: 'Nasıl yapılır göster',\n closeText: 'Şimdi değil',\n step1: \"Safari'nin altındaki Paylaş düğmesine dokunun\",\n step2: 'Aşağı kaydırın ve \"Ana Ekrana Ekle\"ye dokunun',\n step3: 'Sağ üst köşedeki \"Ekle\"ye dokunun',\n shareIconHint: 'Paylaş simgesini arayın',\n shareIconDescription: 'Yukarı bakan oklu bir karedir',\n },\n pl: {\n title: 'Zainstaluj tę aplikację',\n description: 'Dodaj tę aplikację do ekranu głównego, aby uzyskać najlepsze wrażenia.',\n buttonText: 'Pokaż mi jak',\n closeText: 'Nie teraz',\n step1: 'Dotknij przycisku Udostępnij na dole Safari',\n step2: 'Przewiń w dół i dotknij \"Dodaj do ekranu początkowego\"',\n step3: 'Dotknij \"Dodaj\" w prawym górnym rogu',\n shareIconHint: 'Poszukaj ikony Udostępnij',\n shareIconDescription: 'To kwadrat ze strzałką skierowaną w górę',\n },\n sv: {\n title: 'Installera denna app',\n description: 'Lägg till denna app på hemskärmen för bästa upplevelse.',\n buttonText: 'Visa mig hur',\n closeText: 'Inte nu',\n step1: 'Tryck på Dela-knappen längst ner i Safari',\n step2: 'Scrolla ner och tryck på \"Lägg till på hemskärmen\"',\n step3: 'Tryck på \"Lägg till\" i övre högra hörnet',\n shareIconHint: 'Leta efter Dela-ikonen',\n shareIconDescription: 'Det är kvadraten med en pil som pekar uppåt',\n },\n da: {\n title: 'Installer denne app',\n description: 'Føj denne app til din startskærm for den bedste oplevelse.',\n buttonText: 'Vis mig hvordan',\n closeText: 'Ikke nu',\n step1: 'Tryk på Del-knappen nederst i Safari',\n step2: 'Rul ned og tryk på \"Føj til hjemmeskærm\"',\n step3: 'Tryk på \"Tilføj\" i øverste højre hjørne',\n shareIconHint: 'Kig efter Del-ikonet',\n shareIconDescription: 'Det er firkanten med en pil, der peger opad',\n },\n no: {\n title: 'Installer denne appen',\n description: 'Legg til denne appen på startskjermen for best opplevelse.',\n buttonText: 'Vis meg hvordan',\n closeText: 'Ikke nå',\n step1: 'Trykk på Del-knappen nederst i Safari',\n step2: 'Rull ned og trykk på \"Legg til på Hjem-skjerm\"',\n step3: 'Trykk på \"Legg til\" øverst til høyre',\n shareIconHint: 'Se etter Del-ikonet',\n shareIconDescription: 'Det er firkanten med en pil som peker oppover',\n },\n fi: {\n title: 'Asenna tämä sovellus',\n description: 'Lisää tämä sovellus aloitusnäytölle parhaan kokemuksen saamiseksi.',\n buttonText: 'Näytä miten',\n closeText: 'Ei nyt',\n step1: 'Napauta Jaa-painiketta Safarin alareunassa',\n step2: 'Vieritä alas ja napauta \"Lisää Koti-valikkoon\"',\n step3: 'Napauta \"Lisää\" oikeassa yläkulmassa',\n shareIconHint: 'Etsi Jaa-kuvake',\n shareIconDescription: 'Se on neliö, jossa on ylöspäin osoittava nuoli',\n },\n}\n\n/**\n * Detect browser language and map to supported language\n */\nexport function detectBrowserLanguage(): IOSBannerLanguage {\n const browserLang = navigator.language?.toLowerCase() || 'en'\n \n // Direct match (e.g., 'en', 'fr', 'de')\n const shortLang = browserLang.split('-')[0] as IOSBannerLanguage\n if (shortLang in IOS_BANNER_TRANSLATIONS) {\n return shortLang\n }\n\n // Special cases for regional variants\n if (browserLang.startsWith('zh')) return 'zh'\n if (browserLang.startsWith('pt')) return 'pt'\n if (browserLang.startsWith('no') || browserLang.startsWith('nb') || browserLang.startsWith('nn')) return 'no'\n\n return 'en'\n}\n","/**\n * IOSInstallBanner - Styled iOS Safari install instructions banner\n * Shows users how to add the PWA to their home screen on iOS\n * Supports 20 languages with auto-detection\n */\n\nimport type {\n IOSInstallBannerConfig,\n IOSInstallBannerStyles,\n IOSInstallBannerState,\n} from './types/wakelock'\nimport {\n type IOSBannerLanguage,\n type IOSBannerStrings,\n IOS_BANNER_TRANSLATIONS,\n detectBrowserLanguage,\n} from './IOSInstallBannerI18n'\n\nconst STORAGE_KEY = 'cloudsignal_pwa_ios_banner_dismissed'\nconst BANNER_ID = 'cloudsignal-ios-install-banner'\n\nexport interface IOSInstallBannerOptions {\n config?: IOSInstallBannerConfig\n /** Language code (e.g., 'en', 'es', 'fr') - auto-detected if not provided */\n language?: IOSBannerLanguage\n /** Custom strings to override built-in translations */\n customStrings?: Partial<IOSBannerStrings>\n debug?: boolean\n onShow?: () => void\n onDismiss?: () => void\n onInstallClick?: () => void\n}\n\n/**\n * Default styles for the iOS install banner\n */\nconst DEFAULT_STYLES: IOSInstallBannerStyles = {\n backgroundColor: '#ffffff',\n textColor: '#1a1a1a',\n buttonBackgroundColor: '#007AFF',\n buttonTextColor: '#ffffff',\n borderRadius: '16px',\n boxShadow: '0 4px 24px rgba(0, 0, 0, 0.15)',\n}\n\n/**\n * IOSInstallBanner displays a styled modal/banner with instructions\n * for iOS Safari users to add the PWA to their home screen\n */\n// IOSInstallBannerConfig with optional iconUrl for internal use\ntype IOSInstallBannerConfigInternal = Omit<Required<IOSInstallBannerConfig>, 'iconUrl'> & { iconUrl?: string }\n\nexport class IOSInstallBanner {\n private config: IOSInstallBannerConfigInternal\n private styles: IOSInstallBannerStyles\n private strings: IOSBannerStrings\n private language: IOSBannerLanguage\n private debug: boolean\n private bannerElement: HTMLElement | null = null\n private overlayElement: HTMLElement | null = null\n\n private onShow?: () => void\n private onDismiss?: () => void\n private onInstallClick?: () => void\n\n constructor(options: IOSInstallBannerOptions = {}) {\n this.debug = options.debug ?? false\n this.onShow = options.onShow\n this.onDismiss = options.onDismiss\n this.onInstallClick = options.onInstallClick\n\n // Detect or use provided language\n this.language = options.language ?? detectBrowserLanguage()\n const baseStrings = IOS_BANNER_TRANSLATIONS[this.language]\n\n // Merge custom strings with base translations\n this.strings = {\n ...baseStrings,\n ...options.customStrings,\n }\n\n this.config = {\n enabled: options.config?.enabled ?? true,\n title: options.config?.title ?? this.strings.title,\n description: options.config?.description ?? this.strings.description,\n buttonText: options.config?.buttonText ?? this.strings.buttonText,\n closeText: options.config?.closeText ?? this.strings.closeText,\n iconUrl: options.config?.iconUrl,\n customStyles: options.config?.customStyles ?? {},\n showDelay: options.config?.showDelay ?? 3000,\n dismissalDays: options.config?.dismissalDays ?? 7,\n position: options.config?.position ?? 'bottom',\n }\n\n this.styles = { ...DEFAULT_STYLES, ...this.config.customStyles }\n this.log(`Initialized with language: ${this.language}`)\n }\n\n /**\n * Get current language\n */\n getLanguage(): IOSBannerLanguage {\n return this.language\n }\n\n /**\n * Get current strings\n */\n getStrings(): IOSBannerStrings {\n return this.strings\n }\n\n /**\n * Set language and update strings\n */\n setLanguage(language: IOSBannerLanguage): void {\n this.language = language\n const baseStrings = IOS_BANNER_TRANSLATIONS[language]\n this.strings = { ...baseStrings }\n\n // Update config strings\n this.config.title = this.strings.title\n this.config.description = this.strings.description\n this.config.buttonText = this.strings.buttonText\n this.config.closeText = this.strings.closeText\n\n this.log(`Language changed to: ${language}`)\n }\n\n /**\n * Get current banner state\n */\n getState(): IOSInstallBannerState {\n return {\n isVisible: this.bannerElement !== null,\n wasDismissed: this.wasDismissed(),\n isEligible: this.isEligible(),\n isInstalled: this.isInstalled(),\n }\n }\n\n /**\n * Check if device is iOS Safari (eligible for banner)\n */\n isEligible(): boolean {\n const userAgent = navigator.userAgent\n \n // Check if iOS\n const isIOS = /iPad|iPhone|iPod/.test(userAgent) && !(window as any).MSStream\n if (!isIOS) return false\n\n // Check if Safari (not Chrome, Firefox, etc.)\n const isSafari = /Safari/i.test(userAgent) && !/Chrome|CriOS|FxiOS|EdgiOS/i.test(userAgent)\n if (!isSafari) return false\n\n // Check if already installed (standalone mode)\n if (this.isInstalled()) return false\n\n return true\n }\n\n /**\n * Check if PWA is already installed (running in standalone mode)\n */\n isInstalled(): boolean {\n // iOS standalone mode check\n if ((navigator as any).standalone === true) return true\n\n // Media query check\n if (window.matchMedia('(display-mode: standalone)').matches) return true\n\n return false\n }\n\n /**\n * Check if banner was previously dismissed\n */\n wasDismissed(): boolean {\n try {\n const dismissed = localStorage.getItem(STORAGE_KEY)\n if (!dismissed) return false\n\n const dismissedTime = parseInt(dismissed, 10)\n const daysSinceDismissal = (Date.now() - dismissedTime) / (1000 * 60 * 60 * 24)\n\n // If dismissal period has passed, clear it and allow showing again\n if (daysSinceDismissal > this.config.dismissalDays) {\n localStorage.removeItem(STORAGE_KEY)\n return false\n }\n\n return true\n } catch {\n return false\n }\n }\n\n /**\n * Show the install banner if eligible\n */\n async show(): Promise<boolean> {\n if (!this.config.enabled) {\n this.log('Banner is disabled')\n return false\n }\n\n if (!this.isEligible()) {\n this.log('Device not eligible for iOS install banner')\n return false\n }\n\n if (this.wasDismissed()) {\n this.log('Banner was dismissed recently')\n return false\n }\n\n if (this.bannerElement) {\n this.log('Banner already visible')\n return true\n }\n\n // Delay before showing\n if (this.config.showDelay > 0) {\n await new Promise((resolve) => setTimeout(resolve, this.config.showDelay))\n }\n\n // Double-check eligibility after delay\n if (!this.isEligible() || this.wasDismissed()) {\n return false\n }\n\n this.createBanner()\n this.log('Banner shown')\n this.onShow?.()\n\n return true\n }\n\n /**\n * Hide the install banner\n */\n hide(): void {\n if (this.bannerElement) {\n this.bannerElement.remove()\n this.bannerElement = null\n }\n if (this.overlayElement) {\n this.overlayElement.remove()\n this.overlayElement = null\n }\n }\n\n /**\n * Dismiss the banner and remember the dismissal\n */\n dismiss(): void {\n this.hide()\n\n try {\n localStorage.setItem(STORAGE_KEY, Date.now().toString())\n } catch {\n // localStorage not available\n }\n\n this.log('Banner dismissed')\n this.onDismiss?.()\n }\n\n /**\n * Reset dismissal state (for testing or after significant time)\n */\n resetDismissal(): void {\n try {\n localStorage.removeItem(STORAGE_KEY)\n } catch {\n // localStorage not available\n }\n }\n\n /**\n * Get iOS install steps (localized)\n */\n getInstallSteps(): string[] {\n return [\n this.strings.step1,\n this.strings.step2,\n this.strings.step3,\n ]\n }\n\n // ============================================\n // Private methods\n // ============================================\n\n /**\n * Create and inject the banner element\n */\n private createBanner(): void {\n // Create overlay\n this.overlayElement = document.createElement('div')\n this.overlayElement.id = `${BANNER_ID}-overlay`\n this.overlayElement.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n z-index: 999998;\n opacity: 0;\n transition: opacity 0.3s ease;\n `\n this.overlayElement.addEventListener('click', () => this.dismiss())\n document.body.appendChild(this.overlayElement)\n\n // Create banner\n this.bannerElement = document.createElement('div')\n this.bannerElement.id = BANNER_ID\n\n const positionStyles = this.config.position === 'top'\n ? 'top: 20px;'\n : 'bottom: 20px;'\n\n this.bannerElement.style.cssText = `\n position: fixed;\n ${positionStyles}\n left: 20px;\n right: 20px;\n max-width: 400px;\n margin: 0 auto;\n background: ${this.styles.backgroundColor};\n color: ${this.styles.textColor};\n border-radius: ${this.styles.borderRadius};\n box-shadow: ${this.styles.boxShadow};\n z-index: 999999;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;\n opacity: 0;\n transform: translateY(${this.config.position === 'top' ? '-20px' : '20px'});\n transition: opacity 0.3s ease, transform 0.3s ease;\n `\n\n const steps = this.getInstallSteps()\n const iconHtml = this.config.iconUrl\n ? `<img src=\"${this.config.iconUrl}\" alt=\"App icon\" style=\"width: 60px; height: 60px; border-radius: 12px; margin-right: 16px;\">`\n : ''\n\n this.bannerElement.innerHTML = `\n <div style=\"padding: 20px;\">\n <div style=\"display: flex; align-items: flex-start; margin-bottom: 16px;\">\n ${iconHtml}\n <div style=\"flex: 1;\">\n <h3 style=\"margin: 0 0 4px 0; font-size: 18px; font-weight: 600;\">${this.config.title}</h3>\n <p style=\"margin: 0; font-size: 14px; opacity: 0.7;\">${this.config.description}</p>\n </div>\n </div>\n \n <div id=\"${BANNER_ID}-steps\" style=\"display: none; margin-bottom: 16px;\">\n <ol style=\"margin: 0; padding-left: 24px; font-size: 14px; line-height: 1.6;\">\n ${steps.map((step) => `<li style=\"margin-bottom: 8px;\">${step}</li>`).join('')}\n </ol>\n <div style=\"margin-top: 16px; padding: 12px; background: rgba(0,122,255,0.1); border-radius: 8px; font-size: 13px;\">\n <strong style=\"display: flex; align-items: center; gap: 8px;\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M12 5v14M5 12l7-7 7 7\"/>\n </svg>\n ${this.strings.shareIconHint}\n </strong>\n <span style=\"display: block; margin-top: 4px; opacity: 0.7;\">${this.strings.shareIconDescription}</span>\n </div>\n </div>\n \n <div style=\"display: flex; gap: 12px;\">\n <button id=\"${BANNER_ID}-show\" style=\"\n flex: 1;\n padding: 12px 16px;\n background: ${this.styles.buttonBackgroundColor};\n color: ${this.styles.buttonTextColor};\n border: none;\n border-radius: 10px;\n font-size: 16px;\n font-weight: 600;\n cursor: pointer;\n -webkit-tap-highlight-color: transparent;\n \">${this.config.buttonText}</button>\n <button id=\"${BANNER_ID}-close\" style=\"\n padding: 12px 16px;\n background: transparent;\n color: ${this.styles.textColor};\n border: 1px solid rgba(0,0,0,0.1);\n border-radius: 10px;\n font-size: 16px;\n cursor: pointer;\n -webkit-tap-highlight-color: transparent;\n \">${this.config.closeText}</button>\n </div>\n </div>\n `\n\n document.body.appendChild(this.bannerElement)\n\n // Add event listeners\n const showButton = document.getElementById(`${BANNER_ID}-show`)\n const closeButton = document.getElementById(`${BANNER_ID}-close`)\n const stepsElement = document.getElementById(`${BANNER_ID}-steps`)\n\n showButton?.addEventListener('click', () => {\n if (stepsElement) {\n stepsElement.style.display = stepsElement.style.display === 'none' ? 'block' : 'none'\n showButton.textContent = stepsElement.style.display === 'none' \n ? this.config.buttonText \n : 'Got it!'\n }\n this.onInstallClick?.()\n })\n\n closeButton?.addEventListener('click', () => this.dismiss())\n\n // Animate in\n requestAnimationFrame(() => {\n if (this.overlayElement) {\n this.overlayElement.style.opacity = '1'\n }\n if (this.bannerElement) {\n this.bannerElement.style.opacity = '1'\n this.bannerElement.style.transform = 'translateY(0)'\n }\n })\n }\n\n /**\n * Log message if debug is enabled\n */\n private log(message: string, level: 'log' | 'warn' | 'error' = 'log'): void {\n if (!this.debug && level === 'log') return\n const prefix = '[CloudSignal PWA IOSBanner]'\n console[level](`${prefix} ${message}`)\n }\n}\n","/**\n * CloudSignalPWA - Main CloudSignal PWA SDK Entry Point\n * Integrates all managers for a unified PWA experience\n * \n * v1.1.0: Added WakeLock, OfflineQueue, iOS Install Banner, Network-aware Heartbeat\n * v1.2.0: Added JWT auth support for user-linked registrations\n */\n\nimport type {\n PWAConfig,\n PWAServiceConfig,\n InitializeResult,\n DeviceInfo,\n InstallationState,\n InstallResult,\n Registration,\n RegisterOptions,\n NotificationPreferences,\n RegistrationStatusResponse,\n PWAEvent,\n EventHandler,\n AuthMode,\n} from './types'\nimport type { WakeLockState, NetworkConnectionInfo, BatteryInfo } from './types/wakelock'\nimport type { OfflineQueueStats, QueueProcessResult } from './types/offline'\nimport { DeviceDetector } from './DeviceDetector'\nimport { ServiceWorkerManager } from './ServiceWorkerManager'\nimport { InstallationManager } from './InstallationManager'\nimport { PushNotificationManager } from './PushNotificationManager'\nimport { HeartbeatManager } from './HeartbeatManager'\nimport { WakeLockManager } from './WakeLockManager'\nimport { OfflineQueueManager } from './OfflineQueueManager'\nimport { IOSInstallBanner } from './IOSInstallBanner'\nimport { makeAuthenticatedRequest } from './utils/hmac'\nimport {\n type AuthContext,\n createAuthContext,\n makeAuthenticatedRequestWithContext,\n updateAuthToken,\n} from './utils/jwt-auth'\n\nconst DEFAULT_SERVICE_URL = 'https://pwa.cloudsignal.app'\nconst SDK_VERSION = '1.2.0'\n\n/**\n * CloudSignal PWA Client\n * Main class for PWA functionality including installation, push notifications, and device tracking\n */\nexport class CloudSignalPWA {\n private config: PWAConfig\n private serviceUrl: string\n private debug: boolean\n private initialized: boolean = false\n private serviceConfig: PWAServiceConfig | null = null\n private authContext: AuthContext\n\n // Core Managers\n private deviceDetector: DeviceDetector\n private serviceWorkerManager: ServiceWorkerManager\n private installationManager: InstallationManager\n private pushNotificationManager: PushNotificationManager\n private heartbeatManager: HeartbeatManager\n\n // v1.1.0 Managers\n private wakeLockManager: WakeLockManager | null = null\n private offlineQueueManager: OfflineQueueManager | null = null\n private iosInstallBanner: IOSInstallBanner | null = null\n\n // Event emitter\n private eventHandlers: Map<PWAEvent, Set<EventHandler>> = new Map()\n\n constructor(config: PWAConfig) {\n this.config = config\n this.serviceUrl = config.serviceUrl || DEFAULT_SERVICE_URL\n this.debug = config.debug ?? false\n\n // Validate auth configuration\n if (!config.organizationSecret && !config.userToken) {\n throw new Error('Either organizationSecret or userToken must be provided')\n }\n\n // Initialize auth context (supports both HMAC and JWT)\n this.authContext = createAuthContext({\n organizationId: config.organizationId,\n organizationSecret: config.organizationSecret,\n userToken: config.userToken,\n })\n\n // Initialize device detector\n this.deviceDetector = new DeviceDetector()\n\n // Initialize service worker manager\n this.serviceWorkerManager = new ServiceWorkerManager({\n config: config.serviceWorker,\n debug: this.debug,\n onRegistered: (reg) => this.emit('sw:registered', { registration: reg }),\n onUpdated: (reg) => this.emit('sw:updated', { registration: reg }),\n onError: (err) => this.emit('sw:error', { error: err }),\n })\n\n // Initialize installation manager\n this.installationManager = new InstallationManager({\n debug: this.debug,\n onInstallAvailable: (event) => this.emit('install:available', { platforms: event.platforms }),\n onInstallAccepted: (result) => this.emit('install:accepted', result),\n onInstallDismissed: (result) => this.emit('install:dismissed', result),\n onInstalled: () => this.emit('install:completed', {}),\n })\n\n // Initialize push notification manager with dual-mode auth\n this.pushNotificationManager = new PushNotificationManager({\n serviceUrl: this.serviceUrl,\n organizationId: config.organizationId,\n organizationSecret: config.organizationSecret,\n userToken: config.userToken,\n onTokenExpired: config.onTokenExpired,\n serviceId: config.serviceId,\n debug: this.debug,\n onRegistered: (reg) => {\n this.emit('push:registered', { registrationId: reg.registrationId, endpoint: '' })\n // Start heartbeat after registration\n this.heartbeatManager.setRegistrationId(reg.registrationId)\n },\n onUnregistered: () => {\n this.emit('push:unregistered', {})\n this.heartbeatManager.stop()\n },\n onError: (err) => this.emit('push:error', { error: err }),\n onPermissionDenied: () => this.emit('permission:denied', { permission: 'denied' }),\n })\n\n // Initialize heartbeat manager with network/battery awareness and dual-mode auth\n this.heartbeatManager = new HeartbeatManager({\n serviceUrl: this.serviceUrl,\n organizationId: config.organizationId,\n organizationSecret: config.organizationSecret,\n userToken: config.userToken,\n onTokenExpired: config.onTokenExpired,\n config: config.heartbeat,\n debug: this.debug,\n onHeartbeatSent: () => this.emit('heartbeat:sent', { timestamp: Date.now() }),\n onHeartbeatError: (err) => this.emit('heartbeat:error', { timestamp: Date.now(), error: err.message }),\n onIntervalChanged: (interval, reason) => this.emit('heartbeat:intervalChanged', { interval, reason }),\n onPausedForBattery: () => this.emit('heartbeat:pausedForBattery', { timestamp: Date.now() }),\n onResumedFromBattery: () => this.emit('heartbeat:resumedFromBattery', { timestamp: Date.now() }),\n })\n\n // Initialize wake lock manager if enabled (v1.1.0)\n if (config.wakeLock?.enabled !== false) {\n this.wakeLockManager = new WakeLockManager({\n config: {\n enabled: config.wakeLock?.enabled ?? true,\n autoReacquire: config.wakeLock?.reacquireOnVisibility ?? true,\n },\n debug: this.debug,\n onAcquired: () => this.emit('wakeLock:acquired', { timestamp: Date.now() }),\n onReleased: (event) => this.emit('wakeLock:released', { reason: event.reason, timestamp: Date.now() }),\n onError: (event) => this.emit('wakeLock:error', { error: event.error }),\n })\n }\n\n // Initialize offline queue manager if enabled (v1.1.0)\n if (config.offlineQueue?.enabled !== false) {\n this.offlineQueueManager = new OfflineQueueManager({\n config: {\n enabled: config.offlineQueue?.enabled ?? true,\n maxQueueSize: config.offlineQueue?.maxQueueSize ?? 100,\n maxAge: (config.offlineQueue?.maxAgeTTLHours ?? 24) * 60 * 60 * 1000,\n processOnOnline: config.offlineQueue?.autoProcessOnOnline ?? true,\n },\n debug: this.debug,\n onRequestQueued: (req) => this.emit('offlineQueue:queued', { url: req.url, method: req.method }),\n onRequestProcessed: (result) => this.emit('offlineQueue:processed', { success: result.success, requestId: result.id }),\n onQueueEmpty: () => this.emit('offlineQueue:flushed', {}),\n })\n }\n\n // Initialize iOS install banner if on iOS Safari and not installed (v1.1.0)\n if (config.iosInstallBanner?.enabled !== false) {\n const deviceInfo = this.deviceDetector.getDeviceInfo()\n if (deviceInfo.isIOS && deviceInfo.browser === 'Safari') {\n this.iosInstallBanner = new IOSInstallBanner({\n config: {\n enabled: config.iosInstallBanner?.enabled ?? true,\n title: config.iosInstallBanner?.title,\n description: config.iosInstallBanner?.subtitle,\n iconUrl: config.iosInstallBanner?.iconUrl,\n showDelay: config.iosInstallBanner?.showDelay,\n dismissalDays: config.iosInstallBanner?.dismissRememberDays,\n },\n debug: this.debug,\n onShow: () => this.emit('iosBanner:shown', {}),\n onDismiss: () => this.emit('iosBanner:dismissed', {}),\n onInstallClick: () => this.emit('iosBanner:installClicked', {}),\n })\n }\n }\n\n this.log(`CloudSignal PWA SDK v${SDK_VERSION} initialized`)\n }\n\n // ============================================\n // Initialization\n // ============================================\n\n /**\n * Initialize the PWA client\n * Downloads config, registers service worker, and sets up event listeners\n */\n async initialize(): Promise<InitializeResult> {\n try {\n this.log('Initializing PWA client...')\n\n // Initialize installation manager event listeners\n this.installationManager.initialize()\n\n // Register service worker\n const swReg = await this.serviceWorkerManager.register()\n if (swReg) {\n this.pushNotificationManager.setServiceWorkerRegistration(swReg)\n }\n\n // Download service configuration\n const serviceConfig = await this.downloadConfig()\n\n // Set up network listeners\n this.setupNetworkListeners()\n\n // Initialize offline queue if enabled\n if (this.offlineQueueManager) {\n await this.offlineQueueManager.initialize()\n }\n\n // Configure service worker analytics\n if (this.config.notificationAnalytics?.enabled !== false && swReg) {\n this.configureNotificationAnalytics(swReg)\n }\n\n // Show iOS install banner if appropriate\n if (this.iosInstallBanner && this.config.iosInstallBanner?.showOnFirstVisit !== false) {\n const installState = this.installationManager.getState()\n if (!installState.isInstalled) {\n this.iosInstallBanner.show()\n }\n }\n\n this.initialized = true\n\n const result: InitializeResult = {\n success: true,\n config: serviceConfig || undefined,\n deviceInfo: this.deviceDetector.getDeviceInfo(),\n installationState: this.installationManager.getState(),\n }\n\n this.log('PWA client initialized successfully')\n return result\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n this.log(`Initialization failed: ${err.message}`, 'error')\n return {\n success: false,\n error: err.message,\n }\n }\n }\n\n /**\n * Download PWA service configuration from backend\n */\n async downloadConfig(): Promise<PWAServiceConfig | null> {\n try {\n const url = `${this.serviceUrl}/api/v1/config/download`\n const response = await makeAuthenticatedRequestWithContext(\n this.authContext,\n 'POST',\n url,\n { organization_id: this.config.organizationId },\n this.config.onTokenExpired\n )\n\n if (!response.ok) {\n throw new Error(`Config download failed: ${response.status}`)\n }\n\n const config = await response.json()\n this.serviceConfig = config\n\n // Set VAPID key for push notifications\n if (config.vapid_public_key) {\n this.pushNotificationManager.setVapidPublicKey(config.vapid_public_key)\n }\n\n // Inject manifest if URL provided\n if (config.manifest_url) {\n this.injectManifest(config.manifest_url)\n }\n\n this.emit('config:loaded', { config })\n this.log('Configuration downloaded successfully')\n\n return config\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n this.log(`Config download failed: ${err.message}`, 'error')\n this.emit('config:error', { error: err })\n return null\n }\n }\n\n // ============================================\n // Installation\n // ============================================\n\n /**\n * Show the PWA install prompt\n */\n async showInstallPrompt(): Promise<InstallResult> {\n return this.installationManager.showInstallPrompt()\n }\n\n /**\n * Get current installation state\n */\n getInstallationState(): InstallationState {\n return this.installationManager.getState()\n }\n\n /**\n * Check if PWA can be installed\n */\n canInstall(): boolean {\n return this.installationManager.canInstall()\n }\n\n /**\n * Check if PWA is installed\n */\n isInstalled(): boolean {\n return this.installationManager.isPWAInstalled()\n }\n\n /**\n * Get installation steps for current platform\n */\n getInstallSteps(): string[] {\n return this.installationManager.getInstallSteps()\n }\n\n // ============================================\n // Push Notifications\n // ============================================\n\n /**\n * Register for push notifications\n */\n async registerForPush(options?: RegisterOptions): Promise<Registration | null> {\n return this.pushNotificationManager.register(options)\n }\n\n /**\n * Unregister from push notifications\n */\n async unregisterFromPush(): Promise<boolean> {\n return this.pushNotificationManager.unregister()\n }\n\n /**\n * Update notification preferences\n */\n async updatePreferences(preferences: NotificationPreferences): Promise<boolean> {\n return this.pushNotificationManager.updatePreferences(preferences)\n }\n\n /**\n * Check registration status\n */\n async checkRegistrationStatus(): Promise<RegistrationStatusResponse | null> {\n return this.pushNotificationManager.checkStatus()\n }\n\n /**\n * Get current registration ID\n */\n getRegistrationId(): string | null {\n return this.pushNotificationManager.getRegistrationId()\n }\n\n /**\n * Check if registered for push notifications\n */\n isRegistered(): boolean {\n return this.pushNotificationManager.isRegistered()\n }\n\n /**\n * Request notification permission\n */\n async requestPermission(): Promise<NotificationPermission> {\n return this.pushNotificationManager.requestPermission()\n }\n\n // ============================================\n // Authentication\n // ============================================\n\n /**\n * Get current authentication mode\n */\n getAuthMode(): AuthMode {\n return this.authContext.mode\n }\n\n /**\n * Set JWT user token (for upgrading anonymous to authenticated, or token refresh)\n * After calling this, you should call registerForPush() again to re-register with user context\n * @param token - JWT token from identity provider\n */\n setUserToken(token: string): void {\n this.authContext = updateAuthToken(this.authContext, token)\n this.pushNotificationManager.updateToken(token)\n this.heartbeatManager.updateToken(token)\n this.emit('auth:tokenUpdated', { mode: this.authContext.mode })\n this.log(`Auth mode updated to: ${this.authContext.mode}`)\n }\n\n // ============================================\n // Device Information\n // ============================================\n\n /**\n * Get comprehensive device information\n */\n getDeviceInfo(): DeviceInfo {\n return this.deviceDetector.getDeviceInfo()\n }\n\n /**\n * Get PWA capabilities\n */\n getCapabilities() {\n return this.deviceDetector.getCapabilities()\n }\n\n // ============================================\n // Heartbeat\n // ============================================\n\n /**\n * Start heartbeat for online status tracking\n */\n startHeartbeat(): void {\n const regId = this.pushNotificationManager.getRegistrationId()\n if (regId) {\n this.heartbeatManager.setRegistrationId(regId)\n this.heartbeatManager.start()\n this.emit('heartbeat:started', { timestamp: Date.now() })\n } else {\n this.log('Cannot start heartbeat: not registered', 'warn')\n }\n }\n\n /**\n * Stop heartbeat\n */\n stopHeartbeat(): void {\n this.heartbeatManager.stop()\n this.emit('heartbeat:stopped', { timestamp: Date.now() })\n }\n\n /**\n * Get current heartbeat interval (may vary with network conditions)\n */\n getHeartbeatInterval(): number {\n return this.heartbeatManager.getCurrentInterval()\n }\n\n /**\n * Get current network connection info\n */\n getNetworkInfo(): NetworkConnectionInfo {\n return this.heartbeatManager.getNetworkInfo()\n }\n\n /**\n * Get battery info if available\n */\n async getBatteryInfo(): Promise<BatteryInfo | null> {\n return this.heartbeatManager.getBatteryInfo()\n }\n\n // ============================================\n // Wake Lock (v1.1.0)\n // ============================================\n\n /**\n * Request screen wake lock to prevent sleep\n */\n async requestWakeLock(): Promise<boolean> {\n if (!this.wakeLockManager) {\n this.log('Wake lock manager not initialized', 'warn')\n return false\n }\n return this.wakeLockManager.acquire()\n }\n\n /**\n * Release screen wake lock\n */\n releaseWakeLock(): void {\n this.wakeLockManager?.release()\n }\n\n /**\n * Get wake lock state\n */\n getWakeLockState(): WakeLockState {\n if (!this.wakeLockManager) {\n return { isSupported: false, isActive: false }\n }\n return this.wakeLockManager.getState()\n }\n\n // ============================================\n // Offline Queue (v1.1.0)\n // ============================================\n\n /**\n * Queue a request for later execution when offline\n */\n async queueOfflineRequest(\n url: string,\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE',\n options?: {\n body?: string\n headers?: Record<string, string>\n }\n ): Promise<number | null> {\n if (!this.offlineQueueManager) {\n this.log('Offline queue manager not initialized', 'warn')\n return null\n }\n return this.offlineQueueManager.queueRequest(url, method, {\n body: options?.body,\n headers: options?.headers,\n })\n }\n\n /**\n * Process all queued requests\n */\n async processOfflineQueue(): Promise<QueueProcessResult[]> {\n if (!this.offlineQueueManager) {\n return []\n }\n return this.offlineQueueManager.processQueue()\n }\n\n /**\n * Get offline queue statistics\n */\n async getOfflineQueueStats(): Promise<OfflineQueueStats> {\n if (!this.offlineQueueManager) {\n return { totalQueued: 0, byType: { registration: 0, heartbeat: 0, analytics: 0, preferences: 0, unregister: 0, custom: 0 } }\n }\n return this.offlineQueueManager.getStats()\n }\n\n /**\n * Clear all queued requests\n */\n async clearOfflineQueue(): Promise<void> {\n await this.offlineQueueManager?.clearQueue()\n }\n\n // ============================================\n // iOS Install Banner (v1.1.0)\n // ============================================\n\n /**\n * Show iOS install banner manually\n */\n showIOSInstallBanner(): void {\n if (!this.iosInstallBanner) {\n this.log('iOS install banner not available (not on iOS Safari)', 'warn')\n return\n }\n this.iosInstallBanner.show()\n }\n\n /**\n * Hide iOS install banner\n */\n hideIOSInstallBanner(): void {\n this.iosInstallBanner?.hide()\n }\n\n /**\n * Check if iOS install banner was previously dismissed\n */\n wasIOSBannerDismissed(): boolean {\n return this.iosInstallBanner?.wasDismissed() ?? false\n }\n\n /**\n * Reset iOS banner dismissal state\n */\n resetIOSBannerDismissal(): void {\n this.iosInstallBanner?.resetDismissal()\n }\n\n // ============================================\n // Service Worker\n // ============================================\n\n /**\n * Clear app badge\n */\n clearBadge(): void {\n this.serviceWorkerManager.clearBadge()\n }\n\n /**\n * Set app badge count\n */\n setBadge(count: number): void {\n this.serviceWorkerManager.setBadge(count)\n }\n\n /**\n * Check for service worker updates\n */\n async checkForUpdates(): Promise<void> {\n return this.serviceWorkerManager.checkForUpdate()\n }\n\n // ============================================\n // Events\n // ============================================\n\n /**\n * Subscribe to an event\n */\n on(event: PWAEvent, handler: EventHandler): void {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, new Set())\n }\n this.eventHandlers.get(event)!.add(handler)\n }\n\n /**\n * Unsubscribe from an event\n */\n off(event: PWAEvent, handler: EventHandler): void {\n const handlers = this.eventHandlers.get(event)\n if (handlers) {\n handlers.delete(handler)\n }\n }\n\n /**\n * Emit an event\n */\n private emit(event: PWAEvent, data: any): void {\n const handlers = this.eventHandlers.get(event)\n if (handlers) {\n handlers.forEach(handler => {\n try {\n handler(data)\n } catch (error) {\n this.log(`Event handler error for ${event}: ${error}`, 'error')\n }\n })\n }\n }\n\n // ============================================\n // Utility Methods\n // ============================================\n\n /**\n * Get SDK version\n */\n getVersion(): string {\n return SDK_VERSION\n }\n\n /**\n * Get service configuration\n */\n getServiceConfig(): PWAServiceConfig | null {\n return this.serviceConfig\n }\n\n /**\n * Check if client is initialized\n */\n isInitialized(): boolean {\n return this.initialized\n }\n\n /**\n * Inject PWA manifest link\n */\n private injectManifest(manifestUrl: string): void {\n let manifestLink = document.querySelector('link[rel=\"manifest\"]')\n if (!manifestLink) {\n manifestLink = document.createElement('link')\n manifestLink.setAttribute('rel', 'manifest')\n document.head.appendChild(manifestLink)\n }\n manifestLink.setAttribute('href', manifestUrl)\n this.log(`Manifest injected: ${manifestUrl}`)\n }\n\n /**\n * Set up network status listeners\n */\n private setupNetworkListeners(): void {\n window.addEventListener('online', () => {\n this.deviceDetector.clearCache()\n this.emit('network:online', { isOnline: true })\n\n // Process offline queue when coming back online\n if (this.offlineQueueManager) {\n this.offlineQueueManager.processQueue().catch((err) => {\n this.log(`Failed to process offline queue: ${err.message}`, 'error')\n })\n }\n })\n\n window.addEventListener('offline', () => {\n this.deviceDetector.clearCache()\n this.emit('network:offline', { isOnline: false })\n })\n }\n\n /**\n * Configure notification analytics in service worker\n */\n private configureNotificationAnalytics(swReg: ServiceWorkerRegistration): void {\n const endpoint = this.config.notificationAnalytics?.endpoint ||\n `${this.serviceUrl}/api/v1/analytics/notifications`\n\n swReg.active?.postMessage({\n type: 'CONFIGURE_ANALYTICS',\n config: {\n enabled: this.config.notificationAnalytics?.enabled !== false,\n endpoint,\n organizationId: this.config.organizationId,\n },\n })\n\n this.log('Notification analytics configured')\n }\n\n /**\n * Log message if debug is enabled\n */\n private log(message: string, level: 'log' | 'warn' | 'error' = 'log'): void {\n if (!this.debug && level === 'log') return\n const prefix = '[CloudSignal PWA]'\n console[level](`${prefix} ${message}`)\n }\n}\n\n// Export as default\nexport default CloudSignalPWA\n","/**\n * NotificationPermissionPrompt - Soft prompt before native notification permission\n * Improves opt-in rates by explaining value before triggering browser prompt\n * Supports 20 languages with auto-detection\n */\n\nimport {\n type IOSBannerLanguage,\n detectBrowserLanguage,\n} from './IOSInstallBannerI18n'\n\nconst STORAGE_KEY = 'cloudsignal_pwa_notification_prompt_dismissed'\nconst PROMPT_ID = 'cloudsignal-notification-prompt'\n\n/**\n * Notification prompt strings interface\n */\nexport interface NotificationPromptStrings {\n title: string\n description: string\n allowButton: string\n laterButton: string\n iosNote?: string\n}\n\n/**\n * Built-in translations (20 languages)\n */\nexport const NOTIFICATION_PROMPT_TRANSLATIONS: Record<IOSBannerLanguage, NotificationPromptStrings> = {\n en: {\n title: 'Stay Updated',\n description: 'Get notified about important updates, messages, and alerts.',\n allowButton: 'Enable Notifications',\n laterButton: 'Maybe Later',\n iosNote: 'On iOS, you must first add this app to your home screen.',\n },\n es: {\n title: 'Mantente Actualizado',\n description: 'Recibe notificaciones sobre actualizaciones importantes, mensajes y alertas.',\n allowButton: 'Activar Notificaciones',\n laterButton: 'Quizás Después',\n iosNote: 'En iOS, primero debes añadir esta aplicación a tu pantalla de inicio.',\n },\n fr: {\n title: 'Restez Informé',\n description: 'Recevez des notifications sur les mises à jour importantes, messages et alertes.',\n allowButton: 'Activer les Notifications',\n laterButton: 'Plus Tard',\n iosNote: \"Sur iOS, vous devez d'abord ajouter cette application à votre écran d'accueil.\",\n },\n de: {\n title: 'Bleiben Sie Informiert',\n description: 'Erhalten Sie Benachrichtigungen über wichtige Updates, Nachrichten und Warnungen.',\n allowButton: 'Benachrichtigungen Aktivieren',\n laterButton: 'Vielleicht Später',\n iosNote: 'Auf iOS müssen Sie diese App zuerst zum Startbildschirm hinzufügen.',\n },\n it: {\n title: 'Rimani Aggiornato',\n description: 'Ricevi notifiche su aggiornamenti importanti, messaggi e avvisi.',\n allowButton: 'Attiva Notifiche',\n laterButton: 'Forse Dopo',\n iosNote: 'Su iOS, devi prima aggiungere questa app alla schermata Home.',\n },\n pt: {\n title: 'Fique Atualizado',\n description: 'Receba notificações sobre atualizações importantes, mensagens e alertas.',\n allowButton: 'Ativar Notificações',\n laterButton: 'Talvez Depois',\n iosNote: 'No iOS, você deve primeiro adicionar este aplicativo à tela inicial.',\n },\n nl: {\n title: 'Blijf Op De Hoogte',\n description: 'Ontvang meldingen over belangrijke updates, berichten en waarschuwingen.',\n allowButton: 'Meldingen Inschakelen',\n laterButton: 'Misschien Later',\n iosNote: 'Op iOS moet je deze app eerst toevoegen aan je beginscherm.',\n },\n ru: {\n title: 'Будьте в Курсе',\n description: 'Получайте уведомления о важных обновлениях, сообщениях и предупреждениях.',\n allowButton: 'Включить Уведомления',\n laterButton: 'Позже',\n iosNote: 'На iOS сначала добавьте это приложение на главный экран.',\n },\n zh: {\n title: '保持更新',\n description: '获取重要更新、消息和提醒的通知。',\n allowButton: '启用通知',\n laterButton: '稍后再说',\n iosNote: '在iOS上,您必须先将此应用添加到主屏幕。',\n },\n ja: {\n title: '最新情報を入手',\n description: '重要なアップデート、メッセージ、アラートの通知を受け取ります。',\n allowButton: '通知を有効にする',\n laterButton: '後で',\n iosNote: 'iOSでは、まずこのアプリをホーム画面に追加する必要があります。',\n },\n ko: {\n title: '최신 정보 받기',\n description: '중요한 업데이트, 메시지 및 알림에 대한 알림을 받으세요.',\n allowButton: '알림 활성화',\n laterButton: '나중에',\n iosNote: 'iOS에서는 먼저 이 앱을 홈 화면에 추가해야 합니다.',\n },\n ar: {\n title: 'ابق على اطلاع',\n description: 'احصل على إشعارات حول التحديثات المهمة والرسائل والتنبيهات.',\n allowButton: 'تفعيل الإشعارات',\n laterButton: 'ربما لاحقاً',\n iosNote: 'على iOS، يجب أولاً إضافة هذا التطبيق إلى الشاشة الرئيسية.',\n },\n he: {\n title: 'הישאר מעודכן',\n description: 'קבל התראות על עדכונים חשובים, הודעות והתראות.',\n allowButton: 'הפעל התראות',\n laterButton: 'אולי מאוחר יותר',\n iosNote: 'ב-iOS, עליך להוסיף תחילה את האפליקציה למסך הבית.',\n },\n hi: {\n title: 'अपडेट रहें',\n description: 'महत्वपूर्ण अपडेट, संदेशों और अलर्ट के बारे में सूचनाएं प्राप्त करें।',\n allowButton: 'सूचनाएं सक्षम करें',\n laterButton: 'बाद में',\n iosNote: 'iOS पर, आपको पहले इस ऐप को होम स्क्रीन पर जोड़ना होगा।',\n },\n tr: {\n title: 'Güncel Kalın',\n description: 'Önemli güncellemeler, mesajlar ve uyarılar hakkında bildirim alın.',\n allowButton: 'Bildirimleri Etkinleştir',\n laterButton: 'Belki Sonra',\n iosNote: \"iOS'ta önce bu uygulamayı ana ekranınıza eklemelisiniz.\",\n },\n pl: {\n title: 'Bądź Na Bieżąco',\n description: 'Otrzymuj powiadomienia o ważnych aktualizacjach, wiadomościach i alertach.',\n allowButton: 'Włącz Powiadomienia',\n laterButton: 'Może Później',\n iosNote: 'Na iOS musisz najpierw dodać tę aplikację do ekranu głównego.',\n },\n sv: {\n title: 'Håll Dig Uppdaterad',\n description: 'Få aviseringar om viktiga uppdateringar, meddelanden och varningar.',\n allowButton: 'Aktivera Aviseringar',\n laterButton: 'Kanske Senare',\n iosNote: 'På iOS måste du först lägga till denna app på hemskärmen.',\n },\n da: {\n title: 'Hold Dig Opdateret',\n description: 'Få notifikationer om vigtige opdateringer, beskeder og advarsler.',\n allowButton: 'Aktivér Notifikationer',\n laterButton: 'Måske Senere',\n iosNote: 'På iOS skal du først tilføje denne app til startskærmen.',\n },\n no: {\n title: 'Hold Deg Oppdatert',\n description: 'Få varsler om viktige oppdateringer, meldinger og varsler.',\n allowButton: 'Aktiver Varsler',\n laterButton: 'Kanskje Senere',\n iosNote: 'På iOS må du først legge til denne appen på startskjermen.',\n },\n fi: {\n title: 'Pysy Ajan Tasalla',\n description: 'Saat ilmoituksia tärkeistä päivityksistä, viesteistä ja hälytyksistä.',\n allowButton: 'Ota Ilmoitukset Käyttöön',\n laterButton: 'Ehkä Myöhemmin',\n iosNote: 'iOS:ssa sinun on ensin lisättävä tämä sovellus aloitusnäytölle.',\n },\n}\n\n/**\n * Prompt styles\n */\nexport interface NotificationPromptStyles {\n backgroundColor: string\n textColor: string\n primaryButtonBackground: string\n primaryButtonText: string\n secondaryButtonBackground: string\n secondaryButtonText: string\n borderRadius: string\n boxShadow: string\n}\n\nconst DEFAULT_STYLES: NotificationPromptStyles = {\n backgroundColor: '#ffffff',\n textColor: '#1a1a1a',\n primaryButtonBackground: '#007AFF',\n primaryButtonText: '#ffffff',\n secondaryButtonBackground: 'transparent',\n secondaryButtonText: '#666666',\n borderRadius: '16px',\n boxShadow: '0 4px 24px rgba(0, 0, 0, 0.15)',\n}\n\n/**\n * Prompt configuration\n */\nexport interface NotificationPromptConfig {\n /** Enable the soft prompt */\n enabled?: boolean\n /** Custom icon URL */\n iconUrl?: string\n /** Show delay in ms */\n showDelay?: number\n /** Days to remember dismissal */\n dismissalDays?: number\n /** Position: 'top' | 'center' | 'bottom' */\n position?: 'top' | 'center' | 'bottom'\n /** Custom styles */\n customStyles?: Partial<NotificationPromptStyles>\n /** Show iOS-specific note */\n showIOSNote?: boolean\n}\n\nexport interface NotificationPromptOptions {\n config?: NotificationPromptConfig\n /** Language code - auto-detected if not provided */\n language?: IOSBannerLanguage\n /** Custom strings to override translations */\n customStrings?: Partial<NotificationPromptStrings>\n debug?: boolean\n /** Called when user clicks allow */\n onAllow?: () => void\n /** Called when user clicks later */\n onLater?: () => void\n /** Called when prompt is shown */\n onShow?: () => void\n}\n\n/**\n * NotificationPermissionPrompt - Soft prompt before native browser permission\n */\nexport class NotificationPermissionPrompt {\n private config: Required<Omit<NotificationPromptConfig, 'customStyles'>> & { customStyles: Partial<NotificationPromptStyles> }\n private styles: NotificationPromptStyles\n private strings: NotificationPromptStrings\n private language: IOSBannerLanguage\n private debug: boolean\n private promptElement: HTMLElement | null = null\n private overlayElement: HTMLElement | null = null\n\n private onAllow?: () => void\n private onLater?: () => void\n private onShow?: () => void\n\n constructor(options: NotificationPromptOptions = {}) {\n this.debug = options.debug ?? false\n this.onAllow = options.onAllow\n this.onLater = options.onLater\n this.onShow = options.onShow\n\n // Detect or use provided language\n this.language = options.language ?? detectBrowserLanguage()\n const baseStrings = NOTIFICATION_PROMPT_TRANSLATIONS[this.language]\n\n this.strings = {\n ...baseStrings,\n ...options.customStrings,\n }\n\n this.config = {\n enabled: options.config?.enabled ?? true,\n iconUrl: options.config?.iconUrl ?? '',\n showDelay: options.config?.showDelay ?? 2000,\n dismissalDays: options.config?.dismissalDays ?? 3,\n position: options.config?.position ?? 'center',\n customStyles: options.config?.customStyles ?? {},\n showIOSNote: options.config?.showIOSNote ?? true,\n }\n\n this.styles = { ...DEFAULT_STYLES, ...this.config.customStyles }\n this.log(`Initialized with language: ${this.language}`)\n }\n\n /**\n * Get current language\n */\n getLanguage(): IOSBannerLanguage {\n return this.language\n }\n\n /**\n * Set language\n */\n setLanguage(language: IOSBannerLanguage): void {\n this.language = language\n this.strings = { ...NOTIFICATION_PROMPT_TRANSLATIONS[language] }\n this.log(`Language changed to: ${language}`)\n }\n\n /**\n * Check if should show prompt\n */\n shouldShow(): boolean {\n // Already granted or denied\n if ('Notification' in window && Notification.permission !== 'default') {\n return false\n }\n\n // Check dismissal\n if (this.wasDismissed()) {\n return false\n }\n\n return true\n }\n\n /**\n * Check if previously dismissed\n */\n wasDismissed(): boolean {\n try {\n const dismissed = localStorage.getItem(STORAGE_KEY)\n if (!dismissed) return false\n\n const dismissedTime = parseInt(dismissed, 10)\n const daysSinceDismissal = (Date.now() - dismissedTime) / (1000 * 60 * 60 * 24)\n\n if (daysSinceDismissal > this.config.dismissalDays) {\n localStorage.removeItem(STORAGE_KEY)\n return false\n }\n\n return true\n } catch {\n return false\n }\n }\n\n /**\n * Check if device is iOS\n */\n private isIOS(): boolean {\n return /iPad|iPhone|iPod/.test(navigator.userAgent) && !(window as any).MSStream\n }\n\n /**\n * Check if PWA is installed (standalone mode)\n */\n private isInstalled(): boolean {\n if ((navigator as any).standalone === true) return true\n if (window.matchMedia('(display-mode: standalone)').matches) return true\n return false\n }\n\n /**\n * Show the soft prompt\n */\n async show(): Promise<boolean> {\n if (!this.config.enabled) {\n this.log('Prompt is disabled')\n return false\n }\n\n if (!this.shouldShow()) {\n this.log('Prompt should not be shown')\n return false\n }\n\n if (this.promptElement) {\n this.log('Prompt already visible')\n return true\n }\n\n // Delay before showing\n if (this.config.showDelay > 0) {\n await new Promise((resolve) => setTimeout(resolve, this.config.showDelay))\n }\n\n // Double-check\n if (!this.shouldShow()) {\n return false\n }\n\n this.createPrompt()\n this.log('Prompt shown')\n this.onShow?.()\n\n return true\n }\n\n /**\n * Hide the prompt\n */\n hide(): void {\n if (this.promptElement) {\n this.promptElement.remove()\n this.promptElement = null\n }\n if (this.overlayElement) {\n this.overlayElement.remove()\n this.overlayElement = null\n }\n }\n\n /**\n * Dismiss and remember\n */\n dismiss(): void {\n this.hide()\n try {\n localStorage.setItem(STORAGE_KEY, Date.now().toString())\n } catch {\n // localStorage not available\n }\n this.log('Prompt dismissed')\n this.onLater?.()\n }\n\n /**\n * Reset dismissal state\n */\n resetDismissal(): void {\n try {\n localStorage.removeItem(STORAGE_KEY)\n } catch {\n // localStorage not available\n }\n }\n\n /**\n * Handle allow click - triggers native permission\n */\n async handleAllow(): Promise<NotificationPermission> {\n this.hide()\n this.onAllow?.()\n\n // Now trigger the native permission prompt\n if ('Notification' in window) {\n return await Notification.requestPermission()\n }\n return 'denied'\n }\n\n /**\n * Create and inject the prompt element\n */\n private createPrompt(): void {\n // Create overlay\n this.overlayElement = document.createElement('div')\n this.overlayElement.id = `${PROMPT_ID}-overlay`\n this.overlayElement.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n z-index: 999998;\n opacity: 0;\n transition: opacity 0.3s ease;\n `\n this.overlayElement.addEventListener('click', () => this.dismiss())\n document.body.appendChild(this.overlayElement)\n\n // Create prompt\n this.promptElement = document.createElement('div')\n this.promptElement.id = PROMPT_ID\n\n let positionStyles: string\n switch (this.config.position) {\n case 'top':\n positionStyles = 'top: 20px; left: 50%; transform: translateX(-50%) translateY(-20px);'\n break\n case 'bottom':\n positionStyles = 'bottom: 20px; left: 50%; transform: translateX(-50%) translateY(20px);'\n break\n default: // center\n positionStyles = 'top: 50%; left: 50%; transform: translate(-50%, -50%) scale(0.95);'\n }\n\n this.promptElement.style.cssText = `\n position: fixed;\n ${positionStyles}\n width: 90%;\n max-width: 380px;\n background: ${this.styles.backgroundColor};\n color: ${this.styles.textColor};\n border-radius: ${this.styles.borderRadius};\n box-shadow: ${this.styles.boxShadow};\n z-index: 999999;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;\n opacity: 0;\n transition: opacity 0.3s ease, transform 0.3s ease;\n `\n\n const iconHtml = this.config.iconUrl\n ? `<img src=\"${this.config.iconUrl}\" alt=\"App icon\" style=\"width: 48px; height: 48px; border-radius: 10px; margin-bottom: 12px;\">`\n : `<div style=\"width: 48px; height: 48px; border-radius: 10px; margin-bottom: 12px; background: linear-gradient(135deg, #007AFF, #5856D6); display: flex; align-items: center; justify-content: center;\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" stroke-width=\"2\">\n <path d=\"M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9\"/>\n <path d=\"M13.73 21a2 2 0 0 1-3.46 0\"/>\n </svg>\n </div>`\n\n // Show iOS note if on iOS and not installed\n const showIOSNote = this.config.showIOSNote && this.isIOS() && !this.isInstalled()\n const iosNoteHtml = showIOSNote && this.strings.iosNote\n ? `<p style=\"margin: 12px 0 0 0; padding: 10px; background: rgba(255, 149, 0, 0.1); border-radius: 8px; font-size: 12px; color: #996600;\">\n ⚠️ ${this.strings.iosNote}\n </p>`\n : ''\n\n this.promptElement.innerHTML = `\n <div style=\"padding: 24px; text-align: center;\">\n ${iconHtml}\n <h3 style=\"margin: 0 0 8px 0; font-size: 20px; font-weight: 600;\">${this.strings.title}</h3>\n <p style=\"margin: 0; font-size: 14px; opacity: 0.7; line-height: 1.5;\">${this.strings.description}</p>\n ${iosNoteHtml}\n <div style=\"margin-top: 20px; display: flex; flex-direction: column; gap: 10px;\">\n <button id=\"${PROMPT_ID}-allow\" style=\"\n width: 100%;\n padding: 14px 20px;\n background: ${this.styles.primaryButtonBackground};\n color: ${this.styles.primaryButtonText};\n border: none;\n border-radius: 10px;\n font-size: 16px;\n font-weight: 600;\n cursor: pointer;\n -webkit-tap-highlight-color: transparent;\n \">${this.strings.allowButton}</button>\n <button id=\"${PROMPT_ID}-later\" style=\"\n width: 100%;\n padding: 12px 20px;\n background: ${this.styles.secondaryButtonBackground};\n color: ${this.styles.secondaryButtonText};\n border: none;\n border-radius: 10px;\n font-size: 14px;\n cursor: pointer;\n -webkit-tap-highlight-color: transparent;\n \">${this.strings.laterButton}</button>\n </div>\n </div>\n `\n\n document.body.appendChild(this.promptElement)\n\n // Add event listeners\n document.getElementById(`${PROMPT_ID}-allow`)?.addEventListener('click', () => this.handleAllow())\n document.getElementById(`${PROMPT_ID}-later`)?.addEventListener('click', () => this.dismiss())\n\n // Animate in\n requestAnimationFrame(() => {\n if (this.overlayElement) {\n this.overlayElement.style.opacity = '1'\n }\n if (this.promptElement) {\n this.promptElement.style.opacity = '1'\n if (this.config.position === 'center') {\n this.promptElement.style.transform = 'translate(-50%, -50%) scale(1)'\n } else if (this.config.position === 'top') {\n this.promptElement.style.transform = 'translateX(-50%) translateY(0)'\n } else {\n this.promptElement.style.transform = 'translateX(-50%) translateY(0)'\n }\n }\n })\n }\n\n /**\n * Log message if debug is enabled\n */\n private log(message: string, level: 'log' | 'warn' | 'error' = 'log'): void {\n if (!this.debug && level === 'log') return\n const prefix = '[CloudSignal PWA NotificationPrompt]'\n console[level](`${prefix} ${message}`)\n }\n}\n\n// Re-export language type for convenience\nexport type { IOSBannerLanguage as NotificationPromptLanguage }\n","/**\n * CloudSignal PWA SDK\n * Progressive Web App features with push notifications, installation management, and device tracking\n * \n * v1.1.0: Added WakeLock, OfflineQueue, iOS Install Banner, Network-aware Heartbeat, Notification Analytics\n * v1.2.0: Added JWT auth support for user-linked registrations\n * \n * @packageDocumentation\n */\n\n// Main client\nexport { CloudSignalPWA, default } from './CloudSignalPWA'\n\n// Core Managers\nexport { DeviceDetector, deviceDetector } from './DeviceDetector'\nexport { ServiceWorkerManager } from './ServiceWorkerManager'\nexport { InstallationManager } from './InstallationManager'\nexport { PushNotificationManager } from './PushNotificationManager'\nexport { HeartbeatManager } from './HeartbeatManager'\n\n// v1.1.0 Managers\nexport { WakeLockManager } from './WakeLockManager'\nexport { OfflineQueueManager } from './OfflineQueueManager'\nexport { IOSInstallBanner } from './IOSInstallBanner'\nexport { NotificationPermissionPrompt } from './NotificationPermissionPrompt'\n\n// i18n\nexport {\n IOS_BANNER_TRANSLATIONS,\n detectBrowserLanguage,\n type IOSBannerLanguage,\n type IOSBannerStrings,\n} from './IOSInstallBannerI18n'\n\nexport {\n NOTIFICATION_PROMPT_TRANSLATIONS,\n type NotificationPromptStrings,\n type NotificationPromptLanguage,\n} from './NotificationPermissionPrompt'\n\n// Utilities\nexport {\n generateHMACSignature,\n generateAuthHeaders,\n makeAuthenticatedRequest,\n isValidUUID,\n} from './utils/hmac'\n\nexport {\n generateJWTHeaders,\n makeJWTAuthenticatedRequest,\n createAuthContext,\n makeAuthenticatedRequestWithContext,\n updateAuthToken,\n} from './utils/jwt-auth'\nexport type { AuthContext } from './utils/jwt-auth'\n\nexport {\n generateBrowserFingerprint,\n generateTrackingId,\n} from './utils/fingerprint'\n\nexport {\n getStorageItem,\n setStorageItem,\n removeStorageItem,\n getRegistrationId,\n setRegistrationId,\n removeRegistrationId,\n IndexedDBStorage,\n} from './utils/storage'\n\n// Types\nexport type {\n // Config types\n PWAConfig,\n ServiceWorkerConfig,\n HeartbeatConfig,\n LoggerFunction,\n PWAServiceConfig,\n RegisterOptions,\n NotificationPreferences,\n InitializeResult,\n // v1.1.0 Config types\n WakeLockConfig,\n OfflineQueueConfig,\n IOSInstallBannerConfig,\n NotificationAnalyticsConfig,\n // v1.2.0 Auth types\n AuthMode,\n // Device types\n DeviceInfo,\n PWASupportLevel,\n NotificationPermissionState,\n InstallationState,\n DisplayMode,\n InstallResult,\n PlatformInfo,\n ScreenInfo,\n NetworkInfo,\n PWACapabilities,\n BeforeInstallPromptEvent,\n // Notification types\n Registration,\n RegistrationStatus,\n RegistrationStatusResponse,\n PushSubscriptionData,\n NotificationPayload,\n NotificationAction,\n PWAEvent,\n EventHandler,\n InstallAvailableEvent,\n InstallResultEvent,\n PushRegisteredEvent,\n PushReceivedEvent,\n PushClickedEvent,\n PermissionEvent,\n ServiceWorkerEvent,\n ConfigLoadedEvent,\n HeartbeatEvent,\n NetworkEvent,\n // v1.1.0 Feature types\n WakeLockState,\n NetworkConnectionInfo,\n BatteryInfo,\n AdaptiveHeartbeatConfig,\n NotificationAnalyticsEvent,\n IOSInstallBannerOptions,\n QueuedRequest,\n QueueProcessResult,\n OfflineQueueStats,\n} from './types'\n\n// SDK Version\nexport const VERSION = '1.2.0'\n"]}
1
+ {"version":3,"sources":["../src/utils/fingerprint.ts","../src/DeviceDetector.ts","../src/ServiceWorkerManager.ts","../src/InstallationManager.ts","../src/utils/jwt-auth.ts","../src/utils/storage.ts","../src/PushNotificationManager.ts","../src/HeartbeatManager.ts","../src/WakeLockManager.ts","../src/OfflineQueueManager.ts","../src/IOSInstallBannerI18n.ts","../src/IOSInstallBanner.ts","../src/CloudSignalPWA.ts","../src/NotificationPermissionPrompt.ts","../src/index.ts"],"names":["vendor","renderer","screen","makeAuthenticatedRequest","newInterval","installState","STORAGE_KEY","DEFAULT_STYLES"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Browser Fingerprinting Utilities\n * Generate unique device identifiers for registration deduplication\n */\n\n/**\n * Generate a browser fingerprint using multiple signals\n * This is used to identify the same browser across sessions\n * \n * @returns Fingerprint string or null if generation fails\n */\nexport async function generateBrowserFingerprint(): Promise<string | null> {\n try {\n const components: string[] = []\n\n // Screen dimensions\n components.push(`${screen.width}x${screen.height}`)\n components.push(`${screen.colorDepth}`)\n\n // Timezone\n components.push(Intl.DateTimeFormat().resolvedOptions().timeZone)\n\n // Language\n components.push(navigator.language)\n\n // Platform\n components.push(navigator.platform)\n\n // Hardware concurrency\n if (navigator.hardwareConcurrency) {\n components.push(navigator.hardwareConcurrency.toString())\n }\n\n // Device memory (if available)\n if ((navigator as any).deviceMemory) {\n components.push((navigator as any).deviceMemory.toString())\n }\n\n // Canvas fingerprint\n const canvasFingerprint = getCanvasFingerprint()\n if (canvasFingerprint) {\n components.push(canvasFingerprint)\n }\n\n // WebGL fingerprint\n const webglFingerprint = getWebGLFingerprint()\n if (webglFingerprint) {\n components.push(webglFingerprint)\n }\n\n // Audio fingerprint\n const audioFingerprint = await getAudioFingerprint()\n if (audioFingerprint) {\n components.push(audioFingerprint)\n }\n\n // Combine all components and hash\n const combined = components.join('|')\n const hash = await hashString(combined)\n\n return hash\n } catch (error) {\n console.warn('Browser fingerprint generation failed:', error)\n return null\n }\n}\n\n/**\n * Get canvas fingerprint\n */\nfunction getCanvasFingerprint(): string | null {\n try {\n const canvas = document.createElement('canvas')\n const ctx = canvas.getContext('2d')\n if (!ctx) return null\n\n canvas.width = 200\n canvas.height = 50\n\n // Draw some text with specific styling\n ctx.textBaseline = 'alphabetic'\n ctx.fillStyle = '#f60'\n ctx.fillRect(125, 1, 62, 20)\n ctx.fillStyle = '#069'\n ctx.font = '11pt Arial'\n ctx.fillText('CloudSignal PWA', 2, 15)\n ctx.fillStyle = 'rgba(102, 204, 0, 0.7)'\n ctx.font = '18pt Arial'\n ctx.fillText('CloudSignal PWA', 4, 45)\n\n // Get data URL and extract relevant part\n const dataUrl = canvas.toDataURL()\n return dataUrl.slice(-50)\n } catch {\n return null\n }\n}\n\n/**\n * Get WebGL fingerprint\n */\nfunction getWebGLFingerprint(): string | null {\n try {\n const canvas = document.createElement('canvas')\n const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl')\n if (!gl) return null\n\n const webglCtx = gl as WebGLRenderingContext\n\n // Get renderer info\n const debugInfo = webglCtx.getExtension('WEBGL_debug_renderer_info')\n if (debugInfo) {\n const vendor = webglCtx.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL)\n const renderer = webglCtx.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL)\n return `${vendor}~${renderer}`\n }\n\n // Fallback to basic info\n const vendor = webglCtx.getParameter(webglCtx.VENDOR)\n const renderer = webglCtx.getParameter(webglCtx.RENDERER)\n return `${vendor}~${renderer}`\n } catch {\n return null\n }\n}\n\n/**\n * Get audio fingerprint using AudioContext\n */\nasync function getAudioFingerprint(): Promise<string | null> {\n try {\n const AudioContextClass = window.AudioContext || (window as any).webkitAudioContext\n if (!AudioContextClass) return null\n\n const audioContext = new AudioContextClass()\n const oscillator = audioContext.createOscillator()\n const analyser = audioContext.createAnalyser()\n const gainNode = audioContext.createGain()\n const scriptProcessor = audioContext.createScriptProcessor(4096, 1, 1)\n\n gainNode.gain.value = 0 // Mute\n oscillator.type = 'triangle'\n oscillator.connect(analyser)\n analyser.connect(scriptProcessor)\n scriptProcessor.connect(gainNode)\n gainNode.connect(audioContext.destination)\n\n oscillator.start(0)\n\n // Wait a bit for processing\n await new Promise(resolve => setTimeout(resolve, 100))\n\n const frequencyData = new Uint8Array(analyser.frequencyBinCount)\n analyser.getByteFrequencyData(frequencyData)\n\n // Calculate a simple hash from frequency data\n let sum = 0\n for (let i = 0; i < frequencyData.length; i++) {\n sum += frequencyData[i]\n }\n\n oscillator.stop()\n await audioContext.close()\n\n return sum.toString(36)\n } catch {\n return null\n }\n}\n\n/**\n * Hash a string using SHA-256\n */\nasync function hashString(str: string): Promise<string> {\n const encoder = new TextEncoder()\n const data = encoder.encode(str)\n const hashBuffer = await crypto.subtle.digest('SHA-256', data)\n const hashArray = Array.from(new Uint8Array(hashBuffer))\n return hashArray.map(b => b.toString(16).padStart(2, '0')).join('')\n}\n\n/**\n * Generate a simple tracking ID from device info\n * Less privacy-invasive than full fingerprinting\n */\nexport function generateTrackingId(\n os: string,\n osVersion: string,\n browser: string,\n browserVersion: string,\n deviceModel: string\n): string {\n const parts = [\n os,\n osVersion,\n browser,\n browserVersion,\n deviceModel,\n ].filter(Boolean)\n\n return parts.join('_').replace(/[^a-zA-Z0-9_]/g, '_')\n}\n","/**\n * DeviceDetector - Comprehensive Platform and Device Detection\n * Ported from bubble-pwa-complete-handler.js with TypeScript support\n */\n\nimport type {\n DeviceInfo,\n PlatformInfo,\n ScreenInfo,\n NetworkInfo,\n PWACapabilities,\n PWASupportLevel,\n NotificationPermissionState,\n} from './types'\nimport { generateTrackingId } from './utils/fingerprint'\n\n/**\n * DeviceDetector class for comprehensive device and platform detection\n */\nexport class DeviceDetector {\n private cachedInfo: DeviceInfo | null = null\n\n /**\n * Get comprehensive device information\n */\n getDeviceInfo(): DeviceInfo {\n if (this.cachedInfo) {\n return this.cachedInfo\n }\n\n const platform = this.getPlatformInfo()\n const screen = this.getScreenInfo()\n const network = this.getNetworkInfo()\n const capabilities = this.getCapabilities()\n\n const info: DeviceInfo = {\n // Operating System\n os: platform.os,\n osVersion: platform.osVersion,\n\n // Device\n deviceType: platform.deviceType,\n deviceModel: platform.deviceModel,\n isMobile: this.isMobile(),\n isTablet: this.isTablet(),\n isDesktop: this.isDesktop(),\n isWebView: platform.isWebView,\n\n // Browser\n browser: platform.browser,\n browserVersion: platform.browserVersion,\n\n // Platform Flags\n isIOS: platform.os === 'iOS',\n isAndroid: platform.os === 'Android',\n isMacOS: platform.os === 'macOS',\n isWindows: platform.os === 'Windows',\n isLinux: platform.os === 'Linux',\n\n // Screen\n screenWidth: screen.width,\n screenHeight: screen.height,\n pixelRatio: screen.pixelRatio,\n\n // PWA Capabilities\n supportLevel: capabilities.supportLevel,\n hasNotificationPermission: capabilities.notifications,\n hasPushManager: capabilities.push,\n hasServiceWorker: capabilities.serviceWorker,\n hasShareAPI: capabilities.share,\n hasBadgeAPI: capabilities.badge,\n\n // Permissions\n notificationPermission: this.getNotificationPermission(),\n\n // Network\n isOnline: network.isOnline,\n connectionType: network.connectionType,\n\n // Analytics\n platformIcon: this.getPlatformIcon(platform.os, platform.deviceType),\n userAgent: platform.userAgent,\n trackingId: generateTrackingId(\n platform.os,\n platform.osVersion,\n platform.browser,\n platform.browserVersion,\n platform.deviceModel\n ),\n }\n\n this.cachedInfo = info\n return info\n }\n\n /**\n * Clear cached device info (useful when network/permissions change)\n */\n clearCache(): void {\n this.cachedInfo = null\n }\n\n /**\n * Get platform-specific information\n */\n getPlatformInfo(): PlatformInfo {\n const userAgent = navigator.userAgent\n const platform = navigator.platform\n\n let os = 'Unknown'\n let osVersion = 'Unknown'\n let browser = 'Unknown'\n let browserVersion = 'Unknown'\n let deviceType = 'Unknown'\n let deviceModel = 'Unknown'\n let isWebView = false\n\n // Operating System Detection\n if (/iPad|iPhone|iPod/.test(userAgent) && !(window as any).MSStream) {\n os = 'iOS'\n const iosMatch = userAgent.match(/OS (\\d+)_(\\d+)_?(\\d+)?/)\n if (iosMatch) {\n osVersion = `${iosMatch[1]}.${iosMatch[2]}${iosMatch[3] ? '.' + iosMatch[3] : ''}`\n }\n if (/iPad/.test(userAgent)) {\n deviceType = 'iPad'\n deviceModel = this.detectiPadModel(userAgent)\n } else if (/iPhone/.test(userAgent)) {\n deviceType = 'iPhone'\n deviceModel = this.detectiPhoneModel(userAgent)\n } else if (/iPod/.test(userAgent)) {\n deviceType = 'iPod'\n deviceModel = 'iPod Touch'\n }\n } else if (/Android/.test(userAgent)) {\n os = 'Android'\n const androidMatch = userAgent.match(/Android (\\d+\\.?\\d*\\.?\\d*)/)\n if (androidMatch) {\n osVersion = androidMatch[1]\n }\n const deviceInfo = this.detectAndroidDevice(userAgent)\n deviceType = deviceInfo.type\n deviceModel = deviceInfo.model\n } else if (/Mac/.test(platform)) {\n os = 'macOS'\n const macMatch = userAgent.match(/Mac OS X (\\d+)[_.](\\d+)[_.]?(\\d+)?/)\n if (macMatch) {\n osVersion = `${macMatch[1]}.${macMatch[2]}${macMatch[3] ? '.' + macMatch[3] : ''}`\n }\n deviceType = 'Desktop'\n deviceModel = 'Mac'\n } else if (/Win/.test(platform)) {\n os = 'Windows'\n const winMatch = userAgent.match(/Windows NT (\\d+\\.\\d+)/)\n if (winMatch) {\n osVersion = this.getWindowsVersion(winMatch[1])\n }\n deviceType = 'Desktop'\n deviceModel = 'PC'\n } else if (/Linux/.test(platform)) {\n os = 'Linux'\n deviceType = 'Desktop'\n deviceModel = 'Linux PC'\n if (/Ubuntu/.test(userAgent)) osVersion = 'Ubuntu'\n else if (/Fedora/.test(userAgent)) osVersion = 'Fedora'\n else if (/Debian/.test(userAgent)) osVersion = 'Debian'\n }\n\n // Browser Detection\n if (/Chrome/.test(userAgent) && !/Edg/.test(userAgent) && !/OPR/.test(userAgent)) {\n browser = 'Chrome'\n const chromeMatch = userAgent.match(/Chrome\\/(\\d+\\.?\\d*\\.?\\d*\\.?\\d*)/)\n if (chromeMatch) browserVersion = chromeMatch[1]\n } else if (/Safari/.test(userAgent) && !/Chrome/.test(userAgent)) {\n browser = 'Safari'\n const safariMatch = userAgent.match(/Version\\/(\\d+\\.?\\d*\\.?\\d*)/)\n if (safariMatch) browserVersion = safariMatch[1]\n } else if (/Firefox/.test(userAgent)) {\n browser = 'Firefox'\n const firefoxMatch = userAgent.match(/Firefox\\/(\\d+\\.?\\d*\\.?\\d*)/)\n if (firefoxMatch) browserVersion = firefoxMatch[1]\n } else if (/Edg/.test(userAgent)) {\n browser = 'Edge'\n const edgeMatch = userAgent.match(/Edg\\/(\\d+\\.?\\d*\\.?\\d*\\.?\\d*)/)\n if (edgeMatch) browserVersion = edgeMatch[1]\n } else if (/OPR/.test(userAgent) || /Opera/.test(userAgent)) {\n browser = 'Opera'\n const operaMatch = userAgent.match(/(?:OPR|Opera)\\/(\\d+\\.?\\d*\\.?\\d*)/)\n if (operaMatch) browserVersion = operaMatch[1]\n } else if (/SamsungBrowser/.test(userAgent)) {\n browser = 'Samsung Internet'\n const samsungMatch = userAgent.match(/SamsungBrowser\\/(\\d+\\.?\\d*)/)\n if (samsungMatch) browserVersion = samsungMatch[1]\n }\n\n // WebView Detection\n isWebView = this.detectWebView(userAgent)\n\n return {\n os,\n osVersion,\n browser,\n browserVersion,\n deviceType,\n deviceModel,\n isWebView,\n userAgent,\n }\n }\n\n /**\n * Get screen information\n */\n getScreenInfo(): ScreenInfo {\n return {\n width: screen.width,\n height: screen.height,\n pixelRatio: window.devicePixelRatio || 1,\n orientation: screen.width > screen.height ? 'landscape' : 'portrait',\n }\n }\n\n /**\n * Get network information\n */\n getNetworkInfo(): NetworkInfo {\n const connection = (navigator as any).connection\n \n return {\n isOnline: navigator.onLine,\n connectionType: connection?.effectiveType || 'unknown',\n effectiveType: connection?.effectiveType,\n downlink: connection?.downlink,\n rtt: connection?.rtt,\n saveData: connection?.saveData,\n }\n }\n\n /**\n * Get PWA capabilities\n */\n getCapabilities(): PWACapabilities {\n const capabilities: PWACapabilities = {\n serviceWorker: 'serviceWorker' in navigator,\n push: 'PushManager' in window,\n notifications: 'Notification' in window,\n backgroundSync: 'serviceWorker' in navigator && 'SyncManager' in window,\n badge: 'setAppBadge' in navigator,\n share: 'share' in navigator,\n shareTarget: 'launchQueue' in window,\n fileSystemAccess: 'showOpenFilePicker' in window,\n contactPicker: 'ContactsManager' in window,\n periodicSync: 'serviceWorker' in navigator && 'PeriodicSyncManager' in window,\n supportLevel: 'none',\n }\n\n // Determine support level\n if (capabilities.serviceWorker && capabilities.push && capabilities.notifications) {\n capabilities.supportLevel = 'full'\n } else if (capabilities.serviceWorker && capabilities.notifications) {\n capabilities.supportLevel = 'partial'\n } else if (capabilities.serviceWorker) {\n capabilities.supportLevel = 'basic'\n }\n\n return capabilities\n }\n\n /**\n * Get notification permission state\n */\n getNotificationPermission(): NotificationPermissionState {\n if (!('Notification' in window)) {\n return 'denied'\n }\n return Notification.permission as NotificationPermissionState\n }\n\n /**\n * Check if device is mobile\n */\n isMobile(): boolean {\n const userAgent = navigator.userAgent\n return /Android|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test(userAgent)\n }\n\n /**\n * Check if device is tablet\n */\n isTablet(): boolean {\n const userAgent = navigator.userAgent\n return /iPad|Android(?!.*Mobile)|Tablet/i.test(userAgent)\n }\n\n /**\n * Check if device is desktop\n */\n isDesktop(): boolean {\n return !this.isMobile() && !this.isTablet()\n }\n\n /**\n * Get platform icon emoji\n */\n private getPlatformIcon(os: string, deviceType: string): string {\n if (os === 'iOS' || deviceType === 'iPhone' || deviceType === 'iPad') {\n return '📱'\n }\n if (os === 'Android') {\n return '🤖'\n }\n if (os === 'macOS') {\n return '💻'\n }\n return '🖥️'\n }\n\n /**\n * Detect iPhone model from user agent\n */\n private detectiPhoneModel(userAgent: string): string {\n // iPhone detection is limited due to Apple's privacy measures\n // We can make educated guesses based on screen size and iOS version\n const screenHeight = screen.height\n const screenWidth = screen.width\n const pixelRatio = window.devicePixelRatio || 1\n\n // Sort by common screen dimensions\n if (screenHeight === 932 || screenWidth === 932) return 'iPhone 15 Pro Max/14 Pro Max'\n if (screenHeight === 896 || screenWidth === 896) return 'iPhone 15 Pro/14 Pro/11 Pro Max'\n if (screenHeight === 852 || screenWidth === 852) return 'iPhone 15/14'\n if (screenHeight === 844 || screenWidth === 844) return 'iPhone 13/12'\n if (screenHeight === 812 || screenWidth === 812) return 'iPhone X/XS/11 Pro'\n if (screenHeight === 736 || screenWidth === 736) return 'iPhone 8 Plus'\n if (screenHeight === 667 || screenWidth === 667) return 'iPhone 8/SE'\n if (screenHeight === 568 || screenWidth === 568) return 'iPhone SE (1st)'\n\n return 'iPhone'\n }\n\n /**\n * Detect iPad model from user agent\n */\n private detectiPadModel(userAgent: string): string {\n const screenWidth = screen.width\n const screenHeight = screen.height\n const pixelRatio = window.devicePixelRatio || 1\n\n // iPad Pro 12.9\"\n if ((screenHeight === 1366 || screenWidth === 1366) && pixelRatio === 2) {\n return 'iPad Pro 12.9\"'\n }\n // iPad Pro 11\"\n if ((screenHeight === 1194 || screenWidth === 1194) && pixelRatio === 2) {\n return 'iPad Pro 11\"'\n }\n // iPad Air / iPad 10th gen\n if ((screenHeight === 1180 || screenWidth === 1180) && pixelRatio === 2) {\n return 'iPad Air/10th Gen'\n }\n // iPad mini\n if ((screenHeight === 1133 || screenWidth === 1133) && pixelRatio === 2) {\n return 'iPad mini'\n }\n // Standard iPad\n if ((screenHeight === 1024 || screenWidth === 1024)) {\n return 'iPad'\n }\n\n return 'iPad'\n }\n\n /**\n * Detect Android device model\n */\n private detectAndroidDevice(userAgent: string): { type: string; model: string } {\n let type = 'Phone'\n let model = 'Android Device'\n\n // Check if tablet\n if (/Tablet|SM-T|Tab|GT-P|MediaPad/i.test(userAgent)) {\n type = 'Tablet'\n }\n\n // Samsung devices\n if (/SM-S9\\d{2}/i.test(userAgent)) model = 'Samsung Galaxy S24'\n else if (/SM-S91\\d/i.test(userAgent)) model = 'Samsung Galaxy S23'\n else if (/SM-S90\\d/i.test(userAgent)) model = 'Samsung Galaxy S22'\n else if (/SM-G99\\d/i.test(userAgent)) model = 'Samsung Galaxy S21'\n else if (/SM-N9\\d{2}/i.test(userAgent)) model = 'Samsung Galaxy Note'\n else if (/SM-A\\d{2}/i.test(userAgent)) model = 'Samsung Galaxy A Series'\n else if (/SM-/i.test(userAgent)) {\n const match = userAgent.match(/SM-[A-Z]\\d+/i)\n if (match) model = `Samsung ${match[0]}`\n }\n\n // Google Pixel\n if (/Pixel 8/i.test(userAgent)) model = 'Google Pixel 8'\n else if (/Pixel 7/i.test(userAgent)) model = 'Google Pixel 7'\n else if (/Pixel 6/i.test(userAgent)) model = 'Google Pixel 6'\n else if (/Pixel/i.test(userAgent)) model = 'Google Pixel'\n\n // OnePlus\n if (/OnePlus/i.test(userAgent)) {\n const match = userAgent.match(/OnePlus[\\s]?(\\w+)/i)\n model = match ? `OnePlus ${match[1]}` : 'OnePlus'\n }\n\n // Xiaomi\n if (/Xiaomi|Redmi|POCO|Mi\\s/i.test(userAgent)) {\n if (/Redmi/i.test(userAgent)) model = 'Xiaomi Redmi'\n else if (/POCO/i.test(userAgent)) model = 'Xiaomi POCO'\n else model = 'Xiaomi'\n }\n\n // Huawei\n if (/HUAWEI|Honor/i.test(userAgent)) {\n model = /Honor/i.test(userAgent) ? 'Honor' : 'Huawei'\n }\n\n // OPPO\n if (/OPPO/i.test(userAgent)) model = 'OPPO'\n\n // Vivo\n if (/vivo/i.test(userAgent)) model = 'Vivo'\n\n return { type, model }\n }\n\n /**\n * Get Windows version from NT version\n */\n private getWindowsVersion(ntVersion: string): string {\n const versionMap: Record<string, string> = {\n '10.0': 'Windows 10/11',\n '6.3': 'Windows 8.1',\n '6.2': 'Windows 8',\n '6.1': 'Windows 7',\n '6.0': 'Windows Vista',\n '5.1': 'Windows XP',\n }\n return versionMap[ntVersion] || `Windows NT ${ntVersion}`\n }\n\n /**\n * Detect if running in WebView\n */\n private detectWebView(userAgent: string): boolean {\n // Facebook WebView\n if (/FBAN|FBAV/i.test(userAgent)) return true\n // Instagram WebView\n if (/Instagram/i.test(userAgent)) return true\n // LinkedIn WebView\n if (/LinkedIn/i.test(userAgent)) return true\n // Twitter WebView\n if (/Twitter/i.test(userAgent)) return true\n // WeChat WebView\n if (/MicroMessenger/i.test(userAgent)) return true\n // Snapchat WebView\n if (/Snapchat/i.test(userAgent)) return true\n // TikTok WebView\n if (/BytedanceWebview|TikTok/i.test(userAgent)) return true\n // Generic WebView detection\n if (/wv|WebView/i.test(userAgent)) return true\n\n return false\n }\n}\n\n// Export singleton instance\nexport const deviceDetector = new DeviceDetector()\n","/**\n * ServiceWorkerManager - Service Worker Registration and Management\n */\n\nimport type { ServiceWorkerConfig } from './types'\n\nexport interface ServiceWorkerManagerOptions {\n config?: ServiceWorkerConfig\n onRegistered?: (registration: ServiceWorkerRegistration) => void\n onUpdated?: (registration: ServiceWorkerRegistration) => void\n onError?: (error: Error) => void\n debug?: boolean\n}\n\n/**\n * ServiceWorkerManager handles service worker registration, updates, and communication\n */\nexport class ServiceWorkerManager {\n private registration: ServiceWorkerRegistration | null = null\n private config: ServiceWorkerConfig\n private debug: boolean\n private onRegistered?: (registration: ServiceWorkerRegistration) => void\n private onUpdated?: (registration: ServiceWorkerRegistration) => void\n private onError?: (error: Error) => void\n\n constructor(options: ServiceWorkerManagerOptions = {}) {\n this.config = {\n path: '/service-worker.js',\n scope: '/',\n autoRegister: true,\n updateBehavior: 'auto',\n ...options.config,\n }\n this.debug = options.debug ?? false\n this.onRegistered = options.onRegistered\n this.onUpdated = options.onUpdated\n this.onError = options.onError\n }\n\n /**\n * Check if service workers are supported\n */\n isSupported(): boolean {\n return 'serviceWorker' in navigator\n }\n\n /**\n * Get the current service worker registration\n */\n getRegistration(): ServiceWorkerRegistration | null {\n return this.registration\n }\n\n /**\n * Register the service worker\n */\n async register(): Promise<ServiceWorkerRegistration | null> {\n if (!this.isSupported()) {\n this.log('Service workers not supported')\n return null\n }\n\n try {\n // Determine path and scope based on environment\n const { path, scope } = this.getPathAndScope()\n \n this.log(`Registering service worker: ${path} with scope ${scope}`)\n\n const registration = await navigator.serviceWorker.register(path, { scope })\n this.registration = registration\n\n // Set up update handling\n registration.addEventListener('updatefound', () => {\n this.handleUpdateFound(registration)\n })\n\n // Wait for the service worker to be ready\n await navigator.serviceWorker.ready\n\n this.log('Service worker registered successfully')\n this.onRegistered?.(registration)\n\n return registration\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n this.log(`Service worker registration failed: ${err.message}`, 'error')\n this.onError?.(err)\n return null\n }\n }\n\n /**\n * Unregister the service worker\n */\n async unregister(): Promise<boolean> {\n if (!this.registration) {\n return false\n }\n\n try {\n const result = await this.registration.unregister()\n if (result) {\n this.registration = null\n this.log('Service worker unregistered')\n }\n return result\n } catch (error) {\n this.log(`Failed to unregister service worker: ${error}`, 'error')\n return false\n }\n }\n\n /**\n * Check for service worker updates\n */\n async checkForUpdate(): Promise<void> {\n if (!this.registration) {\n return\n }\n\n try {\n await this.registration.update()\n this.log('Checked for service worker update')\n } catch (error) {\n this.log(`Failed to check for update: ${error}`, 'error')\n }\n }\n\n /**\n * Wait for service worker to be ready\n */\n async waitForReady(timeout: number = 5000): Promise<ServiceWorkerRegistration | null> {\n if (!this.isSupported()) {\n return null\n }\n\n const timeoutPromise = new Promise<null>((resolve) => {\n setTimeout(() => resolve(null), timeout)\n })\n\n try {\n const registration = await Promise.race([\n navigator.serviceWorker.ready,\n timeoutPromise,\n ])\n\n if (registration) {\n this.registration = registration\n }\n\n return registration\n } catch {\n return null\n }\n }\n\n /**\n * Send a message to the service worker\n */\n postMessage(message: any): void {\n if (!this.registration?.active) {\n this.log('No active service worker to send message to', 'warn')\n return\n }\n\n this.registration.active.postMessage(message)\n }\n\n /**\n * Clear app badge via service worker\n */\n clearBadge(): void {\n this.postMessage({ type: 'CLEAR_BADGE' })\n }\n\n /**\n * Set app badge via service worker\n */\n setBadge(count: number): void {\n this.postMessage({ type: 'SET_BADGE', count })\n }\n\n /**\n * Handle service worker update found\n */\n private handleUpdateFound(registration: ServiceWorkerRegistration): void {\n const newWorker = registration.installing\n\n if (!newWorker) {\n return\n }\n\n newWorker.addEventListener('statechange', () => {\n if (newWorker.state === 'installed' && navigator.serviceWorker.controller) {\n this.log('New service worker available')\n \n if (this.config.updateBehavior === 'auto') {\n // Auto-activate new service worker\n newWorker.postMessage({ type: 'SKIP_WAITING' })\n }\n\n this.onUpdated?.(registration)\n }\n })\n }\n\n /**\n * Get service worker path and scope based on environment\n * Handles Bubble.io version-live/version-test paths\n */\n private getPathAndScope(): { path: string; scope: string } {\n // Use configured values if provided\n if (this.config.path && this.config.scope) {\n return { path: this.config.path, scope: this.config.scope }\n }\n\n try {\n const pathname = window.location.pathname || '/'\n\n // Bubble.io specific paths\n if (pathname.startsWith('/version-live')) {\n return {\n path: '/version-live/service-worker.js',\n scope: '/version-live/',\n }\n }\n if (pathname.startsWith('/version-test')) {\n return {\n path: '/version-test/service-worker.js',\n scope: '/version-test/',\n }\n }\n } catch {\n // Ignore errors\n }\n\n // Default\n return {\n path: this.config.path || '/service-worker.js',\n scope: this.config.scope || '/',\n }\n }\n\n /**\n * Log message if debug is enabled\n */\n private log(message: string, level: 'log' | 'warn' | 'error' = 'log'): void {\n if (!this.debug) return\n const prefix = '[CloudSignal PWA SW]'\n console[level](`${prefix} ${message}`)\n }\n}\n","/**\n * InstallationManager - PWA Installation Detection and Prompts\n */\n\nimport type {\n InstallationState,\n InstallResult,\n BeforeInstallPromptEvent,\n DisplayMode,\n} from './types'\n\nexport interface InstallationManagerOptions {\n onInstallAvailable?: (event: BeforeInstallPromptEvent) => void\n onInstallAccepted?: (result: InstallResult) => void\n onInstallDismissed?: (result: InstallResult) => void\n onInstalled?: () => void\n debug?: boolean\n}\n\n/**\n * InstallationManager handles PWA installation detection and prompts\n */\nexport class InstallationManager {\n private deferredPrompt: BeforeInstallPromptEvent | null = null\n private isInstalled: boolean = false\n private debug: boolean\n private onInstallAvailable?: (event: BeforeInstallPromptEvent) => void\n private onInstallAccepted?: (result: InstallResult) => void\n private onInstallDismissed?: (result: InstallResult) => void\n private onInstalled?: () => void\n\n constructor(options: InstallationManagerOptions = {}) {\n this.debug = options.debug ?? false\n this.onInstallAvailable = options.onInstallAvailable\n this.onInstallAccepted = options.onInstallAccepted\n this.onInstallDismissed = options.onInstallDismissed\n this.onInstalled = options.onInstalled\n\n this.detectInstallationStatus()\n }\n\n /**\n * Initialize event listeners\n */\n initialize(): void {\n // Listen for install prompt\n window.addEventListener('beforeinstallprompt', (event) => {\n event.preventDefault()\n this.deferredPrompt = event as BeforeInstallPromptEvent\n this.log('Install prompt available')\n this.onInstallAvailable?.(this.deferredPrompt)\n })\n\n // Listen for app installed\n window.addEventListener('appinstalled', () => {\n this.isInstalled = true\n this.deferredPrompt = null\n this.log('PWA was installed')\n this.onInstalled?.()\n })\n\n // Listen for display mode changes\n if (window.matchMedia) {\n const standaloneQuery = window.matchMedia('(display-mode: standalone)')\n standaloneQuery.addEventListener('change', (e) => {\n if (e.matches) {\n this.isInstalled = true\n this.log('App is now running in standalone mode')\n }\n })\n }\n }\n\n /**\n * Get current installation state\n */\n getState(): InstallationState {\n const displayMode = this.getDisplayMode()\n const isIOS = this.isIOSDevice()\n const isSafari = this.isSafariBrowser()\n\n return {\n isInstalled: this.isInstalled || displayMode !== 'browser',\n canBeInstalled: this.deferredPrompt !== null,\n needsManualInstall: isIOS && isSafari && !this.isInstalled,\n showManualInstructions: isIOS && isSafari && !this.isInstalled,\n installSteps: this.getInstallSteps(),\n displayMode,\n }\n }\n\n /**\n * Show the install prompt\n */\n async showInstallPrompt(): Promise<InstallResult> {\n if (!this.deferredPrompt) {\n this.log('No install prompt available', 'warn')\n return {\n accepted: false,\n outcome: 'dismissed',\n }\n }\n\n try {\n // Show the prompt\n await this.deferredPrompt.prompt()\n\n // Wait for the user's response\n const { outcome, platform } = await this.deferredPrompt.userChoice\n\n const result: InstallResult = {\n accepted: outcome === 'accepted',\n outcome,\n platform,\n }\n\n if (outcome === 'accepted') {\n this.log('User accepted install prompt')\n this.isInstalled = true\n this.onInstallAccepted?.(result)\n } else {\n this.log('User dismissed install prompt')\n this.onInstallDismissed?.(result)\n }\n\n // Clear the deferred prompt\n this.deferredPrompt = null\n\n return result\n } catch (error) {\n this.log(`Error showing install prompt: ${error}`, 'error')\n return {\n accepted: false,\n outcome: 'dismissed',\n }\n }\n }\n\n /**\n * Check if install prompt is available\n */\n canInstall(): boolean {\n return this.deferredPrompt !== null\n }\n\n /**\n * Check if PWA is installed\n */\n isPWAInstalled(): boolean {\n return this.isInstalled || this.getDisplayMode() !== 'browser'\n }\n\n /**\n * Get current display mode\n */\n getDisplayMode(): DisplayMode {\n if (window.matchMedia('(display-mode: standalone)').matches) {\n return 'standalone'\n }\n if (window.matchMedia('(display-mode: minimal-ui)').matches) {\n return 'minimal-ui'\n }\n if (window.matchMedia('(display-mode: fullscreen)').matches) {\n return 'fullscreen'\n }\n\n // iOS Safari standalone check\n if ((navigator as any).standalone === true) {\n return 'standalone'\n }\n\n return 'browser'\n }\n\n /**\n * Get installation steps for current platform\n */\n getInstallSteps(): string[] {\n if (this.isIOSDevice()) {\n return [\n 'Tap the Share button in Safari',\n 'Scroll down and tap \"Add to Home Screen\"',\n 'Tap \"Add\" to install the app',\n ]\n }\n\n if (this.isAndroidDevice()) {\n return [\n 'Tap the menu (three dots) in your browser',\n 'Tap \"Install App\" or \"Add to Home Screen\"',\n 'Follow the prompts to install',\n ]\n }\n\n // Desktop\n return [\n 'Click the install icon in the address bar',\n 'Or use the browser menu to install the app',\n 'Click \"Install\" when prompted',\n ]\n }\n\n /**\n * Detect initial installation status\n */\n private detectInstallationStatus(): void {\n // Check display mode\n if (this.getDisplayMode() !== 'browser') {\n this.isInstalled = true\n return\n }\n\n // iOS Safari standalone check\n if ((navigator as any).standalone === true) {\n this.isInstalled = true\n return\n }\n\n // Check for related apps (if available)\n if ('getInstalledRelatedApps' in navigator) {\n (navigator as any).getInstalledRelatedApps()\n .then((apps: any[]) => {\n if (apps.length > 0) {\n this.isInstalled = true\n }\n })\n .catch(() => {\n // Ignore errors\n })\n }\n }\n\n /**\n * Check if device is iOS\n */\n private isIOSDevice(): boolean {\n return /iPad|iPhone|iPod/.test(navigator.userAgent) && !(window as any).MSStream\n }\n\n /**\n * Check if device is Android\n */\n private isAndroidDevice(): boolean {\n return /Android/i.test(navigator.userAgent)\n }\n\n /**\n * Check if browser is Safari\n */\n private isSafariBrowser(): boolean {\n const userAgent = navigator.userAgent\n return /Safari/i.test(userAgent) && !/Chrome|CriOS|FxiOS/i.test(userAgent)\n }\n\n /**\n * Log message if debug is enabled\n */\n private log(message: string, level: 'log' | 'warn' | 'error' = 'log'): void {\n if (!this.debug) return\n const prefix = '[CloudSignal PWA Install]'\n console[level](`${prefix} ${message}`)\n }\n}\n","/**\n * JWT Authentication Utilities\n * Implements CloudSignal's JWT-based authentication for user-linked registrations\n */\n\n/**\n * Auth mode type\n */\nexport type AuthMode = 'hmac' | 'jwt'\n\n/**\n * JWT auth configuration\n */\nexport interface JWTAuthConfig {\n /** JWT token from identity provider (Supabase, Firebase, Auth0, etc.) */\n token: string\n /** Organization ID (still needed for provider config lookup) */\n organizationId: string\n /** Callback to refresh token when expired */\n onTokenExpired?: () => Promise<string>\n}\n\n/**\n * Generate authentication headers for JWT-based requests\n * \n * @param token - JWT token from identity provider\n * @param organizationId - Organization UUID\n * @returns Headers object with Bearer token and org ID\n */\nexport function generateJWTHeaders(\n token: string,\n organizationId: string\n): Record<string, string> {\n return {\n 'Authorization': `Bearer ${token}`,\n 'X-CloudSignal-Organization-ID': organizationId,\n 'Content-Type': 'application/json',\n }\n}\n\n/**\n * Make an authenticated request using JWT\n * Handles token refresh on 401 errors\n * \n * @param config - JWT auth configuration\n * @param method - HTTP method\n * @param url - Request URL\n * @param body - Request body (optional)\n * @returns Fetch Response\n */\nexport async function makeJWTAuthenticatedRequest(\n config: JWTAuthConfig,\n method: string,\n url: string,\n body?: Record<string, any>\n): Promise<Response> {\n const bodyStr = body ? JSON.stringify(body) : undefined\n \n let headers = generateJWTHeaders(config.token, config.organizationId)\n\n const options: RequestInit = {\n method,\n headers,\n }\n\n if (bodyStr) {\n options.body = bodyStr\n }\n\n let response = await fetch(url, options)\n\n // Handle token expiration - retry once with refreshed token\n if (response.status === 401 && config.onTokenExpired) {\n try {\n const newToken = await config.onTokenExpired()\n if (newToken) {\n // Retry with new token\n headers = generateJWTHeaders(newToken, config.organizationId)\n options.headers = headers\n response = await fetch(url, options)\n }\n } catch (refreshError) {\n // Token refresh failed, return original 401 response\n console.warn('[CloudSignal PWA] Token refresh failed:', refreshError)\n }\n }\n\n return response\n}\n\n/**\n * Auth context that can be passed to managers\n */\nexport interface AuthContext {\n mode: AuthMode\n organizationId: string\n // HMAC mode\n organizationSecret?: string\n // JWT mode\n userToken?: string\n onTokenExpired?: () => Promise<string>\n}\n\n/**\n * Create auth context from config\n * Determines auth mode based on provided credentials\n * \n * @param config - Configuration object\n * @returns Auth context with detected mode\n */\nexport function createAuthContext(config: {\n organizationId: string\n organizationSecret?: string\n userToken?: string\n onTokenExpired?: () => Promise<string>\n}): AuthContext {\n // JWT mode takes precedence if userToken is provided\n if (config.userToken) {\n return {\n mode: 'jwt',\n organizationId: config.organizationId,\n userToken: config.userToken,\n onTokenExpired: config.onTokenExpired,\n }\n }\n\n // Default to HMAC mode\n if (!config.organizationSecret) {\n throw new Error('Either userToken or organizationSecret is required')\n }\n\n return {\n mode: 'hmac',\n organizationId: config.organizationId,\n organizationSecret: config.organizationSecret,\n }\n}\n\n/**\n * Make authenticated request using auth context\n * Automatically selects HMAC or JWT based on context mode\n * \n * @param authContext - Auth context\n * @param method - HTTP method\n * @param url - Request URL\n * @param body - Request body (optional)\n * @param onTokenExpired - Token refresh callback (overrides context for this call)\n * @returns Fetch Response\n */\nexport async function makeAuthenticatedRequestWithContext(\n authContext: AuthContext,\n method: string,\n url: string,\n body?: Record<string, any>,\n onTokenExpired?: () => Promise<string>\n): Promise<Response> {\n if (authContext.mode === 'jwt') {\n if (!authContext.userToken) {\n throw new Error('userToken required for JWT auth mode')\n }\n return makeJWTAuthenticatedRequest(\n {\n token: authContext.userToken,\n organizationId: authContext.organizationId,\n // Allow override of token expired callback\n onTokenExpired: onTokenExpired || authContext.onTokenExpired,\n },\n method,\n url,\n body\n )\n }\n\n // HMAC mode - use existing utility\n const { makeAuthenticatedRequest } = await import('./hmac')\n if (!authContext.organizationSecret) {\n throw new Error('organizationSecret required for HMAC auth mode')\n }\n return makeAuthenticatedRequest(\n authContext.organizationId,\n authContext.organizationSecret,\n method,\n url,\n body\n )\n}\n\n/**\n * Update token in auth context (for JWT mode)\n * Returns a new context with updated token\n * \n * @param authContext - Current auth context\n * @param newToken - New JWT token\n * @returns Updated auth context\n */\nexport function updateAuthToken(\n authContext: AuthContext,\n newToken: string\n): AuthContext {\n if (authContext.mode !== 'jwt') {\n // Switch to JWT mode\n return {\n mode: 'jwt',\n organizationId: authContext.organizationId,\n userToken: newToken,\n onTokenExpired: authContext.onTokenExpired,\n }\n }\n\n return {\n ...authContext,\n userToken: newToken,\n }\n}\n","/**\n * Storage Utilities\n * LocalStorage and IndexedDB helpers with type safety\n */\n\nconst STORAGE_PREFIX = 'cloudsignal_pwa_'\n\n/**\n * Get item from localStorage with type safety\n */\nexport function getStorageItem<T>(key: string, defaultValue?: T): T | null {\n try {\n const fullKey = `${STORAGE_PREFIX}${key}`\n const item = localStorage.getItem(fullKey)\n if (item === null) return defaultValue ?? null\n return JSON.parse(item) as T\n } catch {\n return defaultValue ?? null\n }\n}\n\n/**\n * Set item in localStorage\n */\nexport function setStorageItem<T>(key: string, value: T): boolean {\n try {\n const fullKey = `${STORAGE_PREFIX}${key}`\n localStorage.setItem(fullKey, JSON.stringify(value))\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Remove item from localStorage\n */\nexport function removeStorageItem(key: string): boolean {\n try {\n const fullKey = `${STORAGE_PREFIX}${key}`\n localStorage.removeItem(fullKey)\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Get registration ID from storage\n */\nexport function getRegistrationId(organizationId: string, serviceId: string): string | null {\n const key = `registration_${organizationId}_${serviceId}`\n return getStorageItem<string>(key)\n}\n\n/**\n * Set registration ID in storage\n */\nexport function setRegistrationId(\n organizationId: string,\n serviceId: string,\n registrationId: string\n): boolean {\n const key = `registration_${organizationId}_${serviceId}`\n return setStorageItem(key, registrationId)\n}\n\n/**\n * Remove registration ID from storage\n */\nexport function removeRegistrationId(organizationId: string, serviceId: string): boolean {\n const key = `registration_${organizationId}_${serviceId}`\n return removeStorageItem(key)\n}\n\n/**\n * Check if installation is registered\n */\nexport function isInstallationRegistered(organizationId: string, serviceId: string): boolean {\n const key = `install_registered_${organizationId}_${serviceId}`\n return getStorageItem<boolean>(key) === true\n}\n\n/**\n * Mark installation as registered\n */\nexport function markInstallationRegistered(\n organizationId: string,\n serviceId: string,\n registrationId: string\n): boolean {\n const key = `install_registered_${organizationId}_${serviceId}`\n setStorageItem(`install_id_${organizationId}_${serviceId}`, registrationId)\n return setStorageItem(key, true)\n}\n\n/**\n * IndexedDB Storage for Service Worker\n * Provides persistent storage for badge counts, notifications, etc.\n */\nexport class IndexedDBStorage {\n private dbName: string\n private dbVersion: number\n private db: IDBDatabase | null = null\n\n constructor(dbName: string = 'CloudSignalPWA', dbVersion: number = 1) {\n this.dbName = dbName\n this.dbVersion = dbVersion\n }\n\n /**\n * Initialize the database\n */\n async init(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(this.dbName, this.dbVersion)\n\n request.onerror = () => reject(request.error)\n request.onsuccess = () => {\n this.db = request.result\n resolve(this.db)\n }\n\n request.onupgradeneeded = (event) => {\n const db = (event.target as IDBOpenDBRequest).result\n\n // Badge count store\n if (!db.objectStoreNames.contains('badge')) {\n db.createObjectStore('badge')\n }\n\n // Notifications history store\n if (!db.objectStoreNames.contains('notifications')) {\n const notificationStore = db.createObjectStore('notifications', {\n keyPath: 'id',\n autoIncrement: true,\n })\n notificationStore.createIndex('timestamp', 'timestamp', { unique: false })\n notificationStore.createIndex('read', 'read', { unique: false })\n }\n\n // User preferences store\n if (!db.objectStoreNames.contains('userPreferences')) {\n db.createObjectStore('userPreferences')\n }\n\n // Sync queue for offline actions\n if (!db.objectStoreNames.contains('syncQueue')) {\n const syncStore = db.createObjectStore('syncQueue', {\n keyPath: 'id',\n autoIncrement: true,\n })\n syncStore.createIndex('timestamp', 'timestamp', { unique: false })\n }\n }\n })\n }\n\n /**\n * Ensure database connection\n */\n private async ensureConnection(): Promise<void> {\n if (!this.db) {\n await this.init()\n }\n }\n\n /**\n * Promisify IDBRequest\n */\n private promisifyRequest<T>(request: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n request.onsuccess = () => resolve(request.result)\n request.onerror = () => reject(request.error)\n })\n }\n\n /**\n * Get badge count\n */\n async getBadgeCount(): Promise<number> {\n await this.ensureConnection()\n const transaction = this.db!.transaction(['badge'], 'readonly')\n const store = transaction.objectStore('badge')\n const count = await this.promisifyRequest(store.get('count'))\n return count || 0\n }\n\n /**\n * Set badge count\n */\n async setBadgeCount(count: number): Promise<void> {\n await this.ensureConnection()\n const transaction = this.db!.transaction(['badge'], 'readwrite')\n const store = transaction.objectStore('badge')\n await this.promisifyRequest(store.put(count, 'count'))\n }\n\n /**\n * Increment badge count\n */\n async incrementBadgeCount(increment: number = 1): Promise<number> {\n const currentCount = await this.getBadgeCount()\n const newCount = Math.max(0, currentCount + increment)\n await this.setBadgeCount(newCount)\n return newCount\n }\n\n /**\n * Save notification to history\n */\n async saveNotification(notification: Record<string, any>): Promise<number> {\n await this.ensureConnection()\n const transaction = this.db!.transaction(['notifications'], 'readwrite')\n const store = transaction.objectStore('notifications')\n\n const notificationData = {\n ...notification,\n timestamp: Date.now(),\n read: false,\n }\n\n const key = await this.promisifyRequest(store.add(notificationData))\n return key as number\n }\n\n /**\n * Get recent notifications\n */\n async getRecentNotifications(limit: number = 50): Promise<any[]> {\n await this.ensureConnection()\n const transaction = this.db!.transaction(['notifications'], 'readonly')\n const store = transaction.objectStore('notifications')\n const index = store.index('timestamp')\n\n const notifications: any[] = []\n const cursor = index.openCursor(null, 'prev')\n\n return new Promise((resolve, reject) => {\n cursor.onsuccess = (event) => {\n const result = (event.target as IDBRequest).result\n if (result && notifications.length < limit) {\n notifications.push(result.value)\n result.continue()\n } else {\n resolve(notifications)\n }\n }\n cursor.onerror = () => reject(cursor.error)\n })\n }\n\n /**\n * Mark notification as read\n */\n async markNotificationAsRead(notificationId: number): Promise<void> {\n await this.ensureConnection()\n const transaction = this.db!.transaction(['notifications'], 'readwrite')\n const store = transaction.objectStore('notifications')\n\n const notification = await this.promisifyRequest(store.get(notificationId))\n if (notification) {\n notification.read = true\n await this.promisifyRequest(store.put(notification))\n }\n }\n\n /**\n * Get user preference\n */\n async getUserPreference<T>(key: string): Promise<T | null> {\n await this.ensureConnection()\n const transaction = this.db!.transaction(['userPreferences'], 'readonly')\n const store = transaction.objectStore('userPreferences')\n return this.promisifyRequest(store.get(key))\n }\n\n /**\n * Set user preference\n */\n async setUserPreference<T>(key: string, value: T): Promise<void> {\n await this.ensureConnection()\n const transaction = this.db!.transaction(['userPreferences'], 'readwrite')\n const store = transaction.objectStore('userPreferences')\n await this.promisifyRequest(store.put(value, key))\n }\n\n /**\n * Add item to sync queue\n */\n async addToSyncQueue(action: Record<string, any>): Promise<number> {\n await this.ensureConnection()\n const transaction = this.db!.transaction(['syncQueue'], 'readwrite')\n const store = transaction.objectStore('syncQueue')\n\n const queueItem = {\n ...action,\n timestamp: Date.now(),\n retries: 0,\n }\n\n const key = await this.promisifyRequest(store.add(queueItem))\n return key as number\n }\n\n /**\n * Get sync queue items\n */\n async getSyncQueue(): Promise<any[]> {\n await this.ensureConnection()\n const transaction = this.db!.transaction(['syncQueue'], 'readonly')\n const store = transaction.objectStore('syncQueue')\n return this.promisifyRequest(store.getAll())\n }\n\n /**\n * Remove item from sync queue\n */\n async removeFromSyncQueue(id: number): Promise<void> {\n await this.ensureConnection()\n const transaction = this.db!.transaction(['syncQueue'], 'readwrite')\n const store = transaction.objectStore('syncQueue')\n await this.promisifyRequest(store.delete(id))\n }\n}\n","/**\n * PushNotificationManager - Push Notification Registration and Management\n */\n\nimport type {\n Registration,\n RegisterOptions,\n NotificationPreferences,\n RegistrationStatusResponse,\n PushSubscriptionData,\n PWAServiceConfig,\n AuthMode,\n} from './types'\nimport { makeAuthenticatedRequest, isValidUUID } from './utils/hmac'\nimport {\n type AuthContext,\n createAuthContext,\n makeAuthenticatedRequestWithContext,\n updateAuthToken,\n} from './utils/jwt-auth'\nimport { generateBrowserFingerprint } from './utils/fingerprint'\nimport { \n setRegistrationId, \n getRegistrationId, \n removeRegistrationId,\n isInstallationRegistered,\n markInstallationRegistered,\n getStorageItem,\n} from './utils/storage'\nimport { DeviceDetector } from './DeviceDetector'\n\nexport interface PushNotificationManagerOptions {\n serviceUrl: string\n organizationId: string\n /** Organization secret for HMAC auth (optional if userToken provided) */\n organizationSecret?: string\n /** JWT token for authenticated user mode (optional if organizationSecret provided) */\n userToken?: string\n /** Callback to refresh JWT when expired */\n onTokenExpired?: () => Promise<string>\n serviceId: string\n debug?: boolean\n onRegistered?: (registration: Registration) => void\n onUnregistered?: () => void\n onError?: (error: Error) => void\n onPermissionDenied?: () => void\n}\n\n/**\n * PushNotificationManager handles push notification registration with CloudSignal backend\n */\nexport class PushNotificationManager {\n private serviceUrl: string\n private organizationId: string\n private serviceId: string\n private debug: boolean\n private deviceDetector: DeviceDetector\n private serviceWorkerRegistration: ServiceWorkerRegistration | null = null\n private pushSubscription: PushSubscription | null = null\n private registrationId: string | null = null\n private vapidPublicKey: string | null = null\n private authContext: AuthContext\n \n private onRegistered?: (registration: Registration) => void\n private onUnregistered?: () => void\n private onError?: (error: Error) => void\n private onPermissionDenied?: () => void\n private onTokenExpired?: () => Promise<string>\n\n constructor(options: PushNotificationManagerOptions) {\n this.serviceUrl = options.serviceUrl\n this.organizationId = options.organizationId\n this.serviceId = options.serviceId\n this.debug = options.debug ?? false\n this.deviceDetector = new DeviceDetector()\n \n // Initialize auth context (supports both HMAC and JWT)\n this.authContext = createAuthContext({\n organizationId: options.organizationId,\n organizationSecret: options.organizationSecret,\n userToken: options.userToken,\n })\n \n this.onRegistered = options.onRegistered\n this.onUnregistered = options.onUnregistered\n this.onError = options.onError\n this.onPermissionDenied = options.onPermissionDenied\n this.onTokenExpired = options.onTokenExpired\n\n // Load cached registration ID\n this.registrationId = getRegistrationId(this.organizationId, this.serviceId)\n }\n\n /**\n * Set service worker registration\n */\n setServiceWorkerRegistration(registration: ServiceWorkerRegistration): void {\n this.serviceWorkerRegistration = registration\n }\n\n /**\n * Set VAPID public key from config\n */\n setVapidPublicKey(key: string): void {\n this.vapidPublicKey = key\n }\n\n /**\n * Get current registration ID\n */\n getRegistrationId(): string | null {\n return this.registrationId\n }\n\n /**\n * Check if registered for push notifications\n */\n isRegistered(): boolean {\n return this.registrationId !== null\n }\n\n /**\n * Get current authentication mode\n */\n getAuthMode(): AuthMode {\n return this.authContext.mode\n }\n\n /**\n * Update JWT token (for token refresh or upgrading from HMAC to JWT)\n */\n updateToken(token: string): void {\n this.authContext = updateAuthToken(this.authContext, token)\n this.log(`Auth mode: ${this.authContext.mode}`)\n }\n\n /**\n * Register for push notifications\n */\n async register(options: RegisterOptions = {}): Promise<Registration | null> {\n try {\n // Check for required service worker\n if (!this.serviceWorkerRegistration) {\n throw new Error('Service worker not registered')\n }\n\n // Check for VAPID key\n if (!this.vapidPublicKey) {\n throw new Error('VAPID public key not set. Call downloadConfig() first.')\n }\n\n // Request notification permission\n const permission = await this.requestPermission()\n if (permission !== 'granted') {\n this.log('Notification permission denied')\n this.onPermissionDenied?.()\n return null\n }\n\n // Subscribe to push notifications\n const subscription = await this.subscribeToPush()\n if (!subscription) {\n throw new Error('Failed to subscribe to push notifications')\n }\n\n this.pushSubscription = subscription\n\n // Generate browser fingerprint\n const fingerprint = await generateBrowserFingerprint()\n\n // Get device info\n const deviceInfo = this.deviceDetector.getDeviceInfo()\n const platformInfo = this.deviceDetector.getPlatformInfo()\n\n // Prepare registration data\n const subscriptionJson = subscription.toJSON()\n const registrationData: PushSubscriptionData = {\n serviceId: this.serviceId,\n userEmail: options.userEmail,\n userId: isValidUUID(options.userId) ? options.userId : undefined,\n endpoint: subscription.endpoint,\n keys: {\n p256dh: subscriptionJson.keys?.p256dh || '',\n auth: subscriptionJson.keys?.auth || '',\n },\n browserFingerprint: fingerprint || undefined,\n deviceType: deviceInfo.deviceType,\n deviceModel: deviceInfo.deviceModel,\n browserName: platformInfo.browser,\n browserVersion: platformInfo.browserVersion,\n osName: platformInfo.os,\n osVersion: platformInfo.osVersion,\n userAgent: platformInfo.userAgent,\n displayMode: 'standalone',\n isInstalled: true,\n timezone: options.timezone || Intl.DateTimeFormat().resolvedOptions().timeZone,\n language: options.language || navigator.language || 'en-US',\n }\n\n // Send to backend\n const url = `${this.serviceUrl}/api/v1/registration/register`\n const response = await makeAuthenticatedRequestWithContext(\n this.authContext,\n 'POST',\n url,\n registrationData as any,\n this.onTokenExpired\n )\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Registration failed: ${response.status} - ${errorText}`)\n }\n\n const result = await response.json()\n\n // Store registration ID\n this.registrationId = result.registration_id\n setRegistrationId(this.organizationId, this.serviceId, this.registrationId!)\n\n const registration: Registration = {\n registrationId: result.registration_id,\n status: result.status || 'active',\n createdAt: result.created_at || new Date().toISOString(),\n isActive: true,\n }\n\n this.log(`Push registration successful: ${registration.registrationId}`)\n this.onRegistered?.(registration)\n\n return registration\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n this.log(`Push registration failed: ${err.message}`, 'error')\n this.onError?.(err)\n return null\n }\n }\n\n /**\n * Unregister from push notifications\n */\n async unregister(): Promise<boolean> {\n try {\n if (!this.registrationId) {\n this.log('No registration to unregister')\n return true\n }\n\n // Unsubscribe from push\n if (this.pushSubscription) {\n await this.pushSubscription.unsubscribe()\n this.pushSubscription = null\n }\n\n // Notify backend\n const url = `${this.serviceUrl}/api/v1/registration/unregister`\n const response = await makeAuthenticatedRequestWithContext(\n this.authContext,\n 'POST',\n url,\n { registration_id: this.registrationId },\n this.onTokenExpired\n )\n\n if (!response.ok) {\n this.log(`Backend unregistration failed: ${response.status}`, 'warn')\n }\n\n // Clear local storage\n removeRegistrationId(this.organizationId, this.serviceId)\n this.registrationId = null\n\n this.log('Push unregistration successful')\n this.onUnregistered?.()\n\n return true\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n this.log(`Push unregistration failed: ${err.message}`, 'error')\n this.onError?.(err)\n return false\n }\n }\n\n /**\n * Update notification preferences\n */\n async updatePreferences(preferences: NotificationPreferences): Promise<boolean> {\n try {\n if (!this.registrationId) {\n throw new Error('Not registered for push notifications')\n }\n\n const url = `${this.serviceUrl}/api/v1/registration/update`\n const response = await makeAuthenticatedRequestWithContext(\n this.authContext,\n 'POST',\n url,\n {\n registration_id: this.registrationId,\n notification_topics: preferences.topics,\n timezone: preferences.timezone,\n language: preferences.language,\n is_active: preferences.isActive,\n },\n this.onTokenExpired\n )\n\n if (!response.ok) {\n throw new Error(`Update failed: ${response.status}`)\n }\n\n this.log('Preferences updated successfully')\n return true\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n this.log(`Failed to update preferences: ${err.message}`, 'error')\n this.onError?.(err)\n return false\n }\n }\n\n /**\n * Check registration status\n */\n async checkStatus(): Promise<RegistrationStatusResponse | null> {\n try {\n if (!this.registrationId) {\n return null\n }\n\n const url = `${this.serviceUrl}/api/v1/registration/status/${this.registrationId}`\n const response = await makeAuthenticatedRequestWithContext(\n this.authContext,\n 'GET',\n url,\n undefined,\n this.onTokenExpired\n )\n\n if (!response.ok) {\n if (response.status === 404) {\n // Registration no longer exists\n removeRegistrationId(this.organizationId, this.serviceId)\n this.registrationId = null\n return null\n }\n throw new Error(`Status check failed: ${response.status}`)\n }\n\n const status = await response.json()\n return {\n registrationId: status.registration_id,\n status: status.status,\n isActive: status.is_active,\n isOnline: status.is_online,\n lastActive: status.last_active,\n lastSeenOnline: status.last_seen_online,\n lastHeartbeat: status.last_heartbeat,\n installationDate: status.installation_date,\n notificationCount: status.notification_count,\n deviceInfo: status.device_info,\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n this.log(`Status check failed: ${err.message}`, 'error')\n return null\n }\n }\n\n /**\n * Register PWA installation without push subscription.\n * This tracks users who installed the PWA but haven't subscribed to notifications.\n * Called automatically when installation is detected.\n * \n * @returns Installation registration result or null if already registered/failed\n */\n async registerInstallation(): Promise<{ registrationId: string } | null> {\n try {\n // Check if already registered\n if (isInstallationRegistered(this.organizationId, this.serviceId)) {\n this.log('Installation already registered, skipping')\n return null\n }\n\n // Generate browser fingerprint\n const fingerprint = await generateBrowserFingerprint()\n\n // Get device info\n const deviceInfo = this.deviceDetector.getDeviceInfo()\n const platformInfo = this.deviceDetector.getPlatformInfo()\n\n // Prepare installation data\n const installationData = {\n service_id: this.serviceId,\n browser_fingerprint: fingerprint || undefined,\n device_type: deviceInfo.deviceType,\n device_model: deviceInfo.deviceModel,\n browser_name: platformInfo.browser,\n browser_version: platformInfo.browserVersion,\n os_name: platformInfo.os,\n os_version: platformInfo.osVersion,\n user_agent: platformInfo.userAgent,\n display_mode: 'standalone',\n is_installed: true,\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n language: navigator.language || 'en-US',\n }\n\n // Send to backend\n const url = `${this.serviceUrl}/api/v1/registration/install-only`\n const response = await makeAuthenticatedRequestWithContext(\n this.authContext,\n 'POST',\n url,\n installationData as any,\n this.onTokenExpired\n )\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Installation registration failed: ${response.status} - ${errorText}`)\n }\n\n const result = await response.json()\n\n // Mark installation as registered in storage\n markInstallationRegistered(this.organizationId, this.serviceId, result.registration_id)\n\n this.log(`Installation registered successfully: ${result.registration_id}`)\n return { registrationId: result.registration_id }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n this.log(`Installation registration failed: ${err.message}`, 'error')\n this.onError?.(err)\n return null\n }\n }\n\n /**\n * Check if installation is already registered\n */\n isInstallationRegistered(): boolean {\n return isInstallationRegistered(this.organizationId, this.serviceId)\n }\n\n /**\n * Get stored installation registration ID\n */\n getInstallationId(): string | null {\n return getStorageItem<string>(`install_id_${this.organizationId}_${this.serviceId}`)\n }\n\n /**\n * Request notification permission\n */\n async requestPermission(): Promise<NotificationPermission> {\n if (!('Notification' in window)) {\n return 'denied'\n }\n\n if (Notification.permission === 'granted') {\n return 'granted'\n }\n\n if (Notification.permission === 'denied') {\n return 'denied'\n }\n\n return await Notification.requestPermission()\n }\n\n /**\n * Subscribe to push notifications\n */\n private async subscribeToPush(): Promise<PushSubscription | null> {\n if (!this.serviceWorkerRegistration || !this.vapidPublicKey) {\n return null\n }\n\n try {\n // Check for existing subscription\n let subscription = await this.serviceWorkerRegistration.pushManager.getSubscription()\n\n if (!subscription) {\n // Create new subscription\n const applicationServerKey = this.urlBase64ToUint8Array(this.vapidPublicKey)\n \n subscription = await this.serviceWorkerRegistration.pushManager.subscribe({\n userVisibleOnly: true,\n applicationServerKey: applicationServerKey.buffer as ArrayBuffer,\n })\n }\n\n return subscription\n } catch (error) {\n this.log(`Push subscription failed: ${error}`, 'error')\n return null\n }\n }\n\n /**\n * Convert base64 VAPID key to Uint8Array\n */\n private urlBase64ToUint8Array(base64String: string): Uint8Array {\n const padding = '='.repeat((4 - (base64String.length % 4)) % 4)\n const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/')\n const rawData = atob(base64)\n const outputArray = new Uint8Array(rawData.length)\n for (let i = 0; i < rawData.length; ++i) {\n outputArray[i] = rawData.charCodeAt(i)\n }\n return outputArray\n }\n\n /**\n * Log message if debug is enabled\n */\n private log(message: string, level: 'log' | 'warn' | 'error' = 'log'): void {\n if (!this.debug) return\n const prefix = '[CloudSignal PWA Push]'\n console[level](`${prefix} ${message}`)\n }\n}\n","/**\n * HeartbeatManager - Online Status Tracking via Periodic Heartbeat\n * Now with network and battery awareness for optimal performance\n */\n\nimport type { HeartbeatConfig, AuthMode } from './types'\nimport type {\n AdaptiveHeartbeatConfig,\n NetworkConnectionInfo,\n BatteryInfo,\n} from './types/wakelock'\nimport { makeAuthenticatedRequest, isValidUUID } from './utils/hmac'\nimport {\n type AuthContext,\n createAuthContext,\n makeAuthenticatedRequestWithContext,\n updateAuthToken,\n} from './utils/jwt-auth'\n\nexport interface HeartbeatManagerOptions {\n serviceUrl: string\n organizationId: string\n /** Organization secret for HMAC auth (optional if userToken provided) */\n organizationSecret?: string\n /** JWT token for authenticated user mode (optional if organizationSecret provided) */\n userToken?: string\n /** Callback to refresh JWT when expired */\n onTokenExpired?: () => Promise<string>\n config?: HeartbeatConfig\n adaptiveConfig?: AdaptiveHeartbeatConfig\n debug?: boolean\n onHeartbeatSent?: () => void\n onHeartbeatError?: (error: Error) => void\n onIntervalChanged?: (newInterval: number, reason: string) => void\n onPausedForBattery?: () => void\n onResumedFromBattery?: () => void\n}\n\n/**\n * Default intervals by connection type (in milliseconds)\n */\nconst DEFAULT_INTERVALS: Record<string, number> = {\n '4g': 30000, // 30 seconds\n '3g': 60000, // 60 seconds\n '2g': 120000, // 2 minutes\n 'slow-2g': 180000, // 3 minutes\n 'unknown': 30000, // Default\n}\n\n/**\n * HeartbeatManager sends periodic heartbeats to track online status\n * Now with adaptive intervals based on network quality and battery level\n */\nexport class HeartbeatManager {\n private serviceUrl: string\n private organizationId: string\n private config: Required<HeartbeatConfig>\n private adaptiveConfig: Required<AdaptiveHeartbeatConfig>\n private debug: boolean\n private registrationId: string | null = null\n private intervalId: ReturnType<typeof setInterval> | null = null\n private isRunning: boolean = false\n private isPausedForBattery: boolean = false\n private currentInterval: number\n private visibilityHandler: (() => void) | null = null\n private connectionChangeHandler: (() => void) | null = null\n private batteryManager: any = null\n private authContext: AuthContext\n \n private onHeartbeatSent?: () => void\n private onHeartbeatError?: (error: Error) => void\n private onIntervalChanged?: (newInterval: number, reason: string) => void\n private onPausedForBattery?: () => void\n private onResumedFromBattery?: () => void\n private onTokenExpired?: () => Promise<string>\n\n constructor(options: HeartbeatManagerOptions) {\n this.serviceUrl = options.serviceUrl\n this.organizationId = options.organizationId\n this.debug = options.debug ?? false\n this.onHeartbeatSent = options.onHeartbeatSent\n this.onHeartbeatError = options.onHeartbeatError\n this.onIntervalChanged = options.onIntervalChanged\n this.onPausedForBattery = options.onPausedForBattery\n this.onResumedFromBattery = options.onResumedFromBattery\n this.onTokenExpired = options.onTokenExpired\n\n // Initialize auth context (supports both HMAC and JWT)\n this.authContext = createAuthContext({\n organizationId: options.organizationId,\n organizationSecret: options.organizationSecret,\n userToken: options.userToken,\n })\n\n this.config = {\n enabled: options.config?.enabled ?? true,\n interval: options.config?.interval ?? 30000, // 30 seconds\n autoStart: options.config?.autoStart ?? true,\n stopOnHidden: options.config?.stopOnHidden ?? true,\n }\n\n this.adaptiveConfig = {\n adaptToNetwork: options.adaptiveConfig?.adaptToNetwork ?? true,\n adaptToBattery: options.adaptiveConfig?.adaptToBattery ?? true,\n batteryPauseThreshold: options.adaptiveConfig?.batteryPauseThreshold ?? 0.15,\n intervals: {\n ...DEFAULT_INTERVALS,\n ...options.adaptiveConfig?.intervals,\n },\n }\n\n this.currentInterval = this.config.interval\n }\n\n /**\n * Set the registration ID for heartbeat requests\n */\n setRegistrationId(registrationId: string): void {\n this.registrationId = registrationId\n \n // Auto-start if configured and not already running\n if (this.config.autoStart && !this.isRunning && this.config.enabled) {\n this.start()\n }\n }\n\n /**\n * Start sending heartbeats\n */\n start(): void {\n if (this.isRunning) {\n this.log('Heartbeat already running')\n return\n }\n\n if (!this.registrationId || !isValidUUID(this.registrationId)) {\n this.log('Cannot start heartbeat: no valid registration ID', 'warn')\n return\n }\n\n if (!this.config.enabled) {\n this.log('Heartbeat is disabled')\n return\n }\n\n this.isRunning = true\n\n // Calculate initial interval based on network\n this.updateIntervalForNetwork()\n\n this.log(`Starting heartbeat with interval ${this.currentInterval}ms`)\n\n // Send initial heartbeat\n this.sendHeartbeat()\n\n // Set up interval\n this.startInterval()\n\n // Set up visibility handler if configured\n if (this.config.stopOnHidden) {\n this.setupVisibilityHandler()\n }\n\n // Set up network change listener\n if (this.adaptiveConfig.adaptToNetwork) {\n this.setupNetworkChangeHandler()\n }\n\n // Set up battery monitoring\n if (this.adaptiveConfig.adaptToBattery) {\n this.setupBatteryMonitoring()\n }\n }\n\n /**\n * Stop sending heartbeats\n */\n stop(): void {\n if (!this.isRunning) {\n return\n }\n\n this.isRunning = false\n this.isPausedForBattery = false\n\n if (this.intervalId) {\n clearInterval(this.intervalId)\n this.intervalId = null\n }\n\n if (this.visibilityHandler) {\n document.removeEventListener('visibilitychange', this.visibilityHandler)\n this.visibilityHandler = null\n }\n\n if (this.connectionChangeHandler) {\n const connection = (navigator as any).connection\n if (connection) {\n connection.removeEventListener('change', this.connectionChangeHandler)\n }\n this.connectionChangeHandler = null\n }\n\n this.log('Heartbeat stopped')\n }\n\n /**\n * Check if heartbeat is running\n */\n isHeartbeatRunning(): boolean {\n return this.isRunning\n }\n\n /**\n * Get current authentication mode\n */\n getAuthMode(): AuthMode {\n return this.authContext.mode\n }\n\n /**\n * Update JWT token (for token refresh or upgrading from HMAC to JWT)\n */\n updateToken(token: string): void {\n this.authContext = updateAuthToken(this.authContext, token)\n this.log(`Auth mode: ${this.authContext.mode}`)\n }\n\n /**\n * Send a single heartbeat\n */\n async sendHeartbeat(): Promise<boolean> {\n if (!this.registrationId || !isValidUUID(this.registrationId)) {\n this.log('Cannot send heartbeat: no valid registration ID', 'warn')\n return false\n }\n\n try {\n const url = `${this.serviceUrl}/api/v1/registration/heartbeat/${this.registrationId}`\n \n const response = await makeAuthenticatedRequestWithContext(\n this.authContext,\n 'POST',\n url,\n undefined,\n this.onTokenExpired\n )\n\n if (!response.ok) {\n throw new Error(`Heartbeat failed: ${response.status}`)\n }\n\n this.log('Heartbeat sent successfully')\n this.onHeartbeatSent?.()\n return true\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n this.log(`Heartbeat failed: ${err.message}`, 'error')\n this.onHeartbeatError?.(err)\n return false\n }\n }\n\n /**\n * Update heartbeat configuration\n */\n updateConfig(config: Partial<HeartbeatConfig>): void {\n const wasRunning = this.isRunning\n \n if (wasRunning) {\n this.stop()\n }\n\n this.config = {\n ...this.config,\n ...config,\n }\n\n if (wasRunning && this.config.enabled) {\n this.start()\n }\n }\n\n /**\n * Get current network connection info\n */\n getNetworkInfo(): NetworkConnectionInfo {\n const connection = (navigator as any).connection\n if (!connection) {\n return {}\n }\n\n return {\n effectiveType: connection.effectiveType,\n saveData: connection.saveData,\n downlink: connection.downlink,\n rtt: connection.rtt,\n }\n }\n\n /**\n * Get current battery info (if available)\n */\n async getBatteryInfo(): Promise<BatteryInfo | null> {\n try {\n if (!('getBattery' in navigator)) {\n return null\n }\n\n const battery = await (navigator as any).getBattery()\n return {\n level: battery.level,\n charging: battery.charging,\n }\n } catch {\n return null\n }\n }\n\n /**\n * Get current heartbeat interval\n */\n getCurrentInterval(): number {\n return this.currentInterval\n }\n\n /**\n * Check if heartbeat is paused due to low battery\n */\n isPausedDueToBattery(): boolean {\n return this.isPausedForBattery\n }\n\n // ============================================\n // Private interval management\n // ============================================\n\n /**\n * Start the heartbeat interval\n */\n private startInterval(): void {\n if (this.intervalId) {\n clearInterval(this.intervalId)\n }\n\n this.intervalId = setInterval(() => {\n this.sendHeartbeat()\n }, this.currentInterval)\n }\n\n /**\n * Update interval based on network conditions\n */\n private updateIntervalForNetwork(): void {\n if (!this.adaptiveConfig.adaptToNetwork) {\n this.currentInterval = this.config.interval\n return\n }\n\n const connection = (navigator as any).connection\n if (!connection) {\n this.currentInterval = this.config.interval\n return\n }\n\n // Check save data preference\n if (connection.saveData) {\n const newInterval = Math.max(this.currentInterval, 120000) // At least 2 minutes\n if (newInterval !== this.currentInterval) {\n this.currentInterval = newInterval\n this.log(`Interval increased to ${newInterval}ms (saveData enabled)`)\n this.onIntervalChanged?.(newInterval, 'saveData')\n }\n return\n }\n\n // Adjust based on connection type\n const effectiveType = connection.effectiveType || 'unknown'\n const newInterval = this.adaptiveConfig.intervals[effectiveType] || this.config.interval\n\n if (newInterval !== this.currentInterval) {\n const oldInterval = this.currentInterval\n this.currentInterval = newInterval\n this.log(`Interval changed from ${oldInterval}ms to ${newInterval}ms (${effectiveType})`)\n this.onIntervalChanged?.(newInterval, effectiveType)\n }\n }\n\n /**\n * Set up network change handler\n */\n private setupNetworkChangeHandler(): void {\n const connection = (navigator as any).connection\n if (!connection) {\n return\n }\n\n this.connectionChangeHandler = () => {\n const oldInterval = this.currentInterval\n this.updateIntervalForNetwork()\n\n // Restart interval if it changed\n if (oldInterval !== this.currentInterval && this.isRunning && !this.isPausedForBattery) {\n this.startInterval()\n }\n }\n\n connection.addEventListener('change', this.connectionChangeHandler)\n }\n\n /**\n * Set up battery monitoring\n */\n private async setupBatteryMonitoring(): Promise<void> {\n try {\n if (!('getBattery' in navigator)) {\n return\n }\n\n this.batteryManager = await (navigator as any).getBattery()\n\n const checkBattery = () => {\n if (!this.batteryManager) return\n\n const level = this.batteryManager.level\n const charging = this.batteryManager.charging\n\n // If battery is low and not charging, pause heartbeat\n if (level <= this.adaptiveConfig.batteryPauseThreshold && !charging) {\n if (!this.isPausedForBattery && this.isRunning) {\n this.isPausedForBattery = true\n if (this.intervalId) {\n clearInterval(this.intervalId)\n this.intervalId = null\n }\n this.log(`Heartbeat paused (battery at ${Math.round(level * 100)}%)`)\n this.onPausedForBattery?.()\n }\n } else {\n // Resume if was paused for battery\n if (this.isPausedForBattery && this.isRunning) {\n this.isPausedForBattery = false\n this.startInterval()\n this.log(`Heartbeat resumed (battery at ${Math.round(level * 100)}%)`)\n this.onResumedFromBattery?.()\n }\n }\n }\n\n // Check initial state\n checkBattery()\n\n // Listen for changes\n this.batteryManager.addEventListener('levelchange', checkBattery)\n this.batteryManager.addEventListener('chargingchange', checkBattery)\n } catch {\n // Battery API not available\n }\n }\n\n /**\n * Set up visibility change handler\n */\n private setupVisibilityHandler(): void {\n this.visibilityHandler = () => {\n if (document.hidden) {\n // Page is hidden, pause heartbeat\n if (this.intervalId) {\n clearInterval(this.intervalId)\n this.intervalId = null\n }\n this.log('Heartbeat paused (page hidden)')\n } else {\n // Page is visible, resume heartbeat\n if (this.isRunning && !this.intervalId && !this.isPausedForBattery) {\n this.sendHeartbeat() // Send immediately\n this.startInterval()\n this.log('Heartbeat resumed (page visible)')\n }\n }\n }\n\n document.addEventListener('visibilitychange', this.visibilityHandler)\n }\n\n /**\n * Log message if debug is enabled\n */\n private log(message: string, level: 'log' | 'warn' | 'error' = 'log'): void {\n if (!this.debug) return\n const prefix = '[CloudSignal PWA Heartbeat]'\n console[level](`${prefix} ${message}`)\n }\n}\n","/**\n * WakeLockManager - Screen Wake Lock API wrapper\n * Prevents device screen from dimming/locking when needed\n */\n\nimport type {\n WakeLockConfig,\n WakeLockState,\n WakeLockAcquiredEvent,\n WakeLockReleasedEvent,\n WakeLockErrorEvent,\n} from './types/wakelock'\n\nexport interface WakeLockManagerOptions {\n config?: WakeLockConfig\n debug?: boolean\n onAcquired?: (event: WakeLockAcquiredEvent) => void\n onReleased?: (event: WakeLockReleasedEvent) => void\n onError?: (event: WakeLockErrorEvent) => void\n}\n\n/**\n * WakeLockManager provides a simple API for the Screen Wake Lock API\n * with automatic reacquisition when the page becomes visible again\n */\nexport class WakeLockManager {\n private wakeLock: WakeLockSentinel | null = null\n private config: Required<WakeLockConfig>\n private debug: boolean\n private visibilityHandler: (() => void) | null = null\n private releaseHandler: (() => void) | null = null\n private shouldReacquire: boolean = false\n\n private onAcquired?: (event: WakeLockAcquiredEvent) => void\n private onReleased?: (event: WakeLockReleasedEvent) => void\n private onError?: (event: WakeLockErrorEvent) => void\n\n constructor(options: WakeLockManagerOptions = {}) {\n this.debug = options.debug ?? false\n this.onAcquired = options.onAcquired\n this.onReleased = options.onReleased\n this.onError = options.onError\n\n this.config = {\n enabled: options.config?.enabled ?? true,\n autoReacquire: options.config?.autoReacquire ?? true,\n }\n }\n\n /**\n * Check if Screen Wake Lock API is supported\n */\n isSupported(): boolean {\n return 'wakeLock' in navigator\n }\n\n /**\n * Get current wake lock state\n */\n getState(): WakeLockState {\n return {\n isActive: this.wakeLock !== null && !this.wakeLock.released,\n isSupported: this.isSupported(),\n type: 'screen',\n acquiredAt: this.wakeLock && !this.wakeLock.released ? Date.now() : undefined,\n }\n }\n\n /**\n * Acquire a screen wake lock\n * Prevents the screen from dimming or locking\n */\n async acquire(): Promise<boolean> {\n if (!this.config.enabled) {\n this.log('Wake lock is disabled')\n return false\n }\n\n if (!this.isSupported()) {\n this.log('Wake Lock API not supported')\n this.onError?.({\n timestamp: Date.now(),\n error: 'Wake Lock API not supported',\n errorName: 'NotSupportedError',\n })\n return false\n }\n\n // Already have an active lock\n if (this.wakeLock && !this.wakeLock.released) {\n this.log('Wake lock already active')\n return true\n }\n\n try {\n this.wakeLock = await navigator.wakeLock.request('screen')\n this.shouldReacquire = true\n\n // Set up release handler\n this.releaseHandler = () => {\n this.handleRelease('system')\n }\n this.wakeLock.addEventListener('release', this.releaseHandler)\n\n // Set up visibility change handler for auto-reacquire\n if (this.config.autoReacquire) {\n this.setupVisibilityHandler()\n }\n\n this.log('Wake lock acquired')\n this.onAcquired?.({ timestamp: Date.now() })\n\n return true\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n this.log(`Failed to acquire wake lock: ${err.message}`, 'error')\n this.onError?.({\n timestamp: Date.now(),\n error: err.message,\n errorName: err.name,\n })\n return false\n }\n }\n\n /**\n * Release the screen wake lock\n */\n async release(): Promise<void> {\n this.shouldReacquire = false\n\n if (!this.wakeLock) {\n return\n }\n\n try {\n // Remove the event listener before releasing to prevent double-firing\n if (this.releaseHandler) {\n this.wakeLock.removeEventListener('release', this.releaseHandler)\n this.releaseHandler = null\n }\n\n await this.wakeLock.release()\n this.wakeLock = null\n\n this.log('Wake lock released manually')\n this.onReleased?.({ timestamp: Date.now(), reason: 'manual' })\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n this.log(`Failed to release wake lock: ${err.message}`, 'error')\n }\n\n // Clean up visibility handler\n this.removeVisibilityHandler()\n }\n\n /**\n * Toggle wake lock on/off\n */\n async toggle(): Promise<boolean> {\n if (this.wakeLock && !this.wakeLock.released) {\n await this.release()\n return false\n } else {\n return this.acquire()\n }\n }\n\n /**\n * Check if wake lock is currently active\n */\n isActive(): boolean {\n return this.wakeLock !== null && !this.wakeLock.released\n }\n\n /**\n * Destroy the manager and release any held locks\n */\n async destroy(): Promise<void> {\n await this.release()\n this.removeVisibilityHandler()\n }\n\n // ============================================\n // Private methods\n // ============================================\n\n /**\n * Handle wake lock release (from system)\n */\n private handleRelease(reason: 'visibility' | 'system'): void {\n this.wakeLock = null\n this.log(`Wake lock released by ${reason}`)\n this.onReleased?.({ timestamp: Date.now(), reason })\n }\n\n /**\n * Set up visibility change handler for auto-reacquire\n */\n private setupVisibilityHandler(): void {\n if (this.visibilityHandler) {\n return\n }\n\n this.visibilityHandler = async () => {\n if (document.visibilityState === 'visible' && this.shouldReacquire) {\n // Page became visible, try to reacquire\n this.log('Page visible, attempting to reacquire wake lock')\n await this.acquire()\n } else if (document.visibilityState === 'hidden' && this.wakeLock) {\n // Page became hidden, the lock will be released automatically\n // We just need to track that we want to reacquire\n this.log('Page hidden, wake lock will be released')\n }\n }\n\n document.addEventListener('visibilitychange', this.visibilityHandler)\n }\n\n /**\n * Remove visibility change handler\n */\n private removeVisibilityHandler(): void {\n if (this.visibilityHandler) {\n document.removeEventListener('visibilitychange', this.visibilityHandler)\n this.visibilityHandler = null\n }\n }\n\n /**\n * Log message if debug is enabled\n */\n private log(message: string, level: 'log' | 'warn' | 'error' = 'log'): void {\n if (!this.debug && level === 'log') return\n const prefix = '[CloudSignal PWA WakeLock]'\n console[level](`${prefix} ${message}`)\n }\n}\n\n// WakeLock types are now available in lib.dom.d.ts (TypeScript 4.4+)\n// If you're using an older version, you may need to add these declarations\n","/**\n * OfflineQueueManager - Queue and retry failed requests when offline\n * Uses IndexedDB for persistence across sessions\n */\n\nimport type {\n QueuedRequest,\n QueuedRequestType,\n OfflineQueueConfig,\n QueueProcessResult,\n OfflineQueueStats,\n} from './types/offline'\n\nconst DB_NAME = 'CloudSignalPWA'\nconst DB_VERSION = 2\nconst STORE_NAME = 'offlineQueue'\n\nexport interface OfflineQueueManagerOptions {\n config?: OfflineQueueConfig\n debug?: boolean\n onRequestQueued?: (request: QueuedRequest) => void\n onRequestProcessed?: (result: QueueProcessResult) => void\n onQueueEmpty?: () => void\n onError?: (error: Error) => void\n}\n\n/**\n * OfflineQueueManager handles queuing failed requests and retrying them\n * when the network connection is restored\n */\nexport class OfflineQueueManager {\n private db: IDBDatabase | null = null\n private config: Required<OfflineQueueConfig>\n private debug: boolean\n private isProcessing: boolean = false\n private onlineHandler: (() => void) | null = null\n\n private onRequestQueued?: (request: QueuedRequest) => void\n private onRequestProcessed?: (result: QueueProcessResult) => void\n private onQueueEmpty?: () => void\n private onError?: (error: Error) => void\n\n constructor(options: OfflineQueueManagerOptions = {}) {\n this.debug = options.debug ?? false\n this.onRequestQueued = options.onRequestQueued\n this.onRequestProcessed = options.onRequestProcessed\n this.onQueueEmpty = options.onQueueEmpty\n this.onError = options.onError\n\n this.config = {\n enabled: options.config?.enabled ?? true,\n maxQueueSize: options.config?.maxQueueSize ?? 100,\n maxAge: options.config?.maxAge ?? 24 * 60 * 60 * 1000, // 24 hours\n baseRetryDelay: options.config?.baseRetryDelay ?? 1000,\n maxRetryDelay: options.config?.maxRetryDelay ?? 60000,\n defaultMaxRetries: options.config?.defaultMaxRetries ?? 5,\n processOnOnline: options.config?.processOnOnline ?? true,\n }\n }\n\n /**\n * Initialize the offline queue manager\n */\n async initialize(): Promise<void> {\n if (!this.config.enabled) {\n this.log('Offline queue is disabled')\n return\n }\n\n try {\n await this.openDatabase()\n\n // Set up online listener\n if (this.config.processOnOnline) {\n this.onlineHandler = () => {\n this.log('Network online, processing queue')\n this.processQueue()\n }\n window.addEventListener('online', this.onlineHandler)\n }\n\n // Clean up old requests\n await this.cleanupOldRequests()\n\n this.log('Offline queue manager initialized')\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n this.log(`Failed to initialize: ${err.message}`, 'error')\n this.onError?.(err)\n }\n }\n\n /**\n * Destroy the manager and clean up listeners\n */\n destroy(): void {\n if (this.onlineHandler) {\n window.removeEventListener('online', this.onlineHandler)\n this.onlineHandler = null\n }\n\n if (this.db) {\n this.db.close()\n this.db = null\n }\n }\n\n /**\n * Add a request to the queue\n */\n async queueRequest(\n url: string,\n method: QueuedRequest['method'],\n options: {\n headers?: Record<string, string>\n body?: string\n requestType?: QueuedRequestType\n priority?: number\n maxRetries?: number\n metadata?: Record<string, any>\n } = {}\n ): Promise<number | null> {\n if (!this.config.enabled || !this.db) {\n return null\n }\n\n try {\n // Check queue size\n const stats = await this.getStats()\n if (stats.totalQueued >= this.config.maxQueueSize) {\n this.log('Queue is full, removing oldest request')\n await this.removeOldestRequest()\n }\n\n const request: QueuedRequest = {\n url,\n method,\n headers: options.headers,\n body: options.body,\n queuedAt: Date.now(),\n retryCount: 0,\n maxRetries: options.maxRetries ?? this.config.defaultMaxRetries,\n requestType: options.requestType ?? 'custom',\n priority: options.priority ?? 0,\n metadata: options.metadata,\n }\n\n const id = await this.addToStore(request)\n request.id = id\n\n this.log(`Queued request: ${method} ${url} (id: ${id})`)\n this.onRequestQueued?.(request)\n\n return id\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n this.log(`Failed to queue request: ${err.message}`, 'error')\n this.onError?.(err)\n return null\n }\n }\n\n /**\n * Process all queued requests\n */\n async processQueue(): Promise<QueueProcessResult[]> {\n if (!this.config.enabled || !this.db || this.isProcessing) {\n return []\n }\n\n if (!navigator.onLine) {\n this.log('Offline, skipping queue processing')\n return []\n }\n\n this.isProcessing = true\n const results: QueueProcessResult[] = []\n\n try {\n const requests = await this.getAllRequests()\n\n // Sort by priority (higher first), then by queuedAt (older first)\n requests.sort((a, b) => {\n if (a.priority !== b.priority) {\n return b.priority - a.priority\n }\n return a.queuedAt - b.queuedAt\n })\n\n this.log(`Processing ${requests.length} queued requests`)\n\n for (const request of requests) {\n if (!navigator.onLine) {\n this.log('Went offline during processing, stopping')\n break\n }\n\n const result = await this.processRequest(request)\n results.push(result)\n\n if (result.success || !result.shouldRetry) {\n await this.removeFromStore(request.id!)\n } else {\n await this.updateRetryCount(request)\n }\n\n this.onRequestProcessed?.(result)\n\n // Small delay between requests\n await this.delay(100)\n }\n\n const remainingCount = await this.getQueueCount()\n if (remainingCount === 0) {\n this.onQueueEmpty?.()\n }\n\n this.log(`Processed ${results.length} requests, ${remainingCount} remaining`)\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n this.log(`Error processing queue: ${err.message}`, 'error')\n this.onError?.(err)\n } finally {\n this.isProcessing = false\n }\n\n return results\n }\n\n /**\n * Process a single queued request\n */\n private async processRequest(request: QueuedRequest): Promise<QueueProcessResult> {\n const result: QueueProcessResult = {\n id: request.id!,\n success: false,\n shouldRetry: false,\n }\n\n try {\n const response = await fetch(request.url, {\n method: request.method,\n headers: request.headers,\n body: request.body,\n })\n\n result.statusCode = response.status\n result.success = response.ok\n\n if (!response.ok) {\n // Determine if we should retry based on status code\n result.shouldRetry = this.shouldRetryStatus(response.status, request)\n result.error = `HTTP ${response.status}`\n }\n\n this.log(`Request ${request.id}: ${result.success ? 'success' : 'failed'} (${response.status})`)\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n result.error = err.message\n result.shouldRetry = request.retryCount < request.maxRetries\n\n this.log(`Request ${request.id} failed: ${err.message}`, 'error')\n }\n\n return result\n }\n\n /**\n * Determine if a request should be retried based on status code\n */\n private shouldRetryStatus(status: number, request: QueuedRequest): boolean {\n if (request.retryCount >= request.maxRetries) {\n return false\n }\n\n // Retry on server errors and some client errors\n if (status >= 500) return true\n if (status === 408) return true // Request Timeout\n if (status === 429) return true // Too Many Requests\n if (status === 0) return true // Network error\n\n return false\n }\n\n /**\n * Update retry count and schedule next retry\n */\n private async updateRetryCount(request: QueuedRequest): Promise<void> {\n request.retryCount++\n\n const transaction = this.db!.transaction([STORE_NAME], 'readwrite')\n const store = transaction.objectStore(STORE_NAME)\n await this.promisifyRequest(store.put(request))\n }\n\n /**\n * Get queue statistics\n */\n async getStats(): Promise<OfflineQueueStats> {\n const stats: OfflineQueueStats = {\n totalQueued: 0,\n byType: {\n registration: 0,\n heartbeat: 0,\n analytics: 0,\n preferences: 0,\n unregister: 0,\n custom: 0,\n },\n }\n\n if (!this.db) {\n return stats\n }\n\n try {\n const requests = await this.getAllRequests()\n stats.totalQueued = requests.length\n\n for (const request of requests) {\n stats.byType[request.requestType]++\n\n if (!stats.oldestRequest || request.queuedAt < stats.oldestRequest) {\n stats.oldestRequest = request.queuedAt\n }\n if (!stats.newestRequest || request.queuedAt > stats.newestRequest) {\n stats.newestRequest = request.queuedAt\n }\n }\n } catch (error) {\n this.log(`Failed to get stats: ${error}`, 'error')\n }\n\n return stats\n }\n\n /**\n * Clear all queued requests\n */\n async clearQueue(): Promise<void> {\n if (!this.db) return\n\n const transaction = this.db.transaction([STORE_NAME], 'readwrite')\n const store = transaction.objectStore(STORE_NAME)\n await this.promisifyRequest(store.clear())\n\n this.log('Queue cleared')\n }\n\n /**\n * Check if queue has pending requests\n */\n async hasPendingRequests(): Promise<boolean> {\n const count = await this.getQueueCount()\n return count > 0\n }\n\n /**\n * Get number of queued requests\n */\n async getQueueCount(): Promise<number> {\n if (!this.db) return 0\n\n const transaction = this.db.transaction([STORE_NAME], 'readonly')\n const store = transaction.objectStore(STORE_NAME)\n return this.promisifyRequest(store.count())\n }\n\n // ============================================\n // Private IndexedDB methods\n // ============================================\n\n private async openDatabase(): Promise<void> {\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(DB_NAME, DB_VERSION)\n\n request.onerror = () => reject(request.error)\n request.onsuccess = () => {\n this.db = request.result\n resolve()\n }\n\n request.onupgradeneeded = (event) => {\n const db = (event.target as IDBOpenDBRequest).result\n\n // Create offline queue store if it doesn't exist\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n const store = db.createObjectStore(STORE_NAME, {\n keyPath: 'id',\n autoIncrement: true,\n })\n store.createIndex('queuedAt', 'queuedAt', { unique: false })\n store.createIndex('requestType', 'requestType', { unique: false })\n store.createIndex('priority', 'priority', { unique: false })\n }\n\n // Keep existing stores from service worker\n if (!db.objectStoreNames.contains('badge')) {\n db.createObjectStore('badge')\n }\n if (!db.objectStoreNames.contains('notifications')) {\n const notificationStore = db.createObjectStore('notifications', {\n keyPath: 'id',\n autoIncrement: true,\n })\n notificationStore.createIndex('timestamp', 'timestamp', { unique: false })\n notificationStore.createIndex('read', 'read', { unique: false })\n }\n if (!db.objectStoreNames.contains('userPreferences')) {\n db.createObjectStore('userPreferences')\n }\n if (!db.objectStoreNames.contains('syncQueue')) {\n const syncStore = db.createObjectStore('syncQueue', {\n keyPath: 'id',\n autoIncrement: true,\n })\n syncStore.createIndex('timestamp', 'timestamp', { unique: false })\n }\n }\n })\n }\n\n private async addToStore(request: QueuedRequest): Promise<number> {\n const transaction = this.db!.transaction([STORE_NAME], 'readwrite')\n const store = transaction.objectStore(STORE_NAME)\n return this.promisifyRequest(store.add(request)) as Promise<number>\n }\n\n private async removeFromStore(id: number): Promise<void> {\n const transaction = this.db!.transaction([STORE_NAME], 'readwrite')\n const store = transaction.objectStore(STORE_NAME)\n await this.promisifyRequest(store.delete(id))\n }\n\n private async getAllRequests(): Promise<QueuedRequest[]> {\n const transaction = this.db!.transaction([STORE_NAME], 'readonly')\n const store = transaction.objectStore(STORE_NAME)\n return this.promisifyRequest(store.getAll())\n }\n\n private async removeOldestRequest(): Promise<void> {\n const transaction = this.db!.transaction([STORE_NAME], 'readwrite')\n const store = transaction.objectStore(STORE_NAME)\n const index = store.index('queuedAt')\n\n const cursor = index.openCursor()\n return new Promise((resolve, reject) => {\n cursor.onsuccess = (event) => {\n const result = (event.target as IDBRequest).result\n if (result) {\n store.delete(result.primaryKey)\n resolve()\n } else {\n resolve()\n }\n }\n cursor.onerror = () => reject(cursor.error)\n })\n }\n\n private async cleanupOldRequests(): Promise<void> {\n const cutoffTime = Date.now() - this.config.maxAge\n\n const transaction = this.db!.transaction([STORE_NAME], 'readwrite')\n const store = transaction.objectStore(STORE_NAME)\n const index = store.index('queuedAt')\n\n const range = IDBKeyRange.upperBound(cutoffTime)\n const cursor = index.openCursor(range)\n\n let deletedCount = 0\n\n return new Promise((resolve) => {\n cursor.onsuccess = (event) => {\n const result = (event.target as IDBRequest).result\n if (result) {\n store.delete(result.primaryKey)\n deletedCount++\n result.continue()\n } else {\n if (deletedCount > 0) {\n this.log(`Cleaned up ${deletedCount} old requests`)\n }\n resolve()\n }\n }\n cursor.onerror = () => resolve()\n })\n }\n\n private promisifyRequest<T>(request: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n request.onsuccess = () => resolve(request.result)\n request.onerror = () => reject(request.error)\n })\n }\n\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n }\n\n private log(message: string, level: 'log' | 'warn' | 'error' = 'log'): void {\n if (!this.debug && level === 'log') return\n const prefix = '[CloudSignal PWA OfflineQueue]'\n console[level](`${prefix} ${message}`)\n }\n}\n","/**\n * IOSInstallBanner Internationalization (i18n)\n * Language translations for iOS install instructions\n */\n\n/**\n * Supported language codes\n */\nexport type IOSBannerLanguage =\n | 'en' | 'es' | 'fr' | 'de' | 'it' | 'pt' | 'nl'\n | 'ru' | 'zh' | 'ja' | 'ko' | 'ar' | 'he' | 'hi'\n | 'tr' | 'pl' | 'sv' | 'da' | 'no' | 'fi'\n\n/**\n * Language strings interface\n */\nexport interface IOSBannerStrings {\n title: string\n description: string\n buttonText: string\n closeText: string\n step1: string\n step2: string\n step3: string\n shareIconHint: string\n shareIconDescription: string\n}\n\n/**\n * Built-in language translations (20 languages)\n */\nexport const IOS_BANNER_TRANSLATIONS: Record<IOSBannerLanguage, IOSBannerStrings> = {\n en: {\n title: 'Install this app',\n description: 'Add this app to your home screen for the best experience.',\n buttonText: 'Show me how',\n closeText: 'Not now',\n step1: 'Tap the Share button at the bottom of Safari',\n step2: 'Scroll down and tap \"Add to Home Screen\"',\n step3: 'Tap \"Add\" in the top right corner',\n shareIconHint: 'Look for the Share icon',\n shareIconDescription: \"It's the square with an arrow pointing up\",\n },\n es: {\n title: 'Instalar esta aplicación',\n description: 'Añade esta aplicación a tu pantalla de inicio para una mejor experiencia.',\n buttonText: 'Mostrar cómo',\n closeText: 'Ahora no',\n step1: 'Toca el botón Compartir en la parte inferior de Safari',\n step2: 'Desplázate hacia abajo y toca \"Añadir a pantalla de inicio\"',\n step3: 'Toca \"Añadir\" en la esquina superior derecha',\n shareIconHint: 'Busca el icono de Compartir',\n shareIconDescription: 'Es el cuadrado con una flecha apuntando hacia arriba',\n },\n fr: {\n title: 'Installer cette application',\n description: \"Ajoutez cette application à votre écran d'accueil pour une meilleure expérience.\",\n buttonText: 'Montrez-moi comment',\n closeText: 'Pas maintenant',\n step1: 'Appuyez sur le bouton Partager en bas de Safari',\n step2: 'Faites défiler vers le bas et appuyez sur \"Sur l\\'écran d\\'accueil\"',\n step3: 'Appuyez sur \"Ajouter\" dans le coin supérieur droit',\n shareIconHint: \"Recherchez l'icône Partager\",\n shareIconDescription: \"C'est le carré avec une flèche pointant vers le haut\",\n },\n de: {\n title: 'Diese App installieren',\n description: 'Fügen Sie diese App zu Ihrem Startbildschirm hinzu für das beste Erlebnis.',\n buttonText: 'Zeig mir wie',\n closeText: 'Nicht jetzt',\n step1: 'Tippen Sie auf die Teilen-Schaltfläche unten in Safari',\n step2: 'Scrollen Sie nach unten und tippen Sie auf \"Zum Home-Bildschirm\"',\n step3: 'Tippen Sie oben rechts auf \"Hinzufügen\"',\n shareIconHint: 'Suchen Sie das Teilen-Symbol',\n shareIconDescription: 'Es ist das Quadrat mit einem Pfeil nach oben',\n },\n it: {\n title: 'Installa questa app',\n description: \"Aggiungi questa app alla schermata Home per un'esperienza migliore.\",\n buttonText: 'Mostrami come',\n closeText: 'Non ora',\n step1: 'Tocca il pulsante Condividi nella parte inferiore di Safari',\n step2: 'Scorri verso il basso e tocca \"Aggiungi a Home\"',\n step3: \"Tocca \\\"Aggiungi\\\" nell'angolo in alto a destra\",\n shareIconHint: \"Cerca l'icona Condividi\",\n shareIconDescription: \"È il quadrato con una freccia che punta verso l'alto\",\n },\n pt: {\n title: 'Instalar este aplicativo',\n description: 'Adicione este aplicativo à tela inicial para a melhor experiência.',\n buttonText: 'Mostre-me como',\n closeText: 'Agora não',\n step1: 'Toque no botão Compartilhar na parte inferior do Safari',\n step2: 'Role para baixo e toque em \"Adicionar à Tela de Início\"',\n step3: 'Toque em \"Adicionar\" no canto superior direito',\n shareIconHint: 'Procure o ícone Compartilhar',\n shareIconDescription: 'É o quadrado com uma seta apontando para cima',\n },\n nl: {\n title: 'Installeer deze app',\n description: 'Voeg deze app toe aan je beginscherm voor de beste ervaring.',\n buttonText: 'Laat me zien hoe',\n closeText: 'Niet nu',\n step1: 'Tik op de Deel-knop onderaan Safari',\n step2: 'Scroll naar beneden en tik op \"Zet op beginscherm\"',\n step3: 'Tik rechtsboven op \"Voeg toe\"',\n shareIconHint: 'Zoek het Deel-icoon',\n shareIconDescription: 'Het is het vierkant met een pijl omhoog',\n },\n ru: {\n title: 'Установить приложение',\n description: 'Добавьте это приложение на главный экран для лучшего опыта.',\n buttonText: 'Покажите как',\n closeText: 'Не сейчас',\n step1: 'Нажмите кнопку \"Поделиться\" внизу Safari',\n step2: 'Прокрутите вниз и нажмите \"На экран Домой\"',\n step3: 'Нажмите \"Добавить\" в правом верхнем углу',\n shareIconHint: 'Найдите значок \"Поделиться\"',\n shareIconDescription: 'Это квадрат со стрелкой вверх',\n },\n zh: {\n title: '安装此应用',\n description: '将此应用添加到主屏幕以获得最佳体验。',\n buttonText: '显示方法',\n closeText: '暂时不要',\n step1: '点击Safari底部的分享按钮',\n step2: '向下滚动并点击\"添加到主屏幕\"',\n step3: '点击右上角的\"添加\"',\n shareIconHint: '找到分享图标',\n shareIconDescription: '是一个带有向上箭头的方框',\n },\n ja: {\n title: 'このアプリをインストール',\n description: 'ホーム画面に追加して最高の体験を。',\n buttonText: '方法を見る',\n closeText: '今はしない',\n step1: 'Safariの下部にある共有ボタンをタップ',\n step2: '下にスクロールして「ホーム画面に追加」をタップ',\n step3: '右上の「追加」をタップ',\n shareIconHint: '共有アイコンを探してください',\n shareIconDescription: '上向き矢印のある四角形です',\n },\n ko: {\n title: '이 앱 설치',\n description: '최고의 경験을 위해 홈 화면에 추가하세요.',\n buttonText: '방법 보기',\n closeText: '나중에',\n step1: 'Safari 하단의 공유 버튼을 탭하세요',\n step2: '아래로 스크롤하여 \"홈 화면에 추가\"를 탭하세요',\n step3: '오른쪽 상단의 \"추가\"를 탭하세요',\n shareIconHint: '공유 아이콘을 찾으세요',\n shareIconDescription: '위쪽 화살표가 있는 사각형입니다',\n },\n ar: {\n title: 'تثبيت هذا التطبيق',\n description: 'أضف هذا التطبيق إلى الشاشة الرئيسية للحصول على أفضل تجربة.',\n buttonText: 'أرني كيف',\n closeText: 'ليس الآن',\n step1: 'اضغط على زر المشاركة في أسفل Safari',\n step2: 'مرر لأسفل واضغط على \"إضافة إلى الشاشة الرئيسية\"',\n step3: 'اضغط على \"إضافة\" في الزاوية العلوية اليمنى',\n shareIconHint: 'ابحث عن أيقونة المشاركة',\n shareIconDescription: 'هو مربع مع سهم يشير لأعلى',\n },\n he: {\n title: 'התקן אפליקציה זו',\n description: 'הוסף אפליקציה זו למסך הבית לחוויה הטובה ביותר.',\n buttonText: 'הראה לי איך',\n closeText: 'לא עכשיו',\n step1: 'הקש על כפתור השיתוף בתחתית Safari',\n step2: 'גלול למטה והקש על \"הוסף למסך הבית\"',\n step3: 'הקש על \"הוסף\" בפינה הימנית העליונה',\n shareIconHint: 'חפש את סמל השיתוף',\n shareIconDescription: 'זה ריבוע עם חץ מצביע למעלה',\n },\n hi: {\n title: 'यह ऐप इंस्टॉल करें',\n description: 'बेहतर अनुभव के लिए इस ऐप को होम स्क्रीन पर जोड़ें।',\n buttonText: 'मुझे दिखाओ कैसे',\n closeText: 'अभी नहीं',\n step1: 'Safari के नीचे शेयर बटन पर टैप करें',\n step2: 'नीचे स्क्रॉल करें और \"होम स्क्रीन में जोड़ें\" पर टैप करें',\n step3: 'ऊपर दाएं कोने में \"जोड़ें\" पर टैप करें',\n shareIconHint: 'शेयर आइकन खोजें',\n shareIconDescription: 'यह ऊपर की ओर तीर वाला वर्ग है',\n },\n tr: {\n title: 'Bu uygulamayı yükle',\n description: 'En iyi deneyim için bu uygulamayı ana ekranınıza ekleyin.',\n buttonText: 'Nasıl yapılır göster',\n closeText: 'Şimdi değil',\n step1: \"Safari'nin altındaki Paylaş düğmesine dokunun\",\n step2: 'Aşağı kaydırın ve \"Ana Ekrana Ekle\"ye dokunun',\n step3: 'Sağ üst köşedeki \"Ekle\"ye dokunun',\n shareIconHint: 'Paylaş simgesini arayın',\n shareIconDescription: 'Yukarı bakan oklu bir karedir',\n },\n pl: {\n title: 'Zainstaluj tę aplikację',\n description: 'Dodaj tę aplikację do ekranu głównego, aby uzyskać najlepsze wrażenia.',\n buttonText: 'Pokaż mi jak',\n closeText: 'Nie teraz',\n step1: 'Dotknij przycisku Udostępnij na dole Safari',\n step2: 'Przewiń w dół i dotknij \"Dodaj do ekranu początkowego\"',\n step3: 'Dotknij \"Dodaj\" w prawym górnym rogu',\n shareIconHint: 'Poszukaj ikony Udostępnij',\n shareIconDescription: 'To kwadrat ze strzałką skierowaną w górę',\n },\n sv: {\n title: 'Installera denna app',\n description: 'Lägg till denna app på hemskärmen för bästa upplevelse.',\n buttonText: 'Visa mig hur',\n closeText: 'Inte nu',\n step1: 'Tryck på Dela-knappen längst ner i Safari',\n step2: 'Scrolla ner och tryck på \"Lägg till på hemskärmen\"',\n step3: 'Tryck på \"Lägg till\" i övre högra hörnet',\n shareIconHint: 'Leta efter Dela-ikonen',\n shareIconDescription: 'Det är kvadraten med en pil som pekar uppåt',\n },\n da: {\n title: 'Installer denne app',\n description: 'Føj denne app til din startskærm for den bedste oplevelse.',\n buttonText: 'Vis mig hvordan',\n closeText: 'Ikke nu',\n step1: 'Tryk på Del-knappen nederst i Safari',\n step2: 'Rul ned og tryk på \"Føj til hjemmeskærm\"',\n step3: 'Tryk på \"Tilføj\" i øverste højre hjørne',\n shareIconHint: 'Kig efter Del-ikonet',\n shareIconDescription: 'Det er firkanten med en pil, der peger opad',\n },\n no: {\n title: 'Installer denne appen',\n description: 'Legg til denne appen på startskjermen for best opplevelse.',\n buttonText: 'Vis meg hvordan',\n closeText: 'Ikke nå',\n step1: 'Trykk på Del-knappen nederst i Safari',\n step2: 'Rull ned og trykk på \"Legg til på Hjem-skjerm\"',\n step3: 'Trykk på \"Legg til\" øverst til høyre',\n shareIconHint: 'Se etter Del-ikonet',\n shareIconDescription: 'Det er firkanten med en pil som peker oppover',\n },\n fi: {\n title: 'Asenna tämä sovellus',\n description: 'Lisää tämä sovellus aloitusnäytölle parhaan kokemuksen saamiseksi.',\n buttonText: 'Näytä miten',\n closeText: 'Ei nyt',\n step1: 'Napauta Jaa-painiketta Safarin alareunassa',\n step2: 'Vieritä alas ja napauta \"Lisää Koti-valikkoon\"',\n step3: 'Napauta \"Lisää\" oikeassa yläkulmassa',\n shareIconHint: 'Etsi Jaa-kuvake',\n shareIconDescription: 'Se on neliö, jossa on ylöspäin osoittava nuoli',\n },\n}\n\n/**\n * Detect browser language and map to supported language\n */\nexport function detectBrowserLanguage(): IOSBannerLanguage {\n const browserLang = navigator.language?.toLowerCase() || 'en'\n \n // Direct match (e.g., 'en', 'fr', 'de')\n const shortLang = browserLang.split('-')[0] as IOSBannerLanguage\n if (shortLang in IOS_BANNER_TRANSLATIONS) {\n return shortLang\n }\n\n // Special cases for regional variants\n if (browserLang.startsWith('zh')) return 'zh'\n if (browserLang.startsWith('pt')) return 'pt'\n if (browserLang.startsWith('no') || browserLang.startsWith('nb') || browserLang.startsWith('nn')) return 'no'\n\n return 'en'\n}\n","/**\n * IOSInstallBanner - Styled iOS Safari install instructions banner\n * Shows users how to add the PWA to their home screen on iOS\n * Supports 20 languages with auto-detection\n */\n\nimport type {\n IOSInstallBannerConfig,\n IOSInstallBannerStyles,\n IOSInstallBannerState,\n} from './types/wakelock'\nimport {\n type IOSBannerLanguage,\n type IOSBannerStrings,\n IOS_BANNER_TRANSLATIONS,\n detectBrowserLanguage,\n} from './IOSInstallBannerI18n'\n\nconst STORAGE_KEY = 'cloudsignal_pwa_ios_banner_dismissed'\nconst BANNER_ID = 'cloudsignal-ios-install-banner'\n\nexport interface IOSInstallBannerOptions {\n config?: IOSInstallBannerConfig\n /** Language code (e.g., 'en', 'es', 'fr') - auto-detected if not provided */\n language?: IOSBannerLanguage\n /** Custom strings to override built-in translations */\n customStrings?: Partial<IOSBannerStrings>\n debug?: boolean\n onShow?: () => void\n onDismiss?: () => void\n onInstallClick?: () => void\n}\n\n/**\n * Default styles for the iOS install banner\n */\nconst DEFAULT_STYLES: IOSInstallBannerStyles = {\n backgroundColor: '#ffffff',\n textColor: '#1a1a1a',\n buttonBackgroundColor: '#007AFF',\n buttonTextColor: '#ffffff',\n borderRadius: '16px',\n boxShadow: '0 4px 24px rgba(0, 0, 0, 0.15)',\n}\n\n/**\n * IOSInstallBanner displays a styled modal/banner with instructions\n * for iOS Safari users to add the PWA to their home screen\n */\n// IOSInstallBannerConfig with optional iconUrl for internal use\ntype IOSInstallBannerConfigInternal = Omit<Required<IOSInstallBannerConfig>, 'iconUrl'> & { iconUrl?: string }\n\nexport class IOSInstallBanner {\n private config: IOSInstallBannerConfigInternal\n private styles: IOSInstallBannerStyles\n private strings: IOSBannerStrings\n private language: IOSBannerLanguage\n private debug: boolean\n private bannerElement: HTMLElement | null = null\n private overlayElement: HTMLElement | null = null\n\n private onShow?: () => void\n private onDismiss?: () => void\n private onInstallClick?: () => void\n\n constructor(options: IOSInstallBannerOptions = {}) {\n this.debug = options.debug ?? false\n this.onShow = options.onShow\n this.onDismiss = options.onDismiss\n this.onInstallClick = options.onInstallClick\n\n // Detect or use provided language\n this.language = options.language ?? detectBrowserLanguage()\n const baseStrings = IOS_BANNER_TRANSLATIONS[this.language]\n\n // Merge custom strings with base translations\n this.strings = {\n ...baseStrings,\n ...options.customStrings,\n }\n\n this.config = {\n enabled: options.config?.enabled ?? true,\n title: options.config?.title ?? this.strings.title,\n description: options.config?.description ?? this.strings.description,\n buttonText: options.config?.buttonText ?? this.strings.buttonText,\n closeText: options.config?.closeText ?? this.strings.closeText,\n iconUrl: options.config?.iconUrl,\n customStyles: options.config?.customStyles ?? {},\n showDelay: options.config?.showDelay ?? 3000,\n dismissalDays: options.config?.dismissalDays ?? 7,\n position: options.config?.position ?? 'bottom',\n }\n\n this.styles = { ...DEFAULT_STYLES, ...this.config.customStyles }\n this.log(`Initialized with language: ${this.language}`)\n }\n\n /**\n * Get current language\n */\n getLanguage(): IOSBannerLanguage {\n return this.language\n }\n\n /**\n * Get current strings\n */\n getStrings(): IOSBannerStrings {\n return this.strings\n }\n\n /**\n * Set language and update strings\n */\n setLanguage(language: IOSBannerLanguage): void {\n this.language = language\n const baseStrings = IOS_BANNER_TRANSLATIONS[language]\n this.strings = { ...baseStrings }\n\n // Update config strings\n this.config.title = this.strings.title\n this.config.description = this.strings.description\n this.config.buttonText = this.strings.buttonText\n this.config.closeText = this.strings.closeText\n\n this.log(`Language changed to: ${language}`)\n }\n\n /**\n * Get current banner state\n */\n getState(): IOSInstallBannerState {\n return {\n isVisible: this.bannerElement !== null,\n wasDismissed: this.wasDismissed(),\n isEligible: this.isEligible(),\n isInstalled: this.isInstalled(),\n }\n }\n\n /**\n * Check if device is iOS Safari (eligible for banner)\n */\n isEligible(): boolean {\n const userAgent = navigator.userAgent\n \n // Check if iOS\n const isIOS = /iPad|iPhone|iPod/.test(userAgent) && !(window as any).MSStream\n if (!isIOS) return false\n\n // Check if Safari (not Chrome, Firefox, etc.)\n const isSafari = /Safari/i.test(userAgent) && !/Chrome|CriOS|FxiOS|EdgiOS/i.test(userAgent)\n if (!isSafari) return false\n\n // Check if already installed (standalone mode)\n if (this.isInstalled()) return false\n\n return true\n }\n\n /**\n * Check if PWA is already installed (running in standalone mode)\n */\n isInstalled(): boolean {\n // iOS standalone mode check\n if ((navigator as any).standalone === true) return true\n\n // Media query check\n if (window.matchMedia('(display-mode: standalone)').matches) return true\n\n return false\n }\n\n /**\n * Check if banner was previously dismissed\n */\n wasDismissed(): boolean {\n try {\n const dismissed = localStorage.getItem(STORAGE_KEY)\n if (!dismissed) return false\n\n const dismissedTime = parseInt(dismissed, 10)\n const daysSinceDismissal = (Date.now() - dismissedTime) / (1000 * 60 * 60 * 24)\n\n // If dismissal period has passed, clear it and allow showing again\n if (daysSinceDismissal > this.config.dismissalDays) {\n localStorage.removeItem(STORAGE_KEY)\n return false\n }\n\n return true\n } catch {\n return false\n }\n }\n\n /**\n * Show the install banner if eligible\n */\n async show(): Promise<boolean> {\n if (!this.config.enabled) {\n this.log('Banner is disabled')\n return false\n }\n\n if (!this.isEligible()) {\n this.log('Device not eligible for iOS install banner')\n return false\n }\n\n if (this.wasDismissed()) {\n this.log('Banner was dismissed recently')\n return false\n }\n\n if (this.bannerElement) {\n this.log('Banner already visible')\n return true\n }\n\n // Delay before showing\n if (this.config.showDelay > 0) {\n await new Promise((resolve) => setTimeout(resolve, this.config.showDelay))\n }\n\n // Double-check eligibility after delay\n if (!this.isEligible() || this.wasDismissed()) {\n return false\n }\n\n this.createBanner()\n this.log('Banner shown')\n this.onShow?.()\n\n return true\n }\n\n /**\n * Hide the install banner\n */\n hide(): void {\n if (this.bannerElement) {\n this.bannerElement.remove()\n this.bannerElement = null\n }\n if (this.overlayElement) {\n this.overlayElement.remove()\n this.overlayElement = null\n }\n }\n\n /**\n * Dismiss the banner and remember the dismissal\n */\n dismiss(): void {\n this.hide()\n\n try {\n localStorage.setItem(STORAGE_KEY, Date.now().toString())\n } catch {\n // localStorage not available\n }\n\n this.log('Banner dismissed')\n this.onDismiss?.()\n }\n\n /**\n * Reset dismissal state (for testing or after significant time)\n */\n resetDismissal(): void {\n try {\n localStorage.removeItem(STORAGE_KEY)\n } catch {\n // localStorage not available\n }\n }\n\n /**\n * Get iOS install steps (localized)\n */\n getInstallSteps(): string[] {\n return [\n this.strings.step1,\n this.strings.step2,\n this.strings.step3,\n ]\n }\n\n // ============================================\n // Private methods\n // ============================================\n\n /**\n * Create and inject the banner element\n */\n private createBanner(): void {\n // Create overlay\n this.overlayElement = document.createElement('div')\n this.overlayElement.id = `${BANNER_ID}-overlay`\n this.overlayElement.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n z-index: 999998;\n opacity: 0;\n transition: opacity 0.3s ease;\n `\n this.overlayElement.addEventListener('click', () => this.dismiss())\n document.body.appendChild(this.overlayElement)\n\n // Create banner\n this.bannerElement = document.createElement('div')\n this.bannerElement.id = BANNER_ID\n\n const positionStyles = this.config.position === 'top'\n ? 'top: 20px;'\n : 'bottom: 20px;'\n\n this.bannerElement.style.cssText = `\n position: fixed;\n ${positionStyles}\n left: 20px;\n right: 20px;\n max-width: 400px;\n margin: 0 auto;\n background: ${this.styles.backgroundColor};\n color: ${this.styles.textColor};\n border-radius: ${this.styles.borderRadius};\n box-shadow: ${this.styles.boxShadow};\n z-index: 999999;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;\n opacity: 0;\n transform: translateY(${this.config.position === 'top' ? '-20px' : '20px'});\n transition: opacity 0.3s ease, transform 0.3s ease;\n `\n\n const steps = this.getInstallSteps()\n const iconHtml = this.config.iconUrl\n ? `<img src=\"${this.config.iconUrl}\" alt=\"App icon\" style=\"width: 60px; height: 60px; border-radius: 12px; margin-right: 16px;\">`\n : ''\n\n this.bannerElement.innerHTML = `\n <div style=\"padding: 20px;\">\n <div style=\"display: flex; align-items: flex-start; margin-bottom: 16px;\">\n ${iconHtml}\n <div style=\"flex: 1;\">\n <h3 style=\"margin: 0 0 4px 0; font-size: 18px; font-weight: 600;\">${this.config.title}</h3>\n <p style=\"margin: 0; font-size: 14px; opacity: 0.7;\">${this.config.description}</p>\n </div>\n </div>\n \n <div id=\"${BANNER_ID}-steps\" style=\"display: none; margin-bottom: 16px;\">\n <ol style=\"margin: 0; padding-left: 24px; font-size: 14px; line-height: 1.6;\">\n ${steps.map((step) => `<li style=\"margin-bottom: 8px;\">${step}</li>`).join('')}\n </ol>\n <div style=\"margin-top: 16px; padding: 12px; background: rgba(0,122,255,0.1); border-radius: 8px; font-size: 13px;\">\n <strong style=\"display: flex; align-items: center; gap: 8px;\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M12 5v14M5 12l7-7 7 7\"/>\n </svg>\n ${this.strings.shareIconHint}\n </strong>\n <span style=\"display: block; margin-top: 4px; opacity: 0.7;\">${this.strings.shareIconDescription}</span>\n </div>\n </div>\n \n <div style=\"display: flex; gap: 12px;\">\n <button id=\"${BANNER_ID}-show\" style=\"\n flex: 1;\n padding: 12px 16px;\n background: ${this.styles.buttonBackgroundColor};\n color: ${this.styles.buttonTextColor};\n border: none;\n border-radius: 10px;\n font-size: 16px;\n font-weight: 600;\n cursor: pointer;\n -webkit-tap-highlight-color: transparent;\n \">${this.config.buttonText}</button>\n <button id=\"${BANNER_ID}-close\" style=\"\n padding: 12px 16px;\n background: transparent;\n color: ${this.styles.textColor};\n border: 1px solid rgba(0,0,0,0.1);\n border-radius: 10px;\n font-size: 16px;\n cursor: pointer;\n -webkit-tap-highlight-color: transparent;\n \">${this.config.closeText}</button>\n </div>\n </div>\n `\n\n document.body.appendChild(this.bannerElement)\n\n // Add event listeners\n const showButton = document.getElementById(`${BANNER_ID}-show`)\n const closeButton = document.getElementById(`${BANNER_ID}-close`)\n const stepsElement = document.getElementById(`${BANNER_ID}-steps`)\n\n showButton?.addEventListener('click', () => {\n if (stepsElement) {\n stepsElement.style.display = stepsElement.style.display === 'none' ? 'block' : 'none'\n showButton.textContent = stepsElement.style.display === 'none' \n ? this.config.buttonText \n : 'Got it!'\n }\n this.onInstallClick?.()\n })\n\n closeButton?.addEventListener('click', () => this.dismiss())\n\n // Animate in\n requestAnimationFrame(() => {\n if (this.overlayElement) {\n this.overlayElement.style.opacity = '1'\n }\n if (this.bannerElement) {\n this.bannerElement.style.opacity = '1'\n this.bannerElement.style.transform = 'translateY(0)'\n }\n })\n }\n\n /**\n * Log message if debug is enabled\n */\n private log(message: string, level: 'log' | 'warn' | 'error' = 'log'): void {\n if (!this.debug && level === 'log') return\n const prefix = '[CloudSignal PWA IOSBanner]'\n console[level](`${prefix} ${message}`)\n }\n}\n","/**\n * CloudSignalPWA - Main CloudSignal PWA SDK Entry Point\n * Integrates all managers for a unified PWA experience\n * \n * v1.1.0: Added WakeLock, OfflineQueue, iOS Install Banner, Network-aware Heartbeat\n * v1.2.0: Added JWT auth support for user-linked registrations\n */\n\nimport type {\n PWAConfig,\n PWAServiceConfig,\n InitializeResult,\n DeviceInfo,\n InstallationState,\n InstallResult,\n Registration,\n RegisterOptions,\n NotificationPreferences,\n RegistrationStatusResponse,\n PWAEvent,\n EventHandler,\n AuthMode,\n} from './types'\nimport type { WakeLockState, NetworkConnectionInfo, BatteryInfo } from './types/wakelock'\nimport type { OfflineQueueStats, QueueProcessResult } from './types/offline'\nimport { DeviceDetector } from './DeviceDetector'\nimport { ServiceWorkerManager } from './ServiceWorkerManager'\nimport { InstallationManager } from './InstallationManager'\nimport { PushNotificationManager } from './PushNotificationManager'\nimport { HeartbeatManager } from './HeartbeatManager'\nimport { WakeLockManager } from './WakeLockManager'\nimport { OfflineQueueManager } from './OfflineQueueManager'\nimport { IOSInstallBanner } from './IOSInstallBanner'\nimport { makeAuthenticatedRequest } from './utils/hmac'\nimport {\n type AuthContext,\n createAuthContext,\n makeAuthenticatedRequestWithContext,\n updateAuthToken,\n} from './utils/jwt-auth'\n\nconst DEFAULT_SERVICE_URL = 'https://pwa.cloudsignal.app'\nconst SDK_VERSION = '1.2.3'\n\n/**\n * CloudSignal PWA Client\n * Main class for PWA functionality including installation, push notifications, and device tracking\n */\nexport class CloudSignalPWA {\n private config: PWAConfig\n private serviceUrl: string\n private debug: boolean\n private initialized: boolean = false\n private serviceConfig: PWAServiceConfig | null = null\n private authContext: AuthContext\n\n // Core Managers\n private deviceDetector: DeviceDetector\n private serviceWorkerManager: ServiceWorkerManager\n private installationManager: InstallationManager\n private pushNotificationManager: PushNotificationManager\n private heartbeatManager: HeartbeatManager\n\n // v1.1.0 Managers\n private wakeLockManager: WakeLockManager | null = null\n private offlineQueueManager: OfflineQueueManager | null = null\n private iosInstallBanner: IOSInstallBanner | null = null\n\n // Event emitter\n private eventHandlers: Map<PWAEvent, Set<EventHandler>> = new Map()\n\n constructor(config: PWAConfig) {\n this.config = config\n this.serviceUrl = config.serviceUrl || DEFAULT_SERVICE_URL\n this.debug = config.debug ?? false\n\n // Validate auth configuration\n if (!config.organizationSecret && !config.userToken) {\n throw new Error('Either organizationSecret or userToken must be provided')\n }\n\n // Initialize auth context (supports both HMAC and JWT)\n this.authContext = createAuthContext({\n organizationId: config.organizationId,\n organizationSecret: config.organizationSecret,\n userToken: config.userToken,\n })\n\n // Initialize device detector\n this.deviceDetector = new DeviceDetector()\n\n // Initialize service worker manager\n this.serviceWorkerManager = new ServiceWorkerManager({\n config: config.serviceWorker,\n debug: this.debug,\n onRegistered: (reg) => this.emit('sw:registered', { registration: reg }),\n onUpdated: (reg) => this.emit('sw:updated', { registration: reg }),\n onError: (err) => this.emit('sw:error', { error: err }),\n })\n\n // Initialize installation manager\n this.installationManager = new InstallationManager({\n debug: this.debug,\n onInstallAvailable: (event) => this.emit('install:available', { platforms: event.platforms }),\n onInstallAccepted: (result) => this.emit('install:accepted', result),\n onInstallDismissed: (result) => this.emit('install:dismissed', result),\n onInstalled: () => this.emit('install:completed', {}),\n })\n\n // Initialize push notification manager with dual-mode auth\n this.pushNotificationManager = new PushNotificationManager({\n serviceUrl: this.serviceUrl,\n organizationId: config.organizationId,\n organizationSecret: config.organizationSecret,\n userToken: config.userToken,\n onTokenExpired: config.onTokenExpired,\n serviceId: config.serviceId,\n debug: this.debug,\n onRegistered: (reg) => {\n this.emit('push:registered', { registrationId: reg.registrationId, endpoint: '' })\n // Start heartbeat after registration\n this.heartbeatManager.setRegistrationId(reg.registrationId)\n },\n onUnregistered: () => {\n this.emit('push:unregistered', {})\n this.heartbeatManager.stop()\n },\n onError: (err) => this.emit('push:error', { error: err }),\n onPermissionDenied: () => this.emit('permission:denied', { permission: 'denied' }),\n })\n\n // Initialize heartbeat manager with network/battery awareness and dual-mode auth\n this.heartbeatManager = new HeartbeatManager({\n serviceUrl: this.serviceUrl,\n organizationId: config.organizationId,\n organizationSecret: config.organizationSecret,\n userToken: config.userToken,\n onTokenExpired: config.onTokenExpired,\n config: config.heartbeat,\n debug: this.debug,\n onHeartbeatSent: () => this.emit('heartbeat:sent', { timestamp: Date.now() }),\n onHeartbeatError: (err) => this.emit('heartbeat:error', { timestamp: Date.now(), error: err.message }),\n onIntervalChanged: (interval, reason) => this.emit('heartbeat:intervalChanged', { interval, reason }),\n onPausedForBattery: () => this.emit('heartbeat:pausedForBattery', { timestamp: Date.now() }),\n onResumedFromBattery: () => this.emit('heartbeat:resumedFromBattery', { timestamp: Date.now() }),\n })\n\n // Initialize wake lock manager if enabled (v1.1.0)\n if (config.wakeLock?.enabled !== false) {\n this.wakeLockManager = new WakeLockManager({\n config: {\n enabled: config.wakeLock?.enabled ?? true,\n autoReacquire: config.wakeLock?.reacquireOnVisibility ?? true,\n },\n debug: this.debug,\n onAcquired: () => this.emit('wakeLock:acquired', { timestamp: Date.now() }),\n onReleased: (event) => this.emit('wakeLock:released', { reason: event.reason, timestamp: Date.now() }),\n onError: (event) => this.emit('wakeLock:error', { error: event.error }),\n })\n }\n\n // Initialize offline queue manager if enabled (v1.1.0)\n if (config.offlineQueue?.enabled !== false) {\n this.offlineQueueManager = new OfflineQueueManager({\n config: {\n enabled: config.offlineQueue?.enabled ?? true,\n maxQueueSize: config.offlineQueue?.maxQueueSize ?? 100,\n maxAge: (config.offlineQueue?.maxAgeTTLHours ?? 24) * 60 * 60 * 1000,\n processOnOnline: config.offlineQueue?.autoProcessOnOnline ?? true,\n },\n debug: this.debug,\n onRequestQueued: (req) => this.emit('offlineQueue:queued', { url: req.url, method: req.method }),\n onRequestProcessed: (result) => this.emit('offlineQueue:processed', { success: result.success, requestId: result.id }),\n onQueueEmpty: () => this.emit('offlineQueue:flushed', {}),\n })\n }\n\n // Initialize iOS install banner if on iOS Safari and not installed (v1.1.0)\n if (config.iosInstallBanner?.enabled !== false) {\n const deviceInfo = this.deviceDetector.getDeviceInfo()\n if (deviceInfo.isIOS && deviceInfo.browser === 'Safari') {\n this.iosInstallBanner = new IOSInstallBanner({\n config: {\n enabled: config.iosInstallBanner?.enabled ?? true,\n title: config.iosInstallBanner?.title,\n description: config.iosInstallBanner?.subtitle,\n iconUrl: config.iosInstallBanner?.iconUrl,\n showDelay: config.iosInstallBanner?.showDelay,\n dismissalDays: config.iosInstallBanner?.dismissRememberDays,\n },\n debug: this.debug,\n onShow: () => this.emit('iosBanner:shown', {}),\n onDismiss: () => this.emit('iosBanner:dismissed', {}),\n onInstallClick: () => this.emit('iosBanner:installClicked', {}),\n })\n }\n }\n\n this.log(`CloudSignal PWA SDK v${SDK_VERSION} initialized`)\n }\n\n // ============================================\n // Initialization\n // ============================================\n\n /**\n * Initialize the PWA client\n * Downloads config, registers service worker, and sets up event listeners\n */\n async initialize(): Promise<InitializeResult> {\n try {\n this.log('Initializing PWA client...')\n\n // Initialize installation manager event listeners\n this.installationManager.initialize()\n\n // Register service worker\n const swReg = await this.serviceWorkerManager.register()\n if (swReg) {\n this.pushNotificationManager.setServiceWorkerRegistration(swReg)\n }\n\n // Download service configuration\n const serviceConfig = await this.downloadConfig()\n\n // Set up network listeners\n this.setupNetworkListeners()\n\n // Initialize offline queue if enabled\n if (this.offlineQueueManager) {\n await this.offlineQueueManager.initialize()\n }\n\n // Configure service worker analytics\n if (this.config.notificationAnalytics?.enabled !== false && swReg) {\n this.configureNotificationAnalytics(swReg)\n }\n\n // Show iOS install banner if appropriate\n if (this.iosInstallBanner && this.config.iosInstallBanner?.showOnFirstVisit !== false) {\n const installState = this.installationManager.getState()\n if (!installState.isInstalled) {\n this.iosInstallBanner.show()\n }\n }\n\n // Auto-register installation if PWA is installed\n // This tracks users who installed the PWA without requiring push subscription\n const installState = this.installationManager.getState()\n if (installState.isInstalled) {\n this.log('PWA installation detected, registering...')\n const installResult = await this.pushNotificationManager.registerInstallation()\n if (installResult) {\n this.log(`Installation registered: ${installResult.registrationId}`)\n this.emit('install:registered', { registrationId: installResult.registrationId })\n }\n }\n\n this.initialized = true\n\n const result: InitializeResult = {\n success: true,\n config: serviceConfig || undefined,\n deviceInfo: this.deviceDetector.getDeviceInfo(),\n installationState: this.installationManager.getState(),\n }\n\n this.log('PWA client initialized successfully')\n return result\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n this.log(`Initialization failed: ${err.message}`, 'error')\n return {\n success: false,\n error: err.message,\n }\n }\n }\n\n /**\n * Download PWA service configuration from backend\n */\n async downloadConfig(): Promise<PWAServiceConfig | null> {\n try {\n const url = `${this.serviceUrl}/api/v1/config/download`\n const response = await makeAuthenticatedRequestWithContext(\n this.authContext,\n 'POST',\n url,\n { organization_id: this.config.organizationId },\n this.config.onTokenExpired\n )\n\n if (!response.ok) {\n throw new Error(`Config download failed: ${response.status}`)\n }\n\n const config = await response.json()\n this.serviceConfig = config\n\n // Set VAPID key for push notifications\n if (config.vapid_public_key) {\n this.pushNotificationManager.setVapidPublicKey(config.vapid_public_key)\n }\n\n // Inject manifest if URL provided\n if (config.manifest_url) {\n this.injectManifest(config.manifest_url)\n }\n\n this.emit('config:loaded', { config })\n this.log('Configuration downloaded successfully')\n\n return config\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n this.log(`Config download failed: ${err.message}`, 'error')\n this.emit('config:error', { error: err })\n return null\n }\n }\n\n // ============================================\n // Installation\n // ============================================\n\n /**\n * Show the PWA install prompt\n */\n async showInstallPrompt(): Promise<InstallResult> {\n return this.installationManager.showInstallPrompt()\n }\n\n /**\n * Get current installation state\n */\n getInstallationState(): InstallationState {\n return this.installationManager.getState()\n }\n\n /**\n * Check if PWA can be installed\n */\n canInstall(): boolean {\n return this.installationManager.canInstall()\n }\n\n /**\n * Check if PWA is installed\n */\n isInstalled(): boolean {\n return this.installationManager.isPWAInstalled()\n }\n\n /**\n * Get installation steps for current platform\n */\n getInstallSteps(): string[] {\n return this.installationManager.getInstallSteps()\n }\n\n // ============================================\n // Push Notifications\n // ============================================\n\n /**\n * Register for push notifications\n */\n async registerForPush(options?: RegisterOptions): Promise<Registration | null> {\n return this.pushNotificationManager.register(options)\n }\n\n /**\n * Unregister from push notifications\n */\n async unregisterFromPush(): Promise<boolean> {\n return this.pushNotificationManager.unregister()\n }\n\n /**\n * Update notification preferences\n */\n async updatePreferences(preferences: NotificationPreferences): Promise<boolean> {\n return this.pushNotificationManager.updatePreferences(preferences)\n }\n\n /**\n * Check registration status\n */\n async checkRegistrationStatus(): Promise<RegistrationStatusResponse | null> {\n return this.pushNotificationManager.checkStatus()\n }\n\n /**\n * Get current registration ID\n */\n getRegistrationId(): string | null {\n return this.pushNotificationManager.getRegistrationId()\n }\n\n /**\n * Check if registered for push notifications\n */\n isRegistered(): boolean {\n return this.pushNotificationManager.isRegistered()\n }\n\n /**\n * Request notification permission\n */\n async requestPermission(): Promise<NotificationPermission> {\n return this.pushNotificationManager.requestPermission()\n }\n\n // ============================================\n // Authentication\n // ============================================\n\n /**\n * Get current authentication mode\n */\n getAuthMode(): AuthMode {\n return this.authContext.mode\n }\n\n /**\n * Set JWT user token (for upgrading anonymous to authenticated, or token refresh)\n * After calling this, you should call registerForPush() again to re-register with user context\n * @param token - JWT token from identity provider\n */\n setUserToken(token: string): void {\n this.authContext = updateAuthToken(this.authContext, token)\n this.pushNotificationManager.updateToken(token)\n this.heartbeatManager.updateToken(token)\n this.emit('auth:tokenUpdated', { mode: this.authContext.mode })\n this.log(`Auth mode updated to: ${this.authContext.mode}`)\n }\n\n // ============================================\n // Device Information\n // ============================================\n\n /**\n * Get comprehensive device information\n */\n getDeviceInfo(): DeviceInfo {\n return this.deviceDetector.getDeviceInfo()\n }\n\n /**\n * Get PWA capabilities\n */\n getCapabilities() {\n return this.deviceDetector.getCapabilities()\n }\n\n // ============================================\n // Heartbeat\n // ============================================\n\n /**\n * Start heartbeat for online status tracking\n */\n startHeartbeat(): void {\n const regId = this.pushNotificationManager.getRegistrationId()\n if (regId) {\n this.heartbeatManager.setRegistrationId(regId)\n this.heartbeatManager.start()\n this.emit('heartbeat:started', { timestamp: Date.now() })\n } else {\n this.log('Cannot start heartbeat: not registered', 'warn')\n }\n }\n\n /**\n * Stop heartbeat\n */\n stopHeartbeat(): void {\n this.heartbeatManager.stop()\n this.emit('heartbeat:stopped', { timestamp: Date.now() })\n }\n\n /**\n * Get current heartbeat interval (may vary with network conditions)\n */\n getHeartbeatInterval(): number {\n return this.heartbeatManager.getCurrentInterval()\n }\n\n /**\n * Get current network connection info\n */\n getNetworkInfo(): NetworkConnectionInfo {\n return this.heartbeatManager.getNetworkInfo()\n }\n\n /**\n * Get battery info if available\n */\n async getBatteryInfo(): Promise<BatteryInfo | null> {\n return this.heartbeatManager.getBatteryInfo()\n }\n\n // ============================================\n // Wake Lock (v1.1.0)\n // ============================================\n\n /**\n * Request screen wake lock to prevent sleep\n */\n async requestWakeLock(): Promise<boolean> {\n if (!this.wakeLockManager) {\n this.log('Wake lock manager not initialized', 'warn')\n return false\n }\n return this.wakeLockManager.acquire()\n }\n\n /**\n * Release screen wake lock\n */\n releaseWakeLock(): void {\n this.wakeLockManager?.release()\n }\n\n /**\n * Get wake lock state\n */\n getWakeLockState(): WakeLockState {\n if (!this.wakeLockManager) {\n return { isSupported: false, isActive: false }\n }\n return this.wakeLockManager.getState()\n }\n\n // ============================================\n // Offline Queue (v1.1.0)\n // ============================================\n\n /**\n * Queue a request for later execution when offline\n */\n async queueOfflineRequest(\n url: string,\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE',\n options?: {\n body?: string\n headers?: Record<string, string>\n }\n ): Promise<number | null> {\n if (!this.offlineQueueManager) {\n this.log('Offline queue manager not initialized', 'warn')\n return null\n }\n return this.offlineQueueManager.queueRequest(url, method, {\n body: options?.body,\n headers: options?.headers,\n })\n }\n\n /**\n * Process all queued requests\n */\n async processOfflineQueue(): Promise<QueueProcessResult[]> {\n if (!this.offlineQueueManager) {\n return []\n }\n return this.offlineQueueManager.processQueue()\n }\n\n /**\n * Get offline queue statistics\n */\n async getOfflineQueueStats(): Promise<OfflineQueueStats> {\n if (!this.offlineQueueManager) {\n return { totalQueued: 0, byType: { registration: 0, heartbeat: 0, analytics: 0, preferences: 0, unregister: 0, custom: 0 } }\n }\n return this.offlineQueueManager.getStats()\n }\n\n /**\n * Clear all queued requests\n */\n async clearOfflineQueue(): Promise<void> {\n await this.offlineQueueManager?.clearQueue()\n }\n\n // ============================================\n // iOS Install Banner (v1.1.0)\n // ============================================\n\n /**\n * Show iOS install banner manually\n */\n showIOSInstallBanner(): void {\n if (!this.iosInstallBanner) {\n this.log('iOS install banner not available (not on iOS Safari)', 'warn')\n return\n }\n this.iosInstallBanner.show()\n }\n\n /**\n * Hide iOS install banner\n */\n hideIOSInstallBanner(): void {\n this.iosInstallBanner?.hide()\n }\n\n /**\n * Check if iOS install banner was previously dismissed\n */\n wasIOSBannerDismissed(): boolean {\n return this.iosInstallBanner?.wasDismissed() ?? false\n }\n\n /**\n * Reset iOS banner dismissal state\n */\n resetIOSBannerDismissal(): void {\n this.iosInstallBanner?.resetDismissal()\n }\n\n // ============================================\n // Service Worker\n // ============================================\n\n /**\n * Clear app badge\n */\n clearBadge(): void {\n this.serviceWorkerManager.clearBadge()\n }\n\n /**\n * Set app badge count\n */\n setBadge(count: number): void {\n this.serviceWorkerManager.setBadge(count)\n }\n\n /**\n * Check for service worker updates\n */\n async checkForUpdates(): Promise<void> {\n return this.serviceWorkerManager.checkForUpdate()\n }\n\n // ============================================\n // Events\n // ============================================\n\n /**\n * Subscribe to an event\n */\n on(event: PWAEvent, handler: EventHandler): void {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, new Set())\n }\n this.eventHandlers.get(event)!.add(handler)\n }\n\n /**\n * Unsubscribe from an event\n */\n off(event: PWAEvent, handler: EventHandler): void {\n const handlers = this.eventHandlers.get(event)\n if (handlers) {\n handlers.delete(handler)\n }\n }\n\n /**\n * Emit an event\n */\n private emit(event: PWAEvent, data: any): void {\n const handlers = this.eventHandlers.get(event)\n if (handlers) {\n handlers.forEach(handler => {\n try {\n handler(data)\n } catch (error) {\n this.log(`Event handler error for ${event}: ${error}`, 'error')\n }\n })\n }\n }\n\n // ============================================\n // Utility Methods\n // ============================================\n\n /**\n * Get SDK version\n */\n getVersion(): string {\n return SDK_VERSION\n }\n\n /**\n * Get service configuration\n */\n getServiceConfig(): PWAServiceConfig | null {\n return this.serviceConfig\n }\n\n /**\n * Check if client is initialized\n */\n isInitialized(): boolean {\n return this.initialized\n }\n\n /**\n * Inject PWA manifest link\n */\n private injectManifest(manifestUrl: string): void {\n let manifestLink = document.querySelector('link[rel=\"manifest\"]')\n if (!manifestLink) {\n manifestLink = document.createElement('link')\n manifestLink.setAttribute('rel', 'manifest')\n document.head.appendChild(manifestLink)\n }\n manifestLink.setAttribute('href', manifestUrl)\n this.log(`Manifest injected: ${manifestUrl}`)\n }\n\n /**\n * Set up network status listeners\n */\n private setupNetworkListeners(): void {\n window.addEventListener('online', () => {\n this.deviceDetector.clearCache()\n this.emit('network:online', { isOnline: true })\n\n // Process offline queue when coming back online\n if (this.offlineQueueManager) {\n this.offlineQueueManager.processQueue().catch((err) => {\n this.log(`Failed to process offline queue: ${err.message}`, 'error')\n })\n }\n })\n\n window.addEventListener('offline', () => {\n this.deviceDetector.clearCache()\n this.emit('network:offline', { isOnline: false })\n })\n }\n\n /**\n * Configure notification analytics in service worker\n */\n private configureNotificationAnalytics(swReg: ServiceWorkerRegistration): void {\n const endpoint = this.config.notificationAnalytics?.endpoint ||\n `${this.serviceUrl}/api/v1/analytics/notifications`\n\n swReg.active?.postMessage({\n type: 'CONFIGURE_ANALYTICS',\n config: {\n enabled: this.config.notificationAnalytics?.enabled !== false,\n endpoint,\n organizationId: this.config.organizationId,\n },\n })\n\n this.log('Notification analytics configured')\n }\n\n /**\n * Log message if debug is enabled\n */\n private log(message: string, level: 'log' | 'warn' | 'error' = 'log'): void {\n if (!this.debug && level === 'log') return\n const prefix = '[CloudSignal PWA]'\n console[level](`${prefix} ${message}`)\n }\n}\n\n// Export as default\nexport default CloudSignalPWA\n","/**\n * NotificationPermissionPrompt - Soft prompt before native notification permission\n * Improves opt-in rates by explaining value before triggering browser prompt\n * Supports 20 languages with auto-detection\n */\n\nimport {\n type IOSBannerLanguage,\n detectBrowserLanguage,\n} from './IOSInstallBannerI18n'\n\nconst STORAGE_KEY = 'cloudsignal_pwa_notification_prompt_dismissed'\nconst PROMPT_ID = 'cloudsignal-notification-prompt'\n\n/**\n * Notification prompt strings interface\n */\nexport interface NotificationPromptStrings {\n title: string\n description: string\n allowButton: string\n laterButton: string\n iosNote?: string\n}\n\n/**\n * Built-in translations (20 languages)\n */\nexport const NOTIFICATION_PROMPT_TRANSLATIONS: Record<IOSBannerLanguage, NotificationPromptStrings> = {\n en: {\n title: 'Stay Updated',\n description: 'Get notified about important updates, messages, and alerts.',\n allowButton: 'Enable Notifications',\n laterButton: 'Maybe Later',\n iosNote: 'On iOS, you must first add this app to your home screen.',\n },\n es: {\n title: 'Mantente Actualizado',\n description: 'Recibe notificaciones sobre actualizaciones importantes, mensajes y alertas.',\n allowButton: 'Activar Notificaciones',\n laterButton: 'Quizás Después',\n iosNote: 'En iOS, primero debes añadir esta aplicación a tu pantalla de inicio.',\n },\n fr: {\n title: 'Restez Informé',\n description: 'Recevez des notifications sur les mises à jour importantes, messages et alertes.',\n allowButton: 'Activer les Notifications',\n laterButton: 'Plus Tard',\n iosNote: \"Sur iOS, vous devez d'abord ajouter cette application à votre écran d'accueil.\",\n },\n de: {\n title: 'Bleiben Sie Informiert',\n description: 'Erhalten Sie Benachrichtigungen über wichtige Updates, Nachrichten und Warnungen.',\n allowButton: 'Benachrichtigungen Aktivieren',\n laterButton: 'Vielleicht Später',\n iosNote: 'Auf iOS müssen Sie diese App zuerst zum Startbildschirm hinzufügen.',\n },\n it: {\n title: 'Rimani Aggiornato',\n description: 'Ricevi notifiche su aggiornamenti importanti, messaggi e avvisi.',\n allowButton: 'Attiva Notifiche',\n laterButton: 'Forse Dopo',\n iosNote: 'Su iOS, devi prima aggiungere questa app alla schermata Home.',\n },\n pt: {\n title: 'Fique Atualizado',\n description: 'Receba notificações sobre atualizações importantes, mensagens e alertas.',\n allowButton: 'Ativar Notificações',\n laterButton: 'Talvez Depois',\n iosNote: 'No iOS, você deve primeiro adicionar este aplicativo à tela inicial.',\n },\n nl: {\n title: 'Blijf Op De Hoogte',\n description: 'Ontvang meldingen over belangrijke updates, berichten en waarschuwingen.',\n allowButton: 'Meldingen Inschakelen',\n laterButton: 'Misschien Later',\n iosNote: 'Op iOS moet je deze app eerst toevoegen aan je beginscherm.',\n },\n ru: {\n title: 'Будьте в Курсе',\n description: 'Получайте уведомления о важных обновлениях, сообщениях и предупреждениях.',\n allowButton: 'Включить Уведомления',\n laterButton: 'Позже',\n iosNote: 'На iOS сначала добавьте это приложение на главный экран.',\n },\n zh: {\n title: '保持更新',\n description: '获取重要更新、消息和提醒的通知。',\n allowButton: '启用通知',\n laterButton: '稍后再说',\n iosNote: '在iOS上,您必须先将此应用添加到主屏幕。',\n },\n ja: {\n title: '最新情報を入手',\n description: '重要なアップデート、メッセージ、アラートの通知を受け取ります。',\n allowButton: '通知を有効にする',\n laterButton: '後で',\n iosNote: 'iOSでは、まずこのアプリをホーム画面に追加する必要があります。',\n },\n ko: {\n title: '최신 정보 받기',\n description: '중요한 업데이트, 메시지 및 알림에 대한 알림을 받으세요.',\n allowButton: '알림 활성화',\n laterButton: '나중에',\n iosNote: 'iOS에서는 먼저 이 앱을 홈 화면에 추가해야 합니다.',\n },\n ar: {\n title: 'ابق على اطلاع',\n description: 'احصل على إشعارات حول التحديثات المهمة والرسائل والتنبيهات.',\n allowButton: 'تفعيل الإشعارات',\n laterButton: 'ربما لاحقاً',\n iosNote: 'على iOS، يجب أولاً إضافة هذا التطبيق إلى الشاشة الرئيسية.',\n },\n he: {\n title: 'הישאר מעודכן',\n description: 'קבל התראות על עדכונים חשובים, הודעות והתראות.',\n allowButton: 'הפעל התראות',\n laterButton: 'אולי מאוחר יותר',\n iosNote: 'ב-iOS, עליך להוסיף תחילה את האפליקציה למסך הבית.',\n },\n hi: {\n title: 'अपडेट रहें',\n description: 'महत्वपूर्ण अपडेट, संदेशों और अलर्ट के बारे में सूचनाएं प्राप्त करें।',\n allowButton: 'सूचनाएं सक्षम करें',\n laterButton: 'बाद में',\n iosNote: 'iOS पर, आपको पहले इस ऐप को होम स्क्रीन पर जोड़ना होगा।',\n },\n tr: {\n title: 'Güncel Kalın',\n description: 'Önemli güncellemeler, mesajlar ve uyarılar hakkında bildirim alın.',\n allowButton: 'Bildirimleri Etkinleştir',\n laterButton: 'Belki Sonra',\n iosNote: \"iOS'ta önce bu uygulamayı ana ekranınıza eklemelisiniz.\",\n },\n pl: {\n title: 'Bądź Na Bieżąco',\n description: 'Otrzymuj powiadomienia o ważnych aktualizacjach, wiadomościach i alertach.',\n allowButton: 'Włącz Powiadomienia',\n laterButton: 'Może Później',\n iosNote: 'Na iOS musisz najpierw dodać tę aplikację do ekranu głównego.',\n },\n sv: {\n title: 'Håll Dig Uppdaterad',\n description: 'Få aviseringar om viktiga uppdateringar, meddelanden och varningar.',\n allowButton: 'Aktivera Aviseringar',\n laterButton: 'Kanske Senare',\n iosNote: 'På iOS måste du först lägga till denna app på hemskärmen.',\n },\n da: {\n title: 'Hold Dig Opdateret',\n description: 'Få notifikationer om vigtige opdateringer, beskeder og advarsler.',\n allowButton: 'Aktivér Notifikationer',\n laterButton: 'Måske Senere',\n iosNote: 'På iOS skal du først tilføje denne app til startskærmen.',\n },\n no: {\n title: 'Hold Deg Oppdatert',\n description: 'Få varsler om viktige oppdateringer, meldinger og varsler.',\n allowButton: 'Aktiver Varsler',\n laterButton: 'Kanskje Senere',\n iosNote: 'På iOS må du først legge til denne appen på startskjermen.',\n },\n fi: {\n title: 'Pysy Ajan Tasalla',\n description: 'Saat ilmoituksia tärkeistä päivityksistä, viesteistä ja hälytyksistä.',\n allowButton: 'Ota Ilmoitukset Käyttöön',\n laterButton: 'Ehkä Myöhemmin',\n iosNote: 'iOS:ssa sinun on ensin lisättävä tämä sovellus aloitusnäytölle.',\n },\n}\n\n/**\n * Prompt styles\n */\nexport interface NotificationPromptStyles {\n backgroundColor: string\n textColor: string\n primaryButtonBackground: string\n primaryButtonText: string\n secondaryButtonBackground: string\n secondaryButtonText: string\n borderRadius: string\n boxShadow: string\n}\n\nconst DEFAULT_STYLES: NotificationPromptStyles = {\n backgroundColor: '#ffffff',\n textColor: '#1a1a1a',\n primaryButtonBackground: '#007AFF',\n primaryButtonText: '#ffffff',\n secondaryButtonBackground: 'transparent',\n secondaryButtonText: '#666666',\n borderRadius: '16px',\n boxShadow: '0 4px 24px rgba(0, 0, 0, 0.15)',\n}\n\n/**\n * Prompt configuration\n */\nexport interface NotificationPromptConfig {\n /** Enable the soft prompt */\n enabled?: boolean\n /** Custom icon URL */\n iconUrl?: string\n /** Show delay in ms */\n showDelay?: number\n /** Days to remember dismissal */\n dismissalDays?: number\n /** Position: 'top' | 'center' | 'bottom' */\n position?: 'top' | 'center' | 'bottom'\n /** Custom styles */\n customStyles?: Partial<NotificationPromptStyles>\n /** Show iOS-specific note */\n showIOSNote?: boolean\n}\n\nexport interface NotificationPromptOptions {\n config?: NotificationPromptConfig\n /** Language code - auto-detected if not provided */\n language?: IOSBannerLanguage\n /** Custom strings to override translations */\n customStrings?: Partial<NotificationPromptStrings>\n debug?: boolean\n /** Called when user clicks allow */\n onAllow?: () => void\n /** Called when user clicks later */\n onLater?: () => void\n /** Called when prompt is shown */\n onShow?: () => void\n}\n\n/**\n * NotificationPermissionPrompt - Soft prompt before native browser permission\n */\nexport class NotificationPermissionPrompt {\n private config: Required<Omit<NotificationPromptConfig, 'customStyles'>> & { customStyles: Partial<NotificationPromptStyles> }\n private styles: NotificationPromptStyles\n private strings: NotificationPromptStrings\n private language: IOSBannerLanguage\n private debug: boolean\n private promptElement: HTMLElement | null = null\n private overlayElement: HTMLElement | null = null\n\n private onAllow?: () => void\n private onLater?: () => void\n private onShow?: () => void\n\n constructor(options: NotificationPromptOptions = {}) {\n this.debug = options.debug ?? false\n this.onAllow = options.onAllow\n this.onLater = options.onLater\n this.onShow = options.onShow\n\n // Detect or use provided language\n this.language = options.language ?? detectBrowserLanguage()\n const baseStrings = NOTIFICATION_PROMPT_TRANSLATIONS[this.language]\n\n this.strings = {\n ...baseStrings,\n ...options.customStrings,\n }\n\n this.config = {\n enabled: options.config?.enabled ?? true,\n iconUrl: options.config?.iconUrl ?? '',\n showDelay: options.config?.showDelay ?? 2000,\n dismissalDays: options.config?.dismissalDays ?? 3,\n position: options.config?.position ?? 'center',\n customStyles: options.config?.customStyles ?? {},\n showIOSNote: options.config?.showIOSNote ?? true,\n }\n\n this.styles = { ...DEFAULT_STYLES, ...this.config.customStyles }\n this.log(`Initialized with language: ${this.language}`)\n }\n\n /**\n * Get current language\n */\n getLanguage(): IOSBannerLanguage {\n return this.language\n }\n\n /**\n * Set language\n */\n setLanguage(language: IOSBannerLanguage): void {\n this.language = language\n this.strings = { ...NOTIFICATION_PROMPT_TRANSLATIONS[language] }\n this.log(`Language changed to: ${language}`)\n }\n\n /**\n * Check if should show prompt\n */\n shouldShow(): boolean {\n // Already granted or denied\n if ('Notification' in window && Notification.permission !== 'default') {\n return false\n }\n\n // Check dismissal\n if (this.wasDismissed()) {\n return false\n }\n\n return true\n }\n\n /**\n * Check if previously dismissed\n */\n wasDismissed(): boolean {\n try {\n const dismissed = localStorage.getItem(STORAGE_KEY)\n if (!dismissed) return false\n\n const dismissedTime = parseInt(dismissed, 10)\n const daysSinceDismissal = (Date.now() - dismissedTime) / (1000 * 60 * 60 * 24)\n\n if (daysSinceDismissal > this.config.dismissalDays) {\n localStorage.removeItem(STORAGE_KEY)\n return false\n }\n\n return true\n } catch {\n return false\n }\n }\n\n /**\n * Check if device is iOS\n */\n private isIOS(): boolean {\n return /iPad|iPhone|iPod/.test(navigator.userAgent) && !(window as any).MSStream\n }\n\n /**\n * Check if PWA is installed (standalone mode)\n */\n private isInstalled(): boolean {\n if ((navigator as any).standalone === true) return true\n if (window.matchMedia('(display-mode: standalone)').matches) return true\n return false\n }\n\n /**\n * Show the soft prompt\n */\n async show(): Promise<boolean> {\n if (!this.config.enabled) {\n this.log('Prompt is disabled')\n return false\n }\n\n if (!this.shouldShow()) {\n this.log('Prompt should not be shown')\n return false\n }\n\n if (this.promptElement) {\n this.log('Prompt already visible')\n return true\n }\n\n // Delay before showing\n if (this.config.showDelay > 0) {\n await new Promise((resolve) => setTimeout(resolve, this.config.showDelay))\n }\n\n // Double-check\n if (!this.shouldShow()) {\n return false\n }\n\n this.createPrompt()\n this.log('Prompt shown')\n this.onShow?.()\n\n return true\n }\n\n /**\n * Hide the prompt\n */\n hide(): void {\n if (this.promptElement) {\n this.promptElement.remove()\n this.promptElement = null\n }\n if (this.overlayElement) {\n this.overlayElement.remove()\n this.overlayElement = null\n }\n }\n\n /**\n * Dismiss and remember\n */\n dismiss(): void {\n this.hide()\n try {\n localStorage.setItem(STORAGE_KEY, Date.now().toString())\n } catch {\n // localStorage not available\n }\n this.log('Prompt dismissed')\n this.onLater?.()\n }\n\n /**\n * Reset dismissal state\n */\n resetDismissal(): void {\n try {\n localStorage.removeItem(STORAGE_KEY)\n } catch {\n // localStorage not available\n }\n }\n\n /**\n * Handle allow click - triggers native permission\n */\n async handleAllow(): Promise<NotificationPermission> {\n this.hide()\n this.onAllow?.()\n\n // Now trigger the native permission prompt\n if ('Notification' in window) {\n return await Notification.requestPermission()\n }\n return 'denied'\n }\n\n /**\n * Create and inject the prompt element\n */\n private createPrompt(): void {\n // Create overlay\n this.overlayElement = document.createElement('div')\n this.overlayElement.id = `${PROMPT_ID}-overlay`\n this.overlayElement.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n z-index: 999998;\n opacity: 0;\n transition: opacity 0.3s ease;\n `\n this.overlayElement.addEventListener('click', () => this.dismiss())\n document.body.appendChild(this.overlayElement)\n\n // Create prompt\n this.promptElement = document.createElement('div')\n this.promptElement.id = PROMPT_ID\n\n let positionStyles: string\n switch (this.config.position) {\n case 'top':\n positionStyles = 'top: 20px; left: 50%; transform: translateX(-50%) translateY(-20px);'\n break\n case 'bottom':\n positionStyles = 'bottom: 20px; left: 50%; transform: translateX(-50%) translateY(20px);'\n break\n default: // center\n positionStyles = 'top: 50%; left: 50%; transform: translate(-50%, -50%) scale(0.95);'\n }\n\n this.promptElement.style.cssText = `\n position: fixed;\n ${positionStyles}\n width: 90%;\n max-width: 380px;\n background: ${this.styles.backgroundColor};\n color: ${this.styles.textColor};\n border-radius: ${this.styles.borderRadius};\n box-shadow: ${this.styles.boxShadow};\n z-index: 999999;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;\n opacity: 0;\n transition: opacity 0.3s ease, transform 0.3s ease;\n `\n\n const iconHtml = this.config.iconUrl\n ? `<img src=\"${this.config.iconUrl}\" alt=\"App icon\" style=\"width: 48px; height: 48px; border-radius: 10px; margin-bottom: 12px;\">`\n : `<div style=\"width: 48px; height: 48px; border-radius: 10px; margin-bottom: 12px; background: linear-gradient(135deg, #007AFF, #5856D6); display: flex; align-items: center; justify-content: center;\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" stroke-width=\"2\">\n <path d=\"M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9\"/>\n <path d=\"M13.73 21a2 2 0 0 1-3.46 0\"/>\n </svg>\n </div>`\n\n // Show iOS note if on iOS and not installed\n const showIOSNote = this.config.showIOSNote && this.isIOS() && !this.isInstalled()\n const iosNoteHtml = showIOSNote && this.strings.iosNote\n ? `<p style=\"margin: 12px 0 0 0; padding: 10px; background: rgba(255, 149, 0, 0.1); border-radius: 8px; font-size: 12px; color: #996600;\">\n ⚠️ ${this.strings.iosNote}\n </p>`\n : ''\n\n this.promptElement.innerHTML = `\n <div style=\"padding: 24px; text-align: center;\">\n ${iconHtml}\n <h3 style=\"margin: 0 0 8px 0; font-size: 20px; font-weight: 600;\">${this.strings.title}</h3>\n <p style=\"margin: 0; font-size: 14px; opacity: 0.7; line-height: 1.5;\">${this.strings.description}</p>\n ${iosNoteHtml}\n <div style=\"margin-top: 20px; display: flex; flex-direction: column; gap: 10px;\">\n <button id=\"${PROMPT_ID}-allow\" style=\"\n width: 100%;\n padding: 14px 20px;\n background: ${this.styles.primaryButtonBackground};\n color: ${this.styles.primaryButtonText};\n border: none;\n border-radius: 10px;\n font-size: 16px;\n font-weight: 600;\n cursor: pointer;\n -webkit-tap-highlight-color: transparent;\n \">${this.strings.allowButton}</button>\n <button id=\"${PROMPT_ID}-later\" style=\"\n width: 100%;\n padding: 12px 20px;\n background: ${this.styles.secondaryButtonBackground};\n color: ${this.styles.secondaryButtonText};\n border: none;\n border-radius: 10px;\n font-size: 14px;\n cursor: pointer;\n -webkit-tap-highlight-color: transparent;\n \">${this.strings.laterButton}</button>\n </div>\n </div>\n `\n\n document.body.appendChild(this.promptElement)\n\n // Add event listeners\n document.getElementById(`${PROMPT_ID}-allow`)?.addEventListener('click', () => this.handleAllow())\n document.getElementById(`${PROMPT_ID}-later`)?.addEventListener('click', () => this.dismiss())\n\n // Animate in\n requestAnimationFrame(() => {\n if (this.overlayElement) {\n this.overlayElement.style.opacity = '1'\n }\n if (this.promptElement) {\n this.promptElement.style.opacity = '1'\n if (this.config.position === 'center') {\n this.promptElement.style.transform = 'translate(-50%, -50%) scale(1)'\n } else if (this.config.position === 'top') {\n this.promptElement.style.transform = 'translateX(-50%) translateY(0)'\n } else {\n this.promptElement.style.transform = 'translateX(-50%) translateY(0)'\n }\n }\n })\n }\n\n /**\n * Log message if debug is enabled\n */\n private log(message: string, level: 'log' | 'warn' | 'error' = 'log'): void {\n if (!this.debug && level === 'log') return\n const prefix = '[CloudSignal PWA NotificationPrompt]'\n console[level](`${prefix} ${message}`)\n }\n}\n\n// Re-export language type for convenience\nexport type { IOSBannerLanguage as NotificationPromptLanguage }\n","/**\n * CloudSignal PWA SDK\n * Progressive Web App features with push notifications, installation management, and device tracking\n * \n * v1.1.0: Added WakeLock, OfflineQueue, iOS Install Banner, Network-aware Heartbeat, Notification Analytics\n * v1.2.0: Added JWT auth support for user-linked registrations\n * \n * @packageDocumentation\n */\n\n// Main client\nexport { CloudSignalPWA, default } from './CloudSignalPWA'\n\n// Core Managers\nexport { DeviceDetector, deviceDetector } from './DeviceDetector'\nexport { ServiceWorkerManager } from './ServiceWorkerManager'\nexport { InstallationManager } from './InstallationManager'\nexport { PushNotificationManager } from './PushNotificationManager'\nexport { HeartbeatManager } from './HeartbeatManager'\n\n// v1.1.0 Managers\nexport { WakeLockManager } from './WakeLockManager'\nexport { OfflineQueueManager } from './OfflineQueueManager'\nexport { IOSInstallBanner } from './IOSInstallBanner'\nexport { NotificationPermissionPrompt } from './NotificationPermissionPrompt'\n\n// i18n\nexport {\n IOS_BANNER_TRANSLATIONS,\n detectBrowserLanguage,\n type IOSBannerLanguage,\n type IOSBannerStrings,\n} from './IOSInstallBannerI18n'\n\nexport {\n NOTIFICATION_PROMPT_TRANSLATIONS,\n type NotificationPromptStrings,\n type NotificationPromptLanguage,\n} from './NotificationPermissionPrompt'\n\n// Utilities\nexport {\n generateHMACSignature,\n generateAuthHeaders,\n makeAuthenticatedRequest,\n isValidUUID,\n} from './utils/hmac'\n\nexport {\n generateJWTHeaders,\n makeJWTAuthenticatedRequest,\n createAuthContext,\n makeAuthenticatedRequestWithContext,\n updateAuthToken,\n} from './utils/jwt-auth'\nexport type { AuthContext } from './utils/jwt-auth'\n\nexport {\n generateBrowserFingerprint,\n generateTrackingId,\n} from './utils/fingerprint'\n\nexport {\n getStorageItem,\n setStorageItem,\n removeStorageItem,\n getRegistrationId,\n setRegistrationId,\n removeRegistrationId,\n IndexedDBStorage,\n} from './utils/storage'\n\n// Types\nexport type {\n // Config types\n PWAConfig,\n ServiceWorkerConfig,\n HeartbeatConfig,\n LoggerFunction,\n PWAServiceConfig,\n RegisterOptions,\n NotificationPreferences,\n InitializeResult,\n // v1.1.0 Config types\n WakeLockConfig,\n OfflineQueueConfig,\n IOSInstallBannerConfig,\n NotificationAnalyticsConfig,\n // v1.2.0 Auth types\n AuthMode,\n // Device types\n DeviceInfo,\n PWASupportLevel,\n NotificationPermissionState,\n InstallationState,\n DisplayMode,\n InstallResult,\n PlatformInfo,\n ScreenInfo,\n NetworkInfo,\n PWACapabilities,\n BeforeInstallPromptEvent,\n // Notification types\n Registration,\n RegistrationStatus,\n RegistrationStatusResponse,\n PushSubscriptionData,\n NotificationPayload,\n NotificationAction,\n PWAEvent,\n EventHandler,\n InstallAvailableEvent,\n InstallResultEvent,\n PushRegisteredEvent,\n PushReceivedEvent,\n PushClickedEvent,\n PermissionEvent,\n ServiceWorkerEvent,\n ConfigLoadedEvent,\n HeartbeatEvent,\n NetworkEvent,\n // v1.1.0 Feature types\n WakeLockState,\n NetworkConnectionInfo,\n BatteryInfo,\n AdaptiveHeartbeatConfig,\n NotificationAnalyticsEvent,\n IOSInstallBannerOptions,\n QueuedRequest,\n QueueProcessResult,\n OfflineQueueStats,\n} from './types'\n\n// SDK Version\nexport const VERSION = '1.2.0'\n"]}