UNPKG

socket.io-controllers

Version:
83 lines 8.59 kB
"use strict"; 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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