UNPKG

@methodus/server

Version:
343 lines 16.6 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); require("reflect-metadata"); const servers_1 = require("./servers"); const config_1 = require("./config"); const _1 = require("./response/"); const fp_1 = require("./fp"); let metadataKey = 'methodus'; const log_1 = require("./log"); const http = require("http"); const colors = require("colors"); const class_container_1 = require("./class-container"); const plugins_1 = require("./plugins"); const figlet = require('figlet'); let Server = class Server { constructor(port, app, httpServer) { this._app = {}; //IApp; this.port = 0; if (port) this.port = +port || 0; this.app = app; this.httpServer = httpServer; this.serverKey = this.makeid(); this.instanceId = servers_1.Servers.addServer(this); //this.start(port); } makeid() { var text = ''; var possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; for (var i = 0; i < 5; i++) text += possible.charAt(Math.floor(Math.random() * possible.length)); return text; } plugins(plugins) { this._plugins = plugins; return this; } configure(config) { this.config = config; return this; } printlogo() { return __awaiter(this, void 0, void 0, function* () { return new Promise((resolve, reject) => { figlet.text('methodus', { font: 'Bigfig', horizontalLayout: 'default', verticalLayout: 'default' }, function (err, data) { if (err) { resolve(); return; } console.log(colors.blue(data)); resolve(); }); }); }); } start(port) { return __awaiter(this, void 0, void 0, function* () { this.port = this.port || port || 0; yield this.printlogo(); // add this instance to the global bridge of servers // Bridge.set(this.serverKey, { server: this }); if (this._plugins) { const loader = new plugins_1.PluginLoader(); loader.config(this.config, this._plugins); } let onStart = null; if (this.httpServer) { servers_1.Servers.set(this.instanceId, 'http', this.httpServer); } if (this.app) { servers_1.Servers.set(this.instanceId, 'express', this.app); } //we should rearrange the configuration in order to load them in the right order // express / http / socketio let objectForOrder = {}; this.config.servers.forEach((server) => { if (!objectForOrder[server.type]) { objectForOrder[server.type] = []; } objectForOrder[server.type].push(server); }); const loadOrder = [ "express" /* ExpressPartial */, "express" /* Express */, "socketio" /* Socket */, "amqp" /* RabbitMQ */, "redis" /* Redis */, "kafka" /* Kafka */ ]; loadOrder.forEach((serverFamily) => __awaiter(this, void 0, void 0, function* () { if (objectForOrder[serverFamily] && objectForOrder[serverFamily].length) { for (let i = 0; i < objectForOrder[serverFamily].length; i++) { let server = objectForOrder[serverFamily][i]; let serverType = server.type; if (server.options.port) { port = server.options.port; } const aServerInstance = servers_1.Servers.get(this.instanceId, serverType); switch (serverType) { case "express" /* Express */: { if (!aServerInstance) { log_1.logger.info(this, colors.green(`> Starting REST server on port ${port}`)); console.log(colors.green(`> Starting REST server on port ${port}`)); this._app[serverType] = new servers_1.Express(port, onStart); let app = servers_1.Servers.set(this.instanceId, server.type, this._app[serverType]); this.app = app._app; var httpServer = servers_1.Servers.get(this.instanceId, 'http') || http.createServer(app._app); this._app['http'] = httpServer; //listen on provided ports servers_1.Servers.set(this.instanceId, 'http', httpServer); } else { //express was allready initiated //this._app[serverType] = const partialExpress = new servers_1.ExpressPartial(this.app); servers_1.Servers.set(this.instanceId, server.type, partialExpress); } this.config.servers.forEach((serverConfiguration) => { if (serverConfiguration.type === serverType && serverConfiguration.onStart) onStart = serverConfiguration.onStart; }); break; } case "socketio" /* Socket */: { log_1.logger.info(this, colors.green(`> Starting SOCKETIO server on port ${port}`)); console.log(colors.green(`> Starting SOCKETIO server on port ${port}`)); let httpServer = servers_1.Servers.get(this.instanceId, 'http'); // if (!httpServer) { // httpServer = this.httpServer; // } let app = new servers_1.SocketIO(server.options, httpServer); servers_1.Servers.set(this.instanceId, server.type, app); // if (server.onStart) // server.onStart(app); break; } case "amqp" /* RabbitMQ */: { console.log(colors.green(`> Starting MQ server`)); log_1.logger.info(this, colors.green(`> Starting MQ server`)); try { let app = new servers_1.MQ(server.options); servers_1.Servers.set(this.instanceId, server.type, app); } catch (error) { log_1.logger.error(error); } break; } case "kafka" /* Kafka */: { log_1.logger.info(this, colors.green(`> Starting Kafka server`)); try { let app = new servers_1.Kafka(server.options); servers_1.Servers.set(this.instanceId, server.type, app); } catch (error) { log_1.logger.error(error); } break; } case "redis" /* Redis */: { log_1.logger.info(this, colors.green(`> Starting REDIS server`)); try { let app = new servers_1.Redis(server.options); app.connection = new servers_1.RedisServer(); servers_1.Servers.set(this.instanceId, server.type, app); } catch (error) { log_1.logger.error(error); } break; } } } } })); if (onStart) { const instance = servers_1.Servers.get(this.instanceId, "express" /* Express */); if (instance && instance._app) { onStart(instance._app); } } let httpServerIntance = servers_1.Servers.get(this.instanceId, 'http'); if (httpServerIntance) { httpServerIntance.listen(port); } let classes = this.config.classes.entries(); for (var i = 0; i < this.config.classes.size; i++) { let name, element = classes.next(); this.useClass(element.value[1]); } return this; }); } useClass(_class) { let serverInstance = this; //this.config.servers Object.keys(servers_1.Servers.instances).forEach((serverId) => { const server = servers_1.Servers.instances[serverId]; if (_class.classType) { const methodusClass = _class.classType; let proto = fp_1.fp.maybeProto(methodusClass); let metaObject = class_container_1.ClassContainer.get(proto.methodus.name); if (server[_class.serverType]) { metaObject.methodType = _class.methodType; //extract metadata for class and method let configName = methodusClass.name; if (!configName && methodusClass.constructor) configName = methodusClass.constructor.name; servers_1.Servers.classes[configName] = _class; if (metaObject) { metaObject.instanceId = serverInstance.instanceId; class_container_1.ClassContainer.set(proto.methodus.name, metaObject); log_1.logger.info(this, colors.blue(`using class ${_class.classType.name} in ${_class.methodType} mode`)); const activeServers = servers_1.Servers.get(serverInstance.instanceId, _class.serverType); if (activeServers) { activeServers.useClass(_class.classType, metaObject.methodType); } } else { log_1.logger.error('could not load metadata for ' + proto.methodus.name); } } } }); } kill() { ['http', "socketio" /* Socket */].forEach((server) => { if (this._app[server]) { this._app[server].close(); delete this._app[server]; } }); } _send(channel, params, message, parametersMap, securityContext) { return __awaiter(this, void 0, void 0, function* () { return yield this._app[channel]._send(params, message, parametersMap, securityContext); }); } registerEvent(channel, eventName) { return __awaiter(this, void 0, void 0, function* () { if (this._app[channel].registerEvent) return yield this._app[channel].registerEvent(eventName); }); } sendEvent(methodEvent) { return __awaiter(this, void 0, void 0, function* () { this.config.servers.forEach((server) => { this._app[server.type]._sendEvent(methodEvent); }); }); } }; __decorate([ log_1.Log(), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], Server.prototype, "makeid", null); __decorate([ log_1.Log(), __metadata("design:type", Function), __metadata("design:paramtypes", [Array]), __metadata("design:returntype", void 0) ], Server.prototype, "plugins", null); __decorate([ log_1.Log(), __metadata("design:type", Function), __metadata("design:paramtypes", [config_1.MethodusConfig]), __metadata("design:returntype", void 0) ], Server.prototype, "configure", null); __decorate([ log_1.Log(), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", Promise) ], Server.prototype, "printlogo", null); __decorate([ log_1.Log(), __metadata("design:type", Function), __metadata("design:paramtypes", [Number]), __metadata("design:returntype", Promise) ], Server.prototype, "start", null); __decorate([ log_1.Log(), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], Server.prototype, "useClass", null); __decorate([ log_1.Log(), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], Server.prototype, "kill", null); __decorate([ log_1.Log(), __metadata("design:type", Function), __metadata("design:paramtypes", [Object, Object, Object, Object, Object]), __metadata("design:returntype", Promise) ], Server.prototype, "_send", null); __decorate([ log_1.Log(), __metadata("design:type", Function), __metadata("design:paramtypes", [Object, Object]), __metadata("design:returntype", Promise) ], Server.prototype, "registerEvent", null); __decorate([ log_1.Log(), __metadata("design:type", Function), __metadata("design:paramtypes", [_1.MethodEvent]), __metadata("design:returntype", Promise) ], Server.prototype, "sendEvent", null); Server = __decorate([ log_1.LogClass(log_1.logger), __metadata("design:paramtypes", [Object, Object, Object]) ], Server); exports.Server = Server; //# sourceMappingURL=server.js.map