UNPKG

restifyx.js

Version:

Advanced API endpoint handler system with automatic documentation

149 lines 5.99 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.WebSocketManager = void 0; const socket_io_1 = require("socket.io"); const logger_1 = require("../utils/logger"); class WebSocketManager { constructor(config) { this.io = null; this.events = []; this.middlewares = []; this.namespaces = new Map(); this.config = config; } /** * Initialize the WebSocket server. * This method sets up the WebSocket server and registers event handlers. * @param server The HTTP or HTTPS server to attach the WebSocket server to * @returns The Socket.IO server instance */ initialize(server) { const logger = (0, logger_1.getLogger)(); if (!this.config.enabled) { logger.info("WebSocket support is disabled"); return null; } logger.info("Initializing WebSocket server..."); this.io = new socket_io_1.Server(server, this.config.options); this.middlewares.forEach((middleware) => { this.io.use(middleware); }); this.io.on("connection", (socket) => { const clientId = socket.id; logger.debug(`WebSocket client connected: ${clientId}`); socket.on("disconnect", () => { logger.debug(`WebSocket client disconnected: ${clientId}`); }); this.events.forEach((event) => { socket.on(event.name, async (data) => { try { await event.handler(socket, data); } catch (error) { logger.error(`Error handling WebSocket event ${event.name}: ${error instanceof Error ? error.message : String(error)}`); socket.emit("error", { message: "Internal server error" }); } }); }); }); this.namespaces.forEach((events, namespace) => { const nsp = this.io.of(namespace); nsp.on("connection", (socket) => { const clientId = socket.id; logger.debug(`WebSocket client connected to namespace ${namespace}: ${clientId}`); socket.on("disconnect", () => { logger.debug(`WebSocket client disconnected from namespace ${namespace}: ${clientId}`); }); events.forEach((event) => { socket.on(event.name, async (data) => { try { await event.handler(socket, data); } catch (error) { logger.error(`Error handling WebSocket event ${event.name} in namespace ${namespace}: ${error instanceof Error ? error.message : String(error)}`); socket.emit("error", { message: "Internal server error" }); } }); }); }); }); logger.info("WebSocket server initialized"); return this.io; } /** * Register a WebSocket event handler. * This method allows you to register a handler for a specific WebSocket event. * @param event The event to register * @param event.name The name of the event */ registerEvent(event) { this.events.push(event); } /** * Register a WebSocket event handler for a specific namespace. * This method allows you to register a handler for a specific WebSocket event in a specific namespace. * @param namespace The namespace to register the event in * @param event The event to register * @param event.name The name of the event */ registerNamespaceEvent(namespace, event) { if (!this.namespaces.has(namespace)) { this.namespaces.set(namespace, []); } this.namespaces.get(namespace).push(event); } /** * Register a middleware function for the WebSocket server. * This method allows you to register a middleware function that will be executed for each incoming WebSocket connection. * @param middleware The middleware function to register */ registerMiddleware(middleware) { this.middlewares.push(middleware); } /** * Get the Socket.IO server instance. * This method returns the Socket.IO server instance if it has been initialized. * @returns The Socket.IO server instance or null if not initialized */ getIO() { return this.io; } /** * Broadcast a message to all connected clients. * This method allows you to broadcast a message to all connected WebSocket clients. * @param event The event name to broadcast * @param data The data to send with the event */ broadcast(event, data) { if (!this.io) { throw new Error("WebSocket server not initialized"); } this.io.emit(event, data); } /** * Broadcast a message to all connected clients in a specific namespace. * This method allows you to broadcast a message to all connected WebSocket clients in a specific namespace. * @param namespace The namespace to broadcast the message to * @param event The event name to broadcast * @param data The data to send with the event */ broadcastToNamespace(namespace, event, data) { if (!this.io) { throw new Error("WebSocket server not initialized"); } this.io.of(namespace).emit(event, data); } /** * Get the number of connected clients. * This method returns the number of connected WebSocket clients. * @returns The number of connected clients */ getConnectedClients() { if (!this.io) { return 0; } return Object.keys(this.io.sockets.sockets).length; } } exports.WebSocketManager = WebSocketManager; //# sourceMappingURL=WebSocketManager.js.map