import { red, bgRed } from '../external/std.ts' import { Service } from '../../../di/src/decorator/Service.ts' import { Logging } from '../service/logging/Logging.ts' /** * Service class for handling and displaying top-level errors. */ @Service() export default class RunLevelErrorHandler { constructor( protected logger: Logging, ) {} /** * Get the error handler function. * @type (e: Error) => void */ get handle(): (e: Error) => void { return (e: Error) => { this.display(e) Deno.exit(1) } } /** * Log the error to the logger. * @param {Error} e */ display(e: Error) { try { const error_string = `RunLevelErrorHandler invoked: ${bgRed(' ')} ${bgRed(' UNCAUGHT TOP-LEVEL ERROR ')} ${bgRed(' ')} ${e.constructor ? e.constructor.name : e.name} ${red(`---------------------------------------------------`)} ${e.stack} ` this.logger.error(error_string, true) } catch (display_e) { // The error display encountered an error... // just throw the original so it makes it out console.error('RunLevelErrorHandler encountered an error:', display_e.message) throw e } } }