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.
104 lines (91 loc) • 2.69 kB
JavaScript
function captureUncaughtExceptions(window, handler, shim) {
if (!window) {
return;
}
var oldOnError;
if (typeof handler._rollbarOldOnError === 'function') {
oldOnError = handler._rollbarOldOnError;
} else if (window.onerror) {
oldOnError = window.onerror;
while (oldOnError._rollbarOldOnError) {
oldOnError = oldOnError._rollbarOldOnError;
}
handler._rollbarOldOnError = oldOnError;
}
handler.handleAnonymousErrors();
var fn = function () {
var args = Array.prototype.slice.call(arguments, 0);
_rollbarWindowOnError(window, handler, oldOnError, args);
};
if (shim) {
fn._rollbarOldOnError = oldOnError;
}
window.onerror = fn;
}
function _rollbarWindowOnError(window, r, old, args) {
if (window._rollbarWrappedError) {
if (!args[4]) {
args[4] = window._rollbarWrappedError;
}
if (!args[5]) {
args[5] = window._rollbarWrappedError._rollbarContext;
}
window._rollbarWrappedError = null;
}
var ret = r.handleUncaughtException.apply(r, args);
if (old) {
old.apply(window, args);
}
// Let other chained onerror handlers above run before setting this.
// If an error is thrown and caught within a chained onerror handler,
// Error.prepareStackTrace() will see that one before the one we want.
if (ret === 'anonymous') {
r.anonymousErrorsPending += 1; // See Rollbar.prototype.handleAnonymousErrors()
}
}
function captureUnhandledRejections(window, handler, shim) {
if (!window) {
return;
}
if (
typeof window._rollbarURH === 'function' &&
window._rollbarURH.belongsToShim
) {
window.removeEventListener('unhandledrejection', window._rollbarURH);
}
var rejectionHandler = function (evt) {
var reason, promise, detail;
try {
reason = evt.reason;
} catch (e) {
reason = undefined;
}
try {
promise = evt.promise;
} catch (e) {
promise = '[unhandledrejection] error getting `promise` from event';
}
try {
detail = evt.detail;
if (!reason && detail) {
reason = detail.reason;
promise = detail.promise;
}
} catch (e) {
// Ignore
}
if (!reason) {
reason = '[unhandledrejection] error getting `reason` from event';
}
if (handler && handler.handleUnhandledRejection) {
handler.handleUnhandledRejection(reason, promise);
}
};
rejectionHandler.belongsToShim = shim;
window._rollbarURH = rejectionHandler;
window.addEventListener('unhandledrejection', rejectionHandler);
}
module.exports = {
captureUncaughtExceptions: captureUncaughtExceptions,
captureUnhandledRejections: captureUnhandledRejections,
};