@sentry/browser
Version:
Official Sentry SDK for browsers
140 lines (122 loc) • 4.18 kB
JavaScript
Object.defineProperty(exports, '__esModule', { value: true });
var core = require('@sentry/core');
var utils = require('@sentry/utils');
var eventbuilder = require('./eventbuilder.js');
var flags = require('./flags.js');
var breadcrumbs = require('./integrations/breadcrumbs.js');
var utils$1 = require('./transports/utils.js');
var globalObject = utils.getGlobalObject();
/**
* The Sentry Browser SDK Client.
*
* @see BrowserOptions for documentation on configuration options.
* @see SentryClient for usage documentation.
*/
class BrowserClient extends core.BaseClient {
/**
* Creates a new Browser SDK instance.
*
* @param options Configuration options for this SDK.
*/
constructor(options) {
options._metadata = options._metadata || {};
options._metadata.sdk = options._metadata.sdk || {
name: 'sentry.javascript.browser',
packages: [
{
name: 'npm:@sentry/browser',
version: core.SDK_VERSION,
},
],
version: core.SDK_VERSION,
};
super(options);
if (options.sendClientReports && globalObject.document) {
globalObject.document.addEventListener('visibilitychange', () => {
if (globalObject.document.visibilityState === 'hidden') {
this._flushOutcomes();
}
});
}
}
/**
* @inheritDoc
*/
eventFromException(exception, hint) {
return eventbuilder.eventFromException(this._options.stackParser, exception, hint, this._options.attachStacktrace);
}
/**
* @inheritDoc
*/
eventFromMessage(
message,
level = 'info',
hint,
) {
return eventbuilder.eventFromMessage(this._options.stackParser, message, level, hint, this._options.attachStacktrace);
}
/**
* @inheritDoc
*/
sendEvent(event) {
// We only want to add the sentry event breadcrumb when the user has the breadcrumb integration installed and
// activated its `sentry` option.
// We also do not want to use the `Breadcrumbs` class here directly, because we do not want it to be included in
// bundles, if it is not used by the SDK.
// This all sadly is a bit ugly, but we currently don't have a "pre-send" hook on the integrations so we do it this
// way for now.
var breadcrumbIntegration = this.getIntegrationById(breadcrumbs.BREADCRUMB_INTEGRATION_ID) ;
if (
breadcrumbIntegration &&
// We check for definedness of `options`, even though it is not strictly necessary, because that access to
// `.sentry` below does not throw, in case users provided their own integration with id "Breadcrumbs" that does
// not have an`options` field
breadcrumbIntegration.options &&
breadcrumbIntegration.options.sentry
) {
core.getCurrentHub().addBreadcrumb(
{
category: `sentry.${event.type === 'transaction' ? 'transaction' : 'event'}`,
event_id: event.event_id,
level: event.level,
message: utils.getEventDescription(event),
},
{
event,
},
);
}
super.sendEvent(event);
}
/**
* @inheritDoc
*/
_prepareEvent(event, scope, hint) {
event.platform = event.platform || 'javascript';
return super._prepareEvent(event, scope, hint);
}
/**
* Sends client reports as an envelope.
*/
_flushOutcomes() {
var outcomes = this._clearOutcomes();
if (outcomes.length === 0) {
flags.IS_DEBUG_BUILD && utils.logger.log('No outcomes to send');
return;
}
if (!this._dsn) {
flags.IS_DEBUG_BUILD && utils.logger.log('No dsn provided, will not send outcomes');
return;
}
flags.IS_DEBUG_BUILD && utils.logger.log('Sending outcomes:', outcomes);
var url = core.getEnvelopeEndpointWithUrlEncodedAuth(this._dsn, this._options.tunnel);
var envelope = utils.createClientReportEnvelope(outcomes, this._options.tunnel && utils.dsnToString(this._dsn));
try {
utils$1.sendReport(url, utils.serializeEnvelope(envelope));
} catch (e) {
flags.IS_DEBUG_BUILD && utils.logger.error(e);
}
}
}
exports.BrowserClient = BrowserClient;
//# sourceMappingURL=client.js.map