11import errorTemplate from './html/error-template.html'
22import { HELPER } from './helper-functions.js'
33
4- // Default error values, will be set in c_redirect using env
5- let errorCode = "500" ;
6- let errorType = "" ;
7- let errorMessage = "" ;
8- let errorGif = "" ;
9- let enableReportError = false ;
10- let reportErrorButtonText = 'Signaler cette erreur' ;
11- let reportErrorModalHeaderText = "🆘 Signalez-moi l'erreur"
12- let reportErrorLabelPlaceholder = "Nom / Pseudo"
13- let reportErrorModalNamePlaceholder = "Ex : Jane Doe"
14- let reportErrorCancelButtonText = "Annuler"
15- let reportErrorSubmitButtonText = "Signaler"
16- let reportErrorSuccessMessage = "Merci pour votre signalement ! 🙏"
17- let reportErrorFailureMessage = "Une erreur est survenue lors de l'envoi du signalement. 😞"
18-
19- const REDIRECT = {
20- /**
21- * Generates HTML content with appropriate Canva URL
22- * @returns {string } The HTML with injected URL
23- */
24- generateErrorPage : ( ) => {
25- return errorTemplate
26- . replace ( 'ERROR_CODE' , errorCode )
27- . replace ( 'ERROR_TYPE' , errorType )
28- . replace ( 'ERROR_MESSAGE' , errorMessage )
29- . replace ( 'ERROR_GIF' , errorGif )
30- . replace ( 'ENABLE_REPORT_ERROR' , enableReportError )
31- . replace ( 'REPORT_ERROR_BUTTON_TEXT' , reportErrorButtonText )
32- . replace ( 'REPORT_ERROR_MODAL_HEADER_TEXT' , reportErrorModalHeaderText )
33- . replace ( 'REPORT_ERROR_LABEL_PLACEHOLDER' , reportErrorLabelPlaceholder )
34- . replace ( 'REPORT_ERROR_MODAL_NAME_PLACEHOLDER' , reportErrorModalNamePlaceholder )
35- . replace ( 'REPORT_ERROR_CANCEL_BUTTON_TEXT' , reportErrorCancelButtonText )
36- . replace ( 'REPORT_ERROR_SUBMIT_BUTTON_TEXT' , reportErrorSubmitButtonText )
37- . replace ( 'REPORT_ERROR_SUCCESS_MESSAGE' , reportErrorSuccessMessage )
38- . replace ( 'REPORT_ERROR_FAILURE_MESSAGE' , reportErrorFailureMessage )
39- . replace ( 'REPORT_ERROR_CODE' , errorCode ) ;
40- }
41- } ;
42-
4+ /**
5+ * Generates the error page HTML with the given details
6+ * @param {Object } details - Error details to inject into the template
7+ * @returns {string } The HTML with injected values
8+ */
9+ function generateErrorPage ( details ) {
10+ return errorTemplate
11+ . replace ( 'ERROR_CODE' , details . errorCode )
12+ . replace ( 'ERROR_TYPE' , details . errorType )
13+ . replace ( 'ERROR_MESSAGE' , details . errorMessage )
14+ . replace ( 'ERROR_GIF' , details . errorGif )
15+ . replace ( 'ENABLE_REPORT_ERROR' , details . enableReportError )
16+ . replace ( 'REPORT_ERROR_BUTTON_TEXT' , details . reportErrorButtonText )
17+ . replace ( 'REPORT_ERROR_MODAL_HEADER_TEXT' , details . reportErrorModalHeaderText )
18+ . replace ( 'REPORT_ERROR_LABEL_PLACEHOLDER' , details . reportErrorLabelPlaceholder )
19+ . replace ( 'REPORT_ERROR_MODAL_NAME_PLACEHOLDER' , details . reportErrorModalNamePlaceholder )
20+ . replace ( 'REPORT_ERROR_CANCEL_BUTTON_TEXT' , details . reportErrorCancelButtonText )
21+ . replace ( 'REPORT_ERROR_SUBMIT_BUTTON_TEXT' , details . reportErrorSubmitButtonText )
22+ . replace ( 'REPORT_ERROR_SUCCESS_MESSAGE' , details . reportErrorSuccessMessage )
23+ . replace ( 'REPORT_ERROR_FAILURE_MESSAGE' , details . reportErrorFailureMessage )
24+ . replace ( 'REPORT_ERROR_CODE' , details . errorCode ) ;
25+ }
4326
4427/**
4528 * Creates an HTTP response with specified content
4629 * @param {string } content - HTML content for the response
30+ * @param {string } statusCode - HTTP status code
4731 * @returns {Response } The formatted response
4832 */
49- function makeResponse ( content ) {
33+ function makeResponse ( content , statusCode ) {
5034 return new Response ( content , {
51- status : errorCode ,
35+ status : parseInt ( statusCode , 10 ) ,
5236 headers : {
5337 'Content-Type' : 'text/html' ,
5438 'X-Worker-Handled' : 'true'
5539 }
5640 } ) ;
5741}
5842
59- function getErrorDetailsFromCfCode ( cfCode , env ) {
60- if ( cfCode == "MAINTENANCE" ) {
61- errorCode = "503" ;
62- errorType = env . TEXT_MAINTENANCE_TYPE ;
63- errorMessage = env . TEXT_MAINTENANCE_MESSAGE ;
64- errorGif = env . TEXT_MAINTENANCE_GIF ;
65- return ;
43+ /**
44+ * Builds error details object from an error code and env config
45+ * @param {number|string } cfCode - The error code or "MAINTENANCE"
46+ * @param {Object } env - Environment variables
47+ * @returns {Object } Error details for the template
48+ */
49+ function getErrorDetails ( cfCode , env ) {
50+ const details = {
51+ errorCode : "500" ,
52+ errorType : env . TEXT_GENERIC_ERROR_TYPE ,
53+ errorMessage : env . TEXT_GENERIC_ERROR_MESSAGE ,
54+ errorGif : env . TEXT_GENERIC_ERROR_GIF ,
55+ enableReportError : false ,
56+ reportErrorButtonText : '' ,
57+ reportErrorModalHeaderText : '' ,
58+ reportErrorLabelPlaceholder : '' ,
59+ reportErrorModalNamePlaceholder : '' ,
60+ reportErrorCancelButtonText : '' ,
61+ reportErrorSubmitButtonText : '' ,
62+ reportErrorSuccessMessage : '' ,
63+ reportErrorFailureMessage : ''
64+ } ;
65+
66+ if ( cfCode === "MAINTENANCE" ) {
67+ details . errorCode = "503" ;
68+ details . errorType = env . TEXT_MAINTENANCE_TYPE ;
69+ details . errorMessage = env . TEXT_MAINTENANCE_MESSAGE ;
70+ details . errorGif = env . TEXT_MAINTENANCE_GIF ;
71+ return details ;
6672 }
67- errorCode = cfCode ? cfCode . toString ( ) : "500" ;
68- console . log ( `Handling error with code: ${ errorCode } ` ) ;
69- enableReportError = env . ENABLE_REPORT_ERROR ;
70- if ( enableReportError ) {
71- reportErrorButtonText = env . REPORT_ERROR_BUTTON_TEXT
72- reportErrorModalHeaderText = env . REPORT_ERROR_MODAL_HEADER_TEXT
73- reportErrorLabelPlaceholder = env . REPORT_ERROR_LABEL_PLACEHOLDER
74- reportErrorModalNamePlaceholder = env . REPORT_ERROR_MODAL_NAME_PLACEHOLDER
75- reportErrorCancelButtonText = env . REPORT_ERROR_CANCEL_BUTTON_TEXT
76- reportErrorSubmitButtonText = env . REPORT_ERROR_SUBMIT_BUTTON_TEXT
77- reportErrorSuccessMessage = env . REPORT_ERROR_SUCCESS_MESSAGE
78- reportErrorFailureMessage = env . REPORT_ERROR_FAILURE_MESSAGE
73+
74+ details . errorCode = cfCode ? cfCode . toString ( ) : "500" ;
75+ console . log ( `Handling error with code: ${ details . errorCode } ` ) ;
76+
77+ const enableReport = env . ENABLE_REPORT_ERROR === true || env . ENABLE_REPORT_ERROR === 'true' ;
78+ details . enableReportError = enableReport ;
79+ if ( enableReport ) {
80+ details . reportErrorButtonText = env . REPORT_ERROR_BUTTON_TEXT ;
81+ details . reportErrorModalHeaderText = env . REPORT_ERROR_MODAL_HEADER_TEXT ;
82+ details . reportErrorLabelPlaceholder = env . REPORT_ERROR_LABEL_PLACEHOLDER ;
83+ details . reportErrorModalNamePlaceholder = env . REPORT_ERROR_MODAL_NAME_PLACEHOLDER ;
84+ details . reportErrorCancelButtonText = env . REPORT_ERROR_CANCEL_BUTTON_TEXT ;
85+ details . reportErrorSubmitButtonText = env . REPORT_ERROR_SUBMIT_BUTTON_TEXT ;
86+ details . reportErrorSuccessMessage = env . REPORT_ERROR_SUCCESS_MESSAGE ;
87+ details . reportErrorFailureMessage = env . REPORT_ERROR_FAILURE_MESSAGE ;
7988 }
8089
81- if ( env . TEXT_CONTAINER_ERROR_CODE . includes ( cfCode ) ) {
82- errorType = env . TEXT_CONTAINER_ERROR_TYPE ;
83- errorMessage = env . TEXT_CONTAINER_ERROR_MESSAGE ;
84- errorGif = env . TEXT_CONTAINER_ERROR_GIF ;
85- } else if ( env . TEXT_BOX_ERROR_CODE . includes ( cfCode ) ) {
86- errorType = env . TEXT_BOX_ERROR_TYPE ;
87- errorMessage = env . TEXT_BOX_ERROR_MESSAGE ;
88- errorGif = env . TEXT_BOX_ERROR_GIF ;
89- } else if ( env . TEXT_TUNNEL_ERROR_CODE . includes ( cfCode ) ) {
90- errorType = env . TEXT_TUNNEL_ERROR_TYPE ;
91- errorMessage = env . TEXT_TUNNEL_ERROR_MESSAGE ;
92- errorGif = env . TEXT_TUNNEL_ERROR_GIF ;
90+ const containerCodes = env . TEXT_CONTAINER_ERROR_CODE || [ ] ;
91+ const boxCodes = env . TEXT_BOX_ERROR_CODE || [ ] ;
92+ const tunnelCodes = env . TEXT_TUNNEL_ERROR_CODE || [ ] ;
93+
94+ if ( containerCodes . includes ( cfCode ) ) {
95+ details . errorType = env . TEXT_CONTAINER_ERROR_TYPE ;
96+ details . errorMessage = env . TEXT_CONTAINER_ERROR_MESSAGE ;
97+ details . errorGif = env . TEXT_CONTAINER_ERROR_GIF ;
98+ } else if ( boxCodes . includes ( cfCode ) ) {
99+ details . errorType = env . TEXT_BOX_ERROR_TYPE ;
100+ details . errorMessage = env . TEXT_BOX_ERROR_MESSAGE ;
101+ details . errorGif = env . TEXT_BOX_ERROR_GIF ;
102+ } else if ( tunnelCodes . includes ( cfCode ) ) {
103+ details . errorType = env . TEXT_TUNNEL_ERROR_TYPE ;
104+ details . errorMessage = env . TEXT_TUNNEL_ERROR_MESSAGE ;
105+ details . errorGif = env . TEXT_TUNNEL_ERROR_GIF ;
93106 }
107+
108+ return details ;
94109}
95110
96111/**
@@ -102,37 +117,33 @@ function getErrorDetailsFromCfCode(cfCode, env) {
102117 * @param {Object } env - Environment variables
103118 * @returns {Promise<Response|null> } Appropriate error response or null
104119 */
105- export async function c_redirect ( request , response , thrownError = null , isMaintenance = false , env ) {
106- // Set default error details using env inside the function
107- errorType = env . TEXT_GENERIC_ERROR_TYPE ;
108- errorMessage = env . TEXT_GENERIC_ERROR_MESSAGE ;
109- errorGif = env . TEXT_GENERIC_ERROR_GIF ;
110-
120+ export async function c_redirect ( request , response , thrownError , isMaintenance , env ) {
111121 // Maintenance mode
112122 if ( isMaintenance ) {
113- getErrorDetailsFromCfCode ( "MAINTENANCE" , env ) ;
114- return makeResponse ( REDIRECT . generateErrorPage ( ) ) ;
123+ const details = getErrorDetails ( "MAINTENANCE" , env ) ;
124+ return makeResponse ( generateErrorPage ( details ) , details . errorCode ) ;
115125 }
116126
127+ // Check if origin is reachable (only if ORIGIN_PING_URL is configured)
117128 const originUp = await HELPER . isOriginReachable ( undefined , env ) . catch ( ( ) => null ) ;
118- //const npmUp = await HELPER.isNpmUp(undefined, env).catch(() => false);
119129
120- // Internet down
121- if ( ! originUp ) {
122- getErrorDetailsFromCfCode ( 504 , env ) ;
123- return makeResponse ( REDIRECT . generateErrorPage ( ) ) ;
130+ // Origin confirmed down (originUp === false means the check ran and failed)
131+ // originUp === null means ORIGIN_PING_URL is not configured, so we skip this check
132+ if ( originUp === false ) {
133+ const details = getErrorDetails ( 504 , env ) ;
134+ return makeResponse ( generateErrorPage ( details ) , details . errorCode ) ;
124135 }
125136
126- /*
127- // NPM down so all services down
128- if(!npmUp) {
129- // it's the default message so no need to change anything
130- } */
137+ // Handle server errors (5xx) from the response
138+ if ( response && response . status >= 500 ) {
139+ const details = getErrorDetails ( response . status , env ) ;
140+ return makeResponse ( generateErrorPage ( details ) , details . errorCode ) ;
141+ }
131142
132- // Handle server errors (5xx )
133- if ( response && response . status >= 500 ) {
134- getErrorDetailsFromCfCode ( response . status , env ) ;
135- return makeResponse ( REDIRECT . generateErrorPage ( ) ) ;
143+ // Handle thrown errors (fetch failed entirely, e.g. container down / connection refused )
144+ if ( thrownError && ! response ) {
145+ const details = getErrorDetails ( 502 , env ) ;
146+ return makeResponse ( generateErrorPage ( details ) , details . errorCode ) ;
136147 }
137148
138149 return null ;
0 commit comments