"use strict"; let websocket = require("websocket"); let http = null; let wsServer = null; let {randomUUID} = require("crypto"); const { Client } = require("./Client.js"); const { termoutput } = require("./config"); const EventEmitter = require("./EventEmitter"); const MessageRouter = require("./MessageRouter"); function init(server) { http = server; termoutput && console.log("Web Socket Protocol is ready"); http.addListener("upgrade", () => { termoutput && console.log("HTTP Upgrading to WebSocket"); }); wsServer = new websocket.server({ httpServer: http, autoAcceptConnections: true }); wsServer.addListener("connect", (socket) => { let client = new Client(); let id = randomUUID(); socket.id = id; client.id = id; client.socket = socket; client.created_at = new Date(); Client.clients.set(id, client); EventEmitter.emit('connect', client); let pingTimer = setInterval(() => socket.ping('saQut'), 10_000); socket.addListener("pong", (validationText) => { if (validationText.toString('utf8') != "saQut") { socket.close(); } }); socket.addListener("message", ({ type, utf8Data }) => { if (type == "utf8") { try { const json = JSON.parse(utf8Data); const [message, id, action] = json; let response; if (typeof id === 'number' || typeof id === 'string') { response = MessageRouter.handle(client, message); if (action === 'R') { client.send([response, id, 'E']); } else if (action === 'S') { client.send([response, id, 'C']); } } else { const result = MessageRouter.handle(client, message); if (result && result.broadcast) { EventEmitter.emit('broadcast', result.broadcast, client); } } } catch (error) { EventEmitter.emit('messageError', client, utf8Data); } } }); socket.addListener("close", () => { EventEmitter.emit('disconnect', client); Client.clients.delete(id); clearInterval(pingTimer); }); }); } const on = EventEmitter.on; const emit = EventEmitter.emit; const off = EventEmitter.off; const register = MessageRouter.register; const handle = MessageRouter.handle; exports.init = init; exports.on = on; exports.emit = emit; exports.off = off; exports.register = register; exports.handle = handle;