socket.io-controllers
Version:
Use ES6 Class with Socket.IO
83 lines • 8.59 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const _ = require("lodash");
const debug = require("debug");
const fs = require("fs");
const http = require("http");
const SocketIO = require("socket.io");
const log = debug('socket.io-controllers');
const capitalize = (str) => str.charAt(0).toUpperCase() + str.slice(1);
function setupSocketIOControllers(options) {
const { server, controllers: { dir, suffix = '.socket-controller.' } } = options;
log('socket controllers directory', dir);
log('using suffix', suffix);
if (!(server instanceof http.Server)) {
throw new SocketIoControllersError('An HTTP server instance is required.');
}
const io = SocketIO(server);
fs.readdirSync(dir).filter((ctrl) => ctrl.indexOf(suffix) > -1).forEach((ctrl) => {
const importedCtrl = require(`${dir}/${ctrl}`);
log('importedCtrl', importedCtrl);
const InstanceName = _.keys(importedCtrl)[0];
const InstanceStatic = _.values(importedCtrl)[0];
if (InstanceName && InstanceStatic) {
let [namespace] = InstanceName.toLocaleLowerCase().split('socketcontroller');
if (namespace === 'default')
namespace = '';
log('namespace', namespace);
const instance = new InstanceStatic();
const instanceFuncNames = Object.getOwnPropertyNames(InstanceStatic.prototype).filter((fn) => fn !== 'constructor' && fn.indexOf('on') > -1);
const eventNames = instanceFuncNames.map((fn) => fn.split(/on(.+)/)[1]);
const builtInIoEventNames = ['connection', 'Connection'];
const builtInSocketEventNames = ['disconnect', 'disconnecting', 'error'];
const builtInSocketEventNamesCap = builtInSocketEventNames.map((e) => capitalize(e));
const socketEventNames = _.difference(eventNames, [
...builtInIoEventNames,
...builtInSocketEventNamesCap
]);
if (!instance.onConnection) {
throw new Error(`${InstanceStatic.name} doesn't implement onConnection function. Did you forget to extend SocketController class?`);
}
if (instance.use)
io.of(namespace).use((socket, next) => instance.use.call({ io, socket, next }));
io.of(namespace).on('connection', (socket) => {
const context = { io, socket };
instance.onConnection.call(context, socket);
for (let e of builtInSocketEventNames) {
socket.on(e, (payload, fn) => instance[`on${capitalize(e)}`].call(context, payload, fn));
}
for (let e of socketEventNames) {
socket.on(e, (payload, fn) => instance[`on${e}`].call(context, payload, fn));
}
});
}
});
return io;
}
exports.setupSocketIOControllers = setupSocketIOControllers;
class SocketController {
use() {
this.next();
}
onConnection() {
log(`onConnection:`, `${this.socket.id} connected.`);
}
onDisconnect() {
log('onDisconnect:', `${this.socket.id} disconnected.`);
}
onDisconnecting(reason) {
log('onDisconnecting:', `${this.socket.id} is disconnecting due to ${reason}.`);
}
onError(reason) {
log('onError:', reason);
}
}
exports.SocketController = SocketController;
class SocketIoControllersError extends Error {
constructor(message) {
super();
this.name = 'SocketIoControllersError';
this.message = message;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw0QkFBNEI7QUFDNUIsK0JBQStCO0FBQy9CLHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFDN0Isc0NBQXNDO0FBRXRDLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0FBQzNDLE1BQU0sVUFBVSxHQUFHLENBQUMsR0FBVyxLQUFLLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUUvRSxrQ0FBeUMsT0FBd0M7SUFDaEYsTUFBTSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxHQUFHLHFCQUFxQixFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUM7SUFDakYsR0FBRyxDQUFDLDhCQUE4QixFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3pDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFNUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sWUFBWSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sSUFBSSx3QkFBd0IsQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFRCxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFNUIsRUFBRSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUk7UUFDNUUsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLEdBQUcsR0FBRyxJQUFJLElBQUks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