UNPKG

@methodus/server

Version:

Server components for @methodus workflow

249 lines 12.4 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } 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) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateServerIsRunning = exports.handleResult = exports.verbBasedMethod = void 0; require("reflect-metadata"); const framework_commons_1 = __importStar(require("@methodus/framework-commons")); const response_1 = require("../response"); const serversList_1 = require("../servers/serversList"); const fast_safe_stringify_1 = __importDefault(require("fast-safe-stringify")); const framework_injection_1 = __importDefault(require("@methodus/framework-injection")); const getClassOf = Function.prototype.call.bind(Object.prototype.toString); const methodMetadataKey = 'methodus'; function verbBasedMethod(target, propertyKey, descriptor, verb, route, middlewares) { 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]; const metaObject = Object.assign({}, { verb, route, propertyKey, middlewares, params: [] }); if (mTarget._descriptors[propertyKey]) { 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 __awaiter(this, void 0, void 0, function* () { target = this; validateServerIsRunning(); let configName = target.name; if (!configName && target.constructor && target.constructor.name !== 'Object') { 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 = framework_commons_1.MethodType.Local; const config = serversList_1.Servers.classes[configName]; if (!config) { const client = serversList_1.Servers.clients[configName]; const existingClassMetadata = framework_injection_1.default.ClassContainer.get(configName); if (client) { Object.assign(methodus, methodus._descriptors[propertyKey], existingClassMetadata); if (getClassOf(target) === '[object Object]') { Object.assign(client, this); if (this.credentials) { methodus._auth.options = this.credentials; } } methodus.resolver = client.resolver; try { const validationResult = yield framework_commons_1.validate(args); if (validationResult) { throw new framework_commons_1.MethodError(validationResult, 422); } if (client.transportType === framework_commons_1.TransportType.Mock) { if (methodus._mocks && methodus._mocks[propertyKey]) { if (typeof methodus._mocks[propertyKey] === 'function') { methodResult = yield methodus._mocks[propertyKey].apply(target, args); } else { methodResult = methodus._mocks[propertyKey]; } } else { methodResult = yield originalMethod.apply(target, args); } } else { methodResult = yield client.transportType.send.apply(target, [methodus, args, paramsMap]); } return handleResult(methodResult); } catch (ex) { if (Buffer.isBuffer(ex.error)) { ex.error = ex.error.toString(); ex.message = ex.error; } try { ex.message = JSON.parse(ex.message).error; } catch (err) { } throw (ex); } } else { const result = yield originalMethod.apply(target, args); return handleResult(result); } } else { const existingClassMetadata = framework_injection_1.default.ClassContainer.get(methodus.name); Object.assign(methodus, methodus._descriptors[propertyKey], existingClassMetadata); const functionArgs = []; completeConfiguration = Object.assign({}, methodus, config); parser = new response_1.ResponseParser(completeConfiguration.serverType.name); ParserResponse = parser.parse(args, paramsMap, functionArgs); if (completeConfiguration && completeConfiguration.methodType) { methodType = completeConfiguration.methodType; } if (completeConfiguration && completeConfiguration.transportType) { methodType = completeConfiguration.transportType; } const restHeaders = null; try { const validationResult = yield framework_commons_1.validate(ParserResponse.args); if (validationResult) { throw new framework_commons_1.MethodError(validationResult, 422); } const mappedArgs = paramsMap.map((param) => { return { [param.name || param.from]: ParserResponse.args[param.index] }; }); framework_commons_1.default.logger.info('@Method::call', methodType, originalMethod.name, fast_safe_stringify_1.default(mappedArgs)); switch (methodType) { case framework_commons_1.MethodType.Mock: if (methodus._mocks && methodus._mocks[propertyKey]) { if (typeof methodus._mocks[propertyKey] === 'function') { methodResult = methodus._mocks[propertyKey].apply(target, ParserResponse.args); } else { methodResult = methodus._mocks[propertyKey]; } } else { methodResult = yield originalMethod.apply(target, ParserResponse.args); } break; case framework_commons_1.MethodType.Local: let instanceFromDI = this; methodResult = yield originalMethod.apply(instanceFromDI, ParserResponse.args); break; } } catch (error) { error.statusCode = error.statusCode || 500; framework_commons_1.default.logger.error(error); if (ParserResponse.isRest) { return parser.response(args, error, restHeaders); } else { throw (error); } } if (methodResult && ParserResponse.isRest) { return parser.response(args, methodResult, methodResult.headers); } else { return handleResult(methodResult); } } }); }; descriptor.value = value; return descriptor; } exports.verbBasedMethod = verbBasedMethod; function handleResult(methodResult) { return __awaiter(this, void 0, void 0, function* () { if (methodResult !== null && methodResult !== undefined && methodResult.result !== null && methodResult.result !== undefined) { try { const requestResult = yield methodResult.result; if (!requestResult) { methodResult = {}; } else { if (Buffer.isBuffer(requestResult)) { const bufferedResult = Buffer.from(requestResult).toString(); if (typeof bufferedResult === 'string') { try { methodResult = new framework_commons_1.MethodResult(JSON.parse(bufferedResult)); } catch (error) { methodResult = bufferedResult; } } } else { if (requestResult.result === undefined) { methodResult = new framework_commons_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; framework_commons_1.default.logger.error(error); throw new framework_commons_1.MethodResultStatus(error, error.statusCode); } } return methodResult; }); } exports.handleResult = handleResult; function validateServerIsRunning() { if (!serversList_1.Servers) { throw (new Error(`methodus server is not running, did you miss a 'run' statement?`)); } } exports.validateServerIsRunning = validateServerIsRunning; //# sourceMappingURL=method.js.map