← back to Dw Boardroom V2
src/ws/broadcast.ts
63 lines
// ═══════════════════════════════════════════════
// DW Boardroom V2 — WebSocket Broadcast
// Real-time meeting events to frontend + War Room
// ═══════════════════════════════════════════════
import { WebSocketServer, WebSocket } from 'ws';
import type { Server } from 'http';
import type { WSEvent } from '../types';
let wss: WebSocketServer;
export function initWebSocket(server: Server): WebSocketServer {
wss = new WebSocketServer({ server, path: '/ws' });
wss.on('connection', (ws) => {
console.log(`[ws] Client connected (${getConnectionCount()} total)`);
ws.send(JSON.stringify({
type: 'connected',
payload: { message: 'Connected to Boardroom V2 WebSocket' },
timestamp: new Date().toISOString(),
}));
ws.on('close', () => {
console.log(`[ws] Client disconnected (${getConnectionCount() - 1} remaining)`);
});
ws.on('error', (err) => {
console.error('[ws] Error:', err.message);
});
});
console.log(`[ws] WebSocket server initialized on /ws`);
return wss;
}
export function broadcast(event: WSEvent): void {
if (!wss) return;
const data = JSON.stringify(event);
let sent = 0;
wss.clients.forEach((client) => {
if (client.readyState === WebSocket.OPEN) {
client.send(data);
sent++;
}
});
if (sent > 0) {
console.log(`[ws] Broadcast ${event.type} to ${sent} clients`);
}
}
export function getConnectionCount(): number {
if (!wss) return 0;
let count = 0;
wss.clients.forEach((client) => {
if (client.readyState === WebSocket.OPEN) count++;
});
return count;
}