@sogni-ai/sogni-client 4.0.0-alpha.19 → 4.0.0-alpha.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/dist/ApiClient/WebSocketClient/BrowserWebSocketClient/ChannelCoordinator.d.ts +66 -0
- package/dist/ApiClient/WebSocketClient/BrowserWebSocketClient/ChannelCoordinator.js +332 -0
- package/dist/ApiClient/WebSocketClient/BrowserWebSocketClient/ChannelCoordinator.js.map +1 -0
- package/dist/ApiClient/WebSocketClient/BrowserWebSocketClient/index.d.ts +3 -9
- package/dist/ApiClient/WebSocketClient/BrowserWebSocketClient/index.js +104 -100
- package/dist/ApiClient/WebSocketClient/BrowserWebSocketClient/index.js.map +1 -1
- package/dist/ApiClient/WebSocketClient/index.js +2 -2
- package/dist/ApiClient/WebSocketClient/index.js.map +1 -1
- package/dist/ApiClient/index.js +1 -1
- package/dist/ApiClient/index.js.map +1 -1
- package/package.json +1 -1
- package/src/ApiClient/WebSocketClient/BrowserWebSocketClient/ChannelCoordinator.ts +426 -0
- package/src/ApiClient/WebSocketClient/BrowserWebSocketClient/index.ts +127 -98
- package/src/ApiClient/WebSocketClient/index.ts +2 -2
- package/src/ApiClient/index.ts +1 -1
- package/dist/ApiClient/WebSocketClient/BrowserWebSocketClient/WSCoordinator.d.ts +0 -102
- package/dist/ApiClient/WebSocketClient/BrowserWebSocketClient/WSCoordinator.js +0 -378
- package/dist/ApiClient/WebSocketClient/BrowserWebSocketClient/WSCoordinator.js.map +0 -1
- package/dist/ApiClient/WebSocketClient/BrowserWebSocketClient/types.d.ts +0 -102
- package/dist/ApiClient/WebSocketClient/BrowserWebSocketClient/types.js +0 -3
- package/dist/ApiClient/WebSocketClient/BrowserWebSocketClient/types.js.map +0 -1
- package/src/ApiClient/WebSocketClient/BrowserWebSocketClient/WSCoordinator.ts +0 -443
- package/src/ApiClient/WebSocketClient/BrowserWebSocketClient/types.ts +0 -107
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
# [4.0.0-alpha.20](https://github.com/Sogni-AI/sogni-client/compare/v4.0.0-alpha.19...v4.0.0-alpha.20) (2025-12-04)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* Better socket coordinator implementation. Handle socket disconnection properly ([2a1a922](https://github.com/Sogni-AI/sogni-client/commit/2a1a922a0dd41446c1dcf6ffeaccfe54556af5bb))
|
|
7
|
+
|
|
1
8
|
# [4.0.0-alpha.19](https://github.com/Sogni-AI/sogni-client/compare/v4.0.0-alpha.18...v4.0.0-alpha.19) (2025-12-03)
|
|
2
9
|
|
|
3
10
|
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { Logger } from '../../../lib/DefaultLogger';
|
|
2
|
+
interface Callbacks<M, N> {
|
|
3
|
+
onRoleChange: (isPrimary: boolean) => void;
|
|
4
|
+
onMessage: (message: M) => Promise<void>;
|
|
5
|
+
onNotification: (notification: N) => void;
|
|
6
|
+
}
|
|
7
|
+
interface Options<M, N> {
|
|
8
|
+
callbacks: Callbacks<M, N>;
|
|
9
|
+
logger: Logger;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* A class responsible for coordinating communication across browser tabs or windows via BroadcastChannel API.
|
|
13
|
+
* It handles the role election of the primary (leader) tab, message broadcasting, heartbeats for primary tab monitoring,
|
|
14
|
+
* and message acknowledgment for reliable communication.
|
|
15
|
+
*
|
|
16
|
+
* The `ChannelCoordinator` ensures that one tab per session is assigned as the primary, while allowing others to act as secondaries,
|
|
17
|
+
* utilizing various message types for communication and coordination.
|
|
18
|
+
*
|
|
19
|
+
* Message is sent by secondary tabs to the primary tab via the `sendMessage` method. By sending message
|
|
20
|
+
* tab can tell primary to connect, disconnect, send message to socket etc.
|
|
21
|
+
*
|
|
22
|
+
* Notification is type of message broadcasted by primary to secondary tabs. This is mostly used to
|
|
23
|
+
* broadcast socket events from primary to secondary tabs.
|
|
24
|
+
*
|
|
25
|
+
* @template M - The type of messages being broadcast to other tabs/windows.
|
|
26
|
+
* @template N - The type of notifications being handled within the coordinator.
|
|
27
|
+
*/
|
|
28
|
+
declare class ChannelCoordinator<M, N> {
|
|
29
|
+
private readonly id;
|
|
30
|
+
private priority;
|
|
31
|
+
private readonly channel;
|
|
32
|
+
private _isPrimary;
|
|
33
|
+
private callbacks;
|
|
34
|
+
private logger;
|
|
35
|
+
private ackCallbacks;
|
|
36
|
+
private electionInProgress;
|
|
37
|
+
private electionResponses;
|
|
38
|
+
private lastPrimaryHeartbeat;
|
|
39
|
+
private heartbeatTimer;
|
|
40
|
+
private primaryCheckTimer;
|
|
41
|
+
private readyCallback;
|
|
42
|
+
private readonly readyPromise;
|
|
43
|
+
constructor({ callbacks, logger }: Options<M, N>);
|
|
44
|
+
get isPrimary(): boolean;
|
|
45
|
+
private get currentPriority();
|
|
46
|
+
isReady(): Promise<void>;
|
|
47
|
+
private startElections;
|
|
48
|
+
private finishElections;
|
|
49
|
+
private becomePrimary;
|
|
50
|
+
private startHeartbeat;
|
|
51
|
+
private stopHeartbeat;
|
|
52
|
+
private startPrimaryMonitor;
|
|
53
|
+
private handleMessage;
|
|
54
|
+
private handleElection;
|
|
55
|
+
private handleElectionResponse;
|
|
56
|
+
private handlePrimaryAnnounce;
|
|
57
|
+
private handlePrimaryHeartbeat;
|
|
58
|
+
private handleBroadcast;
|
|
59
|
+
private handleRequest;
|
|
60
|
+
private handleRequestAck;
|
|
61
|
+
private send;
|
|
62
|
+
private broadcast;
|
|
63
|
+
sendMessage(message: M): Promise<any>;
|
|
64
|
+
notify(message: N): void;
|
|
65
|
+
}
|
|
66
|
+
export default ChannelCoordinator;
|
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const getUUID_1 = __importDefault(require("../../../lib/getUUID"));
|
|
16
|
+
const PRIMARY_HEARTBEAT_INTERVAL = 2000;
|
|
17
|
+
const PRIMARY_TIMEOUT = 4000;
|
|
18
|
+
const ACK_TIMEOUT = 5000;
|
|
19
|
+
var MessageType;
|
|
20
|
+
(function (MessageType) {
|
|
21
|
+
MessageType["ELECTION"] = "election";
|
|
22
|
+
MessageType["ELECTION_RESPONSE"] = "election_response";
|
|
23
|
+
MessageType["PRIMARY_ANNOUNCE"] = "primary_announce";
|
|
24
|
+
MessageType["PRIMARY_HEARTBEAT"] = "primary_heartbeat";
|
|
25
|
+
MessageType["BROADCAST"] = "broadcast";
|
|
26
|
+
MessageType["REQUEST"] = "request";
|
|
27
|
+
MessageType["REQUEST_ACK"] = "request_ack";
|
|
28
|
+
})(MessageType || (MessageType = {}));
|
|
29
|
+
const CHANNEL_NAME = 'sogni-websocket-channel';
|
|
30
|
+
let isActiveTab = false;
|
|
31
|
+
if (typeof window !== 'undefined' && window.location.protocol === 'https:') {
|
|
32
|
+
isActiveTab = window.document.visibilityState === 'visible';
|
|
33
|
+
window.addEventListener('visibilitychange', () => (isActiveTab = window.document.visibilityState === 'visible'));
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* A class responsible for coordinating communication across browser tabs or windows via BroadcastChannel API.
|
|
37
|
+
* It handles the role election of the primary (leader) tab, message broadcasting, heartbeats for primary tab monitoring,
|
|
38
|
+
* and message acknowledgment for reliable communication.
|
|
39
|
+
*
|
|
40
|
+
* The `ChannelCoordinator` ensures that one tab per session is assigned as the primary, while allowing others to act as secondaries,
|
|
41
|
+
* utilizing various message types for communication and coordination.
|
|
42
|
+
*
|
|
43
|
+
* Message is sent by secondary tabs to the primary tab via the `sendMessage` method. By sending message
|
|
44
|
+
* tab can tell primary to connect, disconnect, send message to socket etc.
|
|
45
|
+
*
|
|
46
|
+
* Notification is type of message broadcasted by primary to secondary tabs. This is mostly used to
|
|
47
|
+
* broadcast socket events from primary to secondary tabs.
|
|
48
|
+
*
|
|
49
|
+
* @template M - The type of messages being broadcast to other tabs/windows.
|
|
50
|
+
* @template N - The type of notifications being handled within the coordinator.
|
|
51
|
+
*/
|
|
52
|
+
class ChannelCoordinator {
|
|
53
|
+
constructor({ callbacks, logger }) {
|
|
54
|
+
this.id = (0, getUUID_1.default)();
|
|
55
|
+
this.priority = Date.now();
|
|
56
|
+
this.channel = new BroadcastChannel(CHANNEL_NAME);
|
|
57
|
+
this._isPrimary = false;
|
|
58
|
+
this.ackCallbacks = {};
|
|
59
|
+
// User to handle election of primary tab
|
|
60
|
+
this.electionInProgress = false;
|
|
61
|
+
this.electionResponses = new Map();
|
|
62
|
+
// Heartbeat to detect primary tab death
|
|
63
|
+
this.lastPrimaryHeartbeat = Date.now();
|
|
64
|
+
this.heartbeatTimer = null;
|
|
65
|
+
this.primaryCheckTimer = null;
|
|
66
|
+
this.readyCallback = () => { };
|
|
67
|
+
this.readyPromise = new Promise((resolve) => {
|
|
68
|
+
let called = false;
|
|
69
|
+
this.readyCallback = () => {
|
|
70
|
+
if (!called) {
|
|
71
|
+
called = true;
|
|
72
|
+
resolve();
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
});
|
|
76
|
+
this.callbacks = callbacks;
|
|
77
|
+
this.logger = logger;
|
|
78
|
+
this.channel.addEventListener('message', (event) => this.handleMessage(event.data));
|
|
79
|
+
this.startElections();
|
|
80
|
+
this.startPrimaryMonitor();
|
|
81
|
+
// Listen for tab closing to gracefully release primary role
|
|
82
|
+
if (typeof window !== 'undefined') {
|
|
83
|
+
window.addEventListener('beforeunload', () => {
|
|
84
|
+
this.priority = 0;
|
|
85
|
+
this.startElections();
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
get isPrimary() {
|
|
90
|
+
return this._isPrimary;
|
|
91
|
+
}
|
|
92
|
+
get currentPriority() {
|
|
93
|
+
return isActiveTab ? this.priority * 10 : this.priority;
|
|
94
|
+
}
|
|
95
|
+
isReady() {
|
|
96
|
+
return this.readyPromise;
|
|
97
|
+
}
|
|
98
|
+
startElections() {
|
|
99
|
+
this.logger.debug(`Start primary elections, my priority is ${this.currentPriority}, tab visibility is ${isActiveTab}`);
|
|
100
|
+
this.electionInProgress = true;
|
|
101
|
+
this.electionResponses.clear();
|
|
102
|
+
this.electionResponses.set(this.id, this.currentPriority);
|
|
103
|
+
this.broadcast({
|
|
104
|
+
type: MessageType.ELECTION,
|
|
105
|
+
payload: { priority: this.currentPriority }
|
|
106
|
+
});
|
|
107
|
+
setTimeout(() => {
|
|
108
|
+
this.finishElections();
|
|
109
|
+
}, 500);
|
|
110
|
+
}
|
|
111
|
+
finishElections() {
|
|
112
|
+
if (!this.electionInProgress) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
// Find highest priority
|
|
116
|
+
let highestPriority = -Infinity;
|
|
117
|
+
let winnerId = null;
|
|
118
|
+
for (const [id, priority] of this.electionResponses) {
|
|
119
|
+
if (priority > highestPriority || (priority === highestPriority && id > (winnerId || ''))) {
|
|
120
|
+
highestPriority = priority;
|
|
121
|
+
winnerId = id;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (winnerId === this.id) {
|
|
125
|
+
this.becomePrimary();
|
|
126
|
+
this.logger.debug(`Won elections! ${winnerId}`);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
this.logger.debug(`Lost elections! Winner is ${winnerId}`);
|
|
130
|
+
}
|
|
131
|
+
this.electionInProgress = false;
|
|
132
|
+
this.electionResponses.clear();
|
|
133
|
+
}
|
|
134
|
+
becomePrimary() {
|
|
135
|
+
this._isPrimary = true;
|
|
136
|
+
this.lastPrimaryHeartbeat = Date.now();
|
|
137
|
+
this.broadcast({
|
|
138
|
+
type: MessageType.PRIMARY_ANNOUNCE,
|
|
139
|
+
payload: { id: this.id, priority: this.currentPriority }
|
|
140
|
+
});
|
|
141
|
+
this.startHeartbeat();
|
|
142
|
+
this.callbacks.onRoleChange(true);
|
|
143
|
+
this.readyCallback();
|
|
144
|
+
}
|
|
145
|
+
startHeartbeat() {
|
|
146
|
+
if (this.heartbeatTimer) {
|
|
147
|
+
clearInterval(this.heartbeatTimer);
|
|
148
|
+
}
|
|
149
|
+
this.heartbeatTimer = setInterval(() => {
|
|
150
|
+
if (this._isPrimary) {
|
|
151
|
+
this.broadcast({
|
|
152
|
+
type: MessageType.PRIMARY_HEARTBEAT,
|
|
153
|
+
payload: { id: this.id, priority: this.currentPriority }
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
this.stopHeartbeat();
|
|
158
|
+
}
|
|
159
|
+
}, PRIMARY_HEARTBEAT_INTERVAL);
|
|
160
|
+
}
|
|
161
|
+
stopHeartbeat() {
|
|
162
|
+
if (this.heartbeatTimer) {
|
|
163
|
+
clearInterval(this.heartbeatTimer);
|
|
164
|
+
this.heartbeatTimer = null;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
startPrimaryMonitor() {
|
|
168
|
+
if (this.primaryCheckTimer) {
|
|
169
|
+
clearInterval(this.primaryCheckTimer);
|
|
170
|
+
}
|
|
171
|
+
this.primaryCheckTimer = setInterval(() => {
|
|
172
|
+
if (!this._isPrimary) {
|
|
173
|
+
const timeSinceLastHeartbeat = Date.now() - this.lastPrimaryHeartbeat;
|
|
174
|
+
if (timeSinceLastHeartbeat > PRIMARY_TIMEOUT) {
|
|
175
|
+
this.startElections();
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
this.lastPrimaryHeartbeat = Date.now();
|
|
180
|
+
}
|
|
181
|
+
}, PRIMARY_HEARTBEAT_INTERVAL);
|
|
182
|
+
}
|
|
183
|
+
handleMessage(envelope) {
|
|
184
|
+
const { senderId, recipientId, message } = envelope;
|
|
185
|
+
const isForOtherClient = recipientId && recipientId !== this.id;
|
|
186
|
+
if (senderId === this.id || isForOtherClient) {
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
switch (message.type) {
|
|
190
|
+
case MessageType.ELECTION:
|
|
191
|
+
return this.handleElection(message);
|
|
192
|
+
case MessageType.ELECTION_RESPONSE:
|
|
193
|
+
return this.handleElectionResponse(message);
|
|
194
|
+
case MessageType.PRIMARY_ANNOUNCE:
|
|
195
|
+
return this.handlePrimaryAnnounce(message);
|
|
196
|
+
case MessageType.PRIMARY_HEARTBEAT:
|
|
197
|
+
return this.handlePrimaryHeartbeat(message);
|
|
198
|
+
case MessageType.BROADCAST:
|
|
199
|
+
return this.handleBroadcast(message);
|
|
200
|
+
case MessageType.REQUEST:
|
|
201
|
+
return this.handleRequest(message, envelope);
|
|
202
|
+
case MessageType.REQUEST_ACK:
|
|
203
|
+
return this.handleRequestAck(message);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
handleElection(message) {
|
|
207
|
+
this.broadcast({
|
|
208
|
+
type: MessageType.ELECTION_RESPONSE,
|
|
209
|
+
payload: { id: this.id, priority: this.currentPriority }
|
|
210
|
+
});
|
|
211
|
+
if (this.currentPriority > message.payload.priority && !this.electionInProgress) {
|
|
212
|
+
this.startElections();
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
handleElectionResponse(message) {
|
|
216
|
+
if (this.electionInProgress) {
|
|
217
|
+
this.electionResponses.set(message.payload.id, message.payload.priority);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
handlePrimaryAnnounce(message) {
|
|
221
|
+
this.logger.debug(`Primary announced: ${message.payload.id}`);
|
|
222
|
+
const wasPrimary = this._isPrimary;
|
|
223
|
+
this._isPrimary = false;
|
|
224
|
+
this.lastPrimaryHeartbeat = Date.now();
|
|
225
|
+
this.electionInProgress = false;
|
|
226
|
+
this.electionResponses.clear();
|
|
227
|
+
if (this.heartbeatTimer) {
|
|
228
|
+
clearInterval(this.heartbeatTimer);
|
|
229
|
+
this.heartbeatTimer = null;
|
|
230
|
+
}
|
|
231
|
+
if (wasPrimary) {
|
|
232
|
+
this.callbacks.onRoleChange(false);
|
|
233
|
+
}
|
|
234
|
+
this.readyCallback();
|
|
235
|
+
}
|
|
236
|
+
handlePrimaryHeartbeat(message) {
|
|
237
|
+
this.lastPrimaryHeartbeat = Date.now();
|
|
238
|
+
}
|
|
239
|
+
handleBroadcast(message) {
|
|
240
|
+
this.logger.debug(`Received broadcast from primary`, message.payload);
|
|
241
|
+
this.callbacks.onNotification(message.payload);
|
|
242
|
+
}
|
|
243
|
+
handleRequest(message, envelope) {
|
|
244
|
+
if (!this.isPrimary) {
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
this.logger.debug(`Received request from secondary`, message.payload);
|
|
248
|
+
this.callbacks
|
|
249
|
+
.onMessage(message.payload)
|
|
250
|
+
.then(() => {
|
|
251
|
+
this.send({
|
|
252
|
+
type: MessageType.REQUEST_ACK,
|
|
253
|
+
payload: { id: envelope.id }
|
|
254
|
+
}, envelope.senderId);
|
|
255
|
+
})
|
|
256
|
+
.catch((error) => {
|
|
257
|
+
this.send({
|
|
258
|
+
type: MessageType.REQUEST_ACK,
|
|
259
|
+
payload: { id: envelope.id, error }
|
|
260
|
+
}, envelope.senderId);
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
handleRequestAck(message) {
|
|
264
|
+
const ackCallback = this.ackCallbacks[message.payload.id];
|
|
265
|
+
if (ackCallback) {
|
|
266
|
+
ackCallback(message.payload.error);
|
|
267
|
+
delete this.ackCallbacks[message.payload.id];
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
send(message, recipientId) {
|
|
271
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
272
|
+
const envelope = {
|
|
273
|
+
id: (0, getUUID_1.default)(),
|
|
274
|
+
senderId: this.id,
|
|
275
|
+
recipientId,
|
|
276
|
+
timestamp: Date.now(),
|
|
277
|
+
message: message
|
|
278
|
+
};
|
|
279
|
+
if (message.type !== MessageType.REQUEST) {
|
|
280
|
+
this.channel.postMessage(envelope);
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
return new Promise((resolve, reject) => {
|
|
284
|
+
const ackTimeout = setTimeout(() => {
|
|
285
|
+
if (this.ackCallbacks[envelope.id]) {
|
|
286
|
+
this.ackCallbacks[envelope.id](new Error('Message delivery timeout'));
|
|
287
|
+
delete this.ackCallbacks[envelope.id];
|
|
288
|
+
}
|
|
289
|
+
}, ACK_TIMEOUT);
|
|
290
|
+
this.ackCallbacks[envelope.id] = (error) => {
|
|
291
|
+
clearTimeout(ackTimeout);
|
|
292
|
+
delete this.ackCallbacks[envelope.id];
|
|
293
|
+
if (error) {
|
|
294
|
+
reject(error);
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
resolve();
|
|
298
|
+
}
|
|
299
|
+
};
|
|
300
|
+
this.channel.postMessage(envelope);
|
|
301
|
+
});
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
broadcast(message) {
|
|
305
|
+
const envelope = {
|
|
306
|
+
id: (0, getUUID_1.default)(),
|
|
307
|
+
senderId: this.id,
|
|
308
|
+
timestamp: Date.now(),
|
|
309
|
+
message: message
|
|
310
|
+
};
|
|
311
|
+
this.channel.postMessage(envelope);
|
|
312
|
+
return envelope.id;
|
|
313
|
+
}
|
|
314
|
+
sendMessage(message) {
|
|
315
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
316
|
+
this.logger.debug(`Sending message to primary`, message);
|
|
317
|
+
return this.send({
|
|
318
|
+
type: MessageType.REQUEST,
|
|
319
|
+
payload: message
|
|
320
|
+
});
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
notify(message) {
|
|
324
|
+
this.logger.debug(`Sending notification to secondary tabs`, message);
|
|
325
|
+
this.broadcast({
|
|
326
|
+
type: MessageType.BROADCAST,
|
|
327
|
+
payload: message
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
exports.default = ChannelCoordinator;
|
|
332
|
+
//# sourceMappingURL=ChannelCoordinator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChannelCoordinator.js","sourceRoot":"","sources":["../../../../src/ApiClient/WebSocketClient/BrowserWebSocketClient/ChannelCoordinator.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,26 +9,20 @@ declare class BrowserWebSocketClient extends RestClient<SocketEventMap> implemen
|
|
|
9
9
|
baseUrl: string;
|
|
10
10
|
private socketClient;
|
|
11
11
|
private coordinator;
|
|
12
|
-
private isPrimary;
|
|
13
12
|
private _isConnected;
|
|
14
13
|
private _supernetType;
|
|
15
14
|
constructor(baseUrl: string, auth: AuthManager, appId: string, supernetType: SupernetType, logger: Logger);
|
|
16
15
|
get isConnected(): boolean;
|
|
17
16
|
get supernetType(): SupernetType;
|
|
18
17
|
connect(): Promise<void>;
|
|
19
|
-
disconnect(): void
|
|
18
|
+
disconnect(): Promise<void>;
|
|
20
19
|
switchNetwork(supernetType: SupernetType): Promise<SupernetType>;
|
|
21
20
|
send<T extends MessageType>(messageType: T, data: SocketMessageMap[T]): Promise<void>;
|
|
21
|
+
private handleMessage;
|
|
22
|
+
private handleNotification;
|
|
22
23
|
private handleAuthChanged;
|
|
23
24
|
private handleSocketEvent;
|
|
24
25
|
private handleAuthUpdated;
|
|
25
26
|
private handleRoleChange;
|
|
26
|
-
private handleConnectionToggle;
|
|
27
|
-
/**
|
|
28
|
-
* Emit events from socket to listeners
|
|
29
|
-
* @param message
|
|
30
|
-
*/
|
|
31
|
-
private handleMessageFromPrimary;
|
|
32
|
-
private handleSendRequest;
|
|
33
27
|
}
|
|
34
28
|
export default BrowserWebSocketClient;
|