#!/usr/bin/env node 'use strict'; const Promise = require("bluebird"); const chokidar = require("chokidar"); const fs = Promise.promisifyAll(require("fs")); const path = require("path"); const stacktraceParser = require("stacktrace-parser"); const loadConfiguration = require("./load-configuration"); const printError = require("./print-error"); const createEmailSender = require("./email/create-sender"); const generateEmailPreview = require("./email/generate-preview"); const readError = require("./error/read"); const parseError = require("./error/parse"); let config = loadConfiguration(process.argv[2]); let transport = createEmailSender(config); function reportError(errorFilePath) { Promise.try(() => { return readError(errorFilePath); }).then((errorData) => { let error = parseError(errorData.error); // FIXME: Strip everything after the first line of the message? let subjectLine = config.subjectFormat.replace(/\$type/g, error.name).replace(/\$message/g, error.message.replace(/\n/g, " ")); return Promise.try(() => { return transport.sendMail({ subject: subjectLine, text: generateEmailPreview({ environmentName: errorData.environmentName, hostname: errorData.hostname, error: error, }, config.stackFilter), attachments: [{ filename: path.basename(errorFilePath), content: JSON.stringify(Object.assign(errorData, { parsedStack: error.stack, simplifiedStack: error.stackWithout("*", true) }), null, "\t") }] }); }).then(() => { console.log(`Reported error in ${path.basename(errorFilePath)}: ${error.name} - ${error.message}`); }); }).catch((err) => { printError([ `ERROR: Unable to parse or report error for ${errorFilePath}.`, err ]); }); } chokidar.watch(config.errorPath, {ignoreInitial: true}) .on("add", (errorFilePath) => { reportError(errorFilePath); }) .on("ready", () => { console.log("Listening for new errors..."); });