95 lines
2.8 KiB
JavaScript
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;
|