/** * WebSocket client for chat completions * This replaces the HTTP streaming endpoint with a WebSocket connection */ // Get the server base URL from environment or use default const SERVER_BASE_URL = process.env.SERVER_BASE_URL || 'http://localhost:8001'; // Convert HTTP URL to WebSocket URL const getWebSocketUrl = () => { const baseUrl = SERVER_BASE_URL; // Replace http:// with ws:// or https:// with wss:// const wsBaseUrl = baseUrl.replace(/^http/, 'ws'); return `${wsBaseUrl}/ws/chat`; }; export interface ChatMessage { role: 'user' | 'assistant' | 'system'; content: string; } export interface ChatCompletionRequest { repo_url: string; messages: ChatMessage[]; filePath?: string; token?: string; type?: string; provider?: string; model?: string; language?: string; excluded_dirs?: string; excluded_files?: string; } /** * Creates a WebSocket connection for chat completions * @param request The chat completion request * @param onMessage Callback for received messages * @param onError Callback for errors * @param onClose Callback for when the connection closes * @returns The WebSocket connection */ export const createChatWebSocket = ( request: ChatCompletionRequest, onMessage: (message: string) => void, onError: (error: Event) => void, onClose: () => void ): WebSocket => { // Create WebSocket connection const ws = new WebSocket(getWebSocketUrl()); // Set up event handlers ws.onopen = () => { console.log('WebSocket connection established'); // Send the request as JSON ws.send(JSON.stringify(request)); }; ws.onmessage = (event) => { // Call the message handler with the received text onMessage(event.data); }; ws.onerror = (error) => { console.error('WebSocket error:', error); onError(error); }; ws.onclose = () => { console.log('WebSocket connection closed'); onClose(); }; return ws; }; /** * Closes a WebSocket connection * @param ws The WebSocket connection to close */ export const closeWebSocket = (ws: WebSocket | null): void => { if (ws && ws.readyState === WebSocket.OPEN) { ws.close(); } };