@sentry/browser
Version:
Official Sentry SDK for browsers
201 lines • 8.79 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
var core_1 = require("@sentry/core");
var types_1 = require("@sentry/types");
var utils_1 = require("@sentry/utils");
var eventbuilder_1 = require("../eventbuilder");
var helpers_1 = require("../helpers");
/** Global handlers */
var GlobalHandlers = /** @class */ (function () {
/** JSDoc */
function GlobalHandlers(options) {
/**
* @inheritDoc
*/
this.name = GlobalHandlers.id;
/** JSDoc */
this._onErrorHandlerInstalled = false;
/** JSDoc */
this._onUnhandledRejectionHandlerInstalled = false;
this._options = tslib_1.__assign({ onerror: true, onunhandledrejection: true }, options);
}
/**
* @inheritDoc
*/
GlobalHandlers.prototype.setupOnce = function () {
Error.stackTraceLimit = 50;
if (this._options.onerror) {
utils_1.logger.log('Global Handler attached: onerror');
this._installGlobalOnErrorHandler();
}
if (this._options.onunhandledrejection) {
utils_1.logger.log('Global Handler attached: onunhandledrejection');
this._installGlobalOnUnhandledRejectionHandler();
}
};
/** JSDoc */
GlobalHandlers.prototype._installGlobalOnErrorHandler = function () {
var _this = this;
if (this._onErrorHandlerInstalled) {
return;
}
utils_1.addInstrumentationHandler({
// eslint-disable-next-line @typescript-eslint/no-explicit-any
callback: function (data) {
var error = data.error;
var currentHub = core_1.getCurrentHub();
var hasIntegration = currentHub.getIntegration(GlobalHandlers);
var isFailedOwnDelivery = error && error.__sentry_own_request__ === true;
if (!hasIntegration || helpers_1.shouldIgnoreOnError() || isFailedOwnDelivery) {
return;
}
var client = currentHub.getClient();
var event = utils_1.isPrimitive(error)
? _this._eventFromIncompleteOnError(data.msg, data.url, data.line, data.column)
: _this._enhanceEventWithInitialFrame(eventbuilder_1.eventFromUnknownInput(error, undefined, {
attachStacktrace: client && client.getOptions().attachStacktrace,
rejection: false,
}), data.url, data.line, data.column);
utils_1.addExceptionMechanism(event, {
handled: false,
type: 'onerror',
});
currentHub.captureEvent(event, {
originalException: error,
});
},
type: 'error',
});
this._onErrorHandlerInstalled = true;
};
/** JSDoc */
GlobalHandlers.prototype._installGlobalOnUnhandledRejectionHandler = function () {
var _this = this;
if (this._onUnhandledRejectionHandlerInstalled) {
return;
}
utils_1.addInstrumentationHandler({
// eslint-disable-next-line @typescript-eslint/no-explicit-any
callback: function (e) {
var error = e;
// dig the object of the rejection out of known event types
try {
// PromiseRejectionEvents store the object of the rejection under 'reason'
// see https://developer.mozilla.org/en-US/docs/Web/API/PromiseRejectionEvent
if ('reason' in e) {
error = e.reason;
}
// something, somewhere, (likely a browser extension) effectively casts PromiseRejectionEvents
// to CustomEvents, moving the `promise` and `reason` attributes of the PRE into
// the CustomEvent's `detail` attribute, since they're not part of CustomEvent's spec
// see https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent and
// https://github.com/getsentry/sentry-javascript/issues/2380
else if ('detail' in e && 'reason' in e.detail) {
error = e.detail.reason;
}
}
catch (_oO) {
// no-empty
}
var currentHub = core_1.getCurrentHub();
var hasIntegration = currentHub.getIntegration(GlobalHandlers);
var isFailedOwnDelivery = error && error.__sentry_own_request__ === true;
if (!hasIntegration || helpers_1.shouldIgnoreOnError() || isFailedOwnDelivery) {
return true;
}
var client = currentHub.getClient();
var event = utils_1.isPrimitive(error)
? _this._eventFromIncompleteRejection(error)
: eventbuilder_1.eventFromUnknownInput(error, undefined, {
attachStacktrace: client && client.getOptions().attachStacktrace,
rejection: true,
});
event.level = types_1.Severity.Error;
utils_1.addExceptionMechanism(event, {
handled: false,
type: 'onunhandledrejection',
});
currentHub.captureEvent(event, {
originalException: error,
});
return;
},
type: 'unhandledrejection',
});
this._onUnhandledRejectionHandlerInstalled = true;
};
/**
* This function creates a stack from an old, error-less onerror handler.
*/
// eslint-disable-next-line @typescript-eslint/no-explicit-any
GlobalHandlers.prototype._eventFromIncompleteOnError = function (msg, url, line, column) {
var ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/i;
// If 'message' is ErrorEvent, get real message from inside
var message = utils_1.isErrorEvent(msg) ? msg.message : msg;
var name;
if (utils_1.isString(message)) {
var groups = message.match(ERROR_TYPES_RE);
if (groups) {
name = groups[1];
message = groups[2];
}
}
var event = {
exception: {
values: [
{
type: name || 'Error',
value: message,
},
],
},
};
return this._enhanceEventWithInitialFrame(event, url, line, column);
};
/**
* This function creates an Event from an TraceKitStackTrace that has part of it missing.
*/
// eslint-disable-next-line @typescript-eslint/no-explicit-any
GlobalHandlers.prototype._eventFromIncompleteRejection = function (error) {
return {
exception: {
values: [
{
type: 'UnhandledRejection',
value: "Non-Error promise rejection captured with value: " + error,
},
],
},
};
};
/** JSDoc */
// eslint-disable-next-line @typescript-eslint/no-explicit-any
GlobalHandlers.prototype._enhanceEventWithInitialFrame = function (event, url, line, column) {
event.exception = event.exception || {};
event.exception.values = event.exception.values || [];
event.exception.values[0] = event.exception.values[0] || {};
event.exception.values[0].stacktrace = event.exception.values[0].stacktrace || {};
event.exception.values[0].stacktrace.frames = event.exception.values[0].stacktrace.frames || [];
var colno = isNaN(parseInt(column, 10)) ? undefined : column;
var lineno = isNaN(parseInt(line, 10)) ? undefined : line;
var filename = utils_1.isString(url) && url.length > 0 ? url : utils_1.getLocationHref();
if (event.exception.values[0].stacktrace.frames.length === 0) {
event.exception.values[0].stacktrace.frames.push({
colno: colno,
filename: filename,
function: '?',
in_app: true,
lineno: lineno,
});
}
return event;
};
/**
* @inheritDoc
*/
GlobalHandlers.id = 'GlobalHandlers';
return GlobalHandlers;
}());
exports.GlobalHandlers = GlobalHandlers;
//# sourceMappingURL=globalhandlers.js.map