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