monitor/core/lib/fatalError.ts
2025-04-16 22:30:27 +07:00

91 lines
3.2 KiB
TypeScript

import chalk from "chalk";
import consoleFactory from "./console";
import quitProcess from "./quitProcess";
const console = consoleFactory();
type ErrorLineSkipType = null | undefined | false;
type ErrorLineType = string | [desc: string, value: any] | ErrorLineSkipType;
type ErrorMsgType = ErrorLineType | ErrorLineType[];
const padStartEnd = (str: string): string => {
str = ` ${str} `;
const padStart = Math.ceil((console.DIVIDER_SIZE + str.length) / 2);
return str.padStart(padStart, '-').padEnd(console.DIVIDER_SIZE, '-');
}
const printSingleLine = (line: ErrorLineType): void => {
if (Array.isArray(line)) {
if (line.length === 2 && typeof line[0] === 'string') {
let value = typeof line[1] === 'string' ? line[1] : String(line[1]);
console.error(`${line[0]}: ${chalk.dim(value)}`);
} else {
console.error(JSON.stringify(line));
}
} else if (typeof line === 'string') {
console.error(line);
}
}
function fatalError(code: number, msg: ErrorMsgType, err?: any): never {
console.error(console.DIVIDER);
console.error(chalk.inverse(
padStartEnd(`FATAL ERROR: E${code}`)
));
console.error(console.DIVIDER);
if (Array.isArray(msg)) {
for (const line of msg) {
printSingleLine(line);
}
} else {
printSingleLine(msg);
}
if (err) {
console.error('-'.repeat(console.DIVIDER_SIZE));
console.dir(err, { multilineError: true });
}
console.error(console.DIVIDER);
console.error(chalk.inverse(
padStartEnd('For support: https://discord.gg/txAdmin')
));
console.error(console.DIVIDER);
quitProcess(code);
}
/*
NOTE: Going above 1000 to avoid collision with default nodejs error codes
ref: https://nodejs.org/docs/latest-v22.x/api/process.html#exit-codes
1000 - global data
2000 - boot
2001 - txdata
2002 - setup profile throw
2003 - boot throw
2010 - expired
2011 - expired cron
2022 - txCore placeholder getter error
2023 - txCore placeholder setter error
5100 - config store
5300 - admin store
5400 - fxrunner
5600 - database
5700 - stats txruntime
5800 - webserver
*/
fatalError.GlobalData = (code: number, msg: ErrorMsgType, err?: any): never => fatalError(1000 + code, msg, err);
fatalError.Boot = (code: number, msg: ErrorMsgType, err?: any): never => fatalError(2000 + code, msg, err);
fatalError.ConfigStore = (code: number, msg: ErrorMsgType, err?: any): never => fatalError(5100 + code, msg, err);
fatalError.Translator = (code: number, msg: ErrorMsgType, err?: any): never => fatalError(5200 + code, msg, err);
fatalError.AdminStore = (code: number, msg: ErrorMsgType, err?: any): never => fatalError(5300 + code, msg, err);
// fatalError.FxRunner = (code: number, msg: ErrorMsgType, err?: any): never => fatalError(5400 + code, msg, err);
fatalError.Database = (code: number, msg: ErrorMsgType, err?: any): never => fatalError(5600 + code, msg, err);
fatalError.StatsTxRuntime = (code: number, msg: ErrorMsgType, err?: any): never => fatalError(5700 + code, msg, err);
fatalError.WebServer = (code: number, msg: ErrorMsgType, err?: any): never => fatalError(5800 + code, msg, err);
export default fatalError;