@methodus/server
Version:
dynamic rpc components
343 lines • 16.6 kB
JavaScript
"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