@sogni-ai/sogni-client 4.0.0-alpha.3 → 4.0.0-alpha.31

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.
Files changed (76) hide show
  1. package/CHANGELOG.md +220 -0
  2. package/README.md +279 -28
  3. package/dist/Account/index.d.ts +18 -16
  4. package/dist/Account/index.js +31 -20
  5. package/dist/Account/index.js.map +1 -1
  6. package/dist/ApiClient/WebSocketClient/BrowserWebSocketClient/ChannelCoordinator.d.ts +66 -0
  7. package/dist/ApiClient/WebSocketClient/BrowserWebSocketClient/ChannelCoordinator.js +332 -0
  8. package/dist/ApiClient/WebSocketClient/BrowserWebSocketClient/ChannelCoordinator.js.map +1 -0
  9. package/dist/ApiClient/WebSocketClient/BrowserWebSocketClient/index.d.ts +28 -0
  10. package/dist/ApiClient/WebSocketClient/BrowserWebSocketClient/index.js +203 -0
  11. package/dist/ApiClient/WebSocketClient/BrowserWebSocketClient/index.js.map +1 -0
  12. package/dist/ApiClient/WebSocketClient/events.d.ts +11 -0
  13. package/dist/ApiClient/WebSocketClient/index.d.ts +2 -2
  14. package/dist/ApiClient/WebSocketClient/index.js +13 -3
  15. package/dist/ApiClient/WebSocketClient/index.js.map +1 -1
  16. package/dist/ApiClient/WebSocketClient/types.d.ts +13 -0
  17. package/dist/ApiClient/index.d.ts +4 -4
  18. package/dist/ApiClient/index.js +23 -4
  19. package/dist/ApiClient/index.js.map +1 -1
  20. package/dist/Projects/Job.d.ts +44 -4
  21. package/dist/Projects/Job.js +83 -16
  22. package/dist/Projects/Job.js.map +1 -1
  23. package/dist/Projects/Project.d.ts +18 -0
  24. package/dist/Projects/Project.js +34 -6
  25. package/dist/Projects/Project.js.map +1 -1
  26. package/dist/Projects/createJobRequestMessage.js +109 -15
  27. package/dist/Projects/createJobRequestMessage.js.map +1 -1
  28. package/dist/Projects/index.d.ts +110 -11
  29. package/dist/Projects/index.js +423 -42
  30. package/dist/Projects/index.js.map +1 -1
  31. package/dist/Projects/types/EstimationResponse.d.ts +2 -0
  32. package/dist/Projects/types/SamplerParams.d.ts +13 -0
  33. package/dist/Projects/types/SamplerParams.js +26 -0
  34. package/dist/Projects/types/SamplerParams.js.map +1 -0
  35. package/dist/Projects/types/SchedulerParams.d.ts +14 -0
  36. package/dist/Projects/types/SchedulerParams.js +24 -0
  37. package/dist/Projects/types/SchedulerParams.js.map +1 -0
  38. package/dist/Projects/types/events.d.ts +5 -1
  39. package/dist/Projects/types/index.d.ts +150 -39
  40. package/dist/Projects/types/index.js +13 -0
  41. package/dist/Projects/types/index.js.map +1 -1
  42. package/dist/Projects/utils.d.ts +19 -1
  43. package/dist/Projects/utils.js +68 -0
  44. package/dist/Projects/utils.js.map +1 -1
  45. package/dist/index.d.ts +12 -4
  46. package/dist/index.js +12 -4
  47. package/dist/index.js.map +1 -1
  48. package/dist/lib/AuthManager/TokenAuthManager.js +0 -2
  49. package/dist/lib/AuthManager/TokenAuthManager.js.map +1 -1
  50. package/dist/lib/DataEntity.js +4 -2
  51. package/dist/lib/DataEntity.js.map +1 -1
  52. package/dist/lib/validation.d.ts +7 -0
  53. package/dist/lib/validation.js +36 -0
  54. package/dist/lib/validation.js.map +1 -1
  55. package/package.json +4 -4
  56. package/src/Account/index.ts +30 -19
  57. package/src/ApiClient/WebSocketClient/BrowserWebSocketClient/ChannelCoordinator.ts +426 -0
  58. package/src/ApiClient/WebSocketClient/BrowserWebSocketClient/index.ts +237 -0
  59. package/src/ApiClient/WebSocketClient/events.ts +13 -0
  60. package/src/ApiClient/WebSocketClient/index.ts +15 -5
  61. package/src/ApiClient/WebSocketClient/types.ts +16 -0
  62. package/src/ApiClient/index.ts +30 -8
  63. package/src/Projects/Job.ts +97 -16
  64. package/src/Projects/Project.ts +42 -9
  65. package/src/Projects/createJobRequestMessage.ts +155 -36
  66. package/src/Projects/index.ts +447 -46
  67. package/src/Projects/types/EstimationResponse.ts +2 -0
  68. package/src/Projects/types/SamplerParams.ts +24 -0
  69. package/src/Projects/types/SchedulerParams.ts +22 -0
  70. package/src/Projects/types/events.ts +6 -0
  71. package/src/Projects/types/index.ts +181 -47
  72. package/src/Projects/utils.ts +66 -1
  73. package/src/index.ts +38 -11
  74. package/src/lib/AuthManager/TokenAuthManager.ts +0 -2
  75. package/src/lib/DataEntity.ts +4 -2
  76. package/src/lib/validation.ts +41 -0
