← 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));
});