From 28d7e1bd5fafd85ea8d540fa1aa0e89e81f4b823 Mon Sep 17 00:00:00 2001 From: Paulov Date: Fri, 29 Jul 2022 13:28:43 +0100 Subject: [PATCH] NEW: Working (ish) WebSocket connection to client --- bin/www.js | 57 +++++++++++++++++++++++---- package.json | 16 ++++++-- src/Controllers/ResponseController.js | 47 ++++++++++++++++------ src/classes/notifier.js | 2 - src/functions/callbacks.js | 1 - src/functions/response.js | 1 - 6 files changed, 98 insertions(+), 26 deletions(-) diff --git a/bin/www.js b/bin/www.js index 5fec4c1..2a49a37 100644 --- a/bin/www.js +++ b/bin/www.js @@ -11,9 +11,11 @@ const app = require('../express/app'); const http = require('http'); const https = require('https'); const fs = require('fs'); -// const ws = require('ws'); const { certificate } = require('./../core/server/certGenerator'); -const { ConfigController } = require('./../src/Controllers/ConfigController') +const { ConfigController } = require('./../src/Controllers/ConfigController'); +const { WebSocket } = require('ws'); +const { logger } = require('../core/util/logger'); +const utility = require('./../core/util/utility'); var serverIp = "127.0.0.1"; /** @@ -75,15 +77,54 @@ if(serverConfig.runSimpleHttpServer === true) { // socket.on('message', message => console.log(message)); // }); + +// const wss = new WebSocket.Server({ server: httpsServer, path: "/websocket" }); + httpsServer.on('error', onError); -httpsServer.on('listening', () => { console.log("HTTPS Server listening on " + httpsServer.address().address + ":" + httpsServer.address().port) }); -// httpsServer.on('upgrade', (request, socket, head) => { -// wsServer.handleUpgrade(request, socket, head, socket => { -// wsServer.emit('connection', socket, request); -// }); -// }); +httpsServer.on('listening', () => { logger.logSuccess("HTTPS Server listening on " + httpsServer.address().address + ":" + httpsServer.address().port) }); httpsServer.listen(port, serverIp, ()=>{ }); +httpsServer.on("upgrade", (request, socket, head) => { + wss.handleUpgrade(request, socket, head, (websocket) => { + wss.emit("connection", websocket, request); + }); +}); +const wss = new WebSocket.Server({ host: serverIp, port: port + 1 }); +wss.NextChannelId = utility.generateNewId(); +wss.LastChannelId = utility.generateNewId(); +// const wss = new WebSocket.Server({ server: httpsServer }); +wss.on('listening', ws => { + logger.logInfo("WebSocket listening on " + wss.address().address + ":" + wss.address().port); +}); +wss.on('connection', (ws, request, client) => { + // console.log(ws); + console.log(request); + // console.log(client); + + if(wss.NextChannelId === wss.LastChannelId) + wss.NextChannelId = utility.generateNewId(); + + ws.ChannelId = wss.NextChannelId; + // Notify of Client connected + logger.logSuccess('WebSocket Client connected '); + // Send "ping" type back to the Client to make it happy + ws.send(JSON.stringify({ type: "ping", eventId: wss.ChannelId })); + // setInterval(()=>{ + // ws.send(JSON.stringify({ type: "ping", eventId: ws.ChannelId })); + // }, 1000); + wss.LastChannelId = wss.NextChannelId; + // Respond to messages + ws.on('message', function message(data) { + logger.logInfo(`Received message ${data} from user ${client}`); + }); + ws.on('upgrade', function message(data) { + logger.logInfo(`Received upgrade`); + }); +}); +wss.on('upgrade', function message(data) { + logger.logInfo(`Received upgrade`); +}); +global.WebSocketServer = wss; // /** // * Normalize a port into a number, string, or false. diff --git a/package.json b/package.json index d94a11d..a45196c 100644 --- a/package.json +++ b/package.json @@ -17,15 +17,25 @@ "docdash": "^1.2.0", "ejs": "^3.1.7", "express": "^4.18.1", + "https": "^1.0.0", "mathjs": "^10.6.1", "selfsigned": "^2.0.1", "uuid": "^8.3.2", - "write-json-file": "^4.3.0" + "write-json-file": "^4.3.0", + "ws": "^8.8.1" }, "bin": "bin/www.js", "pkg": { - "scripts": [ "core/**/*.js", "src/**/*.js" ], - "assets": [ "res/**/*", "db/**/*", "public/**/*", "express/views/**/*" ], + "scripts": [ + "core/**/*.js", + "src/**/*.js" + ], + "assets": [ + "res/**/*", + "db/**/*", + "public/**/*", + "express/views/**/*" + ], "targets": [ "node16-win" ] diff --git a/src/Controllers/ResponseController.js b/src/Controllers/ResponseController.js index 00bf96b..0e42c8e 100644 --- a/src/Controllers/ResponseController.js +++ b/src/Controllers/ResponseController.js @@ -41,10 +41,22 @@ class ResponseController static getWebSocketUrl() { - ConfigController.rebuildFromBaseConfigs(); - var ws = ResponseController.getBackendUrl().replace("https", "ws"); - // console.log("getWebSocketUrl:" + ws) - return ws; + const wss = global.WebSocketServer; + return `ws://${ResponseController.getWebSocketUrlWithoutWs()}`; + // ConfigController.rebuildFromBaseConfigs(); + // var ws = ResponseController.getBackendUrl().replace("https", "wss"); + // // console.log("getWebSocketUrl:" + ws) + // return ws; + } + + static getWebSocketUrlWithoutWs() + { + const wss = global.WebSocketServer; + return `${wss.address().address}:${wss.address().port}`; + // ConfigController.rebuildFromBaseConfigs(); + // var ws = ResponseController.getBackendUrl().replace("https", "wss"); + // // console.log("getWebSocketUrl:" + ws) + // return ws; } static getMainUrl() { @@ -119,12 +131,19 @@ class ResponseController } static getNotifier = (sessionID) => { + // return { + // server: ResponseController.getBackendUrl(), // this.httpServerHelper.buildUrl(), + // channel_id: sessionID, + // url: `${ResponseController.getBackendUrl()}/notifierServer/get/${sessionID}`, + // notifierServer: `${ResponseController.getBackendUrl()}/notifierServer/get/${sessionID}`, + // ws: `${ResponseController.getWebSocketUrl()}/notifierServer/getwebsocket/${sessionID}` + // } + global.WebSocketServer.NextChannelId = sessionID; return { server: ResponseController.getBackendUrl(), // this.httpServerHelper.buildUrl(), channel_id: sessionID, - url: `${ResponseController.getBackendUrl()}/notifierServer/get/${sessionID}`, - notifierServer: `${ResponseController.getBackendUrl()}/notifierServer/get/${sessionID}`, - ws: `${ResponseController.getWebSocketUrl()}/notifierServer/getwebsocket/${sessionID}` + // url: `notifierServer/${sessionID}`, // url can be empty if we are using Web Sockets + ws: `${ResponseController.getWebSocketUrlWithoutWs()}` } } @@ -138,8 +157,6 @@ class ResponseController action: (url, info, sessionID) => { return ResponseController.getBody({ "status": "ok", - "notifier": ResponseController.getNotifier(sessionID), - "notifierServer": ResponseController.getNotifier(sessionID).notifierServer }); } }, @@ -808,12 +825,20 @@ const QuestRoutes = [ ] -const SITValidatorRoutes = [ +const SITRoutes = [ { url: "/client/sit-validator", action: (url, info, sessionID) => { return JSON.stringify(true); } + }, + { + url: "/client/WebSocketAddress", + action: (url, info, sessionID) => { + // const wss = global.WebSocketServer; + // return JSON.stringify(`ws://${wss.address().address}:${wss.address().port}`); + return ResponseController.getWebSocketUrl(); + } } ] @@ -821,4 +846,4 @@ const SITValidatorRoutes = [ ResponseController.addRoutes(HideoutRoutes); ResponseController.addRoutes(QuestRoutes); ResponseController.addRoutes(RagfairRoutes); -ResponseController.addRoutes(SITValidatorRoutes); \ No newline at end of file +ResponseController.addRoutes(SITRoutes); \ No newline at end of file diff --git a/src/classes/notifier.js b/src/classes/notifier.js index 919e8fd..b75c043 100644 --- a/src/classes/notifier.js +++ b/src/classes/notifier.js @@ -1,6 +1,4 @@ "use strict"; -const { Server } = require('./../../core/server/server') - /* * NotifierService class maintains a queue of notifications which will be pushed upon notification * request from client per session. diff --git a/src/functions/callbacks.js b/src/functions/callbacks.js index a488ecd..e21664c 100644 --- a/src/functions/callbacks.js +++ b/src/functions/callbacks.js @@ -1,4 +1,3 @@ -const { Server } = require("../../core/server/server"); const { TarkovSend } = require("../../core/server/tarkovSend"); const { logger } = require("../../core/util/logger"); const fs = require('fs'); diff --git a/src/functions/response.js b/src/functions/response.js index aef6d6f..041a89f 100644 --- a/src/functions/response.js +++ b/src/functions/response.js @@ -1,4 +1,3 @@ -const { Server } = require("../../core/server/server"); const { logger } = require("../../core/util/logger"); const { AccountController } = require('../../src/Controllers/AccountController'); const { CustomizationController } = require("../Controllers/CustomizationController");