@modelriver/client 1.0.0

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/dist/index.mjs ADDED
@@ -0,0 +1,597 @@
1
+ import { Socket } from 'phoenix';
2
+
3
+ /**
4
+ * ModelRiver Client SDK Utilities
5
+ *
6
+ * Helper functions for JWT decoding, localStorage operations, and URL building.
7
+ */
8
+ /**
9
+ * Default WebSocket base URL
10
+ */
11
+ const DEFAULT_BASE_URL = 'wss://api.modelriver.com/socket';
12
+ /**
13
+ * Default storage key prefix
14
+ */
15
+ const DEFAULT_STORAGE_KEY_PREFIX = 'modelriver_';
16
+ /**
17
+ * Default heartbeat interval (30 seconds)
18
+ */
19
+ const DEFAULT_HEARTBEAT_INTERVAL = 30000;
20
+ /**
21
+ * Default request timeout (5 minutes)
22
+ */
23
+ const DEFAULT_REQUEST_TIMEOUT = 300000;
24
+ /**
25
+ * Active request storage key suffix
26
+ */
27
+ const ACTIVE_REQUEST_KEY = 'active_request';
28
+ /**
29
+ * Decode a base64url string to a regular string
30
+ */
31
+ function base64UrlDecode(str) {
32
+ // Replace base64url characters with base64 characters
33
+ let base64 = str.replace(/-/g, '+').replace(/_/g, '/');
34
+ // Pad with '=' to make length a multiple of 4
35
+ const padding = base64.length % 4;
36
+ if (padding) {
37
+ base64 += '='.repeat(4 - padding);
38
+ }
39
+ // Decode
40
+ try {
41
+ return atob(base64);
42
+ }
43
+ catch {
44
+ throw new Error('Invalid base64url string');
45
+ }
46
+ }
47
+ /**
48
+ * Decode a JWT token and extract the payload
49
+ * Note: This does NOT verify the signature - that's done server-side
50
+ */
51
+ function decodeToken(token) {
52
+ if (!token || typeof token !== 'string') {
53
+ throw new Error('Invalid token: token must be a non-empty string');
54
+ }
55
+ const parts = token.split('.');
56
+ if (parts.length !== 3) {
57
+ throw new Error('Invalid token: JWT must have 3 parts');
58
+ }
59
+ try {
60
+ const payload = JSON.parse(base64UrlDecode(parts[1]));
61
+ // Validate required fields
62
+ if (!payload.project_id || !payload.channel_id) {
63
+ throw new Error('Invalid token: missing required fields (project_id, channel_id)');
64
+ }
65
+ // Build topic if not present
66
+ const topic = payload.topic || `ai_response:${payload.project_id}:${payload.channel_id}`;
67
+ return {
68
+ project_id: payload.project_id,
69
+ channel_id: payload.channel_id,
70
+ topic,
71
+ exp: payload.exp,
72
+ };
73
+ }
74
+ catch (error) {
75
+ if (error instanceof Error && error.message.startsWith('Invalid token:')) {
76
+ throw error;
77
+ }
78
+ throw new Error('Invalid token: failed to decode payload');
79
+ }
80
+ }
81
+ /**
82
+ * Check if a token is expired
83
+ */
84
+ function isTokenExpired(payload) {
85
+ if (!payload.exp) {
86
+ return false; // No expiration set
87
+ }
88
+ // exp is in seconds, Date.now() is in milliseconds
89
+ return Date.now() >= payload.exp * 1000;
90
+ }
91
+ /**
92
+ * Build the WebSocket URL with token
93
+ */
94
+ function buildWebSocketUrl(baseUrl, token) {
95
+ const url = baseUrl.endsWith('/websocket') ? baseUrl : `${baseUrl}/websocket`;
96
+ return `${url}?token=${encodeURIComponent(token)}&vsn=2.0.0`;
97
+ }
98
+ /**
99
+ * Check if localStorage is available
100
+ */
101
+ function isStorageAvailable() {
102
+ try {
103
+ const testKey = '__modelriver_test__';
104
+ localStorage.setItem(testKey, 'test');
105
+ localStorage.removeItem(testKey);
106
+ return true;
107
+ }
108
+ catch {
109
+ return false;
110
+ }
111
+ }
112
+ /**
113
+ * Save active request to localStorage
114
+ */
115
+ function saveActiveRequest(prefix, projectId, channelId, wsToken) {
116
+ if (!isStorageAvailable())
117
+ return;
118
+ const request = {
119
+ channelId,
120
+ timestamp: Date.now(),
121
+ projectId,
122
+ wsToken,
123
+ };
124
+ try {
125
+ localStorage.setItem(`${prefix}${ACTIVE_REQUEST_KEY}`, JSON.stringify(request));
126
+ }
127
+ catch {
128
+ // Storage might be full or disabled
129
+ }
130
+ }
131
+ /**
132
+ * Get active request from localStorage
133
+ * Returns null if not found or expired (older than 5 minutes)
134
+ */
135
+ function getActiveRequest(prefix) {
136
+ if (!isStorageAvailable())
137
+ return null;
138
+ try {
139
+ const stored = localStorage.getItem(`${prefix}${ACTIVE_REQUEST_KEY}`);
140
+ if (!stored)
141
+ return null;
142
+ const request = JSON.parse(stored);
143
+ // Check if request is less than 5 minutes old
144
+ const age = Date.now() - request.timestamp;
145
+ if (age > DEFAULT_REQUEST_TIMEOUT) {
146
+ clearActiveRequest(prefix);
147
+ return null;
148
+ }
149
+ return request;
150
+ }
151
+ catch {
152
+ return null;
153
+ }
154
+ }
155
+ /**
156
+ * Clear active request from localStorage
157
+ */
158
+ function clearActiveRequest(prefix) {
159
+ if (!isStorageAvailable())
160
+ return;
161
+ try {
162
+ localStorage.removeItem(`${prefix}${ACTIVE_REQUEST_KEY}`);
163
+ }
164
+ catch {
165
+ // Ignore errors
166
+ }
167
+ }
168
+ /**
169
+ * Create initial workflow steps
170
+ */
171
+ function createInitialSteps() {
172
+ return [
173
+ { id: 'queue', name: 'Queueing request', status: 'pending' },
174
+ { id: 'process', name: 'Processing AI request', status: 'pending' },
175
+ { id: 'receive', name: 'Waiting for response', status: 'pending' },
176
+ { id: 'complete', name: 'Response received', status: 'pending' },
177
+ ];
178
+ }
179
+ /**
180
+ * Update a step in the steps array
181
+ */
182
+ function updateStep(steps, id, updates) {
183
+ return steps.map((step) => step.id === id ? { ...step, ...updates } : step);
184
+ }
185
+ /**
186
+ * Logger utility for debug mode
187
+ */
188
+ function createLogger(debug) {
189
+ const prefix = '[ModelRiver]';
190
+ return {
191
+ log: (...args) => {
192
+ if (debug)
193
+ console.log(prefix, ...args);
194
+ },
195
+ warn: (...args) => {
196
+ if (debug)
197
+ console.warn(prefix, ...args);
198
+ },
199
+ error: (...args) => {
200
+ // Always log errors
201
+ console.error(prefix, ...args);
202
+ },
203
+ };
204
+ }
205
+
206
+ /**
207
+ * ModelRiver Client SDK
208
+ *
209
+ * Core client class for connecting to ModelRiver's WebSocket-based AI response streaming.
210
+ */
211
+ /**
212
+ * ModelRiver WebSocket Client
213
+ *
214
+ * Connects to ModelRiver's Phoenix Channels for real-time AI response streaming.
215
+ *
216
+ * @example
217
+ * ```typescript
218
+ * const client = new ModelRiverClient({
219
+ * baseUrl: 'wss://api.modelriver.com/socket',
220
+ * debug: true,
221
+ * });
222
+ *
223
+ * client.on('response', (data) => {
224
+ * console.log('AI Response:', data);
225
+ * });
226
+ *
227
+ * client.connect({ wsToken: 'your-token-from-backend' });
228
+ * ```
229
+ */
230
+ class ModelRiverClient {
231
+ constructor(options = {}) {
232
+ this.socket = null;
233
+ this.channel = null;
234
+ this.heartbeatInterval = null;
235
+ this.connectionState = 'disconnected';
236
+ this.steps = [];
237
+ this.response = null;
238
+ this.error = null;
239
+ this.currentToken = null;
240
+ this.currentWsToken = null;
241
+ this.isConnecting = false;
242
+ // Event listeners
243
+ this.listeners = new Map();
244
+ this.options = {
245
+ baseUrl: options.baseUrl ?? DEFAULT_BASE_URL,
246
+ debug: options.debug ?? false,
247
+ persist: options.persist ?? true,
248
+ storageKeyPrefix: options.storageKeyPrefix ?? DEFAULT_STORAGE_KEY_PREFIX,
249
+ heartbeatInterval: options.heartbeatInterval ?? DEFAULT_HEARTBEAT_INTERVAL,
250
+ requestTimeout: options.requestTimeout ?? DEFAULT_REQUEST_TIMEOUT,
251
+ };
252
+ this.logger = createLogger(this.options.debug);
253
+ this.logger.log('Client initialized with options:', this.options);
254
+ }
255
+ /**
256
+ * Get current client state
257
+ */
258
+ getState() {
259
+ return {
260
+ connectionState: this.connectionState,
261
+ isConnected: this.connectionState === 'connected',
262
+ isConnecting: this.isConnecting,
263
+ steps: [...this.steps],
264
+ response: this.response,
265
+ error: this.error,
266
+ hasPendingRequest: this.hasPendingRequest(),
267
+ };
268
+ }
269
+ /**
270
+ * Check if there's a pending request that can be reconnected
271
+ */
272
+ hasPendingRequest() {
273
+ if (!this.options.persist)
274
+ return false;
275
+ const request = getActiveRequest(this.options.storageKeyPrefix);
276
+ return request !== null;
277
+ }
278
+ /**
279
+ * Connect to WebSocket with token
280
+ */
281
+ connect(options) {
282
+ if (this.isConnecting) {
283
+ this.logger.warn('Connection already in progress, skipping...');
284
+ return;
285
+ }
286
+ const { wsToken } = options;
287
+ // Decode and validate token
288
+ let tokenPayload;
289
+ try {
290
+ tokenPayload = decodeToken(wsToken);
291
+ this.logger.log('Token decoded:', {
292
+ projectId: tokenPayload.project_id,
293
+ channelId: tokenPayload.channel_id,
294
+ topic: tokenPayload.topic,
295
+ });
296
+ }
297
+ catch (err) {
298
+ const errorMsg = err instanceof Error ? err.message : 'Invalid token';
299
+ this.setError(errorMsg);
300
+ this.emit('error', errorMsg);
301
+ return;
302
+ }
303
+ // Check token expiration
304
+ if (isTokenExpired(tokenPayload)) {
305
+ const errorMsg = 'Token has expired';
306
+ this.setError(errorMsg);
307
+ this.emit('error', errorMsg);
308
+ return;
309
+ }
310
+ this.isConnecting = true;
311
+ this.currentToken = tokenPayload;
312
+ this.currentWsToken = wsToken;
313
+ this.emit('connecting');
314
+ // Clean up any existing connection
315
+ this.cleanupConnection();
316
+ // Initialize steps
317
+ this.steps = createInitialSteps();
318
+ this.error = null;
319
+ this.response = null;
320
+ // Save to localStorage for persistence
321
+ if (this.options.persist) {
322
+ saveActiveRequest(this.options.storageKeyPrefix, tokenPayload.project_id, tokenPayload.channel_id, wsToken);
323
+ }
324
+ // Update queue step to loading
325
+ this.updateStepAndEmit('queue', { status: 'loading' });
326
+ // Create Phoenix Socket
327
+ const wsUrl = buildWebSocketUrl(this.options.baseUrl, wsToken);
328
+ this.logger.log('Connecting to:', wsUrl.replace(wsToken, '***TOKEN***'));
329
+ this.socket = new Socket(this.options.baseUrl, {
330
+ params: { token: wsToken },
331
+ });
332
+ this.socket.onOpen(() => {
333
+ this.logger.log('Socket connected');
334
+ this.connectionState = 'connected';
335
+ this.isConnecting = false;
336
+ this.emit('connected');
337
+ // Join channel
338
+ this.joinChannel(tokenPayload.topic);
339
+ });
340
+ this.socket.onError((error) => {
341
+ this.logger.error('Socket error:', error);
342
+ this.connectionState = 'error';
343
+ this.isConnecting = false;
344
+ const errorMsg = 'WebSocket connection error';
345
+ this.setError(errorMsg);
346
+ this.updateStepAndEmit('queue', { status: 'error', errorMessage: errorMsg });
347
+ this.emit('error', errorMsg);
348
+ });
349
+ this.socket.onClose((event) => {
350
+ this.logger.log('Socket closed:', event);
351
+ this.connectionState = 'disconnected';
352
+ this.isConnecting = false;
353
+ this.stopHeartbeat();
354
+ this.emit('disconnected', 'Socket closed');
355
+ });
356
+ this.socket.connect();
357
+ }
358
+ /**
359
+ * Join the Phoenix channel
360
+ */
361
+ joinChannel(topic) {
362
+ if (!this.socket)
363
+ return;
364
+ this.logger.log('Joining channel:', topic);
365
+ this.channel = this.socket.channel(topic, {});
366
+ this.channel.join()
367
+ .receive('ok', () => {
368
+ this.logger.log('Channel joined successfully');
369
+ this.updateStepAndEmit('queue', { status: 'success', duration: 100 });
370
+ this.updateStepAndEmit('process', { status: 'loading' });
371
+ this.updateStepAndEmit('receive', { status: 'loading' });
372
+ this.emit('channel_joined');
373
+ this.startHeartbeat();
374
+ })
375
+ .receive('error', (error) => {
376
+ const reason = error?.reason || 'unknown';
377
+ this.logger.error('Channel join failed:', reason);
378
+ let errorMsg = 'Failed to join channel';
379
+ if (reason === 'unauthorized_project_access') {
380
+ errorMsg = 'Unauthorized: You do not have access to this project';
381
+ }
382
+ else if (reason === 'invalid_channel_format') {
383
+ errorMsg = 'Invalid channel format';
384
+ }
385
+ else if (reason === 'invalid_project_uuid' || reason === 'invalid_channel_uuid') {
386
+ errorMsg = 'Invalid project or channel ID';
387
+ }
388
+ else if (reason !== 'unknown') {
389
+ errorMsg = `Channel join failed: ${reason}`;
390
+ }
391
+ this.setError(errorMsg);
392
+ this.updateStepAndEmit('queue', { status: 'error', errorMessage: errorMsg });
393
+ this.emit('channel_error', reason);
394
+ });
395
+ // Listen for AI response
396
+ this.channel.on('response', (payload) => {
397
+ this.logger.log('AI Response received:', payload);
398
+ this.handleResponse(payload);
399
+ });
400
+ // Listen for errors
401
+ this.channel.on('error', (payload) => {
402
+ const errorMsg = payload?.message || 'An error occurred';
403
+ this.logger.error('Channel error:', errorMsg);
404
+ this.handleError(errorMsg);
405
+ });
406
+ }
407
+ /**
408
+ * Handle AI response
409
+ */
410
+ handleResponse(payload) {
411
+ const isSuccess = payload.status === 'success' ||
412
+ payload.status === 'SUCCESS' ||
413
+ payload.meta?.status === 'success' ||
414
+ payload.status === 'ok';
415
+ if (isSuccess) {
416
+ this.updateStepAndEmit('process', { status: 'success', duration: payload.meta?.duration_ms });
417
+ this.updateStepAndEmit('receive', { status: 'success', duration: 50 });
418
+ this.updateStepAndEmit('complete', { status: 'success' });
419
+ this.response = payload;
420
+ }
421
+ else {
422
+ const errorMsg = payload.error?.message || 'Unknown error';
423
+ this.updateStepAndEmit('process', { status: 'error', errorMessage: errorMsg });
424
+ this.updateStepAndEmit('receive', { status: 'error' });
425
+ this.updateStepAndEmit('complete', { status: 'error' });
426
+ this.setError(errorMsg);
427
+ }
428
+ // Clear active request from localStorage
429
+ if (this.options.persist) {
430
+ clearActiveRequest(this.options.storageKeyPrefix);
431
+ }
432
+ // Emit response event
433
+ this.emit('response', payload);
434
+ // Close connection after receiving response
435
+ setTimeout(() => {
436
+ this.cleanupConnection();
437
+ }, 1000);
438
+ }
439
+ /**
440
+ * Handle error
441
+ */
442
+ handleError(errorMsg) {
443
+ this.setError(errorMsg);
444
+ this.updateStepAndEmit('process', { status: 'error', errorMessage: errorMsg });
445
+ this.emit('error', errorMsg);
446
+ if (this.options.persist) {
447
+ clearActiveRequest(this.options.storageKeyPrefix);
448
+ }
449
+ }
450
+ /**
451
+ * Disconnect from WebSocket
452
+ */
453
+ disconnect() {
454
+ this.logger.log('Disconnecting...');
455
+ this.isConnecting = false;
456
+ this.cleanupConnection();
457
+ if (this.options.persist) {
458
+ clearActiveRequest(this.options.storageKeyPrefix);
459
+ }
460
+ this.emit('disconnected', 'Manual disconnect');
461
+ }
462
+ /**
463
+ * Reset state and clear stored data
464
+ */
465
+ reset() {
466
+ this.logger.log('Resetting...');
467
+ this.disconnect();
468
+ this.steps = [];
469
+ this.response = null;
470
+ this.error = null;
471
+ this.currentToken = null;
472
+ this.currentWsToken = null;
473
+ }
474
+ /**
475
+ * Try to reconnect using stored token
476
+ */
477
+ reconnect() {
478
+ if (!this.options.persist) {
479
+ this.logger.warn('Persistence is disabled, cannot reconnect');
480
+ return false;
481
+ }
482
+ const activeRequest = getActiveRequest(this.options.storageKeyPrefix);
483
+ if (!activeRequest) {
484
+ this.logger.log('No active request found for reconnection');
485
+ return false;
486
+ }
487
+ this.logger.log('Reconnecting with stored token...');
488
+ this.connect({ wsToken: activeRequest.wsToken });
489
+ return true;
490
+ }
491
+ /**
492
+ * Add event listener
493
+ */
494
+ on(event, callback) {
495
+ if (!this.listeners.has(event)) {
496
+ this.listeners.set(event, new Set());
497
+ }
498
+ this.listeners.get(event).add(callback);
499
+ // Return unsubscribe function
500
+ return () => {
501
+ this.listeners.get(event)?.delete(callback);
502
+ };
503
+ }
504
+ /**
505
+ * Remove event listener
506
+ */
507
+ off(event, callback) {
508
+ this.listeners.get(event)?.delete(callback);
509
+ }
510
+ /**
511
+ * Emit event to listeners
512
+ */
513
+ emit(event, ...args) {
514
+ const callbacks = this.listeners.get(event);
515
+ if (callbacks) {
516
+ callbacks.forEach((callback) => {
517
+ try {
518
+ callback(...args);
519
+ }
520
+ catch (err) {
521
+ this.logger.error(`Error in ${event} listener:`, err);
522
+ }
523
+ });
524
+ }
525
+ }
526
+ /**
527
+ * Update step and emit event
528
+ */
529
+ updateStepAndEmit(id, updates) {
530
+ this.steps = updateStep(this.steps, id, updates);
531
+ const step = this.steps.find((s) => s.id === id);
532
+ if (step) {
533
+ this.emit('step', step);
534
+ }
535
+ }
536
+ /**
537
+ * Set error state
538
+ */
539
+ setError(error) {
540
+ this.error = error;
541
+ }
542
+ /**
543
+ * Start heartbeat
544
+ */
545
+ startHeartbeat() {
546
+ this.stopHeartbeat();
547
+ this.heartbeatInterval = setInterval(() => {
548
+ if (this.channel) {
549
+ this.channel.push('heartbeat', {});
550
+ }
551
+ }, this.options.heartbeatInterval);
552
+ }
553
+ /**
554
+ * Stop heartbeat
555
+ */
556
+ stopHeartbeat() {
557
+ if (this.heartbeatInterval) {
558
+ clearInterval(this.heartbeatInterval);
559
+ this.heartbeatInterval = null;
560
+ }
561
+ }
562
+ /**
563
+ * Clean up connection resources
564
+ */
565
+ cleanupConnection() {
566
+ this.stopHeartbeat();
567
+ if (this.channel) {
568
+ try {
569
+ this.channel.leave();
570
+ }
571
+ catch {
572
+ // Ignore errors during cleanup
573
+ }
574
+ this.channel = null;
575
+ }
576
+ if (this.socket) {
577
+ try {
578
+ this.socket.disconnect();
579
+ }
580
+ catch {
581
+ // Ignore errors during cleanup
582
+ }
583
+ this.socket = null;
584
+ }
585
+ this.connectionState = 'disconnected';
586
+ }
587
+ /**
588
+ * Destroy the client and clean up all resources
589
+ */
590
+ destroy() {
591
+ this.reset();
592
+ this.listeners.clear();
593
+ }
594
+ }
595
+
596
+ export { DEFAULT_BASE_URL, DEFAULT_HEARTBEAT_INTERVAL, DEFAULT_REQUEST_TIMEOUT, ModelRiverClient, buildWebSocketUrl, decodeToken, isStorageAvailable, isTokenExpired };
597
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../src/utils.ts","../src/client.ts"],"sourcesContent":[null,null],"names":[],"mappings":"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"}