@middy/http-response-serializer
Version:
The Http Serializer middleware lets you define serialization mechanisms based on the current content negotiation.
75 lines (55 loc) • 2.61 kB
JavaScript
"use strict";
const {
normalizeHttpResponse
} = require('@middy/util');
const Accept = require('@hapi/accept');
const defaults = {
serializers: [],
default: undefined
};
const httpResponseSerializerMiddleware = (opts = {}) => {
const options = { ...defaults,
...opts
};
const httpResponseSerializerMiddlewareAfter = async request => {
var _request$event;
if (request.response === undefined) return;
request.response = normalizeHttpResponse(request.response); // skip serialization when content-type is already set
if (request.response.headers['Content-Type'] || request.response.headers['content-type']) {
return;
} // find accept value(s)
let types;
if ((_request$event = request.event) !== null && _request$event !== void 0 && _request$event.requiredContentType) {
types = [request.event.requiredContentType];
} else {
var _request$event$header, _request$event2, _request$event2$heade, _request$event3, _request$event3$heade, _ref;
const acceptHeader = (_request$event$header = (_request$event2 = request.event) === null || _request$event2 === void 0 ? void 0 : (_request$event2$heade = _request$event2.headers) === null || _request$event2$heade === void 0 ? void 0 : _request$event2$heade.accept) !== null && _request$event$header !== void 0 ? _request$event$header : (_request$event3 = request.event) === null || _request$event3 === void 0 ? void 0 : (_request$event3$heade = _request$event3.headers) === null || _request$event3$heade === void 0 ? void 0 : _request$event3$heade.Accept;
types = [...((_ref = acceptHeader && Accept.mediaTypes(acceptHeader)) !== null && _ref !== void 0 ? _ref : []), request.event.preferredContentType, options.default];
}
for (const type of types) {
let breakTypes;
for (const s of options.serializers) {
if (!s.regex.test(type)) {
continue;
}
request.response.headers['Content-Type'] = type;
const result = s.serializer(request.response);
if (typeof result === 'object' && 'body' in result) {
request.response = result;
} else {
// otherwise only replace the body attribute
request.response.body = result;
}
breakTypes = true;
break;
}
if (breakTypes) break;
}
};
const httpResponseSerializerMiddlewareOnError = httpResponseSerializerMiddlewareAfter;
return {
after: httpResponseSerializerMiddlewareAfter,
onError: httpResponseSerializerMiddlewareOnError
};
};
module.exports = httpResponseSerializerMiddleware;