@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,493 @@
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.logger.log("debug", "Connection still active");
189
+ }
190
+ catch (error) {
191
+ this.logger.log("error", "Failed to check connection:", error);
192
+ }
193
+ }
194
+ }, this.PING_INTERVAL);
195
+ }
196
+ stopPing() {
197
+ if (this.pingTimer) {
198
+ clearInterval(this.pingTimer);
199
+ this.pingTimer = null;
200
+ }
201
+ }
202
+ }
203
+ // Message processor for handling incoming WebSocket messages
204
+ class MessageProcessor {
205
+ constructor(logger, handlers) {
206
+ this.logger = logger;
207
+ this.handlers = handlers;
208
+ }
209
+ process(data) {
210
+ try {
211
+ const message = fromBinary(WebsocketMessageSchema, new Uint8Array(data));
212
+ this.logger.log("debug", `Processing message: ${message.id}`);
213
+ // Process based on message type
214
+ switch (message.message.case) {
215
+ case "output":
216
+ this.processOutput(message.message.value);
217
+ break;
218
+ case "session":
219
+ this.processSession(message.message.value);
220
+ break;
221
+ case "url":
222
+ this.processUrl(message.message.value);
223
+ break;
224
+ default:
225
+ this.logger.log("warn", `Unknown message type: ${message.message.case}`);
226
+ }
227
+ return message.id;
228
+ }
229
+ catch (error) {
230
+ this.logger.log("error", "Failed to process message:", error);
231
+ return null;
232
+ }
233
+ }
234
+ processOutput(output) {
235
+ if (!this.handlers.onOutput)
236
+ return;
237
+ try {
238
+ this.handlers.onOutput({
239
+ vertex: output.vertex,
240
+ fork: output.fork,
241
+ data: this.parseOutputData(output.data),
242
+ created: output.created ? timestampDate(output.created) : undefined,
243
+ });
244
+ }
245
+ catch (error) {
246
+ this.logger.log("error", "Error in output handler:", error);
247
+ }
248
+ }
249
+ processSession(session) {
250
+ if (!this.handlers.onSession)
251
+ return;
252
+ try {
253
+ this.handlers.onSession(toJson(SessionSchema, session));
254
+ }
255
+ catch (error) {
256
+ this.logger.log("error", "Error in session handler:", error);
257
+ }
258
+ }
259
+ processUrl(url) {
260
+ if (!this.handlers.onUrl)
261
+ return;
262
+ try {
263
+ this.handlers.onUrl(toJson(UrlSchema, url));
264
+ }
265
+ catch (error) {
266
+ this.logger.log("error", "Error in URL handler:", error);
267
+ }
268
+ }
269
+ parseOutputData(data) {
270
+ return Object.fromEntries(Object.entries(data).map(([key, value]) => {
271
+ try {
272
+ return [key, JSON.parse(new TextDecoder().decode(value))];
273
+ }
274
+ catch (error) {
275
+ this.logger.log("error", `Failed to parse data for key ${key}:`, error);
276
+ return [key, null];
277
+ }
278
+ }));
279
+ }
280
+ }
281
+ // Main PubsubClient class
282
+ export class PubsubClient {
283
+ constructor(debug = false) {
284
+ this.state = ConnectionState.DISCONNECTED;
285
+ this.sessionConfig = null;
286
+ this.messageProcessor = null;
287
+ this.shouldReconnect = true;
288
+ this.sessionComplete = false;
289
+ this.logger = new Logger(debug);
290
+ this.ackTracker = new AckTracker(this.logger);
291
+ this.reconnectManager = new ReconnectionManager(this.logger);
292
+ this.wsManager = new WebSocketManager(this.logger);
293
+ }
294
+ async subscribe(opts) {
295
+ this.logger.log("debug", "Subscribe called", {
296
+ automation: opts.automation,
297
+ hasToken: !!opts.sessionToken,
298
+ });
299
+ // Validate input
300
+ if (!opts.sessionToken || !opts.automation) {
301
+ throw new Error("Session token and automation are required");
302
+ }
303
+ // Check if already connected to same session
304
+ if (this.isSameSession(opts)) {
305
+ this.logger.log("debug", "Already connected to same session, updating handlers");
306
+ this.updateHandlers(opts);
307
+ return;
308
+ }
309
+ // Check state
310
+ if (this.state === ConnectionState.CONNECTING) {
311
+ throw new Error("Already connecting, please wait");
312
+ }
313
+ // Disconnect if connected to different session
314
+ if (this.state === ConnectionState.CONNECTED) {
315
+ await this.unsubscribe();
316
+ }
317
+ // Store configuration
318
+ this.sessionConfig = {
319
+ token: opts.sessionToken,
320
+ automation: opts.automation,
321
+ };
322
+ // Create message processor with handlers
323
+ this.messageProcessor = new MessageProcessor(this.logger, {
324
+ onOutput: opts.onOutput,
325
+ onSession: opts.onSession,
326
+ onUrl: opts.onUrl,
327
+ });
328
+ // Reset state
329
+ this.shouldReconnect = true;
330
+ this.sessionComplete = false;
331
+ this.reconnectManager.reset();
332
+ // Start ACK tracker
333
+ this.ackTracker.start();
334
+ // Connect
335
+ await this.connect();
336
+ }
337
+ async unsubscribe() {
338
+ if (this.state === ConnectionState.DISCONNECTED ||
339
+ this.state === ConnectionState.CLOSING) {
340
+ return;
341
+ }
342
+ this.logger.log("info", "Unsubscribing...");
343
+ // Update state
344
+ this.state = ConnectionState.CLOSING;
345
+ this.shouldReconnect = false;
346
+ // Cancel any pending reconnects
347
+ this.reconnectManager.cancel();
348
+ // Close WebSocket
349
+ this.wsManager.close();
350
+ // Stop ACK tracker
351
+ this.ackTracker.stop();
352
+ // Clear state
353
+ this.sessionConfig = null;
354
+ this.messageProcessor = null;
355
+ this.state = ConnectionState.DISCONNECTED;
356
+ this.logger.log("info", "Unsubscribed successfully");
357
+ }
358
+ isConnected() {
359
+ return this.state === ConnectionState.CONNECTED;
360
+ }
361
+ getConnectionState() {
362
+ return this.state;
363
+ }
364
+ async connect() {
365
+ if (!this.sessionConfig) {
366
+ throw new Error("No session configuration");
367
+ }
368
+ this.state = ConnectionState.CONNECTING;
369
+ const config = getConfig();
370
+ const { token, automation } = this.sessionConfig;
371
+ const wsUrl = `${config.wsBaseUrl}/${automation.organization}/${automation.group}/${automation.automation}/ws?token=${encodeURIComponent(token)}`;
372
+ try {
373
+ this.wsManager.connect(wsUrl, () => this.handleOpen(), (data) => this.handleMessage(data), (code, reason) => this.handleClose(code, reason), (error) => this.handleError(error));
374
+ }
375
+ catch (error) {
376
+ this.state = ConnectionState.DISCONNECTED;
377
+ throw error;
378
+ }
379
+ }
380
+ handleOpen() {
381
+ this.state = ConnectionState.CONNECTED;
382
+ this.reconnectManager.reset();
383
+ }
384
+ handleMessage(data) {
385
+ if (!this.messageProcessor) {
386
+ this.logger.log("error", "No message processor configured");
387
+ return;
388
+ }
389
+ // Process the message
390
+ const messageId = this.messageProcessor.process(data);
391
+ if (!messageId) {
392
+ return; // Failed to parse
393
+ }
394
+ // Check for duplicate
395
+ if (this.ackTracker.isProcessed(messageId)) {
396
+ this.logger.log("debug", `Duplicate message: ${messageId}`);
397
+ }
398
+ else {
399
+ this.ackTracker.markProcessed(messageId);
400
+ }
401
+ // Always ACK (even for duplicates)
402
+ this.wsManager.sendAck(messageId);
403
+ }
404
+ handleClose(code, reason) {
405
+ this.state = ConnectionState.DISCONNECTED;
406
+ // Analyze close code
407
+ const shouldReconnect = this.analyzeCloseCode(code, reason);
408
+ // Schedule reconnect if appropriate
409
+ if (shouldReconnect && this.shouldReconnect && !this.sessionComplete) {
410
+ this.scheduleReconnect();
411
+ }
412
+ else {
413
+ // Clean shutdown
414
+ this.cleanup();
415
+ }
416
+ }
417
+ handleError(error) {
418
+ this.logger.log("error", "WebSocket error:", error);
419
+ }
420
+ analyzeCloseCode(code, reason) {
421
+ switch (code) {
422
+ case 1000 /* CloseCode.NORMAL */:
423
+ // Normal closure - session complete or client requested
424
+ this.logger.log("info", "Normal closure");
425
+ this.sessionComplete = true;
426
+ return false;
427
+ case 1001 /* CloseCode.GOING_AWAY */:
428
+ // Server shutting down
429
+ this.logger.log("warn", "Server going away");
430
+ return true;
431
+ case 1002 /* CloseCode.PROTOCOL_ERROR */:
432
+ case 1003 /* CloseCode.UNSUPPORTED_DATA */:
433
+ case 1008 /* CloseCode.POLICY_VIOLATION */:
434
+ // Critical errors - don't reconnect
435
+ this.logger.log("error", `Critical error (${code}): ${reason}`);
436
+ return false;
437
+ case 1006 /* CloseCode.ABNORMAL */:
438
+ // Connection lost - try to reconnect
439
+ this.logger.log("warn", "Connection lost (abnormal closure)");
440
+ return true;
441
+ default:
442
+ // Unknown code - try to reconnect
443
+ this.logger.log("warn", `Unknown close code ${code}: ${reason}`);
444
+ return true;
445
+ }
446
+ }
447
+ scheduleReconnect() {
448
+ const scheduled = this.reconnectManager.scheduleReconnect(() => {
449
+ if (this.shouldReconnect && this.state === ConnectionState.DISCONNECTED) {
450
+ this.connect().catch((error) => {
451
+ this.logger.log("error", "Reconnection failed:", error);
452
+ // Try again
453
+ this.scheduleReconnect();
454
+ });
455
+ }
456
+ });
457
+ if (!scheduled) {
458
+ // Max attempts reached
459
+ this.cleanup();
460
+ }
461
+ }
462
+ cleanup() {
463
+ this.shouldReconnect = false;
464
+ this.reconnectManager.cancel();
465
+ this.ackTracker.stop();
466
+ this.wsManager.close();
467
+ this.sessionConfig = null;
468
+ this.messageProcessor = null;
469
+ this.state = ConnectionState.DISCONNECTED;
470
+ }
471
+ isSameSession(opts) {
472
+ if (!this.sessionConfig || this.state !== ConnectionState.CONNECTED) {
473
+ return false;
474
+ }
475
+ return (this.sessionConfig.token === opts.sessionToken &&
476
+ this.sessionConfig.automation.organization ===
477
+ opts.automation.organization &&
478
+ this.sessionConfig.automation.group === opts.automation.group &&
479
+ this.sessionConfig.automation.automation === opts.automation.automation);
480
+ }
481
+ updateHandlers(opts) {
482
+ if (!this.messageProcessor) {
483
+ return;
484
+ }
485
+ // Update handlers in message processor
486
+ this.messageProcessor = new MessageProcessor(this.logger, {
487
+ onOutput: opts.onOutput,
488
+ onSession: opts.onSession,
489
+ onUrl: opts.onUrl,
490
+ });
491
+ }
492
+ }
493
+ //# 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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"}
@@ -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";
@@ -0,0 +1,52 @@
1
+ import { ValueJson } from "@bufbuild/protobuf/wkt";
2
+ import { AutomationIdJson, SessionJson, UrlJson } from "./genproto/mochabugapis/adapt/automations/v1/automations_pb.js";
3
+ export interface Output {
4
+ vertex: string;
5
+ fork: string;
6
+ data: {
7
+ [key: string]: ValueJson;
8
+ };
9
+ created?: Date;
10
+ }
11
+ export interface MessageHandlers {
12
+ onOutput?: (output: Output) => void;
13
+ onSession?: (session: SessionJson) => void;
14
+ onUrl?: (url: UrlJson) => void;
15
+ }
16
+ export interface SubscriptionOptions extends MessageHandlers {
17
+ sessionToken: string;
18
+ automation: AutomationIdJson;
19
+ debug?: boolean;
20
+ }
21
+ export declare enum ConnectionState {
22
+ DISCONNECTED = "disconnected",
23
+ CONNECTING = "connecting",
24
+ CONNECTED = "connected",
25
+ CLOSING = "closing"
26
+ }
27
+ export declare class PubsubClient {
28
+ private state;
29
+ private sessionConfig;
30
+ private readonly logger;
31
+ private readonly ackTracker;
32
+ private readonly reconnectManager;
33
+ private readonly wsManager;
34
+ private messageProcessor;
35
+ private shouldReconnect;
36
+ private sessionComplete;
37
+ constructor(debug?: boolean);
38
+ subscribe(opts: SubscriptionOptions): Promise<void>;
39
+ unsubscribe(): Promise<void>;
40
+ isConnected(): boolean;
41
+ getConnectionState(): ConnectionState;
42
+ private connect;
43
+ private handleOpen;
44
+ private handleMessage;
45
+ private handleClose;
46
+ private handleError;
47
+ private analyzeCloseCode;
48
+ private scheduleReconnect;
49
+ private cleanup;
50
+ private isSameSession;
51
+ private updateHandlers;
52
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mochabug/adapt-web",
3
- "version": "0.0.67",
3
+ "version": "0.0.69",
4
4
  "description": "The client library to execute automations, without effort, in a browser environment",
5
5
  "main": "./dist/cjs/index.js",
6
6
  "module": "./dist/esm/index.js",