UNPKG

@methodus/server

Version:

Server components for @methodus workflow

134 lines 6.28 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.verbBasedMethod = void 0; const tslib_1 = require("tslib"); require("reflect-metadata"); const commons_1 = tslib_1.__importStar(require("@methodus/framework-decorators/commons")); const injection_1 = tslib_1.__importDefault(require("@methodus/framework-decorators/injection")); const serversList_1 = require("../servers/serversList"); const response_parser_1 = require("../response/response-parser"); const methodMetadataKey = 'methodus'; function verbBasedMethod(target, propertyKey, descriptor, verb, route, middlewares) { let methodResult = null; target.methodus = target.methodus || {}; const name = target.name || target.constructor.name; target.methodus[name] = target.methodus[name] || { _auth: {}, _events: {}, _descriptors: {} }; const mTarget = target.methodus[name]; let metaObject = Object.assign({}, { verb, route, propertyKey, middlewares, params: [] }); if (mTarget._descriptors[propertyKey]) { metaObject = Object.assign(metaObject, { params: mTarget._descriptors[propertyKey].params }); } Reflect.defineMetadata(methodMetadataKey, metaObject, target, propertyKey); mTarget._descriptors[propertyKey] = metaObject; const paramsMap = metaObject.params; paramsMap.sort((a, b) => { return a.index - b.index; }); const originalMethod = descriptor.value; const value = function (...args) { return tslib_1.__awaiter(this, void 0, void 0, function* () { validateServerIsRunning(); let configName = target.name; if (!configName && target.constructor) { configName = target.constructor.name; } let methodus = mTarget; if (!methodus) { methodus = Reflect.getOwnMetadata(methodMetadataKey, target, propertyKey) || {}; } const config = serversList_1.Servers.classes[configName]; if (!config) { const client = serversList_1.Servers.clients[configName]; const existingClassMetadata = injection_1.default.ClassContainer.get(configName); if (client) { Object.assign(methodus, methodus._descriptors[propertyKey], existingClassMetadata); methodus.resolver = client.resolver; try { const result = yield client.transportType.send(methodus, args, paramsMap, []); return result; } catch (ex) { if (Buffer.isBuffer(ex.error)) { ex.error = ex.error.toString(); throw (ex); } } } else { const result = yield originalMethod.apply(target, args); return result; } } else { const existingClassMetadata = injection_1.default.ClassContainer.get(methodus.name); Object.assign(methodus, methodus._descriptors[propertyKey], existingClassMetadata); const functionArgs = []; let methodType = commons_1.MethodType.Local; const parser = new response_parser_1.ResponseParser(methodus.serverType); const ParserResponse = parser.parse(args, paramsMap, functionArgs); const completeConfiguration = Object.assign({}, methodus, config); if (completeConfiguration && completeConfiguration.methodType) { methodType = completeConfiguration.methodType; } const restHeaders = null; try { const mappedArgs = paramsMap.map((param) => { return { [param.name || param.from]: ParserResponse.args[param.index] }; }); commons_1.default.logger.info(`@Method::call`, methodType, originalMethod.name, ...mappedArgs); switch (methodType) { case commons_1.MethodType.Mock: methodResult = new commons_1.MethodResult(methodus._mocks[propertyKey]); break; case commons_1.MethodType.Local: methodResult = originalMethod.apply(target, ParserResponse.args); break; } } catch (error) { error.statusCode = error.statusCode || 500; commons_1.default.logger.error(error); if (ParserResponse.isRest) { return parser.response(args, error, restHeaders); } else { throw (error); } } if (ParserResponse.isRest) { if (methodResult.toString() === '[object Promise]') { methodResult.then((resolvedPromise) => { return parser.response(args, resolvedPromise, restHeaders); }); } else { return parser.response(args, methodResult, restHeaders); } } else { commons_1.default.logger.info(`@Method::OK`, methodType, originalMethod.name); return methodResult; } } }); }; delete descriptor.value; delete descriptor.writable; descriptor.get = function () { Object.defineProperty(this, propertyKey, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, value() { return value.apply(this, arguments); }, }); }; return descriptor; } exports.verbBasedMethod = verbBasedMethod; function validateServerIsRunning() { if (!serversList_1.Servers) { throw (new Error(`methodus server is not running, did you miss a 'run' statement?`)); } } //# sourceMappingURL=method-pipe.js.map