{"version":3,"file":"bundle.es5.min.js","sources":["../../../utils/src/global.ts","../../../utils/src/is.ts","../../../utils/src/browser.ts","../../../utils/src/error.ts","../../../utils/src/dsn.ts","../../../utils/src/logger.ts","../../../utils/src/string.ts","../../../utils/src/object.ts","../../../utils/src/stacktrace.ts","../../../utils/src/supports.ts","../../../utils/src/instrument.ts","../../../utils/src/syncpromise.ts","../../../utils/src/misc.ts","../../../utils/src/normalize.ts","../../../utils/src/memo.ts","../../../utils/src/promisebuffer.ts","../../../utils/src/severity.ts","../../../utils/src/time.ts","../../../utils/src/envelope.ts","../../../utils/src/ratelimit.ts","../../../hub/src/session.ts","../../../hub/src/scope.ts","../../../hub/src/hub.ts","../../../hub/src/exports.ts","../../../core/src/api.ts","../../../core/src/envelope.ts","../../../utils/src/baggage.ts","../../../core/src/integration.ts","../../../core/src/baseclient.ts","../../../core/src/transports/base.ts","../../../core/src/integrations/functiontostring.ts","../../../core/src/version.ts","../../../core/src/integrations/inboundfilters.ts","../../src/eventbuilder.ts","../../src/integrations/breadcrumbs.ts","../../src/transports/utils.ts","../../src/client.ts","../../../utils/src/clientreport.ts","../../src/transports/fetch.ts","../../src/transports/xhr.ts","../../src/stack-parsers.ts","../../src/helpers.ts","../../src/integrations/globalhandlers.ts","../../src/integrations/trycatch.ts","../../src/integrations/linkederrors.ts","../../src/integrations/httpcontext.ts","../../src/integrations/dedupe.ts","../../src/sdk.ts","../../src/index.ts","../../../core/src/sdk.ts"],"sourcesContent":["/**\n * NOTE: In order to avoid circular dependencies, if you add a function to this module and it needs to print something,\n * you must either a) use `console.log` rather than the logger, or b) put your function elsewhere.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { Integration } from '@sentry/types';\n\nimport { isNodeEnv } from './node';\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\nconst fallbackGlobalObject = {};\n\n/**\n * Safely get global scope object\n *\n * @returns Global scope object\n */\nexport function getGlobalObject(): T & SentryGlobal {\n return (\n isNodeEnv()\n ? global\n : typeof window !== 'undefined' // eslint-disable-line no-restricted-globals\n ? window // eslint-disable-line no-restricted-globals\n : typeof self !== 'undefined'\n ? self\n : fallbackGlobalObject\n ) as T & SentryGlobal;\n}\n\n/**\n * Returns a global singleton contained in the global `__SENTRY__` object.\n *\n * If the singleton doesn't already exist in `__SENTRY__`, it will be created using the given factory\n * function and added to the `__SENTRY__` object.\n *\n * @param name name of the global singleton on __SENTRY__\n * @param creator creator Factory function to create the singleton if it doesn't already exist on `__SENTRY__`\n * @param obj (Optional) The global object on which to look for `__SENTRY__`, if not `getGlobalObject`'s return value\n * @returns the singleton\n */\nexport function getGlobalSingleton(name: keyof SentryGlobal['__SENTRY__'], creator: () => T, obj?: unknown): T {\n const global = (obj || getGlobalObject()) as SentryGlobal;\n const __SENTRY__ = (global.__SENTRY__ = global.__SENTRY__ || {});\n const singleton = __SENTRY__[name] || (__SENTRY__[name] = creator());\n return singleton;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n\nimport { PolymorphicEvent, Primitive } from '@sentry/types';\n\n// eslint-disable-next-line @typescript-eslint/unbound-method\nconst objectToString = Object.prototype.toString;\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: unknown): wat is Error {\n switch (objectToString.call(wat)) {\n case '[object Error]':\n case '[object Exception]':\n case '[object DOMException]':\n return true;\n default:\n return isInstanceOf(wat, Error);\n }\n}\n\nfunction isBuiltin(wat: unknown, ty: string): boolean {\n return objectToString.call(wat) === `[object ${ty}]`;\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: unknown): boolean {\n return isBuiltin(wat, '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: unknown): boolean {\n return isBuiltin(wat, '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: unknown): boolean {\n return isBuiltin(wat, '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: unknown): wat is string {\n return isBuiltin(wat, 'String');\n}\n\n/**\n * Checks whether given value is a primitive (undefined, null, number, boolean, string, bigint, symbol)\n * {@link isPrimitive}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isPrimitive(wat: unknown): wat is Primitive {\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: unknown): wat is Record {\n return isBuiltin(wat, '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: unknown): wat is PolymorphicEvent {\n return typeof Event !== 'undefined' && isInstanceOf(wat, 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: unknown): boolean {\n return typeof Element !== 'undefined' && isInstanceOf(wat, 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: unknown): wat is RegExp {\n return isBuiltin(wat, '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): wat is PromiseLike {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return Boolean(wat && wat.then && typeof wat.then === 'function');\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: unknown): boolean {\n return isPlainObject(wat) && 'nativeEvent' in wat && 'preventDefault' in wat && 'stopPropagation' in wat;\n}\n\n/**\n * Checks whether given value is NaN\n * {@link isNaN}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isNaN(wat: unknown): boolean {\n return typeof wat === 'number' && wat !== wat;\n}\n\n/**\n * Checks whether given value's type is an instance of provided constructor.\n * {@link isInstanceOf}.\n *\n * @param wat A value to be checked.\n * @param base A constructor to be used in a check.\n * @returns A boolean representing the result.\n */\nexport function isInstanceOf(wat: any, base: any): boolean {\n try {\n return wat instanceof base;\n } catch (_e) {\n return false;\n }\n}\n","import { getGlobalObject } from './global';\nimport { isString } from './is';\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: unknown, keyAttrs?: string[]): string {\n type SimpleNode = {\n parentNode: SimpleNode;\n } | null;\n\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 = elem as SimpleNode;\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 // eslint-disable-next-line no-plusplus\n while (currentElem && height++ < MAX_TRAVERSE_HEIGHT) {\n nextStr = _htmlElementAsString(currentElem, keyAttrs);\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(el: unknown, keyAttrs?: string[]): string {\n const elem = el as {\n tagName?: string;\n id?: string;\n className?: string;\n getAttribute(key: string): string;\n };\n\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\n // Pairs of attribute keys defined in `serializeAttribute` and their values on element.\n const keyAttrPairs =\n keyAttrs && keyAttrs.length\n ? keyAttrs.filter(keyAttr => elem.getAttribute(keyAttr)).map(keyAttr => [keyAttr, elem.getAttribute(keyAttr)])\n : null;\n\n if (keyAttrPairs && keyAttrPairs.length) {\n keyAttrPairs.forEach(keyAttrPair => {\n out.push(`[${keyAttrPair[0]}=\"${keyAttrPair[1]}\"]`);\n });\n } else {\n if (elem.id) {\n out.push(`#${elem.id}`);\n }\n\n // eslint-disable-next-line prefer-const\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 }\n const allowedAttrs = ['type', 'name', 'title', 'alt'];\n for (i = 0; i < allowedAttrs.length; i++) {\n key = allowedAttrs[i];\n attr = elem.getAttribute(key);\n if (attr) {\n out.push(`[${key}=\"${attr}\"]`);\n }\n }\n return out.join('');\n}\n\n/**\n * A safe form of location.href\n */\nexport function getLocationHref(): string {\n const global = getGlobalObject();\n try {\n return global.document.location.href;\n } catch (oO) {\n return '';\n }\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 this.name = new.target.prototype.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { DsnComponents, DsnLike, DsnProtocol } from '@sentry/types';\n\nimport { SentryError } from './error';\n\n/** Regular expression used to parse a Dsn. */\nconst DSN_REGEX = /^(?:(\\w+):)\\/\\/(?:(\\w+)(?::(\\w+))?@)([\\w.-]+)(?::(\\d+))?\\/(.+)/;\n\nfunction isValidProtocol(protocol?: string): protocol is DsnProtocol {\n return protocol === 'http' || protocol === 'https';\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 */\nexport function dsnToString(dsn: DsnComponents, withPassword: boolean = false): string {\n const { host, path, pass, port, projectId, protocol, publicKey } = dsn;\n return (\n `${protocol}://${publicKey}${withPassword && pass ? `:${pass}` : ''}` +\n `@${host}${port ? `:${port}` : ''}/${path ? `${path}/` : path}${projectId}`\n );\n}\n\n/**\n * Parses a Dsn from a given string.\n *\n * @param str A Dsn as string\n * @returns Dsn as DsnComponents\n */\nexport function dsnFromString(str: string): DsnComponents {\n const match = DSN_REGEX.exec(str);\n\n if (!match) {\n throw new SentryError(`Invalid Sentry Dsn: ${str}`);\n }\n\n const [protocol, publicKey, 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 if (projectId) {\n const projectMatch = projectId.match(/^\\d+/);\n if (projectMatch) {\n projectId = projectMatch[0];\n }\n }\n\n return dsnFromComponents({ host, pass, path, projectId, port, protocol: protocol as DsnProtocol, publicKey });\n}\n\nfunction dsnFromComponents(components: DsnComponents): DsnComponents {\n return {\n protocol: components.protocol,\n publicKey: components.publicKey || '',\n pass: components.pass || '',\n host: components.host,\n port: components.port || '',\n path: components.path || '',\n projectId: components.projectId,\n };\n}\n\nfunction validateDsn(dsn: DsnComponents): boolean | void {\n if (!__DEBUG_BUILD__) {\n return;\n }\n\n const { port, projectId, protocol } = dsn;\n\n const requiredComponents: ReadonlyArray = ['protocol', 'publicKey', 'host', 'projectId'];\n requiredComponents.forEach(component => {\n if (!dsn[component]) {\n throw new SentryError(`Invalid Sentry Dsn: ${component} missing`);\n }\n });\n\n if (!projectId.match(/^\\d+$/)) {\n throw new SentryError(`Invalid Sentry Dsn: Invalid projectId ${projectId}`);\n }\n\n if (!isValidProtocol(protocol)) {\n throw new SentryError(`Invalid Sentry Dsn: Invalid protocol ${protocol}`);\n }\n\n if (port && isNaN(parseInt(port, 10))) {\n throw new SentryError(`Invalid Sentry Dsn: Invalid port ${port}`);\n }\n\n return true;\n}\n\n/** The Sentry Dsn, identifying a Sentry instance and project. */\nexport function makeDsn(from: DsnLike): DsnComponents {\n const components = typeof from === 'string' ? dsnFromString(from) : dsnFromComponents(from);\n validateDsn(components);\n return components;\n}\n","import { WrappedFunction } from '@sentry/types';\n\nimport { getGlobalObject, getGlobalSingleton } from './global';\n\n// TODO: Implement different loggers for different environments\nconst global = getGlobalObject();\n\n/** Prefix for logging strings */\nconst PREFIX = 'Sentry Logger ';\n\nexport const CONSOLE_LEVELS = ['debug', 'info', 'warn', 'error', 'log', 'assert', 'trace'] as const;\n\ntype LoggerMethod = (...args: unknown[]) => void;\ntype LoggerConsoleMethods = Record;\n\n/** JSDoc */\ninterface Logger extends LoggerConsoleMethods {\n disable(): void;\n enable(): void;\n}\n\n/**\n * Temporarily disable sentry console instrumentations.\n *\n * @param callback The function to run against the original `console` messages\n * @returns The results of the callback\n */\nexport function consoleSandbox(callback: () => T): T {\n const global = getGlobalObject();\n\n if (!('console' in global)) {\n return callback();\n }\n\n const originalConsole = global.console as Console & Record;\n const wrappedLevels: Partial = {};\n\n // Restore all wrapped console methods\n CONSOLE_LEVELS.forEach(level => {\n // TODO(v7): Remove this check as it's only needed for Node 6\n const originalWrappedFunc =\n originalConsole[level] && (originalConsole[level] as WrappedFunction).__sentry_original__;\n if (level in global.console && originalWrappedFunc) {\n wrappedLevels[level] = originalConsole[level] as LoggerConsoleMethods[typeof level];\n originalConsole[level] = originalWrappedFunc as Console[typeof level];\n }\n });\n\n try {\n return callback();\n } finally {\n // Revert restoration to wrapped state\n Object.keys(wrappedLevels).forEach(level => {\n originalConsole[level] = wrappedLevels[level as typeof CONSOLE_LEVELS[number]];\n });\n }\n}\n\nfunction makeLogger(): Logger {\n let enabled = false;\n const logger: Partial = {\n enable: () => {\n enabled = true;\n },\n disable: () => {\n enabled = false;\n },\n };\n\n if (__DEBUG_BUILD__) {\n CONSOLE_LEVELS.forEach(name => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n logger[name] = (...args: any[]) => {\n if (enabled) {\n consoleSandbox(() => {\n global.console[name](`${PREFIX}[${name}]:`, ...args);\n });\n }\n };\n });\n } else {\n CONSOLE_LEVELS.forEach(name => {\n logger[name] = () => undefined;\n });\n }\n\n return logger as Logger;\n}\n\n// Ensure we only have a single logger instance, even if multiple versions of @sentry/utils are being used\nlet logger: Logger;\nif (__DEBUG_BUILD__) {\n logger = getGlobalSingleton('logger', makeLogger);\n} else {\n logger = makeLogger();\n}\n\nexport { logger };\n","import { isRegExp, isString } 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 (0 = unlimited)\n * @returns string Encoded\n */\nexport function truncate(str: string, max: number = 0): string {\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 */\nexport function snipLine(line: string, colno: number): string {\n let newLine = line;\n const lineLength = newLine.length;\n if (lineLength <= 150) {\n return newLine;\n }\n if (colno > lineLength) {\n // eslint-disable-next-line no-param-reassign\n colno = lineLength;\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, lineLength);\n if (end > lineLength - 5) {\n end = lineLength;\n }\n if (end === lineLength) {\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 < lineLength) {\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 */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function safeJoin(input: any[], delimiter?: string): string {\n if (!Array.isArray(input)) {\n return '';\n }\n\n const output = [];\n // eslint-disable-next-line @typescript-eslint/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 (!isString(value)) {\n return false;\n }\n\n if (isRegExp(pattern)) {\n return pattern.test(value);\n }\n if (typeof pattern === 'string') {\n return value.indexOf(pattern) !== -1;\n }\n return false;\n}\n\n/**\n * Given a string, escape characters which have meaning in the regex grammar, such that the result is safe to feed to\n * `new RegExp()`.\n *\n * Based on https://github.com/sindresorhus/escape-string-regexp. Vendored to a) reduce the size by skipping the runtime\n * type-checking, and b) ensure it gets down-compiled for old versions of Node (the published package only supports Node\n * 12+).\n *\n * @param regexString The string to escape\n * @returns An version of the string with all special regex characters escaped\n */\nexport function escapeStringForRegex(regexString: string): string {\n // escape the hyphen separately so we can also replace it with a unicode literal hyphen, to avoid the problems\n // discussed in https://github.com/sindresorhus/escape-string-regexp/issues/20.\n return regexString.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&').replace(/-/g, '\\\\x2d');\n}\n","/* eslint-disable max-lines */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { WrappedFunction } from '@sentry/types';\n\nimport { htmlTreeAsString } from './browser';\nimport { isElement, isError, isEvent, isInstanceOf, isPlainObject, isPrimitive } from './is';\nimport { truncate } from './string';\n\n/**\n * Replace a method in an object with a wrapped version of itself.\n *\n * @param source An object that contains a method to be wrapped.\n * @param name The name of the method to be wrapped.\n * @param replacementFactory A higher-order function that takes the original version of the given method and returns a\n * wrapped version. Note: The function returned by `replacementFactory` needs to be a non-arrow function, in order to\n * preserve the correct value of `this`, and the original method must be called using `origMethod.call(this, )` or `origMethod.apply(this, [])` (rather than being called directly), again to preserve `this`.\n * @returns void\n */\nexport function fill(source: { [key: string]: any }, name: string, replacementFactory: (...args: any[]) => any): void {\n if (!(name in source)) {\n return;\n }\n\n const original = source[name] as () => any;\n const wrapped = replacementFactory(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 if (typeof wrapped === 'function') {\n try {\n markFunctionWrapped(wrapped, original);\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 * Defines a non-enumerable property on the given object.\n *\n * @param obj The object on which to set the property\n * @param name The name of the property to be set\n * @param value The value to which to set the property\n */\nexport function addNonEnumerableProperty(obj: { [key: string]: unknown }, name: string, value: unknown): void {\n Object.defineProperty(obj, name, {\n // enumerable: false, // the default, so we can save on bundle size by not explicitly setting it\n value: value,\n writable: true,\n configurable: true,\n });\n}\n\n/**\n * Remembers the original function on the wrapped function and\n * patches up the prototype.\n *\n * @param wrapped the wrapper function\n * @param original the original function that gets wrapped\n */\nexport function markFunctionWrapped(wrapped: WrappedFunction, original: WrappedFunction): void {\n const proto = original.prototype || {};\n wrapped.prototype = original.prototype = proto;\n addNonEnumerableProperty(wrapped, '__sentry_original__', original);\n}\n\n/**\n * This extracts the original function if available. See\n * `markFunctionWrapped` for more information.\n *\n * @param func the function to unwrap\n * @returns the unwrapped version of the function if available.\n */\nexport function getOriginalFunction(func: WrappedFunction): WrappedFunction | undefined {\n return func.__sentry_original__;\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(key => `${encodeURIComponent(key)}=${encodeURIComponent(object[key])}`)\n .join('&');\n}\n\n/**\n * Transforms any `Error` or `Event` into a plain object with all of their enumerable properties, and some of their\n * non-enumerable properties attached.\n *\n * @param value Initial source that we have to transform in order for it to be usable by the serializer\n * @returns An Event or Error turned into an object - or the value argurment itself, when value is neither an Event nor\n * an Error.\n */\nexport function convertToPlainObject(\n value: V,\n):\n | {\n [ownProps: string]: unknown;\n type: string;\n target: string;\n currentTarget: string;\n detail?: unknown;\n }\n | {\n [ownProps: string]: unknown;\n message: string;\n name: string;\n stack?: string;\n }\n | V {\n if (isError(value)) {\n return {\n message: value.message,\n name: value.name,\n stack: value.stack,\n ...getOwnProperties(value),\n };\n } else if (isEvent(value)) {\n const newObj: {\n [ownProps: string]: unknown;\n type: string;\n target: string;\n currentTarget: string;\n detail?: unknown;\n } = {\n type: value.type,\n target: serializeEventTarget(value.target),\n currentTarget: serializeEventTarget(value.currentTarget),\n ...getOwnProperties(value),\n };\n\n if (typeof CustomEvent !== 'undefined' && isInstanceOf(value, CustomEvent)) {\n newObj.detail = value.detail;\n }\n\n return newObj;\n } else {\n return value;\n }\n}\n\n/** Creates a string representation of the target of an `Event` object */\nfunction serializeEventTarget(target: unknown): string {\n try {\n return isElement(target) ? htmlTreeAsString(target) : Object.prototype.toString.call(target);\n } catch (_oO) {\n return '';\n }\n}\n\n/** Filters out all but an object's own properties */\nfunction getOwnProperties(obj: unknown): { [key: string]: unknown } {\n if (typeof obj === 'object' && obj !== null) {\n const extractedProps: { [key: string]: unknown } = {};\n for (const property in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, property)) {\n extractedProps[property] = (obj as Record)[property];\n }\n }\n return extractedProps;\n } else {\n return {};\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: Record, maxLength: number = 40): string {\n const keys = Object.keys(convertToPlainObject(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\n/**\n * Given any object, return a new object having removed all fields whose value was `undefined`.\n * Works recursively on objects and arrays.\n *\n * Attention: This function keeps circular references in the returned object.\n */\nexport function dropUndefinedKeys(inputValue: T): T {\n // This map keeps track of what already visited nodes map to.\n // Our Set - based memoBuilder doesn't work here because we want to the output object to have the same circular\n // references as the input object.\n const memoizationMap = new Map();\n\n // This function just proxies `_dropUndefinedKeys` to keep the `memoBuilder` out of this function's API\n return _dropUndefinedKeys(inputValue, memoizationMap);\n}\n\nfunction _dropUndefinedKeys(inputValue: T, memoizationMap: Map): T {\n if (isPlainObject(inputValue)) {\n // If this node has already been visited due to a circular reference, return the object it was mapped to in the new object\n const memoVal = memoizationMap.get(inputValue);\n if (memoVal !== undefined) {\n return memoVal as T;\n }\n\n const returnValue: { [key: string]: any } = {};\n // Store the mapping of this value in case we visit it again, in case of circular data\n memoizationMap.set(inputValue, returnValue);\n\n for (const key of Object.keys(inputValue)) {\n if (typeof inputValue[key] !== 'undefined') {\n returnValue[key] = _dropUndefinedKeys(inputValue[key], memoizationMap);\n }\n }\n\n return returnValue as T;\n }\n\n if (Array.isArray(inputValue)) {\n // If this node has already been visited due to a circular reference, return the array it was mapped to in the new object\n const memoVal = memoizationMap.get(inputValue);\n if (memoVal !== undefined) {\n return memoVal as T;\n }\n\n const returnValue: unknown[] = [];\n // Store the mapping of this value in case we visit it again, in case of circular data\n memoizationMap.set(inputValue, returnValue);\n\n inputValue.forEach((item: unknown) => {\n returnValue.push(_dropUndefinedKeys(item, memoizationMap));\n });\n\n return returnValue as unknown as T;\n }\n\n return inputValue;\n}\n\n/**\n * Ensure that something is an object.\n *\n * Turns `undefined` and `null` into `String`s and all other primitives into instances of their respective wrapper\n * classes (String, Boolean, Number, etc.). Acts as the identity function on non-primitives.\n *\n * @param wat The subject of the objectification\n * @returns A version of `wat` which can safely be used with `Object` class methods\n */\nexport function objectify(wat: unknown): typeof Object {\n let objectified;\n switch (true) {\n case wat === undefined || wat === null:\n objectified = new String(wat);\n break;\n\n // Though symbols and bigints do have wrapper classes (`Symbol` and `BigInt`, respectively), for whatever reason\n // those classes don't have constructors which can be used with the `new` keyword. We therefore need to cast each as\n // an object in order to wrap it.\n case typeof wat === 'symbol' || typeof wat === 'bigint':\n objectified = Object(wat);\n break;\n\n // this will catch the remaining primitives: `String`, `Number`, and `Boolean`\n case isPrimitive(wat):\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n objectified = new (wat as any).constructor(wat);\n break;\n\n // by process of elimination, at this point we know that `wat` must already be an object\n default:\n objectified = wat;\n break;\n }\n return objectified;\n}\n","import { StackFrame, StackLineParser, StackLineParserFn, StackParser } from '@sentry/types';\n\nconst STACKTRACE_LIMIT = 50;\n\n/**\n * Creates a stack parser with the supplied line parsers\n *\n * StackFrames are returned in the correct order for Sentry Exception\n * frames and with Sentry SDK internal frames removed from the top and bottom\n *\n */\nexport function createStackParser(...parsers: StackLineParser[]): StackParser {\n const sortedParsers = parsers.sort((a, b) => a[0] - b[0]).map(p => p[1]);\n\n return (stack: string, skipFirst: number = 0): StackFrame[] => {\n const frames: StackFrame[] = [];\n\n for (const line of stack.split('\\n').slice(skipFirst)) {\n for (const parser of sortedParsers) {\n const frame = parser(line);\n\n if (frame) {\n frames.push(frame);\n break;\n }\n }\n }\n\n return stripSentryFramesAndReverse(frames);\n };\n}\n\n/**\n * Gets a stack parser implementation from Options.stackParser\n * @see Options\n *\n * If options contains an array of line parsers, it is converted into a parser\n */\nexport function stackParserFromStackParserOptions(stackParser: StackParser | StackLineParser[]): StackParser {\n if (Array.isArray(stackParser)) {\n return createStackParser(...stackParser);\n }\n return stackParser;\n}\n\n/**\n * @hidden\n */\nexport function stripSentryFramesAndReverse(stack: StackFrame[]): StackFrame[] {\n if (!stack.length) {\n return [];\n }\n\n let localStack = stack;\n\n const firstFrameFunction = localStack[0].function || '';\n const lastFrameFunction = localStack[localStack.length - 1].function || '';\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 .slice(0, STACKTRACE_LIMIT)\n .map(frame => ({\n ...frame,\n filename: frame.filename || localStack[0].filename,\n function: frame.function || '?',\n }))\n .reverse();\n}\n\nconst defaultFunctionName = '';\n\n/**\n * Safely extract function name from itself\n */\nexport function getFunctionName(fn: unknown): string {\n try {\n if (!fn || typeof fn !== 'function') {\n return defaultFunctionName;\n }\n return fn.name || defaultFunctionName;\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 defaultFunctionName;\n }\n}\n\ntype GetModuleFn = (filename: string | undefined) => string | undefined;\n\n// eslint-disable-next-line complexity\nfunction node(getModule?: GetModuleFn): StackLineParserFn {\n const FILENAME_MATCH = /^\\s*[-]{4,}$/;\n const FULL_MATCH = /at (?:async )?(?:(.+?)\\s+\\()?(?:(.+?):(\\d+)(?::(\\d+))?|([^)]+))\\)?/;\n\n // eslint-disable-next-line complexity\n return (line: string) => {\n if (line.match(FILENAME_MATCH)) {\n return {\n filename: line,\n };\n }\n\n const lineMatch = line.match(FULL_MATCH);\n if (!lineMatch) {\n return undefined;\n }\n\n let object: string | undefined;\n let method: string | undefined;\n let functionName: string | undefined;\n let typeName: string | undefined;\n let methodName: string | undefined;\n\n if (lineMatch[1]) {\n functionName = lineMatch[1];\n\n let methodStart = functionName.lastIndexOf('.');\n if (functionName[methodStart - 1] === '.') {\n // eslint-disable-next-line no-plusplus\n methodStart--;\n }\n\n if (methodStart > 0) {\n object = functionName.substr(0, methodStart);\n method = functionName.substr(methodStart + 1);\n const objectEnd = object.indexOf('.Module');\n if (objectEnd > 0) {\n functionName = functionName.substr(objectEnd + 1);\n object = object.substr(0, objectEnd);\n }\n }\n typeName = undefined;\n }\n\n if (method) {\n typeName = object;\n methodName = method;\n }\n\n if (method === '') {\n methodName = undefined;\n functionName = undefined;\n }\n\n if (functionName === undefined) {\n methodName = methodName || '';\n functionName = typeName ? `${typeName}.${methodName}` : methodName;\n }\n\n const filename = lineMatch[2]?.startsWith('file://') ? lineMatch[2].substr(7) : lineMatch[2];\n const isNative = lineMatch[5] === 'native';\n const isInternal =\n isNative || (filename && !filename.startsWith('/') && !filename.startsWith('.') && filename.indexOf(':\\\\') !== 1);\n\n // in_app is all that's not an internal Node function or a module within node_modules\n // note that isNative appears to return true even for node core libraries\n // see https://github.com/getsentry/raven-node/issues/176\n const in_app = !isInternal && filename !== undefined && !filename.includes('node_modules/');\n\n return {\n filename,\n module: getModule?.(filename),\n function: functionName,\n lineno: parseInt(lineMatch[3], 10) || undefined,\n colno: parseInt(lineMatch[4], 10) || undefined,\n in_app,\n };\n };\n}\n\n/**\n * Node.js stack line parser\n *\n * This is in @sentry/utils so it can be used from the Electron SDK in the browser for when `nodeIntegration == true`.\n * This allows it to be used without referencing or importing any node specific code which causes bundlers to complain\n */\nexport function nodeStackLineParser(getModule?: GetModuleFn): StackLineParser {\n return [90, node(getModule)];\n}\n","import { getGlobalObject } from './global';\nimport { logger } from './logger';\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 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 // Chrome: VM89:1 Uncaught TypeError: Failed to construct 'DOMError':\n // 1 argument required, but only 0 present.\n // @ts-ignore It really needs 1 argument, not 0.\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 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 new Headers();\n new Request('');\n new Response();\n return true;\n } catch (e) {\n return false;\n }\n}\n/**\n * isNativeFetch checks if the given function is a native implementation of fetch()\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function isNativeFetch(func: Function): boolean {\n return func && /^function fetch\\(\\)\\s+\\{\\s+\\[native code\\]\\s+\\}$/.test(func.toString());\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 global = getGlobalObject();\n\n // Fast path to avoid DOM I/O\n // eslint-disable-next-line @typescript-eslint/unbound-method\n if (isNativeFetch(global.fetch)) {\n return true;\n }\n\n // window.fetch is implemented, but is polyfilled or already wrapped (e.g: by a chrome extension)\n // so create a \"pure\" iframe to see if that has native fetch\n let result = false;\n const doc = global.document;\n // eslint-disable-next-line deprecation/deprecation\n if (doc && typeof (doc.createElement as unknown) === 'function') {\n try {\n const sandbox = doc.createElement('iframe');\n sandbox.hidden = true;\n doc.head.appendChild(sandbox);\n if (sandbox.contentWindow && sandbox.contentWindow.fetch) {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n result = isNativeFetch(sandbox.contentWindow.fetch);\n }\n doc.head.removeChild(sandbox);\n } catch (err) {\n __DEBUG_BUILD__ &&\n logger.warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', err);\n }\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 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 // (see https://caniuse.com/#feat=referrer-policy),\n // it doesn't. And it throws an 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 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 /* eslint-disable @typescript-eslint/no-unsafe-member-access */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const chrome = (global as any).chrome;\n const isChromePackagedApp = chrome && chrome.app && chrome.app.runtime;\n /* eslint-enable @typescript-eslint/no-unsafe-member-access */\n const hasHistoryApi = 'history' in global && !!global.history.pushState && !!global.history.replaceState;\n\n return !isChromePackagedApp && hasHistoryApi;\n}\n","/* eslint-disable max-lines */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/ban-types */\nimport { WrappedFunction } from '@sentry/types';\n\nimport { getGlobalObject } from './global';\nimport { isInstanceOf, isString } from './is';\nimport { CONSOLE_LEVELS, logger } from './logger';\nimport { fill } from './object';\nimport { getFunctionName } from './stacktrace';\nimport { supportsHistory, supportsNativeFetch } from './supports';\n\nconst global = getGlobalObject();\n\nexport type InstrumentHandlerType =\n | 'console'\n | 'dom'\n | 'fetch'\n | 'history'\n | 'sentry'\n | 'xhr'\n | 'error'\n | 'unhandledrejection';\nexport type InstrumentHandlerCallback = (data: any) => void;\n\n/**\n * Instrument native APIs to call handlers that can be used to create breadcrumbs, APM spans etc.\n * - Console API\n * - Fetch API\n * - XHR API\n * - History API\n * - DOM API (click/typing)\n * - Error API\n * - UnhandledRejection API\n */\n\nconst handlers: { [key in InstrumentHandlerType]?: InstrumentHandlerCallback[] } = {};\nconst instrumented: { [key in InstrumentHandlerType]?: boolean } = {};\n\n/** Instruments given API */\nfunction instrument(type: InstrumentHandlerType): void {\n if (instrumented[type]) {\n return;\n }\n\n instrumented[type] = true;\n\n switch (type) {\n case 'console':\n instrumentConsole();\n break;\n case 'dom':\n instrumentDOM();\n break;\n case 'xhr':\n instrumentXHR();\n break;\n case 'fetch':\n instrumentFetch();\n break;\n case 'history':\n instrumentHistory();\n break;\n case 'error':\n instrumentError();\n break;\n case 'unhandledrejection':\n instrumentUnhandledRejection();\n break;\n default:\n __DEBUG_BUILD__ && logger.warn('unknown instrumentation type:', type);\n return;\n }\n}\n\n/**\n * Add handler that will be called when given type of instrumentation triggers.\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nexport function addInstrumentationHandler(type: InstrumentHandlerType, callback: InstrumentHandlerCallback): void {\n handlers[type] = handlers[type] || [];\n (handlers[type] as InstrumentHandlerCallback[]).push(callback);\n instrument(type);\n}\n\n/** JSDoc */\nfunction triggerHandlers(type: InstrumentHandlerType, data: any): void {\n if (!type || !handlers[type]) {\n return;\n }\n\n for (const handler of handlers[type] || []) {\n try {\n handler(data);\n } catch (e) {\n __DEBUG_BUILD__ &&\n logger.error(\n `Error while triggering instrumentation handler.\\nType: ${type}\\nName: ${getFunctionName(handler)}\\nError:`,\n e,\n );\n }\n }\n}\n\n/** JSDoc */\nfunction instrumentConsole(): void {\n if (!('console' in global)) {\n return;\n }\n\n CONSOLE_LEVELS.forEach(function (level: string): void {\n if (!(level in global.console)) {\n return;\n }\n\n fill(global.console, level, function (originalConsoleMethod: () => any): Function {\n return function (...args: any[]): void {\n triggerHandlers('console', { args, level });\n\n // this fails for some browsers. :(\n if (originalConsoleMethod) {\n originalConsoleMethod.apply(global.console, args);\n }\n };\n });\n });\n}\n\n/** JSDoc */\nfunction 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 handlerData = {\n args,\n fetchData: {\n method: getFetchMethod(args),\n url: getFetchUrl(args),\n },\n startTimestamp: Date.now(),\n };\n\n triggerHandlers('fetch', {\n ...handlerData,\n });\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return originalFetch.apply(global, args).then(\n (response: Response) => {\n triggerHandlers('fetch', {\n ...handlerData,\n endTimestamp: Date.now(),\n response,\n });\n return response;\n },\n (error: Error) => {\n triggerHandlers('fetch', {\n ...handlerData,\n endTimestamp: Date.now(),\n error,\n });\n // NOTE: If you are a Sentry user, and you are seeing this stack frame,\n // it means the sentry.javascript SDK caught an error invoking your application code.\n // This is expected behavior and NOT indicative of a bug with sentry.javascript.\n throw error;\n },\n );\n };\n });\n}\n\ntype XHRSendInput = null | Blob | BufferSource | FormData | URLSearchParams | string;\n\n/** JSDoc */\ninterface SentryWrappedXMLHttpRequest extends XMLHttpRequest {\n [key: string]: any;\n __sentry_xhr__?: {\n method?: string;\n url?: string;\n status_code?: number;\n body?: XHRSendInput;\n };\n}\n\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/** Extract `method` from fetch call arguments */\nfunction getFetchMethod(fetchArgs: any[] = []): string {\n if ('Request' in global && isInstanceOf(fetchArgs[0], Request) && fetchArgs[0].method) {\n return String(fetchArgs[0].method).toUpperCase();\n }\n if (fetchArgs[1] && fetchArgs[1].method) {\n return String(fetchArgs[1].method).toUpperCase();\n }\n return 'GET';\n}\n\n/** Extract `url` from fetch call arguments */\nfunction getFetchUrl(fetchArgs: any[] = []): string {\n if (typeof fetchArgs[0] === 'string') {\n return fetchArgs[0];\n }\n if ('Request' in global && isInstanceOf(fetchArgs[0], Request)) {\n return fetchArgs[0].url;\n }\n return String(fetchArgs[0]);\n}\n/* eslint-enable @typescript-eslint/no-unsafe-member-access */\n\n/** JSDoc */\nfunction instrumentXHR(): void {\n if (!('XMLHttpRequest' in global)) {\n return;\n }\n\n const xhrproto = XMLHttpRequest.prototype;\n\n fill(xhrproto, 'open', function (originalOpen: () => void): () => void {\n return function (this: SentryWrappedXMLHttpRequest, ...args: any[]): void {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const xhr = this;\n const url = args[1];\n const xhrInfo: SentryWrappedXMLHttpRequest['__sentry_xhr__'] = (xhr.__sentry_xhr__ = {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n method: isString(args[0]) ? args[0].toUpperCase() : args[0],\n url: args[1],\n });\n\n // if Sentry key appears in URL, don't capture it as a request\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (isString(url) && xhrInfo.method === 'POST' && url.match(/sentry_key/)) {\n xhr.__sentry_own_request__ = true;\n }\n\n const onreadystatechangeHandler = function (): void {\n if (xhr.readyState === 4) {\n try {\n // touching statusCode in some platforms throws\n // an exception\n xhrInfo.status_code = xhr.status;\n } catch (e) {\n /* do nothing */\n }\n\n triggerHandlers('xhr', {\n args,\n endTimestamp: Date.now(),\n startTimestamp: Date.now(),\n xhr,\n });\n }\n };\n\n if ('onreadystatechange' in xhr && typeof xhr.onreadystatechange === 'function') {\n fill(xhr, 'onreadystatechange', function (original: WrappedFunction): Function {\n return function (...readyStateArgs: any[]): void {\n onreadystatechangeHandler();\n return original.apply(xhr, readyStateArgs);\n };\n });\n } else {\n xhr.addEventListener('readystatechange', onreadystatechangeHandler);\n }\n\n return originalOpen.apply(xhr, args);\n };\n });\n\n fill(xhrproto, 'send', function (originalSend: () => void): () => void {\n return function (this: SentryWrappedXMLHttpRequest, ...args: any[]): void {\n if (this.__sentry_xhr__ && args[0] !== undefined) {\n this.__sentry_xhr__.body = args[0];\n }\n\n triggerHandlers('xhr', {\n args,\n startTimestamp: Date.now(),\n xhr: this,\n });\n\n return originalSend.apply(this, args);\n };\n });\n}\n\nlet lastHref: string;\n\n/** JSDoc */\nfunction instrumentHistory(): void {\n if (!supportsHistory()) {\n return;\n }\n\n const oldOnPopState = global.onpopstate;\n global.onpopstate = function (this: WindowEventHandlers, ...args: any[]): any {\n const to = global.location.href;\n // keep track of the current URL state, as we always receive only the updated state\n const from = lastHref;\n lastHref = to;\n triggerHandlers('history', {\n from,\n to,\n });\n if (oldOnPopState) {\n // Apparently this can throw in Firefox when incorrectly implemented plugin is installed.\n // https://github.com/getsentry/sentry-javascript/issues/3344\n // https://github.com/bugsnag/bugsnag-js/issues/469\n try {\n return oldOnPopState.apply(this, args);\n } catch (_oO) {\n // no-empty\n }\n }\n };\n\n /** @hidden */\n function historyReplacementFunction(originalHistoryFunction: () => void): () => void {\n return function (this: History, ...args: any[]): void {\n const url = args.length > 2 ? args[2] : undefined;\n if (url) {\n // coerce to string (this is what pushState does)\n const from = lastHref;\n const to = String(url);\n // keep track of the current URL state, as we always receive only the updated state\n lastHref = to;\n triggerHandlers('history', {\n from,\n to,\n });\n }\n return originalHistoryFunction.apply(this, args);\n };\n }\n\n fill(global.history, 'pushState', historyReplacementFunction);\n fill(global.history, 'replaceState', historyReplacementFunction);\n}\n\nconst debounceDuration = 1000;\nlet debounceTimerID: number | undefined;\nlet lastCapturedEvent: Event | undefined;\n\n/**\n * Decide whether the current event should finish the debounce of previously captured one.\n * @param previous previously captured event\n * @param current event to be captured\n */\nfunction shouldShortcircuitPreviousDebounce(previous: Event | undefined, current: Event): boolean {\n // If there was no previous event, it should always be swapped for the new one.\n if (!previous) {\n return true;\n }\n\n // If both events have different type, then user definitely performed two separate actions. e.g. click + keypress.\n if (previous.type !== current.type) {\n return true;\n }\n\n try {\n // If both events have the same type, it's still possible that actions were performed on different targets.\n // e.g. 2 clicks on different buttons.\n if (previous.target !== current.target) {\n return true;\n }\n } catch (e) {\n // just accessing `target` property can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/sentry-javascript/issues/838\n }\n\n // If both events have the same type _and_ same `target` (an element which triggered an event, _not necessarily_\n // to which an event listener was attached), we treat them as the same action, as we want to capture\n // only one breadcrumb. e.g. multiple clicks on the same button, or typing inside a user input box.\n return false;\n}\n\n/**\n * Decide whether an event should be captured.\n * @param event event to be captured\n */\nfunction shouldSkipDOMEvent(event: Event): boolean {\n // We are only interested in filtering `keypress` events for now.\n if (event.type !== 'keypress') {\n return false;\n }\n\n try {\n const target = event.target as HTMLElement;\n\n if (!target || !target.tagName) {\n return true;\n }\n\n // Only consider keypress events on actual input elements. This will disregard keypresses targeting body\n // e.g.tabbing through elements, hotkeys, etc.\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable) {\n return false;\n }\n } catch (e) {\n // just accessing `target` property can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/sentry-javascript/issues/838\n }\n\n return true;\n}\n\n/**\n * Wraps addEventListener to capture UI breadcrumbs\n * @param handler function that will be triggered\n * @param globalListener indicates whether event was captured by the global event listener\n * @returns wrapped breadcrumb events handler\n * @hidden\n */\nfunction makeDOMEventHandler(handler: Function, globalListener: boolean = false): (event: Event) => void {\n return (event: Event): void => {\n // It's possible this handler might trigger multiple times for the same\n // event (e.g. event propagation through node ancestors).\n // Ignore if we've already captured that event.\n if (!event || lastCapturedEvent === event) {\n return;\n }\n\n // We always want to skip _some_ events.\n if (shouldSkipDOMEvent(event)) {\n return;\n }\n\n const name = event.type === 'keypress' ? 'input' : event.type;\n\n // If there is no debounce timer, it means that we can safely capture the new event and store it for future comparisons.\n if (debounceTimerID === undefined) {\n handler({\n event: event,\n name,\n global: globalListener,\n });\n lastCapturedEvent = event;\n }\n // If there is a debounce awaiting, see if the new event is different enough to treat it as a unique one.\n // If that's the case, emit the previous event and store locally the newly-captured DOM event.\n else if (shouldShortcircuitPreviousDebounce(lastCapturedEvent, event)) {\n handler({\n event: event,\n name,\n global: globalListener,\n });\n lastCapturedEvent = event;\n }\n\n // Start a new debounce timer that will prevent us from capturing multiple events that should be grouped together.\n clearTimeout(debounceTimerID);\n debounceTimerID = global.setTimeout(() => {\n debounceTimerID = undefined;\n }, debounceDuration);\n };\n}\n\ntype AddEventListener = (\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n) => void;\ntype RemoveEventListener = (\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | EventListenerOptions,\n) => void;\n\ntype InstrumentedElement = Element & {\n __sentry_instrumentation_handlers__?: {\n [key in 'click' | 'keypress']?: {\n handler?: Function;\n /** The number of custom listeners attached to this element */\n refCount: number;\n };\n };\n};\n\n/** JSDoc */\nfunction instrumentDOM(): void {\n if (!('document' in global)) {\n return;\n }\n\n // Make it so that any click or keypress that is unhandled / bubbled up all the way to the document triggers our dom\n // handlers. (Normally we have only one, which captures a breadcrumb for each click or keypress.) Do this before\n // we instrument `addEventListener` so that we don't end up attaching this handler twice.\n const triggerDOMHandler = triggerHandlers.bind(null, 'dom');\n const globalDOMEventHandler = makeDOMEventHandler(triggerDOMHandler, true);\n global.document.addEventListener('click', globalDOMEventHandler, false);\n global.document.addEventListener('keypress', globalDOMEventHandler, false);\n\n // After hooking into click and keypress events bubbled up to `document`, we also hook into user-handled\n // clicks & keypresses, by adding an event listener of our own to any element to which they add a listener. That\n // way, whenever one of their handlers is triggered, ours will be, too. (This is needed because their handler\n // could potentially prevent the event from bubbling up to our global listeners. This way, our handler are still\n // guaranteed to fire at least once.)\n ['EventTarget', 'Node'].forEach((target: string) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const proto = (global as any)[target] && (global as any)[target].prototype;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, no-prototype-builtins\n if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {\n return;\n }\n\n fill(proto, 'addEventListener', function (originalAddEventListener: AddEventListener): AddEventListener {\n return function (\n this: Element,\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ): AddEventListener {\n if (type === 'click' || type == 'keypress') {\n try {\n const el = this as InstrumentedElement;\n const handlers = (el.__sentry_instrumentation_handlers__ = el.__sentry_instrumentation_handlers__ || {});\n const handlerForType = (handlers[type] = handlers[type] || { refCount: 0 });\n\n if (!handlerForType.handler) {\n const handler = makeDOMEventHandler(triggerDOMHandler);\n handlerForType.handler = handler;\n originalAddEventListener.call(this, type, handler, options);\n }\n\n handlerForType.refCount += 1;\n } catch (e) {\n // Accessing dom properties is always fragile.\n // Also allows us to skip `addEventListenrs` calls with no proper `this` context.\n }\n }\n\n return originalAddEventListener.call(this, type, listener, options);\n };\n });\n\n fill(\n proto,\n 'removeEventListener',\n function (originalRemoveEventListener: RemoveEventListener): RemoveEventListener {\n return function (\n this: Element,\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | EventListenerOptions,\n ): () => void {\n if (type === 'click' || type == 'keypress') {\n try {\n const el = this as InstrumentedElement;\n const handlers = el.__sentry_instrumentation_handlers__ || {};\n const handlerForType = handlers[type];\n\n if (handlerForType) {\n handlerForType.refCount -= 1;\n // If there are no longer any custom handlers of the current type on this element, we can remove ours, too.\n if (handlerForType.refCount <= 0) {\n originalRemoveEventListener.call(this, type, handlerForType.handler, options);\n handlerForType.handler = undefined;\n delete handlers[type]; // eslint-disable-line @typescript-eslint/no-dynamic-delete\n }\n\n // If there are no longer any custom handlers of any type on this element, cleanup everything.\n if (Object.keys(handlers).length === 0) {\n delete el.__sentry_instrumentation_handlers__;\n }\n }\n } catch (e) {\n // Accessing dom properties is always fragile.\n // Also allows us to skip `addEventListenrs` calls with no proper `this` context.\n }\n }\n\n return originalRemoveEventListener.call(this, type, listener, options);\n };\n },\n );\n });\n}\n\nlet _oldOnErrorHandler: OnErrorEventHandler = null;\n/** JSDoc */\nfunction instrumentError(): void {\n _oldOnErrorHandler = global.onerror;\n\n global.onerror = function (msg: any, url: any, line: any, column: any, error: any): boolean {\n triggerHandlers('error', {\n column,\n error,\n line,\n msg,\n url,\n });\n\n if (_oldOnErrorHandler) {\n // eslint-disable-next-line prefer-rest-params\n return _oldOnErrorHandler.apply(this, arguments);\n }\n\n return false;\n };\n}\n\nlet _oldOnUnhandledRejectionHandler: ((e: any) => void) | null = null;\n/** JSDoc */\nfunction instrumentUnhandledRejection(): void {\n _oldOnUnhandledRejectionHandler = global.onunhandledrejection;\n\n global.onunhandledrejection = function (e: any): boolean {\n triggerHandlers('unhandledrejection', e);\n\n if (_oldOnUnhandledRejectionHandler) {\n // eslint-disable-next-line prefer-rest-params\n return _oldOnUnhandledRejectionHandler.apply(this, arguments);\n }\n\n return true;\n };\n}\n","/* eslint-disable @typescript-eslint/explicit-function-return-type */\n/* eslint-disable @typescript-eslint/typedef */\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { isThenable } from './is';\n\n/** SyncPromise internal states */\nconst enum States {\n /** Pending */\n PENDING = 0,\n /** Resolved / OK */\n RESOLVED = 1,\n /** Rejected / Error */\n REJECTED = 2,\n}\n\n// Overloads so we can call resolvedSyncPromise without arguments and generic argument\nexport function resolvedSyncPromise(): PromiseLike;\nexport function resolvedSyncPromise(value: T | PromiseLike): PromiseLike;\n\n/**\n * Creates a resolved sync promise.\n *\n * @param value the value to resolve the promise with\n * @returns the resolved sync promise\n */\nexport function resolvedSyncPromise(value?: T | PromiseLike): PromiseLike {\n return new SyncPromise(resolve => {\n resolve(value);\n });\n}\n\n/**\n * Creates a rejected sync promise.\n *\n * @param value the value to reject the promise with\n * @returns the rejected sync promise\n */\nexport function rejectedSyncPromise(reason?: any): PromiseLike {\n return new SyncPromise((_, reject) => {\n reject(reason);\n });\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<[boolean, (value: T) => void, (reason: any) => any]> = [];\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 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._handlers.push([\n false,\n result => {\n if (!onfulfilled) {\n // TODO: ¯\\_(ツ)_/¯\n // TODO: FIXME\n resolve(result as any);\n } else {\n try {\n resolve(onfulfilled(result));\n } catch (e) {\n reject(e);\n }\n }\n },\n reason => {\n if (!onrejected) {\n reject(reason);\n } else {\n try {\n resolve(onrejected(reason));\n } catch (e) {\n reject(e);\n }\n }\n },\n ]);\n this._executeHandlers();\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 resolve(val as unknown as any);\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 void (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 /** JSDoc */\n private readonly _executeHandlers = () => {\n if (this._state === States.PENDING) {\n return;\n }\n\n const cachedHandlers = this._handlers.slice();\n this._handlers = [];\n\n cachedHandlers.forEach(handler => {\n if (handler[0]) {\n return;\n }\n\n if (this._state === States.RESOLVED) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n handler[1](this._value as unknown as any);\n }\n\n if (this._state === States.REJECTED) {\n handler[2](this._value);\n }\n\n handler[0] = true;\n });\n };\n}\n\nexport { SyncPromise };\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Event, Exception, Mechanism, StackFrame } from '@sentry/types';\n\nimport { getGlobalObject } from './global';\nimport { addNonEnumerableProperty } from './object';\nimport { snipLine } from './string';\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/** Many browser now support native uuid v4 generation */\ninterface CryptoWithRandomUUID extends Crypto {\n randomUUID?(): string;\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) as CryptoWithRandomUUID;\n\n if (crypto && crypto.randomUUID) {\n return crypto.randomUUID().replace(/-/g, '');\n }\n\n const getRandomByte =\n crypto && crypto.getRandomValues ? () => crypto.getRandomValues(new Uint8Array(1))[0] : () => Math.random() * 16;\n\n // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523\n // Concatenating the following numbers as strings results in '10000000100040008000100000000000'\n return (([1e7] as unknown as string) + 1e3 + 4e3 + 8e3 + 1e11).replace(/[018]/g, c =>\n // eslint-disable-next-line no-bitwise\n ((c as unknown as number) ^ ((getRandomByte() & 15) >> ((c as unknown as number) / 4))).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(url: string): {\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\nfunction getFirstException(event: Event): Exception | undefined {\n return event.exception && event.exception.values ? event.exception.values[0] : undefined;\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 const { message, event_id: eventId } = event;\n if (message) {\n return message;\n }\n\n const firstException = getFirstException(event);\n if (firstException) {\n if (firstException.type && firstException.value) {\n return `${firstException.type}: ${firstException.value}`;\n }\n return firstException.type || firstException.value || eventId || '';\n }\n return eventId || '';\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 const exception = (event.exception = event.exception || {});\n const values = (exception.values = exception.values || []);\n const firstException = (values[0] = values[0] || {});\n if (!firstException.value) {\n firstException.value = value || '';\n }\n if (!firstException.type) {\n firstException.type = type || 'Error';\n }\n}\n\n/**\n * Adds exception mechanism data to a given event. Uses defaults if the second parameter is not passed.\n *\n * @param event The event to modify.\n * @param newMechanism Mechanism data to add to the event.\n * @hidden\n */\nexport function addExceptionMechanism(event: Event, newMechanism?: Partial): void {\n const firstException = getFirstException(event);\n if (!firstException) {\n return;\n }\n\n const defaultMechanism = { type: 'generic', handled: true };\n const currentMechanism = firstException.mechanism;\n firstException.mechanism = { ...defaultMechanism, ...currentMechanism, ...newMechanism };\n\n if (newMechanism && 'data' in newMechanism) {\n const mergedData = { ...(currentMechanism && currentMechanism.data), ...newMechanism.data };\n firstException.mechanism.data = mergedData;\n }\n}\n\n// https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string\nconst SEMVER_REGEXP =\n /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$/;\n\n/**\n * Represents Semantic Versioning object\n */\ninterface SemVer {\n major?: number;\n minor?: number;\n patch?: number;\n prerelease?: string;\n buildmetadata?: string;\n}\n\n/**\n * Parses input into a SemVer interface\n * @param input string representation of a semver version\n */\nexport function parseSemver(input: string): SemVer {\n const match = input.match(SEMVER_REGEXP) || [];\n const major = parseInt(match[1], 10);\n const minor = parseInt(match[2], 10);\n const patch = parseInt(match[3], 10);\n return {\n buildmetadata: match[5],\n major: isNaN(major) ? undefined : major,\n minor: isNaN(minor) ? undefined : minor,\n patch: isNaN(patch) ? undefined : patch,\n prerelease: match[4],\n };\n}\n\n/**\n * This function adds context (pre/post/line) lines to the provided frame\n *\n * @param lines string[] containing all lines\n * @param frame StackFrame that will be mutated\n * @param linesOfContext number of context lines we want to add pre/post\n */\nexport function addContextToFrame(lines: string[], frame: StackFrame, linesOfContext: number = 5): void {\n const lineno = frame.lineno || 0;\n const maxLines = lines.length;\n const sourceLine = Math.max(Math.min(maxLines, lineno - 1), 0);\n\n frame.pre_context = lines\n .slice(Math.max(0, sourceLine - linesOfContext), sourceLine)\n .map((line: string) => snipLine(line, 0));\n\n frame.context_line = snipLine(lines[Math.min(maxLines - 1, sourceLine)], frame.colno || 0);\n\n frame.post_context = lines\n .slice(Math.min(sourceLine + 1, maxLines), sourceLine + 1 + linesOfContext)\n .map((line: string) => snipLine(line, 0));\n}\n\n/**\n * Strip the query string and fragment off of a given URL or path (if present)\n *\n * @param urlPath Full URL or path, including possible query string and/or fragment\n * @returns URL or path without query string or fragment\n */\nexport function stripUrlQueryAndFragment(urlPath: string): string {\n // eslint-disable-next-line no-useless-escape\n return urlPath.split(/[\\?#]/, 1)[0];\n}\n\n/**\n * Checks whether or not we've already captured the given exception (note: not an identical exception - the very object\n * in question), and marks it captured if not.\n *\n * This is useful because it's possible for an error to get captured by more than one mechanism. After we intercept and\n * record an error, we rethrow it (assuming we've intercepted it before it's reached the top-level global handlers), so\n * that we don't interfere with whatever effects the error might have had were the SDK not there. At that point, because\n * the error has been rethrown, it's possible for it to bubble up to some other code we've instrumented. If it's not\n * caught after that, it will bubble all the way up to the global handlers (which of course we also instrument). This\n * function helps us ensure that even if we encounter the same error more than once, we only record it the first time we\n * see it.\n *\n * Note: It will ignore primitives (always return `false` and not mark them as seen), as properties can't be set on\n * them. {@link: Object.objectify} can be used on exceptions to convert any that are primitives into their equivalent\n * object wrapper forms so that this check will always work. However, because we need to flag the exact object which\n * will get rethrown, and because that rethrowing happens outside of the event processing pipeline, the objectification\n * must be done before the exception captured.\n *\n * @param A thrown exception to check or flag as having been seen\n * @returns `true` if the exception has already been captured, `false` if not (with the side effect of marking it seen)\n */\nexport function checkOrSetAlreadyCaught(exception: unknown): boolean {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (exception && (exception as any).__sentry_captured__) {\n return true;\n }\n\n try {\n // set it this way rather than by assignment so that it's not ennumerable and therefore isn't recorded by the\n // `ExtraErrorData` integration\n addNonEnumerableProperty(exception as { [key: string]: unknown }, '__sentry_captured__', true);\n } catch (err) {\n // `exception` is a primitive, so we can't mark it seen\n }\n\n return false;\n}\n","import { Primitive } from '@sentry/types';\n\nimport { isNaN, isSyntheticEvent } from './is';\nimport { memoBuilder, MemoFunc } from './memo';\nimport { convertToPlainObject } from './object';\nimport { getFunctionName } from './stacktrace';\n\ntype Prototype = { constructor: (...args: unknown[]) => unknown };\n// This is a hack to placate TS, relying on the fact that technically, arrays are objects with integer keys. Normally we\n// think of those keys as actual numbers, but `arr['0']` turns out to work just as well as `arr[0]`, and doing it this\n// way lets us use a single type in the places where behave as if we are only dealing with objects, even if some of them\n// might be arrays.\ntype ObjOrArray = { [key: string]: T };\n\n/**\n * Recursively normalizes the given object.\n *\n * - Creates a copy to prevent original input mutation\n * - Skips non-enumerable properties\n * - When stringifying, calls `toJSON` if implemented\n * - Removes circular references\n * - Translates non-serializable values (`undefined`/`NaN`/functions) to serializable format\n * - Translates known global objects/classes to a string representations\n * - Takes care of `Error` object serialization\n * - Optionally limits depth of final output\n * - Optionally limits number of properties/elements included in any single object/array\n *\n * @param input The object to be normalized.\n * @param depth The max depth to which to normalize the object. (Anything deeper stringified whole.)\n * @param maxProperties The max number of elements or properties to be included in any single array or\n * object in the normallized output..\n * @returns A normalized version of the object, or `\"**non-serializable**\"` if any errors are thrown during normalization.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function normalize(input: unknown, depth: number = +Infinity, maxProperties: number = +Infinity): any {\n try {\n // since we're at the outermost level, we don't provide a key\n return visit('', input, depth, maxProperties);\n } catch (err) {\n return { ERROR: `**non-serializable** (${err})` };\n }\n}\n\n/** JSDoc */\nexport function normalizeToSize(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\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 normalized = normalize(object, depth);\n\n if (jsonSize(normalized) > maxSize) {\n return normalizeToSize(object, depth - 1, maxSize);\n }\n\n return normalized as T;\n}\n\n/**\n * Visits a node to perform normalization on it\n *\n * @param key The key corresponding to the given node\n * @param value The node to be visited\n * @param depth Optional number indicating the maximum recursion depth\n * @param maxProperties Optional maximum number of properties/elements included in any single object/array\n * @param memo Optional Memo class handling decycling\n */\nfunction visit(\n key: string,\n value: unknown,\n depth: number = +Infinity,\n maxProperties: number = +Infinity,\n memo: MemoFunc = memoBuilder(),\n): Primitive | ObjOrArray {\n const [memoize, unmemoize] = memo;\n\n // Get the simple cases out of the way first\n if (value === null || (['number', 'boolean', 'string'].includes(typeof value) && !isNaN(value))) {\n return value as Primitive;\n }\n\n const stringified = stringifyValue(key, value);\n\n // Anything we could potentially dig into more (objects or arrays) will have come back as `\"[object XXXX]\"`.\n // Everything else will have already been serialized, so if we don't see that pattern, we're done.\n if (!stringified.startsWith('[object ')) {\n return stringified;\n }\n\n // From here on, we can assert that `value` is either an object or an array.\n\n // Do not normalize objects that we know have already been normalized. As a general rule, the\n // \"__sentry_skip_normalization__\" property should only be used sparingly and only should only be set on objects that\n // have already been normalized.\n if ((value as ObjOrArray)['__sentry_skip_normalization__']) {\n return value as ObjOrArray;\n }\n\n // We're also done if we've reached the max depth\n if (depth === 0) {\n // At this point we know `serialized` is a string of the form `\"[object XXXX]\"`. Clean it up so it's just `\"[XXXX]\"`.\n return stringified.replace('object ', '');\n }\n\n // If we've already visited this branch, bail out, as it's circular reference. If not, note that we're seeing it now.\n if (memoize(value)) {\n return '[Circular ~]';\n }\n\n // If the value has a `toJSON` method, we call it to extract more information\n const valueWithToJSON = value as unknown & { toJSON?: () => unknown };\n if (valueWithToJSON && typeof valueWithToJSON.toJSON === 'function') {\n try {\n const jsonValue = valueWithToJSON.toJSON();\n // We need to normalize the return value of `.toJSON()` in case it has circular references\n return visit('', jsonValue, depth - 1, maxProperties, memo);\n } catch (err) {\n // pass (The built-in `toJSON` failed, but we can still try to do it ourselves)\n }\n }\n\n // At this point we know we either have an object or an array, we haven't seen it before, and we're going to recurse\n // because we haven't yet reached the max depth. Create an accumulator to hold the results of visiting each\n // property/entry, and keep track of the number of items we add to it.\n const normalized = (Array.isArray(value) ? [] : {}) as ObjOrArray;\n let numAdded = 0;\n\n // Before we begin, convert`Error` and`Event` instances into plain objects, since some of each of their relevant\n // properties are non-enumerable and otherwise would get missed.\n const visitable = convertToPlainObject(value as ObjOrArray);\n\n for (const visitKey in visitable) {\n // Avoid iterating over fields in the prototype if they've somehow been exposed to enumeration.\n if (!Object.prototype.hasOwnProperty.call(visitable, visitKey)) {\n continue;\n }\n\n if (numAdded >= maxProperties) {\n normalized[visitKey] = '[MaxProperties ~]';\n break;\n }\n\n // Recursively visit all the child nodes\n const visitValue = visitable[visitKey];\n normalized[visitKey] = visit(visitKey, visitValue, depth - 1, maxProperties, memo);\n\n numAdded += 1;\n }\n\n // Once we've visited all the branches, remove the parent from memo storage\n unmemoize(value);\n\n // Return accumulated values\n return normalized;\n}\n\n// TODO remove this in v7 (this means the method will no longer be exported, under any name)\nexport { visit as walk };\n\n/**\n * Stringify the given value. Handles various known special values and types.\n *\n * Not meant to be used on simple primitives which already have a string representation, as it will, for example, turn\n * the number 1231 into \"[Object Number]\", nor on `null`, as it will throw.\n *\n * @param value The value to stringify\n * @returns A stringified representation of the given value\n */\nfunction stringifyValue(\n key: unknown,\n // this type is a tiny bit of a cheat, since this function does handle NaN (which is technically a number), but for\n // our internal use, it'll do\n value: Exclude,\n): string {\n try {\n if (key === 'domain' && value && typeof value === 'object' && (value as { _events: unknown })._events) {\n return '[Domain]';\n }\n\n if (key === 'domainEmitter') {\n return '[DomainEmitter]';\n }\n\n // It's safe to use `global`, `window`, and `document` here in this manner, as we are asserting using `typeof` first\n // which won't throw if they are not present.\n\n if (typeof global !== 'undefined' && value === global) {\n return '[Global]';\n }\n\n // eslint-disable-next-line no-restricted-globals\n if (typeof window !== 'undefined' && value === window) {\n return '[Window]';\n }\n\n // eslint-disable-next-line no-restricted-globals\n if (typeof document !== 'undefined' && value === document) {\n return '[Document]';\n }\n\n // React's SyntheticEvent thingy\n if (isSyntheticEvent(value)) {\n return '[SyntheticEvent]';\n }\n\n if (typeof value === 'number' && value !== value) {\n return '[NaN]';\n }\n\n // this catches `undefined` (but not `null`, which is a primitive and can be serialized on its own)\n if (value === void 0) {\n return '[undefined]';\n }\n\n if (typeof value === 'function') {\n return `[Function: ${getFunctionName(value)}]`;\n }\n\n if (typeof value === 'symbol') {\n return `[${String(value)}]`;\n }\n\n // stringified BigInts are indistinguishable from regular numbers, so we need to label them to avoid confusion\n if (typeof value === 'bigint') {\n return `[BigInt: ${String(value)}]`;\n }\n\n // Now that we've knocked out all the special cases and the primitives, all we have left are objects. Simply casting\n // them to strings means that instances of classes which haven't defined their `toStringTag` will just come out as\n // `\"[object Object]\"`. If we instead look at the constructor's name (which is the same as the name of the class),\n // we can make sure that only plain objects come out that way.\n return `[object ${(Object.getPrototypeOf(value) as Prototype).constructor.name}]`;\n } catch (err) {\n return `**non-serializable** (${err})`;\n }\n}\n\n/** Calculates bytes size of input string */\nfunction utf8Length(value: string): number {\n // eslint-disable-next-line no-bitwise\n return ~-encodeURI(value).split(/%..|./).length;\n}\n\n/** Calculates bytes size of input object */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction jsonSize(value: any): number {\n return utf8Length(JSON.stringify(value));\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport type MemoFunc = [\n // memoize\n (obj: any) => boolean,\n // unmemoize\n (obj: any) => void,\n];\n\n/**\n * Helper to decycle json objects\n */\nexport function memoBuilder(): MemoFunc {\n const hasWeakSet = typeof WeakSet === 'function';\n const inner: any = hasWeakSet ? new WeakSet() : [];\n function memoize(obj: any): boolean {\n if (hasWeakSet) {\n if (inner.has(obj)) {\n return true;\n }\n inner.add(obj);\n return false;\n }\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let i = 0; i < inner.length; i++) {\n const value = inner[i];\n if (value === obj) {\n return true;\n }\n }\n inner.push(obj);\n return false;\n }\n\n function unmemoize(obj: any): void {\n if (hasWeakSet) {\n inner.delete(obj);\n } else {\n for (let i = 0; i < inner.length; i++) {\n if (inner[i] === obj) {\n inner.splice(i, 1);\n break;\n }\n }\n }\n }\n return [memoize, unmemoize];\n}\n","import { SentryError } from './error';\nimport { rejectedSyncPromise, resolvedSyncPromise, SyncPromise } from './syncpromise';\n\nexport interface PromiseBuffer {\n // exposes the internal array so tests can assert on the state of it.\n // XXX: this really should not be public api.\n $: Array>;\n add(taskProducer: () => PromiseLike): PromiseLike;\n drain(timeout?: number): PromiseLike;\n}\n\n/**\n * Creates an new PromiseBuffer object with the specified limit\n * @param limit max number of promises that can be stored in the buffer\n */\nexport function makePromiseBuffer(limit?: number): PromiseBuffer {\n const buffer: Array> = [];\n\n function isReady(): boolean {\n return limit === undefined || buffer.length < limit;\n }\n\n /**\n * Remove a promise from the queue.\n *\n * @param task Can be any PromiseLike\n * @returns Removed promise.\n */\n function remove(task: PromiseLike): PromiseLike {\n return buffer.splice(buffer.indexOf(task), 1)[0];\n }\n\n /**\n * Add a promise (representing an in-flight action) to the queue, and set it to remove itself on fulfillment.\n *\n * @param taskProducer A function producing any PromiseLike; In previous versions this used to be `task:\n * PromiseLike`, but under that model, Promises were instantly created on the call-site and their executor\n * functions therefore ran immediately. Thus, even if the buffer was full, the action still happened. By\n * requiring the promise to be wrapped in a function, we can defer promise creation until after the buffer\n * limit check.\n * @returns The original promise.\n */\n function add(taskProducer: () => PromiseLike): PromiseLike {\n if (!isReady()) {\n return rejectedSyncPromise(new SentryError('Not adding Promise due to buffer limit reached.'));\n }\n\n // start the task and add its promise to the queue\n const task = taskProducer();\n if (buffer.indexOf(task) === -1) {\n buffer.push(task);\n }\n void task\n .then(() => remove(task))\n // Use `then(null, rejectionHandler)` rather than `catch(rejectionHandler)` so that we can use `PromiseLike`\n // rather than `Promise`. `PromiseLike` doesn't have a `.catch` method, making its polyfill smaller. (ES5 didn't\n // have promises, so TS has to polyfill when down-compiling.)\n .then(null, () =>\n remove(task).then(null, () => {\n // We have to add another catch here because `remove()` starts a new promise chain.\n }),\n );\n return task;\n }\n\n /**\n * Wait for all promises in the queue to resolve or for timeout to expire, whichever comes first.\n *\n * @param timeout The time, in ms, after which to resolve to `false` if the queue is still non-empty. Passing `0` (or\n * not passing anything) will make the promise wait as long as it takes for the queue to drain before resolving to\n * `true`.\n * @returns A promise which will resolve to `true` if the queue is already empty or drains before the timeout, and\n * `false` otherwise\n */\n function drain(timeout?: number): PromiseLike {\n return new SyncPromise((resolve, reject) => {\n let counter = buffer.length;\n\n if (!counter) {\n return resolve(true);\n }\n\n // wait for `timeout` ms and then resolve to `false` (if not cancelled first)\n const capturedSetTimeout = setTimeout(() => {\n if (timeout && timeout > 0) {\n resolve(false);\n }\n }, timeout);\n\n // if all promises resolve in time, cancel the timer and resolve to `true`\n buffer.forEach(item => {\n void resolvedSyncPromise(item).then(() => {\n // eslint-disable-next-line no-plusplus\n if (!--counter) {\n clearTimeout(capturedSetTimeout);\n resolve(true);\n }\n }, reject);\n });\n });\n }\n\n return {\n $: buffer,\n add,\n drain,\n };\n}\n","/* eslint-disable deprecation/deprecation */\nimport { Severity, SeverityLevel } from '@sentry/types';\n\n// Note: Ideally the `SeverityLevel` type would be derived from `validSeverityLevels`, but that would mean either\n//\n// a) moving `validSeverityLevels` to `@sentry/types`,\n// b) moving the`SeverityLevel` type here, or\n// c) importing `validSeverityLevels` from here into `@sentry/types`.\n//\n// Option A would make `@sentry/types` a runtime dependency of `@sentry/utils` (not good), and options B and C would\n// create a circular dependency between `@sentry/types` and `@sentry/utils` (also not good). So a TODO accompanying the\n// type, reminding anyone who changes it to change this list also, will have to do.\n\nexport const validSeverityLevels = ['fatal', 'error', 'warning', 'log', 'info', 'debug'];\n\n/**\n * Converts a string-based level into a member of the deprecated {@link Severity} enum.\n *\n * @deprecated `severityFromString` is deprecated. Please use `severityLevelFromString` instead.\n *\n * @param level String representation of Severity\n * @returns Severity\n */\nexport function severityFromString(level: Severity | SeverityLevel | string): Severity {\n return severityLevelFromString(level) as Severity;\n}\n\n/**\n * Converts a string-based level into a `SeverityLevel`, normalizing it along the way.\n *\n * @param level String representation of desired `SeverityLevel`.\n * @returns The `SeverityLevel` corresponding to the given string, or 'log' if the string isn't a valid level.\n */\nexport function severityLevelFromString(level: SeverityLevel | string): SeverityLevel {\n return (level === 'warn' ? 'warning' : validSeverityLevels.includes(level) ? level : 'log') as SeverityLevel;\n}\n","import { getGlobalObject } from './global';\nimport { dynamicRequire, isNodeEnv } from './node';\n\n/**\n * An object that can return the current timestamp in seconds since the UNIX epoch.\n */\ninterface TimestampSource {\n nowSeconds(): number;\n}\n\n/**\n * A TimestampSource implementation for environments that do not support the Performance Web API natively.\n *\n * Note that this TimestampSource does not use a monotonic clock. A call to `nowSeconds` may return a timestamp earlier\n * than a previously returned value. We do not try to emulate a monotonic behavior in order to facilitate debugging. It\n * is more obvious to explain \"why does my span have negative duration\" than \"why my spans have zero duration\".\n */\nconst dateTimestampSource: TimestampSource = {\n nowSeconds: () => Date.now() / 1000,\n};\n\n/**\n * A partial definition of the [Performance Web API]{@link https://developer.mozilla.org/en-US/docs/Web/API/Performance}\n * for accessing a high-resolution monotonic clock.\n */\ninterface Performance {\n /**\n * The millisecond timestamp at which measurement began, measured in Unix time.\n */\n timeOrigin: number;\n /**\n * Returns the current millisecond timestamp, where 0 represents the start of measurement.\n */\n now(): number;\n}\n\n/**\n * Returns a wrapper around the native Performance API browser implementation, or undefined for browsers that do not\n * support the API.\n *\n * Wrapping the native API works around differences in behavior from different browsers.\n */\nfunction getBrowserPerformance(): Performance | undefined {\n const { performance } = getGlobalObject();\n if (!performance || !performance.now) {\n return undefined;\n }\n\n // Replace performance.timeOrigin with our own timeOrigin based on Date.now().\n //\n // This is a partial workaround for browsers reporting performance.timeOrigin such that performance.timeOrigin +\n // performance.now() gives a date arbitrarily in the past.\n //\n // Additionally, computing timeOrigin in this way fills the gap for browsers where performance.timeOrigin is\n // undefined.\n //\n // The assumption that performance.timeOrigin + performance.now() ~= Date.now() is flawed, but we depend on it to\n // interact with data coming out of performance entries.\n //\n // Note that despite recommendations against it in the spec, browsers implement the Performance API with a clock that\n // might stop when the computer is asleep (and perhaps under other circumstances). Such behavior causes\n // performance.timeOrigin + performance.now() to have an arbitrary skew over Date.now(). In laptop computers, we have\n // observed skews that can be as long as days, weeks or months.\n //\n // See https://github.com/getsentry/sentry-javascript/issues/2590.\n //\n // BUG: despite our best intentions, this workaround has its limitations. It mostly addresses timings of pageload\n // transactions, but ignores the skew built up over time that can aversely affect timestamps of navigation\n // transactions of long-lived web pages.\n const timeOrigin = Date.now() - performance.now();\n\n return {\n now: () => performance.now(),\n timeOrigin,\n };\n}\n\n/**\n * Returns the native Performance API implementation from Node.js. Returns undefined in old Node.js versions that don't\n * implement the API.\n */\nfunction getNodePerformance(): Performance | undefined {\n try {\n const perfHooks = dynamicRequire(module, 'perf_hooks') as { performance: Performance };\n return perfHooks.performance;\n } catch (_) {\n return undefined;\n }\n}\n\n/**\n * The Performance API implementation for the current platform, if available.\n */\nconst platformPerformance: Performance | undefined = isNodeEnv() ? getNodePerformance() : getBrowserPerformance();\n\nconst timestampSource: TimestampSource =\n platformPerformance === undefined\n ? dateTimestampSource\n : {\n nowSeconds: () => (platformPerformance.timeOrigin + platformPerformance.now()) / 1000,\n };\n\n/**\n * Returns a timestamp in seconds since the UNIX epoch using the Date API.\n */\nexport const dateTimestampInSeconds: () => number = dateTimestampSource.nowSeconds.bind(dateTimestampSource);\n\n/**\n * Returns a timestamp in seconds since the UNIX epoch using either the Performance or Date APIs, depending on the\n * availability of the Performance API.\n *\n * See `usingPerformanceAPI` to test whether the Performance API is used.\n *\n * BUG: Note that because of how browsers implement the Performance API, the clock might stop when the computer is\n * asleep. This creates a skew between `dateTimestampInSeconds` and `timestampInSeconds`. The\n * skew can grow to arbitrary amounts like days, weeks or months.\n * See https://github.com/getsentry/sentry-javascript/issues/2590.\n */\nexport const timestampInSeconds: () => number = timestampSource.nowSeconds.bind(timestampSource);\n\n// Re-exported with an old name for backwards-compatibility.\nexport const timestampWithMs = timestampInSeconds;\n\n/**\n * A boolean that is true when timestampInSeconds uses the Performance API to produce monotonic timestamps.\n */\nexport const usingPerformanceAPI = platformPerformance !== undefined;\n\n/**\n * Internal helper to store what is the source of browserPerformanceTimeOrigin below. For debugging only.\n */\nexport let _browserPerformanceTimeOriginMode: string;\n\n/**\n * The number of milliseconds since the UNIX epoch. This value is only usable in a browser, and only when the\n * performance API is available.\n */\nexport const browserPerformanceTimeOrigin = ((): number | undefined => {\n // Unfortunately browsers may report an inaccurate time origin data, through either performance.timeOrigin or\n // performance.timing.navigationStart, which results in poor results in performance data. We only treat time origin\n // data as reliable if they are within a reasonable threshold of the current time.\n\n const { performance } = getGlobalObject();\n if (!performance || !performance.now) {\n _browserPerformanceTimeOriginMode = 'none';\n return undefined;\n }\n\n const threshold = 3600 * 1000;\n const performanceNow = performance.now();\n const dateNow = Date.now();\n\n // if timeOrigin isn't available set delta to threshold so it isn't used\n const timeOriginDelta = performance.timeOrigin\n ? Math.abs(performance.timeOrigin + performanceNow - dateNow)\n : threshold;\n const timeOriginIsReliable = timeOriginDelta < threshold;\n\n // While performance.timing.navigationStart is deprecated in favor of performance.timeOrigin, performance.timeOrigin\n // is not as widely supported. Namely, performance.timeOrigin is undefined in Safari as of writing.\n // Also as of writing, performance.timing is not available in Web Workers in mainstream browsers, so it is not always\n // a valid fallback. In the absence of an initial time provided by the browser, fallback to the current time from the\n // Date API.\n // eslint-disable-next-line deprecation/deprecation\n const navigationStart = performance.timing && performance.timing.navigationStart;\n const hasNavigationStart = typeof navigationStart === 'number';\n // if navigationStart isn't available set delta to threshold so it isn't used\n const navigationStartDelta = hasNavigationStart ? Math.abs(navigationStart + performanceNow - dateNow) : threshold;\n const navigationStartIsReliable = navigationStartDelta < threshold;\n\n if (timeOriginIsReliable || navigationStartIsReliable) {\n // Use the more reliable time origin\n if (timeOriginDelta <= navigationStartDelta) {\n _browserPerformanceTimeOriginMode = 'timeOrigin';\n return performance.timeOrigin;\n } else {\n _browserPerformanceTimeOriginMode = 'navigationStart';\n return navigationStart;\n }\n }\n\n // Either both timeOrigin and navigationStart are skewed or neither is available, fallback to Date.\n _browserPerformanceTimeOriginMode = 'dateNow';\n return dateNow;\n})();\n","import {\n Attachment,\n AttachmentItem,\n DataCategory,\n Envelope,\n EnvelopeItem,\n EnvelopeItemType,\n TextEncoderInternal,\n} from '@sentry/types';\n\nimport { dropUndefinedKeys } from './object';\n\n/**\n * Creates an envelope.\n * Make sure to always explicitly provide the generic to this function\n * so that the envelope types resolve correctly.\n */\nexport function createEnvelope(headers: E[0], items: E[1] = []): E {\n return [headers, items] as E;\n}\n\n/**\n * Add an item to an envelope.\n * Make sure to always explicitly provide the generic to this function\n * so that the envelope types resolve correctly.\n */\nexport function addItemToEnvelope(envelope: E, newItem: E[1][number]): E {\n const [headers, items] = envelope;\n return [headers, [...items, newItem]] as E;\n}\n\n/**\n * Convenience function to loop through the items and item types of an envelope.\n * (This function was mostly created because working with envelope types is painful at the moment)\n */\nexport function forEachEnvelopeItem(\n envelope: Envelope,\n callback: (envelopeItem: E[1][number], envelopeItemType: E[1][number][0]['type']) => void,\n): void {\n const envelopeItems = envelope[1];\n envelopeItems.forEach((envelopeItem: EnvelopeItem) => {\n const envelopeItemType = envelopeItem[0].type;\n callback(envelopeItem, envelopeItemType);\n });\n}\n\nfunction encodeUTF8(input: string, textEncoder?: TextEncoderInternal): Uint8Array {\n const utf8 = textEncoder || new TextEncoder();\n return utf8.encode(input);\n}\n\n/**\n * Serializes an envelope.\n */\nexport function serializeEnvelope(envelope: Envelope, textEncoder?: TextEncoderInternal): string | Uint8Array {\n const [envHeaders, items] = envelope;\n\n // Initially we construct our envelope as a string and only convert to binary chunks if we encounter binary data\n let parts: string | Uint8Array[] = JSON.stringify(envHeaders);\n\n function append(next: string | Uint8Array): void {\n if (typeof parts === 'string') {\n parts = typeof next === 'string' ? parts + next : [encodeUTF8(parts, textEncoder), next];\n } else {\n parts.push(typeof next === 'string' ? encodeUTF8(next, textEncoder) : next);\n }\n }\n\n for (const item of items) {\n const [itemHeaders, payload] = item as typeof items[number];\n append(`\\n${JSON.stringify(itemHeaders)}\\n`);\n append(typeof payload === 'string' || payload instanceof Uint8Array ? payload : JSON.stringify(payload));\n }\n\n return typeof parts === 'string' ? parts : concatBuffers(parts);\n}\n\nfunction concatBuffers(buffers: Uint8Array[]): Uint8Array {\n const totalLength = buffers.reduce((acc, buf) => acc + buf.length, 0);\n\n const merged = new Uint8Array(totalLength);\n let offset = 0;\n for (const buffer of buffers) {\n merged.set(buffer, offset);\n offset += buffer.length;\n }\n\n return merged;\n}\n\n/**\n * Creates attachment envelope items\n */\nexport function createAttachmentEnvelopeItem(\n attachment: Attachment,\n textEncoder?: TextEncoderInternal,\n): AttachmentItem {\n const buffer = typeof attachment.data === 'string' ? encodeUTF8(attachment.data, textEncoder) : attachment.data;\n\n return [\n dropUndefinedKeys({\n type: 'attachment',\n length: buffer.length,\n filename: attachment.filename,\n content_type: attachment.contentType,\n attachment_type: attachment.attachmentType,\n }),\n buffer,\n ];\n}\n\nconst ITEM_TYPE_TO_DATA_CATEGORY_MAP: Record = {\n session: 'session',\n sessions: 'session',\n attachment: 'attachment',\n transaction: 'transaction',\n event: 'error',\n client_report: 'internal',\n user_report: 'default',\n};\n\n/**\n * Maps the type of an envelope item to a data category.\n */\nexport function envelopeItemTypeToDataCategory(type: EnvelopeItemType): DataCategory {\n return ITEM_TYPE_TO_DATA_CATEGORY_MAP[type];\n}\n","import { TransportMakeRequestResponse } from '@sentry/types';\n\n// Intentionally keeping the key broad, as we don't know for sure what rate limit headers get returned from backend\nexport type RateLimits = Record;\n\nexport const DEFAULT_RETRY_AFTER = 60 * 1000; // 60 seconds\n\n/**\n * Extracts Retry-After value from the request header or returns default value\n * @param header string representation of 'Retry-After' header\n * @param now current unix timestamp\n *\n */\nexport function parseRetryAfterHeader(header: string, now: number = Date.now()): number {\n const headerDelay = parseInt(`${header}`, 10);\n if (!isNaN(headerDelay)) {\n return headerDelay * 1000;\n }\n\n const headerDate = Date.parse(`${header}`);\n if (!isNaN(headerDate)) {\n return headerDate - now;\n }\n\n return DEFAULT_RETRY_AFTER;\n}\n\n/**\n * Gets the time that given category is disabled until for rate limiting\n */\nexport function disabledUntil(limits: RateLimits, category: string): number {\n return limits[category] || limits.all || 0;\n}\n\n/**\n * Checks if a category is rate limited\n */\nexport function isRateLimited(limits: RateLimits, category: string, now: number = Date.now()): boolean {\n return disabledUntil(limits, category) > now;\n}\n\n/**\n * Update ratelimits from incoming headers.\n * Returns true if headers contains a non-empty rate limiting header.\n */\nexport function updateRateLimits(\n limits: RateLimits,\n { statusCode, headers }: TransportMakeRequestResponse,\n now: number = Date.now(),\n): RateLimits {\n const updatedRateLimits: RateLimits = {\n ...limits,\n };\n\n // \"The name is case-insensitive.\"\n // https://developer.mozilla.org/en-US/docs/Web/API/Headers/get\n const rateLimitHeader = headers && headers['x-sentry-rate-limits'];\n const retryAfterHeader = headers && headers['retry-after'];\n\n if (rateLimitHeader) {\n /**\n * rate limit headers are of the form\n *
,
,..\n * where each
is of the form\n * : : : \n * where\n * is a delay in seconds\n * is the event type(s) (error, transaction, etc) being rate limited and is of the form\n * ;;...\n * is what's being limited (org, project, or key) - ignored by SDK\n * is an arbitrary string like \"org_quota\" - ignored by SDK\n */\n for (const limit of rateLimitHeader.trim().split(',')) {\n const [retryAfter, categories] = limit.split(':', 2);\n const headerDelay = parseInt(retryAfter, 10);\n const delay = (!isNaN(headerDelay) ? headerDelay : 60) * 1000; // 60sec default\n if (!categories) {\n updatedRateLimits.all = now + delay;\n } else {\n for (const category of categories.split(';')) {\n updatedRateLimits[category] = now + delay;\n }\n }\n }\n } else if (retryAfterHeader) {\n updatedRateLimits.all = now + parseRetryAfterHeader(retryAfterHeader, now);\n } else if (statusCode === 429) {\n updatedRateLimits.all = now + 60 * 1000;\n }\n\n return updatedRateLimits;\n}\n","import { SerializedSession, Session, SessionContext, SessionStatus } from '@sentry/types';\nimport { dropUndefinedKeys, timestampInSeconds, uuid4 } from '@sentry/utils';\n\n/**\n * Creates a new `Session` object by setting certain default parameters. If optional @param context\n * is passed, the passed properties are applied to the session object.\n *\n * @param context (optional) additional properties to be applied to the returned session object\n *\n * @returns a new `Session` object\n */\nexport function makeSession(context?: Omit): Session {\n // Both timestamp and started are in seconds since the UNIX epoch.\n const startingTime = timestampInSeconds();\n\n const session: Session = {\n sid: uuid4(),\n init: true,\n timestamp: startingTime,\n started: startingTime,\n duration: 0,\n status: 'ok',\n errors: 0,\n ignoreDuration: false,\n toJSON: () => sessionToJSON(session),\n };\n\n if (context) {\n updateSession(session, context);\n }\n\n return session;\n}\n\n/**\n * Updates a session object with the properties passed in the context.\n *\n * Note that this function mutates the passed object and returns void.\n * (Had to do this instead of returning a new and updated session because closing and sending a session\n * makes an update to the session after it was passed to the sending logic.\n * @see BaseClient.captureSession )\n *\n * @param session the `Session` to update\n * @param context the `SessionContext` holding the properties that should be updated in @param session\n */\n// eslint-disable-next-line complexity\nexport function updateSession(session: Session, context: SessionContext = {}): void {\n if (context.user) {\n if (!session.ipAddress && context.user.ip_address) {\n session.ipAddress = context.user.ip_address;\n }\n\n if (!session.did && !context.did) {\n session.did = context.user.id || context.user.email || context.user.username;\n }\n }\n\n session.timestamp = context.timestamp || timestampInSeconds();\n\n if (context.ignoreDuration) {\n session.ignoreDuration = context.ignoreDuration;\n }\n if (context.sid) {\n // Good enough uuid validation. — Kamil\n session.sid = context.sid.length === 32 ? context.sid : uuid4();\n }\n if (context.init !== undefined) {\n session.init = context.init;\n }\n if (!session.did && context.did) {\n session.did = `${context.did}`;\n }\n if (typeof context.started === 'number') {\n session.started = context.started;\n }\n if (session.ignoreDuration) {\n session.duration = undefined;\n } else if (typeof context.duration === 'number') {\n session.duration = context.duration;\n } else {\n const duration = session.timestamp - session.started;\n session.duration = duration >= 0 ? duration : 0;\n }\n if (context.release) {\n session.release = context.release;\n }\n if (context.environment) {\n session.environment = context.environment;\n }\n if (!session.ipAddress && context.ipAddress) {\n session.ipAddress = context.ipAddress;\n }\n if (!session.userAgent && context.userAgent) {\n session.userAgent = context.userAgent;\n }\n if (typeof context.errors === 'number') {\n session.errors = context.errors;\n }\n if (context.status) {\n session.status = context.status;\n }\n}\n\n/**\n * Closes a session by setting its status and updating the session object with it.\n * Internally calls `updateSession` to update the passed session object.\n *\n * Note that this function mutates the passed session (@see updateSession for explanation).\n *\n * @param session the `Session` object to be closed\n * @param status the `SessionStatus` with which the session was closed. If you don't pass a status,\n * this function will keep the previously set status, unless it was `'ok'` in which case\n * it is changed to `'exited'`.\n */\nexport function closeSession(session: Session, status?: Exclude): void {\n let context = {};\n if (status) {\n context = { status };\n } else if (session.status === 'ok') {\n context = { status: 'exited' };\n }\n\n updateSession(session, context);\n}\n\n/**\n * Serializes a passed session object to a JSON object with a slightly different structure.\n * This is necessary because the Sentry backend requires a slightly different schema of a session\n * than the one the JS SDKs use internally.\n *\n * @param session the session to be converted\n *\n * @returns a JSON object of the passed session\n */\nfunction sessionToJSON(session: Session): SerializedSession {\n return dropUndefinedKeys({\n sid: `${session.sid}`,\n init: session.init,\n // Make sure that sec is converted to ms for date constructor\n started: new Date(session.started * 1000).toISOString(),\n timestamp: new Date(session.timestamp * 1000).toISOString(),\n status: session.status,\n errors: session.errors,\n did: typeof session.did === 'number' || typeof session.did === 'string' ? `${session.did}` : undefined,\n duration: session.duration,\n attrs: {\n release: session.release,\n environment: session.environment,\n ip_address: session.ipAddress,\n user_agent: session.userAgent,\n },\n });\n}\n","/* eslint-disable max-lines */\nimport {\n Attachment,\n Breadcrumb,\n CaptureContext,\n Context,\n Contexts,\n Event,\n EventHint,\n EventProcessor,\n Extra,\n Extras,\n Primitive,\n RequestSession,\n Scope as ScopeInterface,\n ScopeContext,\n Session,\n Severity,\n SeverityLevel,\n Span,\n Transaction,\n User,\n} from '@sentry/types';\nimport {\n dateTimestampInSeconds,\n getGlobalSingleton,\n isPlainObject,\n isThenable,\n logger,\n SyncPromise,\n} from '@sentry/utils';\n\nimport { updateSession } from './session';\n\n/**\n * Absolute maximum number of breadcrumbs added to an event.\n * The `maxBreadcrumbs` option cannot be higher than this value.\n */\nconst MAX_BREADCRUMBS = 100;\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 notifying is happening. */\n protected _notifyingListeners: boolean;\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]: Primitive };\n\n /** Extra */\n protected _extra: Extras;\n\n /** Contexts */\n protected _contexts: Contexts;\n\n /** Attachments */\n protected _attachments: Attachment[];\n\n /**\n * A place to stash data which is needed at some point in the SDK's event processing pipeline but which shouldn't get\n * sent to Sentry\n */\n protected _sdkProcessingMetadata: { [key: string]: unknown };\n\n /** Fingerprint */\n protected _fingerprint?: string[];\n\n /** Severity */\n // eslint-disable-next-line deprecation/deprecation\n protected _level?: Severity | SeverityLevel;\n\n /** Transaction Name */\n protected _transactionName?: string;\n\n /** Span */\n protected _span?: Span;\n\n /** Session */\n protected _session?: Session;\n\n /** Request Mode Session Status */\n protected _requestSession?: RequestSession;\n\n public constructor() {\n this._notifyingListeners = false;\n this._scopeListeners = [];\n this._eventProcessors = [];\n this._breadcrumbs = [];\n this._attachments = [];\n this._user = {};\n this._tags = {};\n this._extra = {};\n this._contexts = {};\n this._sdkProcessingMetadata = {};\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._contexts = { ...scope._contexts };\n newScope._user = scope._user;\n newScope._level = scope._level;\n newScope._span = scope._span;\n newScope._session = scope._session;\n newScope._transactionName = scope._transactionName;\n newScope._fingerprint = scope._fingerprint;\n newScope._eventProcessors = [...scope._eventProcessors];\n newScope._requestSession = scope._requestSession;\n newScope._attachments = [...scope._attachments];\n }\n return newScope;\n }\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 * @inheritDoc\n */\n public setUser(user: User | null): this {\n this._user = user || {};\n if (this._session) {\n updateSession(this._session, { user });\n }\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public getUser(): User | undefined {\n return this._user;\n }\n\n /**\n * @inheritDoc\n */\n public getRequestSession(): RequestSession | undefined {\n return this._requestSession;\n }\n\n /**\n * @inheritDoc\n */\n public setRequestSession(requestSession?: RequestSession): this {\n this._requestSession = requestSession;\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public setTags(tags: { [key: string]: Primitive }): this {\n this._tags = {\n ...this._tags,\n ...tags,\n };\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public setTag(key: string, value: Primitive): this {\n this._tags = { ...this._tags, [key]: value };\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public setExtras(extras: Extras): this {\n this._extra = {\n ...this._extra,\n ...extras,\n };\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public setExtra(key: string, extra: Extra): this {\n this._extra = { ...this._extra, [key]: extra };\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public setFingerprint(fingerprint: string[]): this {\n this._fingerprint = fingerprint;\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public setLevel(\n // eslint-disable-next-line deprecation/deprecation\n level: Severity | SeverityLevel,\n ): this {\n this._level = level;\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public setTransactionName(name?: string): this {\n this._transactionName = name;\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public setContext(key: string, context: Context | null): this {\n if (context === null) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete this._contexts[key];\n } else {\n this._contexts = { ...this._contexts, [key]: context };\n }\n\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 getSpan(): Span | undefined {\n return this._span;\n }\n\n /**\n * @inheritDoc\n */\n public getTransaction(): Transaction | undefined {\n // Often, this span (if it exists at all) will be a transaction, but it's not guaranteed to be. Regardless, it will\n // have a pointer to the currently-active transaction.\n const span = this.getSpan();\n return span && span.transaction;\n }\n\n /**\n * @inheritDoc\n */\n public setSession(session?: Session): this {\n if (!session) {\n delete this._session;\n } else {\n this._session = session;\n }\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public getSession(): Session | undefined {\n return this._session;\n }\n\n /**\n * @inheritDoc\n */\n public update(captureContext?: CaptureContext): this {\n if (!captureContext) {\n return this;\n }\n\n if (typeof captureContext === 'function') {\n const updatedScope = (captureContext as (scope: T) => T)(this);\n return updatedScope instanceof Scope ? updatedScope : this;\n }\n\n if (captureContext instanceof Scope) {\n this._tags = { ...this._tags, ...captureContext._tags };\n this._extra = { ...this._extra, ...captureContext._extra };\n this._contexts = { ...this._contexts, ...captureContext._contexts };\n if (captureContext._user && Object.keys(captureContext._user).length) {\n this._user = captureContext._user;\n }\n if (captureContext._level) {\n this._level = captureContext._level;\n }\n if (captureContext._fingerprint) {\n this._fingerprint = captureContext._fingerprint;\n }\n if (captureContext._requestSession) {\n this._requestSession = captureContext._requestSession;\n }\n } else if (isPlainObject(captureContext)) {\n // eslint-disable-next-line no-param-reassign\n captureContext = captureContext as ScopeContext;\n this._tags = { ...this._tags, ...captureContext.tags };\n this._extra = { ...this._extra, ...captureContext.extra };\n this._contexts = { ...this._contexts, ...captureContext.contexts };\n if (captureContext.user) {\n this._user = captureContext.user;\n }\n if (captureContext.level) {\n this._level = captureContext.level;\n }\n if (captureContext.fingerprint) {\n this._fingerprint = captureContext.fingerprint;\n }\n if (captureContext.requestSession) {\n this._requestSession = captureContext.requestSession;\n }\n }\n\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public clear(): this {\n this._breadcrumbs = [];\n this._tags = {};\n this._extra = {};\n this._user = {};\n this._contexts = {};\n this._level = undefined;\n this._transactionName = undefined;\n this._fingerprint = undefined;\n this._requestSession = undefined;\n this._span = undefined;\n this._session = undefined;\n this._notifyScopeListeners();\n this._attachments = [];\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public addBreadcrumb(breadcrumb: Breadcrumb, maxBreadcrumbs?: number): this {\n const maxCrumbs = typeof maxBreadcrumbs === 'number' ? Math.min(maxBreadcrumbs, MAX_BREADCRUMBS) : MAX_BREADCRUMBS;\n\n // No data has been changed, so don't notify scope listeners\n if (maxCrumbs <= 0) {\n return this;\n }\n\n const mergedBreadcrumb = {\n timestamp: dateTimestampInSeconds(),\n ...breadcrumb,\n };\n this._breadcrumbs = [...this._breadcrumbs, mergedBreadcrumb].slice(-maxCrumbs);\n this._notifyScopeListeners();\n\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 * @inheritDoc\n */\n public addAttachment(attachment: Attachment): this {\n this._attachments.push(attachment);\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public getAttachments(): Attachment[] {\n return this._attachments;\n }\n\n /**\n * @inheritDoc\n */\n public clearAttachments(): this {\n this._attachments = [];\n return this;\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 information 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._contexts && Object.keys(this._contexts).length) {\n event.contexts = { ...this._contexts, ...event.contexts };\n }\n if (this._level) {\n event.level = this._level;\n }\n if (this._transactionName) {\n event.transaction = this._transactionName;\n }\n\n // We want to set the trace context for normal events only if there isn't already\n // a trace context on the event. There is a product feature in place where we link\n // errors with transaction and it relies on that.\n if (this._span) {\n event.contexts = { trace: this._span.getTraceContext(), ...event.contexts };\n const transactionName = this._span.transaction && this._span.transaction.name;\n if (transactionName) {\n event.tags = { transaction: transactionName, ...event.tags };\n }\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 event.sdkProcessingMetadata = { ...event.sdkProcessingMetadata, ...this._sdkProcessingMetadata };\n\n return this._notifyEventProcessors([...getGlobalEventProcessors(), ...this._eventProcessors], event, hint);\n }\n\n /**\n * Add data which will be accessible during event processing but won't get sent to Sentry\n */\n public setSDKProcessingMetadata(newData: { [key: string]: unknown }): this {\n this._sdkProcessingMetadata = { ...this._sdkProcessingMetadata, ...newData };\n\n return this;\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 if (event === null || typeof processor !== 'function') {\n resolve(event);\n } else {\n const result = processor({ ...event }, hint) as Event | null;\n\n __DEBUG_BUILD__ &&\n processor.id &&\n result === null &&\n logger.log(`Event processor \"${processor.id}\" dropped event`);\n\n if (isThenable(result)) {\n void result\n .then(final => this._notifyEventProcessors(processors, final, hint, index + 1).then(resolve))\n .then(null, reject);\n } else {\n void this._notifyEventProcessors(processors, result, hint, index + 1)\n .then(resolve)\n .then(null, reject);\n }\n }\n });\n }\n\n /**\n * This will be called on every set call.\n */\n protected _notifyScopeListeners(): void {\n // We need this check for this._notifyingListeners to be able to work on scope during updates\n // If this check is not here we'll produce endless recursion when something is done with the scope\n // during the callback.\n if (!this._notifyingListeners) {\n this._notifyingListeners = true;\n this._scopeListeners.forEach(callback => {\n callback(this);\n });\n this._notifyingListeners = false;\n }\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/**\n * Returns the global event processors.\n */\nfunction getGlobalEventProcessors(): EventProcessor[] {\n return getGlobalSingleton('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","/* eslint-disable max-lines */\nimport {\n Breadcrumb,\n BreadcrumbHint,\n Client,\n CustomSamplingContext,\n Event,\n EventHint,\n Extra,\n Extras,\n Hub as HubInterface,\n Integration,\n IntegrationClass,\n Primitive,\n Session,\n SessionContext,\n Severity,\n SeverityLevel,\n Transaction,\n TransactionContext,\n User,\n} from '@sentry/types';\nimport {\n consoleSandbox,\n dateTimestampInSeconds,\n getGlobalObject,\n getGlobalSingleton,\n isNodeEnv,\n logger,\n uuid4,\n} from '@sentry/utils';\n\nimport { Scope } from './scope';\nimport { closeSession, makeSession, updateSession } from './session';\n\n/**\n * API compatibility version of this hub.\n *\n * WARNING: This number should only be increased when the global interface\n * changes and new methods are introduced.\n *\n * @hidden\n */\nexport const API_VERSION = 4;\n\n/**\n * Default maximum number of breadcrumbs added to an event. Can be overwritten\n * with {@link Options.maxBreadcrumbs}.\n */\nconst DEFAULT_BREADCRUMBS = 100;\n\n/**\n * A layer in the process stack.\n * @hidden\n */\nexport interface Layer {\n client?: Client;\n scope?: Scope;\n}\n\n/**\n * An object that contains a hub and maintains a scope stack.\n * @hidden\n */\nexport interface Carrier {\n __SENTRY__?: {\n hub?: Hub;\n /**\n * Extra Hub properties injected by various SDKs\n */\n integrations?: Integration[];\n extensions?: {\n /** Hack to prevent bundlers from breaking our usage of the domain package in the cross-platform Hub package */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n domain?: { [key: string]: any };\n } & {\n /** Extension methods for the hub, which are bound to the current Hub instance */\n // eslint-disable-next-line @typescript-eslint/ban-types\n [key: string]: Function;\n };\n };\n}\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.getStackTop().scope = scope;\n if (client) {\n this.bindClient(client);\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 if (client && client.setupIntegrations) {\n client.setupIntegrations();\n }\n }\n\n /**\n * @inheritDoc\n */\n public pushScope(): Scope {\n // We want to clone the content of prev scope\n const scope = Scope.clone(this.getScope());\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 if (this.getStack().length <= 1) return false;\n return !!this.getStack().pop();\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\n public captureException(exception: any, hint?: EventHint): string {\n const eventId = (this._lastEventId = hint && hint.event_id ? hint.event_id : uuid4());\n const syntheticException = new Error('Sentry syntheticException');\n this._withClient((client, scope) => {\n client.captureException(\n exception,\n {\n originalException: exception,\n syntheticException,\n ...hint,\n event_id: eventId,\n },\n scope,\n );\n });\n return eventId;\n }\n\n /**\n * @inheritDoc\n */\n public captureMessage(\n message: string,\n // eslint-disable-next-line deprecation/deprecation\n level?: Severity | SeverityLevel,\n hint?: EventHint,\n ): string {\n const eventId = (this._lastEventId = hint && hint.event_id ? hint.event_id : uuid4());\n const syntheticException = new Error(message);\n this._withClient((client, scope) => {\n client.captureMessage(\n message,\n level,\n {\n originalException: message,\n syntheticException,\n ...hint,\n event_id: eventId,\n },\n scope,\n );\n });\n return eventId;\n }\n\n /**\n * @inheritDoc\n */\n public captureEvent(event: Event, hint?: EventHint): string {\n const eventId = hint && hint.event_id ? hint.event_id : uuid4();\n if (event.type !== 'transaction') {\n this._lastEventId = eventId;\n }\n\n this._withClient((client, scope) => {\n client.captureEvent(event, { ...hint, event_id: eventId }, scope);\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 { scope, client } = this.getStackTop();\n\n if (!scope || !client) return;\n\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const { beforeBreadcrumb = null, maxBreadcrumbs = DEFAULT_BREADCRUMBS } =\n (client.getOptions && client.getOptions()) || {};\n\n if (maxBreadcrumbs <= 0) return;\n\n const timestamp = dateTimestampInSeconds();\n const mergedBreadcrumb = { timestamp, ...breadcrumb };\n const finalBreadcrumb = beforeBreadcrumb\n ? (consoleSandbox(() => beforeBreadcrumb(mergedBreadcrumb, hint)) as Breadcrumb | null)\n : mergedBreadcrumb;\n\n if (finalBreadcrumb === null) return;\n\n scope.addBreadcrumb(finalBreadcrumb, maxBreadcrumbs);\n }\n\n /**\n * @inheritDoc\n */\n public setUser(user: User | null): void {\n const scope = this.getScope();\n if (scope) scope.setUser(user);\n }\n\n /**\n * @inheritDoc\n */\n public setTags(tags: { [key: string]: Primitive }): void {\n const scope = this.getScope();\n if (scope) scope.setTags(tags);\n }\n\n /**\n * @inheritDoc\n */\n public setExtras(extras: Extras): void {\n const scope = this.getScope();\n if (scope) scope.setExtras(extras);\n }\n\n /**\n * @inheritDoc\n */\n public setTag(key: string, value: Primitive): void {\n const scope = this.getScope();\n if (scope) scope.setTag(key, value);\n }\n\n /**\n * @inheritDoc\n */\n public setExtra(key: string, extra: Extra): void {\n const scope = this.getScope();\n if (scope) scope.setExtra(key, extra);\n }\n\n /**\n * @inheritDoc\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public setContext(name: string, context: { [key: string]: any } | null): void {\n const scope = this.getScope();\n if (scope) scope.setContext(name, context);\n }\n\n /**\n * @inheritDoc\n */\n public configureScope(callback: (scope: Scope) => void): void {\n const { scope, client } = this.getStackTop();\n if (scope && client) {\n callback(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) return null;\n try {\n return client.getIntegration(integration);\n } catch (_oO) {\n __DEBUG_BUILD__ && logger.warn(`Cannot retrieve integration ${integration.id} from the current Hub`);\n return null;\n }\n }\n\n /**\n * @inheritDoc\n */\n public startTransaction(context: TransactionContext, customSamplingContext?: CustomSamplingContext): Transaction {\n return this._callExtensionMethod('startTransaction', context, customSamplingContext);\n }\n\n /**\n * @inheritDoc\n */\n public traceHeaders(): { [key: string]: string } {\n return this._callExtensionMethod<{ [key: string]: string }>('traceHeaders');\n }\n\n /**\n * @inheritDoc\n */\n public captureSession(endSession: boolean = false): void {\n // both send the update and pull the session from the scope\n if (endSession) {\n return this.endSession();\n }\n\n // only send the update\n this._sendSessionUpdate();\n }\n\n /**\n * @inheritDoc\n */\n public endSession(): void {\n const layer = this.getStackTop();\n const scope = layer && layer.scope;\n const session = scope && scope.getSession();\n if (session) {\n closeSession(session);\n }\n this._sendSessionUpdate();\n\n // the session is over; take it off of the scope\n if (scope) {\n scope.setSession();\n }\n }\n\n /**\n * @inheritDoc\n */\n public startSession(context?: SessionContext): Session {\n const { scope, client } = this.getStackTop();\n const { release, environment } = (client && client.getOptions()) || {};\n\n // Will fetch userAgent if called from browser sdk\n const global = getGlobalObject<{ navigator?: { userAgent?: string } }>();\n const { userAgent } = global.navigator || {};\n\n const session = makeSession({\n release,\n environment,\n ...(scope && { user: scope.getUser() }),\n ...(userAgent && { userAgent }),\n ...context,\n });\n\n if (scope) {\n // End existing session if there's one\n const currentSession = scope.getSession && scope.getSession();\n if (currentSession && currentSession.status === 'ok') {\n updateSession(currentSession, { status: 'exited' });\n }\n this.endSession();\n\n // Afterwards we set the new session on the scope\n scope.setSession(session);\n }\n\n return session;\n }\n\n /**\n * Returns if default PII should be sent to Sentry and propagated in ourgoing requests\n * when Tracing is used.\n */\n public shouldSendDefaultPii(): boolean {\n const client = this.getClient();\n const options = client && client.getOptions();\n return Boolean(options && options.sendDefaultPii);\n }\n\n /**\n * Sends the current Session on the scope\n */\n private _sendSessionUpdate(): void {\n const { scope, client } = this.getStackTop();\n if (!scope) return;\n\n const session = scope.getSession();\n if (session) {\n if (client && client.captureSession) {\n client.captureSession(session);\n }\n }\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 _withClient(callback: (client: Client, scope: Scope | undefined) => void): void {\n const { scope, client } = this.getStackTop();\n if (client) {\n callback(client, scope);\n }\n }\n\n /**\n * Calls global extension method and binding current instance to the function call\n */\n // @ts-ignore Function lacks ending return statement and return type does not include 'undefined'. ts(2366)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _callExtensionMethod(method: string, ...args: any[]): T {\n const carrier = getMainCarrier();\n const sentry = carrier.__SENTRY__;\n if (sentry && sentry.extensions && typeof sentry.extensions[method] === 'function') {\n return sentry.extensions[method].apply(this, args);\n }\n __DEBUG_BUILD__ && logger.warn(`Extension method ${method} couldn't be found, doing nothing.`);\n }\n}\n\n/**\n * Returns the global shim registry.\n *\n * FIXME: This function is problematic, because despite always returning a valid Carrier,\n * it has an optional `__SENTRY__` property, which then in turn requires us to always perform an unnecessary check\n * at the call-site. We always access the carrier through this function, so we can guarantee that `__SENTRY__` is there.\n **/\nexport function getMainCarrier(): Carrier {\n const carrier = getGlobalObject();\n carrier.__SENTRY__ = carrier.__SENTRY__ || {\n extensions: {},\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, and fallback to the registry if one doesn't exist\n * @returns discovered hub\n */\nfunction getHubFromActiveDomain(registry: Carrier): Hub {\n try {\n const sentry = getMainCarrier().__SENTRY__;\n const activeDomain = sentry && sentry.extensions && sentry.extensions.domain && sentry.extensions.domain.active;\n\n // If there's 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 it's 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 return !!(carrier && carrier.__SENTRY__ && carrier.__SENTRY__.hub);\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 return getGlobalSingleton('hub', () => new Hub(), carrier);\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 * @returns A boolean indicating success or failure\n */\nexport function setHubOnCarrier(carrier: Carrier, hub: Hub): boolean {\n if (!carrier) return false;\n const __SENTRY__ = (carrier.__SENTRY__ = carrier.__SENTRY__ || {});\n __SENTRY__.hub = hub;\n return true;\n}\n","import {\n Breadcrumb,\n CaptureContext,\n CustomSamplingContext,\n Event,\n EventHint,\n Extra,\n Extras,\n Primitive,\n Severity,\n SeverityLevel,\n TransactionContext,\n User,\n} from '@sentry/types';\n\nimport { getCurrentHub, Hub } from './hub';\nimport { Scope } from './scope';\n\n// Note: All functions in this file are typed with a return value of `ReturnType`,\n// where HUB_FUNCTION is some method on the Hub class.\n//\n// This is done to make sure the top level SDK methods stay in sync with the hub methods.\n// Although every method here has an explicit return type, some of them (that map to void returns) do not\n// contain `return` keywords. This is done to save on bundle size, as `return` is not minifiable.\n\n/**\n * Captures an exception event and sends it to Sentry.\n *\n * @param exception An exception-like object.\n * @param captureContext Additional scope data to apply to exception event.\n * @returns The generated eventId.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\nexport function captureException(exception: any, captureContext?: CaptureContext): ReturnType {\n return getCurrentHub().captureException(exception, { captureContext });\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 Severity Define the level of the message.\n * @returns The generated eventId.\n */\nexport function captureMessage(\n message: string,\n // eslint-disable-next-line deprecation/deprecation\n captureContext?: CaptureContext | Severity | SeverityLevel,\n): ReturnType {\n // This is necessary to provide explicit scopes upgrade, without changing the original\n // arity of the `captureMessage(message, level)` method.\n const level = typeof captureContext === 'string' ? captureContext : undefined;\n const context = typeof captureContext !== 'string' ? { captureContext } : undefined;\n return getCurrentHub().captureMessage(message, level, context);\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, hint?: EventHint): ReturnType {\n return getCurrentHub().captureEvent(event, hint);\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): ReturnType {\n getCurrentHub().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): ReturnType {\n getCurrentHub().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 normalized.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function setContext(name: string, context: { [key: string]: any } | null): ReturnType {\n getCurrentHub().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: Extras): ReturnType {\n getCurrentHub().setExtras(extras);\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 normalized.\n */\nexport function setExtra(key: string, extra: Extra): ReturnType {\n getCurrentHub().setExtra(key, extra);\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]: Primitive }): ReturnType {\n getCurrentHub().setTags(tags);\n}\n\n/**\n * Set key:value that will be sent as tags data with the event.\n *\n * Can also be used to unset a tag, by passing `undefined`.\n *\n * @param key String key of tag\n * @param value Value of tag\n */\nexport function setTag(key: string, value: Primitive): ReturnType {\n getCurrentHub().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): ReturnType {\n getCurrentHub().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): ReturnType {\n getCurrentHub().withScope(callback);\n}\n\n/**\n * Starts a new `Transaction` and returns it. This is the entry point to manual tracing instrumentation.\n *\n * A tree structure can be built by adding child spans to the transaction, and child spans to other spans. To start a\n * new child span within the transaction or any span, call the respective `.startChild()` method.\n *\n * Every child span must be finished before the transaction is finished, otherwise the unfinished spans are discarded.\n *\n * The transaction must be finished with a call to its `.finish()` method, at which point the transaction with all its\n * finished child spans will be sent to Sentry.\n *\n * NOTE: This function should only be used for *manual* instrumentation. Auto-instrumentation should call\n * `startTransaction` directly on the hub.\n *\n * @param context Properties of the new `Transaction`.\n * @param customSamplingContext Information given to the transaction sampling function (along with context-dependent\n * default values). See {@link Options.tracesSampler}.\n *\n * @returns The transaction which was just started\n */\nexport function startTransaction(\n context: TransactionContext,\n customSamplingContext?: CustomSamplingContext,\n): ReturnType {\n return getCurrentHub().startTransaction(\n {\n metadata: { source: 'custom' },\n ...context,\n },\n customSamplingContext,\n );\n}\n","import { ClientOptions, DsnComponents, DsnLike, SdkInfo } from '@sentry/types';\nimport { dsnToString, makeDsn, urlEncode } from '@sentry/utils';\n\nconst SENTRY_API_VERSION = '7';\n\n/** Returns the prefix to construct Sentry ingestion API endpoints. */\nfunction getBaseApiEndpoint(dsn: DsnComponents): string {\n const protocol = dsn.protocol ? `${dsn.protocol}:` : '';\n const port = dsn.port ? `:${dsn.port}` : '';\n return `${protocol}//${dsn.host}${port}${dsn.path ? `/${dsn.path}` : ''}/api/`;\n}\n\n/** Returns the ingest API endpoint for target. */\nfunction _getIngestEndpoint(dsn: DsnComponents): string {\n return `${getBaseApiEndpoint(dsn)}${dsn.projectId}/envelope/`;\n}\n\n/** Returns a URL-encoded string with auth config suitable for a query string. */\nfunction _encodedAuth(dsn: DsnComponents, sdkInfo: SdkInfo | undefined): string {\n return urlEncode({\n // We send only the minimum set of required information. See\n // https://github.com/getsentry/sentry-javascript/issues/2572.\n sentry_key: dsn.publicKey,\n sentry_version: SENTRY_API_VERSION,\n ...(sdkInfo && { sentry_client: `${sdkInfo.name}/${sdkInfo.version}` }),\n });\n}\n\n/**\n * Returns the envelope endpoint URL with auth in the query string.\n *\n * Sending auth as part of the query string and not as custom HTTP headers avoids CORS preflight requests.\n */\nexport function getEnvelopeEndpointWithUrlEncodedAuth(\n dsn: DsnComponents,\n // TODO (v8): Remove `tunnelOrOptions` in favor of `options`, and use the substitute code below\n // options: ClientOptions = {} as ClientOptions,\n tunnelOrOptions: string | ClientOptions = {} as ClientOptions,\n): string {\n // TODO (v8): Use this code instead\n // const { tunnel, _metadata = {} } = options;\n // return tunnel ? tunnel : `${_getIngestEndpoint(dsn)}?${_encodedAuth(dsn, _metadata.sdk)}`;\n\n const tunnel = typeof tunnelOrOptions === 'string' ? tunnelOrOptions : tunnelOrOptions.tunnel;\n const sdkInfo =\n typeof tunnelOrOptions === 'string' || !tunnelOrOptions._metadata ? undefined : tunnelOrOptions._metadata.sdk;\n\n return tunnel ? tunnel : `${_getIngestEndpoint(dsn)}?${_encodedAuth(dsn, sdkInfo)}`;\n}\n\n/** Returns the url to the report dialog endpoint. */\nexport function getReportDialogEndpoint(\n dsnLike: DsnLike,\n dialogOptions: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any;\n user?: { name?: string; email?: string };\n },\n): string {\n const dsn = makeDsn(dsnLike);\n const endpoint = `${getBaseApiEndpoint(dsn)}embed/error-page/`;\n\n let encodedOptions = `dsn=${dsnToString(dsn)}`;\n for (const key in dialogOptions) {\n if (key === 'dsn') {\n continue;\n }\n\n if (key === 'user') {\n const user = dialogOptions.user;\n if (!user) {\n continue;\n }\n if (user.name) {\n encodedOptions += `&name=${encodeURIComponent(user.name)}`;\n }\n if (user.email) {\n encodedOptions += `&email=${encodeURIComponent(user.email)}`;\n }\n } else {\n encodedOptions += `&${encodeURIComponent(key)}=${encodeURIComponent(dialogOptions[key] as string)}`;\n }\n }\n\n return `${endpoint}?${encodedOptions}`;\n}\n","import {\n Baggage,\n DsnComponents,\n DynamicSamplingContext,\n Event,\n EventEnvelope,\n EventEnvelopeHeaders,\n EventItem,\n SdkInfo,\n SdkMetadata,\n Session,\n SessionAggregates,\n SessionEnvelope,\n SessionItem,\n} from '@sentry/types';\nimport { createEnvelope, dropUndefinedKeys, dsnToString, getSentryBaggageItems } from '@sentry/utils';\n\n/** Extract sdk info from from the API metadata */\nfunction getSdkMetadataForEnvelopeHeader(metadata?: SdkMetadata): SdkInfo | undefined {\n if (!metadata || !metadata.sdk) {\n return;\n }\n const { name, version } = metadata.sdk;\n return { name, version };\n}\n\n/**\n * Apply SdkInfo (name, version, packages, integrations) to the corresponding event key.\n * Merge with existing data if any.\n **/\nfunction enhanceEventWithSdkInfo(event: Event, sdkInfo?: SdkInfo): Event {\n if (!sdkInfo) {\n return event;\n }\n event.sdk = event.sdk || {};\n event.sdk.name = event.sdk.name || sdkInfo.name;\n event.sdk.version = event.sdk.version || sdkInfo.version;\n event.sdk.integrations = [...(event.sdk.integrations || []), ...(sdkInfo.integrations || [])];\n event.sdk.packages = [...(event.sdk.packages || []), ...(sdkInfo.packages || [])];\n return event;\n}\n\n/** Creates an envelope from a Session */\nexport function createSessionEnvelope(\n session: Session | SessionAggregates,\n dsn: DsnComponents,\n metadata?: SdkMetadata,\n tunnel?: string,\n): SessionEnvelope {\n const sdkInfo = getSdkMetadataForEnvelopeHeader(metadata);\n const envelopeHeaders = {\n sent_at: new Date().toISOString(),\n ...(sdkInfo && { sdk: sdkInfo }),\n ...(!!tunnel && { dsn: dsnToString(dsn) }),\n };\n\n const envelopeItem: SessionItem =\n 'aggregates' in session ? [{ type: 'sessions' }, session] : [{ type: 'session' }, session];\n\n return createEnvelope(envelopeHeaders, [envelopeItem]);\n}\n\n/**\n * Create an Envelope from an event.\n */\nexport function createEventEnvelope(\n event: Event,\n dsn: DsnComponents,\n metadata?: SdkMetadata,\n tunnel?: string,\n): EventEnvelope {\n const sdkInfo = getSdkMetadataForEnvelopeHeader(metadata);\n const eventType = event.type || 'event';\n\n const { transactionSampling } = event.sdkProcessingMetadata || {};\n const { method: samplingMethod, rate: sampleRate } = transactionSampling || {};\n\n enhanceEventWithSdkInfo(event, metadata && metadata.sdk);\n\n const envelopeHeaders = createEventEnvelopeHeaders(event, sdkInfo, tunnel, dsn);\n\n // Prevent this data (which, if it exists, was used in earlier steps in the processing pipeline) from being sent to\n // sentry. (Note: Our use of this property comes and goes with whatever we might be debugging, whatever hacks we may\n // have temporarily added, etc. Even if we don't happen to be using it at some point in the future, let's not get rid\n // of this `delete`, lest we miss putting it back in the next time the property is in use.)\n delete event.sdkProcessingMetadata;\n\n const eventItem: EventItem = [\n {\n type: eventType,\n sample_rates: [{ id: samplingMethod, rate: sampleRate }],\n },\n event,\n ];\n return createEnvelope(envelopeHeaders, [eventItem]);\n}\n\nfunction createEventEnvelopeHeaders(\n event: Event,\n sdkInfo: SdkInfo | undefined,\n tunnel: string | undefined,\n dsn: DsnComponents,\n): EventEnvelopeHeaders {\n const baggage: Baggage | undefined = event.sdkProcessingMetadata && event.sdkProcessingMetadata.baggage;\n const dynamicSamplingContext = baggage && getSentryBaggageItems(baggage);\n\n return {\n event_id: event.event_id as string,\n sent_at: new Date().toISOString(),\n ...(sdkInfo && { sdk: sdkInfo }),\n ...(!!tunnel && { dsn: dsnToString(dsn) }),\n ...(event.type === 'transaction' &&\n dynamicSamplingContext && {\n trace: dropUndefinedKeys({ ...dynamicSamplingContext }) as DynamicSamplingContext,\n }),\n };\n}\n","import { Baggage, BaggageObj, HttpHeaderValue, TraceparentData } from '@sentry/types';\n\nimport { isString } from './is';\nimport { logger } from './logger';\n\nexport const BAGGAGE_HEADER_NAME = 'baggage';\n\nexport const SENTRY_BAGGAGE_KEY_PREFIX = 'sentry-';\n\nexport const SENTRY_BAGGAGE_KEY_PREFIX_REGEX = /^sentry-/;\n\n/**\n * Max length of a serialized baggage string\n *\n * https://www.w3.org/TR/baggage/#limits\n */\nexport const MAX_BAGGAGE_STRING_LENGTH = 8192;\n\n/** Create an instance of Baggage */\nexport function createBaggage(initItems: BaggageObj, baggageString: string = '', mutable: boolean = true): Baggage {\n return [{ ...initItems }, baggageString, mutable];\n}\n\n/** Get a value from baggage */\nexport function getBaggageValue(baggage: Baggage, key: keyof BaggageObj): BaggageObj[keyof BaggageObj] {\n return baggage[0][key];\n}\n\n/** Add a value to baggage */\nexport function setBaggageValue(baggage: Baggage, key: keyof BaggageObj, value: BaggageObj[keyof BaggageObj]): void {\n if (isBaggageMutable(baggage)) {\n baggage[0][key] = value;\n }\n}\n\n/** Check if the Sentry part of the passed baggage (i.e. the first element in the tuple) is empty */\nexport function isSentryBaggageEmpty(baggage: Baggage): boolean {\n return Object.keys(baggage[0]).length === 0;\n}\n\n/** Returns Sentry specific baggage values */\nexport function getSentryBaggageItems(baggage: Baggage): BaggageObj {\n return baggage[0];\n}\n\n/**\n * Returns 3rd party baggage string of @param baggage\n * @param baggage\n */\nexport function getThirdPartyBaggage(baggage: Baggage): string {\n return baggage[1];\n}\n\n/**\n * Checks if baggage is mutable\n * @param baggage\n * @returns true if baggage is mutable, else false\n */\nexport function isBaggageMutable(baggage: Baggage): boolean {\n return baggage[2];\n}\n\n/**\n * Sets the passed baggage immutable\n * @param baggage\n */\nexport function setBaggageImmutable(baggage: Baggage): void {\n baggage[2] = false;\n}\n\n/** Serialize a baggage object */\nexport function serializeBaggage(baggage: Baggage): string {\n return Object.keys(baggage[0]).reduce((prev, key: keyof BaggageObj) => {\n const val = baggage[0][key] as string;\n const baggageEntry = `${SENTRY_BAGGAGE_KEY_PREFIX}${encodeURIComponent(key)}=${encodeURIComponent(val)}`;\n const newVal = prev === '' ? baggageEntry : `${prev},${baggageEntry}`;\n if (newVal.length > MAX_BAGGAGE_STRING_LENGTH) {\n __DEBUG_BUILD__ &&\n logger.warn(`Not adding key: ${key} with val: ${val} to baggage due to exceeding baggage size limits.`);\n return prev;\n } else {\n return newVal;\n }\n }, baggage[1]);\n}\n\n/**\n * Parse a baggage header from a string or a string array and return a Baggage object\n *\n * If @param includeThirdPartyEntries is set to true, third party baggage entries are added to the Baggage object\n * (This is necessary for merging potentially pre-existing baggage headers in outgoing requests with\n * our `sentry-` values)\n */\nexport function parseBaggageHeader(\n inputBaggageValue: HttpHeaderValue,\n includeThirdPartyEntries: boolean = false,\n): Baggage {\n // Adding this check here because we got reports of this function failing due to the input value\n // not being a string. This debug log might help us determine what's going on here.\n if ((!Array.isArray(inputBaggageValue) && !isString(inputBaggageValue)) || typeof inputBaggageValue === 'number') {\n __DEBUG_BUILD__ &&\n logger.warn(\n '[parseBaggageHeader] Received input value of incompatible type: ',\n typeof inputBaggageValue,\n inputBaggageValue,\n );\n\n // Gonna early-return an empty baggage object so that we don't fail later on\n return createBaggage({}, '');\n }\n\n const baggageEntries = (isString(inputBaggageValue) ? inputBaggageValue : inputBaggageValue.join(','))\n .split(',')\n .map(entry => entry.trim())\n .filter(entry => entry !== '' && (includeThirdPartyEntries || SENTRY_BAGGAGE_KEY_PREFIX_REGEX.test(entry)));\n\n return baggageEntries.reduce(\n ([baggageObj, baggageString], curr) => {\n const [key, val] = curr.split('=');\n if (SENTRY_BAGGAGE_KEY_PREFIX_REGEX.test(key)) {\n const baggageKey = decodeURIComponent(key.split('-')[1]);\n return [\n {\n ...baggageObj,\n [baggageKey]: decodeURIComponent(val),\n },\n baggageString,\n true,\n ];\n } else {\n return [baggageObj, baggageString === '' ? curr : `${baggageString},${curr}`, true];\n }\n },\n [{}, '', true],\n );\n}\n\n/**\n * Merges the baggage header we saved from the incoming request (or meta tag) with\n * a possibly created or modified baggage header by a third party that's been added\n * to the outgoing request header.\n *\n * In case @param headerBaggageString exists, we can safely add the the 3rd party part of @param headerBaggage\n * with our @param incomingBaggage. This is possible because if we modified anything beforehand,\n * it would only affect parts of the sentry baggage (@see Baggage interface).\n *\n * @param incomingBaggage the baggage header of the incoming request that might contain sentry entries\n * @param thirdPartyBaggageHeader possibly existing baggage header string or string[] added from a third\n * party to the request headers\n *\n * @return a merged and serialized baggage string to be propagated with the outgoing request\n */\nexport function mergeAndSerializeBaggage(incomingBaggage?: Baggage, thirdPartyBaggageHeader?: HttpHeaderValue): string {\n if (!incomingBaggage && !thirdPartyBaggageHeader) {\n return '';\n }\n\n const headerBaggage = (thirdPartyBaggageHeader && parseBaggageHeader(thirdPartyBaggageHeader, true)) || undefined;\n const thirdPartyHeaderBaggage = headerBaggage && getThirdPartyBaggage(headerBaggage);\n\n const finalBaggage = createBaggage((incomingBaggage && incomingBaggage[0]) || {}, thirdPartyHeaderBaggage || '');\n return serializeBaggage(finalBaggage);\n}\n\n/**\n * Helper function that takes a raw baggage string (if available) and the processed sentry-trace header\n * data (if available), parses the baggage string and creates a Baggage object\n * If there is no baggage string, it will create an empty Baggage object.\n * In a second step, this functions determines if the created Baggage object should be set immutable\n * to prevent mutation of the Sentry data.\n *\n * Extracted this logic to a function because it's duplicated in a lot of places.\n *\n * @param rawBaggageValue\n * @param sentryTraceHeader\n */\nexport function parseBaggageSetMutability(\n rawBaggageValue: HttpHeaderValue | false | undefined,\n sentryTraceHeader: TraceparentData | string | false | undefined | null,\n): Baggage {\n const baggage = parseBaggageHeader(rawBaggageValue || '');\n\n // Because we are always creating a Baggage object by calling `parseBaggageHeader` above\n // (either a filled one or an empty one, even if we didn't get a `baggage` header),\n // we only need to check if we have a sentry-trace header or not. As soon as we have it,\n // we set baggage immutable. In case we don't get a sentry-trace header, we can assume that\n // this SDK is the head of the trace and thus we still permit mutation at this time.\n // There is one exception though, which is that we get a baggage-header with `sentry-`\n // items but NO sentry-trace header. In this case we also set the baggage immutable for now\n // but if smoething like this would ever happen, we should revisit this and determine\n // what this would actually mean for the trace (i.e. is this SDK the head?, what happened\n // before that we don't have a sentry-trace header?, etc)\n (sentryTraceHeader || !isSentryBaggageEmpty(baggage)) && setBaggageImmutable(baggage);\n\n return baggage;\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 type IntegrationIndex = {\n [key: string]: Integration;\n};\n\n/**\n * @private\n */\nfunction filterDuplicates(integrations: Integration[]): Integration[] {\n return integrations.reduce((acc, integrations) => {\n if (acc.every(accIntegration => integrations.name !== accIntegration.name)) {\n acc.push(integrations);\n }\n return acc;\n }, [] as 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\n let integrations: Integration[] = [...filterDuplicates(defaultIntegrations)];\n\n if (Array.isArray(userIntegrations)) {\n // Filter out integrations that are also included in user options\n integrations = [\n ...integrations.filter(integrations =>\n userIntegrations.every(userIntegration => userIntegration.name !== integrations.name),\n ),\n // And filter out duplicated user options integrations\n ...filterDuplicates(userIntegrations),\n ];\n } else if (typeof userIntegrations === 'function') {\n integrations = userIntegrations(integrations);\n integrations = Array.isArray(integrations) ? integrations : [integrations];\n }\n\n // Make sure that if present, `Debug` integration will always run last\n const integrationsNames = integrations.map(i => i.name);\n const alwaysLastToRun = 'Debug';\n if (integrationsNames.indexOf(alwaysLastToRun) !== -1) {\n integrations.push(...integrations.splice(integrationsNames.indexOf(alwaysLastToRun), 1));\n }\n\n return integrations;\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(integrations: Integration[]): IntegrationIndex {\n const integrationIndex: IntegrationIndex = {};\n\n integrations.forEach(integration => {\n integrationIndex[integration.name] = integration;\n\n if (installedIntegrations.indexOf(integration.name) === -1) {\n integration.setupOnce(addGlobalEventProcessor, getCurrentHub);\n installedIntegrations.push(integration.name);\n __DEBUG_BUILD__ && logger.log(`Integration installed: ${integration.name}`);\n }\n });\n\n return integrationIndex;\n}\n","/* eslint-disable max-lines */\nimport { Scope, updateSession } from '@sentry/hub';\nimport {\n Client,\n ClientOptions,\n DataCategory,\n DsnComponents,\n Envelope,\n Event,\n EventDropReason,\n EventHint,\n Integration,\n IntegrationClass,\n Outcome,\n Session,\n SessionAggregates,\n Severity,\n SeverityLevel,\n Transport,\n} from '@sentry/types';\nimport {\n addItemToEnvelope,\n checkOrSetAlreadyCaught,\n createAttachmentEnvelopeItem,\n dateTimestampInSeconds,\n isPlainObject,\n isPrimitive,\n isThenable,\n logger,\n makeDsn,\n normalize,\n rejectedSyncPromise,\n resolvedSyncPromise,\n SentryError,\n SyncPromise,\n truncate,\n uuid4,\n} from '@sentry/utils';\n\nimport { getEnvelopeEndpointWithUrlEncodedAuth } from './api';\nimport { createEventEnvelope, createSessionEnvelope } from './envelope';\nimport { IntegrationIndex, setupIntegrations } from './integration';\n\nconst ALREADY_SEEN_ERROR = \"Not capturing exception because it's already been captured.\";\n\n/**\n * Base implementation for all JavaScript SDK clients.\n *\n * Call the constructor with the corresponding options\n * specific to the client subclass. To access these options later, use\n * {@link Client.getOptions}.\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, 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(options);\n * }\n *\n * // ...\n * }\n */\nexport abstract class BaseClient implements Client {\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?: DsnComponents;\n\n protected readonly _transport?: Transport;\n\n /** Array of set up integrations. */\n protected _integrations: IntegrationIndex = {};\n\n /** Indicates whether this client's integrations have been set up. */\n protected _integrationsInitialized: boolean = false;\n\n /** Number of calls being processed */\n protected _numProcessing: number = 0;\n\n /** Holds flushable */\n private _outcomes: { [key: string]: number } = {};\n\n /**\n * Initializes this client instance.\n *\n * @param options Options for the client.\n */\n protected constructor(options: O) {\n this._options = options;\n if (options.dsn) {\n this._dsn = makeDsn(options.dsn);\n const url = getEnvelopeEndpointWithUrlEncodedAuth(this._dsn, options);\n this._transport = options.transport({\n recordDroppedEvent: this.recordDroppedEvent.bind(this),\n ...options.transportOptions,\n url,\n });\n } else {\n __DEBUG_BUILD__ && logger.warn('No DSN provided, client will not do anything.');\n }\n }\n\n /**\n * @inheritDoc\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\n public captureException(exception: any, hint?: EventHint, scope?: Scope): string | undefined {\n // ensure we haven't captured this very object before\n if (checkOrSetAlreadyCaught(exception)) {\n __DEBUG_BUILD__ && logger.log(ALREADY_SEEN_ERROR);\n return;\n }\n\n let eventId: string | undefined = hint && hint.event_id;\n\n this._process(\n this.eventFromException(exception, hint)\n .then(event => this._captureEvent(event, hint, scope))\n .then(result => {\n eventId = result;\n }),\n );\n\n return eventId;\n }\n\n /**\n * @inheritDoc\n */\n public captureMessage(\n message: string,\n // eslint-disable-next-line deprecation/deprecation\n level?: Severity | SeverityLevel,\n hint?: EventHint,\n scope?: Scope,\n ): string | undefined {\n let eventId: string | undefined = hint && hint.event_id;\n\n const promisedEvent = isPrimitive(message)\n ? this.eventFromMessage(String(message), level, hint)\n : this.eventFromException(message, hint);\n\n this._process(\n promisedEvent\n .then(event => this._captureEvent(event, hint, scope))\n .then(result => {\n eventId = result;\n }),\n );\n\n return eventId;\n }\n\n /**\n * @inheritDoc\n */\n public captureEvent(event: Event, hint?: EventHint, scope?: Scope): string | undefined {\n // ensure we haven't captured this very object before\n if (hint && hint.originalException && checkOrSetAlreadyCaught(hint.originalException)) {\n __DEBUG_BUILD__ && logger.log(ALREADY_SEEN_ERROR);\n return;\n }\n\n let eventId: string | undefined = hint && hint.event_id;\n\n this._process(\n this._captureEvent(event, hint, scope).then(result => {\n eventId = result;\n }),\n );\n\n return eventId;\n }\n\n /**\n * @inheritDoc\n */\n public captureSession(session: Session): void {\n if (!this._isEnabled()) {\n __DEBUG_BUILD__ && logger.warn('SDK not enabled, will not capture session.');\n return;\n }\n\n if (!(typeof session.release === 'string')) {\n __DEBUG_BUILD__ && logger.warn('Discarded session because of missing or non-string release');\n } else {\n this.sendSession(session);\n // After sending, we set init false to indicate it's not the first occurrence\n updateSession(session, { init: false });\n }\n }\n\n /**\n * @inheritDoc\n */\n public getDsn(): DsnComponents | 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 getTransport(): Transport | undefined {\n return this._transport;\n }\n\n /**\n * @inheritDoc\n */\n public flush(timeout?: number): PromiseLike {\n const transport = this._transport;\n if (transport) {\n return this._isClientDoneProcessing(timeout).then(clientFinished => {\n return transport.flush(timeout).then(transportFlushed => clientFinished && transportFlushed);\n });\n } else {\n return resolvedSyncPromise(true);\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 * Sets up the integrations\n */\n public setupIntegrations(): void {\n if (this._isEnabled() && !this._integrationsInitialized) {\n this._integrations = setupIntegrations(this._options.integrations);\n this._integrationsInitialized = true;\n }\n }\n\n /**\n * Gets an installed integration by its `id`.\n *\n * @returns The installed integration or `undefined` if no integration with that `id` was installed.\n */\n public getIntegrationById(integrationId: string): Integration | undefined {\n return this._integrations[integrationId];\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 __DEBUG_BUILD__ && logger.warn(`Cannot retrieve integration ${integration.id} from the current Client`);\n return null;\n }\n }\n\n /**\n * @inheritDoc\n */\n public sendEvent(event: Event, hint: EventHint = {}): void {\n if (this._dsn) {\n let env = createEventEnvelope(event, this._dsn, this._options._metadata, this._options.tunnel);\n\n for (const attachment of hint.attachments || []) {\n env = addItemToEnvelope(\n env,\n createAttachmentEnvelopeItem(\n attachment,\n this._options.transportOptions && this._options.transportOptions.textEncoder,\n ),\n );\n }\n\n this._sendEnvelope(env);\n }\n }\n\n /**\n * @inheritDoc\n */\n public sendSession(session: Session | SessionAggregates): void {\n if (this._dsn) {\n const env = createSessionEnvelope(session, this._dsn, this._options._metadata, this._options.tunnel);\n this._sendEnvelope(env);\n }\n }\n\n /**\n * @inheritDoc\n */\n public recordDroppedEvent(reason: EventDropReason, category: DataCategory): void {\n if (this._options.sendClientReports) {\n // We want to track each category (error, transaction, session) separately\n // but still keep the distinction between different type of outcomes.\n // We could use nested maps, but it's much easier to read and type this way.\n // A correct type for map-based implementation if we want to go that route\n // would be `Partial>>>`\n // With typescript 4.1 we could even use template literal types\n const key = `${reason}:${category}`;\n __DEBUG_BUILD__ && logger.log(`Adding outcome: \"${key}\"`);\n\n // The following works because undefined + 1 === NaN and NaN is falsy\n this._outcomes[key] = this._outcomes[key] + 1 || 1;\n }\n }\n\n /** Updates existing session based on the provided event */\n protected _updateSessionFromEvent(session: Session, event: Event): void {\n let crashed = false;\n let errored = false;\n const exceptions = event.exception && event.exception.values;\n\n if (exceptions) {\n errored = true;\n\n for (const ex of exceptions) {\n const mechanism = ex.mechanism;\n if (mechanism && mechanism.handled === false) {\n crashed = true;\n break;\n }\n }\n }\n\n // A session is updated and that session update is sent in only one of the two following scenarios:\n // 1. Session with non terminal status and 0 errors + an error occurred -> Will set error count to 1 and send update\n // 2. Session with non terminal status and 1 error + a crash occurred -> Will set status crashed and send update\n const sessionNonTerminal = session.status === 'ok';\n const shouldUpdateAndSend = (sessionNonTerminal && session.errors === 0) || (sessionNonTerminal && crashed);\n\n if (shouldUpdateAndSend) {\n updateSession(session, {\n ...(crashed && { status: 'crashed' }),\n errors: session.errors || Number(errored || crashed),\n });\n this.captureSession(session);\n }\n }\n\n /**\n * Determine if the client is finished processing. Returns a promise because it will wait `timeout` ms before saying\n * \"no\" (resolving to `false`) in order to give the client a chance to potentially finish first.\n *\n * @param timeout The time, in ms, after which to resolve to `false` if the client is still busy. Passing `0` (or not\n * passing anything) will make the promise wait as long as it takes for processing to finish before resolving to\n * `true`.\n * @returns A promise which will resolve to `true` if processing is already done or finishes before the timeout, and\n * `false` otherwise\n */\n protected _isClientDoneProcessing(timeout?: number): PromiseLike {\n return new SyncPromise(resolve => {\n let ticked: number = 0;\n const tick: number = 1;\n\n const interval = setInterval(() => {\n if (this._numProcessing == 0) {\n clearInterval(interval);\n resolve(true);\n } else {\n ticked += tick;\n if (timeout && ticked >= timeout) {\n clearInterval(interval);\n resolve(false);\n }\n }\n }, tick);\n });\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 information 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, hint: EventHint, scope?: Scope): PromiseLike {\n const { normalizeDepth = 3, normalizeMaxBreadth = 1_000 } = this.getOptions();\n const prepared: Event = {\n ...event,\n event_id: event.event_id || hint.event_id || uuid4(),\n timestamp: event.timestamp || dateTimestampInSeconds(),\n };\n\n this._applyClientOptions(prepared);\n this._applyIntegrationsMetadata(prepared);\n\n // If we have scope given to us, use it as the base for further modifications.\n // This allows us to prevent unnecessary copying of data if `captureContext` is not provided.\n let finalScope = scope;\n if (hint.captureContext) {\n finalScope = Scope.clone(finalScope).update(hint.captureContext);\n }\n\n // We prepare the result here with a resolved Event.\n let result = resolvedSyncPromise(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 (finalScope) {\n // Collect attachments from the hint and scope\n const attachments = [...(hint.attachments || []), ...finalScope.getAttachments()];\n\n if (attachments.length) {\n hint.attachments = attachments;\n }\n\n // In case we have a hub we reassign it.\n result = finalScope.applyToEvent(prepared, hint);\n }\n\n return result.then(evt => {\n if (typeof normalizeDepth === 'number' && normalizeDepth > 0) {\n return this._normalizeEvent(evt, normalizeDepth, normalizeMaxBreadth);\n }\n return evt;\n });\n }\n\n /**\n * Applies `normalize` function on necessary `Event` attributes to make them safe for serialization.\n * Normalized keys:\n * - `breadcrumbs.data`\n * - `user`\n * - `contexts`\n * - `extra`\n * @param event Event\n * @returns Normalized event\n */\n protected _normalizeEvent(event: Event | null, depth: number, maxBreadth: number): Event | null {\n if (!event) {\n return null;\n }\n\n const normalized: Event = {\n ...event,\n ...(event.breadcrumbs && {\n breadcrumbs: event.breadcrumbs.map(b => ({\n ...b,\n ...(b.data && {\n data: normalize(b.data, depth, maxBreadth),\n }),\n })),\n }),\n ...(event.user && {\n user: normalize(event.user, depth, maxBreadth),\n }),\n ...(event.contexts && {\n contexts: normalize(event.contexts, depth, maxBreadth),\n }),\n ...(event.extra && {\n extra: normalize(event.extra, depth, maxBreadth),\n }),\n };\n\n // event.contexts.trace stores information about a Transaction. Similarly,\n // event.spans[] stores information about child Spans. Given that a\n // Transaction is conceptually a Span, normalization should apply to both\n // Transactions and Spans consistently.\n // For now the decision is to skip normalization of Transactions and Spans,\n // so this block overwrites the normalized event to add back the original\n // Transaction information prior to normalization.\n if (event.contexts && event.contexts.trace && normalized.contexts) {\n normalized.contexts.trace = event.contexts.trace;\n\n // event.contexts.trace.data may contain circular/dangerous data so we need to normalize it\n if (event.contexts.trace.data) {\n normalized.contexts.trace.data = normalize(event.contexts.trace.data, depth, maxBreadth);\n }\n }\n\n // event.spans[].data may contain circular/dangerous data so we need to normalize it\n if (event.spans) {\n normalized.spans = event.spans.map(span => {\n // We cannot use the spread operator here because `toJSON` on `span` is non-enumerable\n if (span.data) {\n span.data = normalize(span.data, depth, maxBreadth);\n }\n return span;\n });\n }\n\n return normalized;\n }\n\n /**\n * Enhances event using the client configuration.\n * It takes care of all \"static\" values like environment, release and `dist`,\n * as well as truncating overly long values.\n * @param event event instance to be enhanced\n */\n protected _applyClientOptions(event: Event): void {\n const options = this.getOptions();\n const { environment, release, dist, maxValueLength = 250 } = options;\n\n if (!('environment' in event)) {\n event.environment = 'environment' in options ? environment : 'production';\n }\n\n if (event.release === undefined && release !== undefined) {\n event.release = release;\n }\n\n if (event.dist === undefined && dist !== undefined) {\n event.dist = dist;\n }\n\n if (event.message) {\n event.message = truncate(event.message, maxValueLength);\n }\n\n const exception = event.exception && event.exception.values && event.exception.values[0];\n if (exception && exception.value) {\n exception.value = truncate(exception.value, maxValueLength);\n }\n\n const request = event.request;\n if (request && request.url) {\n request.url = truncate(request.url, maxValueLength);\n }\n }\n\n /**\n * This function adds all used integrations to the SDK info in the event.\n * @param event The event that will be filled with all integrations.\n */\n protected _applyIntegrationsMetadata(event: Event): void {\n const integrationsArray = Object.keys(this._integrations);\n if (integrationsArray.length > 0) {\n event.sdk = event.sdk || {};\n event.sdk.integrations = [...(event.sdk.integrations || []), ...integrationsArray];\n }\n }\n\n /**\n * Processes the event and logs an error in case of rejection\n * @param event\n * @param hint\n * @param scope\n */\n protected _captureEvent(event: Event, hint: EventHint = {}, scope?: Scope): PromiseLike {\n return this._processEvent(event, hint, scope).then(\n finalEvent => {\n return finalEvent.event_id;\n },\n reason => {\n __DEBUG_BUILD__ && logger.warn(reason);\n return undefined;\n },\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 information 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 rejectedSyncPromise(new SentryError('SDK not enabled, will not capture event.'));\n }\n\n const isTransaction = event.type === 'transaction';\n // 1.0 === 100% events are sent\n // 0.0 === 0% events are sent\n // Sampling for transaction happens somewhere else\n if (!isTransaction && typeof sampleRate === 'number' && Math.random() > sampleRate) {\n this.recordDroppedEvent('sample_rate', 'error');\n return rejectedSyncPromise(\n new SentryError(\n `Discarding event because it's not included in the random sample (sampling rate = ${sampleRate})`,\n ),\n );\n }\n\n return this._prepareEvent(event, hint, scope)\n .then(prepared => {\n if (prepared === null) {\n this.recordDroppedEvent('event_processor', event.type || 'error');\n throw new SentryError('An event processor returned null, will not send event.');\n }\n\n const isInternalException = hint.data && (hint.data as { __sentry__: boolean }).__sentry__ === true;\n if (isInternalException || isTransaction || !beforeSend) {\n return prepared;\n }\n\n const beforeSendResult = beforeSend(prepared, hint);\n return _ensureBeforeSendRv(beforeSendResult);\n })\n .then(processedEvent => {\n if (processedEvent === null) {\n this.recordDroppedEvent('before_send', event.type || 'error');\n throw new SentryError('`beforeSend` returned `null`, will not send event.');\n }\n\n const session = scope && scope.getSession();\n if (!isTransaction && session) {\n this._updateSessionFromEvent(session, processedEvent);\n }\n\n this.sendEvent(processedEvent, hint);\n return processedEvent;\n })\n .then(null, reason => {\n if (reason instanceof SentryError) {\n throw reason;\n }\n\n this.captureException(reason, {\n data: {\n __sentry__: true,\n },\n originalException: reason as Error,\n });\n throw new SentryError(\n `Event processing pipeline threw an error, original event will not be sent. Details have been sent as a new event.\\nReason: ${reason}`,\n );\n });\n }\n\n /**\n * Occupies the client with processing and event\n */\n protected _process(promise: PromiseLike): void {\n this._numProcessing += 1;\n void promise.then(\n value => {\n this._numProcessing -= 1;\n return value;\n },\n reason => {\n this._numProcessing -= 1;\n return reason;\n },\n );\n }\n\n /**\n * @inheritdoc\n */\n protected _sendEnvelope(envelope: Envelope): void {\n if (this._transport && this._dsn) {\n this._transport.send(envelope).then(null, reason => {\n __DEBUG_BUILD__ && logger.error('Error while sending event:', reason);\n });\n } else {\n __DEBUG_BUILD__ && logger.error('Transport disabled');\n }\n }\n\n /**\n * Clears outcomes on this client and returns them.\n */\n protected _clearOutcomes(): Outcome[] {\n const outcomes = this._outcomes;\n this._outcomes = {};\n return Object.keys(outcomes).map(key => {\n const [reason, category] = key.split(':') as [EventDropReason, DataCategory];\n return {\n reason,\n category,\n quantity: outcomes[key],\n };\n });\n }\n\n /**\n * @inheritDoc\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\n public abstract eventFromException(_exception: any, _hint?: EventHint): PromiseLike;\n\n /**\n * @inheritDoc\n */\n public abstract eventFromMessage(\n _message: string,\n // eslint-disable-next-line deprecation/deprecation\n _level?: Severity | SeverityLevel,\n _hint?: EventHint,\n ): PromiseLike;\n}\n\n/**\n * Verifies that return value of configured `beforeSend` is of expected type.\n */\nfunction _ensureBeforeSendRv(rv: PromiseLike | Event | null): PromiseLike | Event | null {\n const nullErr = '`beforeSend` method has to return `null` or a valid event.';\n if (isThenable(rv)) {\n return rv.then(\n event => {\n if (!(isPlainObject(event) || event === null)) {\n throw new SentryError(nullErr);\n }\n return event;\n },\n e => {\n throw new SentryError(`beforeSend rejected with ${e}`);\n },\n );\n } else if (!(isPlainObject(rv) || rv === null)) {\n throw new SentryError(nullErr);\n }\n return rv;\n}\n","import {\n Envelope,\n EnvelopeItem,\n EventDropReason,\n InternalBaseTransportOptions,\n Transport,\n TransportRequestExecutor,\n} from '@sentry/types';\nimport {\n createEnvelope,\n envelopeItemTypeToDataCategory,\n forEachEnvelopeItem,\n isRateLimited,\n logger,\n makePromiseBuffer,\n PromiseBuffer,\n RateLimits,\n resolvedSyncPromise,\n SentryError,\n serializeEnvelope,\n updateRateLimits,\n} from '@sentry/utils';\n\nexport const DEFAULT_TRANSPORT_BUFFER_SIZE = 30;\n\n/**\n * Creates an instance of a Sentry `Transport`\n *\n * @param options\n * @param makeRequest\n */\nexport function createTransport(\n options: InternalBaseTransportOptions,\n makeRequest: TransportRequestExecutor,\n buffer: PromiseBuffer = makePromiseBuffer(options.bufferSize || DEFAULT_TRANSPORT_BUFFER_SIZE),\n): Transport {\n let rateLimits: RateLimits = {};\n\n const flush = (timeout?: number): PromiseLike => buffer.drain(timeout);\n\n function send(envelope: Envelope): PromiseLike {\n const filteredEnvelopeItems: EnvelopeItem[] = [];\n\n // Drop rate limited items from envelope\n forEachEnvelopeItem(envelope, (item, type) => {\n const envelopeItemDataCategory = envelopeItemTypeToDataCategory(type);\n if (isRateLimited(rateLimits, envelopeItemDataCategory)) {\n options.recordDroppedEvent('ratelimit_backoff', envelopeItemDataCategory);\n } else {\n filteredEnvelopeItems.push(item);\n }\n });\n\n // Skip sending if envelope is empty after filtering out rate limited events\n if (filteredEnvelopeItems.length === 0) {\n return resolvedSyncPromise();\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const filteredEnvelope: Envelope = createEnvelope(envelope[0], filteredEnvelopeItems as any);\n\n // Creates client report for each item in an envelope\n const recordEnvelopeLoss = (reason: EventDropReason): void => {\n forEachEnvelopeItem(filteredEnvelope, (_, type) => {\n options.recordDroppedEvent(reason, envelopeItemTypeToDataCategory(type));\n });\n };\n\n const requestTask = (): PromiseLike =>\n makeRequest({ body: serializeEnvelope(filteredEnvelope, options.textEncoder) }).then(\n response => {\n // We don't want to throw on NOK responses, but we want to at least log them\n if (response.statusCode !== undefined && (response.statusCode < 200 || response.statusCode >= 300)) {\n __DEBUG_BUILD__ && logger.warn(`Sentry responded with status code ${response.statusCode} to sent event.`);\n }\n\n rateLimits = updateRateLimits(rateLimits, response);\n },\n error => {\n __DEBUG_BUILD__ && logger.error('Failed while sending event:', error);\n recordEnvelopeLoss('network_error');\n },\n );\n\n return buffer.add(requestTask).then(\n result => result,\n error => {\n if (error instanceof SentryError) {\n __DEBUG_BUILD__ && logger.error('Skipped sending event due to full buffer');\n recordEnvelopeLoss('queue_overflow');\n return resolvedSyncPromise();\n } else {\n throw error;\n }\n },\n );\n }\n\n return {\n send,\n flush,\n };\n}\n","import { Integration, WrappedFunction } from '@sentry/types';\nimport { getOriginalFunction } from '@sentry/utils';\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 static id: string = 'FunctionToString';\n\n /**\n * @inheritDoc\n */\n public name: string = FunctionToString.id;\n\n /**\n * @inheritDoc\n */\n public setupOnce(): void {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n originalFunctionToString = Function.prototype.toString;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Function.prototype.toString = function (this: WrappedFunction, ...args: any[]): string {\n const context = getOriginalFunction(this) || this;\n return originalFunctionToString.apply(context, args);\n };\n }\n}\n","export const SDK_VERSION = '7.8.1';\n","import { Event, EventProcessor, Hub, Integration, StackFrame } 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/** Options for the InboundFilters integration */\nexport interface InboundFiltersOptions {\n allowUrls: Array;\n denyUrls: Array;\n ignoreErrors: Array;\n ignoreInternal: boolean;\n}\n\n/** Inbound filters configurable by the user */\nexport class InboundFilters implements Integration {\n /**\n * @inheritDoc\n */\n public static id: string = 'InboundFilters';\n\n /**\n * @inheritDoc\n */\n public name: string = InboundFilters.id;\n\n public constructor(private readonly _options: Partial = {}) {}\n\n /**\n * @inheritDoc\n */\n public setupOnce(addGlobalEventProcessor: (processor: EventProcessor) => void, getCurrentHub: () => Hub): void {\n const eventProcess: EventProcessor = (event: Event) => {\n const hub = getCurrentHub();\n if (hub) {\n const self = hub.getIntegration(InboundFilters);\n if (self) {\n const client = hub.getClient();\n const clientOptions = client ? client.getOptions() : {};\n const options = _mergeOptions(self._options, clientOptions);\n return _shouldDropEvent(event, options) ? null : event;\n }\n }\n return event;\n };\n\n eventProcess.id = this.name;\n addGlobalEventProcessor(eventProcess);\n }\n}\n\n/** JSDoc */\nexport function _mergeOptions(\n internalOptions: Partial = {},\n clientOptions: Partial = {},\n): Partial {\n return {\n allowUrls: [...(internalOptions.allowUrls || []), ...(clientOptions.allowUrls || [])],\n denyUrls: [...(internalOptions.denyUrls || []), ...(clientOptions.denyUrls || [])],\n ignoreErrors: [\n ...(internalOptions.ignoreErrors || []),\n ...(clientOptions.ignoreErrors || []),\n ...DEFAULT_IGNORE_ERRORS,\n ],\n ignoreInternal: internalOptions.ignoreInternal !== undefined ? internalOptions.ignoreInternal : true,\n };\n}\n\n/** JSDoc */\nexport function _shouldDropEvent(event: Event, options: Partial): boolean {\n if (options.ignoreInternal && _isSentryError(event)) {\n __DEBUG_BUILD__ &&\n logger.warn(`Event dropped due to being internal Sentry Error.\\nEvent: ${getEventDescription(event)}`);\n return true;\n }\n if (_isIgnoredError(event, options.ignoreErrors)) {\n __DEBUG_BUILD__ &&\n logger.warn(\n `Event dropped due to being matched by \\`ignoreErrors\\` option.\\nEvent: ${getEventDescription(event)}`,\n );\n return true;\n }\n if (_isDeniedUrl(event, options.denyUrls)) {\n __DEBUG_BUILD__ &&\n logger.warn(\n `Event dropped due to being matched by \\`denyUrls\\` option.\\nEvent: ${getEventDescription(\n event,\n )}.\\nUrl: ${_getEventFilterUrl(event)}`,\n );\n return true;\n }\n if (!_isAllowedUrl(event, options.allowUrls)) {\n __DEBUG_BUILD__ &&\n logger.warn(\n `Event dropped due to not being matched by \\`allowUrls\\` option.\\nEvent: ${getEventDescription(\n event,\n )}.\\nUrl: ${_getEventFilterUrl(event)}`,\n );\n return true;\n }\n return false;\n}\n\nfunction _isIgnoredError(event: Event, ignoreErrors?: Array): boolean {\n if (!ignoreErrors || !ignoreErrors.length) {\n return false;\n }\n\n return _getPossibleEventMessages(event).some(message =>\n ignoreErrors.some(pattern => isMatchingPattern(message, pattern)),\n );\n}\n\nfunction _isDeniedUrl(event: Event, denyUrls?: Array): boolean {\n // TODO: Use Glob instead?\n if (!denyUrls || !denyUrls.length) {\n return false;\n }\n const url = _getEventFilterUrl(event);\n return !url ? false : denyUrls.some(pattern => isMatchingPattern(url, pattern));\n}\n\nfunction _isAllowedUrl(event: Event, allowUrls?: Array): boolean {\n // TODO: Use Glob instead?\n if (!allowUrls || !allowUrls.length) {\n return true;\n }\n const url = _getEventFilterUrl(event);\n return !url ? true : allowUrls.some(pattern => isMatchingPattern(url, pattern));\n}\n\nfunction _getPossibleEventMessages(event: Event): string[] {\n if (event.message) {\n return [event.message];\n }\n if (event.exception) {\n try {\n const { type = '', value = '' } = (event.exception.values && event.exception.values[0]) || {};\n return [`${value}`, `${type}: ${value}`];\n } catch (oO) {\n __DEBUG_BUILD__ && logger.error(`Cannot extract message for event ${getEventDescription(event)}`);\n return [];\n }\n }\n return [];\n}\n\nfunction _isSentryError(event: Event): boolean {\n try {\n // @ts-ignore can't be a sentry error if undefined\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return event.exception.values[0].type === 'SentryError';\n } catch (e) {\n // ignore\n }\n return false;\n}\n\nfunction _getLastValidUrl(frames: StackFrame[] = []): string | null {\n for (let i = frames.length - 1; i >= 0; i--) {\n const frame = frames[i];\n\n if (frame && frame.filename !== '' && frame.filename !== '[native code]') {\n return frame.filename || null;\n }\n }\n\n return null;\n}\n\nfunction _getEventFilterUrl(event: Event): string | null {\n try {\n let frames;\n try {\n // @ts-ignore we only care about frames if the whole thing here is defined\n frames = event.exception.values[0].stacktrace.frames;\n } catch (e) {\n // ignore\n }\n return frames ? _getLastValidUrl(frames) : null;\n } catch (oO) {\n __DEBUG_BUILD__ && logger.error(`Cannot extract url for event ${getEventDescription(event)}`);\n return null;\n }\n}\n","import { Event, EventHint, Exception, Severity, SeverityLevel, StackFrame, StackParser } from '@sentry/types';\nimport {\n addExceptionMechanism,\n addExceptionTypeValue,\n extractExceptionKeysForMessage,\n isDOMError,\n isDOMException,\n isError,\n isErrorEvent,\n isEvent,\n isPlainObject,\n normalizeToSize,\n resolvedSyncPromise,\n} from '@sentry/utils';\n\n/**\n * This function creates an exception from a JavaScript Error\n */\nexport function exceptionFromError(stackParser: StackParser, ex: Error): Exception {\n // Get the frames first since Opera can lose the stack if we touch anything else first\n const frames = parseStackFrames(stackParser, ex);\n\n const exception: Exception = {\n type: ex && ex.name,\n value: extractMessage(ex),\n };\n\n if (frames.length) {\n exception.stacktrace = { frames };\n }\n\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(\n stackParser: StackParser,\n exception: Record,\n syntheticException?: Error,\n isUnhandledRejection?: boolean,\n): Event {\n const event: Event = {\n exception: {\n values: [\n {\n type: isEvent(exception) ? exception.constructor.name : isUnhandledRejection ? 'UnhandledRejection' : 'Error',\n value: `Non-Error ${\n isUnhandledRejection ? '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 frames = parseStackFrames(stackParser, syntheticException);\n if (frames.length) {\n // event.exception.values[0] has been set above\n (event.exception as { values: Exception[] }).values[0].stacktrace = { frames };\n }\n }\n\n return event;\n}\n\n/**\n * @hidden\n */\nexport function eventFromError(stackParser: StackParser, ex: Error): Event {\n return {\n exception: {\n values: [exceptionFromError(stackParser, ex)],\n },\n };\n}\n\n/** Parses stack frames from an error */\nexport function parseStackFrames(\n stackParser: StackParser,\n ex: Error & { framesToPop?: number; stacktrace?: string },\n): StackFrame[] {\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 || ex.stack || '';\n\n const popSize = getPopSize(ex);\n\n try {\n return stackParser(stacktrace, popSize);\n } catch (e) {\n // no-empty\n }\n\n return [];\n}\n\n// Based on our own mapping pattern - https://github.com/getsentry/sentry/blob/9f08305e09866c8bd6d0c24f5b0aabdd7dd6c59c/src/sentry/lang/javascript/errormapping.py#L83-L108\nconst reactMinifiedRegexp = /Minified React error #\\d+;/i;\n\nfunction getPopSize(ex: Error & { framesToPop?: number }): number {\n if (ex) {\n if (typeof ex.framesToPop === 'number') {\n return ex.framesToPop;\n }\n\n if (reactMinifiedRegexp.test(ex.message)) {\n return 1;\n }\n }\n\n return 0;\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: Error & { message: { error?: Error } }): 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\n/**\n * Creates an {@link Event} from all inputs to `captureException` and non-primitive inputs to `captureMessage`.\n * @hidden\n */\nexport function eventFromException(\n stackParser: StackParser,\n exception: unknown,\n hint?: EventHint,\n attachStacktrace?: boolean,\n): PromiseLike {\n const syntheticException = (hint && hint.syntheticException) || undefined;\n const event = eventFromUnknownInput(stackParser, exception, syntheticException, attachStacktrace);\n addExceptionMechanism(event); // defaults to { type: 'generic', handled: true }\n event.level = 'error';\n if (hint && hint.event_id) {\n event.event_id = hint.event_id;\n }\n return resolvedSyncPromise(event);\n}\n\n/**\n * Builds and Event from a Message\n * @hidden\n */\nexport function eventFromMessage(\n stackParser: StackParser,\n message: string,\n // eslint-disable-next-line deprecation/deprecation\n level: Severity | SeverityLevel = 'info',\n hint?: EventHint,\n attachStacktrace?: boolean,\n): PromiseLike {\n const syntheticException = (hint && hint.syntheticException) || undefined;\n const event = eventFromString(stackParser, message, syntheticException, attachStacktrace);\n event.level = level;\n if (hint && hint.event_id) {\n event.event_id = hint.event_id;\n }\n return resolvedSyncPromise(event);\n}\n\n/**\n * @hidden\n */\nexport function eventFromUnknownInput(\n stackParser: StackParser,\n exception: unknown,\n syntheticException?: Error,\n attachStacktrace?: boolean,\n isUnhandledRejection?: boolean,\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 return eventFromError(stackParser, errorEvent.error as Error);\n }\n\n // If it is a `DOMError` (which is a legacy API, but still supported in some browsers) then we just extract the name\n // and message, as it doesn't provide anything else. According to the spec, all `DOMExceptions` should also be\n // `Error`s, but that's not the case in IE11, so in that case we treat it the same as we do a `DOMError`.\n //\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMError\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMException\n // https://webidl.spec.whatwg.org/#es-DOMException-specialness\n if (isDOMError(exception as DOMError) || isDOMException(exception as DOMException)) {\n const domException = exception as DOMException;\n\n if ('stack' in (exception as Error)) {\n event = eventFromError(stackParser, exception as Error);\n } else {\n const name = domException.name || (isDOMError(domException) ? 'DOMError' : 'DOMException');\n const message = domException.message ? `${name}: ${domException.message}` : name;\n event = eventFromString(stackParser, message, syntheticException, attachStacktrace);\n addExceptionTypeValue(event, message);\n }\n if ('code' in domException) {\n event.tags = { ...event.tags, 'DOMException.code': `${domException.code}` };\n }\n\n return event;\n }\n if (isError(exception)) {\n // we have a real Error object, do nothing\n return eventFromError(stackParser, exception);\n }\n if (isPlainObject(exception) || isEvent(exception)) {\n // If it's a plain object or an instance of `Event` (the built-in JS kind, not this SDK's `Event` type), serialize\n // it manually. This will allow us to group events based on top-level keys which is much better than creating a new\n // group on any key/value change.\n const objectException = exception as Record;\n event = eventFromPlainObject(stackParser, objectException, syntheticException, isUnhandledRejection);\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(stackParser, exception as string, syntheticException, attachStacktrace);\n addExceptionTypeValue(event, `${exception}`, undefined);\n addExceptionMechanism(event, {\n synthetic: true,\n });\n\n return event;\n}\n\n/**\n * @hidden\n */\nexport function eventFromString(\n stackParser: StackParser,\n input: string,\n syntheticException?: Error,\n attachStacktrace?: boolean,\n): Event {\n const event: Event = {\n message: input,\n };\n\n if (attachStacktrace && syntheticException) {\n const frames = parseStackFrames(stackParser, syntheticException);\n if (frames.length) {\n event.exception = {\n values: [{ value: input, stacktrace: { frames } }],\n };\n }\n }\n\n return event;\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable max-lines */\nimport { getCurrentHub } from '@sentry/core';\nimport { Integration } from '@sentry/types';\nimport {\n addInstrumentationHandler,\n getGlobalObject,\n htmlTreeAsString,\n parseUrl,\n safeJoin,\n severityLevelFromString,\n} from '@sentry/utils';\n\n/** JSDoc */\ninterface BreadcrumbsOptions {\n console: boolean;\n dom: boolean | { serializeAttribute: string | string[] };\n fetch: boolean;\n history: boolean;\n sentry: boolean;\n xhr: boolean;\n}\n\nexport const BREADCRUMB_INTEGRATION_ID = 'Breadcrumbs';\n\n/**\n * Default Breadcrumbs instrumentations\n * TODO: Deprecated - with v6, this will be renamed to `Instrument`\n */\nexport class Breadcrumbs implements Integration {\n /**\n * @inheritDoc\n */\n public static id: string = BREADCRUMB_INTEGRATION_ID;\n\n /**\n * @inheritDoc\n */\n public name: string = Breadcrumbs.id;\n\n /**\n * Options of the breadcrumbs integration.\n */\n // This field is public, because we use it in the browser client to check if the `sentry` option is enabled.\n public readonly options: Readonly;\n\n /**\n * @inheritDoc\n */\n public constructor(options?: Partial) {\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 /**\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 addInstrumentationHandler('console', _consoleBreadcrumb);\n }\n if (this.options.dom) {\n addInstrumentationHandler('dom', _domBreadcrumb(this.options.dom));\n }\n if (this.options.xhr) {\n addInstrumentationHandler('xhr', _xhrBreadcrumb);\n }\n if (this.options.fetch) {\n addInstrumentationHandler('fetch', _fetchBreadcrumb);\n }\n if (this.options.history) {\n addInstrumentationHandler('history', _historyBreadcrumb);\n }\n }\n}\n\n/**\n * A HOC that creaes a function that creates breadcrumbs from DOM API calls.\n * This is a HOC so that we get access to dom options in the closure.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _domBreadcrumb(dom: BreadcrumbsOptions['dom']): (handlerData: { [key: string]: any }) => void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function _innerDomBreadcrumb(handlerData: { [key: string]: any }): void {\n let target;\n let keyAttrs = typeof dom === 'object' ? dom.serializeAttribute : undefined;\n\n if (typeof keyAttrs === 'string') {\n keyAttrs = [keyAttrs];\n }\n\n // Accessing event.target can throw (see getsentry/raven-js#838, #768)\n try {\n target = handlerData.event.target\n ? htmlTreeAsString(handlerData.event.target as Node, keyAttrs)\n : htmlTreeAsString(handlerData.event as unknown as Node, keyAttrs);\n } catch (e) {\n target = '';\n }\n\n if (target.length === 0) {\n return;\n }\n\n getCurrentHub().addBreadcrumb(\n {\n category: `ui.${handlerData.name}`,\n message: target,\n },\n {\n event: handlerData.event,\n name: handlerData.name,\n global: handlerData.global,\n },\n );\n }\n\n return _innerDomBreadcrumb;\n}\n\n/**\n * Creates breadcrumbs from console API calls\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _consoleBreadcrumb(handlerData: { [key: string]: any }): void {\n const breadcrumb = {\n category: 'console',\n data: {\n arguments: handlerData.args,\n logger: 'console',\n },\n level: severityLevelFromString(handlerData.level),\n message: safeJoin(handlerData.args, ' '),\n };\n\n if (handlerData.level === 'assert') {\n if (handlerData.args[0] === false) {\n breadcrumb.message = `Assertion failed: ${safeJoin(handlerData.args.slice(1), ' ') || 'console.assert'}`;\n breadcrumb.data.arguments = handlerData.args.slice(1);\n } else {\n // Don't capture a breadcrumb for passed assertions\n return;\n }\n }\n\n getCurrentHub().addBreadcrumb(breadcrumb, {\n input: handlerData.args,\n level: handlerData.level,\n });\n}\n\n/**\n * Creates breadcrumbs from XHR API calls\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _xhrBreadcrumb(handlerData: { [key: string]: any }): void {\n if (handlerData.endTimestamp) {\n // We only capture complete, non-sentry requests\n if (handlerData.xhr.__sentry_own_request__) {\n return;\n }\n\n const { method, url, status_code, body } = handlerData.xhr.__sentry_xhr__ || {};\n\n getCurrentHub().addBreadcrumb(\n {\n category: 'xhr',\n data: {\n method,\n url,\n status_code,\n },\n type: 'http',\n },\n {\n xhr: handlerData.xhr,\n input: body,\n },\n );\n\n return;\n }\n}\n\n/**\n * Creates breadcrumbs from fetch API calls\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _fetchBreadcrumb(handlerData: { [key: string]: any }): void {\n // We only capture complete fetch requests\n if (!handlerData.endTimestamp) {\n return;\n }\n\n if (handlerData.fetchData.url.match(/sentry_key/) && handlerData.fetchData.method === 'POST') {\n // We will not create breadcrumbs for fetch requests that contain `sentry_key` (internal sentry requests)\n return;\n }\n\n if (handlerData.error) {\n getCurrentHub().addBreadcrumb(\n {\n category: 'fetch',\n data: handlerData.fetchData,\n level: 'error',\n type: 'http',\n },\n {\n data: handlerData.error,\n input: handlerData.args,\n },\n );\n } else {\n getCurrentHub().addBreadcrumb(\n {\n category: 'fetch',\n data: {\n ...handlerData.fetchData,\n status_code: handlerData.response.status,\n },\n type: 'http',\n },\n {\n input: handlerData.args,\n response: handlerData.response,\n },\n );\n }\n}\n\n/**\n * Creates breadcrumbs from history API calls\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _historyBreadcrumb(handlerData: { [key: string]: any }): void {\n const global = getGlobalObject();\n let from = handlerData.from;\n let to = handlerData.to;\n const parsedLoc = parseUrl(global.location.href);\n let parsedFrom = parseUrl(from);\n const parsedTo = parseUrl(to);\n\n // Initial pushState doesn't provide `from` information\n if (!parsedFrom.path) {\n parsedFrom = parsedLoc;\n }\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 to = parsedTo.relative;\n }\n if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host) {\n from = parsedFrom.relative;\n }\n\n getCurrentHub().addBreadcrumb({\n category: 'navigation',\n data: {\n from,\n to,\n },\n });\n}\n","import { getGlobalObject, isNativeFetch, logger, supportsFetch } from '@sentry/utils';\n\nconst global = getGlobalObject();\nlet cachedFetchImpl: FetchImpl;\n\nexport type FetchImpl = typeof fetch;\n\n/**\n * A special usecase for incorrectly wrapped Fetch APIs in conjunction with ad-blockers.\n * Whenever someone wraps the Fetch API and returns the wrong promise chain,\n * this chain becomes orphaned and there is no possible way to capture it's rejections\n * other than allowing it bubble up to this very handler. eg.\n *\n * const f = window.fetch;\n * window.fetch = function () {\n * const p = f.apply(this, arguments);\n *\n * p.then(function() {\n * console.log('hi.');\n * });\n *\n * return p;\n * }\n *\n * `p.then(function () { ... })` is producing a completely separate promise chain,\n * however, what's returned is `p` - the result of original `fetch` call.\n *\n * This mean, that whenever we use the Fetch API to send our own requests, _and_\n * some ad-blocker blocks it, this orphaned chain will _always_ reject,\n * effectively causing another event to be captured.\n * This makes a whole process become an infinite loop, which we need to somehow\n * deal with, and break it in one way or another.\n *\n * To deal with this issue, we are making sure that we _always_ use the real\n * browser Fetch API, instead of relying on what `window.fetch` exposes.\n * The only downside to this would be missing our own requests as breadcrumbs,\n * but because we are already not doing this, it should be just fine.\n *\n * Possible failed fetch error messages per-browser:\n *\n * Chrome: Failed to fetch\n * Edge: Failed to Fetch\n * Firefox: NetworkError when attempting to fetch resource\n * Safari: resource blocked by content blocker\n */\nexport function getNativeFetchImplementation(): FetchImpl {\n if (cachedFetchImpl) {\n return cachedFetchImpl;\n }\n\n /* eslint-disable @typescript-eslint/unbound-method */\n\n // Fast path to avoid DOM I/O\n if (isNativeFetch(global.fetch)) {\n return (cachedFetchImpl = global.fetch.bind(global));\n }\n\n const document = global.document;\n let fetchImpl = global.fetch;\n // eslint-disable-next-line deprecation/deprecation\n if (document && typeof document.createElement === 'function') {\n try {\n const sandbox = document.createElement('iframe');\n sandbox.hidden = true;\n document.head.appendChild(sandbox);\n const contentWindow = sandbox.contentWindow;\n if (contentWindow && contentWindow.fetch) {\n fetchImpl = contentWindow.fetch;\n }\n document.head.removeChild(sandbox);\n } catch (e) {\n __DEBUG_BUILD__ &&\n logger.warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', e);\n }\n }\n\n return (cachedFetchImpl = fetchImpl.bind(global));\n /* eslint-enable @typescript-eslint/unbound-method */\n}\n\n/**\n * Sends sdk client report using sendBeacon or fetch as a fallback if available\n *\n * @param url report endpoint\n * @param body report payload\n */\nexport function sendReport(url: string, body: string | Uint8Array): void {\n const isRealNavigator = Object.prototype.toString.call(global && global.navigator) === '[object Navigator]';\n const hasSendBeacon = isRealNavigator && typeof global.navigator.sendBeacon === 'function';\n\n if (hasSendBeacon) {\n // Prevent illegal invocations - https://xgwang.me/posts/you-may-not-know-beacon/#it-may-throw-error%2C-be-sure-to-catch\n const sendBeacon = global.navigator.sendBeacon.bind(global.navigator);\n sendBeacon(url, body);\n } else if (supportsFetch()) {\n const fetch = getNativeFetchImplementation();\n fetch(url, {\n body,\n method: 'POST',\n credentials: 'omit',\n keepalive: true,\n }).then(null, error => {\n __DEBUG_BUILD__ && logger.error(error);\n });\n }\n}\n","import { BaseClient, getCurrentHub, getEnvelopeEndpointWithUrlEncodedAuth, Scope, SDK_VERSION } from '@sentry/core';\nimport { ClientOptions, Event, EventHint, Options, Severity, SeverityLevel } from '@sentry/types';\nimport {\n createClientReportEnvelope,\n dsnToString,\n getEventDescription,\n getGlobalObject,\n logger,\n serializeEnvelope,\n} from '@sentry/utils';\n\nimport { eventFromException, eventFromMessage } from './eventbuilder';\nimport { Breadcrumbs } from './integrations';\nimport { BREADCRUMB_INTEGRATION_ID } from './integrations/breadcrumbs';\nimport { BrowserTransportOptions } from './transports/types';\nimport { sendReport } from './transports/utils';\n\nconst globalObject = getGlobalObject();\n\nexport interface BaseBrowserOptions {\n /**\n * A pattern for error URLs which should exclusively be sent to Sentry.\n * This is the opposite of {@link Options.denyUrls}.\n * By default, all errors will be sent.\n */\n allowUrls?: Array;\n\n /**\n * A pattern for error URLs which should not be sent to Sentry.\n * To allow certain errors instead, use {@link Options.allowUrls}.\n * By default, all errors will be sent.\n */\n denyUrls?: Array;\n}\n\n/**\n * Configuration options for the Sentry Browser SDK.\n * @see @sentry/types Options for more information.\n */\nexport interface BrowserOptions extends Options, BaseBrowserOptions {}\n\n/**\n * Configuration options for the Sentry Browser SDK Client class\n * @see BrowserClient for more information.\n */\nexport interface BrowserClientOptions extends ClientOptions, BaseBrowserOptions {}\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: BrowserClientOptions) {\n options._metadata = options._metadata || {};\n options._metadata.sdk = options._metadata.sdk || {\n name: 'sentry.javascript.browser',\n packages: [\n {\n name: 'npm:@sentry/browser',\n version: SDK_VERSION,\n },\n ],\n version: SDK_VERSION,\n };\n\n super(options);\n\n if (options.sendClientReports && globalObject.document) {\n globalObject.document.addEventListener('visibilitychange', () => {\n if (globalObject.document.visibilityState === 'hidden') {\n this._flushOutcomes();\n }\n });\n }\n }\n\n /**\n * @inheritDoc\n */\n public eventFromException(exception: unknown, hint?: EventHint): PromiseLike {\n return eventFromException(this._options.stackParser, exception, hint, this._options.attachStacktrace);\n }\n\n /**\n * @inheritDoc\n */\n public eventFromMessage(\n message: string,\n // eslint-disable-next-line deprecation/deprecation\n level: Severity | SeverityLevel = 'info',\n hint?: EventHint,\n ): PromiseLike {\n return eventFromMessage(this._options.stackParser, message, level, hint, this._options.attachStacktrace);\n }\n\n /**\n * @inheritDoc\n */\n public sendEvent(event: Event, hint?: EventHint): void {\n // We only want to add the sentry event breadcrumb when the user has the breadcrumb integration installed and\n // activated its `sentry` option.\n // We also do not want to use the `Breadcrumbs` class here directly, because we do not want it to be included in\n // bundles, if it is not used by the SDK.\n // This all sadly is a bit ugly, but we currently don't have a \"pre-send\" hook on the integrations so we do it this\n // way for now.\n const breadcrumbIntegration = this.getIntegrationById(BREADCRUMB_INTEGRATION_ID) as Breadcrumbs | null;\n if (\n breadcrumbIntegration &&\n // We check for definedness of `options`, even though it is not strictly necessary, because that access to\n // `.sentry` below does not throw, in case users provided their own integration with id \"Breadcrumbs\" that does\n // not have an`options` field\n breadcrumbIntegration.options &&\n breadcrumbIntegration.options.sentry\n ) {\n getCurrentHub().addBreadcrumb(\n {\n category: `sentry.${event.type === 'transaction' ? 'transaction' : 'event'}`,\n event_id: event.event_id,\n level: event.level,\n message: getEventDescription(event),\n },\n {\n event,\n },\n );\n }\n\n super.sendEvent(event, hint);\n }\n\n /**\n * @inheritDoc\n */\n protected _prepareEvent(event: Event, hint: EventHint, scope?: Scope): PromiseLike {\n event.platform = event.platform || 'javascript';\n return super._prepareEvent(event, hint, scope);\n }\n\n /**\n * Sends client reports as an envelope.\n */\n private _flushOutcomes(): void {\n const outcomes = this._clearOutcomes();\n\n if (outcomes.length === 0) {\n __DEBUG_BUILD__ && logger.log('No outcomes to send');\n return;\n }\n\n if (!this._dsn) {\n __DEBUG_BUILD__ && logger.log('No dsn provided, will not send outcomes');\n return;\n }\n\n __DEBUG_BUILD__ && logger.log('Sending outcomes:', outcomes);\n\n const url = getEnvelopeEndpointWithUrlEncodedAuth(this._dsn, this._options);\n const envelope = createClientReportEnvelope(outcomes, this._options.tunnel && dsnToString(this._dsn));\n\n try {\n sendReport(url, serializeEnvelope(envelope));\n } catch (e) {\n __DEBUG_BUILD__ && logger.error(e);\n }\n }\n}\n","import { ClientReport, ClientReportEnvelope, ClientReportItem } from '@sentry/types';\n\nimport { createEnvelope } from './envelope';\nimport { dateTimestampInSeconds } from './time';\n\n/**\n * Creates client report envelope\n * @param discarded_events An array of discard events\n * @param dsn A DSN that can be set on the header. Optional.\n */\nexport function createClientReportEnvelope(\n discarded_events: ClientReport['discarded_events'],\n dsn?: string,\n timestamp?: number,\n): ClientReportEnvelope {\n const clientReportItem: ClientReportItem = [\n { type: 'client_report' },\n {\n timestamp: timestamp || dateTimestampInSeconds(),\n discarded_events,\n },\n ];\n return createEnvelope(dsn ? { dsn } : {}, [clientReportItem]);\n}\n","import { createTransport } from '@sentry/core';\nimport { Transport, TransportMakeRequestResponse, TransportRequest } from '@sentry/types';\n\nimport { BrowserTransportOptions } from './types';\nimport { FetchImpl, getNativeFetchImplementation } from './utils';\n\n/**\n * Creates a Transport that uses the Fetch API to send events to Sentry.\n */\nexport function makeFetchTransport(\n options: BrowserTransportOptions,\n nativeFetch: FetchImpl = getNativeFetchImplementation(),\n): Transport {\n function makeRequest(request: TransportRequest): PromiseLike {\n const requestOptions: RequestInit = {\n body: request.body,\n method: 'POST',\n referrerPolicy: 'origin',\n headers: options.headers,\n ...options.fetchOptions,\n };\n\n return nativeFetch(options.url, requestOptions).then(response => ({\n statusCode: response.status,\n headers: {\n 'x-sentry-rate-limits': response.headers.get('X-Sentry-Rate-Limits'),\n 'retry-after': response.headers.get('Retry-After'),\n },\n }));\n }\n\n return createTransport(options, makeRequest);\n}\n","import { createTransport } from '@sentry/core';\nimport { Transport, TransportMakeRequestResponse, TransportRequest } from '@sentry/types';\nimport { SyncPromise } from '@sentry/utils';\n\nimport { BrowserTransportOptions } from './types';\n\n/**\n * The DONE ready state for XmlHttpRequest\n *\n * Defining it here as a constant b/c XMLHttpRequest.DONE is not always defined\n * (e.g. during testing, it is `undefined`)\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/readyState}\n */\nconst XHR_READYSTATE_DONE = 4;\n\n/**\n * Creates a Transport that uses the XMLHttpRequest API to send events to Sentry.\n */\nexport function makeXHRTransport(options: BrowserTransportOptions): Transport {\n function makeRequest(request: TransportRequest): PromiseLike {\n return new SyncPromise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n\n xhr.onerror = reject;\n\n xhr.onreadystatechange = (): void => {\n if (xhr.readyState === XHR_READYSTATE_DONE) {\n resolve({\n statusCode: xhr.status,\n headers: {\n 'x-sentry-rate-limits': xhr.getResponseHeader('X-Sentry-Rate-Limits'),\n 'retry-after': xhr.getResponseHeader('Retry-After'),\n },\n });\n }\n };\n\n xhr.open('POST', options.url);\n\n for (const header in options.headers) {\n if (Object.prototype.hasOwnProperty.call(options.headers, header)) {\n xhr.setRequestHeader(header, options.headers[header]);\n }\n }\n\n xhr.send(request.body);\n });\n }\n\n return createTransport(options, makeRequest);\n}\n","import { StackFrame, StackLineParser, StackLineParserFn } from '@sentry/types';\nimport { createStackParser } from '@sentry/utils';\n\n// global reference to slice\nconst UNKNOWN_FUNCTION = '?';\n\nconst OPERA10_PRIORITY = 10;\nconst OPERA11_PRIORITY = 20;\nconst CHROME_PRIORITY = 30;\nconst WINJS_PRIORITY = 40;\nconst GECKO_PRIORITY = 50;\n\nfunction createFrame(filename: string, func: string, lineno?: number, colno?: number): StackFrame {\n const frame: StackFrame = {\n filename,\n function: func,\n // All browser frames are considered in_app\n in_app: true,\n };\n\n if (lineno !== undefined) {\n frame.lineno = lineno;\n }\n\n if (colno !== undefined) {\n frame.colno = colno;\n }\n\n return frame;\n}\n\n// Chromium based browsers: Chrome, Brave, new Opera, new Edge\nconst chromeRegex =\n /^\\s*at (?:(.*?) ?\\((?:address at )?)?((?:file|https?|blob|chrome-extension|address|native|eval|webpack||[-a-z]+:|.*bundle|\\/).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i;\nconst chromeEvalRegex = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/;\n\nconst chrome: StackLineParserFn = line => {\n const parts = chromeRegex.exec(line);\n\n if (parts) {\n const isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line\n\n if (isEval) {\n const subMatch = chromeEvalRegex.exec(parts[2]);\n\n if (subMatch) {\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 }\n\n // Kamil: One more hack won't hurt us right? Understanding and adding more rules on top of these regexps right now\n // would be way too time consuming. (TODO: Rewrite whole RegExp to be more readable)\n const [func, filename] = extractSafariExtensionDetails(parts[1] || UNKNOWN_FUNCTION, parts[2]);\n\n return createFrame(filename, func, parts[3] ? +parts[3] : undefined, parts[4] ? +parts[4] : undefined);\n }\n\n return;\n};\n\nexport const chromeStackLineParser: StackLineParser = [CHROME_PRIORITY, chrome];\n\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 geckoREgex =\n /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)?((?:file|https?|blob|chrome|webpack|resource|moz-extension|capacitor).*?:\\/.*?|\\[native code\\]|[^@]*(?:bundle|\\d+\\.js)|\\/[\\w\\-. /=]+)(?::(\\d+))?(?::(\\d+))?\\s*$/i;\nconst geckoEvalRegex = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i;\n\nconst gecko: StackLineParserFn = line => {\n const parts = geckoREgex.exec(line);\n\n if (parts) {\n const isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n if (isEval) {\n const subMatch = geckoEvalRegex.exec(parts[3]);\n\n if (subMatch) {\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 }\n }\n\n let filename = parts[3];\n let func = parts[1] || UNKNOWN_FUNCTION;\n [func, filename] = extractSafariExtensionDetails(func, filename);\n\n return createFrame(filename, func, parts[4] ? +parts[4] : undefined, parts[5] ? +parts[5] : undefined);\n }\n\n return;\n};\n\nexport const geckoStackLineParser: StackLineParser = [GECKO_PRIORITY, gecko];\n\nconst winjsRegex =\n /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\n\nconst winjs: StackLineParserFn = line => {\n const parts = winjsRegex.exec(line);\n\n return parts\n ? createFrame(parts[2], parts[1] || UNKNOWN_FUNCTION, +parts[3], parts[4] ? +parts[4] : undefined)\n : undefined;\n};\n\nexport const winjsStackLineParser: StackLineParser = [WINJS_PRIORITY, winjs];\n\nconst opera10Regex = / line (\\d+).*script (?:in )?(\\S+)(?:: in function (\\S+))?$/i;\n\nconst opera10: StackLineParserFn = line => {\n const parts = opera10Regex.exec(line);\n return parts ? createFrame(parts[2], parts[3] || UNKNOWN_FUNCTION, +parts[1]) : undefined;\n};\n\nexport const opera10StackLineParser: StackLineParser = [OPERA10_PRIORITY, opera10];\n\nconst opera11Regex =\n / line (\\d+), column (\\d+)\\s*(?:in (?:]+)>|([^)]+))\\(.*\\))? in (.*):\\s*$/i;\n\nconst opera11: StackLineParserFn = line => {\n const parts = opera11Regex.exec(line);\n return parts ? createFrame(parts[5], parts[3] || parts[4] || UNKNOWN_FUNCTION, +parts[1], +parts[2]) : undefined;\n};\n\nexport const opera11StackLineParser: StackLineParser = [OPERA11_PRIORITY, opera11];\n\nexport const defaultStackLineParsers = [chromeStackLineParser, geckoStackLineParser, winjsStackLineParser];\n\nexport const defaultStackParser = createStackParser(...defaultStackLineParsers);\n\n/**\n * Safari web extensions, starting version unknown, can produce \"frames-only\" stacktraces.\n * What it means, is that instead of format like:\n *\n * Error: wat\n * at function@url:row:col\n * at function@url:row:col\n * at function@url:row:col\n *\n * it produces something like:\n *\n * function@url:row:col\n * function@url:row:col\n * function@url:row:col\n *\n * Because of that, it won't be captured by `chrome` RegExp and will fall into `Gecko` branch.\n * This function is extracted so that we can use it in both places without duplicating the logic.\n * Unfortunately \"just\" changing RegExp is too complicated now and making it pass all tests\n * and fix this case seems like an impossible, or at least way too time-consuming task.\n */\nconst extractSafariExtensionDetails = (func: string, filename: string): [string, string] => {\n const isSafariExtension = func.indexOf('safari-extension') !== -1;\n const isSafariWebExtension = func.indexOf('safari-web-extension') !== -1;\n\n return isSafariExtension || isSafariWebExtension\n ? [\n func.indexOf('@') !== -1 ? func.split('@')[0] : UNKNOWN_FUNCTION,\n isSafariExtension ? `safari-extension:${filename}` : `safari-web-extension:${filename}`,\n ]\n : [func, filename];\n};\n","import { captureException, withScope } from '@sentry/core';\nimport { DsnLike, Event as SentryEvent, Mechanism, Scope, WrappedFunction } from '@sentry/types';\nimport {\n addExceptionMechanism,\n addExceptionTypeValue,\n addNonEnumerableProperty,\n getOriginalFunction,\n markFunctionWrapped,\n} from '@sentry/utils';\n\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. It is generally safe to pass an unbound function, because the returned wrapper always\n * has a correct `this` context.\n * @returns The wrapped function.\n * @hidden\n */\nexport function wrap(\n fn: WrappedFunction,\n options: {\n mechanism?: Mechanism;\n } = {},\n before?: WrappedFunction,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): any {\n // for future readers what this does is wrap a function and then create\n // a bi-directional wrapping between them.\n //\n // example: wrapped = wrap(original);\n // original.__sentry_wrapped__ -> wrapped\n // wrapped.__sentry_original__ -> original\n\n if (typeof fn !== 'function') {\n return fn;\n }\n\n try {\n // if we're dealing with a function that was previously wrapped, return\n // the original wrapper.\n const wrapper = fn.__sentry_wrapped__;\n if (wrapper) {\n return wrapper;\n }\n\n // We don't wanna wrap it twice\n if (getOriginalFunction(fn)) {\n return fn;\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 /* eslint-disable prefer-rest-params */\n // It is important that `sentryWrapped` is not an arrow function to preserve the context of `this`\n const sentryWrapped: WrappedFunction = function (this: unknown): void {\n const args = Array.prototype.slice.call(arguments);\n\n try {\n if (before && typeof before === 'function') {\n before.apply(this, arguments);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n const wrappedArguments = args.map((arg: any) => wrap(arg, options));\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 } catch (ex) {\n ignoreNextOnError();\n\n withScope((scope: Scope) => {\n scope.addEventProcessor((event: SentryEvent) => {\n if (options.mechanism) {\n addExceptionTypeValue(event, undefined, undefined);\n addExceptionMechanism(event, options.mechanism);\n }\n\n event.extra = {\n ...event.extra,\n arguments: args,\n };\n\n return event;\n });\n\n captureException(ex);\n });\n\n throw ex;\n }\n };\n /* eslint-enable prefer-rest-params */\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) {} // eslint-disable-line no-empty\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 markFunctionWrapped(sentryWrapped, fn);\n\n addNonEnumerableProperty(fn, '__sentry_wrapped__', sentryWrapped);\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 // eslint-disable-next-line no-empty\n } catch (_oO) {}\n\n return sentryWrapped;\n}\n\n/**\n * All properties the report dialog supports\n */\nexport interface ReportDialogOptions {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\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","/* eslint-disable @typescript-eslint/no-unsafe-member-access */\nimport { getCurrentHub } from '@sentry/core';\nimport { Event, EventHint, Hub, Integration, Primitive, StackParser } from '@sentry/types';\nimport {\n addExceptionMechanism,\n addInstrumentationHandler,\n getLocationHref,\n isErrorEvent,\n isPrimitive,\n isString,\n logger,\n} from '@sentry/utils';\n\nimport { BrowserClient } from '../client';\nimport { eventFromUnknownInput } from '../eventbuilder';\nimport { shouldIgnoreOnError } from '../helpers';\n\ntype GlobalHandlersIntegrationsOptionKeys = 'onerror' | 'onunhandledrejection';\n\n/** JSDoc */\ntype GlobalHandlersIntegrations = Record;\n\n/** Global handlers */\nexport class GlobalHandlers implements Integration {\n /**\n * @inheritDoc\n */\n public static id: string = 'GlobalHandlers';\n\n /**\n * @inheritDoc\n */\n public name: string = GlobalHandlers.id;\n\n /** JSDoc */\n private readonly _options: GlobalHandlersIntegrations;\n\n /**\n * Stores references functions to installing handlers. Will set to undefined\n * after they have been run so that they are not used twice.\n */\n private _installFunc: Record void) | undefined> = {\n onerror: _installGlobalOnErrorHandler,\n onunhandledrejection: _installGlobalOnUnhandledRejectionHandler,\n };\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 const options = this._options;\n\n // We can disable guard-for-in as we construct the options object above + do checks against\n // `this._installFunc` for the property.\n // eslint-disable-next-line guard-for-in\n for (const key in options) {\n const installFunc = this._installFunc[key as GlobalHandlersIntegrationsOptionKeys];\n if (installFunc && options[key as GlobalHandlersIntegrationsOptionKeys]) {\n globalHandlerLog(key);\n installFunc();\n this._installFunc[key as GlobalHandlersIntegrationsOptionKeys] = undefined;\n }\n }\n }\n}\n\n/** JSDoc */\nfunction _installGlobalOnErrorHandler(): void {\n addInstrumentationHandler(\n 'error',\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (data: { msg: any; url: any; line: any; column: any; error: any }) => {\n const [hub, stackParser, attachStacktrace] = getHubAndOptions();\n if (!hub.getIntegration(GlobalHandlers)) {\n return;\n }\n const { msg, url, line, column, error } = data;\n if (shouldIgnoreOnError() || (error && error.__sentry_own_request__)) {\n return;\n }\n\n const event =\n error === undefined && isString(msg)\n ? _eventFromIncompleteOnError(msg, url, line, column)\n : _enhanceEventWithInitialFrame(\n eventFromUnknownInput(stackParser, error || msg, undefined, attachStacktrace, false),\n url,\n line,\n column,\n );\n\n event.level = 'error';\n\n addMechanismAndCapture(hub, error, event, 'onerror');\n },\n );\n}\n\n/** JSDoc */\nfunction _installGlobalOnUnhandledRejectionHandler(): void {\n addInstrumentationHandler(\n 'unhandledrejection',\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (e: any) => {\n const [hub, stackParser, attachStacktrace] = getHubAndOptions();\n if (!hub.getIntegration(GlobalHandlers)) {\n return;\n }\n let error = e;\n\n // dig the object of the rejection out of known event types\n try {\n // PromiseRejectionEvents store the object of the rejection under 'reason'\n // see https://developer.mozilla.org/en-US/docs/Web/API/PromiseRejectionEvent\n if ('reason' in e) {\n error = e.reason;\n }\n // something, somewhere, (likely a browser extension) effectively casts PromiseRejectionEvents\n // to CustomEvents, moving the `promise` and `reason` attributes of the PRE into\n // the CustomEvent's `detail` attribute, since they're not part of CustomEvent's spec\n // see https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent and\n // https://github.com/getsentry/sentry-javascript/issues/2380\n else if ('detail' in e && 'reason' in e.detail) {\n error = e.detail.reason;\n }\n } catch (_oO) {\n // no-empty\n }\n\n if (shouldIgnoreOnError() || (error && error.__sentry_own_request__)) {\n return true;\n }\n\n const event = isPrimitive(error)\n ? _eventFromRejectionWithPrimitive(error)\n : eventFromUnknownInput(stackParser, error, undefined, attachStacktrace, true);\n\n event.level = 'error';\n\n addMechanismAndCapture(hub, error, event, 'onunhandledrejection');\n return;\n },\n );\n}\n\n/**\n * Create an event from a promise rejection where the `reason` is a primitive.\n *\n * @param reason: The `reason` property of the promise rejection\n * @returns An Event object with an appropriate `exception` value\n */\nfunction _eventFromRejectionWithPrimitive(reason: Primitive): Event {\n return {\n exception: {\n values: [\n {\n type: 'UnhandledRejection',\n // String() is needed because the Primitive type includes symbols (which can't be automatically stringified)\n value: `Non-Error promise rejection captured with value: ${String(reason)}`,\n },\n ],\n },\n };\n}\n\n/**\n * This function creates a stack from an old, error-less onerror handler.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _eventFromIncompleteOnError(msg: any, url: any, line: any, column: any): Event {\n const ERROR_TYPES_RE =\n /^(?:[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 = 'Error';\n\n const groups = message.match(ERROR_TYPES_RE);\n if (groups) {\n name = groups[1];\n message = groups[2];\n }\n\n const event = {\n exception: {\n values: [\n {\n type: name,\n value: message,\n },\n ],\n },\n };\n\n return _enhanceEventWithInitialFrame(event, url, line, column);\n}\n\n/** JSDoc */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _enhanceEventWithInitialFrame(event: Event, url: any, line: any, column: any): Event {\n // event.exception\n const e = (event.exception = event.exception || {});\n // event.exception.values\n const ev = (e.values = e.values || []);\n // event.exception.values[0]\n const ev0 = (ev[0] = ev[0] || {});\n // event.exception.values[0].stacktrace\n const ev0s = (ev0.stacktrace = ev0.stacktrace || {});\n // event.exception.values[0].stacktrace.frames\n const ev0sf = (ev0s.frames = ev0s.frames || []);\n\n const colno = isNaN(parseInt(column, 10)) ? undefined : column;\n const lineno = isNaN(parseInt(line, 10)) ? undefined : line;\n const filename = isString(url) && url.length > 0 ? url : getLocationHref();\n\n // event.exception.values[0].stacktrace.frames\n if (ev0sf.length === 0) {\n ev0sf.push({\n colno,\n filename,\n function: '?',\n in_app: true,\n lineno,\n });\n }\n\n return event;\n}\n\nfunction globalHandlerLog(type: string): void {\n __DEBUG_BUILD__ && logger.log(`Global Handler attached: ${type}`);\n}\n\nfunction addMechanismAndCapture(hub: Hub, error: EventHint['originalException'], event: Event, type: string): void {\n addExceptionMechanism(event, {\n handled: false,\n type,\n });\n hub.captureEvent(event, {\n originalException: error,\n });\n}\n\nfunction getHubAndOptions(): [Hub, StackParser, boolean | undefined] {\n const hub = getCurrentHub();\n const client = hub.getClient();\n const options = (client && client.getOptions()) || {\n stackParser: () => [],\n attachStacktrace: false,\n };\n return [hub, options.stackParser, options.attachStacktrace];\n}\n","import { Integration, WrappedFunction } from '@sentry/types';\nimport { fill, getFunctionName, getGlobalObject, getOriginalFunction } from '@sentry/utils';\n\nimport { wrap } from '../helpers';\n\nconst DEFAULT_EVENT_TARGET = [\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];\n\ntype XMLHttpRequestProp = 'onload' | 'onerror' | 'onprogress' | 'onreadystatechange';\n\n/** JSDoc */\ninterface TryCatchOptions {\n setTimeout: boolean;\n setInterval: boolean;\n requestAnimationFrame: boolean;\n XMLHttpRequest: boolean;\n eventTarget: boolean | string[];\n}\n\n/** Wrap timer functions and event targets to catch errors and provide better meta data */\nexport class TryCatch implements Integration {\n /**\n * @inheritDoc\n */\n public static id: string = 'TryCatch';\n\n /**\n * @inheritDoc\n */\n public name: string = TryCatch.id;\n\n /** JSDoc */\n private readonly _options: TryCatchOptions;\n\n /**\n * @inheritDoc\n */\n public constructor(options?: Partial) {\n this._options = {\n XMLHttpRequest: true,\n eventTarget: true,\n requestAnimationFrame: true,\n setInterval: true,\n setTimeout: true,\n ...options,\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 const global = getGlobalObject();\n\n if (this._options.setTimeout) {\n fill(global, 'setTimeout', _wrapTimeFunction);\n }\n\n if (this._options.setInterval) {\n fill(global, 'setInterval', _wrapTimeFunction);\n }\n\n if (this._options.requestAnimationFrame) {\n fill(global, 'requestAnimationFrame', _wrapRAF);\n }\n\n if (this._options.XMLHttpRequest && 'XMLHttpRequest' in global) {\n fill(XMLHttpRequest.prototype, 'send', _wrapXHR);\n }\n\n const eventTargetOption = this._options.eventTarget;\n if (eventTargetOption) {\n const eventTarget = Array.isArray(eventTargetOption) ? eventTargetOption : DEFAULT_EVENT_TARGET;\n eventTarget.forEach(_wrapEventTarget);\n }\n }\n}\n\n/** JSDoc */\nfunction _wrapTimeFunction(original: () => void): () => number {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\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// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _wrapRAF(original: any): (callback: () => void) => any {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return function (this: any, callback: () => void): () => void {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return original.apply(this, [\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 */\nfunction _wrapXHR(originalSend: () => void): () => void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return function (this: XMLHttpRequest, ...args: any[]): void {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const xhr = this;\n const xmlHttpRequestProps: XMLHttpRequestProp[] = ['onload', 'onerror', 'onprogress', 'onreadystatechange'];\n\n xmlHttpRequestProps.forEach(prop => {\n if (prop in xhr && typeof xhr[prop] === 'function') {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n fill(xhr, prop, function (original: WrappedFunction): () => any {\n const wrapOptions = {\n mechanism: {\n data: {\n function: prop,\n handler: getFunctionName(original),\n },\n handled: true,\n type: 'instrument',\n },\n };\n\n // If Instrument integration has been called before TryCatch, get the name of original function\n const originalFunction = getOriginalFunction(original);\n if (originalFunction) {\n wrapOptions.mechanism.data.handler = getFunctionName(originalFunction);\n }\n\n // Otherwise wrap directly\n return wrap(original, wrapOptions);\n });\n }\n });\n\n return originalSend.apply(this, args);\n };\n}\n\n/** JSDoc */\nfunction _wrapEventTarget(target: string): void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const global = getGlobalObject() as { [key: string]: any };\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const proto = global[target] && global[target].prototype;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, no-prototype-builtins\n if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {\n return;\n }\n\n fill(proto, 'addEventListener', function (original: () => void): (\n eventName: string,\n fn: EventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) => void {\n return function (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\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 if (typeof fn.handleEvent === 'function') {\n // ESlint disable explanation:\n // First, it is generally safe to call `wrap` with an unbound function. Furthermore, using `.bind()` would\n // introduce a bug here, because bind returns a new function that doesn't have our\n // flags(like __sentry_original__) attached. `wrap` checks for those flags to avoid unnecessary wrapping.\n // Without those flags, every call to addEventListener wraps the function again, causing a memory leak.\n // eslint-disable-next-line @typescript-eslint/unbound-method\n fn.handleEvent = wrap(fn.handleEvent, {\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.apply(this, [\n eventName,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\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(\n proto,\n 'removeEventListener',\n function (\n originalRemoveEventListener: () => void,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ): (this: any, eventName: string, fn: EventListenerObject, options?: boolean | EventListenerOptions) => () => void {\n return function (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this: any,\n eventName: string,\n fn: EventListenerObject,\n options?: boolean | EventListenerOptions,\n ): () => void {\n /**\n * There are 2 possible scenarios here:\n *\n * 1. Someone passes a callback, which was attached prior to Sentry initialization, or by using unmodified\n * method, eg. `document.addEventListener.call(el, name, handler). In this case, we treat this function\n * as a pass-through, and call original `removeEventListener` with it.\n *\n * 2. Someone passes a callback, which was attached after Sentry was initialized, which means that it was using\n * our wrapped version of `addEventListener`, which internally calls `wrap` helper.\n * This helper \"wraps\" whole callback inside a try/catch statement, and attached appropriate metadata to it,\n * in order for us to make a distinction between wrapped/non-wrapped functions possible.\n * If a function was wrapped, it has additional property of `__sentry_wrapped__`, holding the handler.\n *\n * When someone adds a handler prior to initialization, and then do it again, but after,\n * then we have to detach both of them. Otherwise, if we'd detach only wrapped one, it'd be impossible\n * to get rid of the initial handler and it'd stick there forever.\n */\n const wrappedEventHandler = fn as unknown as WrappedFunction;\n try {\n const originalEventHandler = wrappedEventHandler && wrappedEventHandler.__sentry_wrapped__;\n if (originalEventHandler) {\n originalRemoveEventListener.call(this, eventName, originalEventHandler, options);\n }\n } catch (e) {\n // ignore, accessing __sentry_wrapped__ will throw in some Selenium environments\n }\n return originalRemoveEventListener.call(this, eventName, wrappedEventHandler, options);\n };\n },\n );\n}\n","import { addGlobalEventProcessor, getCurrentHub } from '@sentry/core';\nimport { Event, EventHint, Exception, ExtendedError, Integration, StackParser } from '@sentry/types';\nimport { isInstanceOf } from '@sentry/utils';\n\nimport { BrowserClient } from '../client';\nimport { exceptionFromError } from '../eventbuilder';\n\nconst DEFAULT_KEY = 'cause';\nconst DEFAULT_LIMIT = 5;\n\ninterface LinkedErrorsOptions {\n key: string;\n limit: number;\n}\n\n/** Adds SDK info to an event. */\nexport class LinkedErrors implements Integration {\n /**\n * @inheritDoc\n */\n public static id: string = 'LinkedErrors';\n\n /**\n * @inheritDoc\n */\n public readonly name: string = LinkedErrors.id;\n\n /**\n * @inheritDoc\n */\n private readonly _key: LinkedErrorsOptions['key'];\n\n /**\n * @inheritDoc\n */\n private readonly _limit: LinkedErrorsOptions['limit'];\n\n /**\n * @inheritDoc\n */\n public constructor(options: Partial = {}) {\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 const client = getCurrentHub().getClient();\n if (!client) {\n return;\n }\n addGlobalEventProcessor((event: Event, hint?: EventHint) => {\n const self = getCurrentHub().getIntegration(LinkedErrors);\n return self ? _handler(client.getOptions().stackParser, self._key, self._limit, event, hint) : event;\n });\n }\n}\n\n/**\n * @inheritDoc\n */\nexport function _handler(\n parser: StackParser,\n key: string,\n limit: number,\n event: Event,\n hint?: EventHint,\n): Event | null {\n if (!event.exception || !event.exception.values || !hint || !isInstanceOf(hint.originalException, Error)) {\n return event;\n }\n const linkedErrors = _walkErrorTree(parser, limit, hint.originalException as ExtendedError, key);\n event.exception.values = [...linkedErrors, ...event.exception.values];\n return event;\n}\n\n/**\n * JSDOC\n */\nexport function _walkErrorTree(\n parser: StackParser,\n limit: number,\n error: ExtendedError,\n key: string,\n stack: Exception[] = [],\n): Exception[] {\n if (!isInstanceOf(error[key], Error) || stack.length + 1 >= limit) {\n return stack;\n }\n const exception = exceptionFromError(parser, error[key]);\n return _walkErrorTree(parser, limit, error[key], key, [exception, ...stack]);\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/** HttpContext integration collects information about HTTP request headers */\nexport class HttpContext implements Integration {\n /**\n * @inheritDoc\n */\n public static id: string = 'HttpContext';\n\n /**\n * @inheritDoc\n */\n public name: string = HttpContext.id;\n\n /**\n * @inheritDoc\n */\n public setupOnce(): void {\n addGlobalEventProcessor((event: Event) => {\n if (getCurrentHub().getIntegration(HttpContext)) {\n // if none of the information we want exists, don't bother\n if (!global.navigator && !global.location && !global.document) {\n return event;\n }\n\n // grab as much info as exists and add it to the event\n const url = (event.request && event.request.url) || (global.location && global.location.href);\n const { referrer } = global.document || {};\n const { userAgent } = global.navigator || {};\n\n const headers = {\n ...(event.request && event.request.headers),\n ...(referrer && { Referer: referrer }),\n ...(userAgent && { 'User-Agent': userAgent }),\n };\n const request = { ...(url && { url }), headers };\n\n return { ...event, request };\n }\n return event;\n });\n }\n}\n","import { Event, EventProcessor, Exception, Hub, Integration, StackFrame } from '@sentry/types';\nimport { logger } from '@sentry/utils';\n\n/** Deduplication filter */\nexport class Dedupe implements Integration {\n /**\n * @inheritDoc\n */\n public static id: string = 'Dedupe';\n\n /**\n * @inheritDoc\n */\n public name: string = Dedupe.id;\n\n /**\n * @inheritDoc\n */\n private _previousEvent?: Event;\n\n /**\n * @inheritDoc\n */\n public setupOnce(addGlobalEventProcessor: (callback: EventProcessor) => void, getCurrentHub: () => Hub): void {\n const eventProcessor: EventProcessor = currentEvent => {\n const self = getCurrentHub().getIntegration(Dedupe);\n if (self) {\n // Juuust in case something goes wrong\n try {\n if (_shouldDropEvent(currentEvent, self._previousEvent)) {\n __DEBUG_BUILD__ && logger.warn('Event dropped due to being a duplicate of previously captured event.');\n return null;\n }\n } catch (_oO) {\n return (self._previousEvent = currentEvent);\n }\n\n return (self._previousEvent = currentEvent);\n }\n return currentEvent;\n };\n\n eventProcessor.id = this.name;\n addGlobalEventProcessor(eventProcessor);\n }\n}\n\n/** JSDoc */\nfunction _shouldDropEvent(currentEvent: Event, previousEvent?: Event): boolean {\n if (!previousEvent) {\n return false;\n }\n\n if (_isSameMessageEvent(currentEvent, previousEvent)) {\n return true;\n }\n\n if (_isSameExceptionEvent(currentEvent, previousEvent)) {\n return true;\n }\n\n return false;\n}\n\n/** JSDoc */\nfunction _isSameMessageEvent(currentEvent: Event, previousEvent: Event): boolean {\n const currentMessage = currentEvent.message;\n const previousMessage = previousEvent.message;\n\n // If neither event has a message property, they were both exceptions, so bail out\n if (!currentMessage && !previousMessage) {\n return false;\n }\n\n // If only one event has a stacktrace, but not the other one, they are not the same\n if ((currentMessage && !previousMessage) || (!currentMessage && previousMessage)) {\n return false;\n }\n\n if (currentMessage !== previousMessage) {\n return false;\n }\n\n if (!_isSameFingerprint(currentEvent, previousEvent)) {\n return false;\n }\n\n if (!_isSameStacktrace(currentEvent, previousEvent)) {\n return false;\n }\n\n return true;\n}\n\n/** JSDoc */\nfunction _isSameExceptionEvent(currentEvent: Event, previousEvent: Event): boolean {\n const previousException = _getExceptionFromEvent(previousEvent);\n const currentException = _getExceptionFromEvent(currentEvent);\n\n if (!previousException || !currentException) {\n return false;\n }\n\n if (previousException.type !== currentException.type || previousException.value !== currentException.value) {\n return false;\n }\n\n if (!_isSameFingerprint(currentEvent, previousEvent)) {\n return false;\n }\n\n if (!_isSameStacktrace(currentEvent, previousEvent)) {\n return false;\n }\n\n return true;\n}\n\n/** JSDoc */\nfunction _isSameStacktrace(currentEvent: Event, previousEvent: Event): boolean {\n let currentFrames = _getFramesFromEvent(currentEvent);\n let previousFrames = _getFramesFromEvent(previousEvent);\n\n // If neither event has a stacktrace, they are assumed to be the same\n if (!currentFrames && !previousFrames) {\n return true;\n }\n\n // If only one event has a stacktrace, but not the other one, they are not the same\n if ((currentFrames && !previousFrames) || (!currentFrames && previousFrames)) {\n return false;\n }\n\n currentFrames = currentFrames as StackFrame[];\n previousFrames = previousFrames as StackFrame[];\n\n // If number of frames differ, they are not the same\n if (previousFrames.length !== currentFrames.length) {\n return false;\n }\n\n // Otherwise, compare the two\n for (let i = 0; i < previousFrames.length; i++) {\n const frameA = previousFrames[i];\n const frameB = currentFrames[i];\n\n if (\n frameA.filename !== frameB.filename ||\n frameA.lineno !== frameB.lineno ||\n frameA.colno !== frameB.colno ||\n frameA.function !== frameB.function\n ) {\n return false;\n }\n }\n\n return true;\n}\n\n/** JSDoc */\nfunction _isSameFingerprint(currentEvent: Event, previousEvent: Event): boolean {\n let currentFingerprint = currentEvent.fingerprint;\n let previousFingerprint = previousEvent.fingerprint;\n\n // If neither event has a fingerprint, they are assumed to be the same\n if (!currentFingerprint && !previousFingerprint) {\n return true;\n }\n\n // If only one event has a fingerprint, but not the other one, they are not the same\n if ((currentFingerprint && !previousFingerprint) || (!currentFingerprint && previousFingerprint)) {\n return false;\n }\n\n currentFingerprint = currentFingerprint as string[];\n previousFingerprint = previousFingerprint as string[];\n\n // Otherwise, compare the two\n try {\n return !!(currentFingerprint.join('') === previousFingerprint.join(''));\n } catch (_oO) {\n return false;\n }\n}\n\n/** JSDoc */\nfunction _getExceptionFromEvent(event: Event): Exception | undefined {\n return event.exception && event.exception.values && event.exception.values[0];\n}\n\n/** JSDoc */\nfunction _getFramesFromEvent(event: Event): StackFrame[] | undefined {\n const exception = event.exception;\n\n if (exception) {\n try {\n // @ts-ignore Object could be undefined\n return exception.values[0].stacktrace.frames;\n } catch (_oO) {\n return undefined;\n }\n }\n return undefined;\n}\n","import {\n getCurrentHub,\n getIntegrationsToSetup,\n getReportDialogEndpoint,\n Hub,\n initAndBind,\n Integrations as CoreIntegrations,\n} from '@sentry/core';\nimport {\n addInstrumentationHandler,\n getGlobalObject,\n logger,\n resolvedSyncPromise,\n stackParserFromStackParserOptions,\n supportsFetch,\n} from '@sentry/utils';\n\nimport { BrowserClient, BrowserClientOptions, BrowserOptions } from './client';\nimport { ReportDialogOptions, wrap as internalWrap } from './helpers';\nimport { Breadcrumbs, Dedupe, GlobalHandlers, HttpContext, LinkedErrors, TryCatch } from './integrations';\nimport { defaultStackParser } from './stack-parsers';\nimport { makeFetchTransport, makeXHRTransport } from './transports';\n\nexport const defaultIntegrations = [\n new CoreIntegrations.InboundFilters(),\n new CoreIntegrations.FunctionToString(),\n new TryCatch(),\n new Breadcrumbs(),\n new GlobalHandlers(),\n new LinkedErrors(),\n new Dedupe(),\n new HttpContext(),\n];\n\n/**\n * 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 if (options.autoSessionTracking === undefined) {\n options.autoSessionTracking = true;\n }\n if (options.sendClientReports === undefined) {\n options.sendClientReports = true;\n }\n\n const clientOptions: BrowserClientOptions = {\n ...options,\n stackParser: stackParserFromStackParserOptions(options.stackParser || defaultStackParser),\n integrations: getIntegrationsToSetup(options),\n transport: options.transport || (supportsFetch() ? makeFetchTransport : makeXHRTransport),\n };\n\n initAndBind(BrowserClient, clientOptions);\n\n if (options.autoSessionTracking) {\n startSessionTracking();\n }\n}\n\n/**\n * Present the user with a report dialog.\n *\n * @param options Everything is optional, we try to fetch all info need from the global scope.\n */\nexport function showReportDialog(options: ReportDialogOptions = {}, hub: Hub = getCurrentHub()): void {\n // doesn't work without a document (React Native)\n const global = getGlobalObject();\n if (!global.document) {\n __DEBUG_BUILD__ && logger.error('Global document not defined in showReportDialog call');\n return;\n }\n\n const { client, scope } = hub.getStackTop();\n const dsn = options.dsn || (client && client.getDsn());\n if (!dsn) {\n __DEBUG_BUILD__ && logger.error('DSN not configured for showReportDialog call');\n return;\n }\n\n if (scope) {\n options.user = {\n ...scope.getUser(),\n ...options.user,\n };\n }\n\n if (!options.eventId) {\n options.eventId = hub.lastEventId();\n }\n\n const script = global.document.createElement('script');\n script.async = true;\n script.src = getReportDialogEndpoint(dsn, options);\n\n if (options.onLoad) {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n script.onload = options.onLoad;\n }\n\n const injectionPoint = global.document.head || global.document.body;\n if (injectionPoint) {\n injectionPoint.appendChild(script);\n } else {\n __DEBUG_BUILD__ && logger.error('Not injecting report dialog. No injection point found in HTML');\n }\n}\n\n/**\n * This is the getter for lastEventId.\n *\n * @returns The last event id of a captured event.\n */\nexport function lastEventId(): string | undefined {\n return getCurrentHub().lastEventId();\n}\n\n/**\n * This function is here to be API compatible with the loader.\n * @hidden\n */\nexport function forceLoad(): void {\n // Noop\n}\n\n/**\n * This function is here to be API compatible with the loader.\n * @hidden\n */\nexport function onLoad(callback: () => void): void {\n callback();\n}\n\n/**\n * Call `flush()` on the current client, if there is one. See {@link Client.flush}.\n *\n * @param timeout Maximum time in ms the client should wait to flush its event queue. Omitting this parameter will cause\n * the client to wait until all events are sent before resolving the promise.\n * @returns A promise which resolves to `true` if the queue successfully drains before the timeout, or `false` if it\n * doesn't (or if there's no client defined).\n */\nexport function flush(timeout?: number): PromiseLike {\n const client = getCurrentHub().getClient();\n if (client) {\n return client.flush(timeout);\n }\n __DEBUG_BUILD__ && logger.warn('Cannot flush events. No client defined.');\n return resolvedSyncPromise(false);\n}\n\n/**\n * Call `close()` on the current client, if there is one. See {@link Client.close}.\n *\n * @param timeout Maximum time in ms the client should wait to flush its event queue before shutting down. Omitting this\n * parameter will cause the client to wait until all events are sent before disabling itself.\n * @returns A promise which resolves to `true` if the queue successfully drains before the timeout, or `false` if it\n * doesn't (or if there's no client defined).\n */\nexport function close(timeout?: number): PromiseLike {\n const client = getCurrentHub().getClient();\n if (client) {\n return client.close(timeout);\n }\n __DEBUG_BUILD__ && logger.warn('Cannot flush events and disable SDK. No client defined.');\n return resolvedSyncPromise(false);\n}\n\n/**\n * Wrap code within a try/catch block so the SDK is able to capture errors.\n *\n * @param fn A function to wrap.\n *\n * @returns The result of wrapped function call.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function wrap(fn: (...args: any) => any): any {\n return internalWrap(fn)();\n}\n\nfunction startSessionOnHub(hub: Hub): void {\n hub.startSession({ ignoreDuration: true });\n hub.captureSession();\n}\n\n/**\n * Enable automatic Session Tracking for the initial page load.\n */\nfunction startSessionTracking(): void {\n const window = getGlobalObject();\n const document = window.document;\n\n if (typeof document === 'undefined') {\n __DEBUG_BUILD__ &&\n logger.warn('Session tracking in non-browser environment with @sentry/browser is not supported.');\n return;\n }\n\n const hub = getCurrentHub();\n\n // The only way for this to be false is for there to be a version mismatch between @sentry/browser (>= 6.0.0) and\n // @sentry/hub (< 5.27.0). In the simple case, there won't ever be such a mismatch, because the two packages are\n // pinned at the same version in package.json, but there are edge cases where it's possible. See\n // https://github.com/getsentry/sentry-javascript/issues/3207 and\n // https://github.com/getsentry/sentry-javascript/issues/3234 and\n // https://github.com/getsentry/sentry-javascript/issues/3278.\n if (!hub.captureSession) {\n return;\n }\n\n // The session duration for browser sessions does not track a meaningful\n // concept that can be used as a metric.\n // Automatically captured sessions are akin to page views, and thus we\n // discard their duration.\n startSessionOnHub(hub);\n\n // We want to create a session for every navigation as well\n addInstrumentationHandler('history', ({ from, to }) => {\n // Don't create an additional session for the initial route or if the location did not change\n if (!(from === undefined || from === to)) {\n startSessionOnHub(getCurrentHub());\n }\n });\n}\n","export * from './exports';\n\nimport { Integrations as CoreIntegrations } from '@sentry/core';\nimport { getGlobalObject } from '@sentry/utils';\n\nimport * as BrowserIntegrations from './integrations';\n\nlet windowIntegrations = {};\n\n// This block is needed to add compatibility with the integrations packages when used with a CDN\nconst _window = getGlobalObject();\nif (_window.Sentry && _window.Sentry.Integrations) {\n windowIntegrations = _window.Sentry.Integrations;\n}\n\nconst INTEGRATIONS = {\n ...windowIntegrations,\n ...CoreIntegrations,\n ...BrowserIntegrations,\n};\n\nexport { INTEGRATIONS as Integrations };\n","import { getCurrentHub } from '@sentry/hub';\nimport { Client, ClientOptions } from '@sentry/types';\nimport { logger } from '@sentry/utils';\n\n/** A class object that can instantiate 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 instantiate.\n * @param options Options to pass to the client.\n */\nexport function initAndBind(\n clientClass: ClientClass,\n options: O,\n): void {\n if (options.debug === true) {\n if (__DEBUG_BUILD__) {\n logger.enable();\n } else {\n // use `console.warn` rather than `logger.warn` since by non-debug bundles have all `logger.x` statements stripped\n // eslint-disable-next-line no-console\n console.warn('[Sentry] Cannot initialize SDK with `debug` option using a non-debug bundle.');\n }\n }\n const hub = getCurrentHub();\n const scope = hub.getScope();\n if (scope) {\n scope.update(options.initialScope);\n }\n\n const client = new clientClass(options);\n hub.bindClient(client);\n}\n"],"names":["fallbackGlobalObject","getGlobalObject","window","self","getGlobalSingleton","name","creator","obj","global","__SENTRY__","objectToString","Object","prototype","toString","isError","wat","call","isInstanceOf","Error","isBuiltin","ty","isErrorEvent","isDOMError","isString","isPrimitive","isPlainObject","isEvent","Event","isThenable","Boolean","then","base","_e","htmlTreeAsString","elem","keyAttrs","currentElem","out","height","len","sepLength","length","nextStr","_htmlElementAsString","push","parentNode","reverse","join","_oO","el","className","classes","key","attr","i","tagName","toLowerCase","keyAttrPairs","filter","keyAttr","getAttribute","map","forEach","keyAttrPair","id","split","allowedAttrs","message","_super","_this","_newTarget","constructor","setPrototypeOf","__extends","DSN_REGEX","dsnToString","dsn","withPassword","host","path","pass","port","projectId","dsnFromComponents","components","protocol","publicKey","makeDsn","from","str","match","exec","SentryError","_a","_b","_c","slice","pop","projectMatch","dsnFromString","logger","CONSOLE_LEVELS","truncate","max","substr","safeJoin","input","delimiter","Array","isArray","output","value","String","e","isMatchingPattern","pattern","test","indexOf","fill","source","replacementFactory","original","wrapped","markFunctionWrapped","_Oo","addNonEnumerableProperty","defineProperty","writable","configurable","proto","getOriginalFunction","func","__sentry_original__","convertToPlainObject","stack","getOwnProperties","newObj","type","target","serializeEventTarget","currentTarget","CustomEvent","detail","Element","extractedProps","property","hasOwnProperty","extractExceptionKeysForMessage","exception","maxLength","keys","sort","includedKeys","serialized","dropUndefinedKeys","inputValue","_dropUndefinedKeys","Map","memoizationMap","undefined","memoVal","get","returnValue","set","__values","returnValue_1","item","enable","disable","createStackParser","_i","parsers","sortedParsers","a","b","p","skipFirst","frames","line","sortedParsers_1","frame","parser","stripSentryFramesAndReverse","localStack","firstFrameFunction","function","lastFrameFunction","filename","defaultFunctionName","getFunctionName","fn","supportsFetch","Headers","Request","Response","isNativeFetch","lastHref","handlers","instrumented","instrument","level","console","originalConsoleMethod","args","triggerHandlers","apply","instrumentConsole","triggerDOMHandler","bind","globalDOMEventHandler","makeDOMEventHandler","document","addEventListener","originalAddEventListener","listener","options","this","handlers_1","__sentry_instrumentation_handlers__","handlerForType","refCount","handler","originalRemoveEventListener","handlers_2","instrumentDOM","xhrproto","XMLHttpRequest","originalOpen","xhr","url","xhrInfo","__sentry_xhr__","method","toUpperCase","__sentry_own_request__","onreadystatechangeHandler","readyState","status_code","status","endTimestamp","Date","now","startTimestamp","onreadystatechange","readyStateArgs","originalSend","body","instrumentXHR","fetch","result","doc","createElement","sandbox","hidden","head","appendChild","contentWindow","removeChild","err","supportsNativeFetch","originalFetch","handlerData","fetchData","getFetchMethod","getFetchUrl","response","error","instrumentFetch","chrome","isChromePackagedApp","app","runtime","hasHistoryApi","history","pushState","replaceState","supportsHistory","oldOnPopState","onpopstate","historyReplacementFunction","originalHistoryFunction","to","location","href","instrumentHistory","_oldOnErrorHandler","onerror","msg","column","arguments","_oldOnUnhandledRejectionHandler","onunhandledrejection","addInstrumentationHandler","callback","data","fetchArgs","debounceTimerID","lastCapturedEvent","globalListener","event","isContentEditable","shouldSkipDOMEvent","previous","current","shouldShortcircuitPreviousDebounce","clearTimeout","setTimeout","States","uuid4","crypto","msCrypto","randomUUID","replace","getRandomByte","getRandomValues","Uint8Array","Math","random","c","parseUrl","query","fragment","relative","getFirstException","values","getEventDescription","eventId","firstException","addExceptionTypeValue","addExceptionMechanism","newMechanism","currentMechanism","mechanism","handled","mergedData","checkOrSetAlreadyCaught","__sentry_captured__","normalize","depth","maxProperties","Infinity","visit","ERROR","normalizeToSize","object","maxSize","normalized","encodeURI","utf8Length","JSON","stringify","memo","hasWeakSet","inner","WeakSet","has","add","delete","splice","memoize","unmemoize","includes","stringified","_events","isSyntheticEvent","getPrototypeOf","stringifyValue","startsWith","valueWithToJSON","toJSON","numAdded","visitable","visitKey","visitValue","resolvedSyncPromise","SyncPromise","resolve","rejectedSyncPromise","reason","_","reject","executor","PENDING","_setResult","RESOLVED","REJECTED","state","_state","_resolve","_reject","_value","_executeHandlers","cachedHandlers","_handlers","onfulfilled","onrejected","val","onfinally","isRejected","makePromiseBuffer","limit","buffer","remove","task","$","taskProducer","drain","timeout","counter","capturedSetTimeout","validSeverityLevels","dateTimestampSource","nowSeconds","platformPerformance","performance","timeOrigin","getBrowserPerformance","timestampSource","dateTimestampInSeconds","timestampInSeconds","createEnvelope","headers","items","addItemToEnvelope","envelope","newItem","forEachEnvelopeItem","envelopeItem","envelopeItemType","encodeUTF8","textEncoder","TextEncoder","encode","serializeEnvelope","envHeaders","parts","append","next","items_1","itemHeaders","payload","buffers","totalLength","reduce","acc","buf","merged","offset","buffers_1","concatBuffers","createAttachmentEnvelopeItem","attachment","content_type","contentType","attachment_type","attachmentType","threshold","performanceNow","dateNow","timeOriginDelta","abs","timeOriginIsReliable","navigationStart","timing","navigationStartDelta","ITEM_TYPE_TO_DATA_CATEGORY_MAP","session","sessions","transaction","client_report","user_report","envelopeItemTypeToDataCategory","updateRateLimits","limits","statusCode","updatedRateLimits","rateLimitHeader","retryAfterHeader","_d","trim","_f","retryAfter","categories","headerDelay","parseInt","delay","isNaN","_g","all","header","headerDate","parse","parseRetryAfterHeader","makeSession","context","startingTime","sid","init","timestamp","started","duration","errors","ignoreDuration","toISOString","did","attrs","release","environment","ip_address","ipAddress","user_agent","userAgent","sessionToJSON","updateSession","user","email","username","_notifyingListeners","_scopeListeners","_eventProcessors","_breadcrumbs","_attachments","_user","_tags","_extra","_contexts","_sdkProcessingMetadata","Scope","scope","newScope","_level","_span","_session","_transactionName","_fingerprint","_requestSession","_notifyScopeListeners","requestSession","tags","extras","extra","fingerprint","span","getSpan","captureContext","updatedScope","contexts","breadcrumb","maxBreadcrumbs","maxCrumbs","min","mergedBreadcrumb","__spread","hint","trace","getTraceContext","transactionName","_applyFingerprint","breadcrumbs","sdkProcessingMetadata","_notifyEventProcessors","getGlobalEventProcessors","newData","processors","index","processor","final","concat","addGlobalEventProcessor","client","_version","getStackTop","bindClient","Hub","version","setupIntegrations","clone","getScope","getStack","getClient","pushScope","popScope","_stack","_lastEventId","event_id","syntheticException","_withClient","captureException","originalException","captureMessage","captureEvent","beforeBreadcrumb","finalBreadcrumb","originalConsole","wrappedLevels","originalWrappedFunc","consoleSandbox","addBreadcrumb","setUser","setTags","setExtras","setTag","setExtra","setContext","oldHub","makeMain","integration","getIntegration","customSamplingContext","_callExtensionMethod","endSession","_sendSessionUpdate","layer","getSession","closeSession","setSession","getUser","currentSession","getOptions","sendDefaultPii","captureSession","carrier","getMainCarrier","sentry","extensions","hub","registry","getHubFromCarrier","setHubOnCarrier","getCurrentHub","isOlderThan","withScope","getBaseApiEndpoint","_encodedAuth","sdkInfo","sentry_key","sentry_version","sentry_client","encodeURIComponent","getEnvelopeEndpointWithUrlEncodedAuth","tunnelOrOptions","tunnel","_metadata","sdk","_getIngestEndpoint","getSdkMetadataForEnvelopeHeader","metadata","createEventEnvelope","eventType","samplingMethod","sampleRate","integrations","packages","enhanceEventWithSdkInfo","envelopeHeaders","baggage","dynamicSamplingContext","getSentryBaggageItems","sent_at","createEventEnvelopeHeaders","sample_rates","rate","installedIntegrations","filterDuplicates","every","accIntegration","getIntegrationsToSetup","defaultIntegrations","userIntegrations","userIntegration","integrationsNames","alwaysLastToRun","_options","_dsn","_transport","transport","recordDroppedEvent","transportOptions","BaseClient","_process","eventFromException","_captureEvent","promisedEvent","eventFromMessage","_isEnabled","sendSession","_isClientDoneProcessing","clientFinished","flush","transportFlushed","enabled","integrationIndex","_integrationsInitialized","_integrations","setupOnce","integrationId","env","attachments","_sendEnvelope","createSessionEnvelope","category","sendClientReports","_outcomes","crashed","errored","exceptions","exceptions_1","sessionNonTerminal","Number","ticked","interval","setInterval","_numProcessing","clearInterval","normalizeDepth","normalizeMaxBreadth","prepared","_applyClientOptions","_applyIntegrationsMetadata","finalScope","update","getAttachments","applyToEvent","evt","_normalizeEvent","maxBreadth","spans","dist","maxValueLength","request","integrationsArray","_processEvent","finalEvent","beforeSend","isTransaction","_prepareEvent","__sentry__","rv","nullErr","_ensureBeforeSendRv","processedEvent","_updateSessionFromEvent","sendEvent","promise","send","outcomes","quantity","createTransport","makeRequest","bufferSize","rateLimits","filteredEnvelopeItems","envelopeItemDataCategory","disabledUntil","filteredEnvelope","recordEnvelopeLoss","originalFunctionToString","SDK_VERSION","FunctionToString","Function","DEFAULT_IGNORE_ERRORS","InboundFilters","eventProcess","self_1","clientOptions","internalOptions","allowUrls","denyUrls","ignoreErrors","ignoreInternal","_mergeOptions","_isSentryError","oO","_getPossibleEventMessages","some","_isIgnoredError","_getEventFilterUrl","_isDeniedUrl","_isAllowedUrl","_shouldDropEvent","frames_1","stacktrace","_getLastValidUrl","exceptionFromError","stackParser","ex","parseStackFrames","extractMessage","eventFromError","popSize","framesToPop","reactMinifiedRegexp","getPopSize","eventFromUnknownInput","attachStacktrace","isUnhandledRejection","domException","name_1","eventFromString","code","__serialized__","eventFromPlainObject","synthetic","frames_2","BREADCRUMB_INTEGRATION_ID","Breadcrumbs","dom","_consoleBreadcrumb","_innerDomBreadcrumb","serializeAttribute","_domBreadcrumb","_xhrBreadcrumb","_fetchBreadcrumb","_historyBreadcrumb","parsedLoc","parsedFrom","parsedTo","cachedFetchImpl","getNativeFetchImplementation","fetchImpl","globalObject","visibilityState","_flushOutcomes","BrowserClient","breadcrumbIntegration","getIntegrationById","platform","_clearOutcomes","discarded_events","navigator","sendBeacon","fetch_1","credentials","keepalive","sendReport","makeFetchTransport","nativeFetch","requestOptions","referrerPolicy","fetchOptions","makeXHRTransport","getResponseHeader","open","setRequestHeader","UNKNOWN_FUNCTION","createFrame","lineno","colno","in_app","chromeRegex","chromeEvalRegex","chromeStackLineParser","subMatch","geckoREgex","geckoEvalRegex","geckoStackLineParser","winjsRegex","winjsStackLineParser","opera10Regex","opera10StackLineParser","opera11Regex","opera11StackLineParser","defaultStackLineParsers","defaultStackParser","extractSafariExtensionDetails","isSafariExtension","isSafariWebExtension","ignoreOnError","shouldIgnoreOnError","ignoreNextOnError","wrap","before","wrapper","__sentry_wrapped__","sentryWrapped","wrappedArguments","arg","addEventProcessor","getOwnPropertyDescriptor","GlobalHandlers","_installGlobalOnErrorHandler","_installGlobalOnUnhandledRejectionHandler","stackTraceLimit","installFunc","_installFunc","ERROR_TYPES_RE","groups","_enhanceEventWithInitialFrame","_eventFromIncompleteOnError","addMechanismAndCapture","ev","ev0","ev0s","ev0sf","getLocationHref","getHubAndOptions","DEFAULT_EVENT_TARGET","TryCatch","eventTarget","requestAnimationFrame","_wrapTimeFunction","_wrapRAF","_wrapXHR","eventTargetOption","_wrapEventTarget","originalCallback","xmlHttpRequestProps","prop","wrapOptions","originalFunction","eventName","handleEvent","wrappedEventHandler","originalEventHandler","LinkedErrors","_key","_limit","linkedErrors","_walkErrorTree","_handler","HttpContext","referrer","Referer","Dedupe","eventProcessor","currentEvent","previousEvent","currentMessage","previousMessage","_isSameFingerprint","_isSameStacktrace","_isSameMessageEvent","previousException","_getExceptionFromEvent","currentException","_isSameExceptionEvent","_previousEvent","currentFrames","_getFramesFromEvent","previousFrames","frameA","frameB","currentFingerprint","previousFingerprint","CoreIntegrations.InboundFilters","CoreIntegrations.FunctionToString","startSessionOnHub","startSession","windowIntegrations","_window","Sentry","Integrations","INTEGRATIONS","CoreIntegrations","BrowserIntegrations","close","configureScope","window_1","SENTRY_RELEASE","autoSessionTracking","clientClass","debug","warn","initialScope","initAndBind","startSessionTracking","lastEventId","getDsn","script","async","src","dsnLike","dialogOptions","endpoint","encodedOptions","getReportDialogEndpoint","onLoad","onload","injectionPoint","startTransaction","internalWrap"],"mappings":"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"}