MWSE/Source/WebSocket.js

95 lines
2.8 KiB
JavaScript

"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;