UNPKG

8.9 kBSource Map (JSON)View Raw
1{"version":3,"file":"client.js","sources":["../../../src/client.ts"],"sourcesContent":["import type { Scope } from '@sentry/core';\nimport { BaseClient, getEnvelopeEndpointWithUrlEncodedAuth, SDK_VERSION } from '@sentry/core';\nimport type {\n BrowserClientReplayOptions,\n ClientOptions,\n Event,\n EventHint,\n Options,\n Severity,\n SeverityLevel,\n} from '@sentry/types';\nimport { createClientReportEnvelope, dsnToString, getSDKSource, logger, serializeEnvelope } from '@sentry/utils';\n\nimport { eventFromException, eventFromMessage } from './eventbuilder';\nimport { WINDOW } from './helpers';\nimport type { Breadcrumbs } from './integrations';\nimport { BREADCRUMB_INTEGRATION_ID } from './integrations/breadcrumbs';\nimport type { BrowserTransportOptions } from './transports/types';\n\n/**\n * Configuration options for the Sentry Browser SDK.\n * @see @sentry/types Options for more information.\n */\nexport type BrowserOptions = Options<BrowserTransportOptions> & BrowserClientReplayOptions;\n\n/**\n * Configuration options for the Sentry Browser SDK Client class\n * @see BrowserClient for more information.\n */\nexport type BrowserClientOptions = ClientOptions<BrowserTransportOptions>;\n\n/**\n * The Sentry Browser SDK Client.\n *\n * @see BrowserOptions for documentation on configuration options.\n * @see SentryClient for usage documentation.\n */\nexport class BrowserClient extends BaseClient<BrowserClientOptions> {\n /**\n * Creates a new Browser SDK instance.\n *\n * @param options Configuration options for this SDK.\n */\n public constructor(options: BrowserClientOptions) {\n const sdkSource = WINDOW.SENTRY_SDK_SOURCE || getSDKSource();\n\n options._metadata = options._metadata || {};\n options._metadata.sdk = options._metadata.sdk || {\n name: 'sentry.javascript.browser',\n packages: [\n {\n name: `${sdkSource}:@sentry/browser`,\n version: SDK_VERSION,\n },\n ],\n version: SDK_VERSION,\n };\n\n super(options);\n\n if (options.sendClientReports && WINDOW.document) {\n WINDOW.document.addEventListener('visibilitychange', () => {\n if (WINDOW.document.visibilityState === 'hidden') {\n this._flushOutcomes();\n }\n });\n }\n }\n\n /**\n * @inheritDoc\n */\n public eventFromException(exception: unknown, hint?: EventHint): PromiseLike<Event> {\n return eventFromException(this._options.stackParser, exception, hint, this._options.attachStacktrace);\n }\n\n /**\n * @inheritDoc\n */\n public eventFromMessage(\n message: string,\n // eslint-disable-next-line deprecation/deprecation\n level: Severity | SeverityLevel = 'info',\n hint?: EventHint,\n ): PromiseLike<Event> {\n return eventFromMessage(this._options.stackParser, message, level, hint, this._options.attachStacktrace);\n }\n\n /**\n * @inheritDoc\n */\n public sendEvent(event: Event, hint?: EventHint): void {\n // We only want to add the sentry event breadcrumb when the user has the breadcrumb integration installed and\n // activated its `sentry` option.\n // We also do not want to use the `Breadcrumbs` class here directly, because we do not want it to be included in\n // bundles, if it is not used by the SDK.\n // 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\n // way for now.\n const breadcrumbIntegration = this.getIntegrationById(BREADCRUMB_INTEGRATION_ID) as Breadcrumbs | undefined;\n // We check for definedness of `addSentryBreadcrumb` in case users provided their own integration with id\n // \"Breadcrumbs\" that does not have this function.\n if (breadcrumbIntegration && breadcrumbIntegration.addSentryBreadcrumb) {\n breadcrumbIntegration.addSentryBreadcrumb(event);\n }\n\n super.sendEvent(event, hint);\n }\n\n /**\n * @inheritDoc\n */\n protected _prepareEvent(event: Event, hint: EventHint, scope?: Scope): PromiseLike<Event | null> {\n event.platform = event.platform || 'javascript';\n return super._prepareEvent(event, hint, scope);\n }\n\n /**\n * Sends client reports as an envelope.\n */\n private _flushOutcomes(): void {\n const outcomes = this._clearOutcomes();\n\n if (outcomes.length === 0) {\n __DEBUG_BUILD__ && logger.log('No outcomes to send');\n return;\n }\n\n if (!this._dsn) {\n __DEBUG_BUILD__ && logger.log('No dsn provided, will not send outcomes');\n return;\n }\n\n __DEBUG_BUILD__ && logger.log('Sending outcomes:', outcomes);\n\n const url = getEnvelopeEndpointWithUrlEncodedAuth(this._dsn, this._options);\n const envelope = createClientReportEnvelope(outcomes, this._options.tunnel && dsnToString(this._dsn));\n\n try {\n const isRealNavigator = Object.prototype.toString.call(WINDOW && WINDOW.navigator) === '[object Navigator]';\n const hasSendBeacon = isRealNavigator && typeof WINDOW.navigator.sendBeacon === 'function';\n // Make sure beacon is not used if user configures custom transport options\n if (hasSendBeacon && !this._options.transportOptions) {\n // Prevent illegal invocations - https://xgwang.me/posts/you-may-not-know-beacon/#it-may-throw-error%2C-be-sure-to-catch\n const sendBeacon = WINDOW.navigator.sendBeacon.bind(WINDOW.navigator);\n sendBeacon(url, serializeEnvelope(envelope));\n } else {\n // If beacon is not supported or if they are using the tunnel option\n // use our regular transport to send client reports to Sentry.\n this._sendEnvelope(envelope);\n }\n } catch (e) {\n __DEBUG_BUILD__ && logger.error(e);\n }\n }\n}\n"],"names":[],"mappings":"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"}
\No newline at end of file