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