UNPKG

1.85 kBJavaScriptView Raw
1import { normalizeHttpResponse } from '@middy/util'
2
3const defaults = {
4 serializers: [],
5 defaultContentType: undefined
6}
7
8const httpResponseSerializerMiddleware = (opts = {}) => {
9 const { serializers, defaultContentType } = { ...defaults, ...opts }
10 const httpResponseSerializerMiddlewareAfter = async (request) => {
11 normalizeHttpResponse(request)
12
13 // skip serialization when Content-Type or content-type is already set
14 if (
15 request.response.headers['Content-Type'] ??
16 request.response.headers['content-type']
17 ) {
18 return
19 }
20
21 // find accept value(s)
22 let types
23
24 // TODO deprecate `requiredContentType` in v6
25 if (request.event.requiredContentType) {
26 types = [request.event.requiredContentType]
27 } else {
28 types = [
29 ...(request.context.preferredMediaTypes ?? []), // from @middy/http-content-negotiation
30 defaultContentType
31 ]
32 }
33
34 for (const type of types) {
35 let breakTypes
36 for (const s of serializers) {
37 if (!s.regex.test(type)) {
38 continue
39 }
40
41 request.response.headers['Content-Type'] = type
42 const result = s.serializer(request.response)
43 if (typeof result === 'object' && 'body' in result) {
44 request.response = result
45 } else {
46 // otherwise only replace the body attribute
47 request.response.body = result
48 }
49
50 breakTypes = true
51 break
52 }
53 if (breakTypes) break
54 }
55 }
56
57 const httpResponseSerializerMiddlewareOnError = async (request) => {
58 if (request.response === undefined) return
59 await httpResponseSerializerMiddlewareAfter(request)
60 }
61 return {
62 after: httpResponseSerializerMiddlewareAfter,
63 onError: httpResponseSerializerMiddlewareOnError
64 }
65}
66
67export default httpResponseSerializerMiddleware