vibe-message 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/README.md ADDED
@@ -0,0 +1,167 @@
1
+ # Vibe Message SDK
2
+
3
+ Lightweight JavaScript SDK for web push notifications - A modern Firebase Cloud Messaging alternative.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install vibe-message
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ### 1. Create a Service Worker
14
+
15
+ Create a file `public/push-sw.js`:
16
+
17
+ ```javascript
18
+ self.addEventListener('push', (event) => {
19
+ const data = event.data ? event.data.json() : {};
20
+
21
+ if (data.silent) {
22
+ // Handle silent notification
23
+ return;
24
+ }
25
+
26
+ const title = data.title || 'Notification';
27
+ const options = {
28
+ body: data.body,
29
+ icon: data.icon,
30
+ image: data.image,
31
+ data: { click_action: data.click_action }
32
+ };
33
+
34
+ event.waitUntil(
35
+ self.registration.showNotification(title, options)
36
+ );
37
+ });
38
+
39
+ self.addEventListener('notificationclick', (event) => {
40
+ event.notification.close();
41
+ const url = event.notification.data?.click_action || '/';
42
+ event.waitUntil(clients.openWindow(url));
43
+ });
44
+ ```
45
+
46
+ ### 2. Initialize SDK
47
+
48
+ ```javascript
49
+ import { initNotificationClient } from 'vibe-message';
50
+
51
+ const client = initNotificationClient({
52
+ baseUrl: 'https://your-backend.com/api',
53
+ appId: 'your-app-id',
54
+ publicKey: 'your-public-key'
55
+ });
56
+ ```
57
+
58
+ ### 3. Register Device
59
+
60
+ ```javascript
61
+ // When user logs in
62
+ await client.registerDevice({
63
+ externalUserId: 'user-123',
64
+ serviceWorkerPath: '/push-sw.js' // optional, defaults to '/push-sw.js'
65
+ });
66
+ ```
67
+
68
+ ### 4. Listen for Messages
69
+
70
+ ```javascript
71
+ // Foreground messages (when app is visible)
72
+ client.onMessage((payload) => {
73
+ console.log('Message received:', payload);
74
+ // Show in-app notification
75
+ });
76
+
77
+ // Background messages (when notification is clicked)
78
+ client.onBackgroundMessage((payload) => {
79
+ console.log('Notification clicked:', payload);
80
+ });
81
+
82
+ // Silent messages (no UI)
83
+ client.onSilentMessage((data) => {
84
+ console.log('Silent message:', data);
85
+ });
86
+ ```
87
+
88
+ ### 5. Unregister Device
89
+
90
+ ```javascript
91
+ // When user logs out
92
+ await client.unregisterDevice('user-123');
93
+ ```
94
+
95
+ ## API Reference
96
+
97
+ ### `initNotificationClient(options)`
98
+
99
+ Initialize the notification client.
100
+
101
+ **Parameters:**
102
+ - `options.baseUrl` (string): Base URL of your backend API
103
+ - `options.appId` (string): Your app ID from the admin panel
104
+ - `options.publicKey` (string): Your app's public key
105
+
106
+ **Returns:** `NotificationClient`
107
+
108
+ ### `client.registerDevice(options)`
109
+
110
+ Register a device for push notifications.
111
+
112
+ **Parameters:**
113
+ - `options.externalUserId` (string): Your app's user ID
114
+ - `options.serviceWorkerPath` (string, optional): Path to service worker file
115
+
116
+ **Returns:** `Promise<void>`
117
+
118
+ ### `client.unregisterDevice(externalUserId)`
119
+
120
+ Unregister a device from push notifications.
121
+
122
+ **Parameters:**
123
+ - `externalUserId` (string): Your app's user ID
124
+
125
+ **Returns:** `Promise<void>`
126
+
127
+ ### `client.onMessage(callback)`
128
+
129
+ Register a callback for foreground messages.
130
+
131
+ **Parameters:**
132
+ - `callback` (function): Function to handle message payload
133
+
134
+ ### `client.onBackgroundMessage(callback)`
135
+
136
+ Register a callback for background messages (notification clicks).
137
+
138
+ **Parameters:**
139
+ - `callback` (function): Function to handle message payload
140
+
141
+ ### `client.onSilentMessage(callback)`
142
+
143
+ Register a callback for silent messages.
144
+
145
+ **Parameters:**
146
+ - `callback` (function): Function to handle message data
147
+
148
+ ## Features
149
+
150
+ - 🚀 **Lightweight** - Minimal dependencies, small bundle size
151
+ - 🔒 **Secure** - VAPID authentication, encrypted push
152
+ - 📱 **Cross-platform** - Works on all modern browsers
153
+ - 🎯 **Type-safe** - Full TypeScript support
154
+ - 🔄 **Background sync** - Receive notifications when app is closed
155
+ - 🎨 **Customizable** - Full control over notification appearance
156
+
157
+ ## Browser Support
158
+
159
+ - Chrome/Edge 50+
160
+ - Firefox 44+
161
+ - Safari 16+ (macOS 13+, iOS 16.4+)
162
+ - Opera 37+
163
+
164
+ ## License
165
+
166
+ MIT
167
+
@@ -0,0 +1,45 @@
1
+ import { InitOptions, RegisterDeviceOptions, MessageCallback, SilentMessageCallback } from './types';
2
+ export declare class NotificationClient {
3
+ private baseUrl;
4
+ private appId;
5
+ private publicKey;
6
+ private vapidPublicKey;
7
+ private messageCallback;
8
+ private backgroundMessageCallback;
9
+ private silentMessageCallback;
10
+ constructor(options: InitOptions);
11
+ /**
12
+ * Set up listener for messages from service worker
13
+ */
14
+ private setupMessageListener;
15
+ /**
16
+ * Register callback for foreground messages (when app is visible)
17
+ */
18
+ onMessage(callback: MessageCallback): void;
19
+ /**
20
+ * Register callback for background messages (when app is not visible)
21
+ */
22
+ onBackgroundMessage(callback: MessageCallback): void;
23
+ /**
24
+ * Register callback for silent messages (no UI notification)
25
+ */
26
+ onSilentMessage(callback: SilentMessageCallback): void;
27
+ /**
28
+ * Get VAPID public key from server
29
+ */
30
+ private getVapidPublicKey;
31
+ /**
32
+ * Convert base64 string to Uint8Array for VAPID key
33
+ */
34
+ private urlBase64ToUint8Array;
35
+ /**
36
+ * Register service worker and subscribe to push notifications
37
+ */
38
+ registerDevice(options: RegisterDeviceOptions): Promise<void>;
39
+ /**
40
+ * Unregister device from push notifications
41
+ */
42
+ unregisterDevice(externalUserId: string): Promise<void>;
43
+ }
44
+ export declare function initNotificationClient(options: InitOptions): NotificationClient;
45
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,qBAAqB,EAErB,eAAe,EACf,qBAAqB,EAGtB,MAAM,SAAS,CAAC;AAEjB,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,cAAc,CAAuB;IAG7C,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,yBAAyB,CAAgC;IACjE,OAAO,CAAC,qBAAqB,CAAsC;gBAEvD,OAAO,EAAE,WAAW;IAShC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA0B5B;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI;IAI1C;;OAEG;IACH,mBAAmB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI;IAIpD;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,qBAAqB,GAAG,IAAI;IAItD;;OAEG;YACW,iBAAiB;IAgB/B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAe7B;;OAEG;IACG,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IA6DnE;;OAEG;IACG,gBAAgB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CA2B9D;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,WAAW,GAAG,kBAAkB,CAE/E"}
@@ -0,0 +1,3 @@
1
+ export { NotificationClient, initNotificationClient } from './client';
2
+ export type { InitOptions, RegisterDeviceOptions, PushSubscription } from './types';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AACtE,YAAY,EAAE,WAAW,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,214 @@
1
+ /******************************************************************************
2
+ Copyright (c) Microsoft Corporation.
3
+
4
+ Permission to use, copy, modify, and/or distribute this software for any
5
+ purpose with or without fee is hereby granted.
6
+
7
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
8
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
9
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
10
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
11
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
12
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
13
+ PERFORMANCE OF THIS SOFTWARE.
14
+ ***************************************************************************** */
15
+ /* global Reflect, Promise, SuppressedError, Symbol, Iterator */
16
+
17
+
18
+ function __awaiter(thisArg, _arguments, P, generator) {
19
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
20
+ return new (P || (P = Promise))(function (resolve, reject) {
21
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
22
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
23
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
24
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
25
+ });
26
+ }
27
+
28
+ typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
29
+ var e = new Error(message);
30
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
31
+ };
32
+
33
+ class NotificationClient {
34
+ constructor(options) {
35
+ this.vapidPublicKey = null;
36
+ // Callback handlers
37
+ this.messageCallback = null;
38
+ this.backgroundMessageCallback = null;
39
+ this.silentMessageCallback = null;
40
+ this.baseUrl = options.baseUrl;
41
+ this.appId = options.appId;
42
+ this.publicKey = options.publicKey;
43
+ // Set up service worker message listener
44
+ this.setupMessageListener();
45
+ }
46
+ /**
47
+ * Set up listener for messages from service worker
48
+ */
49
+ setupMessageListener() {
50
+ if ('serviceWorker' in navigator) {
51
+ navigator.serviceWorker.addEventListener('message', (event) => {
52
+ const message = event.data;
53
+ switch (message.type) {
54
+ case 'FOREGROUND_MESSAGE':
55
+ if (this.messageCallback) {
56
+ this.messageCallback(message.payload);
57
+ }
58
+ break;
59
+ case 'BACKGROUND_MESSAGE':
60
+ if (this.backgroundMessageCallback) {
61
+ this.backgroundMessageCallback(message.payload);
62
+ }
63
+ break;
64
+ case 'SILENT_MESSAGE':
65
+ if (this.silentMessageCallback) {
66
+ this.silentMessageCallback(message.data);
67
+ }
68
+ break;
69
+ }
70
+ });
71
+ }
72
+ }
73
+ /**
74
+ * Register callback for foreground messages (when app is visible)
75
+ */
76
+ onMessage(callback) {
77
+ this.messageCallback = callback;
78
+ }
79
+ /**
80
+ * Register callback for background messages (when app is not visible)
81
+ */
82
+ onBackgroundMessage(callback) {
83
+ this.backgroundMessageCallback = callback;
84
+ }
85
+ /**
86
+ * Register callback for silent messages (no UI notification)
87
+ */
88
+ onSilentMessage(callback) {
89
+ this.silentMessageCallback = callback;
90
+ }
91
+ /**
92
+ * Get VAPID public key from server
93
+ */
94
+ getVapidPublicKey() {
95
+ return __awaiter(this, void 0, void 0, function* () {
96
+ var _a;
97
+ if (this.vapidPublicKey) {
98
+ return this.vapidPublicKey;
99
+ }
100
+ const response = yield fetch(`${this.baseUrl}/sdk/vapid-public-key`);
101
+ const data = yield response.json();
102
+ if (!data.success || !((_a = data.data) === null || _a === void 0 ? void 0 : _a.publicKey)) {
103
+ throw new Error('Failed to get VAPID public key');
104
+ }
105
+ this.vapidPublicKey = data.data.publicKey;
106
+ return this.vapidPublicKey;
107
+ });
108
+ }
109
+ /**
110
+ * Convert base64 string to Uint8Array for VAPID key
111
+ */
112
+ urlBase64ToUint8Array(base64String) {
113
+ const padding = '='.repeat((4 - (base64String.length % 4)) % 4);
114
+ const base64 = (base64String + padding)
115
+ .replace(/\-/g, '+')
116
+ .replace(/_/g, '/');
117
+ const rawData = window.atob(base64);
118
+ const outputArray = new Uint8Array(rawData.length);
119
+ for (let i = 0; i < rawData.length; ++i) {
120
+ outputArray[i] = rawData.charCodeAt(i);
121
+ }
122
+ return outputArray;
123
+ }
124
+ /**
125
+ * Register service worker and subscribe to push notifications
126
+ */
127
+ registerDevice(options) {
128
+ return __awaiter(this, void 0, void 0, function* () {
129
+ if (!('serviceWorker' in navigator)) {
130
+ throw new Error('Service workers are not supported in this browser');
131
+ }
132
+ if (!('PushManager' in window)) {
133
+ throw new Error('Push notifications are not supported in this browser');
134
+ }
135
+ // Request notification permission
136
+ const permission = yield Notification.requestPermission();
137
+ if (permission !== 'granted') {
138
+ throw new Error('Notification permission denied');
139
+ }
140
+ // Register service worker
141
+ const swPath = options.serviceWorkerPath || '/push-sw.js';
142
+ const registration = yield navigator.serviceWorker.register(swPath);
143
+ // Wait for service worker to be ready
144
+ yield navigator.serviceWorker.ready;
145
+ // Get VAPID public key
146
+ const vapidPublicKey = yield this.getVapidPublicKey();
147
+ // Subscribe to push notifications
148
+ const subscription = yield registration.pushManager.subscribe({
149
+ userVisibleOnly: true,
150
+ applicationServerKey: this.urlBase64ToUint8Array(vapidPublicKey),
151
+ });
152
+ // Convert subscription to plain object
153
+ const subscriptionObject = {
154
+ endpoint: subscription.endpoint,
155
+ keys: {
156
+ p256dh: btoa(String.fromCharCode(...new Uint8Array(subscription.getKey('p256dh')))),
157
+ auth: btoa(String.fromCharCode(...new Uint8Array(subscription.getKey('auth')))),
158
+ },
159
+ };
160
+ // Register device with backend
161
+ const response = yield fetch(`${this.baseUrl}/sdk/register-device`, {
162
+ method: 'POST',
163
+ headers: {
164
+ 'Content-Type': 'application/json',
165
+ },
166
+ body: JSON.stringify({
167
+ appId: this.appId,
168
+ publicKey: this.publicKey,
169
+ externalUserId: options.externalUserId,
170
+ subscription: subscriptionObject,
171
+ }),
172
+ });
173
+ const data = yield response.json();
174
+ if (!data.success) {
175
+ throw new Error(data.message || 'Failed to register device');
176
+ }
177
+ });
178
+ }
179
+ /**
180
+ * Unregister device from push notifications
181
+ */
182
+ unregisterDevice(externalUserId) {
183
+ return __awaiter(this, void 0, void 0, function* () {
184
+ const response = yield fetch(`${this.baseUrl}/sdk/unregister-device`, {
185
+ method: 'POST',
186
+ headers: {
187
+ 'Content-Type': 'application/json',
188
+ },
189
+ body: JSON.stringify({
190
+ appId: this.appId,
191
+ externalUserId,
192
+ }),
193
+ });
194
+ const data = yield response.json();
195
+ if (!data.success) {
196
+ throw new Error(data.message || 'Failed to unregister device');
197
+ }
198
+ // Unsubscribe from push manager
199
+ if ('serviceWorker' in navigator) {
200
+ const registration = yield navigator.serviceWorker.ready;
201
+ const subscription = yield registration.pushManager.getSubscription();
202
+ if (subscription) {
203
+ yield subscription.unsubscribe();
204
+ }
205
+ }
206
+ });
207
+ }
208
+ }
209
+ function initNotificationClient(options) {
210
+ return new NotificationClient(options);
211
+ }
212
+
213
+ export { NotificationClient, initNotificationClient };
214
+ //# sourceMappingURL=index.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.esm.js","sources":["../node_modules/tslib/tslib.es6.js","../src/client.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","import {\r\n InitOptions,\r\n RegisterDeviceOptions,\r\n PushSubscription,\r\n MessageCallback,\r\n SilentMessageCallback,\r\n ServiceWorkerMessage,\r\n NotificationPayload,\r\n} from './types';\r\n\r\nexport class NotificationClient {\r\n private baseUrl: string;\r\n private appId: string;\r\n private publicKey: string;\r\n private vapidPublicKey: string | null = null;\r\n\r\n // Callback handlers\r\n private messageCallback: MessageCallback | null = null;\r\n private backgroundMessageCallback: MessageCallback | null = null;\r\n private silentMessageCallback: SilentMessageCallback | null = null;\r\n\r\n constructor(options: InitOptions) {\r\n this.baseUrl = options.baseUrl;\r\n this.appId = options.appId;\r\n this.publicKey = options.publicKey;\r\n\r\n // Set up service worker message listener\r\n this.setupMessageListener();\r\n }\r\n\r\n /**\r\n * Set up listener for messages from service worker\r\n */\r\n private setupMessageListener(): void {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.addEventListener('message', (event) => {\r\n const message: ServiceWorkerMessage = event.data;\r\n\r\n switch (message.type) {\r\n case 'FOREGROUND_MESSAGE':\r\n if (this.messageCallback) {\r\n this.messageCallback(message.payload);\r\n }\r\n break;\r\n case 'BACKGROUND_MESSAGE':\r\n if (this.backgroundMessageCallback) {\r\n this.backgroundMessageCallback(message.payload);\r\n }\r\n break;\r\n case 'SILENT_MESSAGE':\r\n if (this.silentMessageCallback) {\r\n this.silentMessageCallback(message.data);\r\n }\r\n break;\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Register callback for foreground messages (when app is visible)\r\n */\r\n onMessage(callback: MessageCallback): void {\r\n this.messageCallback = callback;\r\n }\r\n\r\n /**\r\n * Register callback for background messages (when app is not visible)\r\n */\r\n onBackgroundMessage(callback: MessageCallback): void {\r\n this.backgroundMessageCallback = callback;\r\n }\r\n\r\n /**\r\n * Register callback for silent messages (no UI notification)\r\n */\r\n onSilentMessage(callback: SilentMessageCallback): void {\r\n this.silentMessageCallback = callback;\r\n }\r\n\r\n /**\r\n * Get VAPID public key from server\r\n */\r\n private async getVapidPublicKey(): Promise<string> {\r\n if (this.vapidPublicKey) {\r\n return this.vapidPublicKey;\r\n }\r\n\r\n const response = await fetch(`${this.baseUrl}/sdk/vapid-public-key`);\r\n const data = await response.json();\r\n\r\n if (!data.success || !data.data?.publicKey) {\r\n throw new Error('Failed to get VAPID public key');\r\n }\r\n\r\n this.vapidPublicKey = data.data.publicKey;\r\n return this.vapidPublicKey!;\r\n }\r\n\r\n /**\r\n * Convert base64 string to Uint8Array for VAPID key\r\n */\r\n private urlBase64ToUint8Array(base64String: string): Uint8Array {\r\n const padding = '='.repeat((4 - (base64String.length % 4)) % 4);\r\n const base64 = (base64String + padding)\r\n .replace(/\\-/g, '+')\r\n .replace(/_/g, '/');\r\n\r\n const rawData = window.atob(base64);\r\n const outputArray = new Uint8Array(rawData.length);\r\n\r\n for (let i = 0; i < rawData.length; ++i) {\r\n outputArray[i] = rawData.charCodeAt(i);\r\n }\r\n return outputArray;\r\n }\r\n\r\n /**\r\n * Register service worker and subscribe to push notifications\r\n */\r\n async registerDevice(options: RegisterDeviceOptions): Promise<void> {\r\n if (!('serviceWorker' in navigator)) {\r\n throw new Error('Service workers are not supported in this browser');\r\n }\r\n\r\n if (!('PushManager' in window)) {\r\n throw new Error('Push notifications are not supported in this browser');\r\n }\r\n\r\n // Request notification permission\r\n const permission = await Notification.requestPermission();\r\n if (permission !== 'granted') {\r\n throw new Error('Notification permission denied');\r\n }\r\n\r\n // Register service worker\r\n const swPath = options.serviceWorkerPath || '/push-sw.js';\r\n const registration = await navigator.serviceWorker.register(swPath);\r\n\r\n // Wait for service worker to be ready\r\n await navigator.serviceWorker.ready;\r\n\r\n // Get VAPID public key\r\n const vapidPublicKey = await this.getVapidPublicKey();\r\n\r\n // Subscribe to push notifications\r\n const subscription = await registration.pushManager.subscribe({\r\n userVisibleOnly: true,\r\n applicationServerKey: this.urlBase64ToUint8Array(vapidPublicKey),\r\n });\r\n\r\n // Convert subscription to plain object\r\n const subscriptionObject: PushSubscription = {\r\n endpoint: subscription.endpoint,\r\n keys: {\r\n p256dh: btoa(String.fromCharCode(...new Uint8Array(subscription.getKey('p256dh')!))),\r\n auth: btoa(String.fromCharCode(...new Uint8Array(subscription.getKey('auth')!))),\r\n },\r\n };\r\n\r\n // Register device with backend\r\n const response = await fetch(`${this.baseUrl}/sdk/register-device`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({\r\n appId: this.appId,\r\n publicKey: this.publicKey,\r\n externalUserId: options.externalUserId,\r\n subscription: subscriptionObject,\r\n }),\r\n });\r\n\r\n const data = await response.json();\r\n\r\n if (!data.success) {\r\n throw new Error(data.message || 'Failed to register device');\r\n }\r\n }\r\n\r\n /**\r\n * Unregister device from push notifications\r\n */\r\n async unregisterDevice(externalUserId: string): Promise<void> {\r\n const response = await fetch(`${this.baseUrl}/sdk/unregister-device`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({\r\n appId: this.appId,\r\n externalUserId,\r\n }),\r\n });\r\n\r\n const data = await response.json();\r\n\r\n if (!data.success) {\r\n throw new Error(data.message || 'Failed to unregister device');\r\n }\r\n\r\n // Unsubscribe from push manager\r\n if ('serviceWorker' in navigator) {\r\n const registration = await navigator.serviceWorker.ready;\r\n const subscription = await registration.pushManager.getSubscription();\r\n if (subscription) {\r\n await subscription.unsubscribe();\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport function initNotificationClient(options: InitOptions): NotificationClient {\r\n return new NotificationClient(options);\r\n}\r\n"],"names":[],"mappings":"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","x_google_ignoreList":[0]}
package/dist/index.js ADDED
@@ -0,0 +1,217 @@
1
+ 'use strict';
2
+
3
+ /******************************************************************************
4
+ Copyright (c) Microsoft Corporation.
5
+
6
+ Permission to use, copy, modify, and/or distribute this software for any
7
+ purpose with or without fee is hereby granted.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
10
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
12
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
14
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15
+ PERFORMANCE OF THIS SOFTWARE.
16
+ ***************************************************************************** */
17
+ /* global Reflect, Promise, SuppressedError, Symbol, Iterator */
18
+
19
+
20
+ function __awaiter(thisArg, _arguments, P, generator) {
21
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
22
+ return new (P || (P = Promise))(function (resolve, reject) {
23
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
24
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
25
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
26
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
27
+ });
28
+ }
29
+
30
+ typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
31
+ var e = new Error(message);
32
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
33
+ };
34
+
35
+ class NotificationClient {
36
+ constructor(options) {
37
+ this.vapidPublicKey = null;
38
+ // Callback handlers
39
+ this.messageCallback = null;
40
+ this.backgroundMessageCallback = null;
41
+ this.silentMessageCallback = null;
42
+ this.baseUrl = options.baseUrl;
43
+ this.appId = options.appId;
44
+ this.publicKey = options.publicKey;
45
+ // Set up service worker message listener
46
+ this.setupMessageListener();
47
+ }
48
+ /**
49
+ * Set up listener for messages from service worker
50
+ */
51
+ setupMessageListener() {
52
+ if ('serviceWorker' in navigator) {
53
+ navigator.serviceWorker.addEventListener('message', (event) => {
54
+ const message = event.data;
55
+ switch (message.type) {
56
+ case 'FOREGROUND_MESSAGE':
57
+ if (this.messageCallback) {
58
+ this.messageCallback(message.payload);
59
+ }
60
+ break;
61
+ case 'BACKGROUND_MESSAGE':
62
+ if (this.backgroundMessageCallback) {
63
+ this.backgroundMessageCallback(message.payload);
64
+ }
65
+ break;
66
+ case 'SILENT_MESSAGE':
67
+ if (this.silentMessageCallback) {
68
+ this.silentMessageCallback(message.data);
69
+ }
70
+ break;
71
+ }
72
+ });
73
+ }
74
+ }
75
+ /**
76
+ * Register callback for foreground messages (when app is visible)
77
+ */
78
+ onMessage(callback) {
79
+ this.messageCallback = callback;
80
+ }
81
+ /**
82
+ * Register callback for background messages (when app is not visible)
83
+ */
84
+ onBackgroundMessage(callback) {
85
+ this.backgroundMessageCallback = callback;
86
+ }
87
+ /**
88
+ * Register callback for silent messages (no UI notification)
89
+ */
90
+ onSilentMessage(callback) {
91
+ this.silentMessageCallback = callback;
92
+ }
93
+ /**
94
+ * Get VAPID public key from server
95
+ */
96
+ getVapidPublicKey() {
97
+ return __awaiter(this, void 0, void 0, function* () {
98
+ var _a;
99
+ if (this.vapidPublicKey) {
100
+ return this.vapidPublicKey;
101
+ }
102
+ const response = yield fetch(`${this.baseUrl}/sdk/vapid-public-key`);
103
+ const data = yield response.json();
104
+ if (!data.success || !((_a = data.data) === null || _a === void 0 ? void 0 : _a.publicKey)) {
105
+ throw new Error('Failed to get VAPID public key');
106
+ }
107
+ this.vapidPublicKey = data.data.publicKey;
108
+ return this.vapidPublicKey;
109
+ });
110
+ }
111
+ /**
112
+ * Convert base64 string to Uint8Array for VAPID key
113
+ */
114
+ urlBase64ToUint8Array(base64String) {
115
+ const padding = '='.repeat((4 - (base64String.length % 4)) % 4);
116
+ const base64 = (base64String + padding)
117
+ .replace(/\-/g, '+')
118
+ .replace(/_/g, '/');
119
+ const rawData = window.atob(base64);
120
+ const outputArray = new Uint8Array(rawData.length);
121
+ for (let i = 0; i < rawData.length; ++i) {
122
+ outputArray[i] = rawData.charCodeAt(i);
123
+ }
124
+ return outputArray;
125
+ }
126
+ /**
127
+ * Register service worker and subscribe to push notifications
128
+ */
129
+ registerDevice(options) {
130
+ return __awaiter(this, void 0, void 0, function* () {
131
+ if (!('serviceWorker' in navigator)) {
132
+ throw new Error('Service workers are not supported in this browser');
133
+ }
134
+ if (!('PushManager' in window)) {
135
+ throw new Error('Push notifications are not supported in this browser');
136
+ }
137
+ // Request notification permission
138
+ const permission = yield Notification.requestPermission();
139
+ if (permission !== 'granted') {
140
+ throw new Error('Notification permission denied');
141
+ }
142
+ // Register service worker
143
+ const swPath = options.serviceWorkerPath || '/push-sw.js';
144
+ const registration = yield navigator.serviceWorker.register(swPath);
145
+ // Wait for service worker to be ready
146
+ yield navigator.serviceWorker.ready;
147
+ // Get VAPID public key
148
+ const vapidPublicKey = yield this.getVapidPublicKey();
149
+ // Subscribe to push notifications
150
+ const subscription = yield registration.pushManager.subscribe({
151
+ userVisibleOnly: true,
152
+ applicationServerKey: this.urlBase64ToUint8Array(vapidPublicKey),
153
+ });
154
+ // Convert subscription to plain object
155
+ const subscriptionObject = {
156
+ endpoint: subscription.endpoint,
157
+ keys: {
158
+ p256dh: btoa(String.fromCharCode(...new Uint8Array(subscription.getKey('p256dh')))),
159
+ auth: btoa(String.fromCharCode(...new Uint8Array(subscription.getKey('auth')))),
160
+ },
161
+ };
162
+ // Register device with backend
163
+ const response = yield fetch(`${this.baseUrl}/sdk/register-device`, {
164
+ method: 'POST',
165
+ headers: {
166
+ 'Content-Type': 'application/json',
167
+ },
168
+ body: JSON.stringify({
169
+ appId: this.appId,
170
+ publicKey: this.publicKey,
171
+ externalUserId: options.externalUserId,
172
+ subscription: subscriptionObject,
173
+ }),
174
+ });
175
+ const data = yield response.json();
176
+ if (!data.success) {
177
+ throw new Error(data.message || 'Failed to register device');
178
+ }
179
+ });
180
+ }
181
+ /**
182
+ * Unregister device from push notifications
183
+ */
184
+ unregisterDevice(externalUserId) {
185
+ return __awaiter(this, void 0, void 0, function* () {
186
+ const response = yield fetch(`${this.baseUrl}/sdk/unregister-device`, {
187
+ method: 'POST',
188
+ headers: {
189
+ 'Content-Type': 'application/json',
190
+ },
191
+ body: JSON.stringify({
192
+ appId: this.appId,
193
+ externalUserId,
194
+ }),
195
+ });
196
+ const data = yield response.json();
197
+ if (!data.success) {
198
+ throw new Error(data.message || 'Failed to unregister device');
199
+ }
200
+ // Unsubscribe from push manager
201
+ if ('serviceWorker' in navigator) {
202
+ const registration = yield navigator.serviceWorker.ready;
203
+ const subscription = yield registration.pushManager.getSubscription();
204
+ if (subscription) {
205
+ yield subscription.unsubscribe();
206
+ }
207
+ }
208
+ });
209
+ }
210
+ }
211
+ function initNotificationClient(options) {
212
+ return new NotificationClient(options);
213
+ }
214
+
215
+ exports.NotificationClient = NotificationClient;
216
+ exports.initNotificationClient = initNotificationClient;
217
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../node_modules/tslib/tslib.es6.js","../src/client.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","import {\r\n InitOptions,\r\n RegisterDeviceOptions,\r\n PushSubscription,\r\n MessageCallback,\r\n SilentMessageCallback,\r\n ServiceWorkerMessage,\r\n NotificationPayload,\r\n} from './types';\r\n\r\nexport class NotificationClient {\r\n private baseUrl: string;\r\n private appId: string;\r\n private publicKey: string;\r\n private vapidPublicKey: string | null = null;\r\n\r\n // Callback handlers\r\n private messageCallback: MessageCallback | null = null;\r\n private backgroundMessageCallback: MessageCallback | null = null;\r\n private silentMessageCallback: SilentMessageCallback | null = null;\r\n\r\n constructor(options: InitOptions) {\r\n this.baseUrl = options.baseUrl;\r\n this.appId = options.appId;\r\n this.publicKey = options.publicKey;\r\n\r\n // Set up service worker message listener\r\n this.setupMessageListener();\r\n }\r\n\r\n /**\r\n * Set up listener for messages from service worker\r\n */\r\n private setupMessageListener(): void {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.addEventListener('message', (event) => {\r\n const message: ServiceWorkerMessage = event.data;\r\n\r\n switch (message.type) {\r\n case 'FOREGROUND_MESSAGE':\r\n if (this.messageCallback) {\r\n this.messageCallback(message.payload);\r\n }\r\n break;\r\n case 'BACKGROUND_MESSAGE':\r\n if (this.backgroundMessageCallback) {\r\n this.backgroundMessageCallback(message.payload);\r\n }\r\n break;\r\n case 'SILENT_MESSAGE':\r\n if (this.silentMessageCallback) {\r\n this.silentMessageCallback(message.data);\r\n }\r\n break;\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Register callback for foreground messages (when app is visible)\r\n */\r\n onMessage(callback: MessageCallback): void {\r\n this.messageCallback = callback;\r\n }\r\n\r\n /**\r\n * Register callback for background messages (when app is not visible)\r\n */\r\n onBackgroundMessage(callback: MessageCallback): void {\r\n this.backgroundMessageCallback = callback;\r\n }\r\n\r\n /**\r\n * Register callback for silent messages (no UI notification)\r\n */\r\n onSilentMessage(callback: SilentMessageCallback): void {\r\n this.silentMessageCallback = callback;\r\n }\r\n\r\n /**\r\n * Get VAPID public key from server\r\n */\r\n private async getVapidPublicKey(): Promise<string> {\r\n if (this.vapidPublicKey) {\r\n return this.vapidPublicKey;\r\n }\r\n\r\n const response = await fetch(`${this.baseUrl}/sdk/vapid-public-key`);\r\n const data = await response.json();\r\n\r\n if (!data.success || !data.data?.publicKey) {\r\n throw new Error('Failed to get VAPID public key');\r\n }\r\n\r\n this.vapidPublicKey = data.data.publicKey;\r\n return this.vapidPublicKey!;\r\n }\r\n\r\n /**\r\n * Convert base64 string to Uint8Array for VAPID key\r\n */\r\n private urlBase64ToUint8Array(base64String: string): Uint8Array {\r\n const padding = '='.repeat((4 - (base64String.length % 4)) % 4);\r\n const base64 = (base64String + padding)\r\n .replace(/\\-/g, '+')\r\n .replace(/_/g, '/');\r\n\r\n const rawData = window.atob(base64);\r\n const outputArray = new Uint8Array(rawData.length);\r\n\r\n for (let i = 0; i < rawData.length; ++i) {\r\n outputArray[i] = rawData.charCodeAt(i);\r\n }\r\n return outputArray;\r\n }\r\n\r\n /**\r\n * Register service worker and subscribe to push notifications\r\n */\r\n async registerDevice(options: RegisterDeviceOptions): Promise<void> {\r\n if (!('serviceWorker' in navigator)) {\r\n throw new Error('Service workers are not supported in this browser');\r\n }\r\n\r\n if (!('PushManager' in window)) {\r\n throw new Error('Push notifications are not supported in this browser');\r\n }\r\n\r\n // Request notification permission\r\n const permission = await Notification.requestPermission();\r\n if (permission !== 'granted') {\r\n throw new Error('Notification permission denied');\r\n }\r\n\r\n // Register service worker\r\n const swPath = options.serviceWorkerPath || '/push-sw.js';\r\n const registration = await navigator.serviceWorker.register(swPath);\r\n\r\n // Wait for service worker to be ready\r\n await navigator.serviceWorker.ready;\r\n\r\n // Get VAPID public key\r\n const vapidPublicKey = await this.getVapidPublicKey();\r\n\r\n // Subscribe to push notifications\r\n const subscription = await registration.pushManager.subscribe({\r\n userVisibleOnly: true,\r\n applicationServerKey: this.urlBase64ToUint8Array(vapidPublicKey),\r\n });\r\n\r\n // Convert subscription to plain object\r\n const subscriptionObject: PushSubscription = {\r\n endpoint: subscription.endpoint,\r\n keys: {\r\n p256dh: btoa(String.fromCharCode(...new Uint8Array(subscription.getKey('p256dh')!))),\r\n auth: btoa(String.fromCharCode(...new Uint8Array(subscription.getKey('auth')!))),\r\n },\r\n };\r\n\r\n // Register device with backend\r\n const response = await fetch(`${this.baseUrl}/sdk/register-device`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({\r\n appId: this.appId,\r\n publicKey: this.publicKey,\r\n externalUserId: options.externalUserId,\r\n subscription: subscriptionObject,\r\n }),\r\n });\r\n\r\n const data = await response.json();\r\n\r\n if (!data.success) {\r\n throw new Error(data.message || 'Failed to register device');\r\n }\r\n }\r\n\r\n /**\r\n * Unregister device from push notifications\r\n */\r\n async unregisterDevice(externalUserId: string): Promise<void> {\r\n const response = await fetch(`${this.baseUrl}/sdk/unregister-device`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({\r\n appId: this.appId,\r\n externalUserId,\r\n }),\r\n });\r\n\r\n const data = await response.json();\r\n\r\n if (!data.success) {\r\n throw new Error(data.message || 'Failed to unregister device');\r\n }\r\n\r\n // Unsubscribe from push manager\r\n if ('serviceWorker' in navigator) {\r\n const registration = await navigator.serviceWorker.ready;\r\n const subscription = await registration.pushManager.getSubscription();\r\n if (subscription) {\r\n await subscription.unsubscribe();\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport function initNotificationClient(options: InitOptions): NotificationClient {\r\n return new NotificationClient(options);\r\n}\r\n"],"names":[],"mappings":"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","x_google_ignoreList":[0]}
@@ -0,0 +1,41 @@
1
+ export interface ForegroundMessage {
2
+ type: 'FOREGROUND_MESSAGE';
3
+ payload: NotificationPayload;
4
+ }
5
+ export interface BackgroundMessage {
6
+ type: 'BACKGROUND_MESSAGE';
7
+ payload: NotificationPayload;
8
+ }
9
+ export interface SilentMessage {
10
+ type: 'SILENT_MESSAGE';
11
+ data: Record<string, any>;
12
+ }
13
+ export type ServiceWorkerMessage = ForegroundMessage | BackgroundMessage | SilentMessage;
14
+ export interface NotificationPayload {
15
+ title: string;
16
+ body?: string;
17
+ icon?: string;
18
+ image?: string;
19
+ click_action?: string;
20
+ data?: Record<string, any>;
21
+ silent?: boolean;
22
+ }
23
+ export type MessageCallback = (payload: NotificationPayload) => void;
24
+ export type SilentMessageCallback = (data: Record<string, any>) => void;
25
+ export interface InitOptions {
26
+ baseUrl: string;
27
+ appId: string;
28
+ publicKey: string;
29
+ }
30
+ export interface RegisterDeviceOptions {
31
+ externalUserId: string;
32
+ serviceWorkerPath?: string;
33
+ }
34
+ export interface PushSubscription {
35
+ endpoint: string;
36
+ keys: {
37
+ p256dh: string;
38
+ auth: string;
39
+ };
40
+ }
41
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,OAAO,EAAE,mBAAmB,CAAC;CAC9B;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,OAAO,EAAE,mBAAmB,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,gBAAgB,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC3B;AAED,MAAM,MAAM,oBAAoB,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,aAAa,CAAC;AAGzF,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAGD,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,mBAAmB,KAAK,IAAI,CAAC;AACrE,MAAM,MAAM,qBAAqB,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;AAExE,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH"}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "vibe-message",
3
+ "version": "1.0.0",
4
+ "description": "Lightweight JavaScript SDK for web push notifications",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.esm.js",
7
+ "types": "dist/index.d.ts",
8
+ "files": [
9
+ "dist"
10
+ ],
11
+ "scripts": {
12
+ "build": "rollup -c",
13
+ "dev": "rollup -c -w"
14
+ },
15
+ "keywords": [
16
+ "push-notifications",
17
+ "web-push",
18
+ "notifications",
19
+ "push",
20
+ "service-worker",
21
+ "vapid",
22
+ "browser-notifications"
23
+ ],
24
+ "author": "Vibe Message",
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "https://github.com/yourusername/vibe-message"
28
+ },
29
+ "bugs": {
30
+ "url": "https://github.com/yourusername/vibe-message/issues"
31
+ },
32
+ "homepage": "https://github.com/yourusername/vibe-message#readme",
33
+ "license": "MIT",
34
+ "devDependencies": {
35
+ "@rollup/plugin-typescript": "^11.1.5",
36
+ "rollup": "^4.9.1",
37
+ "tslib": "^2.6.2",
38
+ "typescript": "^5.3.3"
39
+ }
40
+ }