diff --git a/backend/src/ws/index.ts b/backend/src/ws/index.ts index 0cb50b9..17398d0 100644 --- a/backend/src/ws/index.ts +++ b/backend/src/ws/index.ts @@ -38,12 +38,28 @@ export const sessions = new Map(); // Initialize LLM Service (API key from environment) const llmService = new LLMService(process.env.GEMINI_API_KEY || ''); +// Helper to create a serializable version of the session state +const getSerializableSession = (sessionData: SessionData) => { + return { + ...sessionData, + responses: Object.fromEntries(sessionData.responses), + clients: Array.from(sessionData.clients.keys()), // Only send client IDs, not the WebSocket objects + }; +}; + export const broadcastToSession = (sessionId: string, message: any, excludeClientId: string | null = null) => { const sessionData = sessions.get(sessionId); if (sessionData) { + const serializableMessage = { + ...message, + payload: { + ...message.payload, + session: getSerializableSession(sessionData), + }, + }; sessionData.clients.forEach((client, clientId) => { if (clientId !== excludeClientId && client.readyState === WebSocket.OPEN) { - client.send(JSON.stringify(message)); + client.send(JSON.stringify(serializableMessage)); } }); } @@ -89,7 +105,7 @@ export const createWebSocketServer = (server: any) => { if (!sessionData.clients.has(clientId)) { sessionData.clients.set(clientId, ws); console.log(`Client ${clientId} registered for session: ${sessionId}. Total clients: ${sessionData.clients.size}`); - ws.send(JSON.stringify({ type: 'STATE_UPDATE', payload: { session: sessionData } })); + ws.send(JSON.stringify({ type: 'STATE_UPDATE', payload: { session: getSerializableSession(sessionData) } })); } console.log(`Received message from ${clientId} in session ${sessionId}:`, type); @@ -108,7 +124,7 @@ export const createWebSocketServer = (server: any) => { sessionData.expectedResponses = expectedResponses; sessionData.topic = topic || 'Untitled Session'; sessionData.state = SessionState.GATHERING; - broadcastToSession(sessionId, { type: 'STATE_UPDATE', payload: { session: sessionData } }); + broadcastToSession(sessionId, { type: 'STATE_UPDATE', payload: {} }); console.log(`Session ${sessionId} moved to GATHERING with topic "${sessionData.topic}" and ${expectedResponses} expected responses.`); } else { ws.send(JSON.stringify({ type: 'ERROR', payload: { message: `Session is not in SETUP state. Current state: ${sessionData.state}` } })); @@ -127,7 +143,7 @@ export const createWebSocketServer = (server: any) => { if (sessionData.submittedCount === sessionData.expectedResponses) { sessionData.state = SessionState.HARMONIZING; - broadcastToSession(sessionId, { type: 'STATE_UPDATE', payload: { session: sessionData } }); + broadcastToSession(sessionId, { type: 'STATE_UPDATE', payload: {} }); console.log(`Session ${sessionId} moved to HARMONIZING. Triggering LLM analysis.`); try { @@ -200,16 +216,16 @@ export const createWebSocketServer = (server: any) => { sessionData.finalResult = decision; sessionData.state = SessionState.FINAL; - broadcastToSession(sessionId, { type: 'STATE_UPDATE', payload: { session: sessionData } }); + broadcastToSession(sessionId, { type: 'STATE_UPDATE', payload: {} }); console.log(`Analysis complete for session ${sessionId}. Result:`, decision); } catch (error) { console.error(`Error during analysis for session ${sessionId}:`, error); sessionData.state = SessionState.GATHERING; - broadcastToSession(sessionId, { type: 'STATE_UPDATE', payload: { session: sessionData } }); + broadcastToSession(sessionId, { type: 'STATE_UPDATE', payload: {} }); } } else { - broadcastToSession(sessionId, { type: 'STATE_UPDATE', payload: { session: sessionData } }); + broadcastToSession(sessionId, { type: 'STATE_UPDATE', payload: {} }); } } else { ws.send(JSON.stringify({ type: 'ERROR', payload: { message: `Session is not in GATHERING state. Current state: ${sessionData.state}` } })); diff --git a/frontend/src/pages/CreateSession.tsx b/frontend/src/pages/CreateSession.tsx index 18d447a..adb0a16 100644 --- a/frontend/src/pages/CreateSession.tsx +++ b/frontend/src/pages/CreateSession.tsx @@ -1,20 +1,24 @@ -import React from 'react'; -import { Box, Button, Typography, Container } from '@mui/material'; +import React, { useEffect } from 'react'; +import { Box, Typography, Container, CircularProgress } from '@mui/material'; import axios from 'axios'; import { useNavigate } from 'react-router-dom'; const CreateSession = () => { const navigate = useNavigate(); - const handleCreate = async () => { - try { - const response = await axios.post('http://localhost:8000/sessions'); - const { sessionId } = response.data; - navigate(`/session/${sessionId}`); - } catch (error) { - console.error('Error creating session:', error); - } - }; + useEffect(() => { + const handleCreate = async () => { + try { + const response = await axios.post('http://localhost:8000/sessions'); + const { sessionId } = response.data; + navigate(`/session/${sessionId}`); + } catch (error) { + console.error('Error creating session:', error); + } + }; + + handleCreate(); + }, [navigate]); return ( @@ -26,20 +30,10 @@ const CreateSession = () => { alignItems: 'center', }} > - - Unisono + + + Creating a new session... - - - ); diff --git a/frontend/src/pages/SessionPage.tsx b/frontend/src/pages/SessionPage.tsx index b924765..2f18980 100644 --- a/frontend/src/pages/SessionPage.tsx +++ b/frontend/src/pages/SessionPage.tsx @@ -52,7 +52,7 @@ const SessionPage = () => { {session.state === SessionState.SETUP && ( - Set Up the Session + Set Up Session