@webfaas/webfaas-core
Version:
WebFaaS Framework - Core
211 lines • 10.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.MessageManager = void 0;
const util_1 = require("util");
const WebFaasError_1 = require("../WebFaasError/WebFaasError");
const Core_1 = require("../Core");
const ILog_1 = require("../Log/ILog");
const MessageUtil_1 = require("../Util/MessageUtil");
const MessageManagerTenant_1 = require("./MessageManagerTenant");
const Config_1 = require("../Config/Config");
/**
* Message Manager
*/
class MessageManager {
constructor(moduleManager, log) {
this.preFilterInvokeAsyncList = new Array();
this.listTenant = new Map();
this.moduleManager = moduleManager;
this.moduleManagerImport = this.moduleManager.getModuleManagerImport();
this.log = log;
let defaultConfig = new Config_1.Config();
this.defaultTenant = new MessageManagerTenant_1.MessageManagerTenant("default", defaultConfig, this.log);
Core_1.EventManager.addListener(Core_1.EventManagerEnum.QUIT, () => {
this.stop();
});
}
/**
* return tenant
* @param name tenant name
*/
getTenant(name) {
let tenant = this.listTenant.get(name);
if (tenant) {
return tenant;
}
else {
return this.defaultTenant;
}
}
/**
* add tenant
* @param name tenant name
* @param tenant tenant
*/
addTenant(name, tenant) {
this.listTenant.set(name, tenant);
}
/**
* add pre filter
* @param filter
*/
addPreFilterInvokeAsync(filter) {
if (filter.priority) {
for (let i = 0; i < this.preFilterInvokeAsyncList.length; i++) {
let item = this.preFilterInvokeAsyncList[i];
if (filter.priority > item.priority) {
this.preFilterInvokeAsyncList.splice(i, 0, filter);
return;
}
}
}
this.preFilterInvokeAsyncList.push(filter);
}
/**
* parse version
* @param version
*/
parseVersion(version) {
return MessageUtil_1.MessageUtil.parseVersion(version);
}
/**
* send message
* @param msg
*/
sendMessage(msg) {
let startTime_init = new Date().getTime();
return new Promise((resolve, reject) => {
//
//validate input
//
//msg
if (!msg) {
reject(new WebFaasError_1.WebFaasError.SecurityError(WebFaasError_1.WebFaasError.SecurityErrorTypeEnum.PAYLOAD_INVALID, "message required"));
return;
}
//msg.header
if (!msg.header) {
reject(new WebFaasError_1.WebFaasError.SecurityError(WebFaasError_1.WebFaasError.SecurityErrorTypeEnum.PAYLOAD_INVALID, "header required"));
return;
}
//msg.header.name
if (typeof (msg.header.name) !== "string") {
reject(new WebFaasError_1.WebFaasError.SecurityError(WebFaasError_1.WebFaasError.SecurityErrorTypeEnum.PAYLOAD_INVALID, "header.name type string required"));
return;
}
if (msg.header.name.length > 214) {
reject(new WebFaasError_1.WebFaasError.SecurityError(WebFaasError_1.WebFaasError.SecurityErrorTypeEnum.PAYLOAD_INVALID, "header.name max length 214"));
return;
}
//msg.header.version
if (typeof (msg.header.version) !== "string") {
reject(new WebFaasError_1.WebFaasError.SecurityError(WebFaasError_1.WebFaasError.SecurityErrorTypeEnum.PAYLOAD_INVALID, "header.version type string required"));
return;
}
if (msg.header.version.length > 256) {
reject(new WebFaasError_1.WebFaasError.SecurityError(WebFaasError_1.WebFaasError.SecurityErrorTypeEnum.PAYLOAD_INVALID, "header.version max length 256"));
return;
}
//msg.header.method
if (typeof (msg.header.method) !== "string") {
reject(new WebFaasError_1.WebFaasError.SecurityError(WebFaasError_1.WebFaasError.SecurityErrorTypeEnum.PAYLOAD_INVALID, "header.method type string required"));
return;
}
if (msg.header.method.length > 256) {
reject(new WebFaasError_1.WebFaasError.SecurityError(WebFaasError_1.WebFaasError.SecurityErrorTypeEnum.PAYLOAD_INVALID, "header.method max length 256"));
return;
}
//msg.header.messageID
if (typeof (msg.header.messageID) !== "string") {
reject(new WebFaasError_1.WebFaasError.SecurityError(WebFaasError_1.WebFaasError.SecurityErrorTypeEnum.PAYLOAD_INVALID, "header.messageID type string required"));
return;
}
if (msg.header.messageID.length > 1024) {
reject(new WebFaasError_1.WebFaasError.SecurityError(WebFaasError_1.WebFaasError.SecurityErrorTypeEnum.PAYLOAD_INVALID, "header.messageID max length 1024"));
return;
}
//msg.header.registryName
if (typeof (msg.header.registryName) !== "string" && typeof (msg.header.registryName) !== "undefined") {
reject(new WebFaasError_1.WebFaasError.SecurityError(WebFaasError_1.WebFaasError.SecurityErrorTypeEnum.PAYLOAD_INVALID, "header.registryName type not string"));
return;
}
if (msg.header.registryName && msg.header.registryName.length > 1024) {
reject(new WebFaasError_1.WebFaasError.SecurityError(WebFaasError_1.WebFaasError.SecurityErrorTypeEnum.PAYLOAD_INVALID, "header.registryName max length 1024"));
return;
}
//
//execute
//
this.moduleManagerImport.import(msg.header.name, msg.header.version, undefined, msg.header.registryName, true).then((moduleObj) => {
if (moduleObj) {
//pre filter
let startTime_filter = new Date().getTime();
Promise.all(this.preFilterInvokeAsyncList.map((item) => { return item.filter(msg); })).then(() => {
//pre filter - ok
let targetInvoke = undefined;
if (msg.header.method) {
targetInvoke = moduleObj[msg.header.method];
}
else {
targetInvoke = moduleObj;
}
if (targetInvoke) {
let tenant = this.getTenant(msg.header.tenantID);
let startTime_invoke = new Date().getTime();
let responseSyncCallInvoke = targetInvoke(msg, tenant.invokeContext);
if (util_1.types.isPromise(responseSyncCallInvoke)) {
Promise.resolve(responseSyncCallInvoke).then((responseAsyncCallInvoke) => {
let endTime_invoke = new Date().getTime();
let optLog = {};
optLog.header = msg.header;
optLog.time = {};
optLog.time.total = endTime_invoke - startTime_init;
optLog.time.filter = startTime_invoke - startTime_filter;
optLog.time.invoke = endTime_invoke - startTime_invoke;
this.log.write(Core_1.LogLevelEnum.INFO, "sendMessage", ILog_1.LogCodeEnum.PROCESS, "invoke", optLog, __filename);
resolve(responseAsyncCallInvoke);
}).catch((errTryPromise) => {
reject(new WebFaasError_1.WebFaasError.InvokeError(errTryPromise));
});
}
else {
let endTime_invoke = new Date().getTime();
let optLog = {};
optLog.header = msg.header;
optLog.time = {};
optLog.time.total = endTime_invoke - startTime_init;
optLog.time.filter = startTime_invoke - startTime_filter;
optLog.time.invoke = endTime_invoke - startTime_invoke;
this.log.write(Core_1.LogLevelEnum.INFO, "sendMessage", ILog_1.LogCodeEnum.PROCESS, "invoke", optLog, __filename);
resolve(responseSyncCallInvoke);
}
}
else {
//method not found
this.log.write(Core_1.LogLevelEnum.ERROR, "sendMessage", ILog_1.LogCodeEnum.PROCESS, "method not found", { header: msg.header }, __filename);
reject(new WebFaasError_1.WebFaasError.NotFoundError(WebFaasError_1.WebFaasError.NotFoundErrorTypeEnum.METHOD, msg.header.method));
}
}).catch((errPreFilter) => {
//pre filter - error
this.log.writeError("sendMessage:prefilter", errPreFilter, { header: msg.header }, __filename);
reject(errPreFilter);
});
}
else {
reject(new WebFaasError_1.WebFaasError.NotFoundError(WebFaasError_1.WebFaasError.NotFoundErrorTypeEnum.MANIFEST, "module not found"));
}
}).catch((errImport) => {
//import - error
this.log.writeError("sendMessage:import", errImport, { header: msg.header }, __filename);
reject(errImport);
});
});
}
stop() {
this.listTenant.forEach((tenant) => {
tenant.stop();
});
}
}
exports.MessageManager = MessageManager;
//# sourceMappingURL=MessageManager.js.map