taboo-cms
Version:
95 lines (82 loc) • 2.42 kB
JavaScript
const socketIO = require('socket.io');
const Logger = require('./Logger');
const EventsEmitter = require('./EventsEmitter');
class SocketsServer {
constructor() {
this.config = null;
this.io = null;
this.eventsToRegister = [];
}
setup(config) {
this.config = config;
}
start(server) {
if (this.config.sockets.port) {
Logger.info(`Starting sockets server on port ${this.config.sockets.port}`);
this.io = socketIO(this.config.sockets.port, {
path: this.config.sockets.path,
});
} else {
Logger.info(`Starting sockets server on port ${this.config.server.port}`);
this.io = socketIO(server, { path: this.config.sockets.path });
}
// On New Socket Connection From Client
this.io.on('connection', socket => {
socket.on('disconnect', this.onClientDisconnect.bind(this, socket));
socket.on('join', this.onClientJoin.bind(this, socket));
socket.on('leave', this.onClientLeave.bind(this, socket));
});
}
onClientDisconnect(socket) {
// On client socket disconnect - leave the rooms
this.config.sockets.rooms.map(room => {
socket.leave(room);
return room;
});
}
onClientJoin(socket, room, cb) {
if (this.config.sockets.rooms.indexOf(room) !== -1) {
socket.join(room);
this.io.to(room).emit('join', { clients: this.getClientsCountInRoom(room) });
EventsEmitter.emit('socket-client-join', {
socket,
room,
});
this.registerEvents(socket);
if (cb && typeof cb === 'function') {
cb(null, room);
}
}
}
registerEvents(socket) {
this.eventsToRegister.map(item => {
socket.on(item.event, item.next);
});
}
onClientLeave(socket, room, cb) {
if (this.config.sockets.rooms.indexOf(room) !== -1) {
socket.leave(room);
if (cb && typeof cb === 'function') {
cb(null, room);
}
}
}
getClientsCountInRoom(room) {
if (Object.prototype.hasOwnProperty.call(this.io.sockets.adapter.rooms, room)) {
return this.io.sockets.adapter.rooms[room].length;
}
return 0;
}
emit(room, event, data) {
if (this.config.sockets.rooms.indexOf(room) !== -1) {
this.io.to(room).emit(event, data);
}
}
register(event, next) {
this.eventsToRegister.push({
event: event,
next: next,
});
}
}
module.exports = new SocketsServer();