UNPKG

14 kBSource Map (JSON)View Raw
1{"version":3,"file":"sdk.js","sources":["../../../src/sdk.ts"],"sourcesContent":["import type { Hub } from '@sentry/core';\nimport {\n getCurrentHub,\n getIntegrationsToSetup,\n getReportDialogEndpoint,\n initAndBind,\n Integrations as CoreIntegrations,\n} from '@sentry/core';\nimport {\n addInstrumentationHandler,\n logger,\n resolvedSyncPromise,\n stackParserFromStackParserOptions,\n supportsFetch,\n} from '@sentry/utils';\n\nimport type { BrowserClientOptions, BrowserOptions } from './client';\nimport { BrowserClient } from './client';\nimport type { ReportDialogOptions } from './helpers';\nimport { WINDOW, wrap as internalWrap } from './helpers';\nimport { Breadcrumbs, Dedupe, GlobalHandlers, HttpContext, LinkedErrors, TryCatch } from './integrations';\nimport { defaultStackParser } from './stack-parsers';\nimport { makeFetchTransport, makeXHRTransport } from './transports';\n\nexport const defaultIntegrations = [\n new CoreIntegrations.InboundFilters(),\n new CoreIntegrations.FunctionToString(),\n new TryCatch(),\n new Breadcrumbs(),\n new GlobalHandlers(),\n new LinkedErrors(),\n new Dedupe(),\n new HttpContext(),\n];\n\n/**\n * A magic string that build tooling can leverage in order to inject a release value into the SDK.\n */\ndeclare const __SENTRY_RELEASE__: string | undefined;\n\n/**\n * The Sentry Browser SDK Client.\n *\n * To use this SDK, call the {@link init} function as early as possible when\n * loading the web page. To set context information or send manual events, use\n * the provided methods.\n *\n * @example\n *\n * ```\n *\n * import { init } from '@sentry/browser';\n *\n * init({\n * dsn: '__DSN__',\n * // ...\n * });\n * ```\n *\n * @example\n * ```\n *\n * import { configureScope } from '@sentry/browser';\n * configureScope((scope: Scope) => {\n * scope.setExtra({ battery: 0.7 });\n * scope.setTag({ user_mode: 'admin' });\n * scope.setUser({ id: '4711' });\n * });\n * ```\n *\n * @example\n * ```\n *\n * import { addBreadcrumb } from '@sentry/browser';\n * addBreadcrumb({\n * message: 'My Breadcrumb',\n * // ...\n * });\n * ```\n *\n * @example\n *\n * ```\n *\n * import * as Sentry from '@sentry/browser';\n * Sentry.captureMessage('Hello, world!');\n * Sentry.captureException(new Error('Good bye'));\n * Sentry.captureEvent({\n * message: 'Manual',\n * stacktrace: [\n * // ...\n * ],\n * });\n * ```\n *\n * @see {@link BrowserOptions} for documentation on configuration options.\n */\nexport function init(options: BrowserOptions = {}): void {\n if (options.defaultIntegrations === undefined) {\n options.defaultIntegrations = defaultIntegrations;\n }\n if (options.release === undefined) {\n // This allows build tooling to find-and-replace __SENTRY_RELEASE__ to inject a release value\n if (typeof __SENTRY_RELEASE__ === 'string') {\n options.release = __SENTRY_RELEASE__;\n }\n\n // This supports the variable that sentry-webpack-plugin injects\n if (WINDOW.SENTRY_RELEASE && WINDOW.SENTRY_RELEASE.id) {\n options.release = WINDOW.SENTRY_RELEASE.id;\n }\n }\n if (options.autoSessionTracking === undefined) {\n options.autoSessionTracking = true;\n }\n if (options.sendClientReports === undefined) {\n options.sendClientReports = true;\n }\n\n const clientOptions: BrowserClientOptions = {\n ...options,\n stackParser: stackParserFromStackParserOptions(options.stackParser || defaultStackParser),\n integrations: getIntegrationsToSetup(options),\n transport: options.transport || (supportsFetch() ? makeFetchTransport : makeXHRTransport),\n };\n\n initAndBind(BrowserClient, clientOptions);\n\n if (options.autoSessionTracking) {\n startSessionTracking();\n }\n}\n\n/**\n * Present the user with a report dialog.\n *\n * @param options Everything is optional, we try to fetch all info need from the global scope.\n */\nexport function showReportDialog(options: ReportDialogOptions = {}, hub: Hub = getCurrentHub()): void {\n // doesn't work without a document (React Native)\n if (!WINDOW.document) {\n __DEBUG_BUILD__ && logger.error('Global document not defined in showReportDialog call');\n return;\n }\n\n const { client, scope } = hub.getStackTop();\n const dsn = options.dsn || (client && client.getDsn());\n if (!dsn) {\n __DEBUG_BUILD__ && logger.error('DSN not configured for showReportDialog call');\n return;\n }\n\n if (scope) {\n options.user = {\n ...scope.getUser(),\n ...options.user,\n };\n }\n\n if (!options.eventId) {\n options.eventId = hub.lastEventId();\n }\n\n const script = WINDOW.document.createElement('script');\n script.async = true;\n script.src = getReportDialogEndpoint(dsn, options);\n\n if (options.onLoad) {\n script.onload = options.onLoad;\n }\n\n const injectionPoint = WINDOW.document.head || WINDOW.document.body;\n if (injectionPoint) {\n injectionPoint.appendChild(script);\n } else {\n __DEBUG_BUILD__ && logger.error('Not injecting report dialog. No injection point found in HTML');\n }\n}\n\n/**\n * This is the getter for lastEventId.\n *\n * @returns The last event id of a captured event.\n */\nexport function lastEventId(): string | undefined {\n return getCurrentHub().lastEventId();\n}\n\n/**\n * This function is here to be API compatible with the loader.\n * @hidden\n */\nexport function forceLoad(): void {\n // Noop\n}\n\n/**\n * This function is here to be API compatible with the loader.\n * @hidden\n */\nexport function onLoad(callback: () => void): void {\n callback();\n}\n\n/**\n * Call `flush()` on the current client, if there is one. See {@link Client.flush}.\n *\n * @param timeout Maximum time in ms the client should wait to flush its event queue. Omitting this parameter will cause\n * the client to wait until all events are sent before resolving the promise.\n * @returns A promise which resolves to `true` if the queue successfully drains before the timeout, or `false` if it\n * doesn't (or if there's no client defined).\n */\nexport function flush(timeout?: number): PromiseLike<boolean> {\n const client = getCurrentHub().getClient<BrowserClient>();\n if (client) {\n return client.flush(timeout);\n }\n __DEBUG_BUILD__ && logger.warn('Cannot flush events. No client defined.');\n return resolvedSyncPromise(false);\n}\n\n/**\n * Call `close()` on the current client, if there is one. See {@link Client.close}.\n *\n * @param timeout Maximum time in ms the client should wait to flush its event queue before shutting down. Omitting this\n * parameter will cause the client to wait until all events are sent before disabling itself.\n * @returns A promise which resolves to `true` if the queue successfully drains before the timeout, or `false` if it\n * doesn't (or if there's no client defined).\n */\nexport function close(timeout?: number): PromiseLike<boolean> {\n const client = getCurrentHub().getClient<BrowserClient>();\n if (client) {\n return client.close(timeout);\n }\n __DEBUG_BUILD__ && logger.warn('Cannot flush events and disable SDK. No client defined.');\n return resolvedSyncPromise(false);\n}\n\n/**\n * Wrap code within a try/catch block so the SDK is able to capture errors.\n *\n * @param fn A function to wrap.\n *\n * @returns The result of wrapped function call.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function wrap(fn: (...args: any) => any): any {\n return internalWrap(fn)();\n}\n\nfunction startSessionOnHub(hub: Hub): void {\n hub.startSession({ ignoreDuration: true });\n hub.captureSession();\n}\n\n/**\n * Enable automatic Session Tracking for the initial page load.\n */\nfunction startSessionTracking(): void {\n if (typeof WINDOW.document === 'undefined') {\n __DEBUG_BUILD__ &&\n logger.warn('Session tracking in non-browser environment with @sentry/browser is not supported.');\n return;\n }\n\n const hub = getCurrentHub();\n\n // The only way for this to be false is for there to be a version mismatch between @sentry/browser (>= 6.0.0) and\n // @sentry/hub (< 5.27.0). In the simple case, there won't ever be such a mismatch, because the two packages are\n // pinned at the same version in package.json, but there are edge cases where it's possible. See\n // https://github.com/getsentry/sentry-javascript/issues/3207 and\n // https://github.com/getsentry/sentry-javascript/issues/3234 and\n // https://github.com/getsentry/sentry-javascript/issues/3278.\n if (!hub.captureSession) {\n return;\n }\n\n // The session duration for browser sessions does not track a meaningful\n // concept that can be used as a metric.\n // Automatically captured sessions are akin to page views, and thus we\n // discard their duration.\n startSessionOnHub(hub);\n\n // We want to create a session for every navigation as well\n addInstrumentationHandler('history', ({ from, to }) => {\n // Don't create an additional session for the initial route or if the location did not change\n if (!(from === undefined || from === to)) {\n startSessionOnHub(getCurrentHub());\n }\n });\n}\n"],"names":["CoreIntegrations","internalWrap"],"mappings":"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"}
\No newline at end of file