From bca897639d5e1f77e6675abe4389ffd837dc620e Mon Sep 17 00:00:00 2001 From: MickaelK Date: Fri, 18 Sep 2026 01:42:33 +1000 Subject: [PATCH] feature (error): surface traceID to error screen --- public/assets/lib/ajax.js | 20 ++++++++++---------- public/assets/lib/error.js | 3 ++- public/assets/pages/ctrl_error.js | 1 + 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/public/assets/lib/ajax.js b/public/assets/lib/ajax.js index 48983a03..af16cc2d 100644 --- a/public/assets/lib/ajax.js +++ b/public/assets/lib/ajax.js @@ -29,7 +29,7 @@ export default function(opts) { const result = res.xhr.responseText; res.responseJSON = JSON.parse(result); if (res.responseJSON.status !== "ok") { - throw new AjaxError("Oups something went wrong", result); + throw new AjaxError("Oups something went wrong", result, "STATUS_NOT_OK", res.responseHeaders["x-request-id"]); } } return res; @@ -100,44 +100,44 @@ function processError(xhr, err) { case 500: return new AjaxError( message || "Oups something went wrong with our servers", - err, "INTERNAL_SERVER_ERROR" + err, "INTERNAL_SERVER_ERROR", err.request.headers["x-request-id"], ); case 401: return new AjaxError( message || "Authentication error", - err, "Unauthorized" + err, "Unauthorized", err.request.headers["x-request-id"], ); case 403: return new AjaxError( message || "You can't do that", - err, "FORBIDDEN" + err, "FORBIDDEN", err.request.headers["x-request-id"], ); case 413: return new AjaxError( message || "Payload too large", - err, "PAYLOAD_TOO_LARGE" + err, "PAYLOAD_TOO_LARGE", err.request.headers["x-request-id"], ); case 502: return new AjaxError( message || "The destination is acting weird", - err, "BAD_GATEWAY" + err, "BAD_GATEWAY", err.request.headers["x-request-id"], ); case 409: return new AjaxError( message || "Oups you just ran into a conflict", - err, "CONFLICT" + err, "CONFLICT", err.request.headers["x-request-id"], ); case 0: switch (responseText) { case "": return new AjaxError( "Service unavailable, if the problem persist, contact your administrator", - err, "INTERNAL_SERVER_ERROR" + err, "INTERNAL_SERVER_ERROR", err.request.headers["x-request-id"], ); default: - return new AjaxError(responseText, err, "INTERNAL_SERVER_ERROR"); + return new AjaxError(responseText, err, "INTERNAL_SERVER_ERROR", err.request.headers["x-request-id"]); } default: - return new AjaxError(message || "Oups something went wrong", err); + return new AjaxError(message || "Oups something went wrong", err, "HTTP_ERROR" , err.request.headers["x-request-id"]); } } diff --git a/public/assets/lib/error.js b/public/assets/lib/error.js index 16340701..104dbd2a 100644 --- a/public/assets/lib/error.js +++ b/public/assets/lib/error.js @@ -1,9 +1,10 @@ export class AjaxError extends Error { - constructor(message, err = null, code = "UNDEFINED_CODE") { + constructor(message, err = null, code = "UNDEFINED_CODE", traceID = "N/A") { super(message); this.name = this.constructor.name; this.errCode = code; this.errOrig = err; + this.traceID = traceID; } code() { diff --git a/public/assets/pages/ctrl_error.js b/public/assets/pages/ctrl_error.js index fa60bb7c..f5051b67 100644 --- a/public/assets/pages/ctrl_error.js +++ b/public/assets/pages/ctrl_error.js @@ -76,6 +76,7 @@ function processError(err) { type: ${err.type()} code: ${err.code()} message: ${err.message} +traceID: ${err.traceID} trace: ${err.stack}`; } else if (err instanceof ApplicationError) { msg = t(err.message);