UNPKG

@middy/http-response-serializer

Version:

The Http Serializer middleware lets you define serialization mechanisms based on the current content negotiation.

61 lines (51 loc) 1.67 kB
import { normalizeHttpResponse } from '@middy/util' const defaults = { serializers: [], defaultContentType: undefined } const httpResponseSerializerMiddleware = (opts = {}) => { const { serializers, defaultContentType } = { ...defaults, ...opts } const httpResponseSerializerMiddlewareAfter = async (request) => { normalizeHttpResponse(request) // skip serialization when Content-Type or content-type is already set if ( request.response.headers['Content-Type'] ?? request.response.headers['content-type'] ) { return } // find accept value(s) const types = [ ...(request.context.preferredMediaTypes ?? []), // from @middy/http-content-negotiation defaultContentType ] for (const type of types) { let breakTypes for (const s of 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 = async (request) => { if (request.response === undefined) return await httpResponseSerializerMiddlewareAfter(request) } return { after: httpResponseSerializerMiddlewareAfter, onError: httpResponseSerializerMiddlewareOnError } } export default httpResponseSerializerMiddleware