@methodus/server
Version:
Server components for @methodus workflow
169 lines • 5.99 kB
JavaScript
;
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