wildduck/lib/errors.js

152 lines
4 KiB
JavaScript
Raw Normal View History

2017-09-18 17:11:09 +08:00
/* eslint global-require: 0, no-console: 0 */
2017-08-29 15:36:45 +08:00
'use strict';
const config = require('wild-config');
2018-10-18 16:11:53 +08:00
const Gelf = require('gelf');
const os = require('os');
2018-11-14 16:02:53 +08:00
const util = require('util');
2018-10-18 16:11:53 +08:00
2017-08-29 15:36:45 +08:00
let bugsnag;
2018-10-18 16:11:53 +08:00
let loggelf;
let component;
let hostname;
2017-08-29 15:36:45 +08:00
2018-10-31 17:57:12 +08:00
module.exports.gelf = {};
2017-08-29 15:36:45 +08:00
if (config.bugsnagCode) {
bugsnag = require('bugsnag');
bugsnag.register(config.bugsnagCode);
2018-11-14 16:02:53 +08:00
} else {
let gelfconf = (config && config.log && config.log.gelf) || {};
component = gelfconf.component || 'wildduck';
hostname = gelfconf.hostname || os.hostname();
module.exports.gelf.handler = gelfconf.enabled
? new Gelf(gelfconf.options)
: {
emit: (channel, message) => console.error(util.inspect(message, false, 3))
};
2018-10-18 16:11:53 +08:00
2018-10-18 16:20:29 +08:00
loggelf = (...args) => {
let err = args.shift() || {};
2018-10-18 16:35:34 +08:00
if (err.code === 'ECONNRESET') {
// just ignore
return;
}
2018-10-18 16:11:53 +08:00
let message = {
short_message: component.toUpperCase() + ' [Exception] ' + (err.message || ''),
full_message: err.stack,
_exception: 'yes',
_error: err.message
};
2018-11-14 16:02:53 +08:00
let limitLength = val => {
let str = (val || '').toString().trim();
if (str.length > 256) {
str = str.substr(0, 256) + '…';
}
return str;
};
2018-10-18 16:11:53 +08:00
Object.keys(err).forEach(key => {
let vKey = '_' + key;
2018-10-18 16:31:25 +08:00
if (!message[vKey] && typeof err[key] !== 'object') {
2018-11-14 16:02:53 +08:00
message[vKey] = limitLength(err[key]);
2018-10-18 16:11:53 +08:00
}
});
2018-10-18 16:20:29 +08:00
for (let extra of args) {
Object.keys(extra || {}).forEach(key => {
let vKey = '_' + key;
2018-10-18 16:31:25 +08:00
if (!message[vKey] && typeof extra[key] !== 'object') {
2018-11-14 16:02:53 +08:00
message[vKey] = limitLength(extra[key]);
2018-10-18 16:20:29 +08:00
}
});
}
message.facility = component; // facility is deprecated but set by the driver if not provided
message.host = hostname;
message.timestamp = Date.now() / 1000;
message._component = component;
Object.keys(message).forEach(key => {
if (!message[key]) {
delete message[key];
2018-10-18 16:11:53 +08:00
}
});
2018-11-14 16:02:53 +08:00
try {
module.exports.gelf.handler.emit('gelf.log', message);
} catch (err) {
// might fail on non-JSONizable input
try {
console.error(err);
console.error(util.inspect(message, false, 3));
} catch (err) {
//ignore
}
}
2018-10-18 16:20:29 +08:00
};
}
2018-10-18 16:11:53 +08:00
2018-10-18 16:20:29 +08:00
module.exports.notify = (...args) => {
if (bugsnag) {
bugsnag.notify(...args);
2017-09-18 17:11:09 +08:00
} else {
2018-11-14 16:02:53 +08:00
loggelf(...args);
2017-08-29 15:36:45 +08:00
}
};
2017-10-02 19:42:39 +08:00
module.exports.notifyConnection = (connection, ...args) => {
2017-10-08 03:57:38 +08:00
let err = args[0];
2017-10-02 19:42:39 +08:00
let metaData = args[1] || {};
if (connection) {
if (connection.selected) {
metaData.selected = connection.selected.mailbox;
}
2017-10-02 19:42:39 +08:00
if (connection.session.user) {
metaData.userId = connection.session.user.id.toString();
}
2017-10-02 19:42:39 +08:00
metaData.remoteAddress = connection.session.remoteAddress;
metaData.isUTF8Enabled = !!connection.acceptUTF8Enabled;
}
2017-10-02 19:42:39 +08:00
2017-10-08 03:57:38 +08:00
Object.keys(err.meta || {}).forEach(key => {
metaData[key] = err.meta[key];
});
2017-10-02 19:42:39 +08:00
args[1] = metaData;
if (bugsnag) {
bugsnag.notify(...args);
} else {
2018-11-14 16:02:53 +08:00
loggelf(...args);
2017-10-02 19:42:39 +08:00
}
};
module.exports.intercept = (...args) => {
if (bugsnag) {
return bugsnag.intercept(...args);
}
let cb;
if (args.length) {
cb = args[args.length - 1];
if (typeof cb === 'function') {
2018-11-14 16:02:53 +08:00
args[args.length - 1] = function(...returnArgs) {
if (returnArgs.length > 1 && returnArgs[0]) {
console.error(returnArgs[0]);
}
2018-11-14 16:02:53 +08:00
return cb(...returnArgs);
};
}
}
};
2018-10-31 17:57:12 +08:00
module.exports.setGelf = gelf => {
module.exports.gelf.handler = gelf;
};