Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | 3x 3x 3x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x | /** * * @module WebSockets * @category IO * @internal */ import WebSocket, { WebSocketServer } from "ws"; import { WebSocketConnection } from "./Wss/Connection"; import crypto from "node:crypto"; import { IncomingMessage } from "http"; import { Socket } from "net"; /** * Class for handling WebSockets connections * Keeps track of and delegates the WebSocket connection * Also provides methods for retrieving and closing connections */ export class WebSockets { private readonly server: WebSocketServer; private connections: Map<string, WebSocketConnection>; /** * Constructor for WebSockets class */ constructor() { this.connections = new Map<string, WebSocketConnection>(); this.server = new WebSocketServer({ noServer: true }); this.server.on("connection", this.handleConnection.bind(this)); } /** * Method that handles incoming connections * @param ws - The WebSocket instance */ private handleConnection(ws: WebSocket) { let connection = new WebSocketConnection(ws); let newConnectionID = this.setID(connection); ws.on("close", () => { this.connections.delete(newConnectionID); }); } /** * Handle WebSocket upgrade * @param request - IncomingMessage object representing the request to the server * @param socket - Socket object representing the underlying connection * @param head - Buffer holding the first packet of the upgraded stream */ public handleUpgrade(request: IncomingMessage, socket: Socket, head: Buffer) { this.server.handleUpgrade(request, socket, head, (ws) => { this.server.emit("connection", ws, request); }); } /** * Method that creates a new ID for a connection */ private setID(connection: WebSocketConnection): string { let newID = ""; do { let id = `WSID:${crypto.randomBytes(20).toString("hex")}`; newID = !this.connections.has(id) ? id : ""; } while (newID === ""); this.connections.set(newID, connection); return newID; } public async stop() { this.server.close(); } /** * Asynchronous method that indicates if the WebSockets server is ready * @returns A promise that resolves to a boolean indicating if the server is ready */ async isReady(): Promise<boolean> { return true; } } |