import WebSocket from 'ws'; const wss = new WebSocket.Server({ port: 8081 }); const receivers: WebSocket[] = []; let sender: WebSocket | null = null; const paths = [] as string[]; wss.on('connection', ws => { console.log('CONNECTION incoming'); ws.once('message', message => { const str = message.toString(); switch (str) { case 'SENDER': setSender(ws); break; case 'RECEIVER': addReceiver(ws) break; default: paths.push(str); break; } }); }); console.log('READY'); function addReceiver(ws: WebSocket) { console.log('RECEIVER registered'); for (const path of paths) { ws.send(path); } receivers.push(ws); ws.onclose = () => { // Remove receiver when connection closes for (const [i, recv] of receivers.entries()) { if (ws === recv) { receivers.splice(i, 1); } } }; } function setSender(ws: WebSocket) { console.log('SENDER is being registered') if (sender) { console.log('Removing current sender...') sender.close(); clearPaths(); } sender = ws; ws.on('message', msg => processMessage(msg)); } function processMessage(message: WebSocket.Data) { const path = message.toString(); console.log('PATH RECEIVED: ' + path); paths.push(path); console.log('SENDING to ' + receivers.length, 'clients'); receivers.forEach(r => r.send(path)); } function clearPaths() { paths.splice(0, paths.length); receivers.forEach(r => r.send("CLEAR")); console.log('Paths have been cleared'); }