@methodus/server
Version:
Server components for @methodus workflow
130 lines • 5.12 kB
JavaScript
;
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