UNPKG

@methodus/server

Version:
130 lines 5.12 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); require("reflect-metadata"); const debug = require('debug')('methodus'); const fp_1 = require("../../fp"); const base_1 = require("../base"); const metadataKey = 'methodus'; const log_1 = require("../../log"); const socketIO = require("socket.io"); const colors = require("colors"); const __1 = require("../"); let SocketIO = class SocketIO extends base_1.BaseServer { constructor(options, httpServer) { super(); this.classRouters = []; if (httpServer) { this._app = socketIO(httpServer); } else { this._app = socketIO.listen(options.port, { transports: ['polling', 'websocket'] }); } global.socketioEngine = this._app; let nsp = this._app; if (options && options.nsp) { nsp = this._app.of(options.nsp); } nsp.on('connection', (socket) => { this.socketHandler(socket); }); nsp.use((socket, next) => { next(); }); } close() { this._app.close(); } useClass(classType) { this.classRouters.push(classType); } socketHandler(socket) { if (!socket.attached) { this.classRouters.forEach((item) => { return new SocketIORouter(item, socket); }); socket.attached = true; } } async _send(functionArgs, methodus, paramsMap) { return new Promise(async (resolve, reject) => { debug('sending data in socket', functionArgs, methodus, paramsMap); const dataObject = {}; functionArgs.forEach((element, index) => { dataObject[paramsMap.filter((item) => { return item.index === index; })[0].name] = element; }); const myUri = await methodus.resolver(); const socket = require('socket.io-client')(myUri); socket.on('connect', () => { debug('socket connection ok'); const messageName = methodus.verb + '_' + methodus.route; debug('messageName:method:recipient', messageName); socket.emit(messageName, dataObject, (data) => { debug('recieved result', data); if (data.error && data.statusCode) { log_1.logger.error(data); reject(data); } else { log_1.logger.info('return value is', data); resolve(data); } }); }); }); } }; SocketIO = tslib_1.__decorate([ log_1.LogClass(log_1.logger), tslib_1.__metadata("design:paramtypes", [Object, Object]) ], SocketIO); exports.SocketIO = SocketIO; let SocketIORouter = class SocketIORouter { constructor(obj, socket) { this.prefix = ''; this.router = null; const proto = fp_1.fp.maybeProto(obj); const methodus = fp_1.fp.maybeMethodus(obj)[obj.name]; const existingClassMetadata = Reflect.getOwnMetadata(metadataKey, proto) || {}; existingClassMetadata.returnMessages = true; Reflect.defineMetadata(metadataKey, existingClassMetadata, proto); Object.keys(methodus._descriptors).forEach((itemKey) => { const item = methodus._descriptors[itemKey]; debug('activating controller method', item, methodus); log_1.logger.info(`registering socket event`, item.verb + '_' + item.route); socket.on(item.verb + '_' + item.route, async (data, callback) => { debug('activating controller method', itemKey, data); const paramsMap = Reflect.getOwnMetadata('params', proto, itemKey) || []; debug('method params', itemKey, paramsMap); const functionArgs = []; methodus._descriptors[itemKey].params.forEach((xitem) => { functionArgs[xitem.index] = data[xitem.name]; }); try { const result = await proto[itemKey](...functionArgs, socket, data); debug('result is:', result); callback(result); } catch (error) { callback(error); } }); }); } }; SocketIORouter = tslib_1.__decorate([ log_1.LogClass(log_1.logger), tslib_1.__metadata("design:paramtypes", [Object, Object]) ], SocketIORouter); exports.SocketIORouter = SocketIORouter; function register(server, parentServer) { const serverType = server.type.name; log_1.logger.info(this, colors.green(`> Starting SOCKETIO server on port ${server.options.port}`)); const httpServer = __1.Servers.get(server.instanceId, 'http'); const app = new SocketIO(server.options, httpServer); __1.Servers.set(server.instanceId, serverType, app); } exports.register = register; //# sourceMappingURL=socketio.js.map