You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

65 lines
2.2 KiB
JavaScript

#!/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...");
});