/** * THIS IS PROD CODE, BE CAREFUL WHAT YOU ADD TO THIS FILE */ import { getRouteParams } from './getRouteParams' import { normalizeResponse } from './normalizeResponse' import { pruneObject } from './pruneObject' import * as logger from './log' import { AWS, Event, Context, Lambda, PrestaError } from './types' function createHTMLErrorPage({ statusCode }: { statusCode: number }) { return ` HTTP ${statusCode}

HTTP ${statusCode}

` } export function wrapHandler( file: Lambda ): (event: AWS['HandlerEvent'], context: Context) => Promise { return async (event: AWS['HandlerEvent'], context: Context) => { event = { ...event, routeParameters: getRouteParams(event.path, file.route), } as Event let response try { response = normalizeResponse(await file.handler(event as Event, context)) } catch (e) { logger.error({ label: 'serve', message: `lambda`, error: e as Error, }) const err = e as PrestaError const accept = event.headers['Accept'] const acceptsJson = accept && accept.includes('json') const statusCode = err.status || err.statusCode || 500 response = normalizeResponse({ statusCode, html: acceptsJson ? undefined : createHTMLErrorPage({ statusCode }), json: acceptsJson ? { errors: [ pruneObject({ status: statusCode, source: err.source, title: err.title, details: err.details || err.message, }), ], } : undefined, }) } return response } }