summaryrefslogtreecommitdiff
path: root/comproxy/index.js
diff options
context:
space:
mode:
authorMinteck <contact@minteck.org>2022-11-11 23:47:49 +0100
committerMinteck <contact@minteck.org>2022-11-11 23:47:49 +0100
commit209356b8ade1920b50d1d3a1a5e121c6623d167b (patch)
tree5301396987d1510f715a0b1c24754873af19e1dc /comproxy/index.js
parent2c4ae43e688a9873e86211ea0e7aeb9ba770dd77 (diff)
downloadpluralconnect-209356b8ade1920b50d1d3a1a5e121c6623d167b.tar.gz
pluralconnect-209356b8ade1920b50d1d3a1a5e121c6623d167b.tar.bz2
pluralconnect-209356b8ade1920b50d1d3a1a5e121c6623d167b.zip
Update
Diffstat (limited to 'comproxy/index.js')
-rw-r--r--comproxy/index.js89
1 files changed, 89 insertions, 0 deletions
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