← back to Dw Boardroom Governance

src/ws/broadcast.ts

54 lines

import { WebSocketServer, WebSocket } from 'ws';
import { Server } from 'http';
import { WSEvent, WSEventType } from '../types';

let wss: WebSocketServer | null = null;

export function initWebSocket(server: Server): void {
  wss = new WebSocketServer({ server, path: '/ws' });

  wss.on('connection', (ws) => {
    console.log('[Governance WS] Client connected');
    ws.send(JSON.stringify({
      type: 'connected',
      payload: { message: 'DW Governance WebSocket connected' },
      timestamp: new Date().toISOString()
    }));
  });

  console.log('[Governance WS] WebSocket server ready on /ws');
}

export function broadcast(type: WSEventType, payload: any): void {
  if (!wss) return;

  const event: WSEvent = {
    type,
    payload,
    timestamp: new Date().toISOString()
  };

  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(`[Governance WS] Broadcast ${type} to ${sent} client(s)`);
  }
}

export function getConnectionCount(): number {
  if (!wss) return 0;
  let count = 0;
  wss.clients.forEach((client) => {
    if (client.readyState === WebSocket.OPEN) count++;
  });
  return count;
}