1 | import { normalizeHttpResponse } from '@middy/util';
|
2 | import Accept from '@hapi/accept';
|
3 | const defaults = {
|
4 | serializers: [],
|
5 | defaultContentType: undefined
|
6 | };
|
7 | const httpResponseSerializerMiddleware = (opts = {})=>{
|
8 | const { serializers , defaultContentType } = {
|
9 | ...defaults,
|
10 | ...opts
|
11 | };
|
12 | const httpResponseSerializerMiddlewareAfter = async (request)=>{
|
13 | normalizeHttpResponse(request);
|
14 | if (request.response.headers['Content-Type'] ?? request.response.headers['content-type']) {
|
15 | return;
|
16 | }
|
17 | let types;
|
18 | if (request.event.requiredContentType) {
|
19 | types = [
|
20 | request.event.requiredContentType
|
21 | ];
|
22 | } else {
|
23 | const acceptHeader = request.event.headers.Accept ?? request.event.headers.accept;
|
24 | types = [
|
25 | ...(acceptHeader && Accept.mediaTypes(acceptHeader)) ?? [],
|
26 | request.event.preferredContentType,
|
27 | defaultContentType
|
28 | ];
|
29 | }
|
30 | for (const type of types){
|
31 | let breakTypes;
|
32 | for (const s of serializers){
|
33 | if (!s.regex.test(type)) {
|
34 | continue;
|
35 | }
|
36 | request.response.headers['Content-Type'] = type;
|
37 | const result = s.serializer(request.response);
|
38 | if (typeof result === 'object' && 'body' in result) {
|
39 | request.response = result;
|
40 | } else {
|
41 | request.response.body = result;
|
42 | }
|
43 | breakTypes = true;
|
44 | break;
|
45 | }
|
46 | if (breakTypes) break;
|
47 | }
|
48 | };
|
49 | const httpResponseSerializerMiddlewareOnError = async (request)=>{
|
50 | if (request.response === undefined) return;
|
51 | return httpResponseSerializerMiddlewareAfter(request);
|
52 | };
|
53 | return {
|
54 | after: httpResponseSerializerMiddlewareAfter,
|
55 | onError: httpResponseSerializerMiddlewareOnError
|
56 | };
|
57 | };
|
58 | export default httpResponseSerializerMiddleware;
|
59 |
|
60 |
|
61 |
|
\ | No newline at end of file |