ragatanga-mcp-sdk
Version:
SDK for integrating with the Ragatanga Management Control Plane (MCP) with Next.js 15, React 19, WebSocket and Arrow IPC support
1 lines • 35.2 kB
Source Map (JSON)
{"version":3,"sources":["../../src/client/paths.ts","../../src/client/websocket.ts"],"names":["WebSocketStatus","callbacks"],"mappings":"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","file":"websocket.mjs","sourcesContent":["/**\n * Type-safe path parameter extraction\n * Extracts path parameters from a string literal type\n * e.g. \"/users/:id\" -> { id: string }\n */\nexport type PathParams<P extends string> = string extends P\n ? Record<string, string>\n : P extends `${infer _}:${infer Param}/${infer Rest}`\n ? { [K in Param]: string } & PathParams<`/${Rest}`>\n : P extends `${infer _}:${infer Param}`\n ? { [K in Param]: string }\n : {};\n\n/**\n * API Endpoints\n * Type-safe API endpoint definitions\n */\nexport const ApiEndpoints = {\n // Ontology endpoints\n Ontologies: '/ontologies' as const,\n OntologyById: '/ontologies/:id' as const,\n\n // User endpoints\n CurrentUser: '/users/me' as const,\n UserById: '/users/:id' as const,\n\n // Authentication endpoints\n Login: '/auth/login' as const,\n Logout: '/auth/logout' as const,\n RefreshToken: '/auth/refresh' as const,\n\n // Tenant endpoints\n CurrentTenant: '/tenants/current' as const,\n TenantById: '/tenants/:id' as const,\n\n // MCP context endpoints\n ResolveContext: '/resolve' as const,\n WebSocketResolve: '/resolve_ws' as const,\n\n // Tools endpoints\n ToolsList: '/tools/list' as const,\n ToolsExecute: '/tools/execute' as const,\n ToolsStream: '/tools/stream' as const,\n\n // JSON-RPC endpoint\n JsonRPC: '/mcp' as const\n};\n\n/**\n * Creates a URL path by replacing parameters in the path template\n *\n * @example\n * ```ts\n * const path = buildPath('/users/:id', { id: '123' }); // '/users/123'\n * ```\n */\nexport function buildPath(\n pathTemplate: string,\n params?: Record<string, string>\n): string {\n if (!params) return pathTemplate;\n\n let result = pathTemplate;\n\n for (const [key, value] of Object.entries(params)) {\n result = result.replace(`:${key}`, encodeURIComponent(String(value)));\n }\n\n return result;\n}\n\n/**\n * Creates a full URL by combining base URL with a path\n * @param baseUrl Base URL\n * @param path Path to append\n * @returns Full URL\n */\nexport function createFullUrl(baseUrl: string, path: string): string {\n // Normalize baseUrl to ensure it doesn't end with a slash\n const normalizedBaseUrl = baseUrl.endsWith('/')\n ? baseUrl.slice(0, -1)\n : baseUrl;\n\n // Normalize path to ensure it starts with a slash\n const normalizedPath = path.startsWith('/')\n ? path\n : `/${path}`;\n\n return `${normalizedBaseUrl}${normalizedPath}`;\n}\n","import { MCPOptions } from './types';\nimport { MCPError } from '../errors';\nimport { createFullUrl } from './paths';\n\n/**\n * WebSocket message interface\n */\nexport interface WebSocketMessage {\n // Unique identifier for the message\n id?: string;\n // Message type for multiplexing\n type?: string;\n // Message payload\n payload?: any;\n // Target resource URI\n uri?: string;\n // Depth for ontology resolution\n depth?: number;\n // Any other properties\n [key: string]: any;\n}\n\n/**\n * WebSocket event handlers\n */\nexport interface WebSocketEventHandlers {\n // Connection opened\n onOpen?: (event: Event) => void;\n // Message received\n onMessage?: (data: string, messageType?: string) => void;\n // Error occurred\n onError?: (event: Event) => void;\n // Connection closed\n onClose?: (event: CloseEvent) => void;\n // Custom message type handlers\n onMessageType?: Record<string, (data: any) => void>;\n // Heartbeat response\n onHeartbeat?: (latency: number) => void;\n // Connection status change\n onStatusChange?: (status: WebSocketStatus) => void;\n}\n\n/**\n * WebSocket connection status\n */\nexport enum WebSocketStatus {\n CONNECTING = 0,\n CONNECTED = 1,\n CLOSING = 2,\n CLOSED = 3,\n RECONNECTING = 4,\n ERROR = 5\n}\n\n/**\n * WebSocket subscription\n */\nexport interface WebSocketSubscription {\n id: string;\n type: string;\n callback: (data: any) => void;\n unsubscribe: () => void;\n}\n\n/**\n * Enhanced WebSocket client with advanced features\n */\nexport class MCPWebSocket {\n private ws: WebSocket | null = null;\n private baseUrl: string;\n private apiKey?: string;\n private token?: string;\n private tenantId?: string;\n private reconnectAttempts: number = 0;\n private maxReconnectAttempts: number = 10;\n private reconnectDelay: number = 1000;\n private handlers: WebSocketEventHandlers = {};\n private status: WebSocketStatus = WebSocketStatus.CLOSED;\n private messageQueue: WebSocketMessage[] = [];\n private subscriptions: Map<string, Set<(data: any) => void>> = new Map();\n private heartbeatInterval?: number;\n private heartbeatTimeout?: number;\n private lastHeartbeatTime?: number;\n private heartbeatDelay: number = 15000; // 15 seconds to match server's interval\n private connectionId: string = '';\n private binarySupport: boolean = false;\n private connectionPath: string = '/resolve_ws';\n private autoReconnect: boolean = true;\n private lastConnectionTime: number = 0;\n private connectionRetryTimer: ReturnType<typeof setTimeout> | null = null;\n private manualClose: boolean = false;\n\n /**\n * Creates a new WebSocket client\n */\n constructor(options: MCPOptions & { autoReconnect?: boolean, maxReconnectAttempts?: number }) {\n // Convert HTTP URL to WebSocket URL if needed\n let wsBaseUrl = options.baseUrl || 'https://api.mcp.ai';\n wsBaseUrl = wsBaseUrl.replace(/^http/, 'ws');\n\n this.baseUrl = wsBaseUrl;\n this.apiKey = options.apiKey;\n this.token = options.token;\n this.tenantId = options.tenantId;\n this.autoReconnect = options.autoReconnect !== false;\n\n if (options.maxReconnectAttempts !== undefined) {\n this.maxReconnectAttempts = options.maxReconnectAttempts;\n }\n }\n\n /**\n * Connects to the MCP WebSocket endpoint\n */\n connect(path: string = '/resolve_ws', handlers: WebSocketEventHandlers = {}): void {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n console.warn('WebSocket is already connected. Disconnect first to reconnect.');\n return;\n }\n\n // Save the connection path for reconnection\n this.connectionPath = path;\n\n // Reset manual close flag\n this.manualClose = false;\n\n // Update status\n this.setStatus(WebSocketStatus.CONNECTING);\n\n // Store handlers\n this.handlers = handlers;\n\n // Set last connection time\n this.lastConnectionTime = Date.now();\n\n // Create the full WebSocket URL\n const url = new URL(createFullUrl(this.baseUrl, path));\n\n // Generate connection ID\n this.connectionId = this.generateConnectionId();\n\n // Add auth params as query parameters\n if (this.apiKey) {\n url.searchParams.append('apiKey', this.apiKey);\n }\n if (this.token) {\n url.searchParams.append('token', this.token);\n }\n if (this.tenantId) {\n url.searchParams.append('tenantId', this.tenantId);\n }\n\n // Add connection ID\n url.searchParams.append('connectionId', this.connectionId);\n\n // Create WebSocket\n try {\n this.ws = new WebSocket(url.toString());\n\n // Setup binary data if supported\n this.binarySupport = typeof this.ws.binaryType !== 'undefined';\n if (this.binarySupport) {\n this.ws.binaryType = 'arraybuffer';\n }\n\n // Set up event handlers\n this.ws.onopen = this.handleOpen.bind(this);\n this.ws.onmessage = this.handleMessage.bind(this);\n this.ws.onerror = this.handleError.bind(this);\n this.ws.onclose = this.handleClose.bind(this);\n } catch (error) {\n this.handleConnectionError(error);\n }\n }\n\n /**\n * Update and notify about status changes\n */\n private setStatus(newStatus: WebSocketStatus): void {\n if (this.status !== newStatus) {\n this.status = newStatus;\n\n // Notify handler if exists\n if (this.handlers.onStatusChange) {\n try {\n this.handlers.onStatusChange(newStatus);\n } catch (error) {\n console.error('Error in WebSocket status change handler:', error);\n }\n }\n }\n }\n\n /**\n * Handle WebSocket open event\n */\n private handleOpen(event: Event): void {\n console.log('WebSocket connection opened');\n\n // Update status\n this.setStatus(WebSocketStatus.CONNECTED);\n\n // Reset reconnect attempts\n this.reconnectAttempts = 0;\n\n // Call the open handler\n if (this.handlers.onOpen) {\n try {\n this.handlers.onOpen(event);\n } catch (error) {\n console.error('Error in WebSocket open handler:', error);\n }\n }\n\n // Start heartbeat\n this.startHeartbeat();\n\n // Process the message queue\n this.processQueue();\n }\n\n /**\n * Handle WebSocket message event\n */\n private handleMessage(event: MessageEvent): void {\n // Get the message data\n let data: any;\n let messageType: string | undefined;\n\n try {\n // Handle binary data if needed\n if (this.binarySupport && event.data instanceof ArrayBuffer) {\n // Handle binary data\n const view = new Uint8Array(event.data);\n // Convert to string (this is just an example, might need custom binary parsing)\n const textDecoder = new TextDecoder();\n data = textDecoder.decode(view);\n } else {\n // Handle text data\n data = JSON.parse(event.data);\n messageType = data.type;\n }\n\n // Call the general message handler\n if (this.handlers.onMessage) {\n try {\n this.handlers.onMessage(event.data, messageType);\n } catch (error) {\n console.error('Error in WebSocket message handler:', error);\n }\n }\n\n // Call the type-specific handler if it exists\n if (messageType && this.handlers.onMessageType && this.handlers.onMessageType[messageType]) {\n try {\n this.handlers.onMessageType[messageType](data);\n } catch (error) {\n console.error(`Error in WebSocket message type handler for ${messageType}:`, error);\n }\n }\n\n // Distribute to subscriptions\n if (messageType && this.subscriptions.has(messageType)) {\n const callbacks = this.subscriptions.get(messageType);\n if (callbacks) {\n callbacks.forEach(callback => {\n try {\n callback(data);\n } catch (error) {\n console.error(`Error in WebSocket subscription callback for ${messageType}:`, error);\n }\n });\n }\n }\n\n // Handle heartbeat response\n if (messageType === 'heartbeat' && this.lastHeartbeatTime) {\n const latency = Date.now() - this.lastHeartbeatTime;\n\n if (this.handlers.onHeartbeat) {\n try {\n this.handlers.onHeartbeat(latency);\n } catch (error) {\n console.error('Error in WebSocket heartbeat handler:', error);\n }\n }\n }\n } catch (error) {\n console.error('Error processing WebSocket message:', error);\n }\n }\n\n /**\n * Handle WebSocket error event\n */\n private handleError(event: Event): void {\n console.error('WebSocket error:', event);\n\n // Set error status\n this.setStatus(WebSocketStatus.ERROR);\n\n // Call the error handler\n if (this.handlers.onError) {\n try {\n this.handlers.onError(event);\n } catch (error) {\n console.error('Error in WebSocket error handler:', error);\n }\n }\n }\n\n /**\n * Handle WebSocket close event\n */\n private handleClose(event: CloseEvent): void {\n console.log(`WebSocket closed with code ${event.code}, reason: ${event.reason}`);\n\n // Update status\n this.setStatus(WebSocketStatus.CLOSED);\n\n // Stop heartbeat\n this.stopHeartbeat();\n\n // Call the close handler\n if (this.handlers.onClose) {\n try {\n this.handlers.onClose(event);\n } catch (error) {\n console.error('Error in WebSocket close handler:', error);\n }\n }\n\n // Attempt reconnection if not manually closed and auto-reconnect is enabled\n if (!this.manualClose && this.autoReconnect) {\n this.attemptReconnect();\n }\n }\n\n /**\n * Handle connection initialization error\n */\n private handleConnectionError(error: any): void {\n console.error('WebSocket connection error:', error);\n\n // Update status\n this.setStatus(WebSocketStatus.ERROR);\n\n // Attempt reconnection if auto-reconnect is enabled\n if (this.autoReconnect) {\n this.attemptReconnect();\n }\n }\n\n /**\n * Send a message over the WebSocket connection\n */\n send(message: WebSocketMessage): boolean {\n // Check connection\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n // Queue the message\n this.queueMessage(message);\n\n // Try to connect if closed\n if (!this.ws || this.ws.readyState === WebSocket.CLOSED) {\n this.connect(this.connectionPath, this.handlers);\n }\n\n return false;\n }\n\n try {\n // Add an ID if not present\n if (!message.id) {\n message.id = this.generateMessageId();\n }\n\n // Send as JSON\n this.ws.send(JSON.stringify(message));\n return true;\n } catch (error) {\n console.error('Error sending WebSocket message:', error);\n\n // Queue the message\n this.queueMessage(message);\n return false;\n }\n }\n\n /**\n * Queue a message for later sending\n */\n private queueMessage(message: WebSocketMessage): void {\n // Prevent queue from growing too large\n if (this.messageQueue.length >= 100) {\n console.warn('WebSocket message queue is full, dropping oldest message');\n this.messageQueue.shift();\n }\n\n this.messageQueue.push(message);\n }\n\n /**\n * Process the message queue\n */\n private processQueue(): void {\n if (this.ws && this.ws.readyState === WebSocket.OPEN && this.messageQueue.length > 0) {\n console.log(`Processing ${this.messageQueue.length} queued WebSocket messages`);\n\n const queue = [...this.messageQueue];\n this.messageQueue = [];\n\n for (const message of queue) {\n if (!this.send(message)) {\n break;\n }\n }\n }\n }\n\n /**\n * Subscribe to a specific message type\n */\n subscribe<T = any>(type: string, callback: (data: T) => void): WebSocketSubscription {\n // Create a subscription ID\n const id = this.generateSubscriptionId();\n\n // Add to the subscriptions map\n if (!this.subscriptions.has(type)) {\n this.subscriptions.set(type, new Set());\n }\n\n const callbacks = this.subscriptions.get(type)!;\n callbacks.add(callback as any);\n\n // Create an unsubscribe function\n const unsubscribe = () => {\n if (this.subscriptions.has(type)) {\n const callbacks = this.subscriptions.get(type)!;\n callbacks.delete(callback as any);\n\n if (callbacks.size === 0) {\n this.subscriptions.delete(type);\n }\n }\n };\n\n // Return the subscription object\n return {\n id,\n type,\n callback: callback as any,\n unsubscribe\n };\n }\n\n /**\n * Send a request to resolve a URI\n */\n resolveUri(uri: string, depth: number = 1): boolean {\n return this.send({\n type: 'resolve',\n uri,\n depth\n });\n }\n\n /**\n * Close the WebSocket connection\n */\n disconnect(): void {\n // Set manual close flag to prevent auto-reconnect\n this.manualClose = true;\n\n // Stop heartbeat\n this.stopHeartbeat();\n\n // Clear reconnect timer\n if (this.connectionRetryTimer) {\n clearTimeout(this.connectionRetryTimer);\n this.connectionRetryTimer = null;\n }\n\n // Close WebSocket if it exists\n if (this.ws) {\n try {\n // Check if it's not already closed\n if (this.ws.readyState === WebSocket.OPEN || this.ws.readyState === WebSocket.CONNECTING) {\n this.setStatus(WebSocketStatus.CLOSING);\n this.ws.close(1000, 'Client disconnect');\n }\n } catch (error) {\n console.error('Error closing WebSocket:', error);\n } finally {\n this.ws = null;\n this.setStatus(WebSocketStatus.CLOSED);\n }\n }\n }\n\n /**\n * Get the current WebSocket state\n */\n getState(): WebSocketStatus {\n // If we have no socket, or it's been explicitly closed, return CLOSED\n if (!this.ws) {\n return WebSocketStatus.CLOSED;\n }\n\n // Map readyState to our status enum if we're not in a special state\n if (this.status !== WebSocketStatus.RECONNECTING && this.status !== WebSocketStatus.ERROR) {\n switch (this.ws.readyState) {\n case WebSocket.CONNECTING:\n return WebSocketStatus.CONNECTING;\n case WebSocket.OPEN:\n return WebSocketStatus.CONNECTED;\n case WebSocket.CLOSING:\n return WebSocketStatus.CLOSING;\n case WebSocket.CLOSED:\n return WebSocketStatus.CLOSED;\n default:\n return WebSocketStatus.CLOSED;\n }\n }\n\n // Return the current status for special states\n return this.status;\n }\n\n /**\n * Attempt to reconnect with exponential backoff\n */\n private attemptReconnect(): void {\n // Clear any existing reconnect timer\n if (this.connectionRetryTimer) {\n clearTimeout(this.connectionRetryTimer);\n this.connectionRetryTimer = null;\n }\n\n // Don't reconnect if we've exceeded the max attempts\n if (this.reconnectAttempts >= this.maxReconnectAttempts) {\n console.error(`WebSocket maximum reconnection attempts (${this.maxReconnectAttempts}) reached`);\n return;\n }\n\n // Don't reconnect if manually closed\n if (this.manualClose) {\n return;\n }\n\n // Calculate backoff with exponential delay and jitter\n this.reconnectAttempts++;\n\n const baseDelay = this.reconnectDelay;\n const exponentialDelay = baseDelay * Math.pow(1.5, this.reconnectAttempts - 1);\n const maxDelay = 30000; // 30 seconds max\n const cappedDelay = Math.min(exponentialDelay, maxDelay);\n const jitter = cappedDelay * 0.2; // 20% jitter\n const delay = cappedDelay + (Math.random() * jitter * 2 - jitter);\n\n this.setStatus(WebSocketStatus.RECONNECTING);\n console.log(`WebSocket reconnecting in ${Math.round(delay)}ms (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts})`);\n\n // Set a timer to reconnect\n this.connectionRetryTimer = setTimeout(() => {\n this.connect(this.connectionPath, this.handlers);\n }, delay);\n }\n\n /**\n * Start the heartbeat timer\n */\n private startHeartbeat(): void {\n // Stop any existing heartbeat\n this.stopHeartbeat();\n\n // Start a new heartbeat interval\n this.heartbeatInterval = window.setInterval(() => {\n // Only send heartbeat if we're connected\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n // Store the time\n this.lastHeartbeatTime = Date.now();\n\n // Send a heartbeat message\n this.send({\n type: 'heartbeat',\n timestamp: this.lastHeartbeatTime\n });\n\n // Set a timeout for response\n this.heartbeatTimeout = window.setTimeout(() => {\n console.warn('WebSocket heartbeat timeout');\n\n // If we're still connected, disconnect and reconnect\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.disconnect();\n\n if (this.autoReconnect) {\n this.connect(this.connectionPath, this.handlers);\n }\n }\n }, 5000); // 5 second timeout\n }\n }, this.heartbeatDelay);\n }\n\n /**\n * Stop the heartbeat timer\n */\n private stopHeartbeat(): void {\n // Clear the interval\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = undefined;\n }\n\n // Clear the timeout\n if (this.heartbeatTimeout) {\n clearTimeout(this.heartbeatTimeout);\n this.heartbeatTimeout = undefined;\n }\n }\n\n /**\n * Set the heartbeat interval\n */\n setHeartbeatInterval(intervalMs: number): void {\n if (intervalMs < 1000) {\n console.warn('Heartbeat interval too small, setting to 1000ms');\n intervalMs = 1000;\n }\n\n this.heartbeatDelay = intervalMs;\n\n // Restart heartbeat if we're connected\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.startHeartbeat();\n }\n }\n\n /**\n * Set the maximum number of reconnect attempts\n */\n setMaxReconnectAttempts(attempts: number): void {\n this.maxReconnectAttempts = attempts;\n }\n\n /**\n * Set the reconnect delay\n */\n setReconnectDelay(delayMs: number): void {\n this.reconnectDelay = delayMs;\n }\n\n /**\n * Generate a unique subscription ID\n */\n private generateSubscriptionId(): string {\n return `sub_${Date.now()}_${Math.floor(Math.random() * 1000000)}`;\n }\n\n /**\n * Generate a unique message ID\n */\n private generateMessageId(): string {\n return `msg_${Date.now()}_${Math.floor(Math.random() * 1000000)}`;\n }\n\n /**\n * Generate a unique connection ID\n */\n private generateConnectionId(): string {\n return `conn_${Date.now()}_${Math.floor(Math.random() * 1000000)}`;\n }\n}\n\n/**\n * Create a WebSocket client with the given options\n */\nexport function createWebSocketClient(options: MCPOptions): MCPWebSocket {\n return new MCPWebSocket(options);\n}\n"]}