magicbell-js 1.1.0 → 1.2.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 CHANGED
@@ -12,6 +12,10 @@ To get started with the SDK, we recommend installing using `npm`:
12
12
  npm install magicbell-js
13
13
  ```
14
14
 
15
+ ## Authentication
16
+
17
+ Both the ProjectClient and the UserClient require authentication. Please read more about authentication and generation of tokens in our [Authentication docs](https://www.magicbell.com/docs/api/authentication).
18
+
15
19
  # ProjectClient
16
20
 
17
21
  <!-- AUTO-GENERATED-CONTENT:START (project-client) -->
@@ -281,3 +285,57 @@ The SDK includes several models that represent the data structures used in API r
281
285
  </details>
282
286
 
283
287
  <!-- AUTO-GENERATED-CONTENT:END (user-client) -->
288
+
289
+ # Realtime
290
+
291
+ The Realtime client enables real-time notification delivery through WebSocket connections. When new notifications are created for a user, they are instantly pushed to connected clients without requiring polling.
292
+
293
+ ## Authentication
294
+
295
+ The Realtime client requires a user access token for authentication. This can be provided either directly or through an existing `UserClient` instance.
296
+
297
+ ## Sample Usage
298
+
299
+ ```ts
300
+ import { Realtime } from 'magicbell-js/realtime';
301
+
302
+ const realtime = new Realtime({ token: 'USER_ACCESS_TOKEN' });
303
+
304
+ realtime.listen((notification) => {
305
+ console.log('New notification received:', notification.title);
306
+ // Handle the notification (update UI, show toast, etc.)
307
+ });
308
+
309
+ // When done listening
310
+ realtime.disconnect();
311
+ ```
312
+
313
+ ## Using with UserClient
314
+
315
+ You can also initialize the Realtime client with an existing `UserClient`:
316
+
317
+ ```ts
318
+ import { Client } from 'magicbell-js/user-client';
319
+ import { Realtime } from 'magicbell-js/realtime';
320
+
321
+ const userClient = new Client({ token: 'USER_ACCESS_TOKEN' });
322
+ const realtime = new Realtime(userClient);
323
+
324
+ realtime.listen((notification) => {
325
+ console.log('New notification:', notification);
326
+ });
327
+ ```
328
+
329
+ ## Connection Management
330
+
331
+ The Realtime client automatically handles connection management, including reconnection attempts when the connection is lost:
332
+
333
+ ```ts
334
+ // Check if currently connected
335
+ if (realtime.isListening()) {
336
+ console.log('Connected to real-time notifications');
337
+ }
338
+
339
+ // Disconnect when no longer needed
340
+ realtime.disconnect();
341
+ ```
@@ -1,5 +1,5 @@
1
1
  import { type Notification, Client } from './user-client.js';
2
- export declare class Socket {
2
+ export declare class Realtime {
3
3
  #private;
4
4
  constructor(options: {
5
5
  token: string;
@@ -8,4 +8,4 @@ export declare class Socket {
8
8
  disconnect(): void;
9
9
  isListening(): boolean;
10
10
  }
11
- //# sourceMappingURL=socket.d.ts.map
11
+ //# sourceMappingURL=realtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"realtime.d.ts","sourceRoot":"","sources":["../../src/realtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE7D,qBAAa,QAAQ;;gBAYP,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM;IAQzC,MAAM,CAAC,cAAc,EAAE,CAAC,YAAY,EAAE,YAAY,KAAK,IAAI;IA6CjE,UAAU;IASV,WAAW;CA2FZ"}
@@ -0,0 +1,200 @@
1
+ "use strict";
2
+ var _Realtime_instances, _Realtime_client, _Realtime_socketUrl, _Realtime_inboxToken, _Realtime_origin, _Realtime_websocket, _Realtime_isConnected, _Realtime_reconnectAttempts, _Realtime_maxReconnectAttempts, _Realtime_reconnectInterval, _Realtime_notificationHandler, _Realtime_handleMessage, _Realtime_isNewNotificationMessage, _Realtime_handleNewNotification, _Realtime_handleReconnect, _Realtime_getUrl, _Realtime_getToken;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.Realtime = void 0;
5
+ const tslib_1 = require("tslib");
6
+ const user_client_js_1 = require("./user-client.js");
7
+ class Realtime {
8
+ constructor(options) {
9
+ _Realtime_instances.add(this);
10
+ _Realtime_client.set(this, void 0);
11
+ _Realtime_socketUrl.set(this, 'wss://ws.magicbell.com');
12
+ _Realtime_inboxToken.set(this, void 0);
13
+ _Realtime_origin.set(this, void 0);
14
+ _Realtime_websocket.set(this, void 0);
15
+ _Realtime_isConnected.set(this, false);
16
+ _Realtime_reconnectAttempts.set(this, 0);
17
+ _Realtime_maxReconnectAttempts.set(this, 5);
18
+ _Realtime_reconnectInterval.set(this, 1000);
19
+ _Realtime_notificationHandler.set(this, void 0);
20
+ if (options instanceof user_client_js_1.Client) {
21
+ tslib_1.__classPrivateFieldSet(this, _Realtime_client, options, "f");
22
+ }
23
+ else {
24
+ tslib_1.__classPrivateFieldSet(this, _Realtime_client, new user_client_js_1.Client({ token: options.token }), "f");
25
+ }
26
+ }
27
+ async listen(onNotification) {
28
+ tslib_1.__classPrivateFieldSet(this, _Realtime_notificationHandler, onNotification, "f");
29
+ if (tslib_1.__classPrivateFieldGet(this, _Realtime_websocket, "f") && tslib_1.__classPrivateFieldGet(this, _Realtime_isConnected, "f")) {
30
+ console.warn('Already connected to WebSocket');
31
+ return;
32
+ }
33
+ try {
34
+ const url = await tslib_1.__classPrivateFieldGet(this, _Realtime_instances, "m", _Realtime_getUrl).call(this);
35
+ tslib_1.__classPrivateFieldSet(this, _Realtime_websocket, new WebSocket(url), "f");
36
+ tslib_1.__classPrivateFieldGet(this, _Realtime_websocket, "f").onopen = () => {
37
+ tslib_1.__classPrivateFieldSet(this, _Realtime_isConnected, true, "f");
38
+ tslib_1.__classPrivateFieldSet(this, _Realtime_reconnectAttempts, 0, "f");
39
+ tslib_1.__classPrivateFieldSet(this, _Realtime_reconnectInterval, 1000, "f");
40
+ };
41
+ tslib_1.__classPrivateFieldGet(this, _Realtime_websocket, "f").onmessage = (event) => {
42
+ if (event.origin !== tslib_1.__classPrivateFieldGet(this, _Realtime_origin, "f"))
43
+ return;
44
+ try {
45
+ const data = JSON.parse(event.data);
46
+ tslib_1.__classPrivateFieldGet(this, _Realtime_instances, "m", _Realtime_handleMessage).call(this, data);
47
+ }
48
+ catch (error) {
49
+ console.error('Failed to parse WebSocket message:', error);
50
+ }
51
+ };
52
+ tslib_1.__classPrivateFieldGet(this, _Realtime_websocket, "f").onclose = (event) => {
53
+ console.warn('WebSocket disconnected:', event.code, event.reason);
54
+ tslib_1.__classPrivateFieldSet(this, _Realtime_isConnected, false, "f");
55
+ tslib_1.__classPrivateFieldGet(this, _Realtime_instances, "m", _Realtime_handleReconnect).call(this);
56
+ };
57
+ tslib_1.__classPrivateFieldGet(this, _Realtime_websocket, "f").onerror = (error) => {
58
+ console.error('WebSocket error:', error);
59
+ tslib_1.__classPrivateFieldSet(this, _Realtime_isConnected, false, "f");
60
+ };
61
+ }
62
+ catch (error) {
63
+ console.error('Failed to connect to WebSocket:', error);
64
+ tslib_1.__classPrivateFieldGet(this, _Realtime_instances, "m", _Realtime_handleReconnect).call(this);
65
+ }
66
+ }
67
+ disconnect() {
68
+ if (tslib_1.__classPrivateFieldGet(this, _Realtime_websocket, "f")) {
69
+ tslib_1.__classPrivateFieldGet(this, _Realtime_websocket, "f").close();
70
+ tslib_1.__classPrivateFieldSet(this, _Realtime_websocket, undefined, "f");
71
+ }
72
+ tslib_1.__classPrivateFieldSet(this, _Realtime_isConnected, false, "f");
73
+ tslib_1.__classPrivateFieldSet(this, _Realtime_reconnectAttempts, 0, "f");
74
+ }
75
+ isListening() {
76
+ return tslib_1.__classPrivateFieldGet(this, _Realtime_isConnected, "f");
77
+ }
78
+ }
79
+ exports.Realtime = Realtime;
80
+ _Realtime_client = new WeakMap(), _Realtime_socketUrl = new WeakMap(), _Realtime_inboxToken = new WeakMap(), _Realtime_origin = new WeakMap(), _Realtime_websocket = new WeakMap(), _Realtime_isConnected = new WeakMap(), _Realtime_reconnectAttempts = new WeakMap(), _Realtime_maxReconnectAttempts = new WeakMap(), _Realtime_reconnectInterval = new WeakMap(), _Realtime_notificationHandler = new WeakMap(), _Realtime_instances = new WeakSet(), _Realtime_handleMessage = function _Realtime_handleMessage(data) {
81
+ if (!tslib_1.__classPrivateFieldGet(this, _Realtime_instances, "m", _Realtime_isNewNotificationMessage).call(this, data)) {
82
+ return;
83
+ }
84
+ tslib_1.__classPrivateFieldGet(this, _Realtime_instances, "m", _Realtime_handleNewNotification).call(this, data.data.id);
85
+ }, _Realtime_isNewNotificationMessage = function _Realtime_isNewNotificationMessage(data) {
86
+ return (typeof data === 'object' &&
87
+ data !== null &&
88
+ data.name === 'notifications/new' &&
89
+ typeof data.data === 'object' &&
90
+ data.data !== null &&
91
+ typeof data.data.id === 'string');
92
+ }, _Realtime_handleNewNotification = async function _Realtime_handleNewNotification(notificationId) {
93
+ if (!tslib_1.__classPrivateFieldGet(this, _Realtime_notificationHandler, "f")) {
94
+ console.warn('No notification handler provided');
95
+ return;
96
+ }
97
+ try {
98
+ const { data: notification, metadata: res } = await tslib_1.__classPrivateFieldGet(this, _Realtime_client, "f").notifications.fetchNotification(notificationId);
99
+ if (!isOK(res)) {
100
+ console.error(`Failed to fetch notification ${notificationId}: ${res.status} ${res.statusText}`);
101
+ return;
102
+ }
103
+ if (notification) {
104
+ tslib_1.__classPrivateFieldGet(this, _Realtime_notificationHandler, "f").call(this, notification);
105
+ }
106
+ }
107
+ catch (error) {
108
+ console.error(`Error fetching notification ${notificationId}:`, error);
109
+ }
110
+ }, _Realtime_handleReconnect = function _Realtime_handleReconnect() {
111
+ if (tslib_1.__classPrivateFieldGet(this, _Realtime_reconnectAttempts, "f") >= tslib_1.__classPrivateFieldGet(this, _Realtime_maxReconnectAttempts, "f")) {
112
+ console.error('Max reconnection attempts reached');
113
+ return;
114
+ }
115
+ if (!tslib_1.__classPrivateFieldGet(this, _Realtime_notificationHandler, "f")) {
116
+ console.warn('No notification handler, skipping reconnect');
117
+ return;
118
+ }
119
+ setTimeout(() => {
120
+ var _a;
121
+ tslib_1.__classPrivateFieldSet(this, _Realtime_reconnectAttempts, (_a = tslib_1.__classPrivateFieldGet(this, _Realtime_reconnectAttempts, "f"), _a++, _a), "f");
122
+ tslib_1.__classPrivateFieldSet(this, _Realtime_reconnectInterval, Math.min(tslib_1.__classPrivateFieldGet(this, _Realtime_reconnectInterval, "f") * 2, 30000), "f"); // Max 30 seconds
123
+ this.listen(tslib_1.__classPrivateFieldGet(this, _Realtime_notificationHandler, "f"));
124
+ }, tslib_1.__classPrivateFieldGet(this, _Realtime_reconnectInterval, "f"));
125
+ }, _Realtime_getUrl = async function _Realtime_getUrl() {
126
+ const jwtToken = tslib_1.__classPrivateFieldGet(this, _Realtime_client, "f").config.token;
127
+ invariant(jwtToken, 'Failed to get token from client');
128
+ const apiKey = getApiKeyFromToken(jwtToken);
129
+ invariant(apiKey, 'Failed to get API key from token');
130
+ const token = await tslib_1.__classPrivateFieldGet(this, _Realtime_instances, "m", _Realtime_getToken).call(this);
131
+ const url = new URL(tslib_1.__classPrivateFieldGet(this, _Realtime_socketUrl, "f"));
132
+ url.searchParams.set('api_key', apiKey);
133
+ url.searchParams.set('token', token);
134
+ tslib_1.__classPrivateFieldSet(this, _Realtime_origin, url.origin, "f");
135
+ return url.toString();
136
+ }, _Realtime_getToken = async function _Realtime_getToken() {
137
+ if (tslib_1.__classPrivateFieldGet(this, _Realtime_inboxToken, "f"))
138
+ return tslib_1.__classPrivateFieldGet(this, _Realtime_inboxToken, "f");
139
+ const { data, metadata: res } = await tslib_1.__classPrivateFieldGet(this, _Realtime_client, "f").channels.saveInboxToken({
140
+ token: getSessionId(),
141
+ });
142
+ invariant(isOK(res), `Failed to save Inbox token: ${res.status} ${res.statusText}`);
143
+ invariant(data === null || data === void 0 ? void 0 : data.token, 'Unexpected server response, missing token');
144
+ tslib_1.__classPrivateFieldSet(this, _Realtime_inboxToken, data.token, "f");
145
+ return data.token;
146
+ };
147
+ function isOK(response) {
148
+ return response.status >= 200 && response.status < 300;
149
+ }
150
+ function invariant(condition, message) {
151
+ if (!condition) {
152
+ throw new Error(message);
153
+ }
154
+ }
155
+ function getSessionId() {
156
+ if (typeof sessionStorage === 'undefined') {
157
+ return generateID(64);
158
+ }
159
+ // sessionStorage gets cleared when the page session ends. A page
160
+ // session lasts for as long as the browser is open and survives
161
+ // over page reloads and restores. Opening a page in a new tab or
162
+ // window will cause a new session to be initiated. This gives us
163
+ // a stable ID per tab, and different ID's across tabs.
164
+ const stored = sessionStorage.getItem('magicbell--realtime-token');
165
+ if (stored)
166
+ return stored;
167
+ const id = generateID(64);
168
+ sessionStorage.setItem('magicbell--realtime-token', id);
169
+ return id;
170
+ }
171
+ function generateID(length = 17) {
172
+ let id = '';
173
+ while (id.length < length) {
174
+ id += getRandomValues();
175
+ }
176
+ return id.substring(0, length);
177
+ }
178
+ function getApiKeyFromToken(token) {
179
+ const data = getTokenPayload(token);
180
+ if (!data)
181
+ return null;
182
+ if (data.api_key) {
183
+ return data.api_key;
184
+ }
185
+ return null;
186
+ }
187
+ function getTokenPayload(token) {
188
+ try {
189
+ const [_, payload] = token.split('.');
190
+ const data = JSON.parse(atob(payload));
191
+ return data || null;
192
+ }
193
+ catch (_a) {
194
+ return null;
195
+ }
196
+ }
197
+ const getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues
198
+ ? () => crypto.getRandomValues(new Uint32Array(1))[0].toString(36)
199
+ : () => Math.random().toString(36).substring(2, 15);
200
+ //# sourceMappingURL=realtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"realtime.js","sourceRoot":"","sources":["../../src/realtime.ts"],"names":[],"mappings":";;;;;AAAA,qDAA6D;AAE7D,MAAa,QAAQ;IAYnB,YAAY,OAAmC;;QAX/C,mCAAgB;QAChB,8BAAa,wBAAwB,EAAC;QACtC,uCAAgC;QAChC,mCAA4B;QAC5B,sCAAkC;QAClC,gCAAe,KAAK,EAAC;QACrB,sCAAqB,CAAC,EAAC;QACvB,yCAAwB,CAAC,EAAC;QAC1B,sCAAqB,IAAI,EAAC;QAC1B,gDAAyE;QAGvE,IAAI,OAAO,YAAY,uBAAM,EAAE,CAAC;YAC9B,+BAAA,IAAI,oBAAW,OAAO,MAAA,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,+BAAA,IAAI,oBAAW,IAAI,uBAAM,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,MAAA,CAAC;QACtD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,cAAoD;QAC/D,+BAAA,IAAI,iCAAwB,cAAc,MAAA,CAAC;QAE3C,IAAI,+BAAA,IAAI,2BAAW,IAAI,+BAAA,IAAI,6BAAa,EAAE,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;YAC/C,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,+BAAA,IAAI,6CAAQ,MAAZ,IAAI,CAAU,CAAC;YACjC,+BAAA,IAAI,uBAAc,IAAI,SAAS,CAAC,GAAG,CAAC,MAAA,CAAC;YAErC,+BAAA,IAAI,2BAAW,CAAC,MAAM,GAAG,GAAG,EAAE;gBAC5B,+BAAA,IAAI,yBAAgB,IAAI,MAAA,CAAC;gBACzB,+BAAA,IAAI,+BAAsB,CAAC,MAAA,CAAC;gBAC5B,+BAAA,IAAI,+BAAsB,IAAI,MAAA,CAAC;YACjC,CAAC,CAAC;YAEF,+BAAA,IAAI,2BAAW,CAAC,SAAS,GAAG,CAAC,KAAK,EAAE,EAAE;gBACpC,IAAI,KAAK,CAAC,MAAM,KAAK,+BAAA,IAAI,wBAAQ;oBAAE,OAAO;gBAE1C,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACpC,+BAAA,IAAI,oDAAe,MAAnB,IAAI,EAAgB,IAAI,CAAC,CAAC;gBAC5B,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAC;gBAC7D,CAAC;YACH,CAAC,CAAC;YAEF,+BAAA,IAAI,2BAAW,CAAC,OAAO,GAAG,CAAC,KAAK,EAAE,EAAE;gBAClC,OAAO,CAAC,IAAI,CAAC,yBAAyB,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;gBAClE,+BAAA,IAAI,yBAAgB,KAAK,MAAA,CAAC;gBAC1B,+BAAA,IAAI,sDAAiB,MAArB,IAAI,CAAmB,CAAC;YAC1B,CAAC,CAAC;YAEF,+BAAA,IAAI,2BAAW,CAAC,OAAO,GAAG,CAAC,KAAK,EAAE,EAAE;gBAClC,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;gBACzC,+BAAA,IAAI,yBAAgB,KAAK,MAAA,CAAC;YAC5B,CAAC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;YACxD,+BAAA,IAAI,sDAAiB,MAArB,IAAI,CAAmB,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,UAAU;QACR,IAAI,+BAAA,IAAI,2BAAW,EAAE,CAAC;YACpB,+BAAA,IAAI,2BAAW,CAAC,KAAK,EAAE,CAAC;YACxB,+BAAA,IAAI,uBAAc,SAAS,MAAA,CAAC;QAC9B,CAAC;QACD,+BAAA,IAAI,yBAAgB,KAAK,MAAA,CAAC;QAC1B,+BAAA,IAAI,+BAAsB,CAAC,MAAA,CAAC;IAC9B,CAAC;IAED,WAAW;QACT,OAAO,+BAAA,IAAI,6BAAa,CAAC;IAC3B,CAAC;CAyFF;AArKD,4BAqKC;ofAvFgB,IAAS;IACtB,IAAI,CAAC,+BAAA,IAAI,+DAA0B,MAA9B,IAAI,EAA2B,IAAI,CAAC,EAAE,CAAC;QAC1C,OAAO;IACT,CAAC;IAED,+BAAA,IAAI,4DAAuB,MAA3B,IAAI,EAAwB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC5C,CAAC,mFAEyB,IAAS;IACjC,OAAO,CACL,OAAO,IAAI,KAAK,QAAQ;QACxB,IAAI,KAAK,IAAI;QACb,IAAI,CAAC,IAAI,KAAK,mBAAmB;QACjC,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;QAC7B,IAAI,CAAC,IAAI,KAAK,IAAI;QAClB,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,QAAQ,CACjC,CAAC;AACJ,CAAC,oCAED,KAAK,0CAAwB,cAAsB;IACjD,IAAI,CAAC,+BAAA,IAAI,qCAAqB,EAAE,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QACjD,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,MAAM,+BAAA,IAAI,wBAAQ,CAAC,aAAa,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;QAEjH,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,gCAAgC,cAAc,KAAK,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;YACjG,OAAO;QACT,CAAC;QAED,IAAI,YAAY,EAAE,CAAC;YACjB,+BAAA,IAAI,qCAAqB,MAAzB,IAAI,EAAsB,YAAY,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,+BAA+B,cAAc,GAAG,EAAE,KAAK,CAAC,CAAC;IACzE,CAAC;AACH,CAAC;IAGC,IAAI,+BAAA,IAAI,mCAAmB,IAAI,+BAAA,IAAI,sCAAsB,EAAE,CAAC;QAC1D,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACnD,OAAO;IACT,CAAC;IAED,IAAI,CAAC,+BAAA,IAAI,qCAAqB,EAAE,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAC5D,OAAO;IACT,CAAC;IAED,UAAU,CAAC,GAAG,EAAE;;QACd,kEAAA,CAAA,2EAAuB,EAAvB,IAAyB,IAAA,CAAA,MAAA,CAAC;QAC1B,+BAAA,IAAI,+BAAsB,IAAI,CAAC,GAAG,CAAC,+BAAA,IAAI,mCAAmB,GAAG,CAAC,EAAE,KAAK,CAAC,MAAA,CAAC,CAAC,iBAAiB;QACzF,IAAI,CAAC,MAAM,CAAC,+BAAA,IAAI,qCAAsB,CAAC,CAAC;IAC1C,CAAC,EAAE,+BAAA,IAAI,mCAAmB,CAAC,CAAC;AAC9B,CAAC,qBAED,KAAK;IACH,MAAM,QAAQ,GAAG,+BAAA,IAAI,wBAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;IAC3C,SAAS,CAAC,QAAQ,EAAE,iCAAiC,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC5C,SAAS,CAAC,MAAM,EAAE,kCAAkC,CAAC,CAAC;IAEtD,MAAM,KAAK,GAAG,MAAM,+BAAA,IAAI,+CAAU,MAAd,IAAI,CAAY,CAAC;IACrC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,+BAAA,IAAI,2BAAW,CAAC,CAAC;IACrC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACxC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAErC,+BAAA,IAAI,oBAAW,GAAG,CAAC,MAAM,MAAA,CAAC;IAC1B,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC,uBAED,KAAK;IACH,IAAI,+BAAA,IAAI,4BAAY;QAAE,OAAO,+BAAA,IAAI,4BAAY,CAAC;IAE9C,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,MAAM,+BAAA,IAAI,wBAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC;QACzE,KAAK,EAAE,YAAY,EAAE;KACtB,CAAC,CAAC;IAEH,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,+BAA+B,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IACpF,SAAS,CAAC,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,KAAK,EAAE,2CAA2C,CAAC,CAAC;IAEpE,+BAAA,IAAI,wBAAe,IAAI,CAAC,KAAK,MAAA,CAAC;IAC9B,OAAO,IAAI,CAAC,KAAK,CAAC;AACpB,CAAC;AAGH,SAAS,IAAI,CAAC,QAA4B;IACxC,OAAO,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC;AACzD,CAAC;AAED,SAAS,SAAS,CAAC,SAAc,EAAE,OAAe;IAChD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,SAAS,YAAY;IACnB,IAAI,OAAO,cAAc,KAAK,WAAW,EAAE,CAAC;QAC1C,OAAO,UAAU,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC;IAED,iEAAiE;IACjE,gEAAgE;IAChE,iEAAiE;IACjE,iEAAiE;IACjE,uDAAuD;IACvD,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;IACnE,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,MAAM,EAAE,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;IAC1B,cAAc,CAAC,OAAO,CAAC,2BAA2B,EAAE,EAAE,CAAC,CAAC;IACxD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,UAAU,CAAC,MAAM,GAAG,EAAE;IAC7B,IAAI,EAAE,GAAG,EAAE,CAAC;IAEZ,OAAO,EAAE,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;QAC1B,EAAE,IAAI,eAAe,EAAE,CAAC;IAC1B,CAAC;IAED,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAa;IACvC,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,IAAI,CAAC;QACH,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACvC,OAAO,IAAI,IAAI,IAAI,CAAC;IACtB,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,eAAe,GACnB,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,eAAe;IACrD,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;IAClE,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { type Notification, Client } from './user-client.js';
2
- export declare class Socket {
2
+ export declare class Realtime {
3
3
  #private;
4
4
  constructor(options: {
5
5
  token: string;
@@ -8,4 +8,4 @@ export declare class Socket {
8
8
  disconnect(): void;
9
9
  isListening(): boolean;
10
10
  }
11
- //# sourceMappingURL=socket.d.ts.map
11
+ //# sourceMappingURL=realtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"realtime.d.ts","sourceRoot":"","sources":["../../src/realtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE7D,qBAAa,QAAQ;;gBAYP,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM;IAQzC,MAAM,CAAC,cAAc,EAAE,CAAC,YAAY,EAAE,YAAY,KAAK,IAAI;IA6CjE,UAAU;IASV,WAAW;CA2FZ"}
@@ -0,0 +1,196 @@
1
+ var _Realtime_instances, _Realtime_client, _Realtime_socketUrl, _Realtime_inboxToken, _Realtime_origin, _Realtime_websocket, _Realtime_isConnected, _Realtime_reconnectAttempts, _Realtime_maxReconnectAttempts, _Realtime_reconnectInterval, _Realtime_notificationHandler, _Realtime_handleMessage, _Realtime_isNewNotificationMessage, _Realtime_handleNewNotification, _Realtime_handleReconnect, _Realtime_getUrl, _Realtime_getToken;
2
+ import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
3
+ import { Client } from './user-client.js';
4
+ export class Realtime {
5
+ constructor(options) {
6
+ _Realtime_instances.add(this);
7
+ _Realtime_client.set(this, void 0);
8
+ _Realtime_socketUrl.set(this, 'wss://ws.magicbell.com');
9
+ _Realtime_inboxToken.set(this, void 0);
10
+ _Realtime_origin.set(this, void 0);
11
+ _Realtime_websocket.set(this, void 0);
12
+ _Realtime_isConnected.set(this, false);
13
+ _Realtime_reconnectAttempts.set(this, 0);
14
+ _Realtime_maxReconnectAttempts.set(this, 5);
15
+ _Realtime_reconnectInterval.set(this, 1000);
16
+ _Realtime_notificationHandler.set(this, void 0);
17
+ if (options instanceof Client) {
18
+ __classPrivateFieldSet(this, _Realtime_client, options, "f");
19
+ }
20
+ else {
21
+ __classPrivateFieldSet(this, _Realtime_client, new Client({ token: options.token }), "f");
22
+ }
23
+ }
24
+ async listen(onNotification) {
25
+ __classPrivateFieldSet(this, _Realtime_notificationHandler, onNotification, "f");
26
+ if (__classPrivateFieldGet(this, _Realtime_websocket, "f") && __classPrivateFieldGet(this, _Realtime_isConnected, "f")) {
27
+ console.warn('Already connected to WebSocket');
28
+ return;
29
+ }
30
+ try {
31
+ const url = await __classPrivateFieldGet(this, _Realtime_instances, "m", _Realtime_getUrl).call(this);
32
+ __classPrivateFieldSet(this, _Realtime_websocket, new WebSocket(url), "f");
33
+ __classPrivateFieldGet(this, _Realtime_websocket, "f").onopen = () => {
34
+ __classPrivateFieldSet(this, _Realtime_isConnected, true, "f");
35
+ __classPrivateFieldSet(this, _Realtime_reconnectAttempts, 0, "f");
36
+ __classPrivateFieldSet(this, _Realtime_reconnectInterval, 1000, "f");
37
+ };
38
+ __classPrivateFieldGet(this, _Realtime_websocket, "f").onmessage = (event) => {
39
+ if (event.origin !== __classPrivateFieldGet(this, _Realtime_origin, "f"))
40
+ return;
41
+ try {
42
+ const data = JSON.parse(event.data);
43
+ __classPrivateFieldGet(this, _Realtime_instances, "m", _Realtime_handleMessage).call(this, data);
44
+ }
45
+ catch (error) {
46
+ console.error('Failed to parse WebSocket message:', error);
47
+ }
48
+ };
49
+ __classPrivateFieldGet(this, _Realtime_websocket, "f").onclose = (event) => {
50
+ console.warn('WebSocket disconnected:', event.code, event.reason);
51
+ __classPrivateFieldSet(this, _Realtime_isConnected, false, "f");
52
+ __classPrivateFieldGet(this, _Realtime_instances, "m", _Realtime_handleReconnect).call(this);
53
+ };
54
+ __classPrivateFieldGet(this, _Realtime_websocket, "f").onerror = (error) => {
55
+ console.error('WebSocket error:', error);
56
+ __classPrivateFieldSet(this, _Realtime_isConnected, false, "f");
57
+ };
58
+ }
59
+ catch (error) {
60
+ console.error('Failed to connect to WebSocket:', error);
61
+ __classPrivateFieldGet(this, _Realtime_instances, "m", _Realtime_handleReconnect).call(this);
62
+ }
63
+ }
64
+ disconnect() {
65
+ if (__classPrivateFieldGet(this, _Realtime_websocket, "f")) {
66
+ __classPrivateFieldGet(this, _Realtime_websocket, "f").close();
67
+ __classPrivateFieldSet(this, _Realtime_websocket, undefined, "f");
68
+ }
69
+ __classPrivateFieldSet(this, _Realtime_isConnected, false, "f");
70
+ __classPrivateFieldSet(this, _Realtime_reconnectAttempts, 0, "f");
71
+ }
72
+ isListening() {
73
+ return __classPrivateFieldGet(this, _Realtime_isConnected, "f");
74
+ }
75
+ }
76
+ _Realtime_client = new WeakMap(), _Realtime_socketUrl = new WeakMap(), _Realtime_inboxToken = new WeakMap(), _Realtime_origin = new WeakMap(), _Realtime_websocket = new WeakMap(), _Realtime_isConnected = new WeakMap(), _Realtime_reconnectAttempts = new WeakMap(), _Realtime_maxReconnectAttempts = new WeakMap(), _Realtime_reconnectInterval = new WeakMap(), _Realtime_notificationHandler = new WeakMap(), _Realtime_instances = new WeakSet(), _Realtime_handleMessage = function _Realtime_handleMessage(data) {
77
+ if (!__classPrivateFieldGet(this, _Realtime_instances, "m", _Realtime_isNewNotificationMessage).call(this, data)) {
78
+ return;
79
+ }
80
+ __classPrivateFieldGet(this, _Realtime_instances, "m", _Realtime_handleNewNotification).call(this, data.data.id);
81
+ }, _Realtime_isNewNotificationMessage = function _Realtime_isNewNotificationMessage(data) {
82
+ return (typeof data === 'object' &&
83
+ data !== null &&
84
+ data.name === 'notifications/new' &&
85
+ typeof data.data === 'object' &&
86
+ data.data !== null &&
87
+ typeof data.data.id === 'string');
88
+ }, _Realtime_handleNewNotification = async function _Realtime_handleNewNotification(notificationId) {
89
+ if (!__classPrivateFieldGet(this, _Realtime_notificationHandler, "f")) {
90
+ console.warn('No notification handler provided');
91
+ return;
92
+ }
93
+ try {
94
+ const { data: notification, metadata: res } = await __classPrivateFieldGet(this, _Realtime_client, "f").notifications.fetchNotification(notificationId);
95
+ if (!isOK(res)) {
96
+ console.error(`Failed to fetch notification ${notificationId}: ${res.status} ${res.statusText}`);
97
+ return;
98
+ }
99
+ if (notification) {
100
+ __classPrivateFieldGet(this, _Realtime_notificationHandler, "f").call(this, notification);
101
+ }
102
+ }
103
+ catch (error) {
104
+ console.error(`Error fetching notification ${notificationId}:`, error);
105
+ }
106
+ }, _Realtime_handleReconnect = function _Realtime_handleReconnect() {
107
+ if (__classPrivateFieldGet(this, _Realtime_reconnectAttempts, "f") >= __classPrivateFieldGet(this, _Realtime_maxReconnectAttempts, "f")) {
108
+ console.error('Max reconnection attempts reached');
109
+ return;
110
+ }
111
+ if (!__classPrivateFieldGet(this, _Realtime_notificationHandler, "f")) {
112
+ console.warn('No notification handler, skipping reconnect');
113
+ return;
114
+ }
115
+ setTimeout(() => {
116
+ var _a;
117
+ __classPrivateFieldSet(this, _Realtime_reconnectAttempts, (_a = __classPrivateFieldGet(this, _Realtime_reconnectAttempts, "f"), _a++, _a), "f");
118
+ __classPrivateFieldSet(this, _Realtime_reconnectInterval, Math.min(__classPrivateFieldGet(this, _Realtime_reconnectInterval, "f") * 2, 30000), "f"); // Max 30 seconds
119
+ this.listen(__classPrivateFieldGet(this, _Realtime_notificationHandler, "f"));
120
+ }, __classPrivateFieldGet(this, _Realtime_reconnectInterval, "f"));
121
+ }, _Realtime_getUrl = async function _Realtime_getUrl() {
122
+ const jwtToken = __classPrivateFieldGet(this, _Realtime_client, "f").config.token;
123
+ invariant(jwtToken, 'Failed to get token from client');
124
+ const apiKey = getApiKeyFromToken(jwtToken);
125
+ invariant(apiKey, 'Failed to get API key from token');
126
+ const token = await __classPrivateFieldGet(this, _Realtime_instances, "m", _Realtime_getToken).call(this);
127
+ const url = new URL(__classPrivateFieldGet(this, _Realtime_socketUrl, "f"));
128
+ url.searchParams.set('api_key', apiKey);
129
+ url.searchParams.set('token', token);
130
+ __classPrivateFieldSet(this, _Realtime_origin, url.origin, "f");
131
+ return url.toString();
132
+ }, _Realtime_getToken = async function _Realtime_getToken() {
133
+ if (__classPrivateFieldGet(this, _Realtime_inboxToken, "f"))
134
+ return __classPrivateFieldGet(this, _Realtime_inboxToken, "f");
135
+ const { data, metadata: res } = await __classPrivateFieldGet(this, _Realtime_client, "f").channels.saveInboxToken({
136
+ token: getSessionId(),
137
+ });
138
+ invariant(isOK(res), `Failed to save Inbox token: ${res.status} ${res.statusText}`);
139
+ invariant(data === null || data === void 0 ? void 0 : data.token, 'Unexpected server response, missing token');
140
+ __classPrivateFieldSet(this, _Realtime_inboxToken, data.token, "f");
141
+ return data.token;
142
+ };
143
+ function isOK(response) {
144
+ return response.status >= 200 && response.status < 300;
145
+ }
146
+ function invariant(condition, message) {
147
+ if (!condition) {
148
+ throw new Error(message);
149
+ }
150
+ }
151
+ function getSessionId() {
152
+ if (typeof sessionStorage === 'undefined') {
153
+ return generateID(64);
154
+ }
155
+ // sessionStorage gets cleared when the page session ends. A page
156
+ // session lasts for as long as the browser is open and survives
157
+ // over page reloads and restores. Opening a page in a new tab or
158
+ // window will cause a new session to be initiated. This gives us
159
+ // a stable ID per tab, and different ID's across tabs.
160
+ const stored = sessionStorage.getItem('magicbell--realtime-token');
161
+ if (stored)
162
+ return stored;
163
+ const id = generateID(64);
164
+ sessionStorage.setItem('magicbell--realtime-token', id);
165
+ return id;
166
+ }
167
+ function generateID(length = 17) {
168
+ let id = '';
169
+ while (id.length < length) {
170
+ id += getRandomValues();
171
+ }
172
+ return id.substring(0, length);
173
+ }
174
+ function getApiKeyFromToken(token) {
175
+ const data = getTokenPayload(token);
176
+ if (!data)
177
+ return null;
178
+ if (data.api_key) {
179
+ return data.api_key;
180
+ }
181
+ return null;
182
+ }
183
+ function getTokenPayload(token) {
184
+ try {
185
+ const [_, payload] = token.split('.');
186
+ const data = JSON.parse(atob(payload));
187
+ return data || null;
188
+ }
189
+ catch (_a) {
190
+ return null;
191
+ }
192
+ }
193
+ const getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues
194
+ ? () => crypto.getRandomValues(new Uint32Array(1))[0].toString(36)
195
+ : () => Math.random().toString(36).substring(2, 15);
196
+ //# sourceMappingURL=realtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"realtime.js","sourceRoot":"","sources":["../../src/realtime.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "magicbell-js",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "OpenAPI 3.1.0 Specification for MagicBell API.",
5
5
  "keywords": [
6
6
  "typescript",
@@ -26,14 +26,14 @@
26
26
  "default": "./dist/commonjs/project-client.js"
27
27
  }
28
28
  },
29
- "./socket": {
29
+ "./realtime": {
30
30
  "import": {
31
- "types": "./dist/esm/socket.d.ts",
32
- "default": "./dist/esm/socket.js"
31
+ "types": "./dist/esm/realtime.d.ts",
32
+ "default": "./dist/esm/realtime.js"
33
33
  },
34
34
  "require": {
35
- "types": "./dist/commonjs/socket.d.ts",
36
- "default": "./dist/commonjs/socket.js"
35
+ "types": "./dist/commonjs/realtime.d.ts",
36
+ "default": "./dist/commonjs/realtime.js"
37
37
  }
38
38
  },
39
39
  "./user-client": {
@@ -54,7 +54,7 @@
54
54
  "README.md",
55
55
  "/project-client/package.json",
56
56
  "/user-client/package.json",
57
- "/socket/package.json"
57
+ "/realtime/package.json"
58
58
  ],
59
59
  "scripts": {
60
60
  "build": "run-s build:bundle build:node10 build:docs build:attw",
@@ -0,0 +1,4 @@
1
+ {
2
+ "main": "../dist/commonjs/realtime.js",
3
+ "types": "../dist/commonjs/realtime.d.ts"
4
+ }
@@ -1,8 +1,6 @@
1
- import invariant from 'tiny-invariant';
2
-
3
1
  import { type Notification, Client } from './user-client.js';
4
2
 
5
- export class Socket {
3
+ export class Realtime {
6
4
  #client: Client;
7
5
  #socketUrl = 'wss://ws.magicbell.com';
8
6
  #inboxToken: string | undefined;
@@ -165,7 +163,7 @@ export class Socket {
165
163
  invariant(data?.token, 'Unexpected server response, missing token');
166
164
 
167
165
  this.#inboxToken = data.token;
168
- return this.#inboxToken;
166
+ return data.token;
169
167
  }
170
168
  }
171
169
 
@@ -173,6 +171,12 @@ function isOK(response: { status: number }) {
173
171
  return response.status >= 200 && response.status < 300;
174
172
  }
175
173
 
174
+ function invariant(condition: any, message: string): asserts condition {
175
+ if (!condition) {
176
+ throw new Error(message);
177
+ }
178
+ }
179
+
176
180
  function getSessionId() {
177
181
  if (typeof sessionStorage === 'undefined') {
178
182
  return generateID(64);
@@ -1 +0,0 @@
1
- {"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../src/socket.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE7D,qBAAa,MAAM;;gBAYL,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM;IAQzC,MAAM,CAAC,cAAc,EAAE,CAAC,YAAY,EAAE,YAAY,KAAK,IAAI;IA6CjE,UAAU;IASV,WAAW;CA2FZ"}
@@ -1,196 +0,0 @@
1
- "use strict";
2
- var _Socket_instances, _Socket_client, _Socket_socketUrl, _Socket_inboxToken, _Socket_origin, _Socket_websocket, _Socket_isConnected, _Socket_reconnectAttempts, _Socket_maxReconnectAttempts, _Socket_reconnectInterval, _Socket_notificationHandler, _Socket_handleMessage, _Socket_isNewNotificationMessage, _Socket_handleNewNotification, _Socket_handleReconnect, _Socket_getUrl, _Socket_getToken;
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.Socket = void 0;
5
- const tslib_1 = require("tslib");
6
- const tiny_invariant_1 = tslib_1.__importDefault(require("tiny-invariant"));
7
- const user_client_js_1 = require("./user-client.js");
8
- class Socket {
9
- constructor(options) {
10
- _Socket_instances.add(this);
11
- _Socket_client.set(this, void 0);
12
- _Socket_socketUrl.set(this, 'wss://ws.magicbell.com');
13
- _Socket_inboxToken.set(this, void 0);
14
- _Socket_origin.set(this, void 0);
15
- _Socket_websocket.set(this, void 0);
16
- _Socket_isConnected.set(this, false);
17
- _Socket_reconnectAttempts.set(this, 0);
18
- _Socket_maxReconnectAttempts.set(this, 5);
19
- _Socket_reconnectInterval.set(this, 1000);
20
- _Socket_notificationHandler.set(this, void 0);
21
- if (options instanceof user_client_js_1.Client) {
22
- tslib_1.__classPrivateFieldSet(this, _Socket_client, options, "f");
23
- }
24
- else {
25
- tslib_1.__classPrivateFieldSet(this, _Socket_client, new user_client_js_1.Client({ token: options.token }), "f");
26
- }
27
- }
28
- async listen(onNotification) {
29
- tslib_1.__classPrivateFieldSet(this, _Socket_notificationHandler, onNotification, "f");
30
- if (tslib_1.__classPrivateFieldGet(this, _Socket_websocket, "f") && tslib_1.__classPrivateFieldGet(this, _Socket_isConnected, "f")) {
31
- console.warn('Already connected to WebSocket');
32
- return;
33
- }
34
- try {
35
- const url = await tslib_1.__classPrivateFieldGet(this, _Socket_instances, "m", _Socket_getUrl).call(this);
36
- tslib_1.__classPrivateFieldSet(this, _Socket_websocket, new WebSocket(url), "f");
37
- tslib_1.__classPrivateFieldGet(this, _Socket_websocket, "f").onopen = () => {
38
- tslib_1.__classPrivateFieldSet(this, _Socket_isConnected, true, "f");
39
- tslib_1.__classPrivateFieldSet(this, _Socket_reconnectAttempts, 0, "f");
40
- tslib_1.__classPrivateFieldSet(this, _Socket_reconnectInterval, 1000, "f");
41
- };
42
- tslib_1.__classPrivateFieldGet(this, _Socket_websocket, "f").onmessage = (event) => {
43
- if (event.origin !== tslib_1.__classPrivateFieldGet(this, _Socket_origin, "f"))
44
- return;
45
- try {
46
- const data = JSON.parse(event.data);
47
- tslib_1.__classPrivateFieldGet(this, _Socket_instances, "m", _Socket_handleMessage).call(this, data);
48
- }
49
- catch (error) {
50
- console.error('Failed to parse WebSocket message:', error);
51
- }
52
- };
53
- tslib_1.__classPrivateFieldGet(this, _Socket_websocket, "f").onclose = (event) => {
54
- console.warn('WebSocket disconnected:', event.code, event.reason);
55
- tslib_1.__classPrivateFieldSet(this, _Socket_isConnected, false, "f");
56
- tslib_1.__classPrivateFieldGet(this, _Socket_instances, "m", _Socket_handleReconnect).call(this);
57
- };
58
- tslib_1.__classPrivateFieldGet(this, _Socket_websocket, "f").onerror = (error) => {
59
- console.error('WebSocket error:', error);
60
- tslib_1.__classPrivateFieldSet(this, _Socket_isConnected, false, "f");
61
- };
62
- }
63
- catch (error) {
64
- console.error('Failed to connect to WebSocket:', error);
65
- tslib_1.__classPrivateFieldGet(this, _Socket_instances, "m", _Socket_handleReconnect).call(this);
66
- }
67
- }
68
- disconnect() {
69
- if (tslib_1.__classPrivateFieldGet(this, _Socket_websocket, "f")) {
70
- tslib_1.__classPrivateFieldGet(this, _Socket_websocket, "f").close();
71
- tslib_1.__classPrivateFieldSet(this, _Socket_websocket, undefined, "f");
72
- }
73
- tslib_1.__classPrivateFieldSet(this, _Socket_isConnected, false, "f");
74
- tslib_1.__classPrivateFieldSet(this, _Socket_reconnectAttempts, 0, "f");
75
- }
76
- isListening() {
77
- return tslib_1.__classPrivateFieldGet(this, _Socket_isConnected, "f");
78
- }
79
- }
80
- exports.Socket = Socket;
81
- _Socket_client = new WeakMap(), _Socket_socketUrl = new WeakMap(), _Socket_inboxToken = new WeakMap(), _Socket_origin = new WeakMap(), _Socket_websocket = new WeakMap(), _Socket_isConnected = new WeakMap(), _Socket_reconnectAttempts = new WeakMap(), _Socket_maxReconnectAttempts = new WeakMap(), _Socket_reconnectInterval = new WeakMap(), _Socket_notificationHandler = new WeakMap(), _Socket_instances = new WeakSet(), _Socket_handleMessage = function _Socket_handleMessage(data) {
82
- if (!tslib_1.__classPrivateFieldGet(this, _Socket_instances, "m", _Socket_isNewNotificationMessage).call(this, data)) {
83
- return;
84
- }
85
- tslib_1.__classPrivateFieldGet(this, _Socket_instances, "m", _Socket_handleNewNotification).call(this, data.data.id);
86
- }, _Socket_isNewNotificationMessage = function _Socket_isNewNotificationMessage(data) {
87
- return (typeof data === 'object' &&
88
- data !== null &&
89
- data.name === 'notifications/new' &&
90
- typeof data.data === 'object' &&
91
- data.data !== null &&
92
- typeof data.data.id === 'string');
93
- }, _Socket_handleNewNotification = async function _Socket_handleNewNotification(notificationId) {
94
- if (!tslib_1.__classPrivateFieldGet(this, _Socket_notificationHandler, "f")) {
95
- console.warn('No notification handler provided');
96
- return;
97
- }
98
- try {
99
- const { data: notification, metadata: res } = await tslib_1.__classPrivateFieldGet(this, _Socket_client, "f").notifications.fetchNotification(notificationId);
100
- if (!isOK(res)) {
101
- console.error(`Failed to fetch notification ${notificationId}: ${res.status} ${res.statusText}`);
102
- return;
103
- }
104
- if (notification) {
105
- tslib_1.__classPrivateFieldGet(this, _Socket_notificationHandler, "f").call(this, notification);
106
- }
107
- }
108
- catch (error) {
109
- console.error(`Error fetching notification ${notificationId}:`, error);
110
- }
111
- }, _Socket_handleReconnect = function _Socket_handleReconnect() {
112
- if (tslib_1.__classPrivateFieldGet(this, _Socket_reconnectAttempts, "f") >= tslib_1.__classPrivateFieldGet(this, _Socket_maxReconnectAttempts, "f")) {
113
- console.error('Max reconnection attempts reached');
114
- return;
115
- }
116
- if (!tslib_1.__classPrivateFieldGet(this, _Socket_notificationHandler, "f")) {
117
- console.warn('No notification handler, skipping reconnect');
118
- return;
119
- }
120
- setTimeout(() => {
121
- var _a;
122
- tslib_1.__classPrivateFieldSet(this, _Socket_reconnectAttempts, (_a = tslib_1.__classPrivateFieldGet(this, _Socket_reconnectAttempts, "f"), _a++, _a), "f");
123
- tslib_1.__classPrivateFieldSet(this, _Socket_reconnectInterval, Math.min(tslib_1.__classPrivateFieldGet(this, _Socket_reconnectInterval, "f") * 2, 30000), "f"); // Max 30 seconds
124
- this.listen(tslib_1.__classPrivateFieldGet(this, _Socket_notificationHandler, "f"));
125
- }, tslib_1.__classPrivateFieldGet(this, _Socket_reconnectInterval, "f"));
126
- }, _Socket_getUrl = async function _Socket_getUrl() {
127
- const jwtToken = tslib_1.__classPrivateFieldGet(this, _Socket_client, "f").config.token;
128
- (0, tiny_invariant_1.default)(jwtToken, 'Failed to get token from client');
129
- const apiKey = getApiKeyFromToken(jwtToken);
130
- (0, tiny_invariant_1.default)(apiKey, 'Failed to get API key from token');
131
- const token = await tslib_1.__classPrivateFieldGet(this, _Socket_instances, "m", _Socket_getToken).call(this);
132
- const url = new URL(tslib_1.__classPrivateFieldGet(this, _Socket_socketUrl, "f"));
133
- url.searchParams.set('api_key', apiKey);
134
- url.searchParams.set('token', token);
135
- tslib_1.__classPrivateFieldSet(this, _Socket_origin, url.origin, "f");
136
- return url.toString();
137
- }, _Socket_getToken = async function _Socket_getToken() {
138
- if (tslib_1.__classPrivateFieldGet(this, _Socket_inboxToken, "f"))
139
- return tslib_1.__classPrivateFieldGet(this, _Socket_inboxToken, "f");
140
- const { data, metadata: res } = await tslib_1.__classPrivateFieldGet(this, _Socket_client, "f").channels.saveInboxToken({
141
- token: getSessionId(),
142
- });
143
- (0, tiny_invariant_1.default)(isOK(res), `Failed to save Inbox token: ${res.status} ${res.statusText}`);
144
- (0, tiny_invariant_1.default)(data === null || data === void 0 ? void 0 : data.token, 'Unexpected server response, missing token');
145
- tslib_1.__classPrivateFieldSet(this, _Socket_inboxToken, data.token, "f");
146
- return tslib_1.__classPrivateFieldGet(this, _Socket_inboxToken, "f");
147
- };
148
- function isOK(response) {
149
- return response.status >= 200 && response.status < 300;
150
- }
151
- function getSessionId() {
152
- if (typeof sessionStorage === 'undefined') {
153
- return generateID(64);
154
- }
155
- // sessionStorage gets cleared when the page session ends. A page
156
- // session lasts for as long as the browser is open and survives
157
- // over page reloads and restores. Opening a page in a new tab or
158
- // window will cause a new session to be initiated. This gives us
159
- // a stable ID per tab, and different ID's across tabs.
160
- const stored = sessionStorage.getItem('magicbell--realtime-token');
161
- if (stored)
162
- return stored;
163
- const id = generateID(64);
164
- sessionStorage.setItem('magicbell--realtime-token', id);
165
- return id;
166
- }
167
- function generateID(length = 17) {
168
- let id = '';
169
- while (id.length < length) {
170
- id += getRandomValues();
171
- }
172
- return id.substring(0, length);
173
- }
174
- function getApiKeyFromToken(token) {
175
- const data = getTokenPayload(token);
176
- if (!data)
177
- return null;
178
- if (data.api_key) {
179
- return data.api_key;
180
- }
181
- return null;
182
- }
183
- function getTokenPayload(token) {
184
- try {
185
- const [_, payload] = token.split('.');
186
- const data = JSON.parse(atob(payload));
187
- return data || null;
188
- }
189
- catch (_a) {
190
- return null;
191
- }
192
- }
193
- const getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues
194
- ? () => crypto.getRandomValues(new Uint32Array(1))[0].toString(36)
195
- : () => Math.random().toString(36).substring(2, 15);
196
- //# sourceMappingURL=socket.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"socket.js","sourceRoot":"","sources":["../../src/socket.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../src/socket.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE7D,qBAAa,MAAM;;gBAYL,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM;IAQzC,MAAM,CAAC,cAAc,EAAE,CAAC,YAAY,EAAE,YAAY,KAAK,IAAI;IA6CjE,UAAU;IASV,WAAW;CA2FZ"}
@@ -1,192 +0,0 @@
1
- var _Socket_instances, _Socket_client, _Socket_socketUrl, _Socket_inboxToken, _Socket_origin, _Socket_websocket, _Socket_isConnected, _Socket_reconnectAttempts, _Socket_maxReconnectAttempts, _Socket_reconnectInterval, _Socket_notificationHandler, _Socket_handleMessage, _Socket_isNewNotificationMessage, _Socket_handleNewNotification, _Socket_handleReconnect, _Socket_getUrl, _Socket_getToken;
2
- import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
3
- import invariant from 'tiny-invariant';
4
- import { Client } from './user-client.js';
5
- export class Socket {
6
- constructor(options) {
7
- _Socket_instances.add(this);
8
- _Socket_client.set(this, void 0);
9
- _Socket_socketUrl.set(this, 'wss://ws.magicbell.com');
10
- _Socket_inboxToken.set(this, void 0);
11
- _Socket_origin.set(this, void 0);
12
- _Socket_websocket.set(this, void 0);
13
- _Socket_isConnected.set(this, false);
14
- _Socket_reconnectAttempts.set(this, 0);
15
- _Socket_maxReconnectAttempts.set(this, 5);
16
- _Socket_reconnectInterval.set(this, 1000);
17
- _Socket_notificationHandler.set(this, void 0);
18
- if (options instanceof Client) {
19
- __classPrivateFieldSet(this, _Socket_client, options, "f");
20
- }
21
- else {
22
- __classPrivateFieldSet(this, _Socket_client, new Client({ token: options.token }), "f");
23
- }
24
- }
25
- async listen(onNotification) {
26
- __classPrivateFieldSet(this, _Socket_notificationHandler, onNotification, "f");
27
- if (__classPrivateFieldGet(this, _Socket_websocket, "f") && __classPrivateFieldGet(this, _Socket_isConnected, "f")) {
28
- console.warn('Already connected to WebSocket');
29
- return;
30
- }
31
- try {
32
- const url = await __classPrivateFieldGet(this, _Socket_instances, "m", _Socket_getUrl).call(this);
33
- __classPrivateFieldSet(this, _Socket_websocket, new WebSocket(url), "f");
34
- __classPrivateFieldGet(this, _Socket_websocket, "f").onopen = () => {
35
- __classPrivateFieldSet(this, _Socket_isConnected, true, "f");
36
- __classPrivateFieldSet(this, _Socket_reconnectAttempts, 0, "f");
37
- __classPrivateFieldSet(this, _Socket_reconnectInterval, 1000, "f");
38
- };
39
- __classPrivateFieldGet(this, _Socket_websocket, "f").onmessage = (event) => {
40
- if (event.origin !== __classPrivateFieldGet(this, _Socket_origin, "f"))
41
- return;
42
- try {
43
- const data = JSON.parse(event.data);
44
- __classPrivateFieldGet(this, _Socket_instances, "m", _Socket_handleMessage).call(this, data);
45
- }
46
- catch (error) {
47
- console.error('Failed to parse WebSocket message:', error);
48
- }
49
- };
50
- __classPrivateFieldGet(this, _Socket_websocket, "f").onclose = (event) => {
51
- console.warn('WebSocket disconnected:', event.code, event.reason);
52
- __classPrivateFieldSet(this, _Socket_isConnected, false, "f");
53
- __classPrivateFieldGet(this, _Socket_instances, "m", _Socket_handleReconnect).call(this);
54
- };
55
- __classPrivateFieldGet(this, _Socket_websocket, "f").onerror = (error) => {
56
- console.error('WebSocket error:', error);
57
- __classPrivateFieldSet(this, _Socket_isConnected, false, "f");
58
- };
59
- }
60
- catch (error) {
61
- console.error('Failed to connect to WebSocket:', error);
62
- __classPrivateFieldGet(this, _Socket_instances, "m", _Socket_handleReconnect).call(this);
63
- }
64
- }
65
- disconnect() {
66
- if (__classPrivateFieldGet(this, _Socket_websocket, "f")) {
67
- __classPrivateFieldGet(this, _Socket_websocket, "f").close();
68
- __classPrivateFieldSet(this, _Socket_websocket, undefined, "f");
69
- }
70
- __classPrivateFieldSet(this, _Socket_isConnected, false, "f");
71
- __classPrivateFieldSet(this, _Socket_reconnectAttempts, 0, "f");
72
- }
73
- isListening() {
74
- return __classPrivateFieldGet(this, _Socket_isConnected, "f");
75
- }
76
- }
77
- _Socket_client = new WeakMap(), _Socket_socketUrl = new WeakMap(), _Socket_inboxToken = new WeakMap(), _Socket_origin = new WeakMap(), _Socket_websocket = new WeakMap(), _Socket_isConnected = new WeakMap(), _Socket_reconnectAttempts = new WeakMap(), _Socket_maxReconnectAttempts = new WeakMap(), _Socket_reconnectInterval = new WeakMap(), _Socket_notificationHandler = new WeakMap(), _Socket_instances = new WeakSet(), _Socket_handleMessage = function _Socket_handleMessage(data) {
78
- if (!__classPrivateFieldGet(this, _Socket_instances, "m", _Socket_isNewNotificationMessage).call(this, data)) {
79
- return;
80
- }
81
- __classPrivateFieldGet(this, _Socket_instances, "m", _Socket_handleNewNotification).call(this, data.data.id);
82
- }, _Socket_isNewNotificationMessage = function _Socket_isNewNotificationMessage(data) {
83
- return (typeof data === 'object' &&
84
- data !== null &&
85
- data.name === 'notifications/new' &&
86
- typeof data.data === 'object' &&
87
- data.data !== null &&
88
- typeof data.data.id === 'string');
89
- }, _Socket_handleNewNotification = async function _Socket_handleNewNotification(notificationId) {
90
- if (!__classPrivateFieldGet(this, _Socket_notificationHandler, "f")) {
91
- console.warn('No notification handler provided');
92
- return;
93
- }
94
- try {
95
- const { data: notification, metadata: res } = await __classPrivateFieldGet(this, _Socket_client, "f").notifications.fetchNotification(notificationId);
96
- if (!isOK(res)) {
97
- console.error(`Failed to fetch notification ${notificationId}: ${res.status} ${res.statusText}`);
98
- return;
99
- }
100
- if (notification) {
101
- __classPrivateFieldGet(this, _Socket_notificationHandler, "f").call(this, notification);
102
- }
103
- }
104
- catch (error) {
105
- console.error(`Error fetching notification ${notificationId}:`, error);
106
- }
107
- }, _Socket_handleReconnect = function _Socket_handleReconnect() {
108
- if (__classPrivateFieldGet(this, _Socket_reconnectAttempts, "f") >= __classPrivateFieldGet(this, _Socket_maxReconnectAttempts, "f")) {
109
- console.error('Max reconnection attempts reached');
110
- return;
111
- }
112
- if (!__classPrivateFieldGet(this, _Socket_notificationHandler, "f")) {
113
- console.warn('No notification handler, skipping reconnect');
114
- return;
115
- }
116
- setTimeout(() => {
117
- var _a;
118
- __classPrivateFieldSet(this, _Socket_reconnectAttempts, (_a = __classPrivateFieldGet(this, _Socket_reconnectAttempts, "f"), _a++, _a), "f");
119
- __classPrivateFieldSet(this, _Socket_reconnectInterval, Math.min(__classPrivateFieldGet(this, _Socket_reconnectInterval, "f") * 2, 30000), "f"); // Max 30 seconds
120
- this.listen(__classPrivateFieldGet(this, _Socket_notificationHandler, "f"));
121
- }, __classPrivateFieldGet(this, _Socket_reconnectInterval, "f"));
122
- }, _Socket_getUrl = async function _Socket_getUrl() {
123
- const jwtToken = __classPrivateFieldGet(this, _Socket_client, "f").config.token;
124
- invariant(jwtToken, 'Failed to get token from client');
125
- const apiKey = getApiKeyFromToken(jwtToken);
126
- invariant(apiKey, 'Failed to get API key from token');
127
- const token = await __classPrivateFieldGet(this, _Socket_instances, "m", _Socket_getToken).call(this);
128
- const url = new URL(__classPrivateFieldGet(this, _Socket_socketUrl, "f"));
129
- url.searchParams.set('api_key', apiKey);
130
- url.searchParams.set('token', token);
131
- __classPrivateFieldSet(this, _Socket_origin, url.origin, "f");
132
- return url.toString();
133
- }, _Socket_getToken = async function _Socket_getToken() {
134
- if (__classPrivateFieldGet(this, _Socket_inboxToken, "f"))
135
- return __classPrivateFieldGet(this, _Socket_inboxToken, "f");
136
- const { data, metadata: res } = await __classPrivateFieldGet(this, _Socket_client, "f").channels.saveInboxToken({
137
- token: getSessionId(),
138
- });
139
- invariant(isOK(res), `Failed to save Inbox token: ${res.status} ${res.statusText}`);
140
- invariant(data === null || data === void 0 ? void 0 : data.token, 'Unexpected server response, missing token');
141
- __classPrivateFieldSet(this, _Socket_inboxToken, data.token, "f");
142
- return __classPrivateFieldGet(this, _Socket_inboxToken, "f");
143
- };
144
- function isOK(response) {
145
- return response.status >= 200 && response.status < 300;
146
- }
147
- function getSessionId() {
148
- if (typeof sessionStorage === 'undefined') {
149
- return generateID(64);
150
- }
151
- // sessionStorage gets cleared when the page session ends. A page
152
- // session lasts for as long as the browser is open and survives
153
- // over page reloads and restores. Opening a page in a new tab or
154
- // window will cause a new session to be initiated. This gives us
155
- // a stable ID per tab, and different ID's across tabs.
156
- const stored = sessionStorage.getItem('magicbell--realtime-token');
157
- if (stored)
158
- return stored;
159
- const id = generateID(64);
160
- sessionStorage.setItem('magicbell--realtime-token', id);
161
- return id;
162
- }
163
- function generateID(length = 17) {
164
- let id = '';
165
- while (id.length < length) {
166
- id += getRandomValues();
167
- }
168
- return id.substring(0, length);
169
- }
170
- function getApiKeyFromToken(token) {
171
- const data = getTokenPayload(token);
172
- if (!data)
173
- return null;
174
- if (data.api_key) {
175
- return data.api_key;
176
- }
177
- return null;
178
- }
179
- function getTokenPayload(token) {
180
- try {
181
- const [_, payload] = token.split('.');
182
- const data = JSON.parse(atob(payload));
183
- return data || null;
184
- }
185
- catch (_a) {
186
- return null;
187
- }
188
- }
189
- const getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues
190
- ? () => crypto.getRandomValues(new Uint32Array(1))[0].toString(36)
191
- : () => Math.random().toString(36).substring(2, 15);
192
- //# sourceMappingURL=socket.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"socket.js","sourceRoot":"","sources":["../../src/socket.ts"],"names":[],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- {
2
- "main": "../dist/commonjs/socket.js",
3
- "types": "../dist/commonjs/socket.d.ts"
4
- }