UNPKG

@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
"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;