@@ -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();
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() {
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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"}
@@ -0,0 +1,28 @@
1
+ import { IWebSocketClient, SupernetType } from '../types';
2
+ import { AuthManager } from '../../../lib/AuthManager';
3
+ import { Logger } from '../../../lib/DefaultLogger';
4
+ import RestClient from '../../../lib/RestClient';
5
+ import { SocketEventMap } from '../events';
6
+ import { MessageType, SocketMessageMap } from '../messages';
7
+ declare class BrowserWebSocketClient extends RestClient<SocketEventMap> implements IWebSocketClient {
8
+ appId: string;
9
+ baseUrl: string;
10
+ private socketClient;
11
+ private coordinator;
12
+ private _isConnected;
13
+ private _supernetType;
14
+ constructor(baseUrl: string, auth: AuthManager, appId: string, supernetType: SupernetType, logger: Logger);
15
+ get isConnected(): boolean;
16
+ get supernetType(): SupernetType;
17
+ connect(): Promise<void>;
18
+ disconnect(): Promise<void>;
19
+ switchNetwork(supernetType: SupernetType): Promise<SupernetType>;
20
+ send<T extends MessageType>(messageType: T, data: SocketMessageMap[T]): Promise<void>;
21
+ private handleMessage;
22
+ private handleNotification;
23
+ private handleAuthChanged;
24
+ private handleSocketEvent;
25
+ private handleAuthUpdated;
26
+ private handleRoleChange;
27
+ }
28
+ export default BrowserWebSocketClient;
@@ -0,0 +1,203 @@
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 AuthManager_1 = require("../../../lib/AuthManager");
16
+ const index_1 = __importDefault(require("../index"));
17
+ const RestClient_1 = __importDefault(require("../../../lib/RestClient"));
18
+ const ChannelCoordinator_1 = __importDefault(require("./ChannelCoordinator"));
19
+ class WrappedClient extends index_1.default {
20
+ constructor() {
21
+ super(...arguments);
22
+ this.interceptor = undefined;
23
+ }
24
+ intercept(interceptor) {
25
+ this.interceptor = interceptor;
26
+ }
27
+ emit(event, data) {
28
+ super.emit(event, data);
29
+ if (this.interceptor) {
30
+ this.interceptor(event, data);
31
+ }
32
+ }
33
+ }
34
+ class BrowserWebSocketClient extends RestClient_1.default {
35
+ constructor(baseUrl, auth, appId, supernetType, logger) {
36
+ const socketClient = new WrappedClient(baseUrl, auth, appId, supernetType, logger);
37
+ super(socketClient.baseUrl, auth, logger);
38
+ this._isConnected = false;
39
+ this.socketClient = socketClient;
40
+ this.appId = appId;
41
+ this.baseUrl = socketClient.baseUrl;
42
+ this._supernetType = supernetType;
43
+ this.coordinator = new ChannelCoordinator_1.default({
44
+ callbacks: {
45
+ onRoleChange: this.handleRoleChange.bind(this),
46
+ onMessage: this.handleMessage.bind(this),
47
+ onNotification: this.handleNotification.bind(this)
48
+ },
49
+ logger
50
+ });
51
+ this.auth.on('updated', this.handleAuthUpdated.bind(this));
52
+ this.socketClient.intercept(this.handleSocketEvent.bind(this));
53
+ }
54
+ get isConnected() {
55
+ return this.coordinator.isPrimary ? this.socketClient.isConnected : this._isConnected;
56
+ }
57
+ get supernetType() {
58
+ return this.coordinator.isPrimary ? this.socketClient.supernetType : this._supernetType;
59
+ }
60
+ connect() {
61
+ return __awaiter(this, void 0, void 0, function* () {
62
+ yield this.coordinator.isReady();
63
+ if (this.coordinator.isPrimary) {
64
+ yield this.socketClient.connect();
65
+ }
66
+ else {
67
+ return this.coordinator.sendMessage({
68
+ type: 'connect'
69
+ });
70
+ }
71
+ });
72
+ }
73
+ disconnect() {
74
+ return __awaiter(this, void 0, void 0, function* () {
75
+ yield this.coordinator.isReady();
76
+ if (this.coordinator.isPrimary) {
77
+ this.socketClient.disconnect();
78
+ }
79
+ else {
80
+ this.coordinator.sendMessage({
81
+ type: 'disconnect'
82
+ });
83
+ }
84
+ });
85
+ }
86
+ switchNetwork(supernetType) {
87
+ return __awaiter(this, void 0, void 0, function* () {
88
+ yield this.coordinator.isReady();
89
+ if (this.coordinator.isPrimary) {
90
+ return this.socketClient.switchNetwork(supernetType);
91
+ }
92
+ yield this.coordinator.sendMessage({
93
+ type: 'switchNetwork',
94
+ payload: supernetType
95
+ });
96
+ this._supernetType = supernetType;
97
+ return supernetType;
98
+ });
99
+ }
100
+ send(messageType, data) {
101
+ return __awaiter(this, void 0, void 0, function* () {
102
+ yield this.coordinator.isReady();
103
+ if (this.coordinator.isPrimary) {
104
+ if (!this.socketClient.isConnected) {
105
+ yield this.socketClient.connect();
106
+ }
107
+ return this.socketClient.send(messageType, data);
108
+ }
109
+ return this.coordinator.sendMessage({
110
+ type: 'socket-send',
111
+ payload: { type: messageType, data }
112
+ });
113
+ });
114
+ }
115
+ handleMessage(message) {
116
+ return __awaiter(this, void 0, void 0, function* () {
117
+ this._logger.debug('Received control message', message);
118
+ switch (message.type) {
119
+ case 'socket-send': {
120
+ if (!this.socketClient.isConnected) {
121
+ yield this.socketClient.connect();
122
+ }
123
+ return this.socketClient.send(message.payload.type, message.payload.data);
124
+ }
125
+ case 'connect': {
126
+ if (!this.socketClient.isConnected) {
127
+ yield this.socketClient.connect();
128
+ }
129
+ return;
130
+ }
131
+ case 'disconnect': {
132
+ if (this.socketClient.isConnected) {
133
+ this.socketClient.disconnect();
134
+ }
135
+ return;
136
+ }
137
+ case 'switchNetwork': {
138
+ yield this.switchNetwork(message.payload);
139
+ return;
140
+ }
141
+ default: {
142
+ this._logger.error('Received unknown message type:', message);
143
+ }
144
+ }
145
+ });
146
+ }
147
+ handleNotification(notification) {
148
+ return __awaiter(this, void 0, void 0, function* () {
149
+ this._logger.debug('Received notification', notification.type, notification.payload);
150
+ switch (notification.type) {
151
+ case 'socket-event': {
152
+ this.emit(notification.payload.type, notification.payload.data);
153
+ return;
154
+ }
155
+ case 'auth-state-changed': {
156
+ this.handleAuthChanged(notification.payload);
157
+ return;
158
+ }
159
+ default: {
160
+ this._logger.error('Received unknown notification type:', notification);
161
+ }
162
+ }
163
+ });
164
+ }
165
+ handleAuthChanged(isAuthenticated) {
166
+ if (this.auth instanceof AuthManager_1.TokenAuthManager) {
167
+ throw new Error('TokenAuthManager is not supported in multi client mode');
168
+ }
169
+ if (this.auth.isAuthenticated !== isAuthenticated) {
170
+ if (isAuthenticated) {
171
+ this.auth.authenticate();
172
+ }
173
+ else {
174
+ this.auth.clear();
175
+ }
176
+ }
177
+ }
178
+ handleSocketEvent(eventType, payload) {
179
+ if (this.coordinator.isPrimary) {
180
+ this.coordinator.notify({
181
+ type: 'socket-event',
182
+ payload: { type: eventType, data: payload }
183
+ });
184
+ this.emit(eventType, payload);
185
+ }
186
+ }
187
+ handleAuthUpdated(isAuthenticated) {
188
+ this.coordinator.notify({
189
+ type: 'auth-state-changed',
190
+ payload: isAuthenticated
191
+ });
192
+ }
193
+ handleRoleChange(isPrimary) {
194
+ if (isPrimary && !this.socketClient.isConnected && this.isConnected) {
195
+ this.socketClient.connect();
196
+ }
197
+ else if (!isPrimary && this.socketClient.isConnected) {
198
+ this.socketClient.disconnect();
199
+ }
200
+ }
201
+ }
202
+ exports.default = BrowserWebSocketClient;
203
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ApiClient/WebSocketClient/BrowserWebSocketClient/index.ts"],"names":[],"mappings":"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"}
@@ -44,6 +44,11 @@ export type JobProgressData = {
44
44
  step: number;
45
45
  stepCount: number;
46
46
  };
47
+ export type JobETAData = {
48
+ jobID: string;
49
+ imgID?: string;
50
+ etaSeconds: number;
51
+ };
47
52
  export type JobResultData = {
48
53
  jobID: string;
49
54
  imgID: string;
@@ -109,6 +114,11 @@ export type SocketEventMap = {
109
114
  * @event WebSocketClient#jobProgress - Job progress update
110
115
  */
111
116
  jobProgress: JobProgressData;
117
+ /**
118
+ * @event WebSocketClient#jobETA - Job ETA update (sent every second during inference by ComfyUI workers)
119
+ * Note: Only available for ComfyUI-based workers during video generation
120
+ */
121
+ jobETA: JobETAData;
112
122
  /**
113
123
  * @event WebSocketClient#jobResult - Job result received
114
124
  */
@@ -135,3 +145,4 @@ export type SocketEventMap = {
135
145
  toastMessage: ToastMessage;
136
146
  artistCancelConfirmation: ArtistCancelConfirmation;
137
147
  };
148
+ export type SocketEventName = keyof SocketEventMap;
@@ -1,10 +1,10 @@
1
1
  import { MessageType, SocketMessageMap } from './messages';
2
2
  import { SocketEventMap } from './events';
3
3
  import RestClient from '../../lib/RestClient';
4
- import { SupernetType } from './types';
4
+ import { IWebSocketClient, SupernetType } from './types';
5
5
  import { Logger } from '../../lib/DefaultLogger';
6
6
  import { AuthManager } from '../../lib/AuthManager';
7
- declare class WebSocketClient extends RestClient<SocketEventMap> {
7
+ declare class WebSocketClient extends RestClient<SocketEventMap> implements IWebSocketClient {
8
8
  appId: string;
9
9
  baseUrl: string;
10
10
  private socket;
@@ -80,7 +80,7 @@ class WebSocketClient extends RestClient_1.default {
80
80
  socket.onmessage = null;
81
81
  socket.onopen = null;
82
82
  this.stopPing();
83
- socket.close();
83
+ socket.close(1000, 'Client disconnected');
84
84
  }
85
85
  startPing(socket) {
86
86
  if (!isNodejs_1.default) {
@@ -139,9 +139,16 @@ class WebSocketClient extends RestClient_1.default {
139
139
  this.emit('connected', { network: this._supernetType });
140
140
  }
141
141
  handleClose(e) {
142
- if (e.target === this.socket) {
142
+ const socket = e.target;
143
+ socket.onerror = null;
144
+ socket.onmessage = null;
145
+ socket.onopen = null;
146
+ if (socket === this.socket || !this.socket) {
143
147
  this._logger.info('WebSocket disconnected, cleanup', e);
144
- this.disconnect();
148
+ if (socket === this.socket) {
149
+ this.stopPing();
150
+ this.socket = null;
151
+ }
145
152
  this.emit('disconnected', {
146
153
  code: e.code,
147
154
  reason: e.reason
@@ -183,6 +190,9 @@ class WebSocketClient extends RestClient_1.default {
183
190
  }
184
191
  send(messageType, data) {
185
192
  return __awaiter(this, void 0, void 0, function* () {
193
+ if (!this.isConnected) {
194
+ yield this.connect();
195
+ }
186
196
  yield this.waitForConnection();
187
197
  this._logger.debug('WebSocket send:', messageType, data);
188
198
  this.socket.send(JSON.stringify({ type: messageType, data: (0, base64_1.base64Encode)(JSON.stringify(data)) }));