1
1
// @ts -check
2
2
const { Buffer } = require ( 'buffer' )
3
+ const { readFile } = require ( 'fs' ) . promises
4
+ const { join } = require ( 'path' )
3
5
4
6
const { NETLIFYDEVERR } = require ( '../../utils' )
5
7
@@ -15,15 +17,15 @@ const addHeaders = (headers, response) => {
15
17
} )
16
18
}
17
19
18
- const handleSynchronousFunction = function ( err , result , response ) {
20
+ const handleSynchronousFunction = function ( err , result , request , response ) {
19
21
if ( err ) {
20
- return handleErr ( err , response )
22
+ return handleErr ( err , request , response )
21
23
}
22
24
23
25
const { error } = validateLambdaResponse ( result )
24
26
if ( error ) {
25
27
console . log ( `${ NETLIFYDEVERR } ${ error } ` )
26
- return handleErr ( error , response )
28
+ return handleErr ( error , request , response )
27
29
}
28
30
29
31
response . statusCode = result . statusCode
@@ -36,14 +38,36 @@ const handleSynchronousFunction = function (err, result, response) {
36
38
response . end ( )
37
39
}
38
40
39
- const formatLambdaLocalError = ( err ) => `${ err . errorType } : ${ err . errorMessage } \n ${ err . stackTrace . join ( '\n ' ) } `
41
+ const formatLambdaLocalError = ( err , acceptsHtml ) =>
42
+ acceptsHtml
43
+ ? JSON . stringify ( {
44
+ errorType : err . errorType ,
45
+ errorMessage : err . errorMessage ,
46
+ trace : err . stackTrace ,
47
+ } )
48
+ : `${ err . errorType } : ${ err . errorMessage } \n ${ err . stackTrace . join ( '\n ' ) } `
40
49
41
- const handleErr = function ( err , response ) {
50
+ let errorTemplateFile
51
+
52
+ const renderErrorTemplate = async ( errString ) => {
53
+ const regexPattern = / < ! - - @ E R R O R - D E T A I L S - - > / g
54
+ errorTemplateFile = errorTemplateFile || ( await readFile ( join ( __dirname , './templates/function-error.html' ) , 'utf-8' ) )
55
+
56
+ return errorTemplateFile . replace ( regexPattern , errString )
57
+ }
58
+
59
+ const processRenderedResponse = async ( err , request ) => {
60
+ const acceptsHtml = request . headers && request . headers . accept && request . headers . accept . includes ( 'text/html' )
61
+ const errorString = typeof err === 'string' ? err : formatLambdaLocalError ( err , acceptsHtml )
62
+
63
+ return acceptsHtml ? await renderErrorTemplate ( errorString ) : errorString
64
+ }
65
+
66
+ const handleErr = async ( err , request , response ) => {
42
67
detectAwsSdkError ( { err } )
43
68
44
69
response . statusCode = 500
45
- const errorString = typeof err === 'string' ? err : formatLambdaLocalError ( err )
46
- response . end ( errorString )
70
+ response . end ( await processRenderedResponse ( err , request ) )
47
71
}
48
72
49
73
const validateLambdaResponse = ( lambdaResponse ) => {
0 commit comments