From 0e985e3920dbdb0127de6de39739f23d6f81bd0f Mon Sep 17 00:00:00 2001 From: Taha Yassine Kraiem Date: Wed, 16 Feb 2022 22:57:35 +0100 Subject: [PATCH] feat(utilities): WS revert to pure socketio --- utilities/server.js | 46 ++++++------------------ utilities/servers/websocket.js | 65 +++++++++++++++------------------- 2 files changed, 39 insertions(+), 72 deletions(-) diff --git a/utilities/server.js b/utilities/server.js index cbae8f5ff..661ef081c 100644 --- a/utilities/server.js +++ b/utilities/server.js @@ -8,6 +8,7 @@ const HOST = '0.0.0.0'; const PORT = 9000; var app = express(); +var wsapp = express(); let debug = process.env.debug === "1" || false; const request_logger = (identity) => { return (req, res, next) => { @@ -22,15 +23,20 @@ const request_logger = (identity) => { } }; app.use(request_logger("[app]")); +wsapp.use(request_logger("[wsapp]")); app.use('/sourcemaps', sourcemapsReaderServer); app.use('/assist', peerRouter); +wsapp.use('/assist', socket.wsRouter); const server = app.listen(PORT, HOST, () => { console.log(`App listening on http://${HOST}:${PORT}`); console.log('Press Ctrl+C to quit.'); }); - +const wsserver = wsapp.listen(PORT + 1, HOST, () => { + console.log(`WS App listening on http://${HOST}:${PORT + 1}`); + console.log('Press Ctrl+C to quit.'); +}); const peerServer = ExpressPeerServer(server, { debug: true, path: '/', @@ -42,38 +48,6 @@ peerServer.on('disconnect', peerDisconnect); peerServer.on('error', peerError); app.use('/', peerServer); app.enable('trust proxy'); - - -const {App} = require("uWebSockets.js"); -const PREFIX = process.env.prefix || '/assist' - -const uapp = new App(); - -const healthFn = (res, req) => { - res.writeStatus('200 OK').end('ok!'); -} -uapp.get(PREFIX, healthFn); -uapp.get(`${PREFIX}/`, healthFn); - -const uWrapper = function (fn) { - return (res, req) => fn(req, res); -} -uapp.get(`${PREFIX}/${process.env.S3_KEY}/sockets-list`, uWrapper(socket.handlers.socketsList)); -uapp.get(`${PREFIX}/${process.env.S3_KEY}/sockets-list/:projectKey`, uWrapper(socket.handlers.socketsListByProject)); - -uapp.get(`${PREFIX}/${process.env.S3_KEY}/sockets-live`, uWrapper(socket.handlers.socketsLive)); -uapp.get(`${PREFIX}/${process.env.S3_KEY}/sockets-live/:projectKey`, uWrapper(socket.handlers.socketsLiveByProject)); - - -socket.start(uapp); - -uapp.listen(HOST, PORT + 1, (token) => { - if (!token) { - console.warn("port already in use"); - } - console.log(`WS App listening on http://${HOST}:${PORT + 1}`); - console.log('Press Ctrl+C to quit.'); -}); - - -module.exports = {uapp, server}; +wsapp.enable('trust proxy'); +socket.start(wsserver); +module.exports = {wsserver, server}; diff --git a/utilities/servers/websocket.js b/utilities/servers/websocket.js index d19cabbcd..ab6a2c4d5 100644 --- a/utilities/servers/websocket.js +++ b/utilities/servers/websocket.js @@ -1,7 +1,9 @@ const _io = require('socket.io'); +const express = require('express'); const uaParser = require('ua-parser-js'); const geoip2Reader = require('@maxmind/geoip2-node').Reader; var {extractPeerId} = require('./peerjs-server'); +var wsRouter = express.Router(); const IDENTITIES = {agent: 'agent', session: 'session'}; const NEW_AGENT = "NEW_AGENT"; const NO_AGENTS = "NO_AGENT"; @@ -9,11 +11,11 @@ const AGENT_DISCONNECT = "AGENT_DISCONNECTED"; const AGENTS_CONNECTED = "AGENTS_CONNECTED"; const NO_SESSIONS = "SESSION_DISCONNECTED"; const SESSION_ALREADY_CONNECTED = "SESSION_ALREADY_CONNECTED"; +// const wsReconnectionTimeout = process.env.wsReconnectionTimeout | 10 * 1000; let io; - let debug = process.env.debug === "1" || false; -const socketsList = function (req, res) { +wsRouter.get(`/${process.env.S3_KEY}/sockets-list`, function (req, res) { debug && console.log("[WS]looking for all available sessions"); let liveSessions = {}; for (let peerId of io.sockets.adapter.rooms.keys()) { @@ -23,10 +25,11 @@ const socketsList = function (req, res) { liveSessions[projectKey].push(sessionId); } } - res.writeStatus('200 OK').writeHeader('Content-Type', 'application/json').end(JSON.stringify({"data": liveSessions})); -} -const socketsListByProject = function (req, res) { - req.params = {projectKey: req.getParameter(0)}; + res.statusCode = 200; + res.setHeader('Content-Type', 'application/json'); + res.end(JSON.stringify({"data": liveSessions})); +}); +wsRouter.get(`/${process.env.S3_KEY}/sockets-list/:projectKey`, function (req, res) { debug && console.log(`[WS]looking for available sessions for ${req.params.projectKey}`); let liveSessions = {}; for (let peerId of io.sockets.adapter.rooms.keys()) { @@ -36,9 +39,12 @@ const socketsListByProject = function (req, res) { liveSessions[projectKey].push(sessionId); } } - res.writeStatus('200 OK').writeHeader('Content-Type', 'application/json').end(JSON.stringify({"data": liveSessions[req.params.projectKey] || []})); -} -const socketsLive = async function (req, res) { + res.statusCode = 200; + res.setHeader('Content-Type', 'application/json'); + res.end(JSON.stringify({"data": liveSessions[req.params.projectKey] || []})); +}); + +wsRouter.get(`/${process.env.S3_KEY}/sockets-live`, async function (req, res) { debug && console.log("[WS]looking for all available LIVE sessions"); let liveSessions = {}; for (let peerId of io.sockets.adapter.rooms.keys()) { @@ -53,10 +59,12 @@ const socketsLive = async function (req, res) { } } } - res.writeStatus('200 OK').writeHeader('Content-Type', 'application/json').end(JSON.stringify({"data": liveSessions})); -} -const socketsLiveByProject = async function (req, res) { - req.params = {projectKey: req.getParameter(0)}; + + res.statusCode = 200; + res.setHeader('Content-Type', 'application/json'); + res.end(JSON.stringify({"data": liveSessions})); +}); +wsRouter.get(`/${process.env.S3_KEY}/sockets-live/:projectKey`, async function (req, res) { debug && console.log(`[WS]looking for available LIVE sessions for ${req.params.projectKey}`); let liveSessions = {}; for (let peerId of io.sockets.adapter.rooms.keys()) { @@ -71,8 +79,10 @@ const socketsLiveByProject = async function (req, res) { } } } - res.writeStatus('200 OK').writeHeader('Content-Type', 'application/json').end(JSON.stringify({"data": liveSessions[req.params.projectKey] || []})); -} + res.statusCode = 200; + res.setHeader('Content-Type', 'application/json'); + res.end(JSON.stringify({"data": liveSessions[req.params.projectKey] || []})); +}); const findSessionSocketId = async (io, peerId) => { const connected_sockets = await io.in(peerId).fetchSockets(); @@ -148,19 +158,16 @@ function extractSessionInfo(socket) { } module.exports = { + wsRouter, start: (server) => { - io = new _io.Server({ + io = _io(server, { maxHttpBufferSize: 1e6, cors: { origin: "*", methods: ["GET", "POST", "PUT"] }, - path: '/socket', - // transports: ['websocket'], - // upgrade: false + path: '/socket' }); - io.attachApp(server); - io.on('connection', async (socket) => { debug && console.log(`WS started:${socket.id}, Query:${JSON.stringify(socket.handshake.query)}`); @@ -200,13 +207,10 @@ module.exports = { } socket.on('disconnect', async () => { - // console.log(`${socket.id} disconnected from ${socket.peerId}, waiting ${wsReconnectionTimeout / 1000}s before checking remaining`); debug && console.log(`${socket.id} disconnected from ${socket.peerId}`); if (socket.identity === IDENTITIES.agent) { socket.to(socket.peerId).emit(AGENT_DISCONNECT, socket.id); } - // wait a little bit before notifying everyone - // setTimeout(async () => { debug && console.log("checking for number of connected agents and sessions"); let {c_sessions, c_agents} = await sessions_agents_count(io, socket); if (c_sessions === -1 && c_agents === -1) { @@ -220,9 +224,6 @@ module.exports = { debug && console.log(`notifying everyone in ${socket.peerId} about no AGENTS`); socket.to(socket.peerId).emit(NO_AGENTS); } - - - // }, wsReconnectionTimeout); }); socket.onAny(async (eventName, ...args) => { @@ -244,9 +245,7 @@ module.exports = { }); }); - console.log("WS server started"); - debug ? console.log("Debugging enabled.") : console.log("Debugging disabled, set debug=\"1\" to enable debugging."); - + console.log("WS server started") setInterval((io) => { try { let count = 0; @@ -269,11 +268,5 @@ module.exports = { console.error(e); } }, 20000, io); - }, - handlers: { - socketsList, - socketsListByProject, - socketsLive, - socketsLiveByProject } }; \ No newline at end of file