72 lines
1.7 KiB
TypeScript
72 lines
1.7 KiB
TypeScript
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');
|
|
}
|