UNPKG

@methodus/server

Version:
210 lines 9.55 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); require("reflect-metadata"); const class_container_1 = require("../class-container"); const log_1 = require("../log"); const response_1 = require("../response"); const rest_1 = require("../rest"); const serversList_1 = require("../servers/serversList"); const methodMetadataKey = 'methodus'; function Method(verb, route, middlewares) { return (target, propertyKey, descriptor) => { target.methodus = target.methodus || {}; const name = target.name || target.constructor.name; target.methodus[name] = target.methodus[name] || { _events: {}, _descriptors: {} }; let 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; let paramsMap = metaObject.params; paramsMap.sort((a, b) => { return a.index - b.index; }); const originalMethod = descriptor.value; const value = async function (...args) { if (args && args[args.length - 1] && args[args.length - 1].instruct) { mTarget = args[args.length - 1].target; target = mTarget; metaObject = mTarget._descriptors[propertyKey]; paramsMap = metaObject.params; paramsMap.sort((a, b) => { return a.index - b.index; }); } validateServerIsRunning(); let configName = name; if (!configName && target.constructor) { configName = target.constructor.name; } let methodResult = null; let methodus = mTarget; if (!methodus) { methodus = Reflect.getOwnMetadata(methodMetadataKey, target, propertyKey) || {}; } let ParserResponse; let parser; let completeConfiguration; let methodType = "Local"; const config = serversList_1.Servers.classes[configName]; if (!config) { const client = serversList_1.Servers.clients[configName]; const existingClassMetadata = class_container_1.ClassContainer.get(configName); if (client) { Object.assign(methodus, methodus._descriptors[propertyKey], existingClassMetadata); methodus.resolver = client.resolver; try { if (client.transportType === "Mock") { if (methodus._mocks && methodus._mocks[propertyKey]) { if (typeof methodus._mocks[propertyKey] === 'function') { methodResult = await methodus._mocks[propertyKey].apply(target, args); } else { methodResult = methodus._mocks[propertyKey]; } } else { methodResult = await originalMethod.apply(target, args); } } else { const result = await client.transportType.send(methodus, args, paramsMap); methodResult = new response_1.MethodResult(result); } return handleResult(methodResult); } catch (ex) { if (Buffer.isBuffer(ex.error)) { ex.error = ex.error.toString(); throw (ex); } } } else { const result = await originalMethod.apply(this, args); return handleResult(result); } } else { const existingClassMetadata = class_container_1.ClassContainer.get(methodus.name); Object.assign(methodus, methodus._descriptors[propertyKey], existingClassMetadata); const functionArgs = []; parser = new rest_1.RestParser(methodus.serverType); ParserResponse = parser.parse(args, paramsMap, functionArgs); completeConfiguration = Object.assign({}, methodus, config); if (completeConfiguration && completeConfiguration.methodType) { methodType = completeConfiguration.methodType; } if (completeConfiguration && completeConfiguration.transportType) { methodType = completeConfiguration.transportType; } const restHeaders = null; try { const mappedArgs = paramsMap.map((param) => { return { [param.name || param.from]: ParserResponse.args[param.index] }; }); log_1.logger.info('@Method::call', methodType, originalMethod.name, ...mappedArgs); switch (methodType) { case "Mock": if (methodus._mocks && methodus._mocks[propertyKey]) { if (typeof methodus._mocks[propertyKey] === 'function') { methodResult = new response_1.MethodResult(methodus._mocks[propertyKey](...ParserResponse.args)); } else { methodResult = new response_1.MethodResult(methodus._mocks[propertyKey]); } } else { methodResult = await originalMethod.apply(target, ParserResponse.args); } break; case "Local": methodResult = await originalMethod.apply(this, ParserResponse.args); break; } } catch (error) { error.statusCode = error.statusCode || 500; log_1.logger.error(error); if (ParserResponse.isRest) { return new parser.response(args, error, restHeaders); } else { throw (error); } } if (methodResult && ParserResponse.isRest) { return new parser.response(args, methodResult, methodResult.headers); } else { return handleResult(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.Method = Method; async function handleResult(methodResult) { if (methodResult !== null && methodResult !== undefined && methodResult.result !== null && methodResult.result !== undefined) { try { const requestResult = await methodResult.result; if (!requestResult) { methodResult = {}; } else { if (Buffer.isBuffer(requestResult)) { const bufferedResult = Buffer.from(requestResult).toString(); if (typeof bufferedResult === 'string') { try { methodResult = new response_1.MethodResult(JSON.parse(bufferedResult)); } catch (error) { methodResult = bufferedResult; } } } else { if (requestResult.result === undefined) { methodResult = new response_1.MethodResult(requestResult); } else { methodResult = requestResult; } } } } catch (error) { error.statusCode = error.statusCode || 500; if (error.error && Buffer.isBuffer(error.error)) { error.error = Buffer.from(error.error).toString(); } delete error.response; delete error.options; delete error.message; log_1.logger.error(error); throw new response_1.MethodResultStatus(error, error.statusCode); } } return methodResult; } function validateServerIsRunning() { if (!serversList_1.Servers) { throw (new Error(`methodus server is not running, did you miss a 'run' statement?`)); } } //# sourceMappingURL=method.js.map