const { WebSocketServer } = require('ws'); const fs = require('fs'); const uuid = require('uuid-v4'); const wss = new WebSocketServer({ port: 38050 }); const servers = {}; const clients = {}; wss.on('connection', function connection(ws, req) { ws.linked = null; ws.id = null; ws.linkedServer = null; console.log("New client: " + req.headers['x-forwarded-for'].split(',')[0].trim()); ws.on('message', (_data) => { if (ws.linked) { try { let data = JSON.parse(_data.toString()); data["_id"] = ws.id; servers[ws.linked].send(JSON.stringify(data)); } catch (e) { console.error(e); } } else { try { let data = JSON.parse(_data.toString()); if (data.type === "client") { if (Object.keys(servers).includes(data.id)) { if (fs.existsSync(__dirname + "/../includes/tokens/" + data.token.replaceAll(".", "").replaceAll("/", ""))) { ws.linked = data.id; ws.id = uuid(); servers[data.id].send(JSON.stringify({ type: "client", id: ws.id })); clients[ws.id] = ws; } else { console.log("close(c), reason: invalid token"); ws.close(); } } else { console.log("close(c), reason: no server"); ws.close(); } } else if (data.type === "server") { if (Object.keys(servers).includes(data.id)) { console.log("close(s), reason: already online"); ws.close(); return; } ws.linkedServer = data.id; servers[data.id] = ws; } else if (data._id) { try { if (clients[data._id]) { clients[data._id].send(_data); } } catch (e) { console.error(e); } } } catch (e) { console.error(e); } } }) ws.on('close', () => { if (ws.linked) { try { servers[ws.linked].send(JSON.stringify({ type: "close", id: ws.id })) } catch (e) { console.error(e); } delete clients[ws.id]; } else if (ws.linkedServer) { delete servers[ws.linkedServer]; } }) });