rollbar
Version:
Effortlessly track and debug errors in your JavaScript applications with Rollbar. This package includes advanced error tracking features and an intuitive interface to help you identify and fix issues more quickly.
168 lines (149 loc) • 4.34 kB
JavaScript
var _ = require('./utility');
function itemToPayload(item, options, callback) {
var data = item.data;
if (item._isUncaught) {
data._isUncaught = true;
}
if (item._originalArgs) {
data._originalArgs = item._originalArgs;
}
callback(null, data);
}
function addPayloadOptions(item, options, callback) {
var payloadOptions = options.payload || {};
if (payloadOptions.body) {
delete payloadOptions.body;
}
item.data = _.merge(item.data, payloadOptions);
callback(null, item);
}
function addTelemetryData(item, options, callback) {
if (item.telemetryEvents) {
_.set(item, 'data.body.telemetry', item.telemetryEvents);
}
callback(null, item);
}
function addMessageWithError(item, options, callback) {
if (!item.message) {
callback(null, item);
return;
}
var tracePath = 'data.body.trace_chain.0';
var trace = _.get(item, tracePath);
if (!trace) {
tracePath = 'data.body.trace';
trace = _.get(item, tracePath);
}
if (trace) {
if (!(trace.exception && trace.exception.description)) {
_.set(item, tracePath + '.exception.description', item.message);
callback(null, item);
return;
}
var extra = _.get(item, tracePath + '.extra') || {};
var newExtra = _.merge(extra, { message: item.message });
_.set(item, tracePath + '.extra', newExtra);
}
callback(null, item);
}
function userTransform(logger) {
return function (item, options, callback) {
var newItem = _.merge(item);
var response = null;
try {
if (_.isFunction(options.transform)) {
response = options.transform(newItem.data, item);
}
} catch (e) {
options.transform = null;
logger.error(
'Error while calling custom transform() function. Removing custom transform().',
e,
);
callback(null, item);
return;
}
if (_.isPromise(response)) {
response.then(
function (promisedItem) {
if (promisedItem) {
newItem.data = promisedItem;
}
callback(null, newItem);
},
function (error) {
callback(error, item);
},
);
} else {
callback(null, newItem);
}
};
}
function addConfigToPayload(item, options, callback) {
if (!options.sendConfig) {
return callback(null, item);
}
var configKey = '_rollbarConfig';
var custom = _.get(item, 'data.custom') || {};
custom[configKey] = options;
item.data.custom = custom;
callback(null, item);
}
function addFunctionOption(options, name) {
if (_.isFunction(options[name])) {
options[name] = options[name].toString();
}
}
function addConfiguredOptions(item, options, callback) {
var configuredOptions = options._configuredOptions;
// These must be stringified or they'll get dropped during serialization.
addFunctionOption(configuredOptions, 'transform');
addFunctionOption(configuredOptions, 'checkIgnore');
addFunctionOption(configuredOptions, 'onSendCallback');
delete configuredOptions.accessToken;
item.data.notifier.configured_options = configuredOptions;
callback(null, item);
}
function addDiagnosticKeys(item, options, callback) {
var diagnostic = _.merge(
item.notifier.client.notifier.diagnostic,
item.diagnostic,
);
if (_.get(item, 'err._isAnonymous')) {
diagnostic.is_anonymous = true;
}
if (item._isUncaught) {
diagnostic.is_uncaught = item._isUncaught;
}
if (item.err) {
try {
diagnostic.raw_error = {
message: item.err.message,
name: item.err.name,
constructor_name: item.err.constructor && item.err.constructor.name,
filename: item.err.fileName,
line: item.err.lineNumber,
column: item.err.columnNumber,
stack: item.err.stack,
};
} catch (e) {
diagnostic.raw_error = { failed: String(e) };
}
}
item.data.notifier.diagnostic = _.merge(
item.data.notifier.diagnostic,
diagnostic,
);
callback(null, item);
}
module.exports = {
itemToPayload: itemToPayload,
addPayloadOptions: addPayloadOptions,
addTelemetryData: addTelemetryData,
addMessageWithError: addMessageWithError,
userTransform: userTransform,
addConfigToPayload: addConfigToPayload,
addConfiguredOptions: addConfiguredOptions,
addDiagnosticKeys: addDiagnosticKeys,
};