// src/services/websocket.js import { createSession } from "./apiService"; /** * Connects to the WebSocket server, establishing a new session first. * @param {function(Object): void} onMessageCallback - Callback for incoming messages. * @param {function(): void} onOpenCallback - Callback when the connection is opened. * @param {function(): void} onCloseCallback - Callback when the connection is closed. * @param {function(Error): void} onErrorCallback - Callback when an error occurs. * @returns {Promise<{ws: WebSocket, sessionId: string}>} The WebSocket instance and the session ID. */ export const connectToWebSocket = async ( onMessageCallback, onOpenCallback, onCloseCallback, onErrorCallback ) => { try { let sessionId = localStorage.getItem("sessionId"); if (!sessionId) { // No existing session, so create one via API const session = await createSession(); sessionId = session.id; // Store it in localStorage for reuse localStorage.setItem("sessionId", sessionId); } // You now have a valid sessionId, either reused or newly created console.log("Using session ID:", sessionId); // Then, use the session ID to open the WebSocket connection const websocketUrl = `ws://localhost:8001/ws/workspace/${sessionId}`; const ws = new WebSocket(websocketUrl); ws.onopen = () => { console.log("WebSocket connected"); if (onOpenCallback) onOpenCallback(); }; ws.onmessage = (event) => { const message = JSON.parse(event.data); if (onMessageCallback) onMessageCallback(message); }; ws.onclose = () => { console.log("WebSocket disconnected"); if (onCloseCallback) onCloseCallback(); }; ws.onerror = (error) => { console.error("WebSocket error:", error); if (onErrorCallback) onErrorCallback(error); }; return { ws, sessionId }; } catch (error) { console.error("Failed to create session or connect to WebSocket:", error); if (onErrorCallback) onErrorCallback(error); throw error; } };