UNPKG

1.8 kBPlain TextView Raw
1/**
2 * THIS IS PROD CODE, BE CAREFUL WHAT YOU ADD TO THIS FILE
3 */
4
5import { getRouteParams } from './getRouteParams'
6import { normalizeResponse } from './normalizeResponse'
7import { pruneObject } from './pruneObject'
8import * as logger from './log'
9import { AWS, Event, Context, Lambda, PrestaError } from './types'
10
11function 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
21export 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}