tiny refactorizing

This commit is contained in:
waveringana 2024-05-11 22:17:56 -04:00
parent e799724b3b
commit eec6df3301
5 changed files with 116 additions and 17 deletions

View file

@ -1,7 +1,19 @@
import { EventEmitter } from "events";
import WebSocket from "ws";
const eventEmitter = new EventEmitter();
const wsPort = normalizePort(process.env.EBWSPORT || "3001");
const clients: WebSocket[] = [];
/**
* Normalizes a port number to ensure it is a valid integer.
*
* @param {string} val - The port number as a string.
* @returns {number} The normalized port number.
*/
function normalizePort(val: string) {
const port = parseInt(val, 10);
@ -13,8 +25,91 @@ function normalizePort(val: string) {
return port;
}
}
/**
* The WebSocket server instance.
*/
const wss = new WebSocket.Server({port: wsPort});
export { wss };
wss.on("connection", (ws) => {
clients.push(ws);
ws.on("message", handleMessage);
ws.on("close", handleMessage);
ws.on("error", handleMessage);
ws.on("close", () => {
const index = clients.indexOf(ws);
if (index !== -1) {
clients.splice(index, 1);
}
});
});
/**
* Handles incoming messages from clients.
*
* @param {string} message - The incoming message.
*/
function handleMessage(message: string) {
try {
const data = JSON.parse(message);
switch (data.type) {
case "message":
eventEmitter.emit("message", data.message);
break;
case "close":
eventEmitter.emit("close", data.userId);
break;
case "error":
eventEmitter.emit("error", data.error);
break;
default:
console.log(`Unknown message type: ${data.type}`);
}
} catch (error) {
console.log(`Error parsing message: ${error}`);
}
}
/**
* Broadcasts a message to all connected clients.
*
* @param {string} message - The message to broadcast.
*/
function broadcast(message: string) {
wss.clients.forEach((client) => {
if (client.readyState === WebSocket.OPEN) {
client.send(message);
}
});
}
/**
* Returns an array of all connected clients.
*
* @returns {WebSocket[]} An array of connected clients.
*/
function getClients() {
return clients;
}
/**
* Sends a message to a specific client.
*
* @param {string} clientId - The ID of the client to send the message to.
* @param {string} message - The message to send.
*/
/*function sendMessageToClient(clientId: string, message: string) {
const client = clients.find((client) => client.id === clientId);
if (client) {
client.send(message);
}
}*/
//export { wss, eventEmitter, broadcast, getClients, sendMessageToClient };