{"version":3,"file":"bundle.min.js","sources":["../../types/src/loglevel.ts","../../types/src/severity.ts","../../types/src/status.ts","../../utils/src/polyfill.ts","../../utils/src/error.ts","../../utils/src/is.ts","../../utils/src/misc.ts","../../utils/src/logger.ts","../../utils/src/syncpromise.ts","../../utils/src/memo.ts","../../utils/src/string.ts","../../utils/src/object.ts","../../utils/src/promisebuffer.ts","../../utils/src/supports.ts","../../hub/src/span.ts","../../hub/src/scope.ts","../../hub/src/hub.ts","../../minimal/src/index.ts","../../core/src/dsn.ts","../../core/src/api.ts","../../core/src/integration.ts","../../core/src/baseclient.ts","../../core/src/integrations/functiontostring.ts","../../core/src/transports/noop.ts","../../core/src/basebackend.ts","../../core/src/integrations/inboundfilters.ts","../src/tracekit.ts","../src/parsers.ts","../src/eventbuilder.ts","../src/transports/base.ts","../src/helpers.ts","../src/transports/fetch.ts","../src/transports/xhr.ts","../src/backend.ts","../src/version.ts","../src/client.ts","../src/integrations/globalhandlers.ts","../src/integrations/trycatch.ts","../src/integrations/breadcrumbs.ts","../src/integrations/linkederrors.ts","../src/integrations/useragent.ts","../src/sdk.ts","../src/index.ts","../../core/src/sdk.ts"],"sourcesContent":["/** Console logging verbosity for the SDK. */\nexport enum LogLevel {\n /** No logs will be generated. */\n None = 0,\n /** Only SDK internal errors will be logged. */\n Error = 1,\n /** Information useful for debugging the SDK will be logged. */\n Debug = 2,\n /** All SDK actions will be logged. */\n Verbose = 3,\n}\n","/** JSDoc */\nexport enum Severity {\n /** JSDoc */\n Fatal = 'fatal',\n /** JSDoc */\n Error = 'error',\n /** JSDoc */\n Warning = 'warning',\n /** JSDoc */\n Log = 'log',\n /** JSDoc */\n Info = 'info',\n /** JSDoc */\n Debug = 'debug',\n /** JSDoc */\n Critical = 'critical',\n}\n// tslint:disable:completed-docs\n// tslint:disable:no-unnecessary-qualifier no-namespace\nexport namespace Severity {\n /**\n * Converts a string-based level into a {@link Severity}.\n *\n * @param level string representation of Severity\n * @returns Severity\n */\n export function fromString(level: string): Severity {\n switch (level) {\n case 'debug':\n return Severity.Debug;\n case 'info':\n return Severity.Info;\n case 'warn':\n case 'warning':\n return Severity.Warning;\n case 'error':\n return Severity.Error;\n case 'fatal':\n return Severity.Fatal;\n case 'critical':\n return Severity.Critical;\n case 'log':\n default:\n return Severity.Log;\n }\n }\n}\n","/** The status of an event. */\nexport enum Status {\n /** The status could not be determined. */\n Unknown = 'unknown',\n /** The event was skipped due to configuration or callbacks. */\n Skipped = 'skipped',\n /** The event was sent to Sentry successfully. */\n Success = 'success',\n /** The client is currently rate limited and will try again later. */\n RateLimit = 'rate_limit',\n /** The event could not be processed. */\n Invalid = 'invalid',\n /** A server-side error ocurred during submission. */\n Failed = 'failed',\n}\n// tslint:disable:completed-docs\n// tslint:disable:no-unnecessary-qualifier no-namespace\nexport namespace Status {\n /**\n * Converts a HTTP status code into a {@link Status}.\n *\n * @param code The HTTP response status code.\n * @returns The send status or {@link Status.Unknown}.\n */\n export function fromHttpCode(code: number): Status {\n if (code >= 200 && code < 300) {\n return Status.Success;\n }\n\n if (code === 429) {\n return Status.RateLimit;\n }\n\n if (code >= 400 && code < 500) {\n return Status.Invalid;\n }\n\n if (code >= 500) {\n return Status.Failed;\n }\n\n return Status.Unknown;\n }\n}\n","export const setPrototypeOf =\n Object.setPrototypeOf || ({ __proto__: [] } instanceof Array ? setProtoOf : mixinProperties); // tslint:disable-line:no-unbound-method\n\n/**\n * setPrototypeOf polyfill using __proto__\n */\nfunction setProtoOf(obj: TTarget, proto: TProto): TTarget & TProto {\n // @ts-ignore\n obj.__proto__ = proto;\n return obj as TTarget & TProto;\n}\n\n/**\n * setPrototypeOf polyfill using mixin\n */\nfunction mixinProperties(obj: TTarget, proto: TProto): TTarget & TProto {\n for (const prop in proto) {\n if (!obj.hasOwnProperty(prop)) {\n // @ts-ignore\n obj[prop] = proto[prop];\n }\n }\n\n return obj as TTarget & TProto;\n}\n","import { setPrototypeOf } from './polyfill';\n\n/** An error emitted by Sentry SDKs and related utilities. */\nexport class SentryError extends Error {\n /** Display name of this error instance. */\n public name: string;\n\n public constructor(public message: string) {\n super(message);\n\n // tslint:disable:no-unsafe-any\n this.name = new.target.prototype.constructor.name;\n setPrototypeOf(this, new.target.prototype);\n }\n}\n","/// \n\n/**\n * Checks whether given value's type is one of a few Error or Error-like\n * {@link isError}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isError(wat: any): boolean {\n switch (Object.prototype.toString.call(wat)) {\n case '[object Error]':\n return true;\n case '[object Exception]':\n return true;\n case '[object DOMException]':\n return true;\n default:\n return wat instanceof Error;\n }\n}\n\n/**\n * Checks whether given value's type is ErrorEvent\n * {@link isErrorEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isErrorEvent(wat: any): boolean {\n return Object.prototype.toString.call(wat) === '[object ErrorEvent]';\n}\n\n/**\n * Checks whether given value's type is DOMError\n * {@link isDOMError}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isDOMError(wat: any): boolean {\n return Object.prototype.toString.call(wat) === '[object DOMError]';\n}\n\n/**\n * Checks whether given value's type is DOMException\n * {@link isDOMException}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isDOMException(wat: any): boolean {\n return Object.prototype.toString.call(wat) === '[object DOMException]';\n}\n\n/**\n * Checks whether given value's type is a string\n * {@link isString}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isString(wat: any): boolean {\n return Object.prototype.toString.call(wat) === '[object String]';\n}\n\n/**\n * Checks whether given value's is a primitive (undefined, null, number, boolean, string)\n * {@link isPrimitive}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isPrimitive(wat: any): boolean {\n return wat === null || (typeof wat !== 'object' && typeof wat !== 'function');\n}\n\n/**\n * Checks whether given value's type is an object literal\n * {@link isPlainObject}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isPlainObject(wat: any): boolean {\n return Object.prototype.toString.call(wat) === '[object Object]';\n}\n\n/**\n * Checks whether given value's type is an Event instance\n * {@link isEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isEvent(wat: any): wat is Event {\n // tslint:disable-next-line:strict-type-predicates\n return typeof Event !== 'undefined' && wat instanceof Event;\n}\n\n/**\n * Checks whether given value's type is an Element instance\n * {@link isElement}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isElement(wat: any): wat is Element {\n // tslint:disable-next-line:strict-type-predicates\n return typeof Element !== 'undefined' && wat instanceof Element;\n}\n\n/**\n * Checks whether given value's type is an regexp\n * {@link isRegExp}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isRegExp(wat: any): boolean {\n return Object.prototype.toString.call(wat) === '[object RegExp]';\n}\n\n/**\n * Checks whether given value has a then function.\n * @param wat A value to be checked.\n */\nexport function isThenable(wat: any): boolean {\n // tslint:disable:no-unsafe-any\n return Boolean(wat && wat.then && typeof wat.then === 'function');\n // tslint:enable:no-unsafe-any\n}\n\n/**\n * Checks whether given value's type is a SyntheticEvent\n * {@link isSyntheticEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isSyntheticEvent(wat: any): boolean {\n // tslint:disable-next-line:no-unsafe-any\n return isPlainObject(wat) && 'nativeEvent' in wat && 'preventDefault' in wat && 'stopPropagation' in wat;\n}\n","/// \n\nimport { Event, Integration, WrappedFunction } from '@sentry/types';\n\nimport { isString } from './is';\n\n/** Internal */\ninterface SentryGlobal {\n Sentry?: {\n Integrations?: Integration[];\n };\n SENTRY_ENVIRONMENT?: string;\n SENTRY_DSN?: string;\n SENTRY_RELEASE?: {\n id?: string;\n };\n __SENTRY__: {\n globalEventProcessors: any;\n hub: any;\n logger: any;\n };\n}\n\n/**\n * Requires a module which is protected _against bundler minification.\n *\n * @param request The module path to resolve\n */\nexport function dynamicRequire(mod: any, request: string): any {\n // tslint:disable-next-line: no-unsafe-any\n return mod.require(request);\n}\n\n/**\n * Checks whether we're in the Node.js or Browser environment\n *\n * @returns Answer to given question\n */\nexport function isNodeEnv(): boolean {\n // tslint:disable:strict-type-predicates\n return Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]';\n}\n\nconst fallbackGlobalObject = {};\n\n/**\n * Safely get global scope object\n *\n * @returns Global scope object\n */\nexport function getGlobalObject(): T & SentryGlobal {\n return (isNodeEnv()\n ? global\n : typeof window !== 'undefined'\n ? window\n : typeof self !== 'undefined'\n ? self\n : fallbackGlobalObject) as T & SentryGlobal;\n}\n// tslint:enable:strict-type-predicates\n\n/**\n * Extended Window interface that allows for Crypto API usage in IE browsers\n */\ninterface MsCryptoWindow extends Window {\n msCrypto?: Crypto;\n}\n\n/**\n * UUID4 generator\n *\n * @returns string Generated UUID4.\n */\nexport function uuid4(): string {\n const global = getGlobalObject() as MsCryptoWindow;\n const crypto = global.crypto || global.msCrypto;\n\n if (!(crypto === void 0) && crypto.getRandomValues) {\n // Use window.crypto API if available\n const arr = new Uint16Array(8);\n crypto.getRandomValues(arr);\n\n // set 4 in byte 7\n // tslint:disable-next-line:no-bitwise\n arr[3] = (arr[3] & 0xfff) | 0x4000;\n // set 2 most significant bits of byte 9 to '10'\n // tslint:disable-next-line:no-bitwise\n arr[4] = (arr[4] & 0x3fff) | 0x8000;\n\n const pad = (num: number): string => {\n let v = num.toString(16);\n while (v.length < 4) {\n v = `0${v}`;\n }\n return v;\n };\n\n return (\n pad(arr[0]) + pad(arr[1]) + pad(arr[2]) + pad(arr[3]) + pad(arr[4]) + pad(arr[5]) + pad(arr[6]) + pad(arr[7])\n );\n }\n // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523\n return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, c => {\n // tslint:disable-next-line:no-bitwise\n const r = (Math.random() * 16) | 0;\n // tslint:disable-next-line:no-bitwise\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/**\n * Parses string form of URL into an object\n * // borrowed from https://tools.ietf.org/html/rfc3986#appendix-B\n * // intentionally using regex and not href parsing trick because React Native and other\n * // environments where DOM might not be available\n * @returns parsed URL object\n */\nexport function parseUrl(\n url: string,\n): {\n host?: string;\n path?: string;\n protocol?: string;\n relative?: string;\n} {\n if (!url) {\n return {};\n }\n\n const match = url.match(/^(([^:\\/?#]+):)?(\\/\\/([^\\/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$/);\n\n if (!match) {\n return {};\n }\n\n // coerce to undefined values to empty string so we don't get 'undefined'\n const query = match[6] || '';\n const fragment = match[8] || '';\n return {\n host: match[4],\n path: match[5],\n protocol: match[2],\n relative: match[5] + query + fragment, // everything minus origin\n };\n}\n\n/**\n * Extracts either message or type+value from an event that can be used for user-facing logs\n * @returns event's description\n */\nexport function getEventDescription(event: Event): string {\n if (event.message) {\n return event.message;\n }\n if (event.exception && event.exception.values && event.exception.values[0]) {\n const exception = event.exception.values[0];\n\n if (exception.type && exception.value) {\n return `${exception.type}: ${exception.value}`;\n }\n return exception.type || exception.value || event.event_id || '';\n }\n return event.event_id || '';\n}\n\n/** JSDoc */\ninterface ExtensibleConsole extends Console {\n [key: string]: any;\n}\n\n/** JSDoc */\nexport function consoleSandbox(callback: () => any): any {\n const global = getGlobalObject();\n const levels = ['debug', 'info', 'warn', 'error', 'log', 'assert'];\n\n if (!('console' in global)) {\n return callback();\n }\n\n const originalConsole = global.console as ExtensibleConsole;\n const wrappedLevels: { [key: string]: any } = {};\n\n // Restore all wrapped console methods\n levels.forEach(level => {\n if (level in global.console && (originalConsole[level] as WrappedFunction).__sentry__) {\n wrappedLevels[level] = (originalConsole[level] as WrappedFunction).__sentry_wrapped__;\n originalConsole[level] = (originalConsole[level] as WrappedFunction).__sentry_original__;\n }\n });\n\n // Perform callback manipulations\n const result = callback();\n\n // Revert restoration to wrapped state\n Object.keys(wrappedLevels).forEach(level => {\n originalConsole[level] = wrappedLevels[level];\n });\n\n return result;\n}\n\n/**\n * Adds exception values, type and value to an synthetic Exception.\n * @param event The event to modify.\n * @param value Value of the exception.\n * @param type Type of the exception.\n * @hidden\n */\nexport function addExceptionTypeValue(event: Event, value?: string, type?: string): void {\n event.exception = event.exception || {};\n event.exception.values = event.exception.values || [];\n event.exception.values[0] = event.exception.values[0] || {};\n event.exception.values[0].value = event.exception.values[0].value || value || '';\n event.exception.values[0].type = event.exception.values[0].type || type || 'Error';\n}\n\n/**\n * Adds exception mechanism to a given event.\n * @param event The event to modify.\n * @param mechanism Mechanism of the mechanism.\n * @hidden\n */\nexport function addExceptionMechanism(\n event: Event,\n mechanism: {\n [key: string]: any;\n } = {},\n): void {\n // TODO: Use real type with `keyof Mechanism` thingy and maybe make it better?\n try {\n // @ts-ignore\n // tslint:disable:no-non-null-assertion\n event.exception!.values![0].mechanism = event.exception!.values![0].mechanism || {};\n Object.keys(mechanism).forEach(key => {\n // @ts-ignore\n event.exception!.values![0].mechanism[key] = mechanism[key];\n });\n } catch (_oO) {\n // no-empty\n }\n}\n\n/**\n * A safe form of location.href\n */\nexport function getLocationHref(): string {\n try {\n return document.location.href;\n } catch (oO) {\n return '';\n }\n}\n\n/**\n * Given a child DOM element, returns a query-selector statement describing that\n * and its ancestors\n * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz]\n * @returns generated DOM path\n */\nexport function htmlTreeAsString(elem: Node): string {\n // try/catch both:\n // - accessing event.target (see getsentry/raven-js#838, #768)\n // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly\n // - can throw an exception in some circumstances.\n try {\n let currentElem: Node | null = elem;\n const MAX_TRAVERSE_HEIGHT = 5;\n const MAX_OUTPUT_LEN = 80;\n const out = [];\n let height = 0;\n let len = 0;\n const separator = ' > ';\n const sepLength = separator.length;\n let nextStr;\n\n while (currentElem && height++ < MAX_TRAVERSE_HEIGHT) {\n nextStr = _htmlElementAsString(currentElem as HTMLElement);\n // bail out if\n // - nextStr is the 'html' element\n // - the length of the string that would be created exceeds MAX_OUTPUT_LEN\n // (ignore this limit if we are on the first iteration)\n if (nextStr === 'html' || (height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN)) {\n break;\n }\n\n out.push(nextStr);\n\n len += nextStr.length;\n currentElem = currentElem.parentNode;\n }\n\n return out.reverse().join(separator);\n } catch (_oO) {\n return '';\n }\n}\n\n/**\n * Returns a simple, query-selector representation of a DOM element\n * e.g. [HTMLElement] => input#foo.btn[name=baz]\n * @returns generated DOM path\n */\nfunction _htmlElementAsString(elem: HTMLElement): string {\n const out = [];\n let className;\n let classes;\n let key;\n let attr;\n let i;\n\n if (!elem || !elem.tagName) {\n return '';\n }\n\n out.push(elem.tagName.toLowerCase());\n if (elem.id) {\n out.push(`#${elem.id}`);\n }\n\n className = elem.className;\n if (className && isString(className)) {\n classes = className.split(/\\s+/);\n for (i = 0; i < classes.length; i++) {\n out.push(`.${classes[i]}`);\n }\n }\n const attrWhitelist = ['type', 'name', 'title', 'alt'];\n for (i = 0; i < attrWhitelist.length; i++) {\n key = attrWhitelist[i];\n attr = elem.getAttribute(key);\n if (attr) {\n out.push(`[${key}=\"${attr}\"]`);\n }\n }\n return out.join('');\n}\n","import { consoleSandbox, getGlobalObject } from './misc';\n\n// TODO: Implement different loggers for different environments\nconst global = getGlobalObject();\n\n/** Prefix for logging strings */\nconst PREFIX = 'Sentry Logger ';\n\n/** JSDoc */\nclass Logger {\n /** JSDoc */\n private _enabled: boolean;\n\n /** JSDoc */\n public constructor() {\n this._enabled = false;\n }\n\n /** JSDoc */\n public disable(): void {\n this._enabled = false;\n }\n\n /** JSDoc */\n public enable(): void {\n this._enabled = true;\n }\n\n /** JSDoc */\n public log(...args: any[]): void {\n if (!this._enabled) {\n return;\n }\n consoleSandbox(() => {\n global.console.log(`${PREFIX}[Log]: ${args.join(' ')}`); // tslint:disable-line:no-console\n });\n }\n\n /** JSDoc */\n public warn(...args: any[]): void {\n if (!this._enabled) {\n return;\n }\n consoleSandbox(() => {\n global.console.warn(`${PREFIX}[Warn]: ${args.join(' ')}`); // tslint:disable-line:no-console\n });\n }\n\n /** JSDoc */\n public error(...args: any[]): void {\n if (!this._enabled) {\n return;\n }\n consoleSandbox(() => {\n global.console.error(`${PREFIX}[Error]: ${args.join(' ')}`); // tslint:disable-line:no-console\n });\n }\n}\n\n// Ensure we only have a single logger instance, even if multiple versions of @sentry/utils are being used\nglobal.__SENTRY__ = global.__SENTRY__ || {};\nconst logger = (global.__SENTRY__.logger as Logger) || (global.__SENTRY__.logger = new Logger());\n\nexport { logger };\n","import { isThenable } from './is';\n\n/** SyncPromise internal states */\nenum States {\n /** Pending */\n PENDING = 'PENDING',\n /** Resolved / OK */\n RESOLVED = 'RESOLVED',\n /** Rejected / Error */\n REJECTED = 'REJECTED',\n}\n\n/**\n * Thenable class that behaves like a Promise and follows it's interface\n * but is not async internally\n */\nclass SyncPromise implements PromiseLike {\n private _state: States = States.PENDING;\n private _handlers: Array<{\n onfulfilled?: ((value: T) => T | PromiseLike) | null;\n onrejected?: ((reason: any) => any) | null;\n }> = [];\n private _value: any;\n\n public constructor(\n executor: (resolve: (value?: T | PromiseLike | null) => void, reject: (reason?: any) => void) => void,\n ) {\n try {\n executor(this._resolve, this._reject);\n } catch (e) {\n this._reject(e);\n }\n }\n\n /** JSDoc */\n public toString(): string {\n return '[object SyncPromise]';\n }\n\n /** JSDoc */\n public static resolve(value: T | PromiseLike): PromiseLike {\n return new SyncPromise(resolve => {\n resolve(value);\n });\n }\n\n /** JSDoc */\n public static reject(reason?: any): PromiseLike {\n return new SyncPromise((_, reject) => {\n reject(reason);\n });\n }\n\n /** JSDoc */\n public static all(collection: Array>): PromiseLike {\n return new SyncPromise((resolve, reject) => {\n if (!Array.isArray(collection)) {\n reject(new TypeError(`Promise.all requires an array as input.`));\n return;\n }\n\n if (collection.length === 0) {\n resolve([]);\n return;\n }\n\n let counter = collection.length;\n const resolvedCollection: U[] = [];\n\n collection.forEach((item, index) => {\n SyncPromise.resolve(item)\n .then(value => {\n resolvedCollection[index] = value;\n counter -= 1;\n\n if (counter !== 0) {\n return;\n }\n resolve(resolvedCollection);\n })\n .then(null, reject);\n });\n });\n }\n\n /** JSDoc */\n public then(\n onfulfilled?: ((value: T) => TResult1 | PromiseLike) | null,\n onrejected?: ((reason: any) => TResult2 | PromiseLike) | null,\n ): PromiseLike {\n return new SyncPromise((resolve, reject) => {\n this._attachHandler({\n onfulfilled: result => {\n if (!onfulfilled) {\n // TODO: ¯\\_(ツ)_/¯\n // TODO: FIXME\n resolve(result as any);\n return;\n }\n try {\n resolve(onfulfilled(result));\n return;\n } catch (e) {\n reject(e);\n return;\n }\n },\n onrejected: reason => {\n if (!onrejected) {\n reject(reason);\n return;\n }\n try {\n resolve(onrejected(reason));\n return;\n } catch (e) {\n reject(e);\n return;\n }\n },\n });\n });\n }\n\n /** JSDoc */\n public catch(\n onrejected?: ((reason: any) => TResult | PromiseLike) | null,\n ): PromiseLike {\n return this.then(val => val, onrejected);\n }\n\n /** JSDoc */\n public finally(onfinally?: (() => void) | null): PromiseLike {\n return new SyncPromise((resolve, reject) => {\n let val: TResult | any;\n let isRejected: boolean;\n\n return this.then(\n value => {\n isRejected = false;\n val = value;\n if (onfinally) {\n onfinally();\n }\n },\n reason => {\n isRejected = true;\n val = reason;\n if (onfinally) {\n onfinally();\n }\n },\n ).then(() => {\n if (isRejected) {\n reject(val);\n return;\n }\n\n // tslint:disable-next-line:no-unsafe-any\n resolve(val);\n });\n });\n }\n\n /** JSDoc */\n private readonly _resolve = (value?: T | PromiseLike | null) => {\n this._setResult(States.RESOLVED, value);\n };\n\n /** JSDoc */\n private readonly _reject = (reason?: any) => {\n this._setResult(States.REJECTED, reason);\n };\n\n /** JSDoc */\n private readonly _setResult = (state: States, value?: T | PromiseLike | any) => {\n if (this._state !== States.PENDING) {\n return;\n }\n\n if (isThenable(value)) {\n (value as PromiseLike).then(this._resolve, this._reject);\n return;\n }\n\n this._state = state;\n this._value = value;\n\n this._executeHandlers();\n };\n\n // TODO: FIXME\n /** JSDoc */\n private readonly _attachHandler = (handler: {\n /** JSDoc */\n onfulfilled?(value: T): any;\n /** JSDoc */\n onrejected?(reason: any): any;\n }) => {\n this._handlers = this._handlers.concat(handler);\n this._executeHandlers();\n };\n\n /** JSDoc */\n private readonly _executeHandlers = () => {\n if (this._state === States.PENDING) {\n return;\n }\n\n if (this._state === States.REJECTED) {\n this._handlers.forEach(handler => {\n if (handler.onrejected) {\n handler.onrejected(this._value);\n }\n });\n } else {\n this._handlers.forEach(handler => {\n if (handler.onfulfilled) {\n // tslint:disable-next-line:no-unsafe-any\n handler.onfulfilled(this._value);\n }\n });\n }\n\n this._handlers = [];\n };\n}\n\nexport { SyncPromise };\n","// tslint:disable:no-unsafe-any\n/**\n * Memo class used for decycle json objects. Uses WeakSet if available otherwise array.\n */\nexport class Memo {\n /** Determines if WeakSet is available */\n private readonly _hasWeakSet: boolean;\n /** Either WeakSet or Array */\n private readonly _inner: any;\n\n public constructor() {\n // tslint:disable-next-line\n this._hasWeakSet = typeof WeakSet === 'function';\n this._inner = this._hasWeakSet ? new WeakSet() : [];\n }\n\n /**\n * Sets obj to remember.\n * @param obj Object to remember\n */\n public memoize(obj: any): boolean {\n if (this._hasWeakSet) {\n if (this._inner.has(obj)) {\n return true;\n }\n this._inner.add(obj);\n return false;\n }\n // tslint:disable-next-line:prefer-for-of\n for (let i = 0; i < this._inner.length; i++) {\n const value = this._inner[i];\n if (value === obj) {\n return true;\n }\n }\n this._inner.push(obj);\n return false;\n }\n\n /**\n * Removes object from internal storage.\n * @param obj Object to forget\n */\n public unmemoize(obj: any): void {\n if (this._hasWeakSet) {\n this._inner.delete(obj);\n } else {\n for (let i = 0; i < this._inner.length; i++) {\n if (this._inner[i] === obj) {\n this._inner.splice(i, 1);\n break;\n }\n }\n }\n }\n}\n","import { isRegExp } from './is';\n\n/**\n * Truncates given string to the maximum characters count\n *\n * @param str An object that contains serializable values\n * @param max Maximum number of characters in truncated string\n * @returns string Encoded\n */\nexport function truncate(str: string, max: number = 0): string {\n // tslint:disable-next-line:strict-type-predicates\n if (typeof str !== 'string' || max === 0) {\n return str;\n }\n return str.length <= max ? str : `${str.substr(0, max)}...`;\n}\n\n/**\n * This is basically just `trim_line` from\n * https://github.com/getsentry/sentry/blob/master/src/sentry/lang/javascript/processor.py#L67\n *\n * @param str An object that contains serializable values\n * @param max Maximum number of characters in truncated string\n * @returns string Encoded\n */\n\nexport function snipLine(line: string, colno: number): string {\n let newLine = line;\n const ll = newLine.length;\n if (ll <= 150) {\n return newLine;\n }\n if (colno > ll) {\n colno = ll; // tslint:disable-line:no-parameter-reassignment\n }\n\n let start = Math.max(colno - 60, 0);\n if (start < 5) {\n start = 0;\n }\n\n let end = Math.min(start + 140, ll);\n if (end > ll - 5) {\n end = ll;\n }\n if (end === ll) {\n start = Math.max(end - 140, 0);\n }\n\n newLine = newLine.slice(start, end);\n if (start > 0) {\n newLine = `'{snip} ${newLine}`;\n }\n if (end < ll) {\n newLine += ' {snip}';\n }\n\n return newLine;\n}\n\n/**\n * Join values in array\n * @param input array of values to be joined together\n * @param delimiter string to be placed in-between values\n * @returns Joined values\n */\nexport function safeJoin(input: any[], delimiter?: string): string {\n if (!Array.isArray(input)) {\n return '';\n }\n\n const output = [];\n // tslint:disable-next-line:prefer-for-of\n for (let i = 0; i < input.length; i++) {\n const value = input[i];\n try {\n output.push(String(value));\n } catch (e) {\n output.push('[value cannot be serialized]');\n }\n }\n\n return output.join(delimiter);\n}\n\n/**\n * Checks if the value matches a regex or includes the string\n * @param value The string value to be checked against\n * @param pattern Either a regex or a string that must be contained in value\n */\nexport function isMatchingPattern(value: string, pattern: RegExp | string): boolean {\n if (isRegExp(pattern)) {\n return (pattern as RegExp).test(value);\n }\n if (typeof pattern === 'string') {\n return value.indexOf(pattern) !== -1;\n }\n return false;\n}\n","import { ExtendedError, WrappedFunction } from '@sentry/types';\n\nimport { isElement, isError, isEvent, isPrimitive, isSyntheticEvent } from './is';\nimport { Memo } from './memo';\nimport { htmlTreeAsString } from './misc';\nimport { truncate } from './string';\n\n/**\n * Wrap a given object method with a higher-order function\n *\n * @param source An object that contains a method to be wrapped.\n * @param name A name of method to be wrapped.\n * @param replacement A function that should be used to wrap a given method.\n * @returns void\n */\nexport function fill(source: { [key: string]: any }, name: string, replacement: (...args: any[]) => any): void {\n if (!(name in source)) {\n return;\n }\n\n const original = source[name] as () => any;\n const wrapped = replacement(original) as WrappedFunction;\n\n // Make sure it's a function first, as we need to attach an empty prototype for `defineProperties` to work\n // otherwise it'll throw \"TypeError: Object.defineProperties called on non-object\"\n // tslint:disable-next-line:strict-type-predicates\n if (typeof wrapped === 'function') {\n try {\n wrapped.prototype = wrapped.prototype || {};\n Object.defineProperties(wrapped, {\n __sentry__: {\n enumerable: false,\n value: true,\n },\n __sentry_original__: {\n enumerable: false,\n value: original,\n },\n __sentry_wrapped__: {\n enumerable: false,\n value: wrapped,\n },\n });\n } catch (_Oo) {\n // This can throw if multiple fill happens on a global object like XMLHttpRequest\n // Fixes https://github.com/getsentry/sentry-javascript/issues/2043\n }\n }\n\n source[name] = wrapped;\n}\n\n/**\n * Encodes given object into url-friendly format\n *\n * @param object An object that contains serializable values\n * @returns string Encoded\n */\nexport function urlEncode(object: { [key: string]: any }): string {\n return Object.keys(object)\n .map(\n // tslint:disable-next-line:no-unsafe-any\n key => `${encodeURIComponent(key)}=${encodeURIComponent(object[key])}`,\n )\n .join('&');\n}\n\n/**\n * Transforms any object into an object literal with all it's attributes\n * attached to it.\n *\n * @param value Initial source that we have to transform in order to be usable by the serializer\n */\nfunction getWalkSource(\n value: any,\n): {\n [key: string]: any;\n} {\n if (isError(value)) {\n const error = value as ExtendedError;\n const err: {\n stack: string | undefined;\n message: string;\n name: string;\n [key: string]: any;\n } = {\n message: error.message,\n name: error.name,\n stack: error.stack,\n };\n\n for (const i in error) {\n if (Object.prototype.hasOwnProperty.call(error, i)) {\n err[i] = error[i];\n }\n }\n\n return err;\n }\n\n if (isEvent(value)) {\n const source: {\n [key: string]: any;\n } = {};\n\n source.type = value.type;\n\n // Accessing event.target can throw (see getsentry/raven-js#838, #768)\n try {\n source.target = isElement(value.target)\n ? htmlTreeAsString(value.target)\n : Object.prototype.toString.call(value.target);\n } catch (_oO) {\n source.target = '';\n }\n\n try {\n source.currentTarget = isElement(value.currentTarget)\n ? htmlTreeAsString(value.currentTarget)\n : Object.prototype.toString.call(value.currentTarget);\n } catch (_oO) {\n source.currentTarget = '';\n }\n\n // tslint:disable-next-line:strict-type-predicates\n if (typeof CustomEvent !== 'undefined' && value instanceof CustomEvent) {\n source.detail = value.detail;\n }\n\n for (const i in value) {\n if (Object.prototype.hasOwnProperty.call(value, i)) {\n source[i] = (value as { [key: string]: any })[i];\n }\n }\n\n return source;\n }\n\n return value as {\n [key: string]: any;\n };\n}\n\n/** Calculates bytes size of input string */\nfunction utf8Length(value: string): number {\n // tslint:disable-next-line:no-bitwise\n return ~-encodeURI(value).split(/%..|./).length;\n}\n\n/** Calculates bytes size of input object */\nfunction jsonSize(value: any): number {\n return utf8Length(JSON.stringify(value));\n}\n\n/** JSDoc */\nexport function normalizeToSize(\n object: { [key: string]: any },\n // Default Node.js REPL depth\n depth: number = 3,\n // 100kB, as 200kB is max payload size, so half sounds reasonable\n maxSize: number = 100 * 1024,\n): T {\n const serialized = normalize(object, depth);\n\n if (jsonSize(serialized) > maxSize) {\n return normalizeToSize(object, depth - 1, maxSize);\n }\n\n return serialized as T;\n}\n\n/** Transforms any input value into a string form, either primitive value or a type of the input */\nfunction serializeValue(value: any): any {\n const type = Object.prototype.toString.call(value);\n\n // Node.js REPL notation\n if (typeof value === 'string') {\n return value;\n }\n if (type === '[object Object]') {\n return '[Object]';\n }\n if (type === '[object Array]') {\n return '[Array]';\n }\n\n const normalized = normalizeValue(value);\n return isPrimitive(normalized) ? normalized : type;\n}\n\n/**\n * normalizeValue()\n *\n * Takes unserializable input and make it serializable friendly\n *\n * - translates undefined/NaN values to \"[undefined]\"/\"[NaN]\" respectively,\n * - serializes Error objects\n * - filter global objects\n */\n// tslint:disable-next-line:cyclomatic-complexity\nfunction normalizeValue(value: T, key?: any): T | string {\n if (key === 'domain' && typeof value === 'object' && ((value as unknown) as { _events: any })._events) {\n return '[Domain]';\n }\n\n if (key === 'domainEmitter') {\n return '[DomainEmitter]';\n }\n\n if (typeof (global as any) !== 'undefined' && (value as unknown) === global) {\n return '[Global]';\n }\n\n if (typeof (window as any) !== 'undefined' && (value as unknown) === window) {\n return '[Window]';\n }\n\n if (typeof (document as any) !== 'undefined' && (value as unknown) === document) {\n return '[Document]';\n }\n\n // React's SyntheticEvent thingy\n if (isSyntheticEvent(value)) {\n return '[SyntheticEvent]';\n }\n\n // tslint:disable-next-line:no-tautology-expression\n if (typeof value === 'number' && value !== value) {\n return '[NaN]';\n }\n\n if (value === void 0) {\n return '[undefined]';\n }\n\n if (typeof value === 'function') {\n return `[Function: ${value.name || ''}]`;\n }\n\n return value;\n}\n\n/**\n * Walks an object to perform a normalization on it\n *\n * @param key of object that's walked in current iteration\n * @param value object to be walked\n * @param depth Optional number indicating how deep should walking be performed\n * @param memo Optional Memo class handling decycling\n */\nexport function walk(key: string, value: any, depth: number = +Infinity, memo: Memo = new Memo()): any {\n // If we reach the maximum depth, serialize whatever has left\n if (depth === 0) {\n return serializeValue(value);\n }\n\n // If value implements `toJSON` method, call it and return early\n // tslint:disable:no-unsafe-any\n if (value !== null && value !== undefined && typeof value.toJSON === 'function') {\n return value.toJSON();\n }\n // tslint:enable:no-unsafe-any\n\n // If normalized value is a primitive, there are no branches left to walk, so we can just bail out, as theres no point in going down that branch any further\n const normalized = normalizeValue(value, key);\n if (isPrimitive(normalized)) {\n return normalized;\n }\n\n // Create source that we will use for next itterations, either objectified error object (Error type with extracted keys:value pairs) or the input itself\n const source = getWalkSource(value);\n\n // Create an accumulator that will act as a parent for all future itterations of that branch\n const acc = Array.isArray(value) ? [] : {};\n\n // If we already walked that branch, bail out, as it's circular reference\n if (memo.memoize(value)) {\n return '[Circular ~]';\n }\n\n // Walk all keys of the source\n for (const innerKey in source) {\n // Avoid iterating over fields in the prototype if they've somehow been exposed to enumeration.\n if (!Object.prototype.hasOwnProperty.call(source, innerKey)) {\n continue;\n }\n // Recursively walk through all the child nodes\n (acc as { [key: string]: any })[innerKey] = walk(innerKey, source[innerKey], depth - 1, memo);\n }\n\n // Once walked through all the branches, remove the parent from memo storage\n memo.unmemoize(value);\n\n // Return accumulated values\n return acc;\n}\n\n/**\n * normalize()\n *\n * - Creates a copy to prevent original input mutation\n * - Skip non-enumerablers\n * - Calls `toJSON` if implemented\n * - Removes circular references\n * - Translates non-serializeable values (undefined/NaN/Functions) to serializable format\n * - Translates known global objects/Classes to a string representations\n * - Takes care of Error objects serialization\n * - Optionally limit depth of final output\n */\nexport function normalize(input: any, depth?: number): any {\n try {\n // tslint:disable-next-line:no-unsafe-any\n return JSON.parse(JSON.stringify(input, (key: string, value: any) => walk(key, value, depth)));\n } catch (_oO) {\n return '**non-serializable**';\n }\n}\n\n/**\n * Given any captured exception, extract its keys and create a sorted\n * and truncated list that will be used inside the event message.\n * eg. `Non-error exception captured with keys: foo, bar, baz`\n */\nexport function extractExceptionKeysForMessage(exception: any, maxLength: number = 40): string {\n // tslint:disable:strict-type-predicates\n const keys = Object.keys(getWalkSource(exception));\n keys.sort();\n\n if (!keys.length) {\n return '[object has no keys]';\n }\n\n if (keys[0].length >= maxLength) {\n return truncate(keys[0], maxLength);\n }\n\n for (let includedKeys = keys.length; includedKeys > 0; includedKeys--) {\n const serialized = keys.slice(0, includedKeys).join(', ');\n if (serialized.length > maxLength) {\n continue;\n }\n if (includedKeys === keys.length) {\n return serialized;\n }\n return truncate(serialized, maxLength);\n }\n\n return '';\n}\n","import { SentryError } from './error';\nimport { SyncPromise } from './syncpromise';\n\n/** A simple queue that holds promises. */\nexport class PromiseBuffer {\n public constructor(protected _limit?: number) {}\n\n /** Internal set of queued Promises */\n private readonly _buffer: Array> = [];\n\n /**\n * Says if the buffer is ready to take more requests\n */\n public isReady(): boolean {\n return this._limit === undefined || this.length() < this._limit;\n }\n\n /**\n * Add a promise to the queue.\n *\n * @param task Can be any PromiseLike\n * @returns The original promise.\n */\n public add(task: PromiseLike): PromiseLike {\n if (!this.isReady()) {\n return SyncPromise.reject(new SentryError('Not adding Promise due to buffer limit reached.'));\n }\n if (this._buffer.indexOf(task) === -1) {\n this._buffer.push(task);\n }\n task\n .then(() => this.remove(task))\n .then(null, () =>\n this.remove(task).then(null, () => {\n // We have to add this catch here otherwise we have an unhandledPromiseRejection\n // because it's a new Promise chain.\n }),\n );\n return task;\n }\n\n /**\n * Remove a promise to the queue.\n *\n * @param task Can be any PromiseLike\n * @returns Removed promise.\n */\n public remove(task: PromiseLike): PromiseLike {\n const removedTask = this._buffer.splice(this._buffer.indexOf(task), 1)[0];\n return removedTask;\n }\n\n /**\n * This function returns the number of unresolved promises in the queue.\n */\n public length(): number {\n return this._buffer.length;\n }\n\n /**\n * This will drain the whole queue, returns true if queue is empty or drained.\n * If timeout is provided and the queue takes longer to drain, the promise still resolves but with false.\n *\n * @param timeout Number in ms to wait until it resolves with false.\n */\n public drain(timeout?: number): PromiseLike {\n return new SyncPromise(resolve => {\n const capturedSetTimeout = setTimeout(() => {\n if (timeout && timeout > 0) {\n resolve(false);\n }\n }, timeout);\n SyncPromise.all(this._buffer)\n .then(() => {\n clearTimeout(capturedSetTimeout);\n resolve(true);\n })\n .then(null, () => {\n resolve(true);\n });\n });\n }\n}\n","import { logger } from './logger';\nimport { getGlobalObject } from './misc';\n\n/**\n * Tells whether current environment supports ErrorEvent objects\n * {@link supportsErrorEvent}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsErrorEvent(): boolean {\n try {\n // tslint:disable:no-unused-expression\n new ErrorEvent('');\n return true;\n } catch (e) {\n return false;\n }\n}\n\n/**\n * Tells whether current environment supports DOMError objects\n * {@link supportsDOMError}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsDOMError(): boolean {\n try {\n // It really needs 1 argument, not 0.\n // Chrome: VM89:1 Uncaught TypeError: Failed to construct 'DOMError':\n // 1 argument required, but only 0 present.\n // @ts-ignore\n // tslint:disable:no-unused-expression\n new DOMError('');\n return true;\n } catch (e) {\n return false;\n }\n}\n\n/**\n * Tells whether current environment supports DOMException objects\n * {@link supportsDOMException}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsDOMException(): boolean {\n try {\n // tslint:disable:no-unused-expression\n new DOMException('');\n return true;\n } catch (e) {\n return false;\n }\n}\n\n/**\n * Tells whether current environment supports Fetch API\n * {@link supportsFetch}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsFetch(): boolean {\n if (!('fetch' in getGlobalObject())) {\n return false;\n }\n\n try {\n // tslint:disable-next-line:no-unused-expression\n new Headers();\n // tslint:disable-next-line:no-unused-expression\n new Request('');\n // tslint:disable-next-line:no-unused-expression\n new Response();\n return true;\n } catch (e) {\n return false;\n }\n}\n\n/**\n * Tells whether current environment supports Fetch API natively\n * {@link supportsNativeFetch}.\n *\n * @returns true if `window.fetch` is natively implemented, false otherwise\n */\nexport function supportsNativeFetch(): boolean {\n if (!supportsFetch()) {\n return false;\n }\n\n const isNativeFunc = (func: Function) => func.toString().indexOf('native') !== -1;\n const global = getGlobalObject();\n let result = null;\n const doc = global.document;\n if (doc) {\n const sandbox = doc.createElement('iframe');\n sandbox.hidden = true;\n try {\n doc.head.appendChild(sandbox);\n if (sandbox.contentWindow && sandbox.contentWindow.fetch) {\n // tslint:disable-next-line no-unbound-method\n result = isNativeFunc(sandbox.contentWindow.fetch);\n }\n doc.head.removeChild(sandbox);\n } catch (err) {\n logger.warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', err);\n }\n }\n\n if (result === null) {\n // tslint:disable-next-line no-unbound-method\n result = isNativeFunc(global.fetch);\n }\n\n return result;\n}\n\n/**\n * Tells whether current environment supports ReportingObserver API\n * {@link supportsReportingObserver}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsReportingObserver(): boolean {\n // tslint:disable-next-line: no-unsafe-any\n return 'ReportingObserver' in getGlobalObject();\n}\n\n/**\n * Tells whether current environment supports Referrer Policy API\n * {@link supportsReferrerPolicy}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsReferrerPolicy(): boolean {\n // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default\n // https://caniuse.com/#feat=referrer-policy\n // It doesn't. And it throw exception instead of ignoring this parameter...\n // REF: https://github.com/getsentry/raven-js/issues/1233\n\n if (!supportsFetch()) {\n return false;\n }\n\n try {\n // tslint:disable:no-unused-expression\n new Request('_', {\n referrerPolicy: 'origin' as ReferrerPolicy,\n });\n return true;\n } catch (e) {\n return false;\n }\n}\n\n/**\n * Tells whether current environment supports History API\n * {@link supportsHistory}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsHistory(): boolean {\n // NOTE: in Chrome App environment, touching history.pushState, *even inside\n // a try/catch block*, will cause Chrome to output an error to console.error\n // borrowed from: https://github.com/angular/angular.js/pull/13945/files\n const global = getGlobalObject();\n const chrome = (global as any).chrome;\n // tslint:disable-next-line:no-unsafe-any\n const isChromePackagedApp = chrome && chrome.app && chrome.app.runtime;\n const hasHistoryApi = 'history' in global && !!global.history.pushState && !!global.history.replaceState;\n\n return !isChromePackagedApp && hasHistoryApi;\n}\n","import { Span as SpanInterface } from '@sentry/types';\nimport { uuid4 } from '@sentry/utils';\n\nexport const TRACEPARENT_REGEXP = /^[ \\t]*([0-9a-f]{32})?-?([0-9a-f]{16})?-?([01])?[ \\t]*$/;\n\n/**\n * Span containg all data about a span\n */\nexport class Span implements SpanInterface {\n public constructor(\n private readonly _traceId: string = uuid4(),\n private readonly _spanId: string = uuid4().substring(16),\n private _sampled?: boolean,\n private _parent?: Span,\n ) {}\n\n /**\n * Setter for parent\n */\n public setParent(parent: Span | undefined): this {\n this._parent = parent;\n return this;\n }\n\n /**\n * Setter for sampled\n */\n public setSampled(sampled: boolean | undefined): this {\n this._sampled = sampled;\n return this;\n }\n\n /**\n * Continues a trace\n * @param traceparent Traceparent string\n */\n public static fromTraceparent(traceparent: string): Span | undefined {\n const matches = traceparent.match(TRACEPARENT_REGEXP);\n if (matches) {\n let sampled;\n if (matches[3] === '1') {\n sampled = true;\n } else if (matches[3] === '0') {\n sampled = false;\n }\n const parent = new Span(matches[1], matches[2], sampled);\n return new Span(matches[1], undefined, sampled, parent);\n }\n return undefined;\n }\n\n /**\n * @inheritDoc\n */\n public toTraceparent(): string {\n let sampled = '';\n if (this._sampled === true) {\n sampled = '-1';\n } else if (this._sampled === false) {\n sampled = '-0';\n }\n\n return `${this._traceId}-${this._spanId}${sampled}`;\n }\n\n /**\n * @inheritDoc\n */\n public toJSON(): object {\n return {\n parent: (this._parent && this._parent.toJSON()) || undefined,\n sampled: this._sampled,\n span_id: this._spanId,\n trace_id: this._traceId,\n };\n }\n}\n","import { Breadcrumb, Event, EventHint, EventProcessor, Scope as ScopeInterface, Severity, User } from '@sentry/types';\nimport { getGlobalObject, isThenable, normalize, SyncPromise } from '@sentry/utils';\n\nimport { Span } from './span';\n\n/**\n * Holds additional event information. {@link Scope.applyToEvent} will be\n * called by the client before an event will be sent.\n */\nexport class Scope implements ScopeInterface {\n /** Flag if notifiying is happening. */\n protected _notifyingListeners: boolean = false;\n\n /** Callback for client to receive scope changes. */\n protected _scopeListeners: Array<(scope: Scope) => void> = [];\n\n /** Callback list that will be called after {@link applyToEvent}. */\n protected _eventProcessors: EventProcessor[] = [];\n\n /** Array of breadcrumbs. */\n protected _breadcrumbs: Breadcrumb[] = [];\n\n /** User */\n protected _user: User = {};\n\n /** Tags */\n protected _tags: { [key: string]: string } = {};\n\n /** Extra */\n protected _extra: { [key: string]: any } = {};\n\n /** Contexts */\n protected _context: { [key: string]: any } = {};\n\n /** Fingerprint */\n protected _fingerprint?: string[];\n\n /** Severity */\n protected _level?: Severity;\n\n /** Transaction */\n protected _transaction?: string;\n\n /** Span */\n protected _span?: Span;\n\n /**\n * Add internal on change listener. Used for sub SDKs that need to store the scope.\n * @hidden\n */\n public addScopeListener(callback: (scope: Scope) => void): void {\n this._scopeListeners.push(callback);\n }\n\n /**\n * @inheritDoc\n */\n public addEventProcessor(callback: EventProcessor): this {\n this._eventProcessors.push(callback);\n return this;\n }\n\n /**\n * This will be called on every set call.\n */\n protected _notifyScopeListeners(): void {\n if (!this._notifyingListeners) {\n this._notifyingListeners = true;\n setTimeout(() => {\n this._scopeListeners.forEach(callback => {\n callback(this);\n });\n this._notifyingListeners = false;\n });\n }\n }\n\n /**\n * This will be called after {@link applyToEvent} is finished.\n */\n protected _notifyEventProcessors(\n processors: EventProcessor[],\n event: Event | null,\n hint?: EventHint,\n index: number = 0,\n ): PromiseLike {\n return new SyncPromise((resolve, reject) => {\n const processor = processors[index];\n // tslint:disable-next-line:strict-type-predicates\n if (event === null || typeof processor !== 'function') {\n resolve(event);\n } else {\n const result = processor({ ...event }, hint) as Event | null;\n if (isThenable(result)) {\n (result as PromiseLike)\n .then(final => this._notifyEventProcessors(processors, final, hint, index + 1).then(resolve))\n .then(null, reject);\n } else {\n this._notifyEventProcessors(processors, result, hint, index + 1)\n .then(resolve)\n .then(null, reject);\n }\n }\n });\n }\n\n /**\n * @inheritDoc\n */\n public setUser(user: User | null): this {\n this._user = normalize(user);\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public setTags(tags: { [key: string]: string }): this {\n this._tags = {\n ...this._tags,\n ...normalize(tags),\n };\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public setTag(key: string, value: string): this {\n this._tags = { ...this._tags, [key]: normalize(value) };\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public setExtras(extra: { [key: string]: any }): this {\n this._extra = {\n ...this._extra,\n ...normalize(extra),\n };\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public setExtra(key: string, extra: any): this {\n this._extra = { ...this._extra, [key]: normalize(extra) };\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public setFingerprint(fingerprint: string[]): this {\n this._fingerprint = normalize(fingerprint);\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public setLevel(level: Severity): this {\n this._level = normalize(level);\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public setTransaction(transaction?: string): this {\n this._transaction = transaction;\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public setContext(name: string, context: { [key: string]: any } | null): this {\n this._context[name] = context ? normalize(context) : undefined;\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public setSpan(span?: Span): this {\n this._span = span;\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public startSpan(parentSpan?: Span): Span {\n const span = new Span();\n span.setParent(parentSpan);\n this.setSpan(span);\n return span;\n }\n\n /**\n * Internal getter for Span, used in Hub.\n * @hidden\n */\n public getSpan(): Span | undefined {\n return this._span;\n }\n\n /**\n * Inherit values from the parent scope.\n * @param scope to clone.\n */\n public static clone(scope?: Scope): Scope {\n const newScope = new Scope();\n if (scope) {\n newScope._breadcrumbs = [...scope._breadcrumbs];\n newScope._tags = { ...scope._tags };\n newScope._extra = { ...scope._extra };\n newScope._context = { ...scope._context };\n newScope._user = scope._user;\n newScope._level = scope._level;\n newScope._span = scope._span;\n newScope._transaction = scope._transaction;\n newScope._fingerprint = scope._fingerprint;\n newScope._eventProcessors = [...scope._eventProcessors];\n }\n return newScope;\n }\n\n /**\n * @inheritDoc\n */\n public clear(): this {\n this._breadcrumbs = [];\n this._tags = {};\n this._extra = {};\n this._user = {};\n this._context = {};\n this._level = undefined;\n this._transaction = undefined;\n this._fingerprint = undefined;\n this._span = undefined;\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public addBreadcrumb(breadcrumb: Breadcrumb, maxBreadcrumbs?: number): this {\n const timestamp = new Date().getTime() / 1000;\n const mergedBreadcrumb = { timestamp, ...breadcrumb };\n\n this._breadcrumbs =\n maxBreadcrumbs !== undefined && maxBreadcrumbs >= 0\n ? [...this._breadcrumbs, normalize(mergedBreadcrumb)].slice(-maxBreadcrumbs)\n : [...this._breadcrumbs, normalize(mergedBreadcrumb)];\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public clearBreadcrumbs(): this {\n this._breadcrumbs = [];\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * Applies fingerprint from the scope to the event if there's one,\n * uses message if there's one instead or get rid of empty fingerprint\n */\n private _applyFingerprint(event: Event): void {\n // Make sure it's an array first and we actually have something in place\n event.fingerprint = event.fingerprint\n ? Array.isArray(event.fingerprint)\n ? event.fingerprint\n : [event.fingerprint]\n : [];\n\n // If we have something on the scope, then merge it with event\n if (this._fingerprint) {\n event.fingerprint = event.fingerprint.concat(this._fingerprint);\n }\n\n // If we have no data at all, remove empty array default\n if (event.fingerprint && !event.fingerprint.length) {\n delete event.fingerprint;\n }\n }\n\n /**\n * Applies the current context and fingerprint to the event.\n * Note that breadcrumbs will be added by the client.\n * Also if the event has already breadcrumbs on it, we do not merge them.\n * @param event Event\n * @param hint May contain additional informartion about the original exception.\n * @hidden\n */\n public applyToEvent(event: Event, hint?: EventHint): PromiseLike {\n if (this._extra && Object.keys(this._extra).length) {\n event.extra = { ...this._extra, ...event.extra };\n }\n if (this._tags && Object.keys(this._tags).length) {\n event.tags = { ...this._tags, ...event.tags };\n }\n if (this._user && Object.keys(this._user).length) {\n event.user = { ...this._user, ...event.user };\n }\n if (this._context && Object.keys(this._context).length) {\n event.contexts = { ...this._context, ...event.contexts };\n }\n if (this._level) {\n event.level = this._level;\n }\n if (this._transaction) {\n event.transaction = this._transaction;\n }\n if (this._span) {\n event.contexts = event.contexts || {};\n event.contexts.trace = this._span;\n }\n\n this._applyFingerprint(event);\n\n event.breadcrumbs = [...(event.breadcrumbs || []), ...this._breadcrumbs];\n event.breadcrumbs = event.breadcrumbs.length > 0 ? event.breadcrumbs : undefined;\n\n return this._notifyEventProcessors([...getGlobalEventProcessors(), ...this._eventProcessors], event, hint);\n }\n}\n\n/**\n * Retruns the global event processors.\n */\nfunction getGlobalEventProcessors(): EventProcessor[] {\n const global = getGlobalObject();\n global.__SENTRY__ = global.__SENTRY__ || {};\n global.__SENTRY__.globalEventProcessors = global.__SENTRY__.globalEventProcessors || [];\n return global.__SENTRY__.globalEventProcessors;\n}\n\n/**\n * Add a EventProcessor to be kept globally.\n * @param callback EventProcessor to add\n */\nexport function addGlobalEventProcessor(callback: EventProcessor): void {\n getGlobalEventProcessors().push(callback);\n}\n","import {\n Breadcrumb,\n BreadcrumbHint,\n Client,\n Event,\n EventHint,\n Hub as HubInterface,\n Integration,\n IntegrationClass,\n Severity,\n User,\n} from '@sentry/types';\nimport { consoleSandbox, dynamicRequire, getGlobalObject, isNodeEnv, logger, uuid4 } from '@sentry/utils';\n\nimport { Carrier, Layer } from './interfaces';\nimport { Scope } from './scope';\n\ndeclare module 'domain' {\n export let active: Domain;\n /**\n * Extension for domain interface\n */\n export interface Domain {\n __SENTRY__?: Carrier;\n }\n}\n\n/**\n * API compatibility version of this hub.\n *\n * WARNING: This number should only be incresed when the global interface\n * changes a and new methods are introduced.\n *\n * @hidden\n */\nexport const API_VERSION = 3;\n\n/**\n * Default maximum number of breadcrumbs added to an event. Can be overwritten\n * with {@link Options.maxBreadcrumbs}.\n */\nconst DEFAULT_BREADCRUMBS = 30;\n\n/**\n * Absolute maximum number of breadcrumbs added to an event. The\n * `maxBreadcrumbs` option cannot be higher than this value.\n */\nconst MAX_BREADCRUMBS = 100;\n\n/**\n * @inheritDoc\n */\nexport class Hub implements HubInterface {\n /** Is a {@link Layer}[] containing the client and scope */\n private readonly _stack: Layer[] = [];\n\n /** Contains the last event id of a captured event. */\n private _lastEventId?: string;\n\n /**\n * Creates a new instance of the hub, will push one {@link Layer} into the\n * internal stack on creation.\n *\n * @param client bound to the hub.\n * @param scope bound to the hub.\n * @param version number, higher number means higher priority.\n */\n public constructor(client?: Client, scope: Scope = new Scope(), private readonly _version: number = API_VERSION) {\n this._stack.push({ client, scope });\n }\n\n /**\n * Internal helper function to call a method on the top client if it exists.\n *\n * @param method The method to call on the client.\n * @param args Arguments to pass to the client function.\n */\n private _invokeClient(method: M, ...args: any[]): void {\n const top = this.getStackTop();\n if (top && top.client && top.client[method]) {\n (top.client as any)[method](...args, top.scope);\n }\n }\n\n /**\n * @inheritDoc\n */\n public isOlderThan(version: number): boolean {\n return this._version < version;\n }\n\n /**\n * @inheritDoc\n */\n public bindClient(client?: Client): void {\n const top = this.getStackTop();\n top.client = client;\n }\n\n /**\n * @inheritDoc\n */\n public pushScope(): Scope {\n // We want to clone the content of prev scope\n const stack = this.getStack();\n const parentScope = stack.length > 0 ? stack[stack.length - 1].scope : undefined;\n const scope = Scope.clone(parentScope);\n this.getStack().push({\n client: this.getClient(),\n scope,\n });\n return scope;\n }\n\n /**\n * @inheritDoc\n */\n public popScope(): boolean {\n return this.getStack().pop() !== undefined;\n }\n\n /**\n * @inheritDoc\n */\n public withScope(callback: (scope: Scope) => void): void {\n const scope = this.pushScope();\n try {\n callback(scope);\n } finally {\n this.popScope();\n }\n }\n\n /**\n * @inheritDoc\n */\n public getClient(): C | undefined {\n return this.getStackTop().client as C;\n }\n\n /** Returns the scope of the top stack. */\n public getScope(): Scope | undefined {\n return this.getStackTop().scope;\n }\n\n /** Returns the scope stack for domains or the process. */\n public getStack(): Layer[] {\n return this._stack;\n }\n\n /** Returns the topmost scope layer in the order domain > local > process. */\n public getStackTop(): Layer {\n return this._stack[this._stack.length - 1];\n }\n\n /**\n * @inheritDoc\n */\n public captureException(exception: any, hint?: EventHint): string {\n const eventId = (this._lastEventId = uuid4());\n let finalHint = hint;\n\n // If there's no explicit hint provided, mimick the same thing that would happen\n // in the minimal itself to create a consistent behavior.\n // We don't do this in the client, as it's the lowest level API, and doing this,\n // would prevent user from having full control over direct calls.\n if (!hint) {\n let syntheticException: Error;\n try {\n throw new Error('Sentry syntheticException');\n } catch (exception) {\n syntheticException = exception as Error;\n }\n finalHint = {\n originalException: exception,\n syntheticException,\n };\n }\n\n this._invokeClient('captureException', exception, {\n ...finalHint,\n event_id: eventId,\n });\n return eventId;\n }\n\n /**\n * @inheritDoc\n */\n public captureMessage(message: string, level?: Severity, hint?: EventHint): string {\n const eventId = (this._lastEventId = uuid4());\n let finalHint = hint;\n\n // If there's no explicit hint provided, mimick the same thing that would happen\n // in the minimal itself to create a consistent behavior.\n // We don't do this in the client, as it's the lowest level API, and doing this,\n // would prevent user from having full control over direct calls.\n if (!hint) {\n let syntheticException: Error;\n try {\n throw new Error(message);\n } catch (exception) {\n syntheticException = exception as Error;\n }\n finalHint = {\n originalException: message,\n syntheticException,\n };\n }\n\n this._invokeClient('captureMessage', message, level, {\n ...finalHint,\n event_id: eventId,\n });\n return eventId;\n }\n\n /**\n * @inheritDoc\n */\n public captureEvent(event: Event, hint?: EventHint): string {\n const eventId = (this._lastEventId = uuid4());\n this._invokeClient('captureEvent', event, {\n ...hint,\n event_id: eventId,\n });\n return eventId;\n }\n\n /**\n * @inheritDoc\n */\n public lastEventId(): string | undefined {\n return this._lastEventId;\n }\n\n /**\n * @inheritDoc\n */\n public addBreadcrumb(breadcrumb: Breadcrumb, hint?: BreadcrumbHint): void {\n const top = this.getStackTop();\n\n if (!top.scope || !top.client) {\n return;\n }\n\n const { beforeBreadcrumb = null, maxBreadcrumbs = DEFAULT_BREADCRUMBS } =\n (top.client.getOptions && top.client.getOptions()) || {};\n\n if (maxBreadcrumbs <= 0) {\n return;\n }\n\n const timestamp = new Date().getTime() / 1000;\n const mergedBreadcrumb = { timestamp, ...breadcrumb };\n const finalBreadcrumb = beforeBreadcrumb\n ? (consoleSandbox(() => beforeBreadcrumb(mergedBreadcrumb, hint)) as Breadcrumb | null)\n : mergedBreadcrumb;\n\n if (finalBreadcrumb === null) {\n return;\n }\n\n top.scope.addBreadcrumb(finalBreadcrumb, Math.min(maxBreadcrumbs, MAX_BREADCRUMBS));\n }\n\n /**\n * @inheritDoc\n */\n public setUser(user: User | null): void {\n const top = this.getStackTop();\n if (!top.scope) {\n return;\n }\n top.scope.setUser(user);\n }\n\n /**\n * @inheritDoc\n */\n public setTags(tags: { [key: string]: string }): void {\n const top = this.getStackTop();\n if (!top.scope) {\n return;\n }\n top.scope.setTags(tags);\n }\n\n /**\n * @inheritDoc\n */\n public setExtras(extras: { [key: string]: any }): void {\n const top = this.getStackTop();\n if (!top.scope) {\n return;\n }\n top.scope.setExtras(extras);\n }\n\n /**\n * @inheritDoc\n */\n public setTag(key: string, value: string): void {\n const top = this.getStackTop();\n if (!top.scope) {\n return;\n }\n top.scope.setTag(key, value);\n }\n\n /**\n * @inheritDoc\n */\n public setExtra(key: string, extra: any): void {\n const top = this.getStackTop();\n if (!top.scope) {\n return;\n }\n top.scope.setExtra(key, extra);\n }\n\n /**\n * @inheritDoc\n */\n public setContext(name: string, context: { [key: string]: any } | null): void {\n const top = this.getStackTop();\n if (!top.scope) {\n return;\n }\n top.scope.setContext(name, context);\n }\n\n /**\n * @inheritDoc\n */\n public configureScope(callback: (scope: Scope) => void): void {\n const top = this.getStackTop();\n if (top.scope && top.client) {\n callback(top.scope);\n }\n }\n\n /**\n * @inheritDoc\n */\n public run(callback: (hub: Hub) => void): void {\n const oldHub = makeMain(this);\n try {\n callback(this);\n } finally {\n makeMain(oldHub);\n }\n }\n\n /**\n * @inheritDoc\n */\n public getIntegration(integration: IntegrationClass): T | null {\n const client = this.getClient();\n if (!client) {\n return null;\n }\n try {\n return client.getIntegration(integration);\n } catch (_oO) {\n logger.warn(`Cannot retrieve integration ${integration.id} from the current Hub`);\n return null;\n }\n }\n\n /**\n * @inheritDoc\n */\n public traceHeaders(): { [key: string]: string } {\n const top = this.getStackTop();\n if (top.scope && top.client) {\n const span = top.scope.getSpan();\n if (span) {\n return {\n 'sentry-trace': span.toTraceparent(),\n };\n }\n }\n return {};\n }\n}\n\n/** Returns the global shim registry. */\nexport function getMainCarrier(): Carrier {\n const carrier = getGlobalObject();\n carrier.__SENTRY__ = carrier.__SENTRY__ || {\n hub: undefined,\n };\n return carrier;\n}\n\n/**\n * Replaces the current main hub with the passed one on the global object\n *\n * @returns The old replaced hub\n */\nexport function makeMain(hub: Hub): Hub {\n const registry = getMainCarrier();\n const oldHub = getHubFromCarrier(registry);\n setHubOnCarrier(registry, hub);\n return oldHub;\n}\n\n/**\n * Returns the default hub instance.\n *\n * If a hub is already registered in the global carrier but this module\n * contains a more recent version, it replaces the registered version.\n * Otherwise, the currently registered hub will be returned.\n */\nexport function getCurrentHub(): Hub {\n // Get main carrier (global for every environment)\n const registry = getMainCarrier();\n\n // If there's no hub, or its an old API, assign a new one\n if (!hasHubOnCarrier(registry) || getHubFromCarrier(registry).isOlderThan(API_VERSION)) {\n setHubOnCarrier(registry, new Hub());\n }\n\n // Prefer domains over global if they are there (applicable only to Node environment)\n if (isNodeEnv()) {\n return getHubFromActiveDomain(registry);\n }\n // Return hub that lives on a global object\n return getHubFromCarrier(registry);\n}\n\n/**\n * Try to read the hub from an active domain, fallback to the registry if one doesnt exist\n * @returns discovered hub\n */\nfunction getHubFromActiveDomain(registry: Carrier): Hub {\n try {\n // We need to use `dynamicRequire` because `require` on it's own will be optimized by webpack.\n // We do not want this to happen, we need to try to `require` the domain node module and fail if we are in browser\n // for example so we do not have to shim it and use `getCurrentHub` universally.\n const domain = dynamicRequire(module, 'domain');\n const activeDomain = domain.active;\n\n // If there no active domain, just return global hub\n if (!activeDomain) {\n return getHubFromCarrier(registry);\n }\n\n // If there's no hub on current domain, or its an old API, assign a new one\n if (!hasHubOnCarrier(activeDomain) || getHubFromCarrier(activeDomain).isOlderThan(API_VERSION)) {\n const registryHubTopStack = getHubFromCarrier(registry).getStackTop();\n setHubOnCarrier(activeDomain, new Hub(registryHubTopStack.client, Scope.clone(registryHubTopStack.scope)));\n }\n\n // Return hub that lives on a domain\n return getHubFromCarrier(activeDomain);\n } catch (_Oo) {\n // Return hub that lives on a global object\n return getHubFromCarrier(registry);\n }\n}\n\n/**\n * This will tell whether a carrier has a hub on it or not\n * @param carrier object\n */\nfunction hasHubOnCarrier(carrier: Carrier): boolean {\n if (carrier && carrier.__SENTRY__ && carrier.__SENTRY__.hub) {\n return true;\n }\n return false;\n}\n\n/**\n * This will create a new {@link Hub} and add to the passed object on\n * __SENTRY__.hub.\n * @param carrier object\n * @hidden\n */\nexport function getHubFromCarrier(carrier: Carrier): Hub {\n if (carrier && carrier.__SENTRY__ && carrier.__SENTRY__.hub) {\n return carrier.__SENTRY__.hub;\n }\n carrier.__SENTRY__ = carrier.__SENTRY__ || {};\n carrier.__SENTRY__.hub = new Hub();\n return carrier.__SENTRY__.hub;\n}\n\n/**\n * This will set passed {@link Hub} on the passed object's __SENTRY__.hub attribute\n * @param carrier object\n * @param hub Hub\n */\nexport function setHubOnCarrier(carrier: Carrier, hub: Hub): boolean {\n if (!carrier) {\n return false;\n }\n carrier.__SENTRY__ = carrier.__SENTRY__ || {};\n carrier.__SENTRY__.hub = hub;\n return true;\n}\n","import { getCurrentHub, Hub, Scope } from '@sentry/hub';\nimport { Breadcrumb, Event, Severity, User } from '@sentry/types';\n\n/**\n * This calls a function on the current hub.\n * @param method function to call on hub.\n * @param args to pass to function.\n */\nfunction callOnHub(method: string, ...args: any[]): T {\n const hub = getCurrentHub();\n if (hub && hub[method as keyof Hub]) {\n // tslint:disable-next-line:no-unsafe-any\n return (hub[method as keyof Hub] as any)(...args);\n }\n throw new Error(`No hub defined or ${method} was not found on the hub, please open a bug report.`);\n}\n\n/**\n * Captures an exception event and sends it to Sentry.\n *\n * @param exception An exception-like object.\n * @returns The generated eventId.\n */\nexport function captureException(exception: any): string {\n let syntheticException: Error;\n try {\n throw new Error('Sentry syntheticException');\n } catch (exception) {\n syntheticException = exception as Error;\n }\n return callOnHub('captureException', exception, {\n originalException: exception,\n syntheticException,\n });\n}\n\n/**\n * Captures a message event and sends it to Sentry.\n *\n * @param message The message to send to Sentry.\n * @param level Define the level of the message.\n * @returns The generated eventId.\n */\nexport function captureMessage(message: string, level?: Severity): string {\n let syntheticException: Error;\n try {\n throw new Error(message);\n } catch (exception) {\n syntheticException = exception as Error;\n }\n return callOnHub('captureMessage', message, level, {\n originalException: message,\n syntheticException,\n });\n}\n\n/**\n * Captures a manually created event and sends it to Sentry.\n *\n * @param event The event to send to Sentry.\n * @returns The generated eventId.\n */\nexport function captureEvent(event: Event): string {\n return callOnHub('captureEvent', event);\n}\n\n/**\n * Callback to set context information onto the scope.\n * @param callback Callback function that receives Scope.\n */\nexport function configureScope(callback: (scope: Scope) => void): void {\n callOnHub('configureScope', callback);\n}\n\n/**\n * Records a new breadcrumb which will be attached to future events.\n *\n * Breadcrumbs will be added to subsequent events to provide more context on\n * user's actions prior to an error or crash.\n *\n * @param breadcrumb The breadcrumb to record.\n */\nexport function addBreadcrumb(breadcrumb: Breadcrumb): void {\n callOnHub('addBreadcrumb', breadcrumb);\n}\n\n/**\n * Sets context data with the given name.\n * @param name of the context\n * @param context Any kind of data. This data will be normailzed.\n */\nexport function setContext(name: string, context: { [key: string]: any } | null): void {\n callOnHub('setContext', name, context);\n}\n\n/**\n * Set an object that will be merged sent as extra data with the event.\n * @param extras Extras object to merge into current context.\n */\nexport function setExtras(extras: { [key: string]: any }): void {\n callOnHub('setExtras', extras);\n}\n\n/**\n * Set an object that will be merged sent as tags data with the event.\n * @param tags Tags context object to merge into current context.\n */\nexport function setTags(tags: { [key: string]: string }): void {\n callOnHub('setTags', tags);\n}\n\n/**\n * Set key:value that will be sent as extra data with the event.\n * @param key String of extra\n * @param extra Any kind of data. This data will be normailzed.\n */\n\nexport function setExtra(key: string, extra: any): void {\n callOnHub('setExtra', key, extra);\n}\n\n/**\n * Set key:value that will be sent as tags data with the event.\n * @param key String key of tag\n * @param value String value of tag\n */\nexport function setTag(key: string, value: string): void {\n callOnHub('setTag', key, value);\n}\n\n/**\n * Updates user context information for future events.\n *\n * @param user User context object to be set in the current context. Pass `null` to unset the user.\n */\nexport function setUser(user: User | null): void {\n callOnHub('setUser', user);\n}\n\n/**\n * Creates a new scope with and executes the given operation within.\n * The scope is automatically removed once the operation\n * finishes or throws.\n *\n * This is essentially a convenience function for:\n *\n * pushScope();\n * callback();\n * popScope();\n *\n * @param callback that will be enclosed into push/popScope.\n */\nexport function withScope(callback: (scope: Scope) => void): void {\n callOnHub('withScope', callback);\n}\n\n/**\n * Calls a function on the latest client. Use this with caution, it's meant as\n * in \"internal\" helper so we don't need to expose every possible function in\n * the shim. It is not guaranteed that the client actually implements the\n * function.\n *\n * @param method The method to call on the client/client.\n * @param args Arguments to pass to the client/fontend.\n */\nexport function _callOnClient(method: string, ...args: any[]): void {\n callOnHub('_invokeClient', method, ...args);\n}\n","import { DsnComponents, DsnLike, DsnProtocol } from '@sentry/types';\nimport { SentryError } from '@sentry/utils';\n\n/** Regular expression used to parse a Dsn. */\nconst DSN_REGEX = /^(?:(\\w+):)\\/\\/(?:(\\w+)(?::(\\w+))?@)([\\w\\.-]+)(?::(\\d+))?\\/(.+)/;\n\n/** Error message */\nconst ERROR_MESSAGE = 'Invalid Dsn';\n\n/** The Sentry Dsn, identifying a Sentry instance and project. */\nexport class Dsn implements DsnComponents {\n /** Protocol used to connect to Sentry. */\n public protocol!: DsnProtocol;\n /** Public authorization key. */\n public user!: string;\n /** private _authorization key (deprecated, optional). */\n public pass!: string;\n /** Hostname of the Sentry instance. */\n public host!: string;\n /** Port of the Sentry instance. */\n public port!: string;\n /** Path */\n public path!: string;\n /** Project ID */\n public projectId!: string;\n\n /** Creates a new Dsn component */\n public constructor(from: DsnLike) {\n if (typeof from === 'string') {\n this._fromString(from);\n } else {\n this._fromComponents(from);\n }\n\n this._validate();\n }\n\n /**\n * Renders the string representation of this Dsn.\n *\n * By default, this will render the public representation without the password\n * component. To get the deprecated private _representation, set `withPassword`\n * to true.\n *\n * @param withPassword When set to true, the password will be included.\n */\n public toString(withPassword: boolean = false): string {\n // tslint:disable-next-line:no-this-assignment\n const { host, path, pass, port, projectId, protocol, user } = this;\n return (\n `${protocol}://${user}${withPassword && pass ? `:${pass}` : ''}` +\n `@${host}${port ? `:${port}` : ''}/${path ? `${path}/` : path}${projectId}`\n );\n }\n\n /** Parses a string into this Dsn. */\n private _fromString(str: string): void {\n const match = DSN_REGEX.exec(str);\n\n if (!match) {\n throw new SentryError(ERROR_MESSAGE);\n }\n\n const [protocol, user, pass = '', host, port = '', lastPath] = match.slice(1);\n let path = '';\n let projectId = lastPath;\n\n const split = projectId.split('/');\n if (split.length > 1) {\n path = split.slice(0, -1).join('/');\n projectId = split.pop() as string;\n }\n\n this._fromComponents({ host, pass, path, projectId, port, protocol: protocol as DsnProtocol, user });\n }\n\n /** Maps Dsn components into this instance. */\n private _fromComponents(components: DsnComponents): void {\n this.protocol = components.protocol;\n this.user = components.user;\n this.pass = components.pass || '';\n this.host = components.host;\n this.port = components.port || '';\n this.path = components.path || '';\n this.projectId = components.projectId;\n }\n\n /** Validates this Dsn and throws on error. */\n private _validate(): void {\n ['protocol', 'user', 'host', 'projectId'].forEach(component => {\n if (!this[component as keyof DsnComponents]) {\n throw new SentryError(ERROR_MESSAGE);\n }\n });\n\n if (this.protocol !== 'http' && this.protocol !== 'https') {\n throw new SentryError(ERROR_MESSAGE);\n }\n\n if (this.port && isNaN(parseInt(this.port, 10))) {\n throw new SentryError(ERROR_MESSAGE);\n }\n }\n}\n","import { DsnLike } from '@sentry/types';\nimport { urlEncode } from '@sentry/utils';\n\nimport { Dsn } from './dsn';\n\nconst SENTRY_API_VERSION = '7';\n\n/** Helper class to provide urls to different Sentry endpoints. */\nexport class API {\n /** The internally used Dsn object. */\n private readonly _dsnObject: Dsn;\n /** Create a new instance of API */\n public constructor(public dsn: DsnLike) {\n this._dsnObject = new Dsn(dsn);\n }\n\n /** Returns the Dsn object. */\n public getDsn(): Dsn {\n return this._dsnObject;\n }\n\n /** Returns a string with auth headers in the url to the store endpoint. */\n public getStoreEndpoint(): string {\n return `${this._getBaseUrl()}${this.getStoreEndpointPath()}`;\n }\n\n /** Returns the store endpoint with auth added in url encoded. */\n public getStoreEndpointWithUrlEncodedAuth(): string {\n const dsn = this._dsnObject;\n const auth = {\n sentry_key: dsn.user,\n sentry_version: SENTRY_API_VERSION,\n };\n // Auth is intentionally sent as part of query string (NOT as custom HTTP header)\n // to avoid preflight CORS requests\n return `${this.getStoreEndpoint()}?${urlEncode(auth)}`;\n }\n\n /** Returns the base path of the url including the port. */\n private _getBaseUrl(): string {\n const dsn = this._dsnObject;\n const protocol = dsn.protocol ? `${dsn.protocol}:` : '';\n const port = dsn.port ? `:${dsn.port}` : '';\n return `${protocol}//${dsn.host}${port}`;\n }\n\n /** Returns only the path component for the store endpoint. */\n public getStoreEndpointPath(): string {\n const dsn = this._dsnObject;\n return `${dsn.path ? `/${dsn.path}` : ''}/api/${dsn.projectId}/store/`;\n }\n\n /** Returns an object that can be used in request headers. */\n public getRequestHeaders(clientName: string, clientVersion: string): { [key: string]: string } {\n const dsn = this._dsnObject;\n const header = [`Sentry sentry_version=${SENTRY_API_VERSION}`];\n header.push(`sentry_timestamp=${new Date().getTime()}`);\n header.push(`sentry_client=${clientName}/${clientVersion}`);\n header.push(`sentry_key=${dsn.user}`);\n if (dsn.pass) {\n header.push(`sentry_secret=${dsn.pass}`);\n }\n return {\n 'Content-Type': 'application/json',\n 'X-Sentry-Auth': header.join(', '),\n };\n }\n\n /** Returns the url to the report dialog endpoint. */\n public getReportDialogEndpoint(\n dialogOptions: {\n [key: string]: any;\n user?: { name?: string; email?: string };\n } = {},\n ): string {\n const dsn = this._dsnObject;\n const endpoint = `${this._getBaseUrl()}${dsn.path ? `/${dsn.path}` : ''}/api/embed/error-page/`;\n\n const encodedOptions = [];\n encodedOptions.push(`dsn=${dsn.toString()}`);\n for (const key in dialogOptions) {\n if (key === 'user') {\n if (!dialogOptions.user) {\n continue;\n }\n if (dialogOptions.user.name) {\n encodedOptions.push(`name=${encodeURIComponent(dialogOptions.user.name)}`);\n }\n if (dialogOptions.user.email) {\n encodedOptions.push(`email=${encodeURIComponent(dialogOptions.user.email)}`);\n }\n } else {\n encodedOptions.push(`${encodeURIComponent(key)}=${encodeURIComponent(dialogOptions[key] as string)}`);\n }\n }\n if (encodedOptions.length) {\n return `${endpoint}?${encodedOptions.join('&')}`;\n }\n\n return endpoint;\n }\n}\n","import { addGlobalEventProcessor, getCurrentHub } from '@sentry/hub';\nimport { Integration, Options } from '@sentry/types';\nimport { logger } from '@sentry/utils';\n\nexport const installedIntegrations: string[] = [];\n\n/** Map of integrations assigned to a client */\nexport interface IntegrationIndex {\n [key: string]: Integration;\n}\n\n/** Gets integration to install */\nexport function getIntegrationsToSetup(options: Options): Integration[] {\n const defaultIntegrations = (options.defaultIntegrations && [...options.defaultIntegrations]) || [];\n const userIntegrations = options.integrations;\n let integrations: Integration[] = [];\n if (Array.isArray(userIntegrations)) {\n const userIntegrationsNames = userIntegrations.map(i => i.name);\n const pickedIntegrationsNames: string[] = [];\n\n // Leave only unique default integrations, that were not overridden with provided user integrations\n defaultIntegrations.forEach(defaultIntegration => {\n if (\n userIntegrationsNames.indexOf(defaultIntegration.name) === -1 &&\n pickedIntegrationsNames.indexOf(defaultIntegration.name) === -1\n ) {\n integrations.push(defaultIntegration);\n pickedIntegrationsNames.push(defaultIntegration.name);\n }\n });\n\n // Don't add same user integration twice\n userIntegrations.forEach(userIntegration => {\n if (pickedIntegrationsNames.indexOf(userIntegration.name) === -1) {\n integrations.push(userIntegration);\n pickedIntegrationsNames.push(userIntegration.name);\n }\n });\n } else if (typeof userIntegrations === 'function') {\n integrations = userIntegrations(defaultIntegrations);\n integrations = Array.isArray(integrations) ? integrations : [integrations];\n } else {\n return [...defaultIntegrations];\n }\n\n return integrations;\n}\n\n/** Setup given integration */\nexport function setupIntegration(integration: Integration): void {\n if (installedIntegrations.indexOf(integration.name) !== -1) {\n return;\n }\n integration.setupOnce(addGlobalEventProcessor, getCurrentHub);\n installedIntegrations.push(integration.name);\n logger.log(`Integration installed: ${integration.name}`);\n}\n\n/**\n * Given a list of integration instances this installs them all. When `withDefaults` is set to `true` then all default\n * integrations are added unless they were already provided before.\n * @param integrations array of integration instances\n * @param withDefault should enable default integrations\n */\nexport function setupIntegrations(options: O): IntegrationIndex {\n const integrations: IntegrationIndex = {};\n getIntegrationsToSetup(options).forEach(integration => {\n integrations[integration.name] = integration;\n setupIntegration(integration);\n });\n return integrations;\n}\n","import { Scope } from '@sentry/hub';\nimport { Client, Event, EventHint, Integration, IntegrationClass, Options, SdkInfo, Severity } from '@sentry/types';\nimport { isPrimitive, isThenable, logger, SyncPromise, truncate, uuid4 } from '@sentry/utils';\n\nimport { Backend, BackendClass } from './basebackend';\nimport { Dsn } from './dsn';\nimport { IntegrationIndex, setupIntegrations } from './integration';\n\n/**\n * Base implementation for all JavaScript SDK clients.\n *\n * Call the constructor with the corresponding backend constructor and options\n * specific to the client subclass. To access these options later, use\n * {@link Client.getOptions}. Also, the Backend instance is available via\n * {@link Client.getBackend}.\n *\n * If a Dsn is specified in the options, it will be parsed and stored. Use\n * {@link Client.getDsn} to retrieve the Dsn at any moment. In case the Dsn is\n * invalid, the constructor will throw a {@link SentryException}. Note that\n * without a valid Dsn, the SDK will not send any events to Sentry.\n *\n * Before sending an event via the backend, it is passed through\n * {@link BaseClient.prepareEvent} to add SDK information and scope data\n * (breadcrumbs and context). To add more custom information, override this\n * method and extend the resulting prepared event.\n *\n * To issue automatically created events (e.g. via instrumentation), use\n * {@link Client.captureEvent}. It will prepare the event and pass it through\n * the callback lifecycle. To issue auto-breadcrumbs, use\n * {@link Client.addBreadcrumb}.\n *\n * @example\n * class NodeClient extends BaseClient {\n * public constructor(options: NodeOptions) {\n * super(NodeBackend, options);\n * }\n *\n * // ...\n * }\n */\nexport abstract class BaseClient implements Client {\n /**\n * The backend used to physically interact in the enviornment. Usually, this\n * will correspond to the client. When composing SDKs, however, the Backend\n * from the root SDK will be used.\n */\n protected readonly _backend: B;\n\n /** Options passed to the SDK. */\n protected readonly _options: O;\n\n /** The client Dsn, if specified in options. Without this Dsn, the SDK will be disabled. */\n protected readonly _dsn?: Dsn;\n\n /** Array of used integrations. */\n protected readonly _integrations: IntegrationIndex = {};\n\n /** Is the client still processing a call? */\n protected _processing: boolean = false;\n\n /**\n * Initializes this client instance.\n *\n * @param backendClass A constructor function to create the backend.\n * @param options Options for the client.\n */\n protected constructor(backendClass: BackendClass, options: O) {\n this._backend = new backendClass(options);\n this._options = options;\n\n if (options.dsn) {\n this._dsn = new Dsn(options.dsn);\n }\n\n if (this._isEnabled()) {\n this._integrations = setupIntegrations(this._options);\n }\n }\n\n /**\n * @inheritDoc\n */\n public captureException(exception: any, hint?: EventHint, scope?: Scope): string | undefined {\n let eventId: string | undefined = hint && hint.event_id;\n this._processing = true;\n\n this._getBackend()\n .eventFromException(exception, hint)\n .then(event => this._processEvent(event, hint, scope))\n .then(finalEvent => {\n // We need to check for finalEvent in case beforeSend returned null\n eventId = finalEvent && finalEvent.event_id;\n this._processing = false;\n })\n .then(null, reason => {\n logger.error(reason);\n this._processing = false;\n });\n\n return eventId;\n }\n\n /**\n * @inheritDoc\n */\n public captureMessage(message: string, level?: Severity, hint?: EventHint, scope?: Scope): string | undefined {\n let eventId: string | undefined = hint && hint.event_id;\n\n this._processing = true;\n\n const promisedEvent = isPrimitive(message)\n ? this._getBackend().eventFromMessage(`${message}`, level, hint)\n : this._getBackend().eventFromException(message, hint);\n\n promisedEvent\n .then(event => this._processEvent(event, hint, scope))\n .then(finalEvent => {\n // We need to check for finalEvent in case beforeSend returned null\n eventId = finalEvent && finalEvent.event_id;\n this._processing = false;\n })\n .then(null, reason => {\n logger.error(reason);\n this._processing = false;\n });\n\n return eventId;\n }\n\n /**\n * @inheritDoc\n */\n public captureEvent(event: Event, hint?: EventHint, scope?: Scope): string | undefined {\n let eventId: string | undefined = hint && hint.event_id;\n this._processing = true;\n\n this._processEvent(event, hint, scope)\n .then(finalEvent => {\n // We need to check for finalEvent in case beforeSend returned null\n eventId = finalEvent && finalEvent.event_id;\n this._processing = false;\n })\n .then(null, reason => {\n logger.error(reason);\n this._processing = false;\n });\n return eventId;\n }\n\n /**\n * @inheritDoc\n */\n public getDsn(): Dsn | undefined {\n return this._dsn;\n }\n\n /**\n * @inheritDoc\n */\n public getOptions(): O {\n return this._options;\n }\n\n /**\n * @inheritDoc\n */\n public flush(timeout?: number): PromiseLike {\n return this._isClientProcessing(timeout).then(status => {\n clearInterval(status.interval);\n return this._getBackend()\n .getTransport()\n .close(timeout)\n .then(transportFlushed => status.ready && transportFlushed);\n });\n }\n\n /**\n * @inheritDoc\n */\n public close(timeout?: number): PromiseLike {\n return this.flush(timeout).then(result => {\n this.getOptions().enabled = false;\n return result;\n });\n }\n\n /**\n * @inheritDoc\n */\n public getIntegrations(): IntegrationIndex {\n return this._integrations || {};\n }\n\n /**\n * @inheritDoc\n */\n public getIntegration(integration: IntegrationClass): T | null {\n try {\n return (this._integrations[integration.id] as T) || null;\n } catch (_oO) {\n logger.warn(`Cannot retrieve integration ${integration.id} from the current Client`);\n return null;\n }\n }\n\n /** Waits for the client to be done with processing. */\n protected _isClientProcessing(timeout?: number): PromiseLike<{ ready: boolean; interval: number }> {\n return new SyncPromise<{ ready: boolean; interval: number }>(resolve => {\n let ticked: number = 0;\n const tick: number = 1;\n\n let interval = 0;\n clearInterval(interval);\n\n interval = (setInterval(() => {\n if (!this._processing) {\n resolve({\n interval,\n ready: true,\n });\n } else {\n ticked += tick;\n if (timeout && ticked >= timeout) {\n resolve({\n interval,\n ready: false,\n });\n }\n }\n }, tick) as unknown) as number;\n });\n }\n\n /** Returns the current backend. */\n protected _getBackend(): B {\n return this._backend;\n }\n\n /** Determines whether this SDK is enabled and a valid Dsn is present. */\n protected _isEnabled(): boolean {\n return this.getOptions().enabled !== false && this._dsn !== undefined;\n }\n\n /**\n * Adds common information to events.\n *\n * The information includes release and environment from `options`,\n * breadcrumbs and context (extra, tags and user) from the scope.\n *\n * Information that is already present in the event is never overwritten. For\n * nested objects, such as the context, keys are merged.\n *\n * @param event The original event.\n * @param hint May contain additional informartion about the original exception.\n * @param scope A scope containing event metadata.\n * @returns A new event with more information.\n */\n protected _prepareEvent(event: Event, scope?: Scope, hint?: EventHint): PromiseLike {\n const { environment, release, dist, maxValueLength = 250 } = this.getOptions();\n\n const prepared: Event = { ...event };\n if (prepared.environment === undefined && environment !== undefined) {\n prepared.environment = environment;\n }\n if (prepared.release === undefined && release !== undefined) {\n prepared.release = release;\n }\n\n if (prepared.dist === undefined && dist !== undefined) {\n prepared.dist = dist;\n }\n\n if (prepared.message) {\n prepared.message = truncate(prepared.message, maxValueLength);\n }\n\n const exception = prepared.exception && prepared.exception.values && prepared.exception.values[0];\n if (exception && exception.value) {\n exception.value = truncate(exception.value, maxValueLength);\n }\n\n const request = prepared.request;\n if (request && request.url) {\n request.url = truncate(request.url, maxValueLength);\n }\n\n if (prepared.event_id === undefined) {\n prepared.event_id = uuid4();\n }\n\n this._addIntegrations(prepared.sdk);\n\n // We prepare the result here with a resolved Event.\n let result = SyncPromise.resolve(prepared);\n\n // This should be the last thing called, since we want that\n // {@link Hub.addEventProcessor} gets the finished prepared event.\n if (scope) {\n // In case we have a hub we reassign it.\n result = scope.applyToEvent(prepared, hint);\n }\n\n return result;\n }\n\n /**\n * This function adds all used integrations to the SDK info in the event.\n * @param sdkInfo The sdkInfo of the event that will be filled with all integrations.\n */\n protected _addIntegrations(sdkInfo?: SdkInfo): void {\n const integrationsArray = Object.keys(this._integrations);\n if (sdkInfo && integrationsArray.length > 0) {\n sdkInfo.integrations = integrationsArray;\n }\n }\n\n /**\n * Processes an event (either error or message) and sends it to Sentry.\n *\n * This also adds breadcrumbs and context information to the event. However,\n * platform specific meta data (such as the User's IP address) must be added\n * by the SDK implementor.\n *\n *\n * @param event The event to send to Sentry.\n * @param hint May contain additional informartion about the original exception.\n * @param scope A scope containing event metadata.\n * @returns A SyncPromise that resolves with the event or rejects in case event was/will not be send.\n */\n protected _processEvent(event: Event, hint?: EventHint, scope?: Scope): PromiseLike {\n const { beforeSend, sampleRate } = this.getOptions();\n\n if (!this._isEnabled()) {\n return SyncPromise.reject('SDK not enabled, will not send event.');\n }\n\n // 1.0 === 100% events are sent\n // 0.0 === 0% events are sent\n if (typeof sampleRate === 'number' && Math.random() > sampleRate) {\n return SyncPromise.reject('This event has been sampled, will not send event.');\n }\n\n return new SyncPromise((resolve, reject) => {\n this._prepareEvent(event, scope, hint)\n .then(prepared => {\n if (prepared === null) {\n reject('An event processor returned null, will not send event.');\n return;\n }\n\n let finalEvent: Event | null = prepared;\n\n try {\n const isInternalException = hint && hint.data && (hint.data as { [key: string]: any }).__sentry__ === true;\n if (isInternalException || !beforeSend) {\n this._getBackend().sendEvent(finalEvent);\n resolve(finalEvent);\n return;\n }\n\n const beforeSendResult = beforeSend(prepared, hint);\n if ((typeof beforeSendResult as any) === 'undefined') {\n logger.error('`beforeSend` method has to return `null` or a valid event.');\n } else if (isThenable(beforeSendResult)) {\n this._handleAsyncBeforeSend(beforeSendResult as PromiseLike, resolve, reject);\n } else {\n finalEvent = beforeSendResult as Event | null;\n\n if (finalEvent === null) {\n logger.log('`beforeSend` returned `null`, will not send event.');\n resolve(null);\n return;\n }\n\n // From here on we are really async\n this._getBackend().sendEvent(finalEvent);\n resolve(finalEvent);\n }\n } catch (exception) {\n this.captureException(exception, {\n data: {\n __sentry__: true,\n },\n originalException: exception as Error,\n });\n reject('`beforeSend` threw an error, will not send event.');\n }\n })\n .then(null, () => {\n reject('`beforeSend` threw an error, will not send event.');\n });\n });\n }\n\n /**\n * Resolves before send Promise and calls resolve/reject on parent SyncPromise.\n */\n private _handleAsyncBeforeSend(\n beforeSend: PromiseLike,\n resolve: (event: Event) => void,\n reject: (reason: string) => void,\n ): void {\n beforeSend\n .then(processedEvent => {\n if (processedEvent === null) {\n reject('`beforeSend` returned `null`, will not send event.');\n return;\n }\n // From here on we are really async\n this._getBackend().sendEvent(processedEvent);\n resolve(processedEvent);\n })\n .then(null, e => {\n reject(`beforeSend rejected with ${e}`);\n });\n }\n}\n","import { Integration, WrappedFunction } from '@sentry/types';\n\nlet originalFunctionToString: () => void;\n\n/** Patch toString calls to return proper name for wrapped functions */\nexport class FunctionToString implements Integration {\n /**\n * @inheritDoc\n */\n public name: string = FunctionToString.id;\n\n /**\n * @inheritDoc\n */\n public static id: string = 'FunctionToString';\n\n /**\n * @inheritDoc\n */\n public setupOnce(): void {\n originalFunctionToString = Function.prototype.toString;\n\n Function.prototype.toString = function(this: WrappedFunction, ...args: any[]): string {\n const context = this.__sentry__ ? this.__sentry_original__ : this;\n // tslint:disable-next-line:no-unsafe-any\n return originalFunctionToString.apply(context, args);\n };\n }\n}\n","import { Event, Response, Status, Transport } from '@sentry/types';\nimport { SyncPromise } from '@sentry/utils';\n\n/** Noop transport */\nexport class NoopTransport implements Transport {\n /**\n * @inheritDoc\n */\n public sendEvent(_: Event): PromiseLike {\n return SyncPromise.resolve({\n reason: `NoopTransport: Event has been skipped because no Dsn is configured.`,\n status: Status.Skipped,\n });\n }\n\n /**\n * @inheritDoc\n */\n public close(_?: number): PromiseLike {\n return SyncPromise.resolve(true);\n }\n}\n","import { Event, EventHint, Options, Severity, Transport } from '@sentry/types';\nimport { logger, SentryError } from '@sentry/utils';\n\nimport { NoopTransport } from './transports/noop';\n\n/**\n * Internal platform-dependent Sentry SDK Backend.\n *\n * While {@link Client} contains business logic specific to an SDK, the\n * Backend offers platform specific implementations for low-level operations.\n * These are persisting and loading information, sending events, and hooking\n * into the environment.\n *\n * Backends receive a handle to the Client in their constructor. When a\n * Backend automatically generates events, it must pass them to\n * the Client for validation and processing first.\n *\n * Usually, the Client will be of corresponding type, e.g. NodeBackend\n * receives NodeClient. However, higher-level SDKs can choose to instanciate\n * multiple Backends and delegate tasks between them. In this case, an event\n * generated by one backend might very well be sent by another one.\n *\n * The client also provides access to options via {@link Client.getOptions}.\n * @hidden\n */\nexport interface Backend {\n /** Creates a {@link Event} from an exception. */\n eventFromException(exception: any, hint?: EventHint): PromiseLike;\n\n /** Creates a {@link Event} from a plain message. */\n eventFromMessage(message: string, level?: Severity, hint?: EventHint): PromiseLike;\n\n /** Submits the event to Sentry */\n sendEvent(event: Event): void;\n\n /**\n * Returns the transport that is used by the backend.\n * Please note that the transport gets lazy initialized so it will only be there once the first event has been sent.\n *\n * @returns The transport.\n */\n getTransport(): Transport;\n}\n\n/**\n * A class object that can instanciate Backend objects.\n * @hidden\n */\nexport type BackendClass = new (options: O) => B;\n\n/**\n * This is the base implemention of a Backend.\n * @hidden\n */\nexport abstract class BaseBackend implements Backend {\n /** Options passed to the SDK. */\n protected readonly _options: O;\n\n /** Cached transport used internally. */\n protected _transport: Transport;\n\n /** Creates a new backend instance. */\n public constructor(options: O) {\n this._options = options;\n if (!this._options.dsn) {\n logger.warn('No DSN provided, backend will not do anything.');\n }\n this._transport = this._setupTransport();\n }\n\n /**\n * Sets up the transport so it can be used later to send requests.\n */\n protected _setupTransport(): Transport {\n return new NoopTransport();\n }\n\n /**\n * @inheritDoc\n */\n public eventFromException(_exception: any, _hint?: EventHint): PromiseLike {\n throw new SentryError('Backend has to implement `eventFromException` method');\n }\n\n /**\n * @inheritDoc\n */\n public eventFromMessage(_message: string, _level?: Severity, _hint?: EventHint): PromiseLike {\n throw new SentryError('Backend has to implement `eventFromMessage` method');\n }\n\n /**\n * @inheritDoc\n */\n public sendEvent(event: Event): void {\n this._transport.sendEvent(event).then(null, reason => {\n logger.error(`Error while sending event: ${reason}`);\n });\n }\n\n /**\n * @inheritDoc\n */\n public getTransport(): Transport {\n return this._transport;\n }\n}\n","import { addGlobalEventProcessor, getCurrentHub } from '@sentry/hub';\nimport { Event, Integration } from '@sentry/types';\nimport { getEventDescription, isMatchingPattern, logger } from '@sentry/utils';\n\n// \"Script error.\" is hard coded into browsers for errors that it can't read.\n// this is the result of a script being pulled in from an external domain and CORS.\nconst DEFAULT_IGNORE_ERRORS = [/^Script error\\.?$/, /^Javascript error: Script error\\.? on line 0$/];\n\n/** JSDoc */\ninterface InboundFiltersOptions {\n blacklistUrls?: Array;\n ignoreErrors?: Array;\n ignoreInternal?: boolean;\n whitelistUrls?: Array;\n}\n\n/** Inbound filters configurable by the user */\nexport class InboundFilters implements Integration {\n /**\n * @inheritDoc\n */\n public name: string = InboundFilters.id;\n /**\n * @inheritDoc\n */\n public static id: string = 'InboundFilters';\n\n public constructor(private readonly _options: InboundFiltersOptions = {}) {}\n\n /**\n * @inheritDoc\n */\n public setupOnce(): void {\n addGlobalEventProcessor((event: Event) => {\n const hub = getCurrentHub();\n if (!hub) {\n return event;\n }\n const self = hub.getIntegration(InboundFilters);\n if (self) {\n const client = hub.getClient();\n const clientOptions = client ? client.getOptions() : {};\n const options = self._mergeOptions(clientOptions);\n if (self._shouldDropEvent(event, options)) {\n return null;\n }\n }\n return event;\n });\n }\n\n /** JSDoc */\n private _shouldDropEvent(event: Event, options: InboundFiltersOptions): boolean {\n if (this._isSentryError(event, options)) {\n logger.warn(`Event dropped due to being internal Sentry Error.\\nEvent: ${getEventDescription(event)}`);\n return true;\n }\n if (this._isIgnoredError(event, options)) {\n logger.warn(\n `Event dropped due to being matched by \\`ignoreErrors\\` option.\\nEvent: ${getEventDescription(event)}`,\n );\n return true;\n }\n if (this._isBlacklistedUrl(event, options)) {\n logger.warn(\n `Event dropped due to being matched by \\`blacklistUrls\\` option.\\nEvent: ${getEventDescription(\n event,\n )}.\\nUrl: ${this._getEventFilterUrl(event)}`,\n );\n return true;\n }\n if (!this._isWhitelistedUrl(event, options)) {\n logger.warn(\n `Event dropped due to not being matched by \\`whitelistUrls\\` option.\\nEvent: ${getEventDescription(\n event,\n )}.\\nUrl: ${this._getEventFilterUrl(event)}`,\n );\n return true;\n }\n return false;\n }\n\n /** JSDoc */\n private _isSentryError(event: Event, options: InboundFiltersOptions = {}): boolean {\n if (!options.ignoreInternal) {\n return false;\n }\n\n try {\n // tslint:disable-next-line:no-unsafe-any\n return (event as any).exception.values[0].type === 'SentryError';\n } catch (_oO) {\n return false;\n }\n }\n\n /** JSDoc */\n private _isIgnoredError(event: Event, options: InboundFiltersOptions = {}): boolean {\n if (!options.ignoreErrors || !options.ignoreErrors.length) {\n return false;\n }\n\n return this._getPossibleEventMessages(event).some(message =>\n // Not sure why TypeScript complains here...\n (options.ignoreErrors as Array).some(pattern => isMatchingPattern(message, pattern)),\n );\n }\n\n /** JSDoc */\n private _isBlacklistedUrl(event: Event, options: InboundFiltersOptions = {}): boolean {\n // TODO: Use Glob instead?\n if (!options.blacklistUrls || !options.blacklistUrls.length) {\n return false;\n }\n const url = this._getEventFilterUrl(event);\n return !url ? false : options.blacklistUrls.some(pattern => isMatchingPattern(url, pattern));\n }\n\n /** JSDoc */\n private _isWhitelistedUrl(event: Event, options: InboundFiltersOptions = {}): boolean {\n // TODO: Use Glob instead?\n if (!options.whitelistUrls || !options.whitelistUrls.length) {\n return true;\n }\n const url = this._getEventFilterUrl(event);\n return !url ? true : options.whitelistUrls.some(pattern => isMatchingPattern(url, pattern));\n }\n\n /** JSDoc */\n private _mergeOptions(clientOptions: InboundFiltersOptions = {}): InboundFiltersOptions {\n return {\n blacklistUrls: [...(this._options.blacklistUrls || []), ...(clientOptions.blacklistUrls || [])],\n ignoreErrors: [\n ...(this._options.ignoreErrors || []),\n ...(clientOptions.ignoreErrors || []),\n ...DEFAULT_IGNORE_ERRORS,\n ],\n ignoreInternal: typeof this._options.ignoreInternal !== 'undefined' ? this._options.ignoreInternal : true,\n whitelistUrls: [...(this._options.whitelistUrls || []), ...(clientOptions.whitelistUrls || [])],\n };\n }\n\n /** JSDoc */\n private _getPossibleEventMessages(event: Event): string[] {\n if (event.message) {\n return [event.message];\n }\n if (event.exception) {\n try {\n // tslint:disable-next-line:no-unsafe-any\n const { type, value } = (event as any).exception.values[0];\n return [`${value}`, `${type}: ${value}`];\n } catch (oO) {\n logger.error(`Cannot extract message for event ${getEventDescription(event)}`);\n return [];\n }\n }\n return [];\n }\n\n /** JSDoc */\n private _getEventFilterUrl(event: Event): string | null {\n try {\n if (event.stacktrace) {\n // tslint:disable:no-unsafe-any\n const frames = (event as any).stacktrace.frames;\n return frames[frames.length - 1].filename;\n }\n if (event.exception) {\n // tslint:disable:no-unsafe-any\n const frames = (event as any).exception.values[0].stacktrace.frames;\n return frames[frames.length - 1].filename;\n }\n return null;\n } catch (oO) {\n logger.error(`Cannot extract url for event ${getEventDescription(event)}`);\n return null;\n }\n }\n}\n","// tslint:disable:object-literal-sort-keys\n\n/**\n * This was originally forked from https://github.com/occ/TraceKit, but has since been\n * largely modified and is now maintained as part of Sentry JS SDK.\n */\n\n/**\n * An object representing a single stack frame.\n * {Object} StackFrame\n * {string} url The JavaScript or HTML file URL.\n * {string} func The function name, or empty for anonymous functions (if guessing did not work).\n * {string[]?} args The arguments passed to the function, if known.\n * {number=} line The line number, if known.\n * {number=} column The column number, if known.\n * {string[]} context An array of source code lines; the middle element corresponds to the correct line#.\n */\nexport interface StackFrame {\n url: string;\n func: string;\n args: string[];\n line: number | null;\n column: number | null;\n}\n\n/**\n * An object representing a JavaScript stack trace.\n * {Object} StackTrace\n * {string} name The name of the thrown exception.\n * {string} message The exception error message.\n * {TraceKit.StackFrame[]} stack An array of stack frames.\n */\nexport interface StackTrace {\n name: string;\n message: string;\n mechanism?: string;\n stack: StackFrame[];\n failed?: boolean;\n}\n\n// global reference to slice\nconst UNKNOWN_FUNCTION = '?';\n\n// Chromium based browsers: Chrome, Brave, new Opera, new Edge\nconst chrome = /^\\s*at (?:(.*?) ?\\()?((?:file|https?|blob|chrome-extension|native|eval|webpack||[-a-z]+:|\\/).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i;\n// gecko regex: `(?:bundle|\\d+\\.js)`: `bundle` is for react native, `\\d+\\.js` also but specifically for ram bundles because it\n// generates filenames without a prefix like `file://` the filenames in the stacktrace are just 42.js\n// We need this specific case for now because we want no other regex to match.\nconst gecko = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)?((?:file|https?|blob|chrome|webpack|resource|moz-extension).*?:\\/.*?|\\[native code\\]|[^@]*(?:bundle|\\d+\\.js))(?::(\\d+))?(?::(\\d+))?\\s*$/i;\nconst winjs = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\nconst geckoEval = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i;\nconst chromeEval = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/;\n\n/** JSDoc */\nexport function computeStackTrace(ex: any): StackTrace {\n // tslint:disable:no-unsafe-any\n\n let stack = null;\n const popSize: number = ex && ex.framesToPop;\n\n try {\n // This must be tried first because Opera 10 *destroys*\n // its stacktrace property if you try to access the stack\n // property first!!\n stack = computeStackTraceFromStacktraceProp(ex);\n if (stack) {\n return popFrames(stack, popSize);\n }\n } catch (e) {\n // no-empty\n }\n\n try {\n stack = computeStackTraceFromStackProp(ex);\n if (stack) {\n return popFrames(stack, popSize);\n }\n } catch (e) {\n // no-empty\n }\n\n return {\n message: extractMessage(ex),\n name: ex && ex.name,\n stack: [],\n failed: true,\n };\n}\n\n/** JSDoc */\n// tslint:disable-next-line:cyclomatic-complexity\nfunction computeStackTraceFromStackProp(ex: any): StackTrace | null {\n // tslint:disable:no-conditional-assignment\n if (!ex || !ex.stack) {\n return null;\n }\n\n const stack = [];\n const lines = ex.stack.split('\\n');\n let isEval;\n let submatch;\n let parts;\n let element;\n\n for (let i = 0; i < lines.length; ++i) {\n if ((parts = chrome.exec(lines[i]))) {\n const isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line\n isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line\n if (isEval && (submatch = chromeEval.exec(parts[2]))) {\n // throw out eval line/column and use top-most line/column number\n parts[2] = submatch[1]; // url\n parts[3] = submatch[2]; // line\n parts[4] = submatch[3]; // column\n }\n element = {\n url: parts[2],\n func: parts[1] || UNKNOWN_FUNCTION,\n args: isNative ? [parts[2]] : [],\n line: parts[3] ? +parts[3] : null,\n column: parts[4] ? +parts[4] : null,\n };\n } else if ((parts = winjs.exec(lines[i]))) {\n element = {\n url: parts[2],\n func: parts[1] || UNKNOWN_FUNCTION,\n args: [],\n line: +parts[3],\n column: parts[4] ? +parts[4] : null,\n };\n } else if ((parts = gecko.exec(lines[i]))) {\n isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n if (isEval && (submatch = geckoEval.exec(parts[3]))) {\n // throw out eval line/column and use top-most line number\n parts[1] = parts[1] || `eval`;\n parts[3] = submatch[1];\n parts[4] = submatch[2];\n parts[5] = ''; // no column when eval\n } else if (i === 0 && !parts[5] && ex.columnNumber !== void 0) {\n // FireFox uses this awesome columnNumber property for its top frame\n // Also note, Firefox's column number is 0-based and everything else expects 1-based,\n // so adding 1\n // NOTE: this hack doesn't work if top-most frame is eval\n stack[0].column = (ex.columnNumber as number) + 1;\n }\n element = {\n url: parts[3],\n func: parts[1] || UNKNOWN_FUNCTION,\n args: parts[2] ? parts[2].split(',') : [],\n line: parts[4] ? +parts[4] : null,\n column: parts[5] ? +parts[5] : null,\n };\n } else {\n continue;\n }\n\n if (!element.func && element.line) {\n element.func = UNKNOWN_FUNCTION;\n }\n\n stack.push(element);\n }\n\n if (!stack.length) {\n return null;\n }\n\n return {\n message: extractMessage(ex),\n name: ex.name,\n stack,\n };\n}\n\n/** JSDoc */\nfunction computeStackTraceFromStacktraceProp(ex: any): StackTrace | null {\n if (!ex || !ex.stacktrace) {\n return null;\n }\n // Access and store the stacktrace property before doing ANYTHING\n // else to it because Opera is not very good at providing it\n // reliably in other circumstances.\n const stacktrace = ex.stacktrace;\n const opera10Regex = / line (\\d+).*script (?:in )?(\\S+)(?:: in function (\\S+))?$/i;\n const opera11Regex = / line (\\d+), column (\\d+)\\s*(?:in (?:]+)>|([^\\)]+))\\((.*)\\))? in (.*):\\s*$/i;\n const lines = stacktrace.split('\\n');\n const stack = [];\n let parts;\n\n for (let line = 0; line < lines.length; line += 2) {\n // tslint:disable:no-conditional-assignment\n let element = null;\n if ((parts = opera10Regex.exec(lines[line]))) {\n element = {\n url: parts[2],\n func: parts[3],\n args: [],\n line: +parts[1],\n column: null,\n };\n } else if ((parts = opera11Regex.exec(lines[line]))) {\n element = {\n url: parts[6],\n func: parts[3] || parts[4],\n args: parts[5] ? parts[5].split(',') : [],\n line: +parts[1],\n column: +parts[2],\n };\n }\n\n if (element) {\n if (!element.func && element.line) {\n element.func = UNKNOWN_FUNCTION;\n }\n stack.push(element);\n }\n }\n\n if (!stack.length) {\n return null;\n }\n\n return {\n message: extractMessage(ex),\n name: ex.name,\n stack,\n };\n}\n\n/** Remove N number of frames from the stack */\nfunction popFrames(stacktrace: StackTrace, popSize: number): StackTrace {\n try {\n return {\n ...stacktrace,\n stack: stacktrace.stack.slice(popSize),\n };\n } catch (e) {\n return stacktrace;\n }\n}\n\n/**\n * There are cases where stacktrace.message is an Event object\n * https://github.com/getsentry/sentry-javascript/issues/1949\n * In this specific case we try to extract stacktrace.message.error.message\n */\nfunction extractMessage(ex: any): string {\n const message = ex && ex.message;\n if (!message) {\n return 'No error message';\n }\n if (message.error && typeof message.error.message === 'string') {\n return message.error.message;\n }\n return message;\n}\n","import { Event, Exception, StackFrame } from '@sentry/types';\nimport { extractExceptionKeysForMessage, isEvent, normalizeToSize } from '@sentry/utils';\n\nimport { computeStackTrace, StackFrame as TraceKitStackFrame, StackTrace as TraceKitStackTrace } from './tracekit';\n\nconst STACKTRACE_LIMIT = 50;\n\n/**\n * This function creates an exception from an TraceKitStackTrace\n * @param stacktrace TraceKitStackTrace that will be converted to an exception\n * @hidden\n */\nexport function exceptionFromStacktrace(stacktrace: TraceKitStackTrace): Exception {\n const frames = prepareFramesForEvent(stacktrace.stack);\n\n const exception: Exception = {\n type: stacktrace.name,\n value: stacktrace.message,\n };\n\n if (frames && frames.length) {\n exception.stacktrace = { frames };\n }\n\n // tslint:disable-next-line:strict-type-predicates\n if (exception.type === undefined && exception.value === '') {\n exception.value = 'Unrecoverable error caught';\n }\n\n return exception;\n}\n\n/**\n * @hidden\n */\nexport function eventFromPlainObject(exception: {}, syntheticException?: Error, rejection?: boolean): Event {\n const event: Event = {\n exception: {\n values: [\n {\n type: isEvent(exception) ? exception.constructor.name : rejection ? 'UnhandledRejection' : 'Error',\n value: `Non-Error ${\n rejection ? 'promise rejection' : 'exception'\n } captured with keys: ${extractExceptionKeysForMessage(exception)}`,\n },\n ],\n },\n extra: {\n __serialized__: normalizeToSize(exception),\n },\n };\n\n if (syntheticException) {\n const stacktrace = computeStackTrace(syntheticException);\n const frames = prepareFramesForEvent(stacktrace.stack);\n event.stacktrace = {\n frames,\n };\n }\n\n return event;\n}\n\n/**\n * @hidden\n */\nexport function eventFromStacktrace(stacktrace: TraceKitStackTrace): Event {\n const exception = exceptionFromStacktrace(stacktrace);\n\n return {\n exception: {\n values: [exception],\n },\n };\n}\n\n/**\n * @hidden\n */\nexport function prepareFramesForEvent(stack: TraceKitStackFrame[]): StackFrame[] {\n if (!stack || !stack.length) {\n return [];\n }\n\n let localStack = stack;\n\n const firstFrameFunction = localStack[0].func || '';\n const lastFrameFunction = localStack[localStack.length - 1].func || '';\n\n // If stack starts with one of our API calls, remove it (starts, meaning it's the top of the stack - aka last call)\n if (firstFrameFunction.indexOf('captureMessage') !== -1 || firstFrameFunction.indexOf('captureException') !== -1) {\n localStack = localStack.slice(1);\n }\n\n // If stack ends with one of our internal API calls, remove it (ends, meaning it's the bottom of the stack - aka top-most call)\n if (lastFrameFunction.indexOf('sentryWrapped') !== -1) {\n localStack = localStack.slice(0, -1);\n }\n\n // The frame where the crash happened, should be the last entry in the array\n return localStack\n .map(\n (frame: TraceKitStackFrame): StackFrame => ({\n colno: frame.column === null ? undefined : frame.column,\n filename: frame.url || localStack[0].url,\n function: frame.func || '?',\n in_app: true,\n lineno: frame.line === null ? undefined : frame.line,\n }),\n )\n .slice(0, STACKTRACE_LIMIT)\n .reverse();\n}\n","import { Event } from '@sentry/types';\nimport {\n addExceptionMechanism,\n addExceptionTypeValue,\n isDOMError,\n isDOMException,\n isError,\n isErrorEvent,\n isEvent,\n isPlainObject,\n} from '@sentry/utils';\n\nimport { eventFromPlainObject, eventFromStacktrace, prepareFramesForEvent } from './parsers';\nimport { computeStackTrace } from './tracekit';\n\n/** JSDoc */\nexport function eventFromUnknownInput(\n exception: unknown,\n syntheticException?: Error,\n options: {\n rejection?: boolean;\n attachStacktrace?: boolean;\n } = {},\n): Event {\n let event: Event;\n\n if (isErrorEvent(exception as ErrorEvent) && (exception as ErrorEvent).error) {\n // If it is an ErrorEvent with `error` property, extract it to get actual Error\n const errorEvent = exception as ErrorEvent;\n exception = errorEvent.error; // tslint:disable-line:no-parameter-reassignment\n event = eventFromStacktrace(computeStackTrace(exception as Error));\n return event;\n }\n if (isDOMError(exception as DOMError) || isDOMException(exception as DOMException)) {\n // If it is a DOMError or DOMException (which are legacy APIs, but still supported in some browsers)\n // then we just extract the name and message, as they don't provide anything else\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMError\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMException\n const domException = exception as DOMException;\n const name = domException.name || (isDOMError(domException) ? 'DOMError' : 'DOMException');\n const message = domException.message ? `${name}: ${domException.message}` : name;\n\n event = eventFromString(message, syntheticException, options);\n addExceptionTypeValue(event, message);\n return event;\n }\n if (isError(exception as Error)) {\n // we have a real Error object, do nothing\n event = eventFromStacktrace(computeStackTrace(exception as Error));\n return event;\n }\n if (isPlainObject(exception) || isEvent(exception)) {\n // If it is plain Object or Event, serialize it manually and extract options\n // This will allow us to group events based on top-level keys\n // which is much better than creating new group when any key/value change\n const objectException = exception as {};\n event = eventFromPlainObject(objectException, syntheticException, options.rejection);\n addExceptionMechanism(event, {\n synthetic: true,\n });\n return event;\n }\n\n // If none of previous checks were valid, then it means that it's not:\n // - an instance of DOMError\n // - an instance of DOMException\n // - an instance of Event\n // - an instance of Error\n // - a valid ErrorEvent (one with an error property)\n // - a plain Object\n //\n // So bail out and capture it as a simple message:\n event = eventFromString(exception as string, syntheticException, options);\n addExceptionTypeValue(event, `${exception}`, undefined);\n addExceptionMechanism(event, {\n synthetic: true,\n });\n\n return event;\n}\n\n// this._options.attachStacktrace\n/** JSDoc */\nexport function eventFromString(\n input: string,\n syntheticException?: Error,\n options: {\n attachStacktrace?: boolean;\n } = {},\n): Event {\n const event: Event = {\n message: input,\n };\n\n if (options.attachStacktrace && syntheticException) {\n const stacktrace = computeStackTrace(syntheticException);\n const frames = prepareFramesForEvent(stacktrace.stack);\n event.stacktrace = {\n frames,\n };\n }\n\n return event;\n}\n","import { API } from '@sentry/core';\nimport { Event, Response, Transport, TransportOptions } from '@sentry/types';\nimport { PromiseBuffer, SentryError } from '@sentry/utils';\n\n/** Base Transport class implementation */\nexport abstract class BaseTransport implements Transport {\n /**\n * @inheritDoc\n */\n public url: string;\n\n /** A simple buffer holding all requests. */\n protected readonly _buffer: PromiseBuffer = new PromiseBuffer(30);\n\n public constructor(public options: TransportOptions) {\n this.url = new API(this.options.dsn).getStoreEndpointWithUrlEncodedAuth();\n }\n\n /**\n * @inheritDoc\n */\n public sendEvent(_: Event): PromiseLike {\n throw new SentryError('Transport Class has to implement `sendEvent` method');\n }\n\n /**\n * @inheritDoc\n */\n public close(timeout?: number): PromiseLike {\n return this._buffer.drain(timeout);\n }\n}\n","import { captureException, getCurrentHub, withScope } from '@sentry/core';\nimport { Event as SentryEvent, Mechanism, WrappedFunction } from '@sentry/types';\nimport { addExceptionMechanism, addExceptionTypeValue, htmlTreeAsString, normalize } from '@sentry/utils';\n\nconst debounceDuration: number = 1000;\nlet keypressTimeout: number | undefined;\nlet lastCapturedEvent: Event | undefined;\nlet ignoreOnError: number = 0;\n\n/**\n * @hidden\n */\nexport function shouldIgnoreOnError(): boolean {\n return ignoreOnError > 0;\n}\n\n/**\n * @hidden\n */\nexport function ignoreNextOnError(): void {\n // onerror should trigger before setTimeout\n ignoreOnError += 1;\n setTimeout(() => {\n ignoreOnError -= 1;\n });\n}\n\n/**\n * Instruments the given function and sends an event to Sentry every time the\n * function throws an exception.\n *\n * @param fn A function to wrap.\n * @returns The wrapped function.\n * @hidden\n */\nexport function wrap(\n fn: WrappedFunction,\n options: {\n mechanism?: Mechanism;\n capture?: boolean;\n } = {},\n before?: WrappedFunction,\n): any {\n // tslint:disable-next-line:strict-type-predicates\n if (typeof fn !== 'function') {\n return fn;\n }\n\n try {\n // We don't wanna wrap it twice\n if (fn.__sentry__) {\n return fn;\n }\n\n // If this has already been wrapped in the past, return that wrapped function\n if (fn.__sentry_wrapped__) {\n return fn.__sentry_wrapped__;\n }\n } catch (e) {\n // Just accessing custom props in some Selenium environments\n // can cause a \"Permission denied\" exception (see raven-js#495).\n // Bail on wrapping and return the function as-is (defers to window.onerror).\n return fn;\n }\n\n const sentryWrapped: WrappedFunction = function(this: any): void {\n // tslint:disable-next-line:strict-type-predicates\n if (before && typeof before === 'function') {\n before.apply(this, arguments);\n }\n\n const args = Array.prototype.slice.call(arguments);\n\n // tslint:disable:no-unsafe-any\n try {\n const wrappedArguments = args.map((arg: any) => wrap(arg, options));\n\n if (fn.handleEvent) {\n // Attempt to invoke user-land function\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n // means the sentry.javascript SDK caught an error invoking your application code. This\n // is expected behavior and NOT indicative of a bug with sentry.javascript.\n return fn.handleEvent.apply(this, wrappedArguments);\n }\n\n // Attempt to invoke user-land function\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n // means the sentry.javascript SDK caught an error invoking your application code. This\n // is expected behavior and NOT indicative of a bug with sentry.javascript.\n return fn.apply(this, wrappedArguments);\n // tslint:enable:no-unsafe-any\n } catch (ex) {\n ignoreNextOnError();\n\n withScope(scope => {\n scope.addEventProcessor((event: SentryEvent) => {\n const processedEvent = { ...event };\n\n if (options.mechanism) {\n addExceptionTypeValue(processedEvent, undefined, undefined);\n addExceptionMechanism(processedEvent, options.mechanism);\n }\n\n processedEvent.extra = {\n ...processedEvent.extra,\n arguments: normalize(args, 3),\n };\n\n return processedEvent;\n });\n\n captureException(ex);\n });\n\n throw ex;\n }\n };\n\n // Accessing some objects may throw\n // ref: https://github.com/getsentry/sentry-javascript/issues/1168\n try {\n for (const property in fn) {\n if (Object.prototype.hasOwnProperty.call(fn, property)) {\n sentryWrapped[property] = fn[property];\n }\n }\n } catch (_oO) {} // tslint:disable-line:no-empty\n\n fn.prototype = fn.prototype || {};\n sentryWrapped.prototype = fn.prototype;\n\n Object.defineProperty(fn, '__sentry_wrapped__', {\n enumerable: false,\n value: sentryWrapped,\n });\n\n // Signal that this function has been wrapped/filled already\n // for both debugging and to prevent it to being wrapped/filled twice\n Object.defineProperties(sentryWrapped, {\n __sentry__: {\n enumerable: false,\n value: true,\n },\n __sentry_original__: {\n enumerable: false,\n value: fn,\n },\n });\n\n // Restore original function name (not all browsers allow that)\n try {\n const descriptor = Object.getOwnPropertyDescriptor(sentryWrapped, 'name') as PropertyDescriptor;\n if (descriptor.configurable) {\n Object.defineProperty(sentryWrapped, 'name', {\n get(): string {\n return fn.name;\n },\n });\n }\n } catch (_oO) {\n /*no-empty*/\n }\n\n return sentryWrapped;\n}\n\nlet debounceTimer: number = 0;\n\n/**\n * Wraps addEventListener to capture UI breadcrumbs\n * @param eventName the event name (e.g. \"click\")\n * @returns wrapped breadcrumb events handler\n * @hidden\n */\nexport function breadcrumbEventHandler(eventName: string, debounce: boolean = false): (event: Event) => void {\n return (event: Event) => {\n // reset keypress timeout; e.g. triggering a 'click' after\n // a 'keypress' will reset the keypress debounce so that a new\n // set of keypresses can be recorded\n keypressTimeout = undefined;\n // It's possible this handler might trigger multiple times for the same\n // event (e.g. event propagation through node ancestors). Ignore if we've\n // already captured the event.\n if (!event || lastCapturedEvent === event) {\n return;\n }\n\n lastCapturedEvent = event;\n\n const captureBreadcrumb = () => {\n let target;\n\n // Accessing event.target can throw (see getsentry/raven-js#838, #768)\n try {\n target = event.target ? htmlTreeAsString(event.target as Node) : htmlTreeAsString((event as unknown) as Node);\n } catch (e) {\n target = '';\n }\n\n if (target.length === 0) {\n return;\n }\n\n getCurrentHub().addBreadcrumb(\n {\n category: `ui.${eventName}`, // e.g. ui.click, ui.input\n message: target,\n },\n {\n event,\n name: eventName,\n },\n );\n };\n\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n\n if (debounce) {\n debounceTimer = setTimeout(captureBreadcrumb);\n } else {\n captureBreadcrumb();\n }\n };\n}\n\n/**\n * Wraps addEventListener to capture keypress UI events\n * @returns wrapped keypress events handler\n * @hidden\n */\nexport function keypressEventHandler(): (event: Event) => void {\n // TODO: if somehow user switches keypress target before\n // debounce timeout is triggered, we will only capture\n // a single breadcrumb from the FIRST target (acceptable?)\n return (event: Event) => {\n let target;\n\n try {\n target = event.target;\n } catch (e) {\n // just accessing event properties can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/raven-js/issues/838\n return;\n }\n\n const tagName = target && (target as HTMLElement).tagName;\n\n // only consider keypress events on actual input elements\n // this will disregard keypresses targeting body (e.g. tabbing\n // through elements, hotkeys, etc)\n if (!tagName || (tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !(target as HTMLElement).isContentEditable)) {\n return;\n }\n\n // record first keypress in a series, but ignore subsequent\n // keypresses until debounce clears\n if (!keypressTimeout) {\n breadcrumbEventHandler('input')(event);\n }\n clearTimeout(keypressTimeout);\n\n keypressTimeout = (setTimeout(() => {\n keypressTimeout = undefined;\n }, debounceDuration) as any) as number;\n };\n}\n","import { Event, Response, Status } from '@sentry/types';\nimport { getGlobalObject, supportsReferrerPolicy } from '@sentry/utils';\n\nimport { BaseTransport } from './base';\n\nconst global = getGlobalObject();\n\n/** `fetch` based transport */\nexport class FetchTransport extends BaseTransport {\n /**\n * @inheritDoc\n */\n public sendEvent(event: Event): PromiseLike {\n const defaultOptions: RequestInit = {\n body: JSON.stringify(event),\n method: 'POST',\n // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default\n // https://caniuse.com/#feat=referrer-policy\n // It doesn't. And it throw exception instead of ignoring this parameter...\n // REF: https://github.com/getsentry/raven-js/issues/1233\n referrerPolicy: (supportsReferrerPolicy() ? 'origin' : '') as ReferrerPolicy,\n };\n\n return this._buffer.add(\n global.fetch(this.url, defaultOptions).then(response => ({\n status: Status.fromHttpCode(response.status),\n })),\n );\n }\n}\n","import { Event, Response, Status } from '@sentry/types';\nimport { SyncPromise } from '@sentry/utils';\n\nimport { BaseTransport } from './base';\n\n/** `XHR` based transport */\nexport class XHRTransport extends BaseTransport {\n /**\n * @inheritDoc\n */\n public sendEvent(event: Event): PromiseLike {\n return this._buffer.add(\n new SyncPromise((resolve, reject) => {\n const request = new XMLHttpRequest();\n\n request.onreadystatechange = () => {\n if (request.readyState !== 4) {\n return;\n }\n\n if (request.status === 200) {\n resolve({\n status: Status.fromHttpCode(request.status),\n });\n }\n\n reject(request);\n };\n\n request.open('POST', this.url);\n request.send(JSON.stringify(event));\n }),\n );\n }\n}\n","import { BaseBackend } from '@sentry/core';\nimport { Event, EventHint, Options, Severity, Transport } from '@sentry/types';\nimport { addExceptionMechanism, supportsFetch, SyncPromise } from '@sentry/utils';\n\nimport { eventFromString, eventFromUnknownInput } from './eventbuilder';\nimport { FetchTransport, XHRTransport } from './transports';\n\n/**\n * Configuration options for the Sentry Browser SDK.\n * @see BrowserClient for more information.\n */\nexport interface BrowserOptions extends Options {\n /**\n * A pattern for error URLs which should not be sent to Sentry.\n * To whitelist certain errors instead, use {@link Options.whitelistUrls}.\n * By default, all errors will be sent.\n */\n blacklistUrls?: Array;\n\n /**\n * A pattern for error URLs which should exclusively be sent to Sentry.\n * This is the opposite of {@link Options.blacklistUrls}.\n * By default, all errors will be sent.\n */\n whitelistUrls?: Array;\n}\n\n/**\n * The Sentry Browser SDK Backend.\n * @hidden\n */\nexport class BrowserBackend extends BaseBackend {\n /**\n * @inheritDoc\n */\n protected _setupTransport(): Transport {\n if (!this._options.dsn) {\n // We return the noop transport here in case there is no Dsn.\n return super._setupTransport();\n }\n\n const transportOptions = {\n ...this._options.transportOptions,\n dsn: this._options.dsn,\n };\n\n if (this._options.transport) {\n return new this._options.transport(transportOptions);\n }\n if (supportsFetch()) {\n return new FetchTransport(transportOptions);\n }\n return new XHRTransport(transportOptions);\n }\n\n /**\n * @inheritDoc\n */\n public eventFromException(exception: any, hint?: EventHint): PromiseLike {\n const syntheticException = (hint && hint.syntheticException) || undefined;\n const event = eventFromUnknownInput(exception, syntheticException, {\n attachStacktrace: this._options.attachStacktrace,\n });\n addExceptionMechanism(event, {\n handled: true,\n type: 'generic',\n });\n event.level = Severity.Error;\n if (hint && hint.event_id) {\n event.event_id = hint.event_id;\n }\n return SyncPromise.resolve(event);\n }\n /**\n * @inheritDoc\n */\n public eventFromMessage(message: string, level: Severity = Severity.Info, hint?: EventHint): PromiseLike {\n const syntheticException = (hint && hint.syntheticException) || undefined;\n const event = eventFromString(message, syntheticException, {\n attachStacktrace: this._options.attachStacktrace,\n });\n event.level = level;\n if (hint && hint.event_id) {\n event.event_id = hint.event_id;\n }\n return SyncPromise.resolve(event);\n }\n}\n","export const SDK_NAME = 'sentry.javascript.browser';\nexport const SDK_VERSION = '5.7.1';\n","import { API, BaseClient, Scope } from '@sentry/core';\nimport { DsnLike, Event, EventHint } from '@sentry/types';\nimport { getGlobalObject, logger } from '@sentry/utils';\n\nimport { BrowserBackend, BrowserOptions } from './backend';\nimport { SDK_NAME, SDK_VERSION } from './version';\n\n/**\n * All properties the report dialog supports\n */\nexport interface ReportDialogOptions {\n [key: string]: any;\n eventId?: string;\n dsn?: DsnLike;\n user?: {\n email?: string;\n name?: string;\n };\n lang?: string;\n title?: string;\n subtitle?: string;\n subtitle2?: string;\n labelName?: string;\n labelEmail?: string;\n labelComments?: string;\n labelClose?: string;\n labelSubmit?: string;\n errorGeneric?: string;\n errorFormEntry?: string;\n successMessage?: string;\n /** Callback after reportDialog showed up */\n onLoad?(): void;\n}\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 {\n /**\n * Creates a new Browser SDK instance.\n *\n * @param options Configuration options for this SDK.\n */\n public constructor(options: BrowserOptions = {}) {\n super(BrowserBackend, options);\n }\n\n /**\n * @inheritDoc\n */\n protected _prepareEvent(event: Event, scope?: Scope, hint?: EventHint): PromiseLike {\n event.platform = event.platform || 'javascript';\n event.sdk = {\n ...event.sdk,\n name: SDK_NAME,\n packages: [\n ...((event.sdk && event.sdk.packages) || []),\n {\n name: 'npm:@sentry/browser',\n version: SDK_VERSION,\n },\n ],\n version: SDK_VERSION,\n };\n\n return super._prepareEvent(event, scope, hint);\n }\n\n /**\n * Show a report dialog to the user to send feedback to a specific event.\n *\n * @param options Set individual options for the dialog\n */\n public showReportDialog(options: ReportDialogOptions = {}): void {\n // doesn't work without a document (React Native)\n const document = getGlobalObject().document;\n if (!document) {\n return;\n }\n\n if (!this._isEnabled()) {\n logger.error('Trying to call showReportDialog with Sentry Client is disabled');\n return;\n }\n\n const dsn = options.dsn || this.getDsn();\n\n if (!options.eventId) {\n logger.error('Missing `eventId` option in showReportDialog call');\n return;\n }\n\n if (!dsn) {\n logger.error('Missing `Dsn` option in showReportDialog call');\n return;\n }\n\n const script = document.createElement('script');\n script.async = true;\n script.src = new API(dsn).getReportDialogEndpoint(options);\n\n if (options.onLoad) {\n script.onload = options.onLoad;\n }\n\n (document.head || document.body).appendChild(script);\n }\n}\n","import { getCurrentHub } from '@sentry/core';\nimport { Event, Integration, Severity } from '@sentry/types';\nimport {\n addExceptionMechanism,\n getGlobalObject,\n getLocationHref,\n isErrorEvent,\n isPrimitive,\n isString,\n logger,\n} from '@sentry/utils';\n\nimport { eventFromUnknownInput } from '../eventbuilder';\nimport { shouldIgnoreOnError } from '../helpers';\n\n/** JSDoc */\ninterface GlobalHandlersIntegrations {\n onerror: boolean;\n onunhandledrejection: boolean;\n}\n\n/** Global handlers */\nexport class GlobalHandlers implements Integration {\n /**\n * @inheritDoc\n */\n public name: string = GlobalHandlers.id;\n\n /**\n * @inheritDoc\n */\n public static id: string = 'GlobalHandlers';\n\n /** JSDoc */\n private readonly _options: GlobalHandlersIntegrations;\n\n /** JSDoc */\n private readonly _global: Window = getGlobalObject();\n\n /** JSDoc */\n private _oldOnErrorHandler: OnErrorEventHandler = null;\n\n /** JSDoc */\n private _oldOnUnhandledRejectionHandler: ((e: any) => void) | null = null;\n\n /** JSDoc */\n private _onErrorHandlerInstalled: boolean = false;\n\n /** JSDoc */\n private _onUnhandledRejectionHandlerInstalled: boolean = false;\n\n /** JSDoc */\n public constructor(options?: GlobalHandlersIntegrations) {\n this._options = {\n onerror: true,\n onunhandledrejection: true,\n ...options,\n };\n }\n /**\n * @inheritDoc\n */\n public setupOnce(): void {\n Error.stackTraceLimit = 50;\n\n if (this._options.onerror) {\n logger.log('Global Handler attached: onerror');\n this._installGlobalOnErrorHandler();\n }\n\n if (this._options.onunhandledrejection) {\n logger.log('Global Handler attached: onunhandledrejection');\n this._installGlobalOnUnhandledRejectionHandler();\n }\n }\n\n /** JSDoc */\n private _installGlobalOnErrorHandler(): void {\n if (this._onErrorHandlerInstalled) {\n return;\n }\n\n const self = this; // tslint:disable-line:no-this-assignment\n this._oldOnErrorHandler = this._global.onerror;\n\n this._global.onerror = function(msg: any, url: any, line: any, column: any, error: any): boolean {\n const currentHub = getCurrentHub();\n const hasIntegration = currentHub.getIntegration(GlobalHandlers);\n const isFailedOwnDelivery = error && error.__sentry_own_request__ === true;\n\n if (!hasIntegration || shouldIgnoreOnError() || isFailedOwnDelivery) {\n if (self._oldOnErrorHandler) {\n return self._oldOnErrorHandler.apply(this, arguments);\n }\n return false;\n }\n\n const client = currentHub.getClient();\n const event = isPrimitive(error)\n ? self._eventFromIncompleteOnError(msg, url, line, column)\n : self._enhanceEventWithInitialFrame(\n eventFromUnknownInput(error, undefined, {\n attachStacktrace: client && client.getOptions().attachStacktrace,\n rejection: false,\n }),\n url,\n line,\n column,\n );\n\n addExceptionMechanism(event, {\n handled: false,\n type: 'onerror',\n });\n\n currentHub.captureEvent(event, {\n originalException: error,\n });\n\n if (self._oldOnErrorHandler) {\n return self._oldOnErrorHandler.apply(this, arguments);\n }\n\n return false;\n };\n\n this._onErrorHandlerInstalled = true;\n }\n\n /** JSDoc */\n private _installGlobalOnUnhandledRejectionHandler(): void {\n if (this._onUnhandledRejectionHandlerInstalled) {\n return;\n }\n\n const self = this; // tslint:disable-line:no-this-assignment\n this._oldOnUnhandledRejectionHandler = this._global.onunhandledrejection;\n\n this._global.onunhandledrejection = function(e: any): boolean {\n let error = e;\n try {\n error = e && 'reason' in e ? e.reason : e;\n } catch (_oO) {\n // no-empty\n }\n\n const currentHub = getCurrentHub();\n const hasIntegration = currentHub.getIntegration(GlobalHandlers);\n const isFailedOwnDelivery = error && error.__sentry_own_request__ === true;\n\n if (!hasIntegration || shouldIgnoreOnError() || isFailedOwnDelivery) {\n if (self._oldOnUnhandledRejectionHandler) {\n return self._oldOnUnhandledRejectionHandler.apply(this, arguments);\n }\n return false;\n }\n\n const client = currentHub.getClient();\n const event = isPrimitive(error)\n ? self._eventFromIncompleteRejection(error)\n : eventFromUnknownInput(error, undefined, {\n attachStacktrace: client && client.getOptions().attachStacktrace,\n rejection: true,\n });\n\n event.level = Severity.Error;\n\n addExceptionMechanism(event, {\n handled: false,\n type: 'onunhandledrejection',\n });\n\n currentHub.captureEvent(event, {\n originalException: error,\n });\n\n if (self._oldOnUnhandledRejectionHandler) {\n return self._oldOnUnhandledRejectionHandler.apply(this, arguments);\n }\n\n return false;\n };\n\n this._onUnhandledRejectionHandlerInstalled = true;\n }\n\n /**\n * This function creates a stack from an old, error-less onerror handler.\n */\n private _eventFromIncompleteOnError(msg: any, url: any, line: any, column: any): Event {\n const ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/i;\n\n // If 'message' is ErrorEvent, get real message from inside\n let message = isErrorEvent(msg) ? msg.message : msg;\n let name;\n\n if (isString(message)) {\n const groups = message.match(ERROR_TYPES_RE);\n if (groups) {\n name = groups[1];\n message = groups[2];\n }\n }\n\n const event = {\n exception: {\n values: [\n {\n type: name || 'Error',\n value: message,\n },\n ],\n },\n };\n\n return this._enhanceEventWithInitialFrame(event, url, line, column);\n }\n\n /**\n * This function creates an Event from an TraceKitStackTrace that has part of it missing.\n */\n private _eventFromIncompleteRejection(error: any): Event {\n return {\n exception: {\n values: [\n {\n type: 'UnhandledRejection',\n value: `Non-Error promise rejection captured with value: ${error}`,\n },\n ],\n },\n };\n }\n\n /** JSDoc */\n private _enhanceEventWithInitialFrame(event: Event, url: any, line: any, column: any): Event {\n event.exception = event.exception || {};\n event.exception.values = event.exception.values || [];\n event.exception.values[0] = event.exception.values[0] || {};\n event.exception.values[0].stacktrace = event.exception.values[0].stacktrace || {};\n event.exception.values[0].stacktrace.frames = event.exception.values[0].stacktrace.frames || [];\n\n if (event.exception.values[0].stacktrace.frames.length === 0) {\n event.exception.values[0].stacktrace.frames.push({\n colno: column,\n filename: url || getLocationHref(),\n function: '?',\n in_app: true,\n lineno: line,\n });\n }\n\n return event;\n }\n}\n","import { Integration, WrappedFunction } from '@sentry/types';\nimport { fill, getGlobalObject } from '@sentry/utils';\n\nimport { wrap } from '../helpers';\n\n/** Wrap timer functions and event targets to catch errors and provide better meta data */\nexport class TryCatch implements Integration {\n /** JSDoc */\n private _ignoreOnError: number = 0;\n\n /**\n * @inheritDoc\n */\n public name: string = TryCatch.id;\n\n /**\n * @inheritDoc\n */\n public static id: string = 'TryCatch';\n\n /** JSDoc */\n private _wrapTimeFunction(original: () => void): () => number {\n return function(this: any, ...args: any[]): number {\n const originalCallback = args[0];\n args[0] = wrap(originalCallback, {\n mechanism: {\n data: { function: getFunctionName(original) },\n handled: true,\n type: 'instrument',\n },\n });\n return original.apply(this, args);\n };\n }\n\n /** JSDoc */\n private _wrapRAF(original: any): (callback: () => void) => any {\n return function(this: any, callback: () => void): () => void {\n return original(\n wrap(callback, {\n mechanism: {\n data: {\n function: 'requestAnimationFrame',\n handler: getFunctionName(original),\n },\n handled: true,\n type: 'instrument',\n },\n }),\n );\n };\n }\n\n /** JSDoc */\n private _wrapEventTarget(target: string): void {\n const global = getGlobalObject() as { [key: string]: any };\n const proto = global[target] && global[target].prototype;\n\n if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {\n return;\n }\n\n fill(proto, 'addEventListener', function(\n original: () => void,\n ): (eventName: string, fn: EventListenerObject, options?: boolean | AddEventListenerOptions) => void {\n return function(\n this: any,\n eventName: string,\n fn: EventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ): (eventName: string, fn: EventListenerObject, capture?: boolean, secure?: boolean) => void {\n try {\n // tslint:disable-next-line:no-unbound-method strict-type-predicates\n if (typeof fn.handleEvent === 'function') {\n fn.handleEvent = wrap(fn.handleEvent.bind(fn), {\n mechanism: {\n data: {\n function: 'handleEvent',\n handler: getFunctionName(fn),\n target,\n },\n handled: true,\n type: 'instrument',\n },\n });\n }\n } catch (err) {\n // can sometimes get 'Permission denied to access property \"handle Event'\n }\n\n return original.call(\n this,\n eventName,\n wrap((fn as any) as WrappedFunction, {\n mechanism: {\n data: {\n function: 'addEventListener',\n handler: getFunctionName(fn),\n target,\n },\n handled: true,\n type: 'instrument',\n },\n }),\n options,\n );\n };\n });\n\n fill(proto, 'removeEventListener', function(\n original: () => void,\n ): (this: any, eventName: string, fn: EventListenerObject, options?: boolean | EventListenerOptions) => () => void {\n return function(\n this: any,\n eventName: string,\n fn: EventListenerObject,\n options?: boolean | EventListenerOptions,\n ): () => void {\n let callback = (fn as any) as WrappedFunction;\n try {\n callback = callback && (callback.__sentry_wrapped__ || callback);\n } catch (e) {\n // ignore, accessing __sentry_wrapped__ will throw in some Selenium environments\n }\n return original.call(this, eventName, callback, options);\n };\n });\n }\n\n /**\n * Wrap timer functions and event targets to catch errors\n * and provide better metadata.\n */\n public setupOnce(): void {\n this._ignoreOnError = this._ignoreOnError;\n\n const global = getGlobalObject();\n\n fill(global, 'setTimeout', this._wrapTimeFunction.bind(this));\n fill(global, 'setInterval', this._wrapTimeFunction.bind(this));\n fill(global, 'requestAnimationFrame', this._wrapRAF.bind(this));\n\n [\n 'EventTarget',\n 'Window',\n 'Node',\n 'ApplicationCache',\n 'AudioTrackList',\n 'ChannelMergerNode',\n 'CryptoOperation',\n 'EventSource',\n 'FileReader',\n 'HTMLUnknownElement',\n 'IDBDatabase',\n 'IDBRequest',\n 'IDBTransaction',\n 'KeyOperation',\n 'MediaController',\n 'MessagePort',\n 'ModalWindow',\n 'Notification',\n 'SVGElementInstance',\n 'Screen',\n 'TextTrack',\n 'TextTrackCue',\n 'TextTrackList',\n 'WebSocket',\n 'WebSocketWorker',\n 'Worker',\n 'XMLHttpRequest',\n 'XMLHttpRequestEventTarget',\n 'XMLHttpRequestUpload',\n ].forEach(this._wrapEventTarget.bind(this));\n }\n}\n\n/**\n * Safely extract function name from itself\n */\nfunction getFunctionName(fn: any): string {\n try {\n return (fn && fn.name) || '';\n } catch (e) {\n // Just accessing custom props in some Selenium environments\n // can cause a \"Permission denied\" exception (see raven-js#495).\n return '';\n }\n}\n","import { API, getCurrentHub } from '@sentry/core';\nimport { Breadcrumb, BreadcrumbHint, Integration, Severity, WrappedFunction } from '@sentry/types';\nimport {\n fill,\n getEventDescription,\n getGlobalObject,\n isString,\n logger,\n normalize,\n parseUrl,\n safeJoin,\n supportsHistory,\n supportsNativeFetch,\n} from '@sentry/utils';\n\nimport { BrowserClient } from '../client';\nimport { breadcrumbEventHandler, keypressEventHandler, wrap } from '../helpers';\n\nconst global = getGlobalObject();\nlet lastHref: string | undefined;\n/**\n * @hidden\n */\nexport interface SentryWrappedXMLHttpRequest extends XMLHttpRequest {\n [key: string]: any;\n __sentry_xhr__?: {\n method?: string;\n url?: string;\n status_code?: number;\n };\n}\n\n/** JSDoc */\ninterface BreadcrumbIntegrations {\n console?: boolean;\n dom?: boolean;\n fetch?: boolean;\n history?: boolean;\n sentry?: boolean;\n xhr?: boolean;\n}\n\ntype XMLHttpRequestProp = 'onload' | 'onerror' | 'onprogress';\n\n/** Default Breadcrumbs instrumentations */\nexport class Breadcrumbs implements Integration {\n /**\n * @inheritDoc\n */\n public name: string = Breadcrumbs.id;\n\n /**\n * @inheritDoc\n */\n public static id: string = 'Breadcrumbs';\n\n /** JSDoc */\n private readonly _options: BreadcrumbIntegrations;\n\n /**\n * @inheritDoc\n */\n public constructor(options?: BreadcrumbIntegrations) {\n this._options = {\n console: true,\n dom: true,\n fetch: true,\n history: true,\n sentry: true,\n xhr: true,\n ...options,\n };\n }\n\n /** JSDoc */\n private _instrumentConsole(): void {\n if (!('console' in global)) {\n return;\n }\n ['debug', 'info', 'warn', 'error', 'log', 'assert'].forEach(function(level: string): void {\n if (!(level in global.console)) {\n return;\n }\n\n fill(global.console, level, function(originalConsoleLevel: () => any): Function {\n return function(...args: any[]): void {\n const breadcrumbData = {\n category: 'console',\n data: {\n extra: {\n arguments: normalize(args, 3),\n },\n logger: 'console',\n },\n level: Severity.fromString(level),\n message: safeJoin(args, ' '),\n };\n\n if (level === 'assert') {\n if (args[0] === false) {\n breadcrumbData.message = `Assertion failed: ${safeJoin(args.slice(1), ' ') || 'console.assert'}`;\n breadcrumbData.data.extra.arguments = normalize(args.slice(1), 3);\n Breadcrumbs.addBreadcrumb(breadcrumbData, {\n input: args,\n level,\n });\n }\n } else {\n Breadcrumbs.addBreadcrumb(breadcrumbData, {\n input: args,\n level,\n });\n }\n\n // this fails for some browsers. :(\n if (originalConsoleLevel) {\n Function.prototype.apply.call(originalConsoleLevel, global.console, args);\n }\n };\n });\n });\n }\n\n /** JSDoc */\n private _instrumentDOM(): void {\n if (!('document' in global)) {\n return;\n }\n\n // Capture breadcrumbs from any click that is unhandled / bubbled up all the way\n // to the document. Do this before we instrument addEventListener.\n global.document.addEventListener('click', breadcrumbEventHandler('click'), false);\n global.document.addEventListener('keypress', keypressEventHandler(), false);\n\n // After hooking into document bubbled up click and keypresses events, we also hook into user handled click & keypresses.\n ['EventTarget', 'Node'].forEach((target: string) => {\n const proto = (global as any)[target] && (global as any)[target].prototype;\n\n if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {\n return;\n }\n\n fill(proto, 'addEventListener', function(\n original: () => void,\n ): (\n eventName: string,\n fn: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) => void {\n return function(\n this: any,\n eventName: string,\n fn: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ): (eventName: string, fn: EventListenerOrEventListenerObject, capture?: boolean, secure?: boolean) => void {\n if (fn && (fn as EventListenerObject).handleEvent) {\n if (eventName === 'click') {\n fill(fn, 'handleEvent', function(innerOriginal: () => void): (caughtEvent: Event) => void {\n return function(this: any, event: Event): (event: Event) => void {\n breadcrumbEventHandler('click')(event);\n return innerOriginal.call(this, event);\n };\n });\n }\n if (eventName === 'keypress') {\n fill(fn, 'handleEvent', function(innerOriginal: () => void): (caughtEvent: Event) => void {\n return function(this: any, event: Event): (event: Event) => void {\n keypressEventHandler()(event);\n return innerOriginal.call(this, event);\n };\n });\n }\n } else {\n if (eventName === 'click') {\n breadcrumbEventHandler('click', true)(this);\n }\n if (eventName === 'keypress') {\n keypressEventHandler()(this);\n }\n }\n\n return original.call(this, eventName, fn, options);\n };\n });\n\n fill(proto, 'removeEventListener', function(\n original: () => void,\n ): (\n this: any,\n eventName: string,\n fn: EventListenerOrEventListenerObject,\n options?: boolean | EventListenerOptions,\n ) => () => void {\n return function(\n this: any,\n eventName: string,\n fn: EventListenerOrEventListenerObject,\n options?: boolean | EventListenerOptions,\n ): () => void {\n let callback = fn as WrappedFunction;\n try {\n callback = callback && (callback.__sentry_wrapped__ || callback);\n } catch (e) {\n // ignore, accessing __sentry_wrapped__ will throw in some Selenium environments\n }\n return original.call(this, eventName, callback, options);\n };\n });\n });\n }\n\n /** JSDoc */\n private _instrumentFetch(): void {\n if (!supportsNativeFetch()) {\n return;\n }\n\n fill(global, 'fetch', function(originalFetch: () => void): () => void {\n return function(...args: any[]): void {\n const fetchInput = args[0];\n let method = 'GET';\n let url;\n\n if (typeof fetchInput === 'string') {\n url = fetchInput;\n } else if ('Request' in global && fetchInput instanceof Request) {\n url = fetchInput.url;\n if (fetchInput.method) {\n method = fetchInput.method;\n }\n } else {\n url = String(fetchInput);\n }\n\n if (args[1] && args[1].method) {\n method = args[1].method;\n }\n\n const client = getCurrentHub().getClient();\n const dsn = client && client.getDsn();\n if (dsn) {\n const filterUrl = new API(dsn).getStoreEndpoint();\n // if Sentry key appears in URL, don't capture it as a request\n // but rather as our own 'sentry' type breadcrumb\n if (filterUrl && url.indexOf(filterUrl) !== -1) {\n if (method === 'POST' && args[1] && args[1].body) {\n addSentryBreadcrumb(args[1].body);\n }\n return originalFetch.apply(global, args);\n }\n }\n\n const fetchData: {\n method: string;\n url: string;\n status_code?: number;\n } = {\n method: isString(method) ? method.toUpperCase() : method,\n url,\n };\n\n return originalFetch\n .apply(global, args)\n .then((response: Response) => {\n fetchData.status_code = response.status;\n Breadcrumbs.addBreadcrumb(\n {\n category: 'fetch',\n data: fetchData,\n type: 'http',\n },\n {\n input: args,\n response,\n },\n );\n return response;\n })\n .then(null, (error: Error) => {\n Breadcrumbs.addBreadcrumb(\n {\n category: 'fetch',\n data: fetchData,\n level: Severity.Error,\n type: 'http',\n },\n {\n error,\n input: args,\n },\n );\n\n throw error;\n });\n };\n });\n }\n\n /** JSDoc */\n private _instrumentHistory(): void {\n if (!supportsHistory()) {\n return;\n }\n\n const captureUrlChange = (from: string | undefined, to: string | undefined): void => {\n const parsedLoc = parseUrl(global.location.href);\n const parsedTo = parseUrl(to as string);\n let parsedFrom = parseUrl(from as string);\n\n // Initial pushState doesn't provide `from` information\n if (!parsedFrom.path) {\n parsedFrom = parsedLoc;\n }\n\n // because onpopstate only tells you the \"new\" (to) value of location.href, and\n // not the previous (from) value, we need to track the value of the current URL\n // state ourselves\n lastHref = to;\n\n // Use only the path component of the URL if the URL matches the current\n // document (almost all the time when using pushState)\n if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host) {\n // tslint:disable-next-line:no-parameter-reassignment\n to = parsedTo.relative;\n }\n if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host) {\n // tslint:disable-next-line:no-parameter-reassignment\n from = parsedFrom.relative;\n }\n\n Breadcrumbs.addBreadcrumb({\n category: 'navigation',\n data: {\n from,\n to,\n },\n });\n };\n\n // record navigation (URL) changes\n const oldOnPopState = global.onpopstate;\n global.onpopstate = (...args: any[]) => {\n const currentHref = global.location.href;\n captureUrlChange(lastHref, currentHref);\n if (oldOnPopState) {\n return oldOnPopState.apply(this, args);\n }\n };\n\n /**\n * @hidden\n */\n function historyReplacementFunction(originalHistoryFunction: () => void): () => void {\n // note history.pushState.length is 0; intentionally not declaring\n // params to preserve 0 arity\n return function(this: History, ...args: any[]): void {\n const url = args.length > 2 ? args[2] : undefined;\n // url argument is optional\n if (url) {\n // coerce to string (this is what pushState does)\n captureUrlChange(lastHref, String(url));\n }\n return originalHistoryFunction.apply(this, args);\n };\n }\n\n fill(global.history, 'pushState', historyReplacementFunction);\n fill(global.history, 'replaceState', historyReplacementFunction);\n }\n\n /** JSDoc */\n private _instrumentXHR(): void {\n if (!('XMLHttpRequest' in global)) {\n return;\n }\n\n /**\n * @hidden\n */\n function wrapProp(prop: XMLHttpRequestProp, xhr: XMLHttpRequest): void {\n if (prop in xhr && typeof xhr[prop] === 'function') {\n fill(xhr, prop, original =>\n wrap(original, {\n mechanism: {\n data: {\n function: prop,\n handler: (original && original.name) || '',\n },\n handled: true,\n type: 'instrument',\n },\n }),\n );\n }\n }\n\n const xhrproto = XMLHttpRequest.prototype;\n fill(\n xhrproto,\n 'open',\n originalOpen =>\n function(this: SentryWrappedXMLHttpRequest, ...args: any[]): void {\n const url = args[1];\n this.__sentry_xhr__ = {\n method: isString(args[0]) ? args[0].toUpperCase() : args[0],\n url: args[1],\n };\n\n const client = getCurrentHub().getClient();\n const dsn = client && client.getDsn();\n if (dsn) {\n const filterUrl = new API(dsn).getStoreEndpoint();\n // if Sentry key appears in URL, don't capture it as a request\n // but rather as our own 'sentry' type breadcrumb\n if (isString(url) && (filterUrl && url.indexOf(filterUrl) !== -1)) {\n this.__sentry_own_request__ = true;\n }\n }\n\n return originalOpen.apply(this, args);\n },\n );\n\n fill(\n xhrproto,\n 'send',\n originalSend =>\n function(this: SentryWrappedXMLHttpRequest, ...args: any[]): void {\n const xhr = this; // tslint:disable-line:no-this-assignment\n\n if (xhr.__sentry_own_request__) {\n addSentryBreadcrumb(args[0]);\n }\n\n /**\n * @hidden\n */\n function onreadystatechangeHandler(): void {\n if (xhr.readyState === 4) {\n if (xhr.__sentry_own_request__) {\n return;\n }\n try {\n // touching statusCode in some platforms throws\n // an exception\n if (xhr.__sentry_xhr__) {\n xhr.__sentry_xhr__.status_code = xhr.status;\n }\n } catch (e) {\n /* do nothing */\n }\n Breadcrumbs.addBreadcrumb(\n {\n category: 'xhr',\n data: xhr.__sentry_xhr__,\n type: 'http',\n },\n {\n xhr,\n },\n );\n }\n }\n\n const xmlHttpRequestProps: XMLHttpRequestProp[] = ['onload', 'onerror', 'onprogress'];\n xmlHttpRequestProps.forEach(prop => {\n wrapProp(prop, xhr);\n });\n\n if ('onreadystatechange' in xhr && typeof xhr.onreadystatechange === 'function') {\n fill(xhr, 'onreadystatechange', function(original: () => void): void {\n return wrap(\n original,\n {\n mechanism: {\n data: {\n function: 'onreadystatechange',\n handler: (original && original.name) || '',\n },\n handled: true,\n type: 'instrument',\n },\n },\n onreadystatechangeHandler,\n );\n });\n } else {\n // if onreadystatechange wasn't actually set by the page on this xhr, we\n // are free to set our own and capture the breadcrumb\n xhr.onreadystatechange = onreadystatechangeHandler;\n }\n return originalSend.apply(this, args);\n },\n );\n }\n\n /**\n * Helper that checks if integration is enabled on the client.\n * @param breadcrumb Breadcrumb\n * @param hint BreadcrumbHint\n */\n public static addBreadcrumb(breadcrumb: Breadcrumb, hint?: BreadcrumbHint): void {\n if (getCurrentHub().getIntegration(Breadcrumbs)) {\n getCurrentHub().addBreadcrumb(breadcrumb, hint);\n }\n }\n\n /**\n * Instrument browser built-ins w/ breadcrumb capturing\n * - Console API\n * - DOM API (click/typing)\n * - XMLHttpRequest API\n * - Fetch API\n * - History API\n */\n public setupOnce(): void {\n if (this._options.console) {\n this._instrumentConsole();\n }\n if (this._options.dom) {\n this._instrumentDOM();\n }\n if (this._options.xhr) {\n this._instrumentXHR();\n }\n if (this._options.fetch) {\n this._instrumentFetch();\n }\n if (this._options.history) {\n this._instrumentHistory();\n }\n }\n}\n\n/** JSDoc */\nfunction addSentryBreadcrumb(serializedData: string): void {\n // There's always something that can go wrong with deserialization...\n try {\n const event = JSON.parse(serializedData);\n Breadcrumbs.addBreadcrumb(\n {\n category: 'sentry',\n event_id: event.event_id,\n level: event.level || Severity.fromString('error'),\n message: getEventDescription(event),\n },\n {\n event,\n },\n );\n } catch (_oO) {\n logger.error('Error while adding sentry type breadcrumb');\n }\n}\n","import { addGlobalEventProcessor, getCurrentHub } from '@sentry/core';\nimport { Event, EventHint, Exception, ExtendedError, Integration } from '@sentry/types';\n\nimport { exceptionFromStacktrace } from '../parsers';\nimport { computeStackTrace } from '../tracekit';\n\nconst DEFAULT_KEY = 'cause';\nconst DEFAULT_LIMIT = 5;\n\n/** Adds SDK info to an event. */\nexport class LinkedErrors implements Integration {\n /**\n * @inheritDoc\n */\n public readonly name: string = LinkedErrors.id;\n\n /**\n * @inheritDoc\n */\n public static id: string = 'LinkedErrors';\n\n /**\n * @inheritDoc\n */\n private readonly _key: string;\n\n /**\n * @inheritDoc\n */\n private readonly _limit: number;\n\n /**\n * @inheritDoc\n */\n public constructor(options: { key?: string; limit?: number } = {}) {\n this._key = options.key || DEFAULT_KEY;\n this._limit = options.limit || DEFAULT_LIMIT;\n }\n\n /**\n * @inheritDoc\n */\n public setupOnce(): void {\n addGlobalEventProcessor((event: Event, hint?: EventHint) => {\n const self = getCurrentHub().getIntegration(LinkedErrors);\n if (self) {\n return self._handler(event, hint);\n }\n return event;\n });\n }\n\n /**\n * @inheritDoc\n */\n private _handler(event: Event, hint?: EventHint): Event | null {\n if (!event.exception || !event.exception.values || !hint || !(hint.originalException instanceof Error)) {\n return event;\n }\n const linkedErrors = this._walkErrorTree(hint.originalException, this._key);\n event.exception.values = [...linkedErrors, ...event.exception.values];\n return event;\n }\n\n /**\n * @inheritDoc\n */\n private _walkErrorTree(error: ExtendedError, key: string, stack: Exception[] = []): Exception[] {\n if (!(error[key] instanceof Error) || stack.length + 1 >= this._limit) {\n return stack;\n }\n const stacktrace = computeStackTrace(error[key]);\n const exception = exceptionFromStacktrace(stacktrace);\n return this._walkErrorTree(error[key], key, [exception, ...stack]);\n }\n}\n","import { addGlobalEventProcessor, getCurrentHub } from '@sentry/core';\nimport { Event, Integration } from '@sentry/types';\nimport { getGlobalObject } from '@sentry/utils';\n\nconst global = getGlobalObject();\n\n/** UserAgent */\nexport class UserAgent implements Integration {\n /**\n * @inheritDoc\n */\n public name: string = UserAgent.id;\n\n /**\n * @inheritDoc\n */\n public static id: string = 'UserAgent';\n\n /**\n * @inheritDoc\n */\n public setupOnce(): void {\n addGlobalEventProcessor((event: Event) => {\n if (getCurrentHub().getIntegration(UserAgent)) {\n if (!global.navigator || !global.location) {\n return event;\n }\n\n // Request Interface: https://docs.sentry.io/development/sdk-dev/event-payloads/request/\n const request = event.request || {};\n request.url = request.url || global.location.href;\n request.headers = request.headers || {};\n request.headers['User-Agent'] = global.navigator.userAgent;\n\n return {\n ...event,\n request,\n };\n }\n return event;\n });\n }\n}\n","import { getCurrentHub, initAndBind, Integrations as CoreIntegrations } from '@sentry/core';\nimport { getGlobalObject, SyncPromise } from '@sentry/utils';\n\nimport { BrowserOptions } from './backend';\nimport { BrowserClient, ReportDialogOptions } from './client';\nimport { wrap as internalWrap } from './helpers';\nimport { Breadcrumbs, GlobalHandlers, LinkedErrors, TryCatch, UserAgent } from './integrations';\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 UserAgent(),\n];\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 const window = getGlobalObject();\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 initAndBind(BrowserClient, options);\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 = {}): void {\n if (!options.eventId) {\n options.eventId = getCurrentHub().lastEventId();\n }\n const client = getCurrentHub().getClient();\n if (client) {\n client.showReportDialog(options);\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 * A promise that resolves when all current events have been sent.\n * If you provide a timeout and the queue takes longer to drain the promise returns false.\n *\n * @param timeout Maximum time in ms the client should wait.\n */\nexport function flush(timeout?: number): PromiseLike {\n const client = getCurrentHub().getClient();\n if (client) {\n return client.flush(timeout);\n }\n return SyncPromise.reject(false);\n}\n\n/**\n * A promise that resolves when all current events have been sent.\n * If you provide a timeout and the queue takes longer to drain the promise returns false.\n *\n * @param timeout Maximum time in ms the client should wait.\n */\nexport function close(timeout?: number): PromiseLike {\n const client = getCurrentHub().getClient();\n if (client) {\n return client.close(timeout);\n }\n return SyncPromise.reject(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 */\nexport function wrap(fn: Function): any {\n // tslint:disable-next-line: no-unsafe-any\n return internalWrap(fn)();\n}\n","export {\n Breadcrumb,\n Request,\n SdkInfo,\n Event,\n Exception,\n Response,\n Severity,\n StackFrame,\n Stacktrace,\n Status,\n Thread,\n User,\n} from '@sentry/types';\n\nexport {\n addGlobalEventProcessor,\n addBreadcrumb,\n captureException,\n captureEvent,\n captureMessage,\n configureScope,\n getHubFromCarrier,\n getCurrentHub,\n Hub,\n Scope,\n setContext,\n setExtra,\n setExtras,\n setTag,\n setTags,\n setUser,\n Span,\n withScope,\n} from '@sentry/core';\n\nexport { BrowserOptions } from './backend';\nexport { BrowserClient, ReportDialogOptions } from './client';\nexport { defaultIntegrations, forceLoad, init, lastEventId, onLoad, showReportDialog, flush, close, wrap } from './sdk';\nexport { SDK_NAME, SDK_VERSION } from './version';\n\nimport { Integrations as CoreIntegrations } from '@sentry/core';\nimport { getGlobalObject } from '@sentry/utils';\n\nimport * as BrowserIntegrations from './integrations';\nimport * as Transports from './transports';\n\nlet windowIntegrations = {};\n\n// This block is needed to add compatibility with the integrations packages when used with a CDN\n// tslint:disable: no-unsafe-any\nconst _window = getGlobalObject();\nif (_window.Sentry && _window.Sentry.Integrations) {\n windowIntegrations = _window.Sentry.Integrations;\n}\n// tslint:enable: no-unsafe-any\n\nconst INTEGRATIONS = {\n ...windowIntegrations,\n ...CoreIntegrations,\n ...BrowserIntegrations,\n};\n\nexport { INTEGRATIONS as Integrations, Transports };\n","import { getCurrentHub } from '@sentry/hub';\nimport { Client, Options } from '@sentry/types';\nimport { logger } from '@sentry/utils';\n\n/** A class object that can instanciate Client objects. */\nexport type ClientClass = new (options: O) => F;\n\n/**\n * Internal function to create a new SDK client instance. The client is\n * installed and then bound to the current scope.\n *\n * @param clientClass The client class to instanciate.\n * @param options Options to pass to the client.\n */\nexport function initAndBind(clientClass: ClientClass, options: O): void {\n if (options.debug === true) {\n logger.enable();\n }\n getCurrentHub().bindClient(new clientClass(options));\n}\n"],"names":["LogLevel","Severity","Status","level","Debug","Info","Warning","Error","Fatal","Critical","Log","code","Success","RateLimit","Invalid","Failed","Unknown","setPrototypeOf","Object","__proto__","Array","obj","proto","prop","hasOwnProperty","message","_super","_this","name","_newTarget","prototype","constructor","tslib_1.__extends","isError","wat","toString","call","isErrorEvent","isDOMError","isString","isPrimitive","isPlainObject","isEvent","Event","isElement","Element","isThenable","Boolean","then","isNodeEnv","process","fallbackGlobalObject","getGlobalObject","global","window","self","uuid4","crypto","msCrypto","getRandomValues","arr","Uint16Array","pad","num","v","length","replace","c","r","Math","random","parseUrl","url","match","query","fragment","host","path","protocol","relative","getEventDescription","event","exception","values","type","value","event_id","consoleSandbox","callback","originalConsole","console","wrappedLevels","forEach","__sentry__","__sentry_wrapped__","__sentry_original__","result","keys","addExceptionTypeValue","addExceptionMechanism","mechanism","key","_oO","getLocationHref","document","location","href","oO","htmlTreeAsString","elem","currentElem","out","height","len","sepLength","nextStr","_htmlElementAsString","push","parentNode","reverse","join","className","classes","attr","i","tagName","toLowerCase","id","split","attrWhitelist","getAttribute","PREFIX","this","_enabled","Logger","_i","args","log","warn","error","__SENTRY__","States","logger","_hasWeakSet","WeakSet","_inner","Memo","has","add","delete","splice","truncate","str","max","substr","safeJoin","input","delimiter","isArray","output","String","e","isMatchingPattern","pattern","test","indexOf","fill","source","replacement","original","wrapped","defineProperties","enumerable","_Oo","getWalkSource","err","stack","target","currentTarget","CustomEvent","detail","jsonSize","encodeURI","utf8Length","JSON","stringify","normalizeToSize","object","depth","maxSize","serialized","normalize","normalizeValue","_events","walk","memo","Infinity","normalized","serializeValue","toJSON","acc","memoize","innerKey","unmemoize","parse","extractExceptionKeysForMessage","maxLength","sort","includedKeys","slice","executor","PENDING","_setResult","RESOLVED","reason","REJECTED","state","_state","_resolve","_reject","_value","_executeHandlers","handler","_handlers","concat","onrejected","onfulfilled","SyncPromise","resolve","_","reject","collection","counter","resolvedCollection","item","index","TypeError","_attachHandler","val","onfinally","isRejected","_limit","PromiseBuffer","undefined","task","isReady","_buffer","remove","SentryError","timeout","capturedSetTimeout","setTimeout","all","clearTimeout","supportsFetch","Headers","Request","Response","supportsReferrerPolicy","referrerPolicy","TRACEPARENT_REGEXP","_traceId","_spanId","_sampled","_parent","substring","Span","parent","sampled","traceparent","matches","parent_1","span_id","trace_id","Scope","_scopeListeners","_eventProcessors","_notifyingListeners","processors","hint","processor","final","_notifyEventProcessors","user","_user","_notifyScopeListeners","tags","_tags","extra","_extra","fingerprint","_fingerprint","_level","transaction","_transaction","context","_context","span","_span","parentSpan","setParent","setSpan","scope","newScope","_breadcrumbs","breadcrumb","maxBreadcrumbs","timestamp","Date","getTime","mergedBreadcrumb","tslib_1.__spread","contexts","trace","_applyFingerprint","breadcrumbs","getGlobalEventProcessors","globalEventProcessors","addGlobalEventProcessor","API_VERSION","client","_version","_stack","Hub","method","top","getStackTop","_a","version","getStack","parentScope","clone","getClient","pop","pushScope","popScope","eventId","_lastEventId","finalHint","syntheticException","originalException","_invokeClient","_b","beforeBreadcrumb","_c","finalBreadcrumb","addBreadcrumb","min","setUser","setTags","extras","setExtras","setTag","setExtra","setContext","oldHub","makeMain","integration","getIntegration","getSpan","sentry-trace","toTraceparent","getMainCarrier","carrier","hub","registry","getHubFromCarrier","setHubOnCarrier","getCurrentHub","hasHubOnCarrier","isOlderThan","domain","mod","module","request","require","activeDomain","active","registryHubTopStack","getHubFromActiveDomain","callOnHub","captureException","withScope","DSN_REGEX","from","_fromString","_fromComponents","_validate","Dsn","withPassword","pass","port","projectId","exec","components","component","isNaN","parseInt","dsn","_dsnObject","API","_getBaseUrl","getStoreEndpointPath","auth","sentry_key","sentry_version","getStoreEndpoint","map","encodeURIComponent","clientName","clientVersion","header","Content-Type","X-Sentry-Auth","dialogOptions","endpoint","encodedOptions","email","installedIntegrations","setupIntegrations","options","integrations","defaultIntegrations","userIntegrations","userIntegrationsNames_1","pickedIntegrationsNames_1","defaultIntegration","userIntegration","getIntegrationsToSetup","setupOnce","setupIntegration","originalFunctionToString","backendClass","_backend","_options","_dsn","_isEnabled","_integrations","BaseClient","_processing","_getBackend","eventFromException","_processEvent","finalEvent","eventFromMessage","_isClientProcessing","status","clearInterval","interval","getTransport","close","transportFlushed","ready","flush","getOptions","enabled","ticked","setInterval","environment","release","dist","maxValueLength","prepared","_addIntegrations","sdk","applyToEvent","sdkInfo","integrationsArray","beforeSend","sampleRate","_prepareEvent","data","sendEvent","beforeSendResult","_handleAsyncBeforeSend","processedEvent","NoopTransport","Skipped","_transport","_setupTransport","BaseBackend","_exception","_hint","_message","FunctionToString","Function","apply","DEFAULT_IGNORE_ERRORS","InboundFilters","clientOptions","_mergeOptions","_shouldDropEvent","_isSentryError","_isIgnoredError","_isBlacklistedUrl","_getEventFilterUrl","_isWhitelistedUrl","ignoreInternal","ignoreErrors","_getPossibleEventMessages","some","blacklistUrls","whitelistUrls","stacktrace","frames_1","frames","filename","frames_2","UNKNOWN_FUNCTION","chrome","gecko","winjs","geckoEval","chromeEval","computeStackTrace","ex","popSize","framesToPop","parts","opera10Regex","opera11Regex","lines","line","element","func","column","extractMessage","computeStackTraceFromStacktraceProp","popFrames","submatch","isNative","columnNumber","computeStackTraceFromStackProp","failed","STACKTRACE_LIMIT","exceptionFromStacktrace","prepareFramesForEvent","eventFromStacktrace","localStack","firstFrameFunction","lastFrameFunction","frame","colno","function","in_app","lineno","eventFromUnknownInput","domException","name_1","eventFromString","rejection","__serialized__","eventFromPlainObject","synthetic","attachStacktrace","keypressTimeout","lastCapturedEvent","getStoreEndpointWithUrlEncodedAuth","BaseTransport","drain","FetchTransport","defaultOptions","body","fetch","response","fromHttpCode","XHRTransport","XMLHttpRequest","onreadystatechange","readyState","open","send","BrowserBackend","transportOptions","transport","handled","SDK_NAME","BrowserClient","platform","packages","getDsn","script","createElement","async","src","getReportDialogEndpoint","onLoad","onload","head","appendChild","debounceDuration","ignoreOnError","shouldIgnoreOnError","wrap","fn","before","sentryWrapped","arguments","wrappedArguments","arg","handleEvent","addEventProcessor","property","defineProperty","getOwnPropertyDescriptor","configurable","get","debounceTimer","breadcrumbEventHandler","eventName","debounce","captureBreadcrumb","category","keypressEventHandler","isContentEditable","GlobalHandlers","onerror","onunhandledrejection","stackTraceLimit","_installGlobalOnErrorHandler","_installGlobalOnUnhandledRejectionHandler","_onErrorHandlerInstalled","_oldOnErrorHandler","_global","msg","currentHub","hasIntegration","isFailedOwnDelivery","__sentry_own_request__","_eventFromIncompleteOnError","_enhanceEventWithInitialFrame","captureEvent","_onUnhandledRejectionHandlerInstalled","_oldOnUnhandledRejectionHandler","_eventFromIncompleteRejection","groups","TryCatch","originalCallback","getFunctionName","bind","_ignoreOnError","_wrapTimeFunction","_wrapRAF","_wrapEventTarget","lastHref","Breadcrumbs","dom","history","sentry","xhr","originalConsoleLevel","breadcrumbData","fromString","addEventListener","innerOriginal","isNativeFunc","doc","sandbox","hidden","contentWindow","removeChild","supportsNativeFetch","originalFetch","fetchInput","filterUrl","addSentryBreadcrumb","fetchData","toUpperCase","status_code","isChromePackagedApp","app","runtime","hasHistoryApi","pushState","replaceState","captureUrlChange","to","parsedLoc","parsedTo","parsedFrom","oldOnPopState","onpopstate","currentHref","historyReplacementFunction","originalHistoryFunction","xhrproto","originalOpen","__sentry_xhr__","originalSend","onreadystatechangeHandler","wrapProp","_instrumentConsole","_instrumentDOM","_instrumentXHR","_instrumentFetch","_instrumentHistory","serializedData","event_1","DEFAULT_KEY","DEFAULT_LIMIT","LinkedErrors","_key","limit","_handler","linkedErrors","_walkErrorTree","UserAgent","navigator","headers","userAgent","CoreIntegrations.InboundFilters","CoreIntegrations.FunctionToString","windowIntegrations","_window","Sentry","Integrations","INTEGRATIONS","CoreIntegrations","BrowserIntegrations","window_1","SENTRY_RELEASE","clientClass","debug","enable","bindClient","initAndBind","lastEventId","showReportDialog","internalWrap"],"mappings":"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"}