@methodus/server
Version:
Server components for @methodus workflow
172 lines • 6.93 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
require("reflect-metadata");
const servers_1 = require("./servers");
const log_1 = require("./log");
const colors = require("colors");
const class_container_1 = require("./class-container");
const plugins_1 = require("./plugins");
const figlet = require("figlet");
const server_container_1 = require("./server-container");
const client_container_1 = require("./client-container");
let Server = class Server {
constructor(port, app, httpServer) {
this._app = {};
this.port = 0;
this._plugins = [];
if (port) {
this.port = +port || 0;
}
this.app = app;
this.httpServer = httpServer;
this.serverKey = this.makeid();
this.instanceId = servers_1.Servers.addServer(this);
}
makeid() {
let text = '';
const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
for (let 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;
}
async printlogo() {
const options = {
font: 'Bigfig',
horizontalLayout: 'default',
verticalLayout: 'default',
};
console.log(figlet.textSync('methodus', options));
}
useClient(_class) {
if (_class.classType) {
const methodusClass = _class.classType;
let configName = methodusClass.name;
if (!configName && methodusClass.constructor) {
configName = methodusClass.constructor.name;
}
const metaObject = class_container_1.ClassContainer.get(configName);
_class.transportType = new client_container_1.ClientContainer(_class.transportType);
servers_1.Servers.clients[configName] = _class;
if (metaObject) {
metaObject.methodType = _class.transportType.name;
class_container_1.ClassContainer.set(configName, metaObject);
log_1.logger.info(colors.blue(`using class ${_class.classType.name} in ${_class.transportType.name} mode`));
}
else {
log_1.logger.error('could not load metadata for ' + configName);
}
}
}
async start() {
this.port = 0;
await this.printlogo();
if (this.config && this._plugins && this._plugins.length > 0) {
const loader = new plugins_1.PluginLoader();
await loader.config(this.config, this._plugins);
}
const onStart = [];
if (this.httpServer) {
servers_1.Servers.set(this.instanceId, 'http', this.httpServer);
}
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 server_container_1.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);
}
});
const httpServerIntance = servers_1.Servers.get(this.instanceId, 'http');
if (httpServerIntance) {
httpServerIntance.listen(this.port);
}
}
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 = class_container_1.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 = serverTypeName;
metaObject.instanceId = serverInstance.instanceId;
class_container_1.ClassContainer.set(configName, metaObject);
log_1.logger.info(colors.blue(`using class ${_class.classType.name} in ${_class.methodType} mode`));
const activeServers = servers_1.Servers.get(serverInstance.instanceId, serverTypeName);
if (activeServers) {
activeServers.useClass(_class.classType, metaObject.methodType);
}
}
else {
log_1.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();
}
};
Server = tslib_1.__decorate([
log_1.LogClass(log_1.logger),
tslib_1.__metadata("design:paramtypes", [Object, Object, Object])
], Server);
exports.Server = Server;
//# sourceMappingURL=server.js.map