restifyx.js
Version:
Advanced API endpoint handler system with automatic documentation
149 lines • 5.99 kB
JavaScript
;
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