UNPKG

actionhero

Version:

actionhero.js is a multi-transport API Server with integrated cluster capabilities and delayed tasks

120 lines (119 loc) 4.76 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Exceptions = void 0; const os = require("os"); const index_1 = require("../index"); /** * Handlers for when things go wrong. */ class Exceptions extends index_1.Initializer { constructor() { super(); this.name = "exceptions"; this.loadPriority = 130; } relevantDetails() { return ["action", "remoteIP", "type", "params", "room"]; } async initialize(config) { index_1.api.exceptionHandlers = { reporters: [], report: (error, type, name, objects, severity) => { if (!severity) { severity = "error"; } for (const i in index_1.api.exceptionHandlers.reporters) { index_1.api.exceptionHandlers.reporters[i](error, type, name, objects, severity); } }, }; const consoleReporter = (error, type, name, objects, severity) => { const extraMessages = []; if (type === "loader") { extraMessages.push("! Failed to load " + objects.fullFilePath); } else if (type === "action") { extraMessages.push("! uncaught error from action: " + name); extraMessages.push("! connection details:"); const relevantDetails = this.relevantDetails(); for (const i in relevantDetails) { const relevantDetail = relevantDetails[i]; if (objects.connection[relevantDetail] !== null && objects.connection[relevantDetail] !== undefined && typeof objects.connection[relevantDetail] !== "function") { extraMessages.push("! " + relevantDetail + ": " + JSON.stringify(objects.connection[relevantDetail])); } } } else if (type === "task") { extraMessages.push("! error from task: " + name + " on queue " + objects.queue + " (worker #" + objects.workerId + ")"); try { extraMessages.push("! arguments: " + JSON.stringify(objects.task.args)); } catch (e) { } } else { extraMessages.push("! Error: " + error.message); extraMessages.push("! Type: " + type); extraMessages.push("! Name: " + name); extraMessages.push("! Data: " + JSON.stringify(objects)); } for (const m in extraMessages) { index_1.log(extraMessages[m], severity); } let lines; try { lines = error.stack.split(os.EOL); } catch (e) { lines = new Error(error).stack.split(os.EOL); } for (const l in lines) { const line = lines[l]; index_1.log("! " + line, severity); } index_1.log("*", severity); }; index_1.api.exceptionHandlers.reporters.push(consoleReporter); index_1.api.exceptionHandlers.loader = (fullFilePath, error) => { const name = "loader:" + fullFilePath; index_1.api.exceptionHandlers.report(error, "loader", name, { fullFilePath: fullFilePath }, "alert"); }; index_1.api.exceptionHandlers.action = (error, data, next) => { let simpleName; try { simpleName = data.action; } catch (e) { simpleName = error.message; } const name = "action:" + simpleName; index_1.api.exceptionHandlers.report(error, "action", name, { connection: data.connection }, "error"); data.connection.response = {}; // no partial responses if (typeof next === "function") { next(); } }; index_1.api.exceptionHandlers.task = (error, queue, task, workerId) => { let simpleName; try { simpleName = task.class; } catch (e) { simpleName = error.message; } const name = "task:" + simpleName; index_1.api.exceptionHandlers.report(error, "task", name, { task: task, queue: queue, workerId: workerId }, config.tasks.workerLogging.failure); }; } } exports.Exceptions = Exceptions;