1 |
|
2 |
|
3 |
|
4 |
|
5 | import { getRouteParams } from './getRouteParams'
|
6 | import { normalizeResponse } from './normalizeResponse'
|
7 | import { pruneObject } from './pruneObject'
|
8 | import * as logger from './log'
|
9 | import { AWS, Event, Context, Lambda, PrestaError } from './types'
|
10 |
|
11 | function createHTMLErrorPage({ statusCode }: { statusCode: number }) {
|
12 | return `
|
13 | <!DOCTYPE html>
|
14 | <html>
|
15 | <head><title>HTTP ${statusCode}</title></head>
|
16 | <body><h1>HTTP ${statusCode}</h1></body>
|
17 | </html>
|
18 | `
|
19 | }
|
20 |
|
21 | export function wrapHandler(
|
22 | file: Lambda
|
23 | ): (event: AWS['HandlerEvent'], context: Context) => Promise<AWS['HandlerResponse']> {
|
24 | return async (event: AWS['HandlerEvent'], context: Context) => {
|
25 | event = {
|
26 | ...event,
|
27 | routeParameters: getRouteParams(event.path, file.route),
|
28 | } as Event
|
29 |
|
30 | let response
|
31 |
|
32 | try {
|
33 | response = normalizeResponse(await file.handler(event as Event, context))
|
34 | } catch (e) {
|
35 | logger.error({
|
36 | label: 'serve',
|
37 | message: `lambda`,
|
38 | error: e as Error,
|
39 | })
|
40 |
|
41 | const err = e as PrestaError
|
42 | const accept = event.headers['Accept']
|
43 | const acceptsJson = accept && accept.includes('json')
|
44 | const statusCode = err.status || err.statusCode || 500
|
45 |
|
46 | response = normalizeResponse({
|
47 | statusCode,
|
48 | html: acceptsJson ? undefined : createHTMLErrorPage({ statusCode }),
|
49 | json: acceptsJson
|
50 | ? {
|
51 | errors: [
|
52 | pruneObject({
|
53 | status: statusCode,
|
54 | source: err.source,
|
55 | title: err.title,
|
56 | details: err.details || err.message,
|
57 | }),
|
58 | ],
|
59 | }
|
60 | : undefined,
|
61 | })
|
62 | }
|
63 |
|
64 | return response
|
65 | }
|
66 | }
|