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