UNPKG

@sentry/browser

Version:
140 lines (122 loc) 4.18 kB
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