From 209356b8ade1920b50d1d3a1a5e121c6623d167b Mon Sep 17 00:00:00 2001 From: Minteck Date: Fri, 11 Nov 2022 23:47:49 +0100 Subject: Update --- comproxy/index.js | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 comproxy/index.js (limited to 'comproxy/index.js') diff --git a/comproxy/index.js b/comproxy/index.js new file mode 100644 index 0000000..60b4baa --- /dev/null +++ b/comproxy/index.js @@ -0,0 +1,89 @@ +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]; + } + }) +}); \ No newline at end of file -- cgit