UNPKG

@methodus/server

Version:
169 lines 5.99 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const response_1 = require("../../response"); const log_1 = require("../../log"); const etag = require("etag"); class Verbs { } Verbs.Get = 'GET'; Verbs.Post = 'POST'; Verbs.Put = 'PUT'; Verbs.Patch = 'PATCH'; Verbs.Head = 'HEAD'; Verbs.Delete = 'DELETE'; exports.Verbs = Verbs; class RestResponse { constructor(args, methodResult, headers) { const res = args[1]; if (methodResult && methodResult.statusCode) { res.status(methodResult.statusCode); } else if (!methodResult || methodResult.error) { res.status(500); } else { res.status(200); } if (methodResult && !methodResult.error) { if (methodResult.total) { res.set('X-Total-Count', methodResult.total); } if (methodResult.page) { res.set('X-Page', methodResult.page); } } if (methodResult === null) { throw (new response_1.MethodError('null result from controller function', 500)); } if (headers) { Object.keys(headers).forEach((header) => { res.setHeader(header, headers[header]); }); } if (methodResult && methodResult.result && methodResult.result.readable) { if (methodResult.headers) { Object.keys(methodResult.headers).forEach((key) => { res.setHeader(key, methodResult.headers[key]); }); } methodResult.result.pipe(res).on('error', (err) => { log_1.logger.error('stream errored', err); }).on('reponse', (response) => { log_1.logger.trace('stream responsed', response); }).on('finish', (response) => { log_1.logger.info('stream finished'); }); return; } if (methodResult.error) { res.send(methodResult.error); } else if (methodResult.result && Buffer.isBuffer(methodResult.result)) { res.end(methodResult.result); } else { if (methodResult.result === 0) { methodResult.result = JSON.stringify(methodResult.result); } if (typeof methodResult.result === 'string') { res.end(methodResult.result, 'utf-8'); } else { res.set('Content-Type', 'application/json'); const str = JSON.stringify((methodResult.result) ? methodResult.result : methodResult); res.setHeader('ETag', etag(str)); res.send(str); } } } } exports.RestResponse = RestResponse; class RestParser { deserialize(item) { if (item !== undefined && item !== null) { if (item.type && item.type.deserialize) { try { return item.type.deserialize(item.value); } catch (error) { log_1.logger.warn(this, 'error deserializing argument', item); } } else if (item.type && item.type.prototype && item.type.prototype.constructor) { return new item.type(item.value); } else if (typeof (item.value) === 'string' && item.type === 'object') { try { return JSON.parse(item.value); } catch (error) { log_1.logger.warn(this, 'error parsing argument', item); } } else if (item.value === undefined && typeof (item) === 'object') { return item; } } else { return item; } return item.value; } parse(args, paramsMap, functionArgs) { let isRest = false; let securityContext; if (args[0] && args[0].res && args[1] && args[1].req) { securityContext = args[0].security_context; functionArgs = functionArgs || []; paramsMap.forEach((item) => { if (item.name && item.from) { if (args[0][item.from]) { item.value = args[0][item.from][item.name] || item.defaultValue || null; } item.value = this.deserialize(item); } else if (item.from) { switch (item.from) { case 'response': item.value = args[1]; break; case 'request': item.value = args[0]; break; default: item.value = this.deserialize(args[0][item.from]); break; } } else { item.value = args[0]; } if (item.from === 'security_context') { item.value = args[0].security_context; } functionArgs.push(item.value); }); isRest = true; } else { functionArgs = args; isRest = false; } return new ParserResponse(functionArgs, isRest, securityContext); } } exports.RestParser = RestParser; let ParserResponse = class ParserResponse { constructor(args, isRest, securityContext) { this.args = args; this.isRest = isRest; this.securityContext = securityContext; } }; ParserResponse = tslib_1.__decorate([ log_1.LogClass(log_1.logger), tslib_1.__metadata("design:paramtypes", [Object, Boolean, Object]) ], ParserResponse); exports.ParserResponse = ParserResponse; //# sourceMappingURL=rest.js.map