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 +58 -0
- package/dist/commonjs/{socket.d.ts → realtime.d.ts} +2 -2
- package/dist/commonjs/realtime.d.ts.map +1 -0
- package/dist/commonjs/realtime.js +200 -0
- package/dist/commonjs/realtime.js.map +1 -0
- package/dist/esm/{socket.d.ts → realtime.d.ts} +2 -2
- package/dist/esm/realtime.d.ts.map +1 -0
- package/dist/esm/realtime.js +196 -0
- package/dist/esm/realtime.js.map +1 -0
- package/package.json +7 -7
- package/realtime/package.json +4 -0
- package/src/{socket.ts → realtime.ts} +8 -4
- package/dist/commonjs/socket.d.ts.map +0 -1
- package/dist/commonjs/socket.js +0 -196
- package/dist/commonjs/socket.js.map +0 -1
- package/dist/esm/socket.d.ts.map +0 -1
- package/dist/esm/socket.js +0 -192
- package/dist/esm/socket.js.map +0 -1
- package/socket/package.json +0 -4
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
|
|
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=
|
|
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":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type Notification, Client } from './user-client.js';
|
|
2
|
-
export declare class
|
|
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=
|
|
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.
|
|
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
|
-
"./
|
|
29
|
+
"./realtime": {
|
|
30
30
|
"import": {
|
|
31
|
-
"types": "./dist/esm/
|
|
32
|
-
"default": "./dist/esm/
|
|
31
|
+
"types": "./dist/esm/realtime.d.ts",
|
|
32
|
+
"default": "./dist/esm/realtime.js"
|
|
33
33
|
},
|
|
34
34
|
"require": {
|
|
35
|
-
"types": "./dist/commonjs/
|
|
36
|
-
"default": "./dist/commonjs/
|
|
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
|
-
"/
|
|
57
|
+
"/realtime/package.json"
|
|
58
58
|
],
|
|
59
59
|
"scripts": {
|
|
60
60
|
"build": "run-s build:bundle build:node10 build:docs build:attw",
|
|
@@ -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
|
|
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
|
|
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"}
|
package/dist/commonjs/socket.js
DELETED
|
@@ -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":";;;;;AAAA,4EAAuC;AAEvC,qDAA6D;AAE7D,MAAa,MAAM;IAYjB,YAAY,OAAmC;;QAX/C,iCAAgB;QAChB,4BAAa,wBAAwB,EAAC;QACtC,qCAAgC;QAChC,iCAA4B;QAC5B,oCAAkC;QAClC,8BAAe,KAAK,EAAC;QACrB,oCAAqB,CAAC,EAAC;QACvB,uCAAwB,CAAC,EAAC;QAC1B,oCAAqB,IAAI,EAAC;QAC1B,8CAAyE;QAGvE,IAAI,OAAO,YAAY,uBAAM,EAAE,CAAC;YAC9B,+BAAA,IAAI,kBAAW,OAAO,MAAA,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,+BAAA,IAAI,kBAAW,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,+BAAwB,cAAc,MAAA,CAAC;QAE3C,IAAI,+BAAA,IAAI,yBAAW,IAAI,+BAAA,IAAI,2BAAa,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,yCAAQ,MAAZ,IAAI,CAAU,CAAC;YACjC,+BAAA,IAAI,qBAAc,IAAI,SAAS,CAAC,GAAG,CAAC,MAAA,CAAC;YAErC,+BAAA,IAAI,yBAAW,CAAC,MAAM,GAAG,GAAG,EAAE;gBAC5B,+BAAA,IAAI,uBAAgB,IAAI,MAAA,CAAC;gBACzB,+BAAA,IAAI,6BAAsB,CAAC,MAAA,CAAC;gBAC5B,+BAAA,IAAI,6BAAsB,IAAI,MAAA,CAAC;YACjC,CAAC,CAAC;YAEF,+BAAA,IAAI,yBAAW,CAAC,SAAS,GAAG,CAAC,KAAK,EAAE,EAAE;gBACpC,IAAI,KAAK,CAAC,MAAM,KAAK,+BAAA,IAAI,sBAAQ;oBAAE,OAAO;gBAE1C,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACpC,+BAAA,IAAI,gDAAe,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,yBAAW,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,uBAAgB,KAAK,MAAA,CAAC;gBAC1B,+BAAA,IAAI,kDAAiB,MAArB,IAAI,CAAmB,CAAC;YAC1B,CAAC,CAAC;YAEF,+BAAA,IAAI,yBAAW,CAAC,OAAO,GAAG,CAAC,KAAK,EAAE,EAAE;gBAClC,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;gBACzC,+BAAA,IAAI,uBAAgB,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,kDAAiB,MAArB,IAAI,CAAmB,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,UAAU;QACR,IAAI,+BAAA,IAAI,yBAAW,EAAE,CAAC;YACpB,+BAAA,IAAI,yBAAW,CAAC,KAAK,EAAE,CAAC;YACxB,+BAAA,IAAI,qBAAc,SAAS,MAAA,CAAC;QAC9B,CAAC;QACD,+BAAA,IAAI,uBAAgB,KAAK,MAAA,CAAC;QAC1B,+BAAA,IAAI,6BAAsB,CAAC,MAAA,CAAC;IAC9B,CAAC;IAED,WAAW;QACT,OAAO,+BAAA,IAAI,2BAAa,CAAC;IAC3B,CAAC;CAyFF;AArKD,wBAqKC;0dAvFgB,IAAS;IACtB,IAAI,CAAC,+BAAA,IAAI,2DAA0B,MAA9B,IAAI,EAA2B,IAAI,CAAC,EAAE,CAAC;QAC1C,OAAO;IACT,CAAC;IAED,+BAAA,IAAI,wDAAuB,MAA3B,IAAI,EAAwB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC5C,CAAC,+EAEyB,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,kCAED,KAAK,wCAAwB,cAAsB;IACjD,IAAI,CAAC,+BAAA,IAAI,mCAAqB,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,sBAAQ,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,mCAAqB,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,iCAAmB,IAAI,+BAAA,IAAI,oCAAsB,EAAE,CAAC;QAC1D,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACnD,OAAO;IACT,CAAC;IAED,IAAI,CAAC,+BAAA,IAAI,mCAAqB,EAAE,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAC5D,OAAO;IACT,CAAC;IAED,UAAU,CAAC,GAAG,EAAE;;QACd,gEAAA,CAAA,yEAAuB,EAAvB,IAAyB,IAAA,CAAA,MAAA,CAAC;QAC1B,+BAAA,IAAI,6BAAsB,IAAI,CAAC,GAAG,CAAC,+BAAA,IAAI,iCAAmB,GAAG,CAAC,EAAE,KAAK,CAAC,MAAA,CAAC,CAAC,iBAAiB;QACzF,IAAI,CAAC,MAAM,CAAC,+BAAA,IAAI,mCAAsB,CAAC,CAAC;IAC1C,CAAC,EAAE,+BAAA,IAAI,iCAAmB,CAAC,CAAC;AAC9B,CAAC,mBAED,KAAK;IACH,MAAM,QAAQ,GAAG,+BAAA,IAAI,sBAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;IAC3C,IAAA,wBAAS,EAAC,QAAQ,EAAE,iCAAiC,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAA,wBAAS,EAAC,MAAM,EAAE,kCAAkC,CAAC,CAAC;IAEtD,MAAM,KAAK,GAAG,MAAM,+BAAA,IAAI,2CAAU,MAAd,IAAI,CAAY,CAAC;IACrC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,+BAAA,IAAI,yBAAW,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,kBAAW,GAAG,CAAC,MAAM,MAAA,CAAC;IAC1B,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC,qBAED,KAAK;IACH,IAAI,+BAAA,IAAI,0BAAY;QAAE,OAAO,+BAAA,IAAI,0BAAY,CAAC;IAE9C,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,MAAM,+BAAA,IAAI,sBAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC;QACzE,KAAK,EAAE,YAAY,EAAE;KACtB,CAAC,CAAC;IAEH,IAAA,wBAAS,EAAC,IAAI,CAAC,GAAG,CAAC,EAAE,+BAA+B,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IACpF,IAAA,wBAAS,EAAC,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,KAAK,EAAE,2CAA2C,CAAC,CAAC;IAEpE,+BAAA,IAAI,sBAAe,IAAI,CAAC,KAAK,MAAA,CAAC;IAC9B,OAAO,+BAAA,IAAI,0BAAY,CAAC;AAC1B,CAAC;AAGH,SAAS,IAAI,CAAC,QAA4B;IACxC,OAAO,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC;AACzD,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"}
|
package/dist/esm/socket.d.ts.map
DELETED
|
@@ -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"}
|
package/dist/esm/socket.js
DELETED
|
@@ -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
|
package/dist/esm/socket.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"socket.js","sourceRoot":"","sources":["../../src/socket.ts"],"names":[],"mappings":"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"}
|
package/socket/package.json
DELETED