winterspec
Version:
Write Winter-CG compatible routes with filesystem routing and tons of features
39 lines (38 loc) • 1.32 kB
JavaScript
import kleur from "kleur";
/**
*
*/
export const createWithDefaultExceptionHandling = ({ coloredLogs = true, logWhen = (status) => status >= 500, includeStackTraceInResponse = true, } = {}) => async (req, ctx, next) => {
try {
return await next(req, ctx);
}
catch (e) {
let response;
if ("_isHttpException" in e) {
response = Response.json({
message: e.message,
stack: includeStackTraceInResponse ? e.stack : undefined,
}, {
status: e.status,
});
}
else {
response = Response.json({
message: "Internal server error",
stack: includeStackTraceInResponse ? e.stack : undefined,
}, {
status: 500,
});
}
if (logWhen(response.status, e)) {
const logger = ctx.logger ?? console;
kleur.enabled = coloredLogs;
const { pathname } = new URL(req.url);
const routeLog = response.status >= 500
? kleur.bgRed(`${pathname} threw an error`)
: kleur.bgYellow(`${pathname} threw an error`);
logger.error(`${routeLog}: ${e instanceof Error ? e.stack : e.toString()}`);
}
return response;
}
};