@mochabug/adapt-web 0.0.65 → 0.0.68

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