← back to Dw Boardroom V2
src/api/server.ts
80 lines
// ═══════════════════════════════════════════════
// DW Boardroom V2 — Express Server
// Meeting orchestration with 47 AI agents
// Port 4040 — API + WebSocket
// ═══════════════════════════════════════════════
import dotenv from 'dotenv';
dotenv.config();
import express from 'express';
import cors from 'cors';
import http from 'http';
import { basicAuth } from './middleware/auth';
import { initWebSocket } from '../ws/broadcast';
import { runMigration } from '../db/migrate';
// Route imports
import meetingRoutes from './routes/meetings';
import agentRoutes from './routes/agents';
import agendaRoutes from './routes/agenda';
import voiceRoutes from './routes/voice';
import healthRoutes from './routes/health';
const PORT = parseInt(process.env.PORT || '4040');
const FRONTEND_URL = process.env.FRONTEND_URL || 'http://45.61.58.125:4050';
// ─── Initialize ────────────────────────────────
// Run SQLite migration
runMigration();
const app = express();
const server = http.createServer(app);
// Middleware
app.use(cors({
origin: [FRONTEND_URL, 'http://127.0.0.1:4050', 'http://localhost:4050', 'http://45.61.58.125:4060'],
credentials: true,
}));
app.use(express.json({ limit: '1mb' }));
// Health check — no auth
app.get('/health', (req, res) => {
res.json({ status: 'ok', service: 'dw-boardroom-v2', timestamp: new Date().toISOString() });
});
// Protected routes
app.use('/api/meetings', basicAuth, meetingRoutes);
app.use('/api/agents', basicAuth, agentRoutes);
app.use('/api/agenda', basicAuth, agendaRoutes);
app.use('/api/voice', basicAuth, voiceRoutes);
app.use('/api', basicAuth, healthRoutes);
// ─── WebSocket ─────────────────────────────────
initWebSocket(server);
// ─── Start ─────────────────────────────────────
server.listen(PORT, '0.0.0.0', () => {
console.log(`\n═══════════════════════════════════════════════`);
console.log(` DW Boardroom V2`);
console.log(` API: http://45.61.58.125:${PORT}`);
console.log(` WebSocket: ws://45.61.58.125:${PORT}/ws`);
console.log(` Frontend: ${FRONTEND_URL}`);
console.log(` Governance: ${process.env.GOVERNANCE_URL || 'http://127.0.0.1:4020'}`);
console.log(`═══════════════════════════════════════════════\n`);
});
// Graceful shutdown
process.on('SIGTERM', () => {
console.log('[server] SIGTERM received, shutting down...');
server.close(() => process.exit(0));
});
process.on('SIGINT', () => {
console.log('[server] SIGINT received, shutting down...');
server.close(() => process.exit(0));
});