@cloudsignal/pwa-sdk 1.0.0
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/CHANGELOG.md +42 -0
- package/README.md +383 -0
- package/dist/index.cjs +2051 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.mts +1197 -0
- package/dist/index.d.ts +1197 -0
- package/dist/index.global.js +9 -0
- package/dist/index.global.js.map +1 -0
- package/dist/index.js +2026 -0
- package/dist/index.js.map +1 -0
- package/dist/service-worker.js +291 -0
- package/dist/service-worker.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/fingerprint.ts","../src/DeviceDetector.ts","../src/ServiceWorkerManager.ts","../src/InstallationManager.ts","../src/utils/hmac.ts","../src/utils/storage.ts","../src/PushNotificationManager.ts","../src/HeartbeatManager.ts","../src/CloudSignalPWA.ts","../src/index.ts"],"names":["vendor","renderer","screen"],"mappings":"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","file":"index.cjs","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 * HMAC Authentication Utilities\n * Implements CloudSignal's HMAC signature scheme for API authentication\n */\n\n/**\n * Convert ArrayBuffer to hex string\n */\nfunction toHex(buffer: ArrayBuffer): string {\n return Array.from(new Uint8Array(buffer))\n .map(b => b.toString(16).padStart(2, '0'))\n .join('')\n}\n\n/**\n * Convert ArrayBuffer to base64 string\n */\nfunction toBase64(buffer: ArrayBuffer): string {\n return btoa(String.fromCharCode(...new Uint8Array(buffer)))\n}\n\n/**\n * Generate HMAC signature for CloudSignal API requests\n * \n * @param secret - Organization secret key\n * @param organizationId - Organization UUID\n * @param timestamp - Unix timestamp string\n * @param method - HTTP method (GET, POST, etc.)\n * @param url - Full URL or path\n * @param body - Request body (optional)\n * @returns Base64-encoded HMAC signature\n */\nexport async function generateHMACSignature(\n secret: string,\n organizationId: string,\n timestamp: string,\n method: string,\n url: string,\n body: string = ''\n): Promise<string> {\n const encoder = new TextEncoder()\n\n // Parse URL to extract path and query\n let path: string\n let query: string\n\n try {\n const urlObj = url.startsWith('http')\n ? new URL(url)\n : new URL(url, 'https://pwa.cloudsignal.app')\n path = urlObj.pathname\n query = urlObj.search ? urlObj.search.slice(1) : ''\n } catch {\n // Fallback for simple paths\n const queryIndex = url.indexOf('?')\n if (queryIndex > -1) {\n path = url.slice(0, queryIndex)\n query = url.slice(queryIndex + 1)\n } else {\n path = url\n query = ''\n }\n }\n\n // Build canonical string parts\n const canonicalParts = [\n method.toUpperCase(),\n path,\n query,\n organizationId,\n timestamp,\n ]\n\n // Add body hash if body is present\n if (body && body.length > 0) {\n const bodyHashBuffer = await crypto.subtle.digest('SHA-256', encoder.encode(body))\n const bodyHashHex = toHex(bodyHashBuffer)\n canonicalParts.push(bodyHashHex)\n }\n\n // Join parts with newlines\n const canonicalString = canonicalParts.join('\\n')\n\n // Import secret as HMAC key\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n )\n\n // Sign the canonical string\n const signature = await crypto.subtle.sign('HMAC', key, encoder.encode(canonicalString))\n\n return toBase64(signature)\n}\n\n/**\n * Generate authentication headers for CloudSignal API requests\n * \n * @param organizationId - Organization UUID\n * @param organizationSecret - Organization secret key\n * @param method - HTTP method\n * @param url - Request URL\n * @param body - Request body (optional)\n * @returns Headers object with authentication headers\n */\nexport async function generateAuthHeaders(\n organizationId: string,\n organizationSecret: string,\n method: string,\n url: string,\n body?: string\n): Promise<Record<string, string>> {\n const timestamp = Math.floor(Date.now() / 1000).toString()\n \n const signature = await generateHMACSignature(\n organizationSecret,\n organizationId,\n timestamp,\n method,\n url,\n body || ''\n )\n\n return {\n 'X-CloudSignal-Organization-ID': organizationId,\n 'X-CloudSignal-Timestamp': timestamp,\n 'X-CloudSignal-Signature': signature,\n 'Content-Type': 'application/json',\n }\n}\n\n/**\n * Make an authenticated request to CloudSignal API\n * \n * @param organizationId - Organization UUID\n * @param organizationSecret - Organization secret key\n * @param method - HTTP method\n * @param url - Request URL\n * @param body - Request body (optional)\n * @returns Fetch Response\n */\nexport async function makeAuthenticatedRequest(\n organizationId: string,\n organizationSecret: string,\n method: string,\n url: string,\n body?: Record<string, any>\n): Promise<Response> {\n const bodyStr = body ? JSON.stringify(body) : undefined\n \n const headers = await generateAuthHeaders(\n organizationId,\n organizationSecret,\n method,\n url,\n bodyStr\n )\n\n const options: RequestInit = {\n method,\n headers,\n }\n\n if (bodyStr) {\n options.body = bodyStr\n }\n\n return fetch(url, options)\n}\n\n/**\n * Validate UUID format\n * \n * @param value - String to validate\n * @returns Whether the string is a valid UUID\n */\nexport function isValidUUID(value: string | null | undefined): boolean {\n if (!value || typeof value !== 'string') return false\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value)\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} from './types'\nimport { makeAuthenticatedRequest, isValidUUID } from './utils/hmac'\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 organizationSecret: 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 organizationSecret: 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 \n private onRegistered?: (registration: Registration) => void\n private onUnregistered?: () => void\n private onError?: (error: Error) => void\n private onPermissionDenied?: () => void\n\n constructor(options: PushNotificationManagerOptions) {\n this.serviceUrl = options.serviceUrl\n this.organizationId = options.organizationId\n this.organizationSecret = options.organizationSecret\n this.serviceId = options.serviceId\n this.debug = options.debug ?? false\n this.deviceDetector = new DeviceDetector()\n \n this.onRegistered = options.onRegistered\n this.onUnregistered = options.onUnregistered\n this.onError = options.onError\n this.onPermissionDenied = options.onPermissionDenied\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 * 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 makeAuthenticatedRequest(\n this.organizationId,\n this.organizationSecret,\n 'POST',\n url,\n registrationData as any\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 makeAuthenticatedRequest(\n this.organizationId,\n this.organizationSecret,\n 'POST',\n url,\n { registration_id: this.registrationId }\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 makeAuthenticatedRequest(\n this.organizationId,\n this.organizationSecret,\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 )\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 makeAuthenticatedRequest(\n this.organizationId,\n this.organizationSecret,\n 'GET',\n url\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 */\n\nimport type { HeartbeatConfig } from './types'\nimport { makeAuthenticatedRequest, isValidUUID } from './utils/hmac'\n\nexport interface HeartbeatManagerOptions {\n serviceUrl: string\n organizationId: string\n organizationSecret: string\n config?: HeartbeatConfig\n debug?: boolean\n onHeartbeatSent?: () => void\n onHeartbeatError?: (error: Error) => void\n}\n\n/**\n * HeartbeatManager sends periodic heartbeats to track online status\n */\nexport class HeartbeatManager {\n private serviceUrl: string\n private organizationId: string\n private organizationSecret: string\n private config: Required<HeartbeatConfig>\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 visibilityHandler: (() => void) | null = null\n \n private onHeartbeatSent?: () => void\n private onHeartbeatError?: (error: Error) => void\n\n constructor(options: HeartbeatManagerOptions) {\n this.serviceUrl = options.serviceUrl\n this.organizationId = options.organizationId\n this.organizationSecret = options.organizationSecret\n this.debug = options.debug ?? false\n this.onHeartbeatSent = options.onHeartbeatSent\n this.onHeartbeatError = options.onHeartbeatError\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\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 this.log(`Starting heartbeat with interval ${this.config.interval}ms`)\n\n // Send initial heartbeat\n this.sendHeartbeat()\n\n // Set up interval\n this.intervalId = setInterval(() => {\n this.sendHeartbeat()\n }, this.config.interval)\n\n // Set up visibility handler if configured\n if (this.config.stopOnHidden) {\n this.setupVisibilityHandler()\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\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 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 * 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 makeAuthenticatedRequest(\n this.organizationId,\n this.organizationSecret,\n 'POST',\n url\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 * 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) {\n this.sendHeartbeat() // Send immediately\n this.intervalId = setInterval(() => {\n this.sendHeartbeat()\n }, this.config.interval)\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 * CloudSignalPWA - Main CloudSignal PWA SDK Entry Point\n * Integrates all managers for a unified PWA experience\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} from './types'\nimport { DeviceDetector } from './DeviceDetector'\nimport { ServiceWorkerManager } from './ServiceWorkerManager'\nimport { InstallationManager } from './InstallationManager'\nimport { PushNotificationManager } from './PushNotificationManager'\nimport { HeartbeatManager } from './HeartbeatManager'\nimport { makeAuthenticatedRequest } from './utils/hmac'\n\nconst DEFAULT_SERVICE_URL = 'https://pwa.cloudsignal.app'\nconst SDK_VERSION = '1.0.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\n // Managers\n private deviceDetector: DeviceDetector\n private serviceWorkerManager: ServiceWorkerManager\n private installationManager: InstallationManager\n private pushNotificationManager: PushNotificationManager\n private heartbeatManager: HeartbeatManager\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 // 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\n this.pushNotificationManager = new PushNotificationManager({\n serviceUrl: this.serviceUrl,\n organizationId: config.organizationId,\n organizationSecret: config.organizationSecret,\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\n this.heartbeatManager = new HeartbeatManager({\n serviceUrl: this.serviceUrl,\n organizationId: config.organizationId,\n organizationSecret: config.organizationSecret,\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 })\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 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 makeAuthenticatedRequest(\n this.config.organizationId,\n this.config.organizationSecret,\n 'POST',\n url,\n { organization_id: this.config.organizationId }\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 // 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 // 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\n window.addEventListener('offline', () => {\n this.deviceDetector.clearCache()\n this.emit('network:offline', { isOnline: false })\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]'\n console[level](`${prefix} ${message}`)\n }\n}\n\n// Export as default\nexport default CloudSignalPWA\n","/**\n * CloudSignal PWA SDK\n * Progressive Web App features with push notifications, installation management, and device tracking\n * \n * @packageDocumentation\n */\n\n// Main client\nexport { CloudSignalPWA, default } from './CloudSignalPWA'\n\n// Managers (for advanced use)\nexport { DeviceDetector, deviceDetector } from './DeviceDetector'\nexport { ServiceWorkerManager } from './ServiceWorkerManager'\nexport { InstallationManager } from './InstallationManager'\nexport { PushNotificationManager } from './PushNotificationManager'\nexport { HeartbeatManager } from './HeartbeatManager'\n\n// Utilities\nexport {\n generateHMACSignature,\n generateAuthHeaders,\n makeAuthenticatedRequest,\n isValidUUID,\n} from './utils/hmac'\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 // 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} from './types'\n\n// SDK Version\nexport const VERSION = '1.0.0'\n"]}
|