@mochabug/adapt-web 0.0.67 → 0.0.69

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.
@@ -0,0 +1,500 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.PubsubClient = exports.ConnectionState = void 0;
7
+ const protobuf_1 = require("@bufbuild/protobuf");
8
+ const wkt_1 = require("@bufbuild/protobuf/wkt");
9
+ const isomorphic_ws_1 = __importDefault(require("isomorphic-ws"));
10
+ const uuid_1 = require("uuid");
11
+ const automations_pb_js_1 = require("./genproto/mochabugapis/adapt/automations/v1/automations_pb.js");
12
+ const index_js_1 = require("./index.js");
13
+ // Connection states
14
+ var ConnectionState;
15
+ (function (ConnectionState) {
16
+ ConnectionState["DISCONNECTED"] = "disconnected";
17
+ ConnectionState["CONNECTING"] = "connecting";
18
+ ConnectionState["CONNECTED"] = "connected";
19
+ ConnectionState["CLOSING"] = "closing";
20
+ })(ConnectionState || (exports.ConnectionState = ConnectionState = {}));
21
+ // Logger class for consistent logging
22
+ class Logger {
23
+ constructor(debug) {
24
+ this.debug = debug;
25
+ }
26
+ log(level, message, data) {
27
+ if (!this.debug && level === "debug")
28
+ return;
29
+ const timestamp = new Date().toISOString();
30
+ const prefix = `[PubSub ${timestamp}]`;
31
+ const fullMessage = `${prefix} ${message}`;
32
+ if (data !== undefined) {
33
+ console[level](fullMessage, data);
34
+ }
35
+ else {
36
+ console[level](fullMessage);
37
+ }
38
+ }
39
+ }
40
+ // ACK tracker to prevent duplicate message processing
41
+ class AckTracker {
42
+ constructor(logger) {
43
+ this.logger = logger;
44
+ this.ackedMessages = new Map();
45
+ this.MESSAGE_TTL = 60000; // 60 seconds
46
+ this.cleanupTimer = null;
47
+ }
48
+ start() {
49
+ // Cleanup old messages every 30 seconds
50
+ this.cleanupTimer = setInterval(() => this.cleanup(), 30000);
51
+ }
52
+ stop() {
53
+ if (this.cleanupTimer) {
54
+ clearInterval(this.cleanupTimer);
55
+ this.cleanupTimer = null;
56
+ }
57
+ this.ackedMessages.clear();
58
+ }
59
+ isProcessed(messageId) {
60
+ return this.ackedMessages.has(messageId);
61
+ }
62
+ markProcessed(messageId) {
63
+ this.ackedMessages.set(messageId, Date.now());
64
+ }
65
+ cleanup() {
66
+ const now = Date.now();
67
+ const deadline = now - this.MESSAGE_TTL;
68
+ let removed = 0;
69
+ for (const [messageId, timestamp] of this.ackedMessages.entries()) {
70
+ if (timestamp < deadline) {
71
+ this.ackedMessages.delete(messageId);
72
+ removed++;
73
+ }
74
+ }
75
+ if (removed > 0) {
76
+ this.logger.log("debug", `Cleaned up ${removed} old ACKed messages`);
77
+ }
78
+ }
79
+ }
80
+ // Reconnection manager with exponential backoff
81
+ class ReconnectionManager {
82
+ constructor(logger) {
83
+ this.logger = logger;
84
+ this.attempts = 0;
85
+ this.timer = null;
86
+ this.INITIAL_DELAY = 1000; // 1 second
87
+ this.MAX_DELAY = 30000; // 30 seconds
88
+ this.MAX_ATTEMPTS = -1; // -1 = infinite
89
+ }
90
+ reset() {
91
+ this.attempts = 0;
92
+ this.cancel();
93
+ }
94
+ cancel() {
95
+ if (this.timer) {
96
+ clearTimeout(this.timer);
97
+ this.timer = null;
98
+ }
99
+ }
100
+ scheduleReconnect(callback) {
101
+ if (this.MAX_ATTEMPTS !== -1 && this.attempts >= this.MAX_ATTEMPTS) {
102
+ this.logger.log("error", "Max reconnection attempts reached");
103
+ return false;
104
+ }
105
+ this.attempts++;
106
+ const delay = Math.min(this.INITIAL_DELAY * Math.pow(2, this.attempts - 1), this.MAX_DELAY);
107
+ this.logger.log("info", `Scheduling reconnect attempt ${this.attempts} in ${delay}ms`);
108
+ this.timer = setTimeout(() => {
109
+ this.timer = null;
110
+ callback();
111
+ }, delay);
112
+ return true;
113
+ }
114
+ }
115
+ // WebSocket connection manager
116
+ class WebSocketManager {
117
+ constructor(logger) {
118
+ this.logger = logger;
119
+ this.ws = null;
120
+ this.pingTimer = null;
121
+ this.PING_INTERVAL = 10000; // 10 seconds
122
+ }
123
+ connect(url, onOpen, onMessage, onClose, onError) {
124
+ if (this.ws) {
125
+ throw new Error("WebSocket already exists");
126
+ }
127
+ this.logger.log("info", `Connecting to: ${url}`);
128
+ this.ws = new isomorphic_ws_1.default(url);
129
+ this.ws.binaryType = "arraybuffer";
130
+ this.ws.onopen = () => {
131
+ this.logger.log("info", "✓ WebSocket connected");
132
+ this.startPing();
133
+ onOpen();
134
+ };
135
+ this.ws.onmessage = (event) => {
136
+ if (event.data instanceof ArrayBuffer) {
137
+ onMessage(event.data);
138
+ }
139
+ else {
140
+ this.logger.log("warn", "Received non-binary message, ignoring");
141
+ }
142
+ };
143
+ this.ws.onerror = (error) => {
144
+ this.logger.log("error", "WebSocket error:", error);
145
+ onError(error);
146
+ };
147
+ this.ws.onclose = (event) => {
148
+ this.logger.log("info", `WebSocket closed: ${event.code} - ${event.reason}`);
149
+ this.stopPing();
150
+ onClose(event.code, event.reason);
151
+ this.ws = null;
152
+ };
153
+ }
154
+ sendAck(messageId) {
155
+ if (!this.isConnected()) {
156
+ this.logger.log("warn", `Cannot send ACK (not connected): ${messageId}`);
157
+ return false;
158
+ }
159
+ try {
160
+ // Parse UUID string to bytes (16 bytes)
161
+ const uuid = new Uint8Array((0, uuid_1.parse)(messageId));
162
+ this.ws.send(uuid);
163
+ this.logger.log("debug", `Sent ACK: ${messageId}`);
164
+ return true;
165
+ }
166
+ catch (error) {
167
+ this.logger.log("error", `Failed to send ACK for ${messageId}:`, error);
168
+ return false;
169
+ }
170
+ }
171
+ close(code = 1000 /* CloseCode.NORMAL */, reason = "Client disconnecting") {
172
+ this.stopPing();
173
+ if (this.ws) {
174
+ try {
175
+ if (this.ws.readyState === isomorphic_ws_1.default.OPEN) {
176
+ this.ws.close(code, reason);
177
+ }
178
+ }
179
+ catch (error) {
180
+ this.logger.log("error", "Error closing WebSocket:", error);
181
+ }
182
+ this.ws = null;
183
+ }
184
+ }
185
+ isConnected() {
186
+ return this.ws !== null && this.ws.readyState === isomorphic_ws_1.default.OPEN;
187
+ }
188
+ startPing() {
189
+ this.stopPing();
190
+ // Send ping every 30 seconds to keep connection alive
191
+ this.pingTimer = setInterval(() => {
192
+ if (this.isConnected()) {
193
+ try {
194
+ this.logger.log("debug", "Connection still active");
195
+ }
196
+ catch (error) {
197
+ this.logger.log("error", "Failed to check connection:", error);
198
+ }
199
+ }
200
+ }, this.PING_INTERVAL);
201
+ }
202
+ stopPing() {
203
+ if (this.pingTimer) {
204
+ clearInterval(this.pingTimer);
205
+ this.pingTimer = null;
206
+ }
207
+ }
208
+ }
209
+ // Message processor for handling incoming WebSocket messages
210
+ class MessageProcessor {
211
+ constructor(logger, handlers) {
212
+ this.logger = logger;
213
+ this.handlers = handlers;
214
+ }
215
+ process(data) {
216
+ try {
217
+ const message = (0, protobuf_1.fromBinary)(automations_pb_js_1.WebsocketMessageSchema, new Uint8Array(data));
218
+ this.logger.log("debug", `Processing message: ${message.id}`);
219
+ // Process based on message type
220
+ switch (message.message.case) {
221
+ case "output":
222
+ this.processOutput(message.message.value);
223
+ break;
224
+ case "session":
225
+ this.processSession(message.message.value);
226
+ break;
227
+ case "url":
228
+ this.processUrl(message.message.value);
229
+ break;
230
+ default:
231
+ this.logger.log("warn", `Unknown message type: ${message.message.case}`);
232
+ }
233
+ return message.id;
234
+ }
235
+ catch (error) {
236
+ this.logger.log("error", "Failed to process message:", error);
237
+ return null;
238
+ }
239
+ }
240
+ processOutput(output) {
241
+ if (!this.handlers.onOutput)
242
+ return;
243
+ try {
244
+ this.handlers.onOutput({
245
+ vertex: output.vertex,
246
+ fork: output.fork,
247
+ data: this.parseOutputData(output.data),
248
+ created: output.created ? (0, wkt_1.timestampDate)(output.created) : undefined,
249
+ });
250
+ }
251
+ catch (error) {
252
+ this.logger.log("error", "Error in output handler:", error);
253
+ }
254
+ }
255
+ processSession(session) {
256
+ if (!this.handlers.onSession)
257
+ return;
258
+ try {
259
+ this.handlers.onSession((0, protobuf_1.toJson)(automations_pb_js_1.SessionSchema, session));
260
+ }
261
+ catch (error) {
262
+ this.logger.log("error", "Error in session handler:", error);
263
+ }
264
+ }
265
+ processUrl(url) {
266
+ if (!this.handlers.onUrl)
267
+ return;
268
+ try {
269
+ this.handlers.onUrl((0, protobuf_1.toJson)(automations_pb_js_1.UrlSchema, url));
270
+ }
271
+ catch (error) {
272
+ this.logger.log("error", "Error in URL handler:", error);
273
+ }
274
+ }
275
+ parseOutputData(data) {
276
+ return Object.fromEntries(Object.entries(data).map(([key, value]) => {
277
+ try {
278
+ return [key, JSON.parse(new TextDecoder().decode(value))];
279
+ }
280
+ catch (error) {
281
+ this.logger.log("error", `Failed to parse data for key ${key}:`, error);
282
+ return [key, null];
283
+ }
284
+ }));
285
+ }
286
+ }
287
+ // Main PubsubClient class
288
+ class PubsubClient {
289
+ constructor(debug = false) {
290
+ this.state = ConnectionState.DISCONNECTED;
291
+ this.sessionConfig = null;
292
+ this.messageProcessor = null;
293
+ this.shouldReconnect = true;
294
+ this.sessionComplete = false;
295
+ this.logger = new Logger(debug);
296
+ this.ackTracker = new AckTracker(this.logger);
297
+ this.reconnectManager = new ReconnectionManager(this.logger);
298
+ this.wsManager = new WebSocketManager(this.logger);
299
+ }
300
+ async subscribe(opts) {
301
+ this.logger.log("debug", "Subscribe called", {
302
+ automation: opts.automation,
303
+ hasToken: !!opts.sessionToken,
304
+ });
305
+ // Validate input
306
+ if (!opts.sessionToken || !opts.automation) {
307
+ throw new Error("Session token and automation are required");
308
+ }
309
+ // Check if already connected to same session
310
+ if (this.isSameSession(opts)) {
311
+ this.logger.log("debug", "Already connected to same session, updating handlers");
312
+ this.updateHandlers(opts);
313
+ return;
314
+ }
315
+ // Check state
316
+ if (this.state === ConnectionState.CONNECTING) {
317
+ throw new Error("Already connecting, please wait");
318
+ }
319
+ // Disconnect if connected to different session
320
+ if (this.state === ConnectionState.CONNECTED) {
321
+ await this.unsubscribe();
322
+ }
323
+ // Store configuration
324
+ this.sessionConfig = {
325
+ token: opts.sessionToken,
326
+ automation: opts.automation,
327
+ };
328
+ // Create message processor with handlers
329
+ this.messageProcessor = new MessageProcessor(this.logger, {
330
+ onOutput: opts.onOutput,
331
+ onSession: opts.onSession,
332
+ onUrl: opts.onUrl,
333
+ });
334
+ // Reset state
335
+ this.shouldReconnect = true;
336
+ this.sessionComplete = false;
337
+ this.reconnectManager.reset();
338
+ // Start ACK tracker
339
+ this.ackTracker.start();
340
+ // Connect
341
+ await this.connect();
342
+ }
343
+ async unsubscribe() {
344
+ if (this.state === ConnectionState.DISCONNECTED ||
345
+ this.state === ConnectionState.CLOSING) {
346
+ return;
347
+ }
348
+ this.logger.log("info", "Unsubscribing...");
349
+ // Update state
350
+ this.state = ConnectionState.CLOSING;
351
+ this.shouldReconnect = false;
352
+ // Cancel any pending reconnects
353
+ this.reconnectManager.cancel();
354
+ // Close WebSocket
355
+ this.wsManager.close();
356
+ // Stop ACK tracker
357
+ this.ackTracker.stop();
358
+ // Clear state
359
+ this.sessionConfig = null;
360
+ this.messageProcessor = null;
361
+ this.state = ConnectionState.DISCONNECTED;
362
+ this.logger.log("info", "Unsubscribed successfully");
363
+ }
364
+ isConnected() {
365
+ return this.state === ConnectionState.CONNECTED;
366
+ }
367
+ getConnectionState() {
368
+ return this.state;
369
+ }
370
+ async connect() {
371
+ if (!this.sessionConfig) {
372
+ throw new Error("No session configuration");
373
+ }
374
+ this.state = ConnectionState.CONNECTING;
375
+ const config = (0, index_js_1.getConfig)();
376
+ const { token, automation } = this.sessionConfig;
377
+ const wsUrl = `${config.wsBaseUrl}/${automation.organization}/${automation.group}/${automation.automation}/ws?token=${encodeURIComponent(token)}`;
378
+ try {
379
+ this.wsManager.connect(wsUrl, () => this.handleOpen(), (data) => this.handleMessage(data), (code, reason) => this.handleClose(code, reason), (error) => this.handleError(error));
380
+ }
381
+ catch (error) {
382
+ this.state = ConnectionState.DISCONNECTED;
383
+ throw error;
384
+ }
385
+ }
386
+ handleOpen() {
387
+ this.state = ConnectionState.CONNECTED;
388
+ this.reconnectManager.reset();
389
+ }
390
+ handleMessage(data) {
391
+ if (!this.messageProcessor) {
392
+ this.logger.log("error", "No message processor configured");
393
+ return;
394
+ }
395
+ // Process the message
396
+ const messageId = this.messageProcessor.process(data);
397
+ if (!messageId) {
398
+ return; // Failed to parse
399
+ }
400
+ // Check for duplicate
401
+ if (this.ackTracker.isProcessed(messageId)) {
402
+ this.logger.log("debug", `Duplicate message: ${messageId}`);
403
+ }
404
+ else {
405
+ this.ackTracker.markProcessed(messageId);
406
+ }
407
+ // Always ACK (even for duplicates)
408
+ this.wsManager.sendAck(messageId);
409
+ }
410
+ handleClose(code, reason) {
411
+ this.state = ConnectionState.DISCONNECTED;
412
+ // Analyze close code
413
+ const shouldReconnect = this.analyzeCloseCode(code, reason);
414
+ // Schedule reconnect if appropriate
415
+ if (shouldReconnect && this.shouldReconnect && !this.sessionComplete) {
416
+ this.scheduleReconnect();
417
+ }
418
+ else {
419
+ // Clean shutdown
420
+ this.cleanup();
421
+ }
422
+ }
423
+ handleError(error) {
424
+ this.logger.log("error", "WebSocket error:", error);
425
+ }
426
+ analyzeCloseCode(code, reason) {
427
+ switch (code) {
428
+ case 1000 /* CloseCode.NORMAL */:
429
+ // Normal closure - session complete or client requested
430
+ this.logger.log("info", "Normal closure");
431
+ this.sessionComplete = true;
432
+ return false;
433
+ case 1001 /* CloseCode.GOING_AWAY */:
434
+ // Server shutting down
435
+ this.logger.log("warn", "Server going away");
436
+ return true;
437
+ case 1002 /* CloseCode.PROTOCOL_ERROR */:
438
+ case 1003 /* CloseCode.UNSUPPORTED_DATA */:
439
+ case 1008 /* CloseCode.POLICY_VIOLATION */:
440
+ // Critical errors - don't reconnect
441
+ this.logger.log("error", `Critical error (${code}): ${reason}`);
442
+ return false;
443
+ case 1006 /* CloseCode.ABNORMAL */:
444
+ // Connection lost - try to reconnect
445
+ this.logger.log("warn", "Connection lost (abnormal closure)");
446
+ return true;
447
+ default:
448
+ // Unknown code - try to reconnect
449
+ this.logger.log("warn", `Unknown close code ${code}: ${reason}`);
450
+ return true;
451
+ }
452
+ }
453
+ scheduleReconnect() {
454
+ const scheduled = this.reconnectManager.scheduleReconnect(() => {
455
+ if (this.shouldReconnect && this.state === ConnectionState.DISCONNECTED) {
456
+ this.connect().catch((error) => {
457
+ this.logger.log("error", "Reconnection failed:", error);
458
+ // Try again
459
+ this.scheduleReconnect();
460
+ });
461
+ }
462
+ });
463
+ if (!scheduled) {
464
+ // Max attempts reached
465
+ this.cleanup();
466
+ }
467
+ }
468
+ cleanup() {
469
+ this.shouldReconnect = false;
470
+ this.reconnectManager.cancel();
471
+ this.ackTracker.stop();
472
+ this.wsManager.close();
473
+ this.sessionConfig = null;
474
+ this.messageProcessor = null;
475
+ this.state = ConnectionState.DISCONNECTED;
476
+ }
477
+ isSameSession(opts) {
478
+ if (!this.sessionConfig || this.state !== ConnectionState.CONNECTED) {
479
+ return false;
480
+ }
481
+ return (this.sessionConfig.token === opts.sessionToken &&
482
+ this.sessionConfig.automation.organization ===
483
+ opts.automation.organization &&
484
+ this.sessionConfig.automation.group === opts.automation.group &&
485
+ this.sessionConfig.automation.automation === opts.automation.automation);
486
+ }
487
+ updateHandlers(opts) {
488
+ if (!this.messageProcessor) {
489
+ return;
490
+ }
491
+ // Update handlers in message processor
492
+ this.messageProcessor = new MessageProcessor(this.logger, {
493
+ onOutput: opts.onOutput,
494
+ onSession: opts.onSession,
495
+ onUrl: opts.onUrl,
496
+ });
497
+ }
498
+ }
499
+ exports.PubsubClient = PubsubClient;
500
+ //# sourceMappingURL=pubsub-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pubsub-client.js","sourceRoot":"","sources":["../../src/pubsub-client.ts"],"names":[],"mappings":"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"}