1 | import { normalizeHttpResponse } from '@middy/util'
|
2 |
|
3 | const defaults = {
|
4 | serializers: [],
|
5 | defaultContentType: undefined
|
6 | }
|
7 |
|
8 | const httpResponseSerializerMiddleware = (opts = {}) => {
|
9 | const { serializers, defaultContentType } = { ...defaults, ...opts }
|
10 | const httpResponseSerializerMiddlewareAfter = async (request) => {
|
11 | normalizeHttpResponse(request)
|
12 |
|
13 |
|
14 | if (
|
15 | request.response.headers['Content-Type'] ??
|
16 | request.response.headers['content-type']
|
17 | ) {
|
18 | return
|
19 | }
|
20 |
|
21 |
|
22 | let types
|
23 |
|
24 |
|
25 | if (request.event.requiredContentType) {
|
26 | types = [request.event.requiredContentType]
|
27 | } else {
|
28 | types = [
|
29 | ...(request.context.preferredMediaTypes ?? []),
|
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 |
|
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 |
|
67 | export default httpResponseSerializerMiddleware
|