import express from 'express'; import cors from 'cors'; import helmet from 'helmet'; import dotenv from 'dotenv'; import { createServer } from 'http'; import { WebSocketServer } from 'ws'; import rateLimit from 'express-rate-limit'; import { parse } from 'url'; import db from './db/schema.js'; import collaborateRoutes from './routes/collaborate.js'; import collaborativeOrchestrator from './services/collaborativeOrchestrator.js'; dotenv.config(); const app = express(); const server = createServer(app); const wss = new WebSocketServer({ server }); const PORT = process.env.PORT || 3000; // Middleware app.use(helmet()); app.use(cors({ origin: process.env.FRONTEND_URL || 'http://localhost:5173', credentials: true })); app.use(express.json()); // Rate limiting const limiter = rateLimit({ windowMs: 60 * 1000, // 1 minute max: 10 // 10 requests per minute }); app.use('/api', limiter); // WebSocket connection handling wss.on('connection', (ws, req) => { const { query } = parse(req.url, true); const sessionId = query.sessionId ? parseInt(query.sessionId) : null; console.log('WebSocket connection', sessionId ? `session ${sessionId}` : 'established'); if (sessionId) { collaborativeOrchestrator.registerWSClient(sessionId, ws); ws.send(JSON.stringify({ type: 'connected', sessionId, message: 'Connected to session' })); } ws.on('message', (message) => { try { const data = JSON.parse(message.toString()); console.log('Received:', data); if (data.type === 'subscribe' && data.sessionId) { collaborativeOrchestrator.registerWSClient(parseInt(data.sessionId), ws); ws.send(JSON.stringify({ type: 'subscribed', sessionId: data.sessionId })); } } catch (error) { console.error('WebSocket message error:', error); } }); ws.on('close', () => { if (sessionId) { collaborativeOrchestrator.unregisterWSClient(sessionId, ws); } console.log('WebSocket closed'); }); }); // Routes app.get('/api/health', (req, res) => { res.json({ status: 'ok' }); }); app.use('/api/collaborate', collaborateRoutes); // Start server server.listen(PORT, () => { console.log(`Agora AI Backend running on port ${PORT}`); console.log(`WebSocket server ready`); });