import {LoggerFactory} from '@techniker-me/logger'; import WebSocketServer, {WebSocketServerOptions} from './WebSocketServer'; import {ServerWebSocket} from 'bun'; export default class WebSocketServerFactory { public static createWebSocketRelayServer(): WebSocketServer { const logger = LoggerFactory.getLogger('WebSocketRelayServer'); const clients = new Set(); const webSocketRelayServerOptions: WebSocketServerOptions = { onSocketError: (client, error) => logger.error(`Error: [%o] [${error.message}]`, client), onSocketOpen: client => { console.log('New WebSocketClient [%o]', client); logger.debug('New WebSocketClient [%o]', client); clients.add(client); }, onSocketMessage: (fromClient, message) => { console.log('Relaying message [%o]', message); logger.debug(`Relaying message [%o]`, message); for (const client of clients) { if (client === fromClient) { continue; } client.send(message); } }, onSocketClose: client => { console.log('Client closed [%o]', client); clients.delete(client); }, onSocketDrain: client => logger.debug('Client drain [%o]', client), publishToSelf: false }; return new WebSocketServer(webSocketRelayServerOptions); } private constructor() { throw new Error('WebSocketServerFactory is a static class that may not be instantiated'); } }