UNPKG

@methodus/server

Version:

Server components for @methodus workflow

174 lines 7.63 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Server = void 0; const tslib_1 = require("tslib"); require("reflect-metadata"); const servers_1 = require("./servers"); const commons_1 = tslib_1.__importDefault(require("@methodus/framework-decorators/commons")); const method_handler_1 = require("./method/handlers/method.handler"); const pipe_handler_1 = require("./method/handlers/pipe.handler"); const plugins_1 = require("./plugins"); const injection_1 = tslib_1.__importDefault(require("@methodus/framework-decorators/injection")); const uuid_1 = require("uuid"); class Server { constructor(port, app, httpServer) { this._app = {}; this.port = 0; this.ipAddress = '0.0.0.0'; this._plugins = []; this.methodHandler = new method_handler_1.MethodHandler(); this.methodPipeHandler = new pipe_handler_1.MethodPipeHandler(); if (port) { this.port = +port || 0; } this.app = app; this.httpServer = httpServer; this.serverKey = this.makeid(); this.instanceId = servers_1.Servers.addServer(this); try { this.methodHandler = injection_1.default.Injector.resolve('MethodHandler'); this.methodPipeHandler = injection_1.default.Injector.resolve('MethodPipeHandler'); } catch (error) { throw new Error('missing MethodHandler are you using a platform package?'); } } makeid() { return uuid_1.v1(); } plugins(plugins) { this._plugins = plugins; return this; } configure(config) { this.config = config; return this; } useClient(_class) { if (_class.classType) { const methodusClass = _class.classType; let configName = methodusClass.name; if (!configName && methodusClass.constructor) { configName = methodusClass.constructor.name; } const metaObject = injection_1.default.ClassContainer.get(configName); _class.transportType = new injection_1.default.ClientContainer(_class.transportType); servers_1.Servers.clients[configName] = _class; if (metaObject) { metaObject.methodType = _class.transportType.name; injection_1.default.ClassContainer.set(configName, metaObject); commons_1.default.logger.info(`using client class ${_class.classType.name} in ${_class.transportType.name} mode`); } else { commons_1.default.logger.error('could not load metadata for ' + configName); } } } start() { return tslib_1.__awaiter(this, void 0, void 0, function* () { this.port = 0; console.log(`> Methodus.`); if (this.config && this._plugins && this._plugins.length > 0) { const loader = new plugins_1.PluginLoader(); yield loader.config(this.config, this._plugins); } const onStart = []; if (this.httpServer) { servers_1.Servers.set(this.instanceId, 'http', this.httpServer); } if (this.httpsServer) { servers_1.Servers.set(this.instanceId, 'https', this.httpsServer); } if (this.app) { servers_1.Servers.set(this.instanceId, 'express', this.app); } if (this.config && this.config.servers) { this.config.servers.forEach((server) => { if (server.options && server.options.port) { this.port = server.options.port; } if (server.onStart) { onStart.push(server.onStart); } const aServerInstance = servers_1.Servers.get(this.instanceId, server.type.name); if (!aServerInstance) { server.instanceId = this.instanceId; return new injection_1.default.ServerContainer(server, this); } else { return aServerInstance; } }); onStart.forEach((startEvent) => { const instance = servers_1.Servers.get(this.instanceId, 'express'); if (instance && instance._app) { startEvent(instance._app); } }); this.httpServer = servers_1.Servers.get(this.instanceId, 'http'); if (this.httpServer && this.port) { this.httpServer.listen(this.port, this.ipAddress); } this.httpsServer = servers_1.Servers.get(this.instanceId, 'https'); if (this.httpsServer && this.port) { this.httpsServer.listen(this.port, this.ipAddress); } } if (this.config) { const classes = this.config.classes.entries(); for (let i = 0; i < this.config.classes.size; i++) { const element = classes.next(); this.useClass(element.value[1]); } const clients = this.config.clients.entries(); for (let i = 0; i < this.config.clients.size; i++) { const element = clients.next(); this.useClient(element.value[1]); } } return this; }); } useClass(_class) { const serverInstance = this; Object.keys(servers_1.Servers.instances).forEach((serverId) => { const server = servers_1.Servers.instances[serverId]; if (_class.classType) { const methodusClass = _class.classType; let configName = methodusClass.name; if (!configName && methodusClass.constructor) { configName = methodusClass.constructor.name; } const metaObject = injection_1.default.ClassContainer.get(configName); const serverTypeName = _class.serverType.name || _class.serverType; if (server[serverTypeName]) { servers_1.Servers.classes[configName] = _class; if (metaObject) { metaObject.methodType = _class.methodType; metaObject.serverType = _class.serverType; metaObject.instanceId = serverInstance.instanceId; injection_1.default.ClassContainer.set(configName, metaObject); commons_1.default.logger.info(`using server class ${configName} in ${_class.methodType} mode`); const activeServers = servers_1.Servers.get(serverInstance.instanceId, serverTypeName); if (activeServers) { activeServers.useClass(_class.classType, metaObject.methodType); } } else { commons_1.default.logger.error('could not load metadata for ' + configName); } } } }); } kill() { servers_1.Servers.serversArray.forEach((server) => { if (server && server.close) { server.close(); } }); servers_1.Servers.reset(); } } exports.Server = Server; //# sourceMappingURL=server.js.map