@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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../service-worker/service-worker.ts"],"names":[],"mappings":"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","file":"service-worker.js","sourcesContent":["/**\n * CloudSignal PWA Service Worker\n * Handles push notifications, badge management, and offline functionality\n */\n\n/// <reference lib=\"webworker\" />\n\ndeclare const self: ServiceWorkerGlobalScope\n\nconst CACHE_VERSION = 'v1.0.0'\nconst DB_NAME = 'CloudSignalPWA'\nconst DB_VERSION = 1\n\n// IndexedDB Store names\nconst STORES = {\n BADGE: 'badge',\n NOTIFICATIONS: 'notifications',\n USER_PREFS: 'userPreferences',\n SYNC_QUEUE: 'syncQueue',\n}\n\n// ============================================\n// IndexedDB Storage\n// ============================================\n\nclass ServiceWorkerStorage {\n private db: IDBDatabase | null = null\n\n async init(): Promise<IDBDatabase> {\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(this.db)\n }\n\n request.onupgradeneeded = (event) => {\n const db = (event.target as IDBOpenDBRequest).result\n\n if (!db.objectStoreNames.contains(STORES.BADGE)) {\n db.createObjectStore(STORES.BADGE)\n }\n\n if (!db.objectStoreNames.contains(STORES.NOTIFICATIONS)) {\n const notificationStore = db.createObjectStore(STORES.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 if (!db.objectStoreNames.contains(STORES.USER_PREFS)) {\n db.createObjectStore(STORES.USER_PREFS)\n }\n\n if (!db.objectStoreNames.contains(STORES.SYNC_QUEUE)) {\n const syncStore = db.createObjectStore(STORES.SYNC_QUEUE, {\n keyPath: 'id',\n autoIncrement: true,\n })\n syncStore.createIndex('timestamp', 'timestamp', { unique: false })\n }\n }\n })\n }\n\n private async ensureConnection(): Promise<void> {\n if (!this.db) {\n await this.init()\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 async getBadgeCount(): Promise<number> {\n await this.ensureConnection()\n const transaction = this.db!.transaction([STORES.BADGE], 'readonly')\n const store = transaction.objectStore(STORES.BADGE)\n const count = await this.promisifyRequest(store.get('count'))\n return count || 0\n }\n\n async setBadgeCount(count: number): Promise<void> {\n await this.ensureConnection()\n const transaction = this.db!.transaction([STORES.BADGE], 'readwrite')\n const store = transaction.objectStore(STORES.BADGE)\n await this.promisifyRequest(store.put(count, 'count'))\n }\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 async saveNotification(notification: Record<string, any>): Promise<number> {\n await this.ensureConnection()\n const transaction = this.db!.transaction([STORES.NOTIFICATIONS], 'readwrite')\n const store = transaction.objectStore(STORES.NOTIFICATIONS)\n\n const notificationData = {\n ...notification,\n timestamp: Date.now(),\n read: false,\n }\n\n return this.promisifyRequest(store.add(notificationData))\n }\n\n async markNotificationAsRead(notificationId: number): Promise<void> {\n await this.ensureConnection()\n const transaction = this.db!.transaction([STORES.NOTIFICATIONS], 'readwrite')\n const store = transaction.objectStore(STORES.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 async cleanOldNotifications(daysToKeep: number = 30): Promise<void> {\n await this.ensureConnection()\n const transaction = this.db!.transaction([STORES.NOTIFICATIONS], 'readwrite')\n const store = transaction.objectStore(STORES.NOTIFICATIONS)\n const index = store.index('timestamp')\n\n const cutoffTime = Date.now() - daysToKeep * 24 * 60 * 60 * 1000\n const range = IDBKeyRange.upperBound(cutoffTime)\n\n const cursor = index.openCursor(range)\n cursor.onsuccess = (event) => {\n const result = (event.target as IDBRequest).result\n if (result) {\n store.delete(result.primaryKey)\n result.continue()\n }\n }\n }\n}\n\nconst swStorage = new ServiceWorkerStorage()\n\n// ============================================\n// Badge Management\n// ============================================\n\nasync function updateBadge(count: number): Promise<void> {\n try {\n if (count <= 0) {\n await (self.navigator as any).clearAppBadge?.()\n await swStorage.setBadgeCount(0)\n } else {\n await (self.navigator as any).setAppBadge?.(count)\n await swStorage.setBadgeCount(count)\n }\n } catch (error) {\n console.log('Badge API not supported or failed:', error)\n }\n}\n\nasync function incrementBadge(): Promise<number> {\n const newCount = await swStorage.incrementBadgeCount(1)\n await updateBadge(newCount)\n return newCount\n}\n\nasync function decrementBadge(): Promise<number> {\n const newCount = await swStorage.incrementBadgeCount(-1)\n await updateBadge(newCount)\n return newCount\n}\n\n// ============================================\n// Service Worker Lifecycle Events\n// ============================================\n\nself.addEventListener('install', (event) => {\n console.log(`[CloudSignal SW] Installing service worker ${CACHE_VERSION}`)\n // Skip waiting to activate immediately\n self.skipWaiting()\n})\n\nself.addEventListener('activate', (event) => {\n console.log(`[CloudSignal SW] Activating service worker ${CACHE_VERSION}`)\n event.waitUntil(\n // Claim all clients immediately\n self.clients.claim().then(() => {\n // Clean old notifications\n return swStorage.cleanOldNotifications(30)\n })\n )\n})\n\n// ============================================\n// Push Notification Events\n// ============================================\n\nself.addEventListener('push', (event) => {\n console.log('[CloudSignal SW] Push event received')\n\n if (!event.data) {\n console.log('[CloudSignal SW] Push event has no data')\n return\n }\n\n let data: any\n\n try {\n data = event.data.json()\n } catch (e) {\n console.log('[CloudSignal SW] Failed to parse push data as JSON')\n data = {\n title: 'New Notification',\n body: event.data.text(),\n }\n }\n\n const title = data.title || 'CloudSignal'\n const options: NotificationOptions = {\n body: data.body || '',\n icon: data.icon || '/icon-192x192.png',\n badge: data.badge || '/badge-72x72.png',\n image: data.image,\n tag: data.tag || 'cloudsignal-notification',\n requireInteraction: data.requireInteraction || false,\n data: data.data || {},\n actions: data.actions || [],\n vibrate: data.vibrate,\n renotify: data.renotify || false,\n silent: data.silent || false,\n timestamp: data.timestamp || Date.now(),\n }\n\n // Handle notification URL in data\n if (data.url) {\n options.data = { ...options.data, url: data.url }\n }\n\n event.waitUntil(\n (async () => {\n // Show notification\n await self.registration.showNotification(title, options)\n\n // Increment badge count\n await incrementBadge()\n\n // Save notification to history\n await swStorage.saveNotification({\n title,\n body: options.body,\n icon: options.icon,\n tag: options.tag,\n data: options.data,\n })\n })()\n )\n})\n\n// ============================================\n// Notification Click Events\n// ============================================\n\nself.addEventListener('notificationclick', (event) => {\n console.log('[CloudSignal SW] Notification click event')\n\n const notification = event.notification\n const action = event.action\n const data = notification.data || {}\n\n // Close the notification\n notification.close()\n\n // Decrement badge count\n event.waitUntil(decrementBadge())\n\n // Handle action buttons\n if (action) {\n console.log(`[CloudSignal SW] Action clicked: ${action}`)\n // Custom action handling can be added here\n }\n\n // Determine URL to open\n const urlToOpen = data.url || '/'\n\n event.waitUntil(\n self.clients\n .matchAll({ type: 'window', includeUncontrolled: true })\n .then((windowClients) => {\n // Check if there's already a window/tab open\n for (const client of windowClients) {\n if (client.url === urlToOpen && 'focus' in client) {\n return client.focus()\n }\n }\n\n // If no existing window, open a new one\n if (self.clients.openWindow) {\n return self.clients.openWindow(urlToOpen)\n }\n })\n )\n})\n\n// ============================================\n// Notification Close Events\n// ============================================\n\nself.addEventListener('notificationclose', (event) => {\n console.log('[CloudSignal SW] Notification closed without click')\n // Optionally track notification dismissals\n})\n\n// ============================================\n// Message Events (from main thread)\n// ============================================\n\nself.addEventListener('message', (event) => {\n console.log('[CloudSignal SW] Message received:', event.data)\n\n const { type, count } = event.data\n\n switch (type) {\n case 'SKIP_WAITING':\n self.skipWaiting()\n break\n\n case 'CLEAR_BADGE':\n event.waitUntil(updateBadge(0))\n break\n\n case 'SET_BADGE':\n if (typeof count === 'number') {\n event.waitUntil(updateBadge(count))\n }\n break\n\n case 'GET_BADGE_COUNT':\n event.waitUntil(\n swStorage.getBadgeCount().then((badgeCount) => {\n event.ports?.[0]?.postMessage({ count: badgeCount })\n })\n )\n break\n\n case 'SYNC_BADGE':\n // Sync badge count with actual notifications\n event.waitUntil(\n self.registration.getNotifications().then(async (notifications) => {\n await updateBadge(notifications.length)\n })\n )\n break\n }\n})\n\n// ============================================\n// Sync Events (Background Sync)\n// ============================================\n\nself.addEventListener('sync', (event) => {\n console.log('[CloudSignal SW] Sync event:', event.tag)\n\n if (event.tag === 'cloudsignal-sync') {\n // Handle background sync\n event.waitUntil(\n // Add sync logic here\n Promise.resolve()\n )\n }\n})\n\n// ============================================\n// Periodic Sync Events\n// ============================================\n\nself.addEventListener('periodicsync', (event: any) => {\n console.log('[CloudSignal SW] Periodic sync event:', event.tag)\n\n if (event.tag === 'cloudsignal-periodic') {\n event.waitUntil(\n // Add periodic sync logic here\n swStorage.cleanOldNotifications(30)\n )\n }\n})\n\nconsole.log(`[CloudSignal SW] Service worker loaded ${CACHE_VERSION}`)\n"]}
package/package.json ADDED
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "@cloudsignal/pwa-sdk",
3
+ "version": "1.0.0",
4
+ "description": "CloudSignal PWA SDK - Progressive Web App features with push notifications, installation management, and device tracking",
5
+ "main": "dist/index.cjs",
6
+ "module": "dist/index.js",
7
+ "browser": "dist/index.global.js",
8
+ "types": "dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "browser": {
13
+ "import": "./dist/index.js",
14
+ "require": "./dist/index.cjs"
15
+ },
16
+ "import": "./dist/index.js",
17
+ "require": "./dist/index.cjs",
18
+ "default": "./dist/index.js"
19
+ },
20
+ "./browser": "./dist/index.global.js",
21
+ "./service-worker": "./dist/service-worker.js"
22
+ },
23
+ "files": [
24
+ "dist/",
25
+ "README.md",
26
+ "CHANGELOG.md"
27
+ ],
28
+ "sideEffects": false,
29
+ "scripts": {
30
+ "build": "tsup",
31
+ "build:watch": "tsup --watch",
32
+ "typecheck": "tsc --noEmit",
33
+ "clean": "rm -rf dist",
34
+ "prepublishOnly": "npm run clean && npm run build",
35
+ "test": "vitest run",
36
+ "test:watch": "vitest"
37
+ },
38
+ "keywords": [
39
+ "pwa",
40
+ "progressive-web-app",
41
+ "push-notifications",
42
+ "service-worker",
43
+ "cloudsignal",
44
+ "web-push",
45
+ "install-prompt",
46
+ "offline",
47
+ "typescript"
48
+ ],
49
+ "author": "CloudSignal",
50
+ "license": "MIT",
51
+ "repository": {
52
+ "type": "git",
53
+ "url": "https://github.com/cloudsignal/vernemq-service.git",
54
+ "directory": "cloudsignal-pwa-sdk"
55
+ },
56
+ "bugs": {
57
+ "url": "https://github.com/cloudsignal/vernemq-service/issues"
58
+ },
59
+ "homepage": "https://cloudsignal.io",
60
+ "publishConfig": {
61
+ "access": "public"
62
+ },
63
+ "engines": {
64
+ "node": ">=16.0.0"
65
+ },
66
+ "devDependencies": {
67
+ "@types/node": "^20.0.0",
68
+ "tsup": "^8.0.0",
69
+ "typescript": "^5.0.0",
70
+ "vitest": "^1.0.0"
71
+ }
72
+ }