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 • 21.8 kB
Source Map (JSON)
{"version":3,"sources":["../../src/client/sse.ts"],"names":["SSEConnectionStatus","handlers"],"mappings":"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","file":"sse.mjs","sourcesContent":["import { MCPOptions } from './types';\nimport { MCPError } from '../errors';\n\ntype EventCallback = (event: MessageEvent) => void;\n\n/**\n * Options for the SSE Client\n */\nexport interface SSEOptions extends MCPOptions {\n // Endpoint for SSE events, defaults to \"/events\"\n eventsEndpoint?: string;\n // Timeout in ms before reconnecting after connection loss\n reconnectTimeout?: number;\n // Maximum number of reconnection attempts\n maxReconnectAttempts?: number;\n // Additional SSE-specific options\n sseOptions?: EventSourceInit;\n // Event types to listen for (used for filtering)\n eventTypes?: string[];\n // Heartbeat interval in ms (default: 30000)\n heartbeatInterval?: number;\n // Connection timeout in ms (default: 10000)\n connectionTimeout?: number;\n // Whether to enable auto-reconnect (default: true)\n autoReconnect?: boolean;\n}\n\n/**\n * Connection status for SSE client\n */\nexport enum SSEConnectionStatus {\n DISCONNECTED = 'disconnected',\n CONNECTING = 'connecting',\n CONNECTED = 'connected',\n RECONNECTING = 'reconnecting',\n ERROR = 'error'\n}\n\n/**\n * SSE Client for handling Server-Sent Events\n */\nexport class MCPSSEClient {\n private baseUrl: string;\n private apiKey?: string;\n private token?: string;\n private tenantId?: string;\n private eventSource: EventSource | null = null;\n private eventHandlers: Map<string, Set<EventCallback>> = new Map();\n private reconnectTimeout: number;\n private maxReconnectAttempts: number;\n private reconnectAttempts: number = 0;\n private eventsEndpoint: string;\n private sseOptions: EventSourceInit | undefined;\n private status: SSEConnectionStatus = SSEConnectionStatus.DISCONNECTED;\n private eventTypes: string[] | undefined;\n private lastEventId: string | null = null;\n private heartbeatInterval: number;\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private connectionTimeout: number;\n private connectionTimer: ReturnType<typeof setTimeout> | null = null;\n private autoReconnect: boolean;\n private statusHandlers: Set<(status: SSEConnectionStatus) => void> = new Set();\n\n /**\n * Create a new SSE client\n */\n constructor(options: SSEOptions) {\n this.baseUrl = options.baseUrl || 'https://api.mcp.ai';\n this.apiKey = options.apiKey;\n this.token = options.token;\n this.tenantId = options.tenantId;\n this.reconnectTimeout = options.reconnectTimeout || 3000;\n this.maxReconnectAttempts = options.maxReconnectAttempts || 10;\n this.eventsEndpoint = options.eventsEndpoint || '/events';\n this.sseOptions = options.sseOptions;\n this.eventTypes = options.eventTypes;\n this.heartbeatInterval = options.heartbeatInterval || 30000;\n this.connectionTimeout = options.connectionTimeout || 10000;\n this.autoReconnect = options.autoReconnect !== false;\n }\n\n /**\n * Get the current connection status\n */\n getStatus(): SSEConnectionStatus {\n return this.status;\n }\n\n /**\n * Register a handler for connection status changes\n */\n onStatusChange(handler: (status: SSEConnectionStatus) => void): () => void {\n this.statusHandlers.add(handler);\n\n // Call immediately with current status\n handler(this.status);\n\n // Return function to remove handler\n return () => {\n this.statusHandlers.delete(handler);\n };\n }\n\n /**\n * Update connection status and notify handlers\n */\n private setStatus(status: SSEConnectionStatus): void {\n if (this.status !== status) {\n this.status = status;\n\n // Notify all status handlers\n for (const handler of this.statusHandlers) {\n try {\n handler(status);\n } catch (error) {\n console.error('Error in SSE status handler:', error);\n }\n }\n }\n }\n\n /**\n * Connect to the SSE endpoint\n */\n connect(): void {\n if (this.eventSource) {\n this.disconnect();\n }\n\n this.setStatus(SSEConnectionStatus.CONNECTING);\n this.reconnectAttempts = 0;\n\n const url = new URL(`${this.baseUrl}${this.eventsEndpoint}`);\n\n // Add auth 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 event types filter if specified\n if (this.eventTypes && this.eventTypes.length > 0) {\n url.searchParams.append('events', this.eventTypes.join(','));\n }\n\n // Add last event ID for resuming\n if (this.lastEventId) {\n url.searchParams.append('lastEventId', this.lastEventId);\n }\n\n try {\n // Set connection timeout\n this.connectionTimer = setTimeout(() => {\n if (this.status === SSEConnectionStatus.CONNECTING) {\n console.warn('SSE connection timeout');\n this.setStatus(SSEConnectionStatus.ERROR);\n this.disconnect();\n if (this.autoReconnect) {\n this.attemptReconnect();\n }\n }\n }, this.connectionTimeout);\n\n // Create the EventSource\n this.eventSource = new EventSource(url.toString(), this.sseOptions);\n\n // Set up event handlers\n this.eventSource.onopen = this.handleOpen.bind(this);\n this.eventSource.onerror = this.handleError.bind(this);\n this.eventSource.onmessage = this.handleMessage.bind(this);\n\n // Register for specific event types and existing handlers\n if (this.eventTypes) {\n for (const eventType of this.eventTypes) {\n this.eventSource.addEventListener(eventType, this.handleEvent.bind(this));\n }\n }\n\n // Register all event types from handlers\n for (const eventType of this.eventHandlers.keys()) {\n this.eventSource.addEventListener(eventType, this.handleEvent.bind(this));\n }\n } catch (error) {\n console.error('Error connecting to SSE endpoint:', error);\n this.handleConnectionError(error);\n }\n }\n\n /**\n * Disconnect from the SSE endpoint\n */\n disconnect(): void {\n // Clear timers\n if (this.connectionTimer) {\n clearTimeout(this.connectionTimer);\n this.connectionTimer = null;\n }\n\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n\n if (this.eventSource) {\n this.eventSource.close();\n this.eventSource = null;\n\n if (this.status !== SSEConnectionStatus.ERROR) {\n this.setStatus(SSEConnectionStatus.DISCONNECTED);\n }\n }\n }\n\n /**\n * Register an event handler for a specific event type\n */\n on(eventType: string, callback: EventCallback): () => void {\n if (!this.eventHandlers.has(eventType)) {\n this.eventHandlers.set(eventType, new Set());\n\n // If connected, add the event listener\n if (this.eventSource && this.eventSource.readyState === EventSource.OPEN) {\n this.eventSource.addEventListener(eventType, this.handleEvent.bind(this));\n }\n }\n\n const handlers = this.eventHandlers.get(eventType)!;\n handlers.add(callback);\n\n // Return a function to remove this handler\n return () => {\n if (this.eventHandlers.has(eventType)) {\n const handlers = this.eventHandlers.get(eventType)!;\n handlers.delete(callback);\n\n if (handlers.size === 0) {\n this.eventHandlers.delete(eventType);\n }\n }\n };\n }\n\n /**\n * Remove all event handlers for a specific event type\n */\n off(eventType: string): void {\n this.eventHandlers.delete(eventType);\n }\n\n /**\n * Attempt to reconnect with exponential backoff\n */\n private attemptReconnect(): void {\n if (this.reconnectAttempts >= this.maxReconnectAttempts) {\n console.error(`SSE maximum reconnection attempts (${this.maxReconnectAttempts}) reached`);\n this.setStatus(SSEConnectionStatus.ERROR);\n return;\n }\n\n this.reconnectAttempts++;\n this.setStatus(SSEConnectionStatus.RECONNECTING);\n\n // Calculate backoff time (with jitter)\n const baseDelay = this.reconnectTimeout;\n const exponentialDelay = baseDelay * Math.pow(1.5, this.reconnectAttempts - 1);\n const jitter = 0.2 * exponentialDelay;\n const delay = exponentialDelay + (Math.random() * jitter);\n\n console.log(`SSE reconnecting in ${Math.round(delay)}ms (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts})`);\n\n setTimeout(() => {\n this.connect();\n }, delay);\n }\n\n /**\n * Start heartbeat to detect connection issues\n */\n private startHeartbeat(): void {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n }\n\n this.heartbeatTimer = setInterval(() => {\n if (this.eventSource && this.eventSource.readyState === EventSource.OPEN) {\n // Dispatch a heartbeat check event\n this.dispatchEvent('heartbeat', new MessageEvent('heartbeat', {\n data: JSON.stringify({\n timestamp: Date.now()\n })\n }));\n } else if (this.eventSource && this.eventSource.readyState === EventSource.CLOSED) {\n // Connection is unexpectedly closed\n console.warn('SSE connection unexpectedly closed during heartbeat check');\n this.disconnect();\n if (this.autoReconnect) {\n this.attemptReconnect();\n }\n }\n }, this.heartbeatInterval);\n }\n\n /**\n * Handle SSE connection open\n */\n private handleOpen(event: Event): void {\n // Clear connection timeout\n if (this.connectionTimer) {\n clearTimeout(this.connectionTimer);\n this.connectionTimer = null;\n }\n\n console.log('SSE connection opened');\n this.setStatus(SSEConnectionStatus.CONNECTED);\n this.reconnectAttempts = 0;\n\n // Start heartbeat\n this.startHeartbeat();\n\n // Dispatch the open event\n this.dispatchEvent('open', new MessageEvent('open'));\n }\n\n /**\n * Handle SSE connection error\n */\n private handleError(event: Event): void {\n console.error('SSE connection error:', event);\n\n // Dispatch the error event\n this.dispatchEvent('error', new MessageEvent('error'));\n\n // Set error status\n this.setStatus(SSEConnectionStatus.ERROR);\n\n // Attempt to reconnect\n if (this.autoReconnect) {\n this.disconnect();\n this.attemptReconnect();\n }\n }\n\n /**\n * Handle connection initialization error\n */\n private handleConnectionError(error: unknown): void {\n // Clear connection timeout\n if (this.connectionTimer) {\n clearTimeout(this.connectionTimer);\n this.connectionTimer = null;\n }\n\n // Set error status\n this.setStatus(SSEConnectionStatus.ERROR);\n\n // Dispatch the error event\n this.dispatchEvent('error', new MessageEvent('error', {\n data: error instanceof Error ? error.message : String(error)\n }));\n\n // Attempt to reconnect\n if (this.autoReconnect) {\n this.attemptReconnect();\n }\n }\n\n /**\n * Handle generic message event\n */\n private handleMessage(event: MessageEvent): void {\n // Store the last event ID for resuming\n if (event.lastEventId) {\n this.lastEventId = event.lastEventId;\n }\n\n // Parse the data if it's JSON\n try {\n const data = JSON.parse(event.data);\n\n // If the data has a type field, dispatch to that specific event type\n if (data.type && typeof data.type === 'string') {\n this.dispatchEvent(data.type, new MessageEvent(data.type, {\n data: data.payload || data,\n lastEventId: event.lastEventId\n }));\n }\n } catch (e) {\n // Not JSON, just pass through the raw data\n }\n\n // Reset reconnect attempts on successful message\n this.reconnectAttempts = 0;\n\n // Dispatch to the generic message handler\n this.dispatchEvent('message', event);\n }\n\n /**\n * Handle specific event type\n */\n private handleEvent(event: MessageEvent): void {\n // Dispatch to handlers for this event type\n this.dispatchEvent(event.type, event);\n }\n\n /**\n * Dispatch an event to all registered handlers\n */\n private dispatchEvent(eventType: string, event: MessageEvent): void {\n if (this.eventHandlers.has(eventType)) {\n const handlers = this.eventHandlers.get(eventType)!;\n for (const handler of handlers) {\n try {\n handler(event);\n } catch (error) {\n console.error(`Error in SSE event handler for ${eventType}:`, error);\n }\n }\n }\n }\n}\n\n/**\n * Create a new SSE client\n */\nexport function createSSEClient(options: SSEOptions): MCPSSEClient {\n return new MCPSSEClient(options);\n}\n"]}