zwave-js-ui
Version:
Z-Wave Control Panel and MQTT Gateway
72 lines (71 loc) • 2.35 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const logger_1 = require("./logger");
const socket_io_1 = require("socket.io");
const EventEmitter_1 = require("./EventEmitter");
const SocketEvents_1 = require("./SocketEvents");
const logger = (0, logger_1.module)('Socket');
/**
* The constructor
*/
class SocketManager extends EventEmitter_1.TypedEventEmitter {
io;
activeSockets = new Map();
authMiddleware;
/**
* Binds socket.io to `server`
*
*/
bindServer(server) {
this.io = new socket_io_1.Server(server, {
path: '/socket.io',
});
this.io.on('error', (err) => {
logger.error(`Socket error: ${err.message}`);
});
this.io
.use(this._authMiddleware())
.on('connection', this._onConnection.bind(this));
}
_authMiddleware() {
return (socket, next) => {
if (this.authMiddleware !== undefined) {
this.authMiddleware(socket, next);
}
else {
next();
}
};
}
/**
* Handles new socket connections
*
*/
_onConnection(socket) {
logger.debug(`New connection ${socket.id}`);
// add socket to active sockets
this.activeSockets.set(socket.id, socket);
this.emit('clients', 'connection', this.activeSockets);
// register inbound events from this socket
for (const k in SocketEvents_1.inboundEvents) {
const eventName = SocketEvents_1.inboundEvents[k];
// pass socket reference as first parameter
socket.on(eventName, this._emitEvent.bind(this, eventName, socket));
}
// https://socket.io/docs/v4/server-socket-instance/#events
socket.on('disconnect', (reason) => {
logger.debug(`User disconnected from ${socket.id}: ${reason}`);
this.activeSockets.delete(socket.id);
this.emit('clients', 'disconnect', this.activeSockets);
});
}
/**
* Logs and emits the `eventName` with `socket` and `args` as parameters
*
*/
_emitEvent(eventName, socket, data) {
logger.debug(`Event ${eventName} emitted to ${socket.id}`);
this.emit(eventName, socket, data);
}
}
exports.default = SocketManager;