// src/services/websocket.js import { createSession, API_BASE_URL } from "./apiService"; /** * Gets a session ID from localStorage or creates a new one via the API. * @returns {Promise<string>} The session ID. */ export const getSessionId = async () => { 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); } console.log("Using session ID:", sessionId); return sessionId; }; /** * 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"); // NOTE: The line `sessionId = null;` has been removed as it was for testing purposes // and would force a new session on every connection. sessionId = null 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); // Correct the WebSocket URL based on the API_BASE_URL protocol. // Use `wss` for `https` and `ws` for `http`. const url = new URL(API_BASE_URL); const wsProtocol = url.protocol === "https:" ? "wss" : "ws"; let pathname = url.pathname; // Check if the pathname is just a single slash, if so, don't append it to avoid a double slash if (pathname === "/") { pathname = ""; } const websocketUrl = `${wsProtocol}://${url.host}${pathname}/ws/workspace/${sessionId}`; console.log("Connecting to WebSocket URL:", websocketUrl); 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; } };