{"version":3,"file":"DCfid6Ta.js","sources":["../../../../node_modules/@smenaspace/settings-layer/node_modules/@sentry/utils/build/esm/node.js","../../../../node_modules/@smenaspace/settings-layer/node_modules/@sentry/utils/build/esm/isBrowser.js","../../../../node_modules/@smenaspace/settings-layer/node_modules/@sentry/utils/build/esm/buildPolyfills/_nullishCoalesce.js","../../../../node_modules/@smenaspace/settings-layer/node_modules/@sentry/utils/build/esm/buildPolyfills/_optionalChain.js","../../../../node_modules/@smenaspace/settings-layer/node_modules/@sentry/core/build/esm/tracing/errors.js","../../../../node_modules/@smenaspace/settings-layer/node_modules/@sentry/core/build/esm/tracing/idleSpan.js","../../../../node_modules/@smenaspace/settings-layer/node_modules/@sentry/core/build/esm/utils/isSentryRequestUrl.js","../../../../node_modules/@smenaspace/settings-layer/node_modules/@sentry/core/build/esm/fetch.js","../../../../node_modules/@smenaspace/settings-layer/node_modules/@sentry-internal/browser-utils/build/esm/metrics/web-vitals/lib/bindReporter.js","../../../../node_modules/@smenaspace/settings-layer/node_modules/@sentry-internal/browser-utils/build/esm/metrics/web-vitals/lib/generateUniqueID.js","../../../../node_modules/@smenaspace/settings-layer/node_modules/@sentry-internal/browser-utils/build/esm/metrics/web-vitals/lib/getNavigationEntry.js","../../../../node_modules/@smenaspace/settings-layer/node_modules/@sentry-internal/browser-utils/build/esm/metrics/web-vitals/lib/getActivationStart.js","../../../../node_modules/@smenaspace/settings-layer/node_modules/@sentry-internal/browser-utils/build/esm/metrics/web-vitals/lib/initMetric.js","../../../../node_modules/@smenaspace/settings-layer/node_modules/@sentry-internal/browser-utils/build/esm/metrics/web-vitals/lib/observe.js","../../../../node_modules/@smenaspace/settings-layer/node_modules/@sentry-internal/browser-utils/build/esm/metrics/web-vitals/lib/onHidden.js","../../../../node_modules/@smenaspace/settings-layer/node_modules/@sentry-internal/browser-utils/build/esm/metrics/web-vitals/lib/runOnce.js","../../../../node_modules/@smenaspace/settings-layer/node_modules/@sentry-internal/browser-utils/build/esm/metrics/web-vitals/lib/getVisibilityWatcher.js","../../../../node_modules/@smenaspace/settings-layer/node_modules/@sentry-internal/browser-utils/build/esm/metrics/web-vitals/lib/whenActivated.js","../../../../node_modules/@smenaspace/settings-layer/node_modules/@sentry-internal/browser-utils/build/esm/metrics/web-vitals/onFCP.js","../../../../node_modules/@smenaspace/settings-layer/node_modules/@sentry-internal/browser-utils/build/esm/metrics/web-vitals/getCLS.js","../../../../node_modules/@smenaspace/settings-layer/node_modules/@sentry-internal/browser-utils/build/esm/metrics/web-vitals/getFID.js","../../../../node_modules/@smenaspace/settings-layer/node_modules/@sentry-internal/browser-utils/build/esm/metrics/web-vitals/lib/polyfills/interactionCountPolyfill.js","../../../../node_modules/@smenaspace/settings-layer/node_modules/@sentry-internal/browser-utils/build/esm/metrics/web-vitals/getINP.js","../../../../node_modules/@smenaspace/settings-layer/node_modules/@sentry-internal/browser-utils/build/esm/metrics/web-vitals/getLCP.js","../../../../node_modules/@smenaspace/settings-layer/node_modules/@sentry-internal/browser-utils/build/esm/metrics/web-vitals/onTTFB.js","../../../../node_modules/@smenaspace/settings-layer/node_modules/@sentry-internal/browser-utils/build/esm/metrics/instrument.js","../../../../node_modules/@smenaspace/settings-layer/node_modules/@sentry-internal/browser-utils/build/esm/metrics/utils.js","../../../../node_modules/@smenaspace/settings-layer/node_modules/@sentry-internal/browser-utils/build/esm/metrics/cls.js","../../../../node_modules/@smenaspace/settings-layer/node_modules/@sentry-internal/browser-utils/build/esm/metrics/browserMetrics.js","../../../../node_modules/@smenaspace/settings-layer/node_modules/@sentry-internal/browser-utils/build/esm/metrics/inp.js","../../../../node_modules/@smenaspace/settings-layer/node_modules/@sentry-internal/replay/build/npm/esm/index.js","../../../../node_modules/@smenaspace/settings-layer/node_modules/@sentry/browser/build/npm/esm/tracing/request.js","../../../../node_modules/@smenaspace/settings-layer/node_modules/@sentry/browser/build/npm/esm/tracing/backgroundtab.js","../../../../node_modules/@smenaspace/settings-layer/node_modules/@sentry/browser/build/npm/esm/tracing/browserTracingIntegration.js","../../../../node_modules/@smenaspace/settings-layer/node_modules/@sentry/vue/build/esm/router.js","../../../../node_modules/@smenaspace/settings-layer/node_modules/@sentry/vue/build/esm/browserTracingIntegration.js"],"sourcesContent":["import { isBrowserBundle } from './env.js';\n\n/**\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\n/**\n * Checks whether we're in the Node.js or Browser environment\n *\n * @returns Answer to given question\n */\nfunction isNodeEnv() {\n // explicitly check for browser bundles as those can be optimized statically\n // by terser/rollup.\n return (\n !isBrowserBundle() &&\n Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]'\n );\n}\n\n/**\n * Requires a module which is protected against bundler minification.\n *\n * @param request The module path to resolve\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction dynamicRequire(mod, request) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return mod.require(request);\n}\n\n/**\n * Helper for dynamically loading module that should work with linked dependencies.\n * The problem is that we _should_ be using `require(require.resolve(moduleName, { paths: [cwd()] }))`\n * However it's _not possible_ to do that with Webpack, as it has to know all the dependencies during\n * build time. `require.resolve` is also not available in any other way, so we cannot create,\n * a fake helper like we do with `dynamicRequire`.\n *\n * We always prefer to use local package, thus the value is not returned early from each `try/catch` block.\n * That is to mimic the behavior of `require.resolve` exactly.\n *\n * @param moduleName module name to require\n * @returns possibly required module\n */\nfunction loadModule(moduleName) {\n let mod;\n\n try {\n mod = dynamicRequire(module, moduleName);\n } catch (e) {\n // no-empty\n }\n\n try {\n const { cwd } = dynamicRequire(module, 'process');\n mod = dynamicRequire(module, `${cwd()}/node_modules/${moduleName}`) ;\n } catch (e) {\n // no-empty\n }\n\n return mod;\n}\n\nexport { dynamicRequire, isNodeEnv, loadModule };\n//# sourceMappingURL=node.js.map\n","import { isNodeEnv } from './node.js';\nimport { GLOBAL_OBJ } from './worldwide.js';\n\n/**\n * Returns true if we are in the browser.\n */\nfunction isBrowser() {\n // eslint-disable-next-line no-restricted-globals\n return typeof window !== 'undefined' && (!isNodeEnv() || isElectronNodeRenderer());\n}\n\n// Electron renderers with nodeIntegration enabled are detected as Node.js so we specifically test for them\nfunction isElectronNodeRenderer() {\n return (\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n (GLOBAL_OBJ ).process !== undefined && ((GLOBAL_OBJ ).process ).type === 'renderer'\n );\n}\n\nexport { isBrowser };\n//# sourceMappingURL=isBrowser.js.map\n","// https://github.com/alangpierce/sucrase/tree/265887868966917f3b924ce38dfad01fbab1329f\n//\n// The MIT License (MIT)\n//\n// Copyright (c) 2012-2018 various contributors (see AUTHORS)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n/**\n * Polyfill for the nullish coalescing operator (`??`).\n *\n * Note that the RHS is wrapped in a function so that if it's a computed value, that evaluation won't happen unless the\n * LHS evaluates to a nullish value, to mimic the operator's short-circuiting behavior.\n *\n * Adapted from Sucrase (https://github.com/alangpierce/sucrase)\n *\n * @param lhs The value of the expression to the left of the `??`\n * @param rhsFn A function returning the value of the expression to the right of the `??`\n * @returns The LHS value, unless it's `null` or `undefined`, in which case, the RHS value\n */\nfunction _nullishCoalesce(lhs, rhsFn) {\n // by checking for loose equality to `null`, we catch both `null` and `undefined`\n return lhs != null ? lhs : rhsFn();\n}\n\n// Sucrase version:\n// function _nullishCoalesce(lhs, rhsFn) {\n// if (lhs != null) {\n// return lhs;\n// } else {\n// return rhsFn();\n// }\n// }\n\nexport { _nullishCoalesce };\n//# sourceMappingURL=_nullishCoalesce.js.map\n","/**\n * Polyfill for the optional chain operator, `?.`, given previous conversion of the expression into an array of values,\n * descriptors, and functions.\n *\n * Adapted from Sucrase (https://github.com/alangpierce/sucrase)\n * See https://github.com/alangpierce/sucrase/blob/265887868966917f3b924ce38dfad01fbab1329f/src/transformers/OptionalChainingNullishTransformer.ts#L15\n *\n * @param ops Array result of expression conversion\n * @returns The value of the expression\n */\nfunction _optionalChain(ops) {\n let lastAccessLHS = undefined;\n let value = ops[0];\n let i = 1;\n while (i < ops.length) {\n const op = ops[i] ;\n const fn = ops[i + 1] ;\n i += 2;\n // by checking for loose equality to `null`, we catch both `null` and `undefined`\n if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) {\n // really we're meaning to return `undefined` as an actual value here, but it saves bytes not to write it\n return;\n }\n if (op === 'access' || op === 'optionalAccess') {\n lastAccessLHS = value;\n value = fn(value);\n } else if (op === 'call' || op === 'optionalCall') {\n value = fn((...args) => (value ).call(lastAccessLHS, ...args));\n lastAccessLHS = undefined;\n }\n }\n return value;\n}\n\n// Sucrase version\n// function _optionalChain(ops) {\n// let lastAccessLHS = undefined;\n// let value = ops[0];\n// let i = 1;\n// while (i < ops.length) {\n// const op = ops[i];\n// const fn = ops[i + 1];\n// i += 2;\n// if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) {\n// return undefined;\n// }\n// if (op === 'access' || op === 'optionalAccess') {\n// lastAccessLHS = value;\n// value = fn(value);\n// } else if (op === 'call' || op === 'optionalCall') {\n// value = fn((...args) => value.call(lastAccessLHS, ...args));\n// lastAccessLHS = undefined;\n// }\n// }\n// return value;\n// }\n\nexport { _optionalChain };\n//# sourceMappingURL=_optionalChain.js.map\n","import { addGlobalErrorInstrumentationHandler, addGlobalUnhandledRejectionInstrumentationHandler, logger } from '@sentry/utils';\nimport { DEBUG_BUILD } from '../debug-build.js';\nimport { getActiveSpan, getRootSpan } from '../utils/spanUtils.js';\nimport { SPAN_STATUS_ERROR } from './spanstatus.js';\n\nlet errorsInstrumented = false;\n\n/**\n * Ensure that global errors automatically set the active span status.\n */\nfunction registerSpanErrorInstrumentation() {\n if (errorsInstrumented) {\n return;\n }\n\n errorsInstrumented = true;\n addGlobalErrorInstrumentationHandler(errorCallback);\n addGlobalUnhandledRejectionInstrumentationHandler(errorCallback);\n}\n\n/**\n * If an error or unhandled promise occurs, we mark the active root span as failed\n */\nfunction errorCallback() {\n const activeSpan = getActiveSpan();\n const rootSpan = activeSpan && getRootSpan(activeSpan);\n if (rootSpan) {\n const message = 'internal_error';\n DEBUG_BUILD && logger.log(`[Tracing] Root span: ${message} -> Global error occured`);\n rootSpan.setStatus({ code: SPAN_STATUS_ERROR, message });\n }\n}\n\n// The function name will be lost when bundling but we need to be able to identify this listener later to maintain the\n// node.js default exit behaviour\nerrorCallback.tag = 'sentry_tracingErrorCallback';\n\nexport { registerSpanErrorInstrumentation };\n//# sourceMappingURL=errors.js.map\n","import { timestampInSeconds, logger } from '@sentry/utils';\nimport { getClient, getCurrentScope } from '../currentScopes.js';\nimport { DEBUG_BUILD } from '../debug-build.js';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON } from '../semanticAttributes.js';\nimport { hasTracingEnabled } from '../utils/hasTracingEnabled.js';\nimport { _setSpanForScope } from '../utils/spanOnScope.js';\nimport { getActiveSpan, spanTimeInputToSeconds, getSpanDescendants, spanToJSON, removeChildSpanFromSpan } from '../utils/spanUtils.js';\nimport { SentryNonRecordingSpan } from './sentryNonRecordingSpan.js';\nimport { SPAN_STATUS_ERROR } from './spanstatus.js';\nimport { startInactiveSpan } from './trace.js';\n\nconst TRACING_DEFAULTS = {\n idleTimeout: 1000,\n finalTimeout: 30000,\n childSpanTimeout: 15000,\n};\n\nconst FINISH_REASON_HEARTBEAT_FAILED = 'heartbeatFailed';\nconst FINISH_REASON_IDLE_TIMEOUT = 'idleTimeout';\nconst FINISH_REASON_FINAL_TIMEOUT = 'finalTimeout';\nconst FINISH_REASON_EXTERNAL_FINISH = 'externalFinish';\n\n/**\n * An idle span is a span that automatically finishes. It does this by tracking child spans as activities.\n * An idle span is always the active span.\n */\nfunction startIdleSpan(startSpanOptions, options = {}) {\n // Activities store a list of active spans\n const activities = new Map();\n\n // We should not use heartbeat if we finished a span\n let _finished = false;\n\n // Timer that tracks idleTimeout\n let _idleTimeoutID;\n\n // The reason why the span was finished\n let _finishReason = FINISH_REASON_EXTERNAL_FINISH;\n\n let _autoFinishAllowed = !options.disableAutoFinish;\n\n const _cleanupHooks = [];\n\n const {\n idleTimeout = TRACING_DEFAULTS.idleTimeout,\n finalTimeout = TRACING_DEFAULTS.finalTimeout,\n childSpanTimeout = TRACING_DEFAULTS.childSpanTimeout,\n beforeSpanEnd,\n } = options;\n\n const client = getClient();\n\n if (!client || !hasTracingEnabled()) {\n return new SentryNonRecordingSpan();\n }\n\n const scope = getCurrentScope();\n const previousActiveSpan = getActiveSpan();\n const span = _startIdleSpan(startSpanOptions);\n\n // We patch span.end to ensure we can run some things before the span is ended\n // eslint-disable-next-line @typescript-eslint/unbound-method\n span.end = new Proxy(span.end, {\n apply(target, thisArg, args) {\n if (beforeSpanEnd) {\n beforeSpanEnd(span);\n }\n\n // Just ensuring that this keeps working, even if we ever have more arguments here\n const [definedEndTimestamp, ...rest] = args;\n const timestamp = definedEndTimestamp || timestampInSeconds();\n const spanEndTimestamp = spanTimeInputToSeconds(timestamp);\n\n // Ensure we end with the last span timestamp, if possible\n const spans = getSpanDescendants(span).filter(child => child !== span);\n\n // If we have no spans, we just end, nothing else to do here\n if (!spans.length) {\n onIdleSpanEnded(spanEndTimestamp);\n return Reflect.apply(target, thisArg, [spanEndTimestamp, ...rest]);\n }\n\n const childEndTimestamps = spans\n .map(span => spanToJSON(span).timestamp)\n .filter(timestamp => !!timestamp) ;\n const latestSpanEndTimestamp = childEndTimestamps.length ? Math.max(...childEndTimestamps) : undefined;\n\n // In reality this should always exist here, but type-wise it may be undefined...\n const spanStartTimestamp = spanToJSON(span).start_timestamp;\n\n // The final endTimestamp should:\n // * Never be before the span start timestamp\n // * Be the latestSpanEndTimestamp, if there is one, and it is smaller than the passed span end timestamp\n // * Otherwise be the passed end timestamp\n // Final timestamp can never be after finalTimeout\n const endTimestamp = Math.min(\n spanStartTimestamp ? spanStartTimestamp + finalTimeout / 1000 : Infinity,\n Math.max(spanStartTimestamp || -Infinity, Math.min(spanEndTimestamp, latestSpanEndTimestamp || Infinity)),\n );\n\n onIdleSpanEnded(endTimestamp);\n return Reflect.apply(target, thisArg, [endTimestamp, ...rest]);\n },\n });\n\n /**\n * Cancels the existing idle timeout, if there is one.\n */\n function _cancelIdleTimeout() {\n if (_idleTimeoutID) {\n clearTimeout(_idleTimeoutID);\n _idleTimeoutID = undefined;\n }\n }\n\n /**\n * Restarts idle timeout, if there is no running idle timeout it will start one.\n */\n function _restartIdleTimeout(endTimestamp) {\n _cancelIdleTimeout();\n _idleTimeoutID = setTimeout(() => {\n if (!_finished && activities.size === 0 && _autoFinishAllowed) {\n _finishReason = FINISH_REASON_IDLE_TIMEOUT;\n span.end(endTimestamp);\n }\n }, idleTimeout);\n }\n\n /**\n * Restarts child span timeout, if there is none running it will start one.\n */\n function _restartChildSpanTimeout(endTimestamp) {\n _idleTimeoutID = setTimeout(() => {\n if (!_finished && _autoFinishAllowed) {\n _finishReason = FINISH_REASON_HEARTBEAT_FAILED;\n span.end(endTimestamp);\n }\n }, childSpanTimeout);\n }\n\n /**\n * Start tracking a specific activity.\n * @param spanId The span id that represents the activity\n */\n function _pushActivity(spanId) {\n _cancelIdleTimeout();\n activities.set(spanId, true);\n\n const endTimestamp = timestampInSeconds();\n // We need to add the timeout here to have the real endtimestamp of the idle span\n // Remember timestampInSeconds is in seconds, timeout is in ms\n _restartChildSpanTimeout(endTimestamp + childSpanTimeout / 1000);\n }\n\n /**\n * Remove an activity from usage\n * @param spanId The span id that represents the activity\n */\n function _popActivity(spanId) {\n if (activities.has(spanId)) {\n activities.delete(spanId);\n }\n\n if (activities.size === 0) {\n const endTimestamp = timestampInSeconds();\n // We need to add the timeout here to have the real endtimestamp of the idle span\n // Remember timestampInSeconds is in seconds, timeout is in ms\n _restartIdleTimeout(endTimestamp + idleTimeout / 1000);\n }\n }\n\n function onIdleSpanEnded(endTimestamp) {\n _finished = true;\n activities.clear();\n\n _cleanupHooks.forEach(cleanup => cleanup());\n\n _setSpanForScope(scope, previousActiveSpan);\n\n const spanJSON = spanToJSON(span);\n\n const { start_timestamp: startTimestamp } = spanJSON;\n // This should never happen, but to make TS happy...\n if (!startTimestamp) {\n return;\n }\n\n const attributes = spanJSON.data || {};\n if (!attributes[SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON]) {\n span.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON, _finishReason);\n }\n\n logger.log(`[Tracing] Idle span \"${spanJSON.op}\" finished`);\n\n const childSpans = getSpanDescendants(span).filter(child => child !== span);\n\n let discardedSpans = 0;\n childSpans.forEach(childSpan => {\n // We cancel all pending spans with status \"cancelled\" to indicate the idle span was finished early\n if (childSpan.isRecording()) {\n childSpan.setStatus({ code: SPAN_STATUS_ERROR, message: 'cancelled' });\n childSpan.end(endTimestamp);\n DEBUG_BUILD &&\n logger.log('[Tracing] Cancelling span since span ended early', JSON.stringify(childSpan, undefined, 2));\n }\n\n const childSpanJSON = spanToJSON(childSpan);\n const { timestamp: childEndTimestamp = 0, start_timestamp: childStartTimestamp = 0 } = childSpanJSON;\n\n const spanStartedBeforeIdleSpanEnd = childStartTimestamp <= endTimestamp;\n\n // Add a delta with idle timeout so that we prevent false positives\n const timeoutWithMarginOfError = (finalTimeout + idleTimeout) / 1000;\n const spanEndedBeforeFinalTimeout = childEndTimestamp - childStartTimestamp <= timeoutWithMarginOfError;\n\n if (DEBUG_BUILD) {\n const stringifiedSpan = JSON.stringify(childSpan, undefined, 2);\n if (!spanStartedBeforeIdleSpanEnd) {\n logger.log('[Tracing] Discarding span since it happened after idle span was finished', stringifiedSpan);\n } else if (!spanEndedBeforeFinalTimeout) {\n logger.log('[Tracing] Discarding span since it finished after idle span final timeout', stringifiedSpan);\n }\n }\n\n if (!spanEndedBeforeFinalTimeout || !spanStartedBeforeIdleSpanEnd) {\n removeChildSpanFromSpan(span, childSpan);\n discardedSpans++;\n }\n });\n\n if (discardedSpans > 0) {\n span.setAttribute('sentry.idle_span_discarded_spans', discardedSpans);\n }\n }\n\n _cleanupHooks.push(\n client.on('spanStart', startedSpan => {\n // If we already finished the idle span,\n // or if this is the idle span itself being started,\n // or if the started span has already been closed,\n // we don't care about it for activity\n if (_finished || startedSpan === span || !!spanToJSON(startedSpan).timestamp) {\n return;\n }\n\n const allSpans = getSpanDescendants(span);\n\n // If the span that was just started is a child of the idle span, we should track it\n if (allSpans.includes(startedSpan)) {\n _pushActivity(startedSpan.spanContext().spanId);\n }\n }),\n );\n\n _cleanupHooks.push(\n client.on('spanEnd', endedSpan => {\n if (_finished) {\n return;\n }\n\n _popActivity(endedSpan.spanContext().spanId);\n }),\n );\n\n _cleanupHooks.push(\n client.on('idleSpanEnableAutoFinish', spanToAllowAutoFinish => {\n if (spanToAllowAutoFinish === span) {\n _autoFinishAllowed = true;\n _restartIdleTimeout();\n\n if (activities.size) {\n _restartChildSpanTimeout();\n }\n }\n }),\n );\n\n // We only start the initial idle timeout if we are not delaying the auto finish\n if (!options.disableAutoFinish) {\n _restartIdleTimeout();\n }\n\n setTimeout(() => {\n if (!_finished) {\n span.setStatus({ code: SPAN_STATUS_ERROR, message: 'deadline_exceeded' });\n _finishReason = FINISH_REASON_FINAL_TIMEOUT;\n span.end();\n }\n }, finalTimeout);\n\n return span;\n}\n\nfunction _startIdleSpan(options) {\n const span = startInactiveSpan(options);\n\n _setSpanForScope(getCurrentScope(), span);\n\n DEBUG_BUILD && logger.log('[Tracing] Started span is an idle span');\n\n return span;\n}\n\nexport { TRACING_DEFAULTS, startIdleSpan };\n//# sourceMappingURL=idleSpan.js.map\n","/**\n * Checks whether given url points to Sentry server\n *\n * @param url url to verify\n */\nfunction isSentryRequestUrl(url, client) {\n const dsn = client && client.getDsn();\n const tunnel = client && client.getOptions().tunnel;\n return checkDsn(url, dsn) || checkTunnel(url, tunnel);\n}\n\nfunction checkTunnel(url, tunnel) {\n if (!tunnel) {\n return false;\n }\n\n return removeTrailingSlash(url) === removeTrailingSlash(tunnel);\n}\n\nfunction checkDsn(url, dsn) {\n return dsn ? url.includes(dsn.host) : false;\n}\n\nfunction removeTrailingSlash(str) {\n return str[str.length - 1] === '/' ? str.slice(0, -1) : str;\n}\n\nexport { isSentryRequestUrl };\n//# sourceMappingURL=isSentryRequestUrl.js.map\n","import { parseUrl, generateSentryTraceHeader, dynamicSamplingContextToSentryBaggageHeader, isInstanceOf, BAGGAGE_HEADER_NAME } from '@sentry/utils';\nimport { getCurrentScope, getClient, getIsolationScope } from './currentScopes.js';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, SEMANTIC_ATTRIBUTE_SENTRY_OP } from './semanticAttributes.js';\nimport './tracing/errors.js';\nimport './debug-build.js';\nimport { hasTracingEnabled } from './utils/hasTracingEnabled.js';\nimport { getActiveSpan, spanToTraceHeader } from './utils/spanUtils.js';\nimport { SentryNonRecordingSpan } from './tracing/sentryNonRecordingSpan.js';\nimport { setHttpStatus, SPAN_STATUS_ERROR } from './tracing/spanstatus.js';\nimport { startInactiveSpan } from './tracing/trace.js';\nimport { getDynamicSamplingContextFromSpan, getDynamicSamplingContextFromClient } from './tracing/dynamicSamplingContext.js';\n\n/**\n * Create and track fetch request spans for usage in combination with `addFetchInstrumentationHandler`.\n *\n * @returns Span if a span was created, otherwise void.\n */\nfunction instrumentFetchRequest(\n handlerData,\n shouldCreateSpan,\n shouldAttachHeaders,\n spans,\n spanOrigin = 'auto.http.browser',\n) {\n if (!handlerData.fetchData) {\n return undefined;\n }\n\n const shouldCreateSpanResult = hasTracingEnabled() && shouldCreateSpan(handlerData.fetchData.url);\n\n if (handlerData.endTimestamp && shouldCreateSpanResult) {\n const spanId = handlerData.fetchData.__span;\n if (!spanId) return;\n\n const span = spans[spanId];\n if (span) {\n endSpan(span, handlerData);\n\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete spans[spanId];\n }\n return undefined;\n }\n\n const scope = getCurrentScope();\n const client = getClient();\n\n const { method, url } = handlerData.fetchData;\n\n const fullUrl = getFullURL(url);\n const host = fullUrl ? parseUrl(fullUrl).host : undefined;\n\n const hasParent = !!getActiveSpan();\n\n const span =\n shouldCreateSpanResult && hasParent\n ? startInactiveSpan({\n name: `${method} ${url}`,\n attributes: {\n url,\n type: 'fetch',\n 'http.method': method,\n 'http.url': fullUrl,\n 'server.address': host,\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: spanOrigin,\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'http.client',\n },\n })\n : new SentryNonRecordingSpan();\n\n handlerData.fetchData.__span = span.spanContext().spanId;\n spans[span.spanContext().spanId] = span;\n\n if (shouldAttachHeaders(handlerData.fetchData.url) && client) {\n const request = handlerData.args[0];\n\n // In case the user hasn't set the second argument of a fetch call we default it to `{}`.\n handlerData.args[1] = handlerData.args[1] || {};\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const options = handlerData.args[1];\n\n options.headers = addTracingHeadersToFetchRequest(\n request,\n client,\n scope,\n options,\n // If performance is disabled (TWP) or there's no active root span (pageload/navigation/interaction),\n // we do not want to use the span as base for the trace headers,\n // which means that the headers will be generated from the scope and the sampling decision is deferred\n hasTracingEnabled() && hasParent ? span : undefined,\n );\n }\n\n return span;\n}\n\n/**\n * Adds sentry-trace and baggage headers to the various forms of fetch headers\n */\nfunction addTracingHeadersToFetchRequest(\n request, // unknown is actually type Request but we can't export DOM types from this package,\n client,\n scope,\n options\n\n,\n span,\n) {\n const isolationScope = getIsolationScope();\n\n const { traceId, spanId, sampled, dsc } = {\n ...isolationScope.getPropagationContext(),\n ...scope.getPropagationContext(),\n };\n\n const sentryTraceHeader = span ? spanToTraceHeader(span) : generateSentryTraceHeader(traceId, spanId, sampled);\n\n const sentryBaggageHeader = dynamicSamplingContextToSentryBaggageHeader(\n dsc || (span ? getDynamicSamplingContextFromSpan(span) : getDynamicSamplingContextFromClient(traceId, client)),\n );\n\n const headers =\n options.headers ||\n (typeof Request !== 'undefined' && isInstanceOf(request, Request) ? (request ).headers : undefined);\n\n if (!headers) {\n return { 'sentry-trace': sentryTraceHeader, baggage: sentryBaggageHeader };\n } else if (typeof Headers !== 'undefined' && isInstanceOf(headers, Headers)) {\n const newHeaders = new Headers(headers );\n\n newHeaders.append('sentry-trace', sentryTraceHeader);\n\n if (sentryBaggageHeader) {\n // If the same header is appended multiple times the browser will merge the values into a single request header.\n // Its therefore safe to simply push a \"baggage\" entry, even though there might already be another baggage header.\n newHeaders.append(BAGGAGE_HEADER_NAME, sentryBaggageHeader);\n }\n\n return newHeaders ;\n } else if (Array.isArray(headers)) {\n const newHeaders = [...headers, ['sentry-trace', sentryTraceHeader]];\n\n if (sentryBaggageHeader) {\n // If there are multiple entries with the same key, the browser will merge the values into a single request header.\n // Its therefore safe to simply push a \"baggage\" entry, even though there might already be another baggage header.\n newHeaders.push([BAGGAGE_HEADER_NAME, sentryBaggageHeader]);\n }\n\n return newHeaders ;\n } else {\n const existingBaggageHeader = 'baggage' in headers ? headers.baggage : undefined;\n const newBaggageHeaders = [];\n\n if (Array.isArray(existingBaggageHeader)) {\n newBaggageHeaders.push(...existingBaggageHeader);\n } else if (existingBaggageHeader) {\n newBaggageHeaders.push(existingBaggageHeader);\n }\n\n if (sentryBaggageHeader) {\n newBaggageHeaders.push(sentryBaggageHeader);\n }\n\n return {\n ...(headers ),\n 'sentry-trace': sentryTraceHeader,\n baggage: newBaggageHeaders.length > 0 ? newBaggageHeaders.join(',') : undefined,\n };\n }\n}\n\nfunction getFullURL(url) {\n try {\n const parsed = new URL(url);\n return parsed.href;\n } catch (e) {\n return undefined;\n }\n}\n\nfunction endSpan(span, handlerData) {\n if (handlerData.response) {\n setHttpStatus(span, handlerData.response.status);\n\n const contentLength =\n handlerData.response && handlerData.response.headers && handlerData.response.headers.get('content-length');\n\n if (contentLength) {\n const contentLengthNum = parseInt(contentLength);\n if (contentLengthNum > 0) {\n span.setAttribute('http.response_content_length', contentLengthNum);\n }\n }\n } else if (handlerData.error) {\n span.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n }\n span.end();\n}\n\nexport { addTracingHeadersToFetchRequest, instrumentFetchRequest };\n//# sourceMappingURL=fetch.js.map\n","const getRating = (value, thresholds) => {\n if (value > thresholds[1]) {\n return 'poor';\n }\n if (value > thresholds[0]) {\n return 'needs-improvement';\n }\n return 'good';\n};\n\nconst bindReporter = (\n callback,\n metric,\n thresholds,\n reportAllChanges,\n) => {\n let prevValue;\n let delta;\n return (forceReport) => {\n if (metric.value >= 0) {\n if (forceReport || reportAllChanges) {\n delta = metric.value - (prevValue || 0);\n\n // Report the metric if there's a non-zero delta or if no previous\n // value exists (which can happen in the case of the document becoming\n // hidden when the metric value is 0).\n // See: https://github.com/GoogleChrome/web-vitals/issues/14\n if (delta || prevValue === undefined) {\n prevValue = metric.value;\n metric.delta = delta;\n metric.rating = getRating(metric.value, thresholds);\n callback(metric);\n }\n }\n }\n };\n};\n\nexport { bindReporter };\n//# sourceMappingURL=bindReporter.js.map\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Performantly generate a unique, 30-char string by combining a version\n * number, the current timestamp with a 13-digit number integer.\n * @return {string}\n */\nconst generateUniqueID = () => {\n return `v3-${Date.now()}-${Math.floor(Math.random() * (9e12 - 1)) + 1e12}`;\n};\n\nexport { generateUniqueID };\n//# sourceMappingURL=generateUniqueID.js.map\n","import { WINDOW } from '../../../types.js';\n\n/*\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nconst getNavigationEntry = () => {\n return WINDOW.performance && performance.getEntriesByType && performance.getEntriesByType('navigation')[0];\n};\n\nexport { getNavigationEntry };\n//# sourceMappingURL=getNavigationEntry.js.map\n","import { getNavigationEntry } from './getNavigationEntry.js';\n\n/*\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nconst getActivationStart = () => {\n const navEntry = getNavigationEntry();\n return (navEntry && navEntry.activationStart) || 0;\n};\n\nexport { getActivationStart };\n//# sourceMappingURL=getActivationStart.js.map\n","import { WINDOW } from '../../../types.js';\nimport { generateUniqueID } from './generateUniqueID.js';\nimport { getActivationStart } from './getActivationStart.js';\nimport { getNavigationEntry } from './getNavigationEntry.js';\n\n/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nconst initMetric = (name, value) => {\n const navEntry = getNavigationEntry();\n let navigationType = 'navigate';\n\n if (navEntry) {\n if ((WINDOW.document && WINDOW.document.prerendering) || getActivationStart() > 0) {\n navigationType = 'prerender';\n } else if (WINDOW.document && WINDOW.document.wasDiscarded) {\n navigationType = 'restore';\n } else if (navEntry.type) {\n navigationType = navEntry.type.replace(/_/g, '-') ;\n }\n }\n\n // Use `entries` type specific for the metric.\n const entries = [];\n\n return {\n name,\n value: typeof value === 'undefined' ? -1 : value,\n rating: 'good' , // If needed, will be updated when reported. `const` to keep the type from widening to `string`.\n delta: 0,\n entries,\n id: generateUniqueID(),\n navigationType,\n };\n};\n\nexport { initMetric };\n//# sourceMappingURL=initMetric.js.map\n","/**\n * Takes a performance entry type and a callback function, and creates a\n * `PerformanceObserver` instance that will observe the specified entry type\n * with buffering enabled and call the callback _for each entry_.\n *\n * This function also feature-detects entry support and wraps the logic in a\n * try/catch to avoid errors in unsupporting browsers.\n */\nconst observe = (\n type,\n callback,\n opts,\n) => {\n try {\n if (PerformanceObserver.supportedEntryTypes.includes(type)) {\n const po = new PerformanceObserver(list => {\n // Delay by a microtask to workaround a bug in Safari where the\n // callback is invoked immediately, rather than in a separate task.\n // See: https://github.com/GoogleChrome/web-vitals/issues/277\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n Promise.resolve().then(() => {\n callback(list.getEntries() );\n });\n });\n po.observe(\n Object.assign(\n {\n type,\n buffered: true,\n },\n opts || {},\n ) ,\n );\n return po;\n }\n } catch (e) {\n // Do nothing.\n }\n return;\n};\n\nexport { observe };\n//# sourceMappingURL=observe.js.map\n","import { WINDOW } from '../../../types.js';\n\n/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nconst onHidden = (cb) => {\n const onHiddenOrPageHide = (event) => {\n if (event.type === 'pagehide' || (WINDOW.document && WINDOW.document.visibilityState === 'hidden')) {\n cb(event);\n }\n };\n\n if (WINDOW.document) {\n addEventListener('visibilitychange', onHiddenOrPageHide, true);\n // Some browsers have buggy implementations of visibilitychange,\n // so we use pagehide in addition, just to be safe.\n addEventListener('pagehide', onHiddenOrPageHide, true);\n }\n};\n\nexport { onHidden };\n//# sourceMappingURL=onHidden.js.map\n","/*\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst runOnce = (cb) => {\n let called = false;\n return (arg) => {\n if (!called) {\n cb(arg);\n called = true;\n }\n };\n};\n\nexport { runOnce };\n//# sourceMappingURL=runOnce.js.map\n","import { WINDOW } from '../../../types.js';\n\n/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nlet firstHiddenTime = -1;\n\nconst initHiddenTime = () => {\n // If the document is hidden when this code runs, assume it was always\n // hidden and the page was loaded in the background, with the one exception\n // that visibility state is always 'hidden' during prerendering, so we have\n // to ignore that case until prerendering finishes (see: `prerenderingchange`\n // event logic below).\n firstHiddenTime = WINDOW.document.visibilityState === 'hidden' && !WINDOW.document.prerendering ? 0 : Infinity;\n};\n\nconst onVisibilityUpdate = (event) => {\n // If the document is 'hidden' and no previous hidden timestamp has been\n // set, update it based on the current event data.\n if (WINDOW.document.visibilityState === 'hidden' && firstHiddenTime > -1) {\n // If the event is a 'visibilitychange' event, it means the page was\n // visible prior to this change, so the event timestamp is the first\n // hidden time.\n // However, if the event is not a 'visibilitychange' event, then it must\n // be a 'prerenderingchange' event, and the fact that the document is\n // still 'hidden' from the above check means the tab was activated\n // in a background state and so has always been hidden.\n firstHiddenTime = event.type === 'visibilitychange' ? event.timeStamp : 0;\n\n // Remove all listeners now that a `firstHiddenTime` value has been set.\n removeEventListener('visibilitychange', onVisibilityUpdate, true);\n removeEventListener('prerenderingchange', onVisibilityUpdate, true);\n }\n};\n\nconst addChangeListeners = () => {\n addEventListener('visibilitychange', onVisibilityUpdate, true);\n // IMPORTANT: when a page is prerendering, its `visibilityState` is\n // 'hidden', so in order to account for cases where this module checks for\n // visibility during prerendering, an additional check after prerendering\n // completes is also required.\n addEventListener('prerenderingchange', onVisibilityUpdate, true);\n};\n\nconst getVisibilityWatcher = () => {\n if (WINDOW.document && firstHiddenTime < 0) {\n // If the document is hidden when this code runs, assume it was hidden\n // since navigation start. This isn't a perfect heuristic, but it's the\n // best we can do until an API is available to support querying past\n // visibilityState.\n initHiddenTime();\n addChangeListeners();\n }\n return {\n get firstHiddenTime() {\n return firstHiddenTime;\n },\n };\n};\n\nexport { getVisibilityWatcher };\n//# sourceMappingURL=getVisibilityWatcher.js.map\n","import { WINDOW } from '../../../types.js';\n\n/*\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nconst whenActivated = (callback) => {\n if (WINDOW.document && WINDOW.document.prerendering) {\n addEventListener('prerenderingchange', () => callback(), true);\n } else {\n callback();\n }\n};\n\nexport { whenActivated };\n//# sourceMappingURL=whenActivated.js.map\n","import { bindReporter } from './lib/bindReporter.js';\nimport { getActivationStart } from './lib/getActivationStart.js';\nimport { getVisibilityWatcher } from './lib/getVisibilityWatcher.js';\nimport { initMetric } from './lib/initMetric.js';\nimport { observe } from './lib/observe.js';\nimport { whenActivated } from './lib/whenActivated.js';\n\n/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n/** Thresholds for FCP. See https://web.dev/articles/fcp#what_is_a_good_fcp_score */\nconst FCPThresholds = [1800, 3000];\n\n/**\n * Calculates the [FCP](https://web.dev/articles/fcp) value for the current page and\n * calls the `callback` function once the value is ready, along with the\n * relevant `paint` performance entry used to determine the value. The reported\n * value is a `DOMHighResTimeStamp`.\n */\nconst onFCP = (onReport, opts = {}) => {\n whenActivated(() => {\n const visibilityWatcher = getVisibilityWatcher();\n const metric = initMetric('FCP');\n let report;\n\n const handleEntries = (entries) => {\n (entries ).forEach(entry => {\n if (entry.name === 'first-contentful-paint') {\n po.disconnect();\n\n // Only report if the page wasn't hidden prior to the first paint.\n if (entry.startTime < visibilityWatcher.firstHiddenTime) {\n // The activationStart reference is used because FCP should be\n // relative to page activation rather than navigation start if the\n // page was prerendered. But in cases where `activationStart` occurs\n // after the FCP, this time should be clamped at 0.\n metric.value = Math.max(entry.startTime - getActivationStart(), 0);\n metric.entries.push(entry);\n report(true);\n }\n }\n });\n };\n\n const po = observe('paint', handleEntries);\n\n if (po) {\n report = bindReporter(onReport, metric, FCPThresholds, opts.reportAllChanges);\n }\n });\n};\n\nexport { FCPThresholds, onFCP };\n//# sourceMappingURL=onFCP.js.map\n","import { bindReporter } from './lib/bindReporter.js';\nimport { initMetric } from './lib/initMetric.js';\nimport { observe } from './lib/observe.js';\nimport { onHidden } from './lib/onHidden.js';\nimport { runOnce } from './lib/runOnce.js';\nimport { onFCP } from './onFCP.js';\n\n/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n/** Thresholds for CLS. See https://web.dev/articles/cls#what_is_a_good_cls_score */\nconst CLSThresholds = [0.1, 0.25];\n\n/**\n * Calculates the [CLS](https://web.dev/articles/cls) value for the current page and\n * calls the `callback` function once the value is ready to be reported, along\n * with all `layout-shift` performance entries that were used in the metric\n * value calculation. The reported value is a `double` (corresponding to a\n * [layout shift score](https://web.dev/articles/cls#layout_shift_score)).\n *\n * If the `reportAllChanges` configuration option is set to `true`, the\n * `callback` function will be called as soon as the value is initially\n * determined as well as any time the value changes throughout the page\n * lifespan.\n *\n * _**Important:** CLS should be continually monitored for changes throughout\n * the entire lifespan of a page—including if the user returns to the page after\n * it's been hidden/backgrounded. However, since browsers often [will not fire\n * additional callbacks once the user has backgrounded a\n * page](https://developer.chrome.com/blog/page-lifecycle-api/#advice-hidden),\n * `callback` is always called when the page's visibility state changes to\n * hidden. As a result, the `callback` function might be called multiple times\n * during the same page load._\n */\nconst onCLS = (onReport, opts = {}) => {\n // Start monitoring FCP so we can only report CLS if FCP is also reported.\n // Note: this is done to match the current behavior of CrUX.\n onFCP(\n runOnce(() => {\n const metric = initMetric('CLS', 0);\n let report;\n\n let sessionValue = 0;\n let sessionEntries = [];\n\n const handleEntries = (entries) => {\n entries.forEach(entry => {\n // Only count layout shifts without recent user input.\n if (!entry.hadRecentInput) {\n const firstSessionEntry = sessionEntries[0];\n const lastSessionEntry = sessionEntries[sessionEntries.length - 1];\n\n // If the entry occurred less than 1 second after the previous entry\n // and less than 5 seconds after the first entry in the session,\n // include the entry in the current session. Otherwise, start a new\n // session.\n if (\n sessionValue &&\n firstSessionEntry &&\n lastSessionEntry &&\n entry.startTime - lastSessionEntry.startTime < 1000 &&\n entry.startTime - firstSessionEntry.startTime < 5000\n ) {\n sessionValue += entry.value;\n sessionEntries.push(entry);\n } else {\n sessionValue = entry.value;\n sessionEntries = [entry];\n }\n }\n });\n\n // If the current session value is larger than the current CLS value,\n // update CLS and the entries contributing to it.\n if (sessionValue > metric.value) {\n metric.value = sessionValue;\n metric.entries = sessionEntries;\n report();\n }\n };\n\n const po = observe('layout-shift', handleEntries);\n if (po) {\n report = bindReporter(onReport, metric, CLSThresholds, opts.reportAllChanges);\n\n onHidden(() => {\n handleEntries(po.takeRecords() );\n report(true);\n });\n\n // Queue a task to report (if nothing else triggers a report first).\n // This allows CLS to be reported as soon as FCP fires when\n // `reportAllChanges` is true.\n setTimeout(report, 0);\n }\n }),\n );\n};\n\nexport { CLSThresholds, onCLS };\n//# sourceMappingURL=getCLS.js.map\n","import { bindReporter } from './lib/bindReporter.js';\nimport { getVisibilityWatcher } from './lib/getVisibilityWatcher.js';\nimport { initMetric } from './lib/initMetric.js';\nimport { observe } from './lib/observe.js';\nimport { onHidden } from './lib/onHidden.js';\nimport { runOnce } from './lib/runOnce.js';\nimport { whenActivated } from './lib/whenActivated.js';\n\n/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n/** Thresholds for FID. See https://web.dev/articles/fid#what_is_a_good_fid_score */\nconst FIDThresholds = [100, 300];\n\n/**\n * Calculates the [FID](https://web.dev/articles/fid) value for the current page and\n * calls the `callback` function once the value is ready, along with the\n * relevant `first-input` performance entry used to determine the value. The\n * reported value is a `DOMHighResTimeStamp`.\n *\n * _**Important:** since FID is only reported after the user interacts with the\n * page, it's possible that it will not be reported for some page loads._\n */\nconst onFID = (onReport, opts = {}) => {\n whenActivated(() => {\n const visibilityWatcher = getVisibilityWatcher();\n const metric = initMetric('FID');\n // eslint-disable-next-line prefer-const\n let report;\n\n const handleEntry = (entry) => {\n // Only report if the page wasn't hidden prior to the first input.\n if (entry.startTime < visibilityWatcher.firstHiddenTime) {\n metric.value = entry.processingStart - entry.startTime;\n metric.entries.push(entry);\n report(true);\n }\n };\n\n const handleEntries = (entries) => {\n (entries ).forEach(handleEntry);\n };\n\n const po = observe('first-input', handleEntries);\n report = bindReporter(onReport, metric, FIDThresholds, opts.reportAllChanges);\n\n if (po) {\n onHidden(\n runOnce(() => {\n handleEntries(po.takeRecords() );\n po.disconnect();\n }),\n );\n }\n });\n};\n\nexport { FIDThresholds, onFID };\n//# sourceMappingURL=getFID.js.map\n","import { observe } from '../observe.js';\n\nlet interactionCountEstimate = 0;\nlet minKnownInteractionId = Infinity;\nlet maxKnownInteractionId = 0;\n\nconst updateEstimate = (entries) => {\n (entries ).forEach(e => {\n if (e.interactionId) {\n minKnownInteractionId = Math.min(minKnownInteractionId, e.interactionId);\n maxKnownInteractionId = Math.max(maxKnownInteractionId, e.interactionId);\n\n interactionCountEstimate = maxKnownInteractionId ? (maxKnownInteractionId - minKnownInteractionId) / 7 + 1 : 0;\n }\n });\n};\n\nlet po;\n\n/**\n * Returns the `interactionCount` value using the native API (if available)\n * or the polyfill estimate in this module.\n */\nconst getInteractionCount = () => {\n return po ? interactionCountEstimate : performance.interactionCount || 0;\n};\n\n/**\n * Feature detects native support or initializes the polyfill if needed.\n */\nconst initInteractionCountPolyfill = () => {\n if ('interactionCount' in performance || po) return;\n\n po = observe('event', updateEstimate, {\n type: 'event',\n buffered: true,\n durationThreshold: 0,\n } );\n};\n\nexport { getInteractionCount, initInteractionCountPolyfill };\n//# sourceMappingURL=interactionCountPolyfill.js.map\n","import { WINDOW } from '../../types.js';\nimport { bindReporter } from './lib/bindReporter.js';\nimport { initMetric } from './lib/initMetric.js';\nimport { observe } from './lib/observe.js';\nimport { onHidden } from './lib/onHidden.js';\nimport { initInteractionCountPolyfill, getInteractionCount } from './lib/polyfills/interactionCountPolyfill.js';\nimport { whenActivated } from './lib/whenActivated.js';\n\n/*\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n/** Thresholds for INP. See https://web.dev/articles/inp#what_is_a_good_inp_score */\nconst INPThresholds = [200, 500];\n\n// Used to store the interaction count after a bfcache restore, since p98\n// interaction latencies should only consider the current navigation.\nconst prevInteractionCount = 0;\n\n/**\n * Returns the interaction count since the last bfcache restore (or for the\n * full page lifecycle if there were no bfcache restores).\n */\nconst getInteractionCountForNavigation = () => {\n return getInteractionCount() - prevInteractionCount;\n};\n\n// To prevent unnecessary memory usage on pages with lots of interactions,\n// store at most 10 of the longest interactions to consider as INP candidates.\nconst MAX_INTERACTIONS_TO_CONSIDER = 10;\n\n// A list of longest interactions on the page (by latency) sorted so the\n// longest one is first. The list is as most MAX_INTERACTIONS_TO_CONSIDER long.\nconst longestInteractionList = [];\n\n// A mapping of longest interactions by their interaction ID.\n// This is used for faster lookup.\nconst longestInteractionMap = {};\n\n/**\n * Takes a performance entry and adds it to the list of worst interactions\n * if its duration is long enough to make it among the worst. If the\n * entry is part of an existing interaction, it is merged and the latency\n * and entries list is updated as needed.\n */\nconst processEntry = (entry) => {\n // The least-long of the 10 longest interactions.\n const minLongestInteraction = longestInteractionList[longestInteractionList.length - 1];\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const existingInteraction = longestInteractionMap[entry.interactionId];\n\n // Only process the entry if it's possibly one of the ten longest,\n // or if it's part of an existing interaction.\n if (\n existingInteraction ||\n longestInteractionList.length < MAX_INTERACTIONS_TO_CONSIDER ||\n (minLongestInteraction && entry.duration > minLongestInteraction.latency)\n ) {\n // If the interaction already exists, update it. Otherwise create one.\n if (existingInteraction) {\n existingInteraction.entries.push(entry);\n existingInteraction.latency = Math.max(existingInteraction.latency, entry.duration);\n } else {\n const interaction = {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n id: entry.interactionId,\n latency: entry.duration,\n entries: [entry],\n };\n longestInteractionMap[interaction.id] = interaction;\n longestInteractionList.push(interaction);\n }\n\n // Sort the entries by latency (descending) and keep only the top ten.\n longestInteractionList.sort((a, b) => b.latency - a.latency);\n longestInteractionList.splice(MAX_INTERACTIONS_TO_CONSIDER).forEach(i => {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete longestInteractionMap[i.id];\n });\n }\n};\n\n/**\n * Returns the estimated p98 longest interaction based on the stored\n * interaction candidates and the interaction count for the current page.\n */\nconst estimateP98LongestInteraction = () => {\n const candidateInteractionIndex = Math.min(\n longestInteractionList.length - 1,\n Math.floor(getInteractionCountForNavigation() / 50),\n );\n\n return longestInteractionList[candidateInteractionIndex];\n};\n\n/**\n * Calculates the [INP](https://web.dev/articles/inp) value for the current\n * page and calls the `callback` function once the value is ready, along with\n * the `event` performance entries reported for that interaction. The reported\n * value is a `DOMHighResTimeStamp`.\n *\n * A custom `durationThreshold` configuration option can optionally be passed to\n * control what `event-timing` entries are considered for INP reporting. The\n * default threshold is `40`, which means INP scores of less than 40 are\n * reported as 0. Note that this will not affect your 75th percentile INP value\n * unless that value is also less than 40 (well below the recommended\n * [good](https://web.dev/articles/inp#what_is_a_good_inp_score) threshold).\n *\n * If the `reportAllChanges` configuration option is set to `true`, the\n * `callback` function will be called as soon as the value is initially\n * determined as well as any time the value changes throughout the page\n * lifespan.\n *\n * _**Important:** INP should be continually monitored for changes throughout\n * the entire lifespan of a page—including if the user returns to the page after\n * it's been hidden/backgrounded. However, since browsers often [will not fire\n * additional callbacks once the user has backgrounded a\n * page](https://developer.chrome.com/blog/page-lifecycle-api/#advice-hidden),\n * `callback` is always called when the page's visibility state changes to\n * hidden. As a result, the `callback` function might be called multiple times\n * during the same page load._\n */\nconst onINP = (onReport, opts = {}) => {\n whenActivated(() => {\n // TODO(philipwalton): remove once the polyfill is no longer needed.\n initInteractionCountPolyfill();\n\n const metric = initMetric('INP');\n // eslint-disable-next-line prefer-const\n let report;\n\n const handleEntries = (entries) => {\n entries.forEach(entry => {\n if (entry.interactionId) {\n processEntry(entry);\n }\n\n // Entries of type `first-input` don't currently have an `interactionId`,\n // so to consider them in INP we have to first check that an existing\n // entry doesn't match the `duration` and `startTime`.\n // Note that this logic assumes that `event` entries are dispatched\n // before `first-input` entries. This is true in Chrome (the only browser\n // that currently supports INP).\n // TODO(philipwalton): remove once crbug.com/1325826 is fixed.\n if (entry.entryType === 'first-input') {\n const noMatchingEntry = !longestInteractionList.some(interaction => {\n return interaction.entries.some(prevEntry => {\n return entry.duration === prevEntry.duration && entry.startTime === prevEntry.startTime;\n });\n });\n if (noMatchingEntry) {\n processEntry(entry);\n }\n }\n });\n\n const inp = estimateP98LongestInteraction();\n\n if (inp && inp.latency !== metric.value) {\n metric.value = inp.latency;\n metric.entries = inp.entries;\n report();\n }\n };\n\n const po = observe('event', handleEntries, {\n // Event Timing entries have their durations rounded to the nearest 8ms,\n // so a duration of 40ms would be any event that spans 2.5 or more frames\n // at 60Hz. This threshold is chosen to strike a balance between usefulness\n // and performance. Running this callback for any interaction that spans\n // just one or two frames is likely not worth the insight that could be\n // gained.\n durationThreshold: opts.durationThreshold != null ? opts.durationThreshold : 40,\n } );\n\n report = bindReporter(onReport, metric, INPThresholds, opts.reportAllChanges);\n\n if (po) {\n // If browser supports interactionId (and so supports INP), also\n // observe entries of type `first-input`. This is useful in cases\n // where the first interaction is less than the `durationThreshold`.\n if ('PerformanceEventTiming' in WINDOW && 'interactionId' in PerformanceEventTiming.prototype) {\n po.observe({ type: 'first-input', buffered: true });\n }\n\n onHidden(() => {\n handleEntries(po.takeRecords() );\n\n // If the interaction count shows that there were interactions but\n // none were captured by the PerformanceObserver, report a latency of 0.\n if (metric.value < 0 && getInteractionCountForNavigation() > 0) {\n metric.value = 0;\n metric.entries = [];\n }\n\n report(true);\n });\n }\n });\n};\n\nexport { INPThresholds, onINP };\n//# sourceMappingURL=getINP.js.map\n","import { WINDOW } from '../../types.js';\nimport { bindReporter } from './lib/bindReporter.js';\nimport { getActivationStart } from './lib/getActivationStart.js';\nimport { getVisibilityWatcher } from './lib/getVisibilityWatcher.js';\nimport { initMetric } from './lib/initMetric.js';\nimport { observe } from './lib/observe.js';\nimport { onHidden } from './lib/onHidden.js';\nimport { runOnce } from './lib/runOnce.js';\nimport { whenActivated } from './lib/whenActivated.js';\n\n/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n/** Thresholds for LCP. See https://web.dev/articles/lcp#what_is_a_good_lcp_score */\nconst LCPThresholds = [2500, 4000];\n\nconst reportedMetricIDs = {};\n\n/**\n * Calculates the [LCP](https://web.dev/articles/lcp) value for the current page and\n * calls the `callback` function once the value is ready (along with the\n * relevant `largest-contentful-paint` performance entry used to determine the\n * value). The reported value is a `DOMHighResTimeStamp`.\n *\n * If the `reportAllChanges` configuration option is set to `true`, the\n * `callback` function will be called any time a new `largest-contentful-paint`\n * performance entry is dispatched, or once the final value of the metric has\n * been determined.\n */\nconst onLCP = (onReport, opts = {}) => {\n whenActivated(() => {\n const visibilityWatcher = getVisibilityWatcher();\n const metric = initMetric('LCP');\n let report;\n\n const handleEntries = (entries) => {\n const lastEntry = entries[entries.length - 1] ;\n if (lastEntry) {\n // Only report if the page wasn't hidden prior to LCP.\n if (lastEntry.startTime < visibilityWatcher.firstHiddenTime) {\n // The startTime attribute returns the value of the renderTime if it is\n // not 0, and the value of the loadTime otherwise. The activationStart\n // reference is used because LCP should be relative to page activation\n // rather than navigation start if the page was prerendered. But in cases\n // where `activationStart` occurs after the LCP, this time should be\n // clamped at 0.\n metric.value = Math.max(lastEntry.startTime - getActivationStart(), 0);\n metric.entries = [lastEntry];\n report();\n }\n }\n };\n\n const po = observe('largest-contentful-paint', handleEntries);\n\n if (po) {\n report = bindReporter(onReport, metric, LCPThresholds, opts.reportAllChanges);\n\n const stopListening = runOnce(() => {\n if (!reportedMetricIDs[metric.id]) {\n handleEntries(po.takeRecords() );\n po.disconnect();\n reportedMetricIDs[metric.id] = true;\n report(true);\n }\n });\n\n // Stop listening after input. Note: while scrolling is an input that\n // stops LCP observation, it's unreliable since it can be programmatically\n // generated. See: https://github.com/GoogleChrome/web-vitals/issues/75\n ['keydown', 'click'].forEach(type => {\n if (WINDOW.document) {\n // Wrap in a setTimeout so the callback is run in a separate task\n // to avoid extending the keyboard/click handler to reduce INP impact\n // https://github.com/GoogleChrome/web-vitals/issues/383\n addEventListener(type, () => setTimeout(stopListening, 0), true);\n }\n });\n\n onHidden(stopListening);\n }\n });\n};\n\nexport { LCPThresholds, onLCP };\n//# sourceMappingURL=getLCP.js.map\n","import { WINDOW } from '../../types.js';\nimport { bindReporter } from './lib/bindReporter.js';\nimport { getActivationStart } from './lib/getActivationStart.js';\nimport { getNavigationEntry } from './lib/getNavigationEntry.js';\nimport { initMetric } from './lib/initMetric.js';\nimport { whenActivated } from './lib/whenActivated.js';\n\n/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n/** Thresholds for TTFB. See https://web.dev/articles/ttfb#what_is_a_good_ttfb_score */\nconst TTFBThresholds = [800, 1800];\n\n/**\n * Runs in the next task after the page is done loading and/or prerendering.\n * @param callback\n */\nconst whenReady = (callback) => {\n if (WINDOW.document && WINDOW.document.prerendering) {\n whenActivated(() => whenReady(callback));\n } else if (WINDOW.document && WINDOW.document.readyState !== 'complete') {\n addEventListener('load', () => whenReady(callback), true);\n } else {\n // Queue a task so the callback runs after `loadEventEnd`.\n setTimeout(callback, 0);\n }\n};\n\n/**\n * Calculates the [TTFB](https://web.dev/articles/ttfb) value for the\n * current page and calls the `callback` function once the page has loaded,\n * along with the relevant `navigation` performance entry used to determine the\n * value. The reported value is a `DOMHighResTimeStamp`.\n *\n * Note, this function waits until after the page is loaded to call `callback`\n * in order to ensure all properties of the `navigation` entry are populated.\n * This is useful if you want to report on other metrics exposed by the\n * [Navigation Timing API](https://w3c.github.io/navigation-timing/). For\n * example, the TTFB metric starts from the page's [time\n * origin](https://www.w3.org/TR/hr-time-2/#sec-time-origin), which means it\n * includes time spent on DNS lookup, connection negotiation, network latency,\n * and server processing time.\n */\nconst onTTFB = (onReport, opts = {}) => {\n const metric = initMetric('TTFB');\n const report = bindReporter(onReport, metric, TTFBThresholds, opts.reportAllChanges);\n\n whenReady(() => {\n const navEntry = getNavigationEntry();\n\n if (navEntry) {\n const responseStart = navEntry.responseStart;\n\n // In some cases no value is reported by the browser (for\n // privacy/security reasons), and in other cases (bugs) the value is\n // negative or is larger than the current page time. Ignore these cases:\n // https://github.com/GoogleChrome/web-vitals/issues/137\n // https://github.com/GoogleChrome/web-vitals/issues/162\n // https://github.com/GoogleChrome/web-vitals/issues/275\n if (responseStart <= 0 || responseStart > performance.now()) return;\n\n // The activationStart reference is used because TTFB should be\n // relative to page activation rather than navigation start if the\n // page was prerendered. But in cases where `activationStart` occurs\n // after the first byte is received, this time should be clamped at 0.\n metric.value = Math.max(responseStart - getActivationStart(), 0);\n\n metric.entries = [navEntry];\n report(true);\n }\n });\n};\n\nexport { TTFBThresholds, onTTFB };\n//# sourceMappingURL=onTTFB.js.map\n","import { logger, getFunctionName } from '@sentry/utils';\nimport { DEBUG_BUILD } from '../debug-build.js';\nimport { onCLS } from './web-vitals/getCLS.js';\nimport { onFID } from './web-vitals/getFID.js';\nimport { onINP } from './web-vitals/getINP.js';\nimport { onLCP } from './web-vitals/getLCP.js';\nimport { observe } from './web-vitals/lib/observe.js';\nimport { onTTFB } from './web-vitals/onTTFB.js';\n\nconst handlers = {};\nconst instrumented = {};\n\nlet _previousCls;\nlet _previousFid;\nlet _previousLcp;\nlet _previousTtfb;\nlet _previousInp;\n\n/**\n * Add a callback that will be triggered when a CLS metric is available.\n * Returns a cleanup callback which can be called to remove the instrumentation handler.\n *\n * Pass `stopOnCallback = true` to stop listening for CLS when the cleanup callback is called.\n * This will lead to the CLS being finalized and frozen.\n */\nfunction addClsInstrumentationHandler(\n callback,\n stopOnCallback = false,\n) {\n return addMetricObserver('cls', callback, instrumentCls, _previousCls, stopOnCallback);\n}\n\n/**\n * Add a callback that will be triggered when a LCP metric is available.\n * Returns a cleanup callback which can be called to remove the instrumentation handler.\n *\n * Pass `stopOnCallback = true` to stop listening for LCP when the cleanup callback is called.\n * This will lead to the LCP being finalized and frozen.\n */\nfunction addLcpInstrumentationHandler(\n callback,\n stopOnCallback = false,\n) {\n return addMetricObserver('lcp', callback, instrumentLcp, _previousLcp, stopOnCallback);\n}\n\n/**\n * Add a callback that will be triggered when a FID metric is available.\n * Returns a cleanup callback which can be called to remove the instrumentation handler.\n */\nfunction addFidInstrumentationHandler(callback) {\n return addMetricObserver('fid', callback, instrumentFid, _previousFid);\n}\n\n/**\n * Add a callback that will be triggered when a FID metric is available.\n */\nfunction addTtfbInstrumentationHandler(callback) {\n return addMetricObserver('ttfb', callback, instrumentTtfb, _previousTtfb);\n}\n\n/**\n * Add a callback that will be triggered when a INP metric is available.\n * Returns a cleanup callback which can be called to remove the instrumentation handler.\n */\nfunction addInpInstrumentationHandler(\n callback,\n) {\n return addMetricObserver('inp', callback, instrumentInp, _previousInp);\n}\n\n/**\n * Add a callback that will be triggered when a performance observer is triggered,\n * and receives the entries of the observer.\n * Returns a cleanup callback which can be called to remove the instrumentation handler.\n */\nfunction addPerformanceInstrumentationHandler(\n type,\n callback,\n) {\n addHandler(type, callback);\n\n if (!instrumented[type]) {\n instrumentPerformanceObserver(type);\n instrumented[type] = true;\n }\n\n return getCleanupCallback(type, callback);\n}\n\n/** Trigger all handlers of a given type. */\nfunction triggerHandlers(type, data) {\n const typeHandlers = handlers[type];\n\n if (!typeHandlers || !typeHandlers.length) {\n return;\n }\n\n for (const handler of typeHandlers) {\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\nfunction instrumentCls() {\n return onCLS(\n metric => {\n triggerHandlers('cls', {\n metric,\n });\n _previousCls = metric;\n },\n // We want the callback to be called whenever the CLS value updates.\n // By default, the callback is only called when the tab goes to the background.\n { reportAllChanges: true },\n );\n}\n\nfunction instrumentFid() {\n return onFID(metric => {\n triggerHandlers('fid', {\n metric,\n });\n _previousFid = metric;\n });\n}\n\nfunction instrumentLcp() {\n return onLCP(\n metric => {\n triggerHandlers('lcp', {\n metric,\n });\n _previousLcp = metric;\n },\n // We want the callback to be called whenever the LCP value updates.\n // By default, the callback is only called when the tab goes to the background.\n { reportAllChanges: true },\n );\n}\n\nfunction instrumentTtfb() {\n return onTTFB(metric => {\n triggerHandlers('ttfb', {\n metric,\n });\n _previousTtfb = metric;\n });\n}\n\nfunction instrumentInp() {\n return onINP(metric => {\n triggerHandlers('inp', {\n metric,\n });\n _previousInp = metric;\n });\n}\n\nfunction addMetricObserver(\n type,\n callback,\n instrumentFn,\n previousValue,\n stopOnCallback = false,\n) {\n addHandler(type, callback);\n\n let stopListening;\n\n if (!instrumented[type]) {\n stopListening = instrumentFn();\n instrumented[type] = true;\n }\n\n if (previousValue) {\n callback({ metric: previousValue });\n }\n\n return getCleanupCallback(type, callback, stopOnCallback ? stopListening : undefined);\n}\n\nfunction instrumentPerformanceObserver(type) {\n const options = {};\n\n // Special per-type options we want to use\n if (type === 'event') {\n options.durationThreshold = 0;\n }\n\n observe(\n type,\n entries => {\n triggerHandlers(type, { entries });\n },\n options,\n );\n}\n\nfunction addHandler(type, handler) {\n handlers[type] = handlers[type] || [];\n (handlers[type] ).push(handler);\n}\n\n// Get a callback which can be called to remove the instrumentation handler\nfunction getCleanupCallback(\n type,\n callback,\n stopListening,\n) {\n return () => {\n if (stopListening) {\n stopListening();\n }\n\n const typeHandlers = handlers[type];\n\n if (!typeHandlers) {\n return;\n }\n\n const index = typeHandlers.indexOf(callback);\n if (index !== -1) {\n typeHandlers.splice(index, 1);\n }\n };\n}\n\n/**\n * Check if a PerformanceEntry is a PerformanceEventTiming by checking for the `duration` property.\n */\nfunction isPerformanceEventTiming(entry) {\n return 'duration' in entry;\n}\n\nexport { addClsInstrumentationHandler, addFidInstrumentationHandler, addInpInstrumentationHandler, addLcpInstrumentationHandler, addPerformanceInstrumentationHandler, addTtfbInstrumentationHandler, isPerformanceEventTiming };\n//# sourceMappingURL=instrument.js.map\n","import { spanToJSON, withActiveSpan, startInactiveSpan, getClient, getCurrentScope } from '@sentry/core';\nimport { WINDOW } from '../types.js';\n\n/**\n * Checks if a given value is a valid measurement value.\n */\nfunction isMeasurementValue(value) {\n return typeof value === 'number' && isFinite(value);\n}\n\n/**\n * Helper function to start child on transactions. This function will make sure that the transaction will\n * use the start timestamp of the created child span if it is earlier than the transactions actual\n * start timestamp.\n */\nfunction startAndEndSpan(\n parentSpan,\n startTimeInSeconds,\n endTime,\n { ...ctx },\n) {\n const parentStartTime = spanToJSON(parentSpan).start_timestamp;\n if (parentStartTime && parentStartTime > startTimeInSeconds) {\n // We can only do this for SentrySpans...\n if (typeof (parentSpan ).updateStartTime === 'function') {\n (parentSpan ).updateStartTime(startTimeInSeconds);\n }\n }\n\n // The return value only exists for tests\n return withActiveSpan(parentSpan, () => {\n const span = startInactiveSpan({\n startTime: startTimeInSeconds,\n ...ctx,\n });\n\n if (span) {\n span.end(endTime);\n }\n\n return span;\n });\n}\n\n/**\n * Starts an inactive, standalone span used to send web vital values to Sentry.\n * DO NOT use this for arbitrary spans, as these spans require special handling\n * during ingestion to extract metrics.\n *\n * This function adds a bunch of attributes and data to the span that's shared\n * by all web vital standalone spans. However, you need to take care of adding\n * the actual web vital value as an event to the span. Also, you need to assign\n * a transaction name and some other values that are specific to the web vital.\n *\n * Ultimately, you also need to take care of ending the span to send it off.\n *\n * @param options\n *\n * @returns an inactive, standalone and NOT YET ended span\n */\nfunction startStandaloneWebVitalSpan(options) {\n const client = getClient();\n if (!client) {\n return;\n }\n\n const { name, transaction, attributes: passedAttributes, startTime } = options;\n\n const { release, environment } = client.getOptions();\n // We need to get the replay, user, and activeTransaction from the current scope\n // so that we can associate replay id, profile id, and a user display to the span\n const replay = client.getIntegrationByName('Replay');\n const replayId = replay && replay.getReplayId();\n\n const scope = getCurrentScope();\n\n const user = scope.getUser();\n const userDisplay = user !== undefined ? user.email || user.id || user.ip_address : undefined;\n\n let profileId;\n try {\n // @ts-expect-error skip optional chaining to save bundle size with try catch\n profileId = scope.getScopeData().contexts.profile.profile_id;\n } catch (e) {\n // do nothing\n }\n\n const attributes = {\n release,\n environment,\n\n user: userDisplay || undefined,\n profile_id: profileId || undefined,\n replay_id: replayId || undefined,\n\n transaction,\n\n // Web vital score calculation relies on the user agent to account for different\n // browsers setting different thresholds for what is considered a good/meh/bad value.\n // For example: Chrome vs. Chrome Mobile\n 'user_agent.original': WINDOW.navigator && WINDOW.navigator.userAgent,\n\n ...passedAttributes,\n };\n\n return startInactiveSpan({\n name,\n attributes,\n startTime,\n experimental: {\n standalone: true,\n },\n });\n}\n\n/** Get the browser performance API. */\nfunction getBrowserPerformanceAPI() {\n // @ts-expect-error we want to make sure all of these are available, even if TS is sure they are\n return WINDOW && WINDOW.addEventListener && WINDOW.performance;\n}\n\n/**\n * Converts from milliseconds to seconds\n * @param time time in ms\n */\nfunction msToSec(time) {\n return time / 1000;\n}\n\nexport { getBrowserPerformanceAPI, isMeasurementValue, msToSec, startAndEndSpan, startStandaloneWebVitalSpan };\n//# sourceMappingURL=utils.js.map\n","import { _optionalChain } from '@sentry/utils';\nimport { getClient, getActiveSpan, getRootSpan, spanToJSON, getCurrentScope, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME, SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT, SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE } from '@sentry/core';\nimport { logger, browserPerformanceTimeOrigin, htmlTreeAsString, dropUndefinedKeys } from '@sentry/utils';\nimport { DEBUG_BUILD } from '../debug-build.js';\nimport { addClsInstrumentationHandler } from './instrument.js';\nimport { msToSec, startStandaloneWebVitalSpan } from './utils.js';\nimport { onHidden } from './web-vitals/lib/onHidden.js';\n\n/**\n * Starts tracking the Cumulative Layout Shift on the current page and collects the value once\n *\n * - the page visibility is hidden\n * - a navigation span is started (to stop CLS measurement for SPA soft navigations)\n *\n * Once either of these events triggers, the CLS value is sent as a standalone span and we stop\n * measuring CLS.\n */\nfunction trackClsAsStandaloneSpan() {\n let standaloneCLsValue = 0;\n let standaloneClsEntry;\n let pageloadSpanId;\n\n if (!supportsLayoutShift()) {\n return;\n }\n\n let sentSpan = false;\n function _collectClsOnce() {\n if (sentSpan) {\n return;\n }\n sentSpan = true;\n if (pageloadSpanId) {\n sendStandaloneClsSpan(standaloneCLsValue, standaloneClsEntry, pageloadSpanId);\n }\n cleanupClsHandler();\n }\n\n const cleanupClsHandler = addClsInstrumentationHandler(({ metric }) => {\n const entry = metric.entries[metric.entries.length - 1] ;\n if (!entry) {\n return;\n }\n standaloneCLsValue = metric.value;\n standaloneClsEntry = entry;\n }, true);\n\n // use pagehide event from web-vitals\n onHidden(() => {\n _collectClsOnce();\n });\n\n // Since the call chain of this function is synchronous and evaluates before the SDK client is created,\n // we need to wait with subscribing to a client hook until the client is created. Therefore, we defer\n // to the next tick after the SDK setup.\n setTimeout(() => {\n const client = getClient();\n\n const unsubscribeStartNavigation = _optionalChain([client, 'optionalAccess', _ => _.on, 'call', _2 => _2('startNavigationSpan', () => {\n _collectClsOnce();\n unsubscribeStartNavigation && unsubscribeStartNavigation();\n })]);\n\n const activeSpan = getActiveSpan();\n const rootSpan = activeSpan && getRootSpan(activeSpan);\n const spanJSON = rootSpan && spanToJSON(rootSpan);\n if (spanJSON && spanJSON.op === 'pageload') {\n pageloadSpanId = rootSpan.spanContext().spanId;\n }\n }, 0);\n}\n\nfunction sendStandaloneClsSpan(clsValue, entry, pageloadSpanId) {\n DEBUG_BUILD && logger.log(`Sending CLS span (${clsValue})`);\n\n const startTime = msToSec((browserPerformanceTimeOrigin || 0) + (_optionalChain([entry, 'optionalAccess', _3 => _3.startTime]) || 0));\n const routeName = getCurrentScope().getScopeData().transactionName;\n\n const name = entry ? htmlTreeAsString(_optionalChain([entry, 'access', _4 => _4.sources, 'access', _5 => _5[0], 'optionalAccess', _6 => _6.node])) : 'Layout shift';\n\n const attributes = dropUndefinedKeys({\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.browser.cls',\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'ui.webvital.cls',\n [SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME]: _optionalChain([entry, 'optionalAccess', _7 => _7.duration]) || 0,\n // attach the pageload span id to the CLS span so that we can link them in the UI\n 'sentry.pageload.span_id': pageloadSpanId,\n });\n\n const span = startStandaloneWebVitalSpan({\n name,\n transaction: routeName,\n attributes,\n startTime,\n });\n\n _optionalChain([span, 'optionalAccess', _8 => _8.addEvent, 'call', _9 => _9('cls', {\n [SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT]: '',\n [SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE]: clsValue,\n })]);\n\n // LayoutShift performance entries always have a duration of 0, so we don't need to add `entry.duration` here\n // see: https://developer.mozilla.org/en-US/docs/Web/API/PerformanceEntry/duration\n _optionalChain([span, 'optionalAccess', _10 => _10.end, 'call', _11 => _11(startTime)]);\n}\n\nfunction supportsLayoutShift() {\n try {\n return _optionalChain([PerformanceObserver, 'access', _12 => _12.supportedEntryTypes, 'optionalAccess', _13 => _13.includes, 'call', _14 => _14('layout-shift')]);\n } catch (e) {\n return false;\n }\n}\n\nexport { trackClsAsStandaloneSpan };\n//# sourceMappingURL=cls.js.map\n","import { getActiveSpan, startInactiveSpan, spanToJSON, setMeasurement, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/core';\nimport { browserPerformanceTimeOrigin, logger, parseUrl, htmlTreeAsString, getComponentName } from '@sentry/utils';\nimport { DEBUG_BUILD } from '../debug-build.js';\nimport { WINDOW } from '../types.js';\nimport { trackClsAsStandaloneSpan } from './cls.js';\nimport { addPerformanceInstrumentationHandler, addClsInstrumentationHandler, addLcpInstrumentationHandler, addFidInstrumentationHandler, addTtfbInstrumentationHandler } from './instrument.js';\nimport { getBrowserPerformanceAPI, msToSec, startAndEndSpan, isMeasurementValue } from './utils.js';\nimport { getActivationStart } from './web-vitals/lib/getActivationStart.js';\nimport { getNavigationEntry } from './web-vitals/lib/getNavigationEntry.js';\nimport { getVisibilityWatcher } from './web-vitals/lib/getVisibilityWatcher.js';\n\n/* eslint-disable max-lines */\n\nconst MAX_INT_AS_BYTES = 2147483647;\n\nlet _performanceCursor = 0;\n\nlet _measurements = {};\nlet _lcpEntry;\nlet _clsEntry;\n\n/**\n * Start tracking web vitals.\n * The callback returned by this function can be used to stop tracking & ensure all measurements are final & captured.\n *\n * @returns A function that forces web vitals collection\n */\nfunction startTrackingWebVitals({ recordClsStandaloneSpans }) {\n const performance = getBrowserPerformanceAPI();\n if (performance && browserPerformanceTimeOrigin) {\n // @ts-expect-error we want to make sure all of these are available, even if TS is sure they are\n if (performance.mark) {\n WINDOW.performance.mark('sentry-tracing-init');\n }\n const fidCleanupCallback = _trackFID();\n const lcpCleanupCallback = _trackLCP();\n const ttfbCleanupCallback = _trackTtfb();\n const clsCleanupCallback = recordClsStandaloneSpans ? trackClsAsStandaloneSpan() : _trackCLS();\n\n return () => {\n fidCleanupCallback();\n lcpCleanupCallback();\n ttfbCleanupCallback();\n clsCleanupCallback && clsCleanupCallback();\n };\n }\n\n return () => undefined;\n}\n\n/**\n * Start tracking long tasks.\n */\nfunction startTrackingLongTasks() {\n addPerformanceInstrumentationHandler('longtask', ({ entries }) => {\n if (!getActiveSpan()) {\n return;\n }\n for (const entry of entries) {\n const startTime = msToSec((browserPerformanceTimeOrigin ) + entry.startTime);\n const duration = msToSec(entry.duration);\n\n const span = startInactiveSpan({\n name: 'Main UI thread blocked',\n op: 'ui.long-task',\n startTime,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.browser.metrics',\n },\n });\n if (span) {\n span.end(startTime + duration);\n }\n }\n });\n}\n\n/**\n * Start tracking long animation frames.\n */\nfunction startTrackingLongAnimationFrames() {\n // NOTE: the current web-vitals version (3.5.2) does not support long-animation-frame, so\n // we directly observe `long-animation-frame` events instead of through the web-vitals\n // `observe` helper function.\n const observer = new PerformanceObserver(list => {\n if (!getActiveSpan()) {\n return;\n }\n for (const entry of list.getEntries() ) {\n if (!entry.scripts[0]) {\n continue;\n }\n\n const startTime = msToSec((browserPerformanceTimeOrigin ) + entry.startTime);\n const duration = msToSec(entry.duration);\n\n const attributes = {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.browser.metrics',\n };\n\n const initialScript = entry.scripts[0];\n const { invoker, invokerType, sourceURL, sourceFunctionName, sourceCharPosition } = initialScript;\n attributes['browser.script.invoker'] = invoker;\n attributes['browser.script.invoker_type'] = invokerType;\n if (sourceURL) {\n attributes['code.filepath'] = sourceURL;\n }\n if (sourceFunctionName) {\n attributes['code.function'] = sourceFunctionName;\n }\n if (sourceCharPosition !== -1) {\n attributes['browser.script.source_char_position'] = sourceCharPosition;\n }\n\n const span = startInactiveSpan({\n name: 'Main UI thread blocked',\n op: 'ui.long-animation-frame',\n startTime,\n attributes,\n });\n if (span) {\n span.end(startTime + duration);\n }\n }\n });\n\n observer.observe({ type: 'long-animation-frame', buffered: true });\n}\n\n/**\n * Start tracking interaction events.\n */\nfunction startTrackingInteractions() {\n addPerformanceInstrumentationHandler('event', ({ entries }) => {\n if (!getActiveSpan()) {\n return;\n }\n for (const entry of entries) {\n if (entry.name === 'click') {\n const startTime = msToSec((browserPerformanceTimeOrigin ) + entry.startTime);\n const duration = msToSec(entry.duration);\n\n const spanOptions = {\n name: htmlTreeAsString(entry.target),\n op: `ui.interaction.${entry.name}`,\n startTime: startTime,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.browser.metrics',\n },\n };\n\n const componentName = getComponentName(entry.target);\n if (componentName) {\n spanOptions.attributes['ui.component_name'] = componentName;\n }\n\n const span = startInactiveSpan(spanOptions);\n if (span) {\n span.end(startTime + duration);\n }\n }\n }\n });\n}\n\n/**\n * Starts tracking the Cumulative Layout Shift on the current page and collects the value and last entry\n * to the `_measurements` object which ultimately is applied to the pageload span's measurements.\n */\nfunction _trackCLS() {\n return addClsInstrumentationHandler(({ metric }) => {\n const entry = metric.entries[metric.entries.length - 1] ;\n if (!entry) {\n return;\n }\n DEBUG_BUILD && logger.log(`[Measurements] Adding CLS ${metric.value}`);\n _measurements['cls'] = { value: metric.value, unit: '' };\n _clsEntry = entry;\n }, true);\n}\n\n/** Starts tracking the Largest Contentful Paint on the current page. */\nfunction _trackLCP() {\n return addLcpInstrumentationHandler(({ metric }) => {\n const entry = metric.entries[metric.entries.length - 1];\n if (!entry) {\n return;\n }\n\n DEBUG_BUILD && logger.log('[Measurements] Adding LCP');\n _measurements['lcp'] = { value: metric.value, unit: 'millisecond' };\n _lcpEntry = entry ;\n }, true);\n}\n\n/** Starts tracking the First Input Delay on the current page. */\nfunction _trackFID() {\n return addFidInstrumentationHandler(({ metric }) => {\n const entry = metric.entries[metric.entries.length - 1];\n if (!entry) {\n return;\n }\n\n const timeOrigin = msToSec(browserPerformanceTimeOrigin );\n const startTime = msToSec(entry.startTime);\n DEBUG_BUILD && logger.log('[Measurements] Adding FID');\n _measurements['fid'] = { value: metric.value, unit: 'millisecond' };\n _measurements['mark.fid'] = { value: timeOrigin + startTime, unit: 'second' };\n });\n}\n\nfunction _trackTtfb() {\n return addTtfbInstrumentationHandler(({ metric }) => {\n const entry = metric.entries[metric.entries.length - 1];\n if (!entry) {\n return;\n }\n\n DEBUG_BUILD && logger.log('[Measurements] Adding TTFB');\n _measurements['ttfb'] = { value: metric.value, unit: 'millisecond' };\n });\n}\n\n/** Add performance related spans to a transaction */\nfunction addPerformanceEntries(span, options) {\n const performance = getBrowserPerformanceAPI();\n if (!performance || !WINDOW.performance.getEntries || !browserPerformanceTimeOrigin) {\n // Gatekeeper if performance API not available\n return;\n }\n\n DEBUG_BUILD && logger.log('[Tracing] Adding & adjusting spans using Performance API');\n const timeOrigin = msToSec(browserPerformanceTimeOrigin);\n\n const performanceEntries = performance.getEntries();\n\n const { op, start_timestamp: transactionStartTime } = spanToJSON(span);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n performanceEntries.slice(_performanceCursor).forEach((entry) => {\n const startTime = msToSec(entry.startTime);\n const duration = msToSec(\n // Inexplicably, Chrome sometimes emits a negative duration. We need to work around this.\n // There is a SO post attempting to explain this, but it leaves one with open questions: https://stackoverflow.com/questions/23191918/peformance-getentries-and-negative-duration-display\n // The way we clamp the value is probably not accurate, since we have observed this happen for things that may take a while to load, like for example the replay worker.\n // TODO: Investigate why this happens and how to properly mitigate. For now, this is a workaround to prevent transactions being dropped due to negative duration spans.\n Math.max(0, entry.duration),\n );\n\n if (op === 'navigation' && transactionStartTime && timeOrigin + startTime < transactionStartTime) {\n return;\n }\n\n switch (entry.entryType) {\n case 'navigation': {\n _addNavigationSpans(span, entry, timeOrigin);\n break;\n }\n case 'mark':\n case 'paint':\n case 'measure': {\n _addMeasureSpans(span, entry, startTime, duration, timeOrigin);\n\n // capture web vitals\n const firstHidden = getVisibilityWatcher();\n // Only report if the page wasn't hidden prior to the web vital.\n const shouldRecord = entry.startTime < firstHidden.firstHiddenTime;\n\n if (entry.name === 'first-paint' && shouldRecord) {\n DEBUG_BUILD && logger.log('[Measurements] Adding FP');\n _measurements['fp'] = { value: entry.startTime, unit: 'millisecond' };\n }\n if (entry.name === 'first-contentful-paint' && shouldRecord) {\n DEBUG_BUILD && logger.log('[Measurements] Adding FCP');\n _measurements['fcp'] = { value: entry.startTime, unit: 'millisecond' };\n }\n break;\n }\n case 'resource': {\n _addResourceSpans(span, entry, entry.name , startTime, duration, timeOrigin);\n break;\n }\n // Ignore other entry types.\n }\n });\n\n _performanceCursor = Math.max(performanceEntries.length - 1, 0);\n\n _trackNavigator(span);\n\n // Measurements are only available for pageload transactions\n if (op === 'pageload') {\n _addTtfbRequestTimeToMeasurements(_measurements);\n\n const fidMark = _measurements['mark.fid'];\n if (fidMark && _measurements['fid']) {\n // create span for FID\n startAndEndSpan(span, fidMark.value, fidMark.value + msToSec(_measurements['fid'].value), {\n name: 'first input delay',\n op: 'ui.action',\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.browser.metrics',\n },\n });\n\n // Delete mark.fid as we don't want it to be part of final payload\n delete _measurements['mark.fid'];\n }\n\n // If FCP is not recorded we should not record the cls value\n // according to the new definition of CLS.\n // TODO: Check if the first condition is still necessary: `onCLS` already only fires once `onFCP` was called.\n if (!('fcp' in _measurements) || !options.recordClsOnPageloadSpan) {\n delete _measurements.cls;\n }\n\n Object.entries(_measurements).forEach(([measurementName, measurement]) => {\n setMeasurement(measurementName, measurement.value, measurement.unit);\n });\n\n // Set timeOrigin which denotes the timestamp which to base the LCP/FCP/FP/TTFB measurements on\n span.setAttribute('performance.timeOrigin', timeOrigin);\n\n // In prerendering scenarios, where a page might be prefetched and pre-rendered before the user clicks the link,\n // the navigation starts earlier than when the user clicks it. Web Vitals should always be based on the\n // user-perceived time, so they are not reported from the actual start of the navigation, but rather from the\n // time where the user actively started the navigation, for example by clicking a link.\n // This is user action is called \"activation\" and the time between navigation and activation is stored in\n // the `activationStart` attribute of the \"navigation\" PerformanceEntry.\n span.setAttribute('performance.activationStart', getActivationStart());\n\n _setWebVitalAttributes(span);\n }\n\n _lcpEntry = undefined;\n _clsEntry = undefined;\n _measurements = {};\n}\n\n/** Create measure related spans */\nfunction _addMeasureSpans(\n span,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n entry,\n startTime,\n duration,\n timeOrigin,\n) {\n const navEntry = getNavigationEntry();\n const requestTime = msToSec(navEntry ? navEntry.requestStart : 0);\n // Because performance.measure accepts arbitrary timestamps it can produce\n // spans that happen before the browser even makes a request for the page.\n //\n // An example of this is the automatically generated Next.js-before-hydration\n // spans created by the Next.js framework.\n //\n // To prevent this we will pin the start timestamp to the request start time\n // This does make duration inaccruate, so if this does happen, we will add\n // an attribute to the span\n const measureStartTimestamp = timeOrigin + Math.max(startTime, requestTime);\n const startTimeStamp = timeOrigin + startTime;\n const measureEndTimestamp = startTimeStamp + duration;\n\n const attributes = {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.resource.browser.metrics',\n };\n\n if (measureStartTimestamp !== startTimeStamp) {\n attributes['sentry.browser.measure_happened_before_request'] = true;\n attributes['sentry.browser.measure_start_time'] = measureStartTimestamp;\n }\n\n startAndEndSpan(span, measureStartTimestamp, measureEndTimestamp, {\n name: entry.name ,\n op: entry.entryType ,\n attributes,\n });\n\n return measureStartTimestamp;\n}\n\n/** Instrument navigation entries */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _addNavigationSpans(span, entry, timeOrigin) {\n ['unloadEvent', 'redirect', 'domContentLoadedEvent', 'loadEvent', 'connect'].forEach(event => {\n _addPerformanceNavigationTiming(span, entry, event, timeOrigin);\n });\n _addPerformanceNavigationTiming(span, entry, 'secureConnection', timeOrigin, 'TLS/SSL', 'connectEnd');\n _addPerformanceNavigationTiming(span, entry, 'fetch', timeOrigin, 'cache', 'domainLookupStart');\n _addPerformanceNavigationTiming(span, entry, 'domainLookup', timeOrigin, 'DNS');\n _addRequest(span, entry, timeOrigin);\n}\n\n/** Create performance navigation related spans */\nfunction _addPerformanceNavigationTiming(\n span,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n entry,\n event,\n timeOrigin,\n name,\n eventEnd,\n) {\n const end = eventEnd ? (entry[eventEnd] ) : (entry[`${event}End`] );\n const start = entry[`${event}Start`] ;\n if (!start || !end) {\n return;\n }\n startAndEndSpan(span, timeOrigin + msToSec(start), timeOrigin + msToSec(end), {\n op: `browser.${name || event}`,\n name: entry.name,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.browser.metrics',\n },\n });\n}\n\n/** Create request and response related spans */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _addRequest(span, entry, timeOrigin) {\n const requestStartTimestamp = timeOrigin + msToSec(entry.requestStart );\n const responseEndTimestamp = timeOrigin + msToSec(entry.responseEnd );\n const responseStartTimestamp = timeOrigin + msToSec(entry.responseStart );\n if (entry.responseEnd) {\n // It is possible that we are collecting these metrics when the page hasn't finished loading yet, for example when the HTML slowly streams in.\n // In this case, ie. when the document request hasn't finished yet, `entry.responseEnd` will be 0.\n // In order not to produce faulty spans, where the end timestamp is before the start timestamp, we will only collect\n // these spans when the responseEnd value is available. The backend (Relay) would drop the entire span if it contained faulty spans.\n startAndEndSpan(span, requestStartTimestamp, responseEndTimestamp, {\n op: 'browser.request',\n name: entry.name,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.browser.metrics',\n },\n });\n\n startAndEndSpan(span, responseStartTimestamp, responseEndTimestamp, {\n op: 'browser.response',\n name: entry.name,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.browser.metrics',\n },\n });\n }\n}\n\n/** Create resource-related spans */\nfunction _addResourceSpans(\n span,\n entry,\n resourceUrl,\n startTime,\n duration,\n timeOrigin,\n) {\n // we already instrument based on fetch and xhr, so we don't need to\n // duplicate spans here.\n if (entry.initiatorType === 'xmlhttprequest' || entry.initiatorType === 'fetch') {\n return;\n }\n\n const parsedUrl = parseUrl(resourceUrl);\n\n const attributes = {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.resource.browser.metrics',\n };\n setResourceEntrySizeData(attributes, entry, 'transferSize', 'http.response_transfer_size');\n setResourceEntrySizeData(attributes, entry, 'encodedBodySize', 'http.response_content_length');\n setResourceEntrySizeData(attributes, entry, 'decodedBodySize', 'http.decoded_response_content_length');\n\n if ('renderBlockingStatus' in entry) {\n attributes['resource.render_blocking_status'] = entry.renderBlockingStatus;\n }\n if (parsedUrl.protocol) {\n attributes['url.scheme'] = parsedUrl.protocol.split(':').pop(); // the protocol returned by parseUrl includes a :, but OTEL spec does not, so we remove it.\n }\n\n if (parsedUrl.host) {\n attributes['server.address'] = parsedUrl.host;\n }\n\n attributes['url.same_origin'] = resourceUrl.includes(WINDOW.location.origin);\n\n const startTimestamp = timeOrigin + startTime;\n const endTimestamp = startTimestamp + duration;\n\n startAndEndSpan(span, startTimestamp, endTimestamp, {\n name: resourceUrl.replace(WINDOW.location.origin, ''),\n op: entry.initiatorType ? `resource.${entry.initiatorType}` : 'resource.other',\n attributes,\n });\n}\n\n/**\n * Capture the information of the user agent.\n */\nfunction _trackNavigator(span) {\n const navigator = WINDOW.navigator ;\n if (!navigator) {\n return;\n }\n\n // track network connectivity\n const connection = navigator.connection;\n if (connection) {\n if (connection.effectiveType) {\n span.setAttribute('effectiveConnectionType', connection.effectiveType);\n }\n\n if (connection.type) {\n span.setAttribute('connectionType', connection.type);\n }\n\n if (isMeasurementValue(connection.rtt)) {\n _measurements['connection.rtt'] = { value: connection.rtt, unit: 'millisecond' };\n }\n }\n\n if (isMeasurementValue(navigator.deviceMemory)) {\n span.setAttribute('deviceMemory', `${navigator.deviceMemory} GB`);\n }\n\n if (isMeasurementValue(navigator.hardwareConcurrency)) {\n span.setAttribute('hardwareConcurrency', String(navigator.hardwareConcurrency));\n }\n}\n\n/** Add LCP / CLS data to span to allow debugging */\nfunction _setWebVitalAttributes(span) {\n if (_lcpEntry) {\n DEBUG_BUILD && logger.log('[Measurements] Adding LCP Data');\n\n // Capture Properties of the LCP element that contributes to the LCP.\n\n if (_lcpEntry.element) {\n span.setAttribute('lcp.element', htmlTreeAsString(_lcpEntry.element));\n }\n\n if (_lcpEntry.id) {\n span.setAttribute('lcp.id', _lcpEntry.id);\n }\n\n if (_lcpEntry.url) {\n // Trim URL to the first 200 characters.\n span.setAttribute('lcp.url', _lcpEntry.url.trim().slice(0, 200));\n }\n\n span.setAttribute('lcp.size', _lcpEntry.size);\n }\n\n // See: https://developer.mozilla.org/en-US/docs/Web/API/LayoutShift\n if (_clsEntry && _clsEntry.sources) {\n DEBUG_BUILD && logger.log('[Measurements] Adding CLS Data');\n _clsEntry.sources.forEach((source, index) =>\n span.setAttribute(`cls.source.${index + 1}`, htmlTreeAsString(source.node)),\n );\n }\n}\n\nfunction setResourceEntrySizeData(\n attributes,\n entry,\n key,\n dataKey,\n) {\n const entryVal = entry[key];\n if (entryVal != null && entryVal < MAX_INT_AS_BYTES) {\n attributes[dataKey] = entryVal;\n }\n}\n\n/**\n * Add ttfb request time information to measurements.\n *\n * ttfb information is added via vendored web vitals library.\n */\nfunction _addTtfbRequestTimeToMeasurements(_measurements) {\n const navEntry = getNavigationEntry();\n if (!navEntry) {\n return;\n }\n\n const { responseStart, requestStart } = navEntry;\n\n if (requestStart <= responseStart) {\n DEBUG_BUILD && logger.log('[Measurements] Adding TTFB Request Time');\n _measurements['ttfb.requestTime'] = {\n value: responseStart - requestStart,\n unit: 'millisecond',\n };\n }\n}\n\nexport { _addMeasureSpans, _addResourceSpans, addPerformanceEntries, startTrackingInteractions, startTrackingLongAnimationFrames, startTrackingLongTasks, startTrackingWebVitals };\n//# sourceMappingURL=browserMetrics.js.map\n","import { _optionalChain } from '@sentry/utils';\nimport { getActiveSpan, getRootSpan, spanToJSON, getCurrentScope, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME, SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT, SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE } from '@sentry/core';\nimport { browserPerformanceTimeOrigin, htmlTreeAsString, dropUndefinedKeys } from '@sentry/utils';\nimport { addInpInstrumentationHandler, addPerformanceInstrumentationHandler, isPerformanceEventTiming } from './instrument.js';\nimport { getBrowserPerformanceAPI, msToSec, startStandaloneWebVitalSpan } from './utils.js';\n\nconst LAST_INTERACTIONS = [];\nconst INTERACTIONS_SPAN_MAP = new Map();\n\n/**\n * Start tracking INP webvital events.\n */\nfunction startTrackingINP() {\n const performance = getBrowserPerformanceAPI();\n if (performance && browserPerformanceTimeOrigin) {\n const inpCallback = _trackINP();\n\n return () => {\n inpCallback();\n };\n }\n\n return () => undefined;\n}\n\nconst INP_ENTRY_MAP = {\n click: 'click',\n pointerdown: 'click',\n pointerup: 'click',\n mousedown: 'click',\n mouseup: 'click',\n touchstart: 'click',\n touchend: 'click',\n mouseover: 'hover',\n mouseout: 'hover',\n mouseenter: 'hover',\n mouseleave: 'hover',\n pointerover: 'hover',\n pointerout: 'hover',\n pointerenter: 'hover',\n pointerleave: 'hover',\n dragstart: 'drag',\n dragend: 'drag',\n drag: 'drag',\n dragenter: 'drag',\n dragleave: 'drag',\n dragover: 'drag',\n drop: 'drag',\n keydown: 'press',\n keyup: 'press',\n keypress: 'press',\n input: 'press',\n};\n\n/** Starts tracking the Interaction to Next Paint on the current page. */\nfunction _trackINP() {\n return addInpInstrumentationHandler(({ metric }) => {\n if (metric.value == undefined) {\n return;\n }\n\n const entry = metric.entries.find(entry => entry.duration === metric.value && INP_ENTRY_MAP[entry.name]);\n\n if (!entry) {\n return;\n }\n\n const { interactionId } = entry;\n const interactionType = INP_ENTRY_MAP[entry.name];\n\n /** Build the INP span, create an envelope from the span, and then send the envelope */\n const startTime = msToSec((browserPerformanceTimeOrigin ) + entry.startTime);\n const duration = msToSec(metric.value);\n const activeSpan = getActiveSpan();\n const rootSpan = activeSpan ? getRootSpan(activeSpan) : undefined;\n\n // We first try to lookup the span from our INTERACTIONS_SPAN_MAP,\n // where we cache the route per interactionId\n const cachedSpan = interactionId != null ? INTERACTIONS_SPAN_MAP.get(interactionId) : undefined;\n\n const spanToUse = cachedSpan || rootSpan;\n\n // Else, we try to use the active span.\n // Finally, we fall back to look at the transactionName on the scope\n const routeName = spanToUse ? spanToJSON(spanToUse).description : getCurrentScope().getScopeData().transactionName;\n\n const name = htmlTreeAsString(entry.target);\n const attributes = dropUndefinedKeys({\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.browser.inp',\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: `ui.interaction.${interactionType}`,\n [SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME]: entry.duration,\n });\n\n const span = startStandaloneWebVitalSpan({\n name,\n transaction: routeName,\n attributes,\n startTime,\n });\n\n _optionalChain([span, 'optionalAccess', _ => _.addEvent, 'call', _2 => _2('inp', {\n [SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT]: 'millisecond',\n [SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE]: metric.value,\n })]);\n\n _optionalChain([span, 'optionalAccess', _3 => _3.end, 'call', _4 => _4(startTime + duration)]);\n });\n}\n\n/**\n * Register a listener to cache route information for INP interactions.\n * TODO(v9): `latestRoute` no longer needs to be passed in and will be removed in v9.\n */\nfunction registerInpInteractionListener(_latestRoute) {\n const handleEntries = ({ entries }) => {\n const activeSpan = getActiveSpan();\n const activeRootSpan = activeSpan && getRootSpan(activeSpan);\n\n entries.forEach(entry => {\n if (!isPerformanceEventTiming(entry) || !activeRootSpan) {\n return;\n }\n\n const interactionId = entry.interactionId;\n if (interactionId == null) {\n return;\n }\n\n // If the interaction was already recorded before, nothing more to do\n if (INTERACTIONS_SPAN_MAP.has(interactionId)) {\n return;\n }\n\n // We keep max. 10 interactions in the list, then remove the oldest one & clean up\n if (LAST_INTERACTIONS.length > 10) {\n const last = LAST_INTERACTIONS.shift() ;\n INTERACTIONS_SPAN_MAP.delete(last);\n }\n\n // We add the interaction to the list of recorded interactions\n // and store the span for this interaction\n LAST_INTERACTIONS.push(interactionId);\n INTERACTIONS_SPAN_MAP.set(interactionId, activeRootSpan);\n });\n };\n\n addPerformanceInstrumentationHandler('event', handleEntries);\n addPerformanceInstrumentationHandler('first-input', handleEntries);\n}\n\nexport { registerInpInteractionListener, startTrackingINP };\n//# sourceMappingURL=inp.js.map\n","import { _nullishCoalesce, _optionalChain } from '@sentry/utils';\nimport { captureException, addBreadcrumb, getClient, isSentryRequestUrl, addEventProcessor, getCurrentScope, getActiveSpan, getDynamicSamplingContextFromSpan, prepareEvent, getIsolationScope, setContext, getRootSpan, spanToJSON, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, parseSampleRate } from '@sentry/core';\nimport { GLOBAL_OBJ, logger as logger$1, severityLevelFromString, normalize, fill, htmlTreeAsString, browserPerformanceTimeOrigin, uuid4, getLocationHref, dropUndefinedKeys, stringMatchesSomePattern, createEnvelope, createEventEnvelopeHeaders, getSdkMetadataForEnvelopeHeader, resolvedSyncPromise, updateRateLimits, isRateLimited, isBrowser, consoleSandbox } from '@sentry/utils';\nimport { setTimeout as setTimeout$3, addPerformanceInstrumentationHandler, addLcpInstrumentationHandler, addClsInstrumentationHandler, addFidInstrumentationHandler, addInpInstrumentationHandler, SENTRY_XHR_DATA_KEY, addClickKeypressInstrumentationHandler, addHistoryInstrumentationHandler } from '@sentry-internal/browser-utils';\n\n// exporting a separate copy of `WINDOW` rather than exporting the one from `@sentry/browser`\n// prevents the browser package from being bundled in the CDN bundle, and avoids a\n// circular dependency between the browser and replay packages should `@sentry/browser` import\n// from `@sentry/replay` in the future\nconst WINDOW = GLOBAL_OBJ ;\n\nconst REPLAY_SESSION_KEY = 'sentryReplaySession';\nconst REPLAY_EVENT_NAME = 'replay_event';\nconst UNABLE_TO_SEND_REPLAY = 'Unable to send Replay';\n\n// The idle limit for a session after which recording is paused.\nconst SESSION_IDLE_PAUSE_DURATION = 300000; // 5 minutes in ms\n\n// The idle limit for a session after which the session expires.\nconst SESSION_IDLE_EXPIRE_DURATION = 900000; // 15 minutes in ms\n\n/** Default flush delays */\nconst DEFAULT_FLUSH_MIN_DELAY = 5000;\n// XXX: Temp fix for our debounce logic where `maxWait` would never occur if it\n// was the same as `wait`\nconst DEFAULT_FLUSH_MAX_DELAY = 5500;\n\n/* How long to wait for error checkouts */\nconst BUFFER_CHECKOUT_TIME = 60000;\n\nconst RETRY_BASE_INTERVAL = 5000;\nconst RETRY_MAX_COUNT = 3;\n\n/* The max (uncompressed) size in bytes of a network body. Any body larger than this will be truncated. */\nconst NETWORK_BODY_MAX_SIZE = 150000;\n\n/* The max size of a single console arg that is captured. Any arg larger than this will be truncated. */\nconst CONSOLE_ARG_MAX_SIZE = 5000;\n\n/* Min. time to wait before we consider something a slow click. */\nconst SLOW_CLICK_THRESHOLD = 3000;\n/* For scroll actions after a click, we only look for a very short time period to detect programmatic scrolling. */\nconst SLOW_CLICK_SCROLL_TIMEOUT = 300;\n\n/** When encountering a total segment size exceeding this size, stop the replay (as we cannot properly ingest it). */\nconst REPLAY_MAX_EVENT_BUFFER_SIZE = 20000000; // ~20MB\n\n/** Replays must be min. 5s long before we send them. */\nconst MIN_REPLAY_DURATION = 4999;\n/* The max. allowed value that the minReplayDuration can be set to. */\nconst MIN_REPLAY_DURATION_LIMIT = 15000;\n\n/** The max. length of a replay. */\nconst MAX_REPLAY_DURATION = 3600000; // 60 minutes in ms;\n\nfunction _nullishCoalesce$1(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }function _optionalChain$5(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var NodeType$1;\n(function (NodeType) {\n NodeType[NodeType[\"Document\"] = 0] = \"Document\";\n NodeType[NodeType[\"DocumentType\"] = 1] = \"DocumentType\";\n NodeType[NodeType[\"Element\"] = 2] = \"Element\";\n NodeType[NodeType[\"Text\"] = 3] = \"Text\";\n NodeType[NodeType[\"CDATA\"] = 4] = \"CDATA\";\n NodeType[NodeType[\"Comment\"] = 5] = \"Comment\";\n})(NodeType$1 || (NodeType$1 = {}));\n\nfunction isElement$1(n) {\n return n.nodeType === n.ELEMENT_NODE;\n}\nfunction isShadowRoot(n) {\n const host = _optionalChain$5([n, 'optionalAccess', _ => _.host]);\n return Boolean(_optionalChain$5([host, 'optionalAccess', _2 => _2.shadowRoot]) === n);\n}\nfunction isNativeShadowDom(shadowRoot) {\n return Object.prototype.toString.call(shadowRoot) === '[object ShadowRoot]';\n}\nfunction fixBrowserCompatibilityIssuesInCSS(cssText) {\n if (cssText.includes(' background-clip: text;') &&\n !cssText.includes(' -webkit-background-clip: text;')) {\n cssText = cssText.replace(/\\sbackground-clip:\\s*text;/g, ' -webkit-background-clip: text; background-clip: text;');\n }\n return cssText;\n}\nfunction escapeImportStatement(rule) {\n const { cssText } = rule;\n if (cssText.split('\"').length < 3)\n return cssText;\n const statement = ['@import', `url(${JSON.stringify(rule.href)})`];\n if (rule.layerName === '') {\n statement.push(`layer`);\n }\n else if (rule.layerName) {\n statement.push(`layer(${rule.layerName})`);\n }\n if (rule.supportsText) {\n statement.push(`supports(${rule.supportsText})`);\n }\n if (rule.media.length) {\n statement.push(rule.media.mediaText);\n }\n return statement.join(' ') + ';';\n}\nfunction stringifyStylesheet(s) {\n try {\n const rules = s.rules || s.cssRules;\n return rules\n ? fixBrowserCompatibilityIssuesInCSS(Array.from(rules, stringifyRule).join(''))\n : null;\n }\n catch (error) {\n return null;\n }\n}\nfunction stringifyRule(rule) {\n let importStringified;\n if (isCSSImportRule(rule)) {\n try {\n importStringified =\n stringifyStylesheet(rule.styleSheet) ||\n escapeImportStatement(rule);\n }\n catch (error) {\n }\n }\n else if (isCSSStyleRule(rule) && rule.selectorText.includes(':')) {\n return fixSafariColons(rule.cssText);\n }\n return importStringified || rule.cssText;\n}\nfunction fixSafariColons(cssStringified) {\n const regex = /(\\[(?:[\\w-]+)[^\\\\])(:(?:[\\w-]+)\\])/gm;\n return cssStringified.replace(regex, '$1\\\\$2');\n}\nfunction isCSSImportRule(rule) {\n return 'styleSheet' in rule;\n}\nfunction isCSSStyleRule(rule) {\n return 'selectorText' in rule;\n}\nclass Mirror {\n constructor() {\n this.idNodeMap = new Map();\n this.nodeMetaMap = new WeakMap();\n }\n getId(n) {\n if (!n)\n return -1;\n const id = _optionalChain$5([this, 'access', _3 => _3.getMeta, 'call', _4 => _4(n), 'optionalAccess', _5 => _5.id]);\n return _nullishCoalesce$1(id, () => ( -1));\n }\n getNode(id) {\n return this.idNodeMap.get(id) || null;\n }\n getIds() {\n return Array.from(this.idNodeMap.keys());\n }\n getMeta(n) {\n return this.nodeMetaMap.get(n) || null;\n }\n removeNodeFromMap(n) {\n const id = this.getId(n);\n this.idNodeMap.delete(id);\n if (n.childNodes) {\n n.childNodes.forEach((childNode) => this.removeNodeFromMap(childNode));\n }\n }\n has(id) {\n return this.idNodeMap.has(id);\n }\n hasNode(node) {\n return this.nodeMetaMap.has(node);\n }\n add(n, meta) {\n const id = meta.id;\n this.idNodeMap.set(id, n);\n this.nodeMetaMap.set(n, meta);\n }\n replace(id, n) {\n const oldNode = this.getNode(id);\n if (oldNode) {\n const meta = this.nodeMetaMap.get(oldNode);\n if (meta)\n this.nodeMetaMap.set(n, meta);\n }\n this.idNodeMap.set(id, n);\n }\n reset() {\n this.idNodeMap = new Map();\n this.nodeMetaMap = new WeakMap();\n }\n}\nfunction createMirror() {\n return new Mirror();\n}\nfunction shouldMaskInput({ maskInputOptions, tagName, type, }) {\n if (tagName === 'OPTION') {\n tagName = 'SELECT';\n }\n return Boolean(maskInputOptions[tagName.toLowerCase()] ||\n (type && maskInputOptions[type]) ||\n type === 'password' ||\n (tagName === 'INPUT' && !type && maskInputOptions['text']));\n}\nfunction maskInputValue({ isMasked, element, value, maskInputFn, }) {\n let text = value || '';\n if (!isMasked) {\n return text;\n }\n if (maskInputFn) {\n text = maskInputFn(text, element);\n }\n return '*'.repeat(text.length);\n}\nfunction toLowerCase(str) {\n return str.toLowerCase();\n}\nfunction toUpperCase(str) {\n return str.toUpperCase();\n}\nconst ORIGINAL_ATTRIBUTE_NAME = '__rrweb_original__';\nfunction is2DCanvasBlank(canvas) {\n const ctx = canvas.getContext('2d');\n if (!ctx)\n return true;\n const chunkSize = 50;\n for (let x = 0; x < canvas.width; x += chunkSize) {\n for (let y = 0; y < canvas.height; y += chunkSize) {\n const getImageData = ctx.getImageData;\n const originalGetImageData = ORIGINAL_ATTRIBUTE_NAME in getImageData\n ? getImageData[ORIGINAL_ATTRIBUTE_NAME]\n : getImageData;\n const pixelBuffer = new Uint32Array(originalGetImageData.call(ctx, x, y, Math.min(chunkSize, canvas.width - x), Math.min(chunkSize, canvas.height - y)).data.buffer);\n if (pixelBuffer.some((pixel) => pixel !== 0))\n return false;\n }\n }\n return true;\n}\nfunction getInputType(element) {\n const type = element.type;\n return element.hasAttribute('data-rr-is-password')\n ? 'password'\n : type\n ?\n toLowerCase(type)\n : null;\n}\nfunction getInputValue(el, tagName, type) {\n if (tagName === 'INPUT' && (type === 'radio' || type === 'checkbox')) {\n return el.getAttribute('value') || '';\n }\n return el.value;\n}\nfunction extractFileExtension(path, baseURL) {\n let url;\n try {\n url = new URL(path, _nullishCoalesce$1(baseURL, () => ( window.location.href)));\n }\n catch (err) {\n return null;\n }\n const regex = /\\.([0-9a-z]+)(?:$)/i;\n const match = url.pathname.match(regex);\n return _nullishCoalesce$1(_optionalChain$5([match, 'optionalAccess', _6 => _6[1]]), () => ( null));\n}\nconst cachedImplementations$1 = {};\nfunction getImplementation$1(name) {\n const cached = cachedImplementations$1[name];\n if (cached) {\n return cached;\n }\n const document = window.document;\n let impl = window[name];\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[name]) {\n impl =\n contentWindow[name];\n }\n document.head.removeChild(sandbox);\n }\n catch (e) {\n }\n }\n return (cachedImplementations$1[name] = impl.bind(window));\n}\nfunction setTimeout$2(...rest) {\n return getImplementation$1('setTimeout')(...rest);\n}\nfunction clearTimeout$2(...rest) {\n return getImplementation$1('clearTimeout')(...rest);\n}\n\nlet _id = 1;\nconst tagNameRegex = new RegExp('[^a-z0-9-_:]');\nconst IGNORED_NODE = -2;\nfunction genId() {\n return _id++;\n}\nfunction getValidTagName(element) {\n if (element instanceof HTMLFormElement) {\n return 'form';\n }\n const processedTagName = toLowerCase(element.tagName);\n if (tagNameRegex.test(processedTagName)) {\n return 'div';\n }\n return processedTagName;\n}\nfunction extractOrigin(url) {\n let origin = '';\n if (url.indexOf('//') > -1) {\n origin = url.split('/').slice(0, 3).join('/');\n }\n else {\n origin = url.split('/')[0];\n }\n origin = origin.split('?')[0];\n return origin;\n}\nlet canvasService;\nlet canvasCtx;\nconst URL_IN_CSS_REF = /url\\((?:(')([^']*)'|(\")(.*?)\"|([^)]*))\\)/gm;\nconst URL_PROTOCOL_MATCH = /^(?:[a-z+]+:)?\\/\\//i;\nconst URL_WWW_MATCH = /^www\\..*/i;\nconst DATA_URI = /^(data:)([^,]*),(.*)/i;\nfunction absoluteToStylesheet(cssText, href) {\n return (cssText || '').replace(URL_IN_CSS_REF, (origin, quote1, path1, quote2, path2, path3) => {\n const filePath = path1 || path2 || path3;\n const maybeQuote = quote1 || quote2 || '';\n if (!filePath) {\n return origin;\n }\n if (URL_PROTOCOL_MATCH.test(filePath) || URL_WWW_MATCH.test(filePath)) {\n return `url(${maybeQuote}${filePath}${maybeQuote})`;\n }\n if (DATA_URI.test(filePath)) {\n return `url(${maybeQuote}${filePath}${maybeQuote})`;\n }\n if (filePath[0] === '/') {\n return `url(${maybeQuote}${extractOrigin(href) + filePath}${maybeQuote})`;\n }\n const stack = href.split('/');\n const parts = filePath.split('/');\n stack.pop();\n for (const part of parts) {\n if (part === '.') {\n continue;\n }\n else if (part === '..') {\n stack.pop();\n }\n else {\n stack.push(part);\n }\n }\n return `url(${maybeQuote}${stack.join('/')}${maybeQuote})`;\n });\n}\nconst SRCSET_NOT_SPACES = /^[^ \\t\\n\\r\\u000c]+/;\nconst SRCSET_COMMAS_OR_SPACES = /^[, \\t\\n\\r\\u000c]+/;\nfunction getAbsoluteSrcsetString(doc, attributeValue) {\n if (attributeValue.trim() === '') {\n return attributeValue;\n }\n let pos = 0;\n function collectCharacters(regEx) {\n let chars;\n const match = regEx.exec(attributeValue.substring(pos));\n if (match) {\n chars = match[0];\n pos += chars.length;\n return chars;\n }\n return '';\n }\n const output = [];\n while (true) {\n collectCharacters(SRCSET_COMMAS_OR_SPACES);\n if (pos >= attributeValue.length) {\n break;\n }\n let url = collectCharacters(SRCSET_NOT_SPACES);\n if (url.slice(-1) === ',') {\n url = absoluteToDoc(doc, url.substring(0, url.length - 1));\n output.push(url);\n }\n else {\n let descriptorsStr = '';\n url = absoluteToDoc(doc, url);\n let inParens = false;\n while (true) {\n const c = attributeValue.charAt(pos);\n if (c === '') {\n output.push((url + descriptorsStr).trim());\n break;\n }\n else if (!inParens) {\n if (c === ',') {\n pos += 1;\n output.push((url + descriptorsStr).trim());\n break;\n }\n else if (c === '(') {\n inParens = true;\n }\n }\n else {\n if (c === ')') {\n inParens = false;\n }\n }\n descriptorsStr += c;\n pos += 1;\n }\n }\n }\n return output.join(', ');\n}\nconst cachedDocument = new WeakMap();\nfunction absoluteToDoc(doc, attributeValue) {\n if (!attributeValue || attributeValue.trim() === '') {\n return attributeValue;\n }\n return getHref(doc, attributeValue);\n}\nfunction isSVGElement(el) {\n return Boolean(el.tagName === 'svg' || el.ownerSVGElement);\n}\nfunction getHref(doc, customHref) {\n let a = cachedDocument.get(doc);\n if (!a) {\n a = doc.createElement('a');\n cachedDocument.set(doc, a);\n }\n if (!customHref) {\n customHref = '';\n }\n else if (customHref.startsWith('blob:') || customHref.startsWith('data:')) {\n return customHref;\n }\n a.setAttribute('href', customHref);\n return a.href;\n}\nfunction transformAttribute(doc, tagName, name, value, element, maskAttributeFn) {\n if (!value) {\n return value;\n }\n if (name === 'src' ||\n (name === 'href' && !(tagName === 'use' && value[0] === '#'))) {\n return absoluteToDoc(doc, value);\n }\n else if (name === 'xlink:href' && value[0] !== '#') {\n return absoluteToDoc(doc, value);\n }\n else if (name === 'background' &&\n (tagName === 'table' || tagName === 'td' || tagName === 'th')) {\n return absoluteToDoc(doc, value);\n }\n else if (name === 'srcset') {\n return getAbsoluteSrcsetString(doc, value);\n }\n else if (name === 'style') {\n return absoluteToStylesheet(value, getHref(doc));\n }\n else if (tagName === 'object' && name === 'data') {\n return absoluteToDoc(doc, value);\n }\n if (typeof maskAttributeFn === 'function') {\n return maskAttributeFn(name, value, element);\n }\n return value;\n}\nfunction ignoreAttribute(tagName, name, _value) {\n return (tagName === 'video' || tagName === 'audio') && name === 'autoplay';\n}\nfunction _isBlockedElement(element, blockClass, blockSelector, unblockSelector) {\n try {\n if (unblockSelector && element.matches(unblockSelector)) {\n return false;\n }\n if (typeof blockClass === 'string') {\n if (element.classList.contains(blockClass)) {\n return true;\n }\n }\n else {\n for (let eIndex = element.classList.length; eIndex--;) {\n const className = element.classList[eIndex];\n if (blockClass.test(className)) {\n return true;\n }\n }\n }\n if (blockSelector) {\n return element.matches(blockSelector);\n }\n }\n catch (e) {\n }\n return false;\n}\nfunction elementClassMatchesRegex(el, regex) {\n for (let eIndex = el.classList.length; eIndex--;) {\n const className = el.classList[eIndex];\n if (regex.test(className)) {\n return true;\n }\n }\n return false;\n}\nfunction distanceToMatch(node, matchPredicate, limit = Infinity, distance = 0) {\n if (!node)\n return -1;\n if (node.nodeType !== node.ELEMENT_NODE)\n return -1;\n if (distance > limit)\n return -1;\n if (matchPredicate(node))\n return distance;\n return distanceToMatch(node.parentNode, matchPredicate, limit, distance + 1);\n}\nfunction createMatchPredicate(className, selector) {\n return (node) => {\n const el = node;\n if (el === null)\n return false;\n try {\n if (className) {\n if (typeof className === 'string') {\n if (el.matches(`.${className}`))\n return true;\n }\n else if (elementClassMatchesRegex(el, className)) {\n return true;\n }\n }\n if (selector && el.matches(selector))\n return true;\n return false;\n }\n catch (e2) {\n return false;\n }\n };\n}\nfunction needMaskingText(node, maskTextClass, maskTextSelector, unmaskTextClass, unmaskTextSelector, maskAllText) {\n try {\n const el = node.nodeType === node.ELEMENT_NODE\n ? node\n : node.parentElement;\n if (el === null)\n return false;\n if (el.tagName === 'INPUT') {\n const autocomplete = el.getAttribute('autocomplete');\n const disallowedAutocompleteValues = [\n 'current-password',\n 'new-password',\n 'cc-number',\n 'cc-exp',\n 'cc-exp-month',\n 'cc-exp-year',\n 'cc-csc',\n ];\n if (disallowedAutocompleteValues.includes(autocomplete)) {\n return true;\n }\n }\n let maskDistance = -1;\n let unmaskDistance = -1;\n if (maskAllText) {\n unmaskDistance = distanceToMatch(el, createMatchPredicate(unmaskTextClass, unmaskTextSelector));\n if (unmaskDistance < 0) {\n return true;\n }\n maskDistance = distanceToMatch(el, createMatchPredicate(maskTextClass, maskTextSelector), unmaskDistance >= 0 ? unmaskDistance : Infinity);\n }\n else {\n maskDistance = distanceToMatch(el, createMatchPredicate(maskTextClass, maskTextSelector));\n if (maskDistance < 0) {\n return false;\n }\n unmaskDistance = distanceToMatch(el, createMatchPredicate(unmaskTextClass, unmaskTextSelector), maskDistance >= 0 ? maskDistance : Infinity);\n }\n return maskDistance >= 0\n ? unmaskDistance >= 0\n ? maskDistance <= unmaskDistance\n : true\n : unmaskDistance >= 0\n ? false\n : !!maskAllText;\n }\n catch (e) {\n }\n return !!maskAllText;\n}\nfunction onceIframeLoaded(iframeEl, listener, iframeLoadTimeout) {\n const win = iframeEl.contentWindow;\n if (!win) {\n return;\n }\n let fired = false;\n let readyState;\n try {\n readyState = win.document.readyState;\n }\n catch (error) {\n return;\n }\n if (readyState !== 'complete') {\n const timer = setTimeout$2(() => {\n if (!fired) {\n listener();\n fired = true;\n }\n }, iframeLoadTimeout);\n iframeEl.addEventListener('load', () => {\n clearTimeout$2(timer);\n fired = true;\n listener();\n });\n return;\n }\n const blankUrl = 'about:blank';\n if (win.location.href !== blankUrl ||\n iframeEl.src === blankUrl ||\n iframeEl.src === '') {\n setTimeout$2(listener, 0);\n return iframeEl.addEventListener('load', listener);\n }\n iframeEl.addEventListener('load', listener);\n}\nfunction onceStylesheetLoaded(link, listener, styleSheetLoadTimeout) {\n let fired = false;\n let styleSheetLoaded;\n try {\n styleSheetLoaded = link.sheet;\n }\n catch (error) {\n return;\n }\n if (styleSheetLoaded)\n return;\n const timer = setTimeout$2(() => {\n if (!fired) {\n listener();\n fired = true;\n }\n }, styleSheetLoadTimeout);\n link.addEventListener('load', () => {\n clearTimeout$2(timer);\n fired = true;\n listener();\n });\n}\nfunction serializeNode(n, options) {\n const { doc, mirror, blockClass, blockSelector, unblockSelector, maskAllText, maskAttributeFn, maskTextClass, unmaskTextClass, maskTextSelector, unmaskTextSelector, inlineStylesheet, maskInputOptions = {}, maskTextFn, maskInputFn, dataURLOptions = {}, inlineImages, recordCanvas, keepIframeSrcFn, newlyAddedElement = false, } = options;\n const rootId = getRootId(doc, mirror);\n switch (n.nodeType) {\n case n.DOCUMENT_NODE:\n if (n.compatMode !== 'CSS1Compat') {\n return {\n type: NodeType$1.Document,\n childNodes: [],\n compatMode: n.compatMode,\n };\n }\n else {\n return {\n type: NodeType$1.Document,\n childNodes: [],\n };\n }\n case n.DOCUMENT_TYPE_NODE:\n return {\n type: NodeType$1.DocumentType,\n name: n.name,\n publicId: n.publicId,\n systemId: n.systemId,\n rootId,\n };\n case n.ELEMENT_NODE:\n return serializeElementNode(n, {\n doc,\n blockClass,\n blockSelector,\n unblockSelector,\n inlineStylesheet,\n maskAttributeFn,\n maskInputOptions,\n maskInputFn,\n dataURLOptions,\n inlineImages,\n recordCanvas,\n keepIframeSrcFn,\n newlyAddedElement,\n rootId,\n maskAllText,\n maskTextClass,\n unmaskTextClass,\n maskTextSelector,\n unmaskTextSelector,\n });\n case n.TEXT_NODE:\n return serializeTextNode(n, {\n doc,\n maskAllText,\n maskTextClass,\n unmaskTextClass,\n maskTextSelector,\n unmaskTextSelector,\n maskTextFn,\n maskInputOptions,\n maskInputFn,\n rootId,\n });\n case n.CDATA_SECTION_NODE:\n return {\n type: NodeType$1.CDATA,\n textContent: '',\n rootId,\n };\n case n.COMMENT_NODE:\n return {\n type: NodeType$1.Comment,\n textContent: n.textContent || '',\n rootId,\n };\n default:\n return false;\n }\n}\nfunction getRootId(doc, mirror) {\n if (!mirror.hasNode(doc))\n return undefined;\n const docId = mirror.getId(doc);\n return docId === 1 ? undefined : docId;\n}\nfunction serializeTextNode(n, options) {\n const { maskAllText, maskTextClass, unmaskTextClass, maskTextSelector, unmaskTextSelector, maskTextFn, maskInputOptions, maskInputFn, rootId, } = options;\n const parentTagName = n.parentNode && n.parentNode.tagName;\n let textContent = n.textContent;\n const isStyle = parentTagName === 'STYLE' ? true : undefined;\n const isScript = parentTagName === 'SCRIPT' ? true : undefined;\n const isTextarea = parentTagName === 'TEXTAREA' ? true : undefined;\n if (isStyle && textContent) {\n try {\n if (n.nextSibling || n.previousSibling) {\n }\n else if (_optionalChain$5([n, 'access', _7 => _7.parentNode, 'access', _8 => _8.sheet, 'optionalAccess', _9 => _9.cssRules])) {\n textContent = stringifyStylesheet(n.parentNode.sheet);\n }\n }\n catch (err) {\n console.warn(`Cannot get CSS styles from text's parentNode. Error: ${err}`, n);\n }\n textContent = absoluteToStylesheet(textContent, getHref(options.doc));\n }\n if (isScript) {\n textContent = 'SCRIPT_PLACEHOLDER';\n }\n const forceMask = needMaskingText(n, maskTextClass, maskTextSelector, unmaskTextClass, unmaskTextSelector, maskAllText);\n if (!isStyle && !isScript && !isTextarea && textContent && forceMask) {\n textContent = maskTextFn\n ? maskTextFn(textContent, n.parentElement)\n : textContent.replace(/[\\S]/g, '*');\n }\n if (isTextarea && textContent && (maskInputOptions.textarea || forceMask)) {\n textContent = maskInputFn\n ? maskInputFn(textContent, n.parentNode)\n : textContent.replace(/[\\S]/g, '*');\n }\n if (parentTagName === 'OPTION' && textContent) {\n const isInputMasked = shouldMaskInput({\n type: null,\n tagName: parentTagName,\n maskInputOptions,\n });\n textContent = maskInputValue({\n isMasked: needMaskingText(n, maskTextClass, maskTextSelector, unmaskTextClass, unmaskTextSelector, isInputMasked),\n element: n,\n value: textContent,\n maskInputFn,\n });\n }\n return {\n type: NodeType$1.Text,\n textContent: textContent || '',\n isStyle,\n rootId,\n };\n}\nfunction serializeElementNode(n, options) {\n const { doc, blockClass, blockSelector, unblockSelector, inlineStylesheet, maskInputOptions = {}, maskAttributeFn, maskInputFn, dataURLOptions = {}, inlineImages, recordCanvas, keepIframeSrcFn, newlyAddedElement = false, rootId, maskAllText, maskTextClass, unmaskTextClass, maskTextSelector, unmaskTextSelector, } = options;\n const needBlock = _isBlockedElement(n, blockClass, blockSelector, unblockSelector);\n const tagName = getValidTagName(n);\n let attributes = {};\n const len = n.attributes.length;\n for (let i = 0; i < len; i++) {\n const attr = n.attributes[i];\n if (attr.name && !ignoreAttribute(tagName, attr.name, attr.value)) {\n attributes[attr.name] = transformAttribute(doc, tagName, toLowerCase(attr.name), attr.value, n, maskAttributeFn);\n }\n }\n if (tagName === 'link' && inlineStylesheet) {\n const stylesheet = Array.from(doc.styleSheets).find((s) => {\n return s.href === n.href;\n });\n let cssText = null;\n if (stylesheet) {\n cssText = stringifyStylesheet(stylesheet);\n }\n if (cssText) {\n delete attributes.rel;\n delete attributes.href;\n attributes._cssText = absoluteToStylesheet(cssText, stylesheet.href);\n }\n }\n if (tagName === 'style' &&\n n.sheet &&\n !(n.innerText || n.textContent || '').trim().length) {\n const cssText = stringifyStylesheet(n.sheet);\n if (cssText) {\n attributes._cssText = absoluteToStylesheet(cssText, getHref(doc));\n }\n }\n if (tagName === 'input' ||\n tagName === 'textarea' ||\n tagName === 'select' ||\n tagName === 'option') {\n const el = n;\n const type = getInputType(el);\n const value = getInputValue(el, toUpperCase(tagName), type);\n const checked = el.checked;\n if (type !== 'submit' && type !== 'button' && value) {\n const forceMask = needMaskingText(el, maskTextClass, maskTextSelector, unmaskTextClass, unmaskTextSelector, shouldMaskInput({\n type,\n tagName: toUpperCase(tagName),\n maskInputOptions,\n }));\n attributes.value = maskInputValue({\n isMasked: forceMask,\n element: el,\n value,\n maskInputFn,\n });\n }\n if (checked) {\n attributes.checked = checked;\n }\n }\n if (tagName === 'option') {\n if (n.selected && !maskInputOptions['select']) {\n attributes.selected = true;\n }\n else {\n delete attributes.selected;\n }\n }\n if (tagName === 'canvas' && recordCanvas) {\n if (n.__context === '2d') {\n if (!is2DCanvasBlank(n)) {\n attributes.rr_dataURL = n.toDataURL(dataURLOptions.type, dataURLOptions.quality);\n }\n }\n else if (!('__context' in n)) {\n const canvasDataURL = n.toDataURL(dataURLOptions.type, dataURLOptions.quality);\n const blankCanvas = doc.createElement('canvas');\n blankCanvas.width = n.width;\n blankCanvas.height = n.height;\n const blankCanvasDataURL = blankCanvas.toDataURL(dataURLOptions.type, dataURLOptions.quality);\n if (canvasDataURL !== blankCanvasDataURL) {\n attributes.rr_dataURL = canvasDataURL;\n }\n }\n }\n if (tagName === 'img' && inlineImages) {\n if (!canvasService) {\n canvasService = doc.createElement('canvas');\n canvasCtx = canvasService.getContext('2d');\n }\n const image = n;\n const imageSrc = image.currentSrc || image.getAttribute('src') || '';\n const priorCrossOrigin = image.crossOrigin;\n const recordInlineImage = () => {\n image.removeEventListener('load', recordInlineImage);\n try {\n canvasService.width = image.naturalWidth;\n canvasService.height = image.naturalHeight;\n canvasCtx.drawImage(image, 0, 0);\n attributes.rr_dataURL = canvasService.toDataURL(dataURLOptions.type, dataURLOptions.quality);\n }\n catch (err) {\n if (image.crossOrigin !== 'anonymous') {\n image.crossOrigin = 'anonymous';\n if (image.complete && image.naturalWidth !== 0)\n recordInlineImage();\n else\n image.addEventListener('load', recordInlineImage);\n return;\n }\n else {\n console.warn(`Cannot inline img src=${imageSrc}! Error: ${err}`);\n }\n }\n if (image.crossOrigin === 'anonymous') {\n priorCrossOrigin\n ? (attributes.crossOrigin = priorCrossOrigin)\n : image.removeAttribute('crossorigin');\n }\n };\n if (image.complete && image.naturalWidth !== 0)\n recordInlineImage();\n else\n image.addEventListener('load', recordInlineImage);\n }\n if (tagName === 'audio' || tagName === 'video') {\n attributes.rr_mediaState = n.paused\n ? 'paused'\n : 'played';\n attributes.rr_mediaCurrentTime = n.currentTime;\n }\n if (!newlyAddedElement) {\n if (n.scrollLeft) {\n attributes.rr_scrollLeft = n.scrollLeft;\n }\n if (n.scrollTop) {\n attributes.rr_scrollTop = n.scrollTop;\n }\n }\n if (needBlock) {\n const { width, height } = n.getBoundingClientRect();\n attributes = {\n class: attributes.class,\n rr_width: `${width}px`,\n rr_height: `${height}px`,\n };\n }\n if (tagName === 'iframe' && !keepIframeSrcFn(attributes.src)) {\n if (!needBlock && !n.contentDocument) {\n attributes.rr_src = attributes.src;\n }\n delete attributes.src;\n }\n let isCustomElement;\n try {\n if (customElements.get(tagName))\n isCustomElement = true;\n }\n catch (e) {\n }\n return {\n type: NodeType$1.Element,\n tagName,\n attributes,\n childNodes: [],\n isSVG: isSVGElement(n) || undefined,\n needBlock,\n rootId,\n isCustom: isCustomElement,\n };\n}\nfunction lowerIfExists(maybeAttr) {\n if (maybeAttr === undefined || maybeAttr === null) {\n return '';\n }\n else {\n return maybeAttr.toLowerCase();\n }\n}\nfunction slimDOMExcluded(sn, slimDOMOptions) {\n if (slimDOMOptions.comment && sn.type === NodeType$1.Comment) {\n return true;\n }\n else if (sn.type === NodeType$1.Element) {\n if (slimDOMOptions.script &&\n (sn.tagName === 'script' ||\n (sn.tagName === 'link' &&\n (sn.attributes.rel === 'preload' ||\n sn.attributes.rel === 'modulepreload') &&\n sn.attributes.as === 'script') ||\n (sn.tagName === 'link' &&\n sn.attributes.rel === 'prefetch' &&\n typeof sn.attributes.href === 'string' &&\n extractFileExtension(sn.attributes.href) === 'js'))) {\n return true;\n }\n else if (slimDOMOptions.headFavicon &&\n ((sn.tagName === 'link' && sn.attributes.rel === 'shortcut icon') ||\n (sn.tagName === 'meta' &&\n (lowerIfExists(sn.attributes.name).match(/^msapplication-tile(image|color)$/) ||\n lowerIfExists(sn.attributes.name) === 'application-name' ||\n lowerIfExists(sn.attributes.rel) === 'icon' ||\n lowerIfExists(sn.attributes.rel) === 'apple-touch-icon' ||\n lowerIfExists(sn.attributes.rel) === 'shortcut icon')))) {\n return true;\n }\n else if (sn.tagName === 'meta') {\n if (slimDOMOptions.headMetaDescKeywords &&\n lowerIfExists(sn.attributes.name).match(/^description|keywords$/)) {\n return true;\n }\n else if (slimDOMOptions.headMetaSocial &&\n (lowerIfExists(sn.attributes.property).match(/^(og|twitter|fb):/) ||\n lowerIfExists(sn.attributes.name).match(/^(og|twitter):/) ||\n lowerIfExists(sn.attributes.name) === 'pinterest')) {\n return true;\n }\n else if (slimDOMOptions.headMetaRobots &&\n (lowerIfExists(sn.attributes.name) === 'robots' ||\n lowerIfExists(sn.attributes.name) === 'googlebot' ||\n lowerIfExists(sn.attributes.name) === 'bingbot')) {\n return true;\n }\n else if (slimDOMOptions.headMetaHttpEquiv &&\n sn.attributes['http-equiv'] !== undefined) {\n return true;\n }\n else if (slimDOMOptions.headMetaAuthorship &&\n (lowerIfExists(sn.attributes.name) === 'author' ||\n lowerIfExists(sn.attributes.name) === 'generator' ||\n lowerIfExists(sn.attributes.name) === 'framework' ||\n lowerIfExists(sn.attributes.name) === 'publisher' ||\n lowerIfExists(sn.attributes.name) === 'progid' ||\n lowerIfExists(sn.attributes.property).match(/^article:/) ||\n lowerIfExists(sn.attributes.property).match(/^product:/))) {\n return true;\n }\n else if (slimDOMOptions.headMetaVerification &&\n (lowerIfExists(sn.attributes.name) === 'google-site-verification' ||\n lowerIfExists(sn.attributes.name) === 'yandex-verification' ||\n lowerIfExists(sn.attributes.name) === 'csrf-token' ||\n lowerIfExists(sn.attributes.name) === 'p:domain_verify' ||\n lowerIfExists(sn.attributes.name) === 'verify-v1' ||\n lowerIfExists(sn.attributes.name) === 'verification' ||\n lowerIfExists(sn.attributes.name) === 'shopify-checkout-api-token')) {\n return true;\n }\n }\n }\n return false;\n}\nfunction serializeNodeWithId(n, options) {\n const { doc, mirror, blockClass, blockSelector, unblockSelector, maskAllText, maskTextClass, unmaskTextClass, maskTextSelector, unmaskTextSelector, skipChild = false, inlineStylesheet = true, maskInputOptions = {}, maskAttributeFn, maskTextFn, maskInputFn, slimDOMOptions, dataURLOptions = {}, inlineImages = false, recordCanvas = false, onSerialize, onIframeLoad, iframeLoadTimeout = 5000, onStylesheetLoad, stylesheetLoadTimeout = 5000, keepIframeSrcFn = () => false, newlyAddedElement = false, } = options;\n let { preserveWhiteSpace = true } = options;\n const _serializedNode = serializeNode(n, {\n doc,\n mirror,\n blockClass,\n blockSelector,\n maskAllText,\n unblockSelector,\n maskTextClass,\n unmaskTextClass,\n maskTextSelector,\n unmaskTextSelector,\n inlineStylesheet,\n maskInputOptions,\n maskAttributeFn,\n maskTextFn,\n maskInputFn,\n dataURLOptions,\n inlineImages,\n recordCanvas,\n keepIframeSrcFn,\n newlyAddedElement,\n });\n if (!_serializedNode) {\n console.warn(n, 'not serialized');\n return null;\n }\n let id;\n if (mirror.hasNode(n)) {\n id = mirror.getId(n);\n }\n else if (slimDOMExcluded(_serializedNode, slimDOMOptions) ||\n (!preserveWhiteSpace &&\n _serializedNode.type === NodeType$1.Text &&\n !_serializedNode.isStyle &&\n !_serializedNode.textContent.replace(/^\\s+|\\s+$/gm, '').length)) {\n id = IGNORED_NODE;\n }\n else {\n id = genId();\n }\n const serializedNode = Object.assign(_serializedNode, { id });\n mirror.add(n, serializedNode);\n if (id === IGNORED_NODE) {\n return null;\n }\n if (onSerialize) {\n onSerialize(n);\n }\n let recordChild = !skipChild;\n if (serializedNode.type === NodeType$1.Element) {\n recordChild = recordChild && !serializedNode.needBlock;\n delete serializedNode.needBlock;\n const shadowRoot = n.shadowRoot;\n if (shadowRoot && isNativeShadowDom(shadowRoot))\n serializedNode.isShadowHost = true;\n }\n if ((serializedNode.type === NodeType$1.Document ||\n serializedNode.type === NodeType$1.Element) &&\n recordChild) {\n if (slimDOMOptions.headWhitespace &&\n serializedNode.type === NodeType$1.Element &&\n serializedNode.tagName === 'head') {\n preserveWhiteSpace = false;\n }\n const bypassOptions = {\n doc,\n mirror,\n blockClass,\n blockSelector,\n maskAllText,\n unblockSelector,\n maskTextClass,\n unmaskTextClass,\n maskTextSelector,\n unmaskTextSelector,\n skipChild,\n inlineStylesheet,\n maskInputOptions,\n maskAttributeFn,\n maskTextFn,\n maskInputFn,\n slimDOMOptions,\n dataURLOptions,\n inlineImages,\n recordCanvas,\n preserveWhiteSpace,\n onSerialize,\n onIframeLoad,\n iframeLoadTimeout,\n onStylesheetLoad,\n stylesheetLoadTimeout,\n keepIframeSrcFn,\n };\n for (const childN of Array.from(n.childNodes)) {\n const serializedChildNode = serializeNodeWithId(childN, bypassOptions);\n if (serializedChildNode) {\n serializedNode.childNodes.push(serializedChildNode);\n }\n }\n if (isElement$1(n) && n.shadowRoot) {\n for (const childN of Array.from(n.shadowRoot.childNodes)) {\n const serializedChildNode = serializeNodeWithId(childN, bypassOptions);\n if (serializedChildNode) {\n isNativeShadowDom(n.shadowRoot) &&\n (serializedChildNode.isShadow = true);\n serializedNode.childNodes.push(serializedChildNode);\n }\n }\n }\n }\n if (n.parentNode &&\n isShadowRoot(n.parentNode) &&\n isNativeShadowDom(n.parentNode)) {\n serializedNode.isShadow = true;\n }\n if (serializedNode.type === NodeType$1.Element &&\n serializedNode.tagName === 'iframe') {\n onceIframeLoaded(n, () => {\n const iframeDoc = n.contentDocument;\n if (iframeDoc && onIframeLoad) {\n const serializedIframeNode = serializeNodeWithId(iframeDoc, {\n doc: iframeDoc,\n mirror,\n blockClass,\n blockSelector,\n unblockSelector,\n maskAllText,\n maskTextClass,\n unmaskTextClass,\n maskTextSelector,\n unmaskTextSelector,\n skipChild: false,\n inlineStylesheet,\n maskInputOptions,\n maskAttributeFn,\n maskTextFn,\n maskInputFn,\n slimDOMOptions,\n dataURLOptions,\n inlineImages,\n recordCanvas,\n preserveWhiteSpace,\n onSerialize,\n onIframeLoad,\n iframeLoadTimeout,\n onStylesheetLoad,\n stylesheetLoadTimeout,\n keepIframeSrcFn,\n });\n if (serializedIframeNode) {\n onIframeLoad(n, serializedIframeNode);\n }\n }\n }, iframeLoadTimeout);\n }\n if (serializedNode.type === NodeType$1.Element &&\n serializedNode.tagName === 'link' &&\n typeof serializedNode.attributes.rel === 'string' &&\n (serializedNode.attributes.rel === 'stylesheet' ||\n (serializedNode.attributes.rel === 'preload' &&\n typeof serializedNode.attributes.href === 'string' &&\n extractFileExtension(serializedNode.attributes.href) === 'css'))) {\n onceStylesheetLoaded(n, () => {\n if (onStylesheetLoad) {\n const serializedLinkNode = serializeNodeWithId(n, {\n doc,\n mirror,\n blockClass,\n blockSelector,\n unblockSelector,\n maskAllText,\n maskTextClass,\n unmaskTextClass,\n maskTextSelector,\n unmaskTextSelector,\n skipChild: false,\n inlineStylesheet,\n maskInputOptions,\n maskAttributeFn,\n maskTextFn,\n maskInputFn,\n slimDOMOptions,\n dataURLOptions,\n inlineImages,\n recordCanvas,\n preserveWhiteSpace,\n onSerialize,\n onIframeLoad,\n iframeLoadTimeout,\n onStylesheetLoad,\n stylesheetLoadTimeout,\n keepIframeSrcFn,\n });\n if (serializedLinkNode) {\n onStylesheetLoad(n, serializedLinkNode);\n }\n }\n }, stylesheetLoadTimeout);\n }\n return serializedNode;\n}\nfunction snapshot(n, options) {\n const { mirror = new Mirror(), blockClass = 'rr-block', blockSelector = null, unblockSelector = null, maskAllText = false, maskTextClass = 'rr-mask', unmaskTextClass = null, maskTextSelector = null, unmaskTextSelector = null, inlineStylesheet = true, inlineImages = false, recordCanvas = false, maskAllInputs = false, maskAttributeFn, maskTextFn, maskInputFn, slimDOM = false, dataURLOptions, preserveWhiteSpace, onSerialize, onIframeLoad, iframeLoadTimeout, onStylesheetLoad, stylesheetLoadTimeout, keepIframeSrcFn = () => false, } = options || {};\n const maskInputOptions = maskAllInputs === true\n ? {\n color: true,\n date: true,\n 'datetime-local': true,\n email: true,\n month: true,\n number: true,\n range: true,\n search: true,\n tel: true,\n text: true,\n time: true,\n url: true,\n week: true,\n textarea: true,\n select: true,\n }\n : maskAllInputs === false\n ? {}\n : maskAllInputs;\n const slimDOMOptions = slimDOM === true || slimDOM === 'all'\n ?\n {\n script: true,\n comment: true,\n headFavicon: true,\n headWhitespace: true,\n headMetaDescKeywords: slimDOM === 'all',\n headMetaSocial: true,\n headMetaRobots: true,\n headMetaHttpEquiv: true,\n headMetaAuthorship: true,\n headMetaVerification: true,\n }\n : slimDOM === false\n ? {}\n : slimDOM;\n return serializeNodeWithId(n, {\n doc: n,\n mirror,\n blockClass,\n blockSelector,\n unblockSelector,\n maskAllText,\n maskTextClass,\n unmaskTextClass,\n maskTextSelector,\n unmaskTextSelector,\n skipChild: false,\n inlineStylesheet,\n maskInputOptions,\n maskAttributeFn,\n maskTextFn,\n maskInputFn,\n slimDOMOptions,\n dataURLOptions,\n inlineImages,\n recordCanvas,\n preserveWhiteSpace,\n onSerialize,\n onIframeLoad,\n iframeLoadTimeout,\n onStylesheetLoad,\n stylesheetLoadTimeout,\n keepIframeSrcFn,\n newlyAddedElement: false,\n });\n}\n\nfunction _optionalChain$4(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }\nfunction on(type, fn, target = document) {\n const options = { capture: true, passive: true };\n target.addEventListener(type, fn, options);\n return () => target.removeEventListener(type, fn, options);\n}\nconst DEPARTED_MIRROR_ACCESS_WARNING = 'Please stop import mirror directly. Instead of that,' +\n '\\r\\n' +\n 'now you can use replayer.getMirror() to access the mirror instance of a replayer,' +\n '\\r\\n' +\n 'or you can use record.mirror to access the mirror instance during recording.';\nlet _mirror = {\n map: {},\n getId() {\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\n return -1;\n },\n getNode() {\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\n return null;\n },\n removeNodeFromMap() {\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\n },\n has() {\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\n return false;\n },\n reset() {\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\n },\n};\nif (typeof window !== 'undefined' && window.Proxy && window.Reflect) {\n _mirror = new Proxy(_mirror, {\n get(target, prop, receiver) {\n if (prop === 'map') {\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\n }\n return Reflect.get(target, prop, receiver);\n },\n });\n}\nfunction throttle$1(func, wait, options = {}) {\n let timeout = null;\n let previous = 0;\n return function (...args) {\n const now = Date.now();\n if (!previous && options.leading === false) {\n previous = now;\n }\n const remaining = wait - (now - previous);\n const context = this;\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout$1(timeout);\n timeout = null;\n }\n previous = now;\n func.apply(context, args);\n }\n else if (!timeout && options.trailing !== false) {\n timeout = setTimeout$1(() => {\n previous = options.leading === false ? 0 : Date.now();\n timeout = null;\n func.apply(context, args);\n }, remaining);\n }\n };\n}\nfunction hookSetter(target, key, d, isRevoked, win = window) {\n const original = win.Object.getOwnPropertyDescriptor(target, key);\n win.Object.defineProperty(target, key, isRevoked\n ? d\n : {\n set(value) {\n setTimeout$1(() => {\n d.set.call(this, value);\n }, 0);\n if (original && original.set) {\n original.set.call(this, value);\n }\n },\n });\n return () => hookSetter(target, key, original || {}, true);\n}\nfunction patch(source, name, replacement) {\n try {\n if (!(name in source)) {\n return () => {\n };\n }\n const original = source[name];\n const wrapped = replacement(original);\n if (typeof wrapped === 'function') {\n wrapped.prototype = wrapped.prototype || {};\n Object.defineProperties(wrapped, {\n __rrweb_original__: {\n enumerable: false,\n value: original,\n },\n });\n }\n source[name] = wrapped;\n return () => {\n source[name] = original;\n };\n }\n catch (e2) {\n return () => {\n };\n }\n}\nlet nowTimestamp = Date.now;\nif (!(/[1-9][0-9]{12}/.test(Date.now().toString()))) {\n nowTimestamp = () => new Date().getTime();\n}\nfunction getWindowScroll(win) {\n const doc = win.document;\n return {\n left: doc.scrollingElement\n ? doc.scrollingElement.scrollLeft\n : win.pageXOffset !== undefined\n ? win.pageXOffset\n : _optionalChain$4([doc, 'optionalAccess', _ => _.documentElement, 'access', _2 => _2.scrollLeft]) ||\n _optionalChain$4([doc, 'optionalAccess', _3 => _3.body, 'optionalAccess', _4 => _4.parentElement, 'optionalAccess', _5 => _5.scrollLeft]) ||\n _optionalChain$4([doc, 'optionalAccess', _6 => _6.body, 'optionalAccess', _7 => _7.scrollLeft]) ||\n 0,\n top: doc.scrollingElement\n ? doc.scrollingElement.scrollTop\n : win.pageYOffset !== undefined\n ? win.pageYOffset\n : _optionalChain$4([doc, 'optionalAccess', _8 => _8.documentElement, 'access', _9 => _9.scrollTop]) ||\n _optionalChain$4([doc, 'optionalAccess', _10 => _10.body, 'optionalAccess', _11 => _11.parentElement, 'optionalAccess', _12 => _12.scrollTop]) ||\n _optionalChain$4([doc, 'optionalAccess', _13 => _13.body, 'optionalAccess', _14 => _14.scrollTop]) ||\n 0,\n };\n}\nfunction getWindowHeight() {\n return (window.innerHeight ||\n (document.documentElement && document.documentElement.clientHeight) ||\n (document.body && document.body.clientHeight));\n}\nfunction getWindowWidth() {\n return (window.innerWidth ||\n (document.documentElement && document.documentElement.clientWidth) ||\n (document.body && document.body.clientWidth));\n}\nfunction closestElementOfNode(node) {\n if (!node) {\n return null;\n }\n const el = node.nodeType === node.ELEMENT_NODE\n ? node\n : node.parentElement;\n return el;\n}\nfunction isBlocked(node, blockClass, blockSelector, unblockSelector, checkAncestors) {\n if (!node) {\n return false;\n }\n const el = closestElementOfNode(node);\n if (!el) {\n return false;\n }\n const blockedPredicate = createMatchPredicate(blockClass, blockSelector);\n if (!checkAncestors) {\n const isUnblocked = unblockSelector && el.matches(unblockSelector);\n return blockedPredicate(el) && !isUnblocked;\n }\n const blockDistance = distanceToMatch(el, blockedPredicate);\n let unblockDistance = -1;\n if (blockDistance < 0) {\n return false;\n }\n if (unblockSelector) {\n unblockDistance = distanceToMatch(el, createMatchPredicate(null, unblockSelector));\n }\n if (blockDistance > -1 && unblockDistance < 0) {\n return true;\n }\n return blockDistance < unblockDistance;\n}\nfunction isSerialized(n, mirror) {\n return mirror.getId(n) !== -1;\n}\nfunction isIgnored(n, mirror) {\n return mirror.getId(n) === IGNORED_NODE;\n}\nfunction isAncestorRemoved(target, mirror) {\n if (isShadowRoot(target)) {\n return false;\n }\n const id = mirror.getId(target);\n if (!mirror.has(id)) {\n return true;\n }\n if (target.parentNode &&\n target.parentNode.nodeType === target.DOCUMENT_NODE) {\n return false;\n }\n if (!target.parentNode) {\n return true;\n }\n return isAncestorRemoved(target.parentNode, mirror);\n}\nfunction legacy_isTouchEvent(event) {\n return Boolean(event.changedTouches);\n}\nfunction polyfill(win = window) {\n if ('NodeList' in win && !win.NodeList.prototype.forEach) {\n win.NodeList.prototype.forEach = Array.prototype\n .forEach;\n }\n if ('DOMTokenList' in win && !win.DOMTokenList.prototype.forEach) {\n win.DOMTokenList.prototype.forEach = Array.prototype\n .forEach;\n }\n if (!Node.prototype.contains) {\n Node.prototype.contains = (...args) => {\n let node = args[0];\n if (!(0 in args)) {\n throw new TypeError('1 argument is required');\n }\n do {\n if (this === node) {\n return true;\n }\n } while ((node = node && node.parentNode));\n return false;\n };\n }\n}\nfunction isSerializedIframe(n, mirror) {\n return Boolean(n.nodeName === 'IFRAME' && mirror.getMeta(n));\n}\nfunction isSerializedStylesheet(n, mirror) {\n return Boolean(n.nodeName === 'LINK' &&\n n.nodeType === n.ELEMENT_NODE &&\n n.getAttribute &&\n n.getAttribute('rel') === 'stylesheet' &&\n mirror.getMeta(n));\n}\nfunction hasShadowRoot(n) {\n return Boolean(_optionalChain$4([n, 'optionalAccess', _18 => _18.shadowRoot]));\n}\nclass StyleSheetMirror {\n constructor() {\n this.id = 1;\n this.styleIDMap = new WeakMap();\n this.idStyleMap = new Map();\n }\n getId(stylesheet) {\n return _nullishCoalesce(this.styleIDMap.get(stylesheet), () => ( -1));\n }\n has(stylesheet) {\n return this.styleIDMap.has(stylesheet);\n }\n add(stylesheet, id) {\n if (this.has(stylesheet))\n return this.getId(stylesheet);\n let newId;\n if (id === undefined) {\n newId = this.id++;\n }\n else\n newId = id;\n this.styleIDMap.set(stylesheet, newId);\n this.idStyleMap.set(newId, stylesheet);\n return newId;\n }\n getStyle(id) {\n return this.idStyleMap.get(id) || null;\n }\n reset() {\n this.styleIDMap = new WeakMap();\n this.idStyleMap = new Map();\n this.id = 1;\n }\n generateId() {\n return this.id++;\n }\n}\nfunction getShadowHost(n) {\n let shadowHost = null;\n if (_optionalChain$4([n, 'access', _19 => _19.getRootNode, 'optionalCall', _20 => _20(), 'optionalAccess', _21 => _21.nodeType]) === Node.DOCUMENT_FRAGMENT_NODE &&\n n.getRootNode().host)\n shadowHost = n.getRootNode().host;\n return shadowHost;\n}\nfunction getRootShadowHost(n) {\n let rootShadowHost = n;\n let shadowHost;\n while ((shadowHost = getShadowHost(rootShadowHost)))\n rootShadowHost = shadowHost;\n return rootShadowHost;\n}\nfunction shadowHostInDom(n) {\n const doc = n.ownerDocument;\n if (!doc)\n return false;\n const shadowHost = getRootShadowHost(n);\n return doc.contains(shadowHost);\n}\nfunction inDom(n) {\n const doc = n.ownerDocument;\n if (!doc)\n return false;\n return doc.contains(n) || shadowHostInDom(n);\n}\nconst cachedImplementations = {};\nfunction getImplementation(name) {\n const cached = cachedImplementations[name];\n if (cached) {\n return cached;\n }\n const document = window.document;\n let impl = window[name];\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[name]) {\n impl =\n contentWindow[name];\n }\n document.head.removeChild(sandbox);\n }\n catch (e) {\n }\n }\n return (cachedImplementations[name] = impl.bind(window));\n}\nfunction onRequestAnimationFrame(...rest) {\n return getImplementation('requestAnimationFrame')(...rest);\n}\nfunction setTimeout$1(...rest) {\n return getImplementation('setTimeout')(...rest);\n}\nfunction clearTimeout$1(...rest) {\n return getImplementation('clearTimeout')(...rest);\n}\n\nvar EventType = /* @__PURE__ */ ((EventType2) => {\n EventType2[EventType2[\"DomContentLoaded\"] = 0] = \"DomContentLoaded\";\n EventType2[EventType2[\"Load\"] = 1] = \"Load\";\n EventType2[EventType2[\"FullSnapshot\"] = 2] = \"FullSnapshot\";\n EventType2[EventType2[\"IncrementalSnapshot\"] = 3] = \"IncrementalSnapshot\";\n EventType2[EventType2[\"Meta\"] = 4] = \"Meta\";\n EventType2[EventType2[\"Custom\"] = 5] = \"Custom\";\n EventType2[EventType2[\"Plugin\"] = 6] = \"Plugin\";\n return EventType2;\n})(EventType || {});\nvar IncrementalSource = /* @__PURE__ */ ((IncrementalSource2) => {\n IncrementalSource2[IncrementalSource2[\"Mutation\"] = 0] = \"Mutation\";\n IncrementalSource2[IncrementalSource2[\"MouseMove\"] = 1] = \"MouseMove\";\n IncrementalSource2[IncrementalSource2[\"MouseInteraction\"] = 2] = \"MouseInteraction\";\n IncrementalSource2[IncrementalSource2[\"Scroll\"] = 3] = \"Scroll\";\n IncrementalSource2[IncrementalSource2[\"ViewportResize\"] = 4] = \"ViewportResize\";\n IncrementalSource2[IncrementalSource2[\"Input\"] = 5] = \"Input\";\n IncrementalSource2[IncrementalSource2[\"TouchMove\"] = 6] = \"TouchMove\";\n IncrementalSource2[IncrementalSource2[\"MediaInteraction\"] = 7] = \"MediaInteraction\";\n IncrementalSource2[IncrementalSource2[\"StyleSheetRule\"] = 8] = \"StyleSheetRule\";\n IncrementalSource2[IncrementalSource2[\"CanvasMutation\"] = 9] = \"CanvasMutation\";\n IncrementalSource2[IncrementalSource2[\"Font\"] = 10] = \"Font\";\n IncrementalSource2[IncrementalSource2[\"Log\"] = 11] = \"Log\";\n IncrementalSource2[IncrementalSource2[\"Drag\"] = 12] = \"Drag\";\n IncrementalSource2[IncrementalSource2[\"StyleDeclaration\"] = 13] = \"StyleDeclaration\";\n IncrementalSource2[IncrementalSource2[\"Selection\"] = 14] = \"Selection\";\n IncrementalSource2[IncrementalSource2[\"AdoptedStyleSheet\"] = 15] = \"AdoptedStyleSheet\";\n IncrementalSource2[IncrementalSource2[\"CustomElement\"] = 16] = \"CustomElement\";\n return IncrementalSource2;\n})(IncrementalSource || {});\nvar MouseInteractions = /* @__PURE__ */ ((MouseInteractions2) => {\n MouseInteractions2[MouseInteractions2[\"MouseUp\"] = 0] = \"MouseUp\";\n MouseInteractions2[MouseInteractions2[\"MouseDown\"] = 1] = \"MouseDown\";\n MouseInteractions2[MouseInteractions2[\"Click\"] = 2] = \"Click\";\n MouseInteractions2[MouseInteractions2[\"ContextMenu\"] = 3] = \"ContextMenu\";\n MouseInteractions2[MouseInteractions2[\"DblClick\"] = 4] = \"DblClick\";\n MouseInteractions2[MouseInteractions2[\"Focus\"] = 5] = \"Focus\";\n MouseInteractions2[MouseInteractions2[\"Blur\"] = 6] = \"Blur\";\n MouseInteractions2[MouseInteractions2[\"TouchStart\"] = 7] = \"TouchStart\";\n MouseInteractions2[MouseInteractions2[\"TouchMove_Departed\"] = 8] = \"TouchMove_Departed\";\n MouseInteractions2[MouseInteractions2[\"TouchEnd\"] = 9] = \"TouchEnd\";\n MouseInteractions2[MouseInteractions2[\"TouchCancel\"] = 10] = \"TouchCancel\";\n return MouseInteractions2;\n})(MouseInteractions || {});\nvar PointerTypes = /* @__PURE__ */ ((PointerTypes2) => {\n PointerTypes2[PointerTypes2[\"Mouse\"] = 0] = \"Mouse\";\n PointerTypes2[PointerTypes2[\"Pen\"] = 1] = \"Pen\";\n PointerTypes2[PointerTypes2[\"Touch\"] = 2] = \"Touch\";\n return PointerTypes2;\n})(PointerTypes || {});\n\nfunction _optionalChain$3(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }\nfunction isNodeInLinkedList(n) {\n return '__ln' in n;\n}\nclass DoubleLinkedList {\n constructor() {\n this.length = 0;\n this.head = null;\n this.tail = null;\n }\n get(position) {\n if (position >= this.length) {\n throw new Error('Position outside of list range');\n }\n let current = this.head;\n for (let index = 0; index < position; index++) {\n current = _optionalChain$3([current, 'optionalAccess', _ => _.next]) || null;\n }\n return current;\n }\n addNode(n) {\n const node = {\n value: n,\n previous: null,\n next: null,\n };\n n.__ln = node;\n if (n.previousSibling && isNodeInLinkedList(n.previousSibling)) {\n const current = n.previousSibling.__ln.next;\n node.next = current;\n node.previous = n.previousSibling.__ln;\n n.previousSibling.__ln.next = node;\n if (current) {\n current.previous = node;\n }\n }\n else if (n.nextSibling &&\n isNodeInLinkedList(n.nextSibling) &&\n n.nextSibling.__ln.previous) {\n const current = n.nextSibling.__ln.previous;\n node.previous = current;\n node.next = n.nextSibling.__ln;\n n.nextSibling.__ln.previous = node;\n if (current) {\n current.next = node;\n }\n }\n else {\n if (this.head) {\n this.head.previous = node;\n }\n node.next = this.head;\n this.head = node;\n }\n if (node.next === null) {\n this.tail = node;\n }\n this.length++;\n }\n removeNode(n) {\n const current = n.__ln;\n if (!this.head) {\n return;\n }\n if (!current.previous) {\n this.head = current.next;\n if (this.head) {\n this.head.previous = null;\n }\n else {\n this.tail = null;\n }\n }\n else {\n current.previous.next = current.next;\n if (current.next) {\n current.next.previous = current.previous;\n }\n else {\n this.tail = current.previous;\n }\n }\n if (n.__ln) {\n delete n.__ln;\n }\n this.length--;\n }\n}\nconst moveKey = (id, parentId) => `${id}@${parentId}`;\nclass MutationBuffer {\n constructor() {\n this.frozen = false;\n this.locked = false;\n this.texts = [];\n this.attributes = [];\n this.attributeMap = new WeakMap();\n this.removes = [];\n this.mapRemoves = [];\n this.movedMap = {};\n this.addedSet = new Set();\n this.movedSet = new Set();\n this.droppedSet = new Set();\n this.processMutations = (mutations) => {\n mutations.forEach(this.processMutation);\n this.emit();\n };\n this.emit = () => {\n if (this.frozen || this.locked) {\n return;\n }\n const adds = [];\n const addedIds = new Set();\n const addList = new DoubleLinkedList();\n const getNextId = (n) => {\n let ns = n;\n let nextId = IGNORED_NODE;\n while (nextId === IGNORED_NODE) {\n ns = ns && ns.nextSibling;\n nextId = ns && this.mirror.getId(ns);\n }\n return nextId;\n };\n const pushAdd = (n) => {\n if (!n.parentNode || !inDom(n)) {\n return;\n }\n const parentId = isShadowRoot(n.parentNode)\n ? this.mirror.getId(getShadowHost(n))\n : this.mirror.getId(n.parentNode);\n const nextId = getNextId(n);\n if (parentId === -1 || nextId === -1) {\n return addList.addNode(n);\n }\n const sn = serializeNodeWithId(n, {\n doc: this.doc,\n mirror: this.mirror,\n blockClass: this.blockClass,\n blockSelector: this.blockSelector,\n maskAllText: this.maskAllText,\n unblockSelector: this.unblockSelector,\n maskTextClass: this.maskTextClass,\n unmaskTextClass: this.unmaskTextClass,\n maskTextSelector: this.maskTextSelector,\n unmaskTextSelector: this.unmaskTextSelector,\n skipChild: true,\n newlyAddedElement: true,\n inlineStylesheet: this.inlineStylesheet,\n maskInputOptions: this.maskInputOptions,\n maskAttributeFn: this.maskAttributeFn,\n maskTextFn: this.maskTextFn,\n maskInputFn: this.maskInputFn,\n slimDOMOptions: this.slimDOMOptions,\n dataURLOptions: this.dataURLOptions,\n recordCanvas: this.recordCanvas,\n inlineImages: this.inlineImages,\n onSerialize: (currentN) => {\n if (isSerializedIframe(currentN, this.mirror) &&\n !isBlocked(currentN, this.blockClass, this.blockSelector, this.unblockSelector, false)) {\n this.iframeManager.addIframe(currentN);\n }\n if (isSerializedStylesheet(currentN, this.mirror)) {\n this.stylesheetManager.trackLinkElement(currentN);\n }\n if (hasShadowRoot(n)) {\n this.shadowDomManager.addShadowRoot(n.shadowRoot, this.doc);\n }\n },\n onIframeLoad: (iframe, childSn) => {\n if (isBlocked(iframe, this.blockClass, this.blockSelector, this.unblockSelector, false)) {\n return;\n }\n this.iframeManager.attachIframe(iframe, childSn);\n if (iframe.contentWindow) {\n this.canvasManager.addWindow(iframe.contentWindow);\n }\n this.shadowDomManager.observeAttachShadow(iframe);\n },\n onStylesheetLoad: (link, childSn) => {\n this.stylesheetManager.attachLinkElement(link, childSn);\n },\n });\n if (sn) {\n adds.push({\n parentId,\n nextId,\n node: sn,\n });\n addedIds.add(sn.id);\n }\n };\n while (this.mapRemoves.length) {\n this.mirror.removeNodeFromMap(this.mapRemoves.shift());\n }\n for (const n of this.movedSet) {\n if (isParentRemoved(this.removes, n, this.mirror) &&\n !this.movedSet.has(n.parentNode)) {\n continue;\n }\n pushAdd(n);\n }\n for (const n of this.addedSet) {\n if (!isAncestorInSet(this.droppedSet, n) &&\n !isParentRemoved(this.removes, n, this.mirror)) {\n pushAdd(n);\n }\n else if (isAncestorInSet(this.movedSet, n)) {\n pushAdd(n);\n }\n else {\n this.droppedSet.add(n);\n }\n }\n let candidate = null;\n while (addList.length) {\n let node = null;\n if (candidate) {\n const parentId = this.mirror.getId(candidate.value.parentNode);\n const nextId = getNextId(candidate.value);\n if (parentId !== -1 && nextId !== -1) {\n node = candidate;\n }\n }\n if (!node) {\n let tailNode = addList.tail;\n while (tailNode) {\n const _node = tailNode;\n tailNode = tailNode.previous;\n if (_node) {\n const parentId = this.mirror.getId(_node.value.parentNode);\n const nextId = getNextId(_node.value);\n if (nextId === -1)\n continue;\n else if (parentId !== -1) {\n node = _node;\n break;\n }\n else {\n const unhandledNode = _node.value;\n if (unhandledNode.parentNode &&\n unhandledNode.parentNode.nodeType ===\n Node.DOCUMENT_FRAGMENT_NODE) {\n const shadowHost = unhandledNode.parentNode\n .host;\n const parentId = this.mirror.getId(shadowHost);\n if (parentId !== -1) {\n node = _node;\n break;\n }\n }\n }\n }\n }\n }\n if (!node) {\n while (addList.head) {\n addList.removeNode(addList.head.value);\n }\n break;\n }\n candidate = node.previous;\n addList.removeNode(node.value);\n pushAdd(node.value);\n }\n const payload = {\n texts: this.texts\n .map((text) => ({\n id: this.mirror.getId(text.node),\n value: text.value,\n }))\n .filter((text) => !addedIds.has(text.id))\n .filter((text) => this.mirror.has(text.id)),\n attributes: this.attributes\n .map((attribute) => {\n const { attributes } = attribute;\n if (typeof attributes.style === 'string') {\n const diffAsStr = JSON.stringify(attribute.styleDiff);\n const unchangedAsStr = JSON.stringify(attribute._unchangedStyles);\n if (diffAsStr.length < attributes.style.length) {\n if ((diffAsStr + unchangedAsStr).split('var(').length ===\n attributes.style.split('var(').length) {\n attributes.style = attribute.styleDiff;\n }\n }\n }\n return {\n id: this.mirror.getId(attribute.node),\n attributes: attributes,\n };\n })\n .filter((attribute) => !addedIds.has(attribute.id))\n .filter((attribute) => this.mirror.has(attribute.id)),\n removes: this.removes,\n adds,\n };\n if (!payload.texts.length &&\n !payload.attributes.length &&\n !payload.removes.length &&\n !payload.adds.length) {\n return;\n }\n this.texts = [];\n this.attributes = [];\n this.attributeMap = new WeakMap();\n this.removes = [];\n this.addedSet = new Set();\n this.movedSet = new Set();\n this.droppedSet = new Set();\n this.movedMap = {};\n this.mutationCb(payload);\n };\n this.processMutation = (m) => {\n if (isIgnored(m.target, this.mirror)) {\n return;\n }\n switch (m.type) {\n case 'characterData': {\n const value = m.target.textContent;\n if (!isBlocked(m.target, this.blockClass, this.blockSelector, this.unblockSelector, false) &&\n value !== m.oldValue) {\n this.texts.push({\n value: needMaskingText(m.target, this.maskTextClass, this.maskTextSelector, this.unmaskTextClass, this.unmaskTextSelector, this.maskAllText) && value\n ? this.maskTextFn\n ? this.maskTextFn(value, closestElementOfNode(m.target))\n : value.replace(/[\\S]/g, '*')\n : value,\n node: m.target,\n });\n }\n break;\n }\n case 'attributes': {\n const target = m.target;\n let attributeName = m.attributeName;\n let value = m.target.getAttribute(attributeName);\n if (attributeName === 'value') {\n const type = getInputType(target);\n const tagName = target.tagName;\n value = getInputValue(target, tagName, type);\n const isInputMasked = shouldMaskInput({\n maskInputOptions: this.maskInputOptions,\n tagName,\n type,\n });\n const forceMask = needMaskingText(m.target, this.maskTextClass, this.maskTextSelector, this.unmaskTextClass, this.unmaskTextSelector, isInputMasked);\n value = maskInputValue({\n isMasked: forceMask,\n element: target,\n value,\n maskInputFn: this.maskInputFn,\n });\n }\n if (isBlocked(m.target, this.blockClass, this.blockSelector, this.unblockSelector, false) ||\n value === m.oldValue) {\n return;\n }\n let item = this.attributeMap.get(m.target);\n if (target.tagName === 'IFRAME' &&\n attributeName === 'src' &&\n !this.keepIframeSrcFn(value)) {\n if (!target.contentDocument) {\n attributeName = 'rr_src';\n }\n else {\n return;\n }\n }\n if (!item) {\n item = {\n node: m.target,\n attributes: {},\n styleDiff: {},\n _unchangedStyles: {},\n };\n this.attributes.push(item);\n this.attributeMap.set(m.target, item);\n }\n if (attributeName === 'type' &&\n target.tagName === 'INPUT' &&\n (m.oldValue || '').toLowerCase() === 'password') {\n target.setAttribute('data-rr-is-password', 'true');\n }\n if (!ignoreAttribute(target.tagName, attributeName)) {\n item.attributes[attributeName] = transformAttribute(this.doc, toLowerCase(target.tagName), toLowerCase(attributeName), value, target, this.maskAttributeFn);\n if (attributeName === 'style') {\n if (!this.unattachedDoc) {\n try {\n this.unattachedDoc =\n document.implementation.createHTMLDocument();\n }\n catch (e) {\n this.unattachedDoc = this.doc;\n }\n }\n const old = this.unattachedDoc.createElement('span');\n if (m.oldValue) {\n old.setAttribute('style', m.oldValue);\n }\n for (const pname of Array.from(target.style)) {\n const newValue = target.style.getPropertyValue(pname);\n const newPriority = target.style.getPropertyPriority(pname);\n if (newValue !== old.style.getPropertyValue(pname) ||\n newPriority !== old.style.getPropertyPriority(pname)) {\n if (newPriority === '') {\n item.styleDiff[pname] = newValue;\n }\n else {\n item.styleDiff[pname] = [newValue, newPriority];\n }\n }\n else {\n item._unchangedStyles[pname] = [newValue, newPriority];\n }\n }\n for (const pname of Array.from(old.style)) {\n if (target.style.getPropertyValue(pname) === '') {\n item.styleDiff[pname] = false;\n }\n }\n }\n }\n break;\n }\n case 'childList': {\n if (isBlocked(m.target, this.blockClass, this.blockSelector, this.unblockSelector, true)) {\n return;\n }\n m.addedNodes.forEach((n) => this.genAdds(n, m.target));\n m.removedNodes.forEach((n) => {\n const nodeId = this.mirror.getId(n);\n const parentId = isShadowRoot(m.target)\n ? this.mirror.getId(m.target.host)\n : this.mirror.getId(m.target);\n if (isBlocked(m.target, this.blockClass, this.blockSelector, this.unblockSelector, false) ||\n isIgnored(n, this.mirror) ||\n !isSerialized(n, this.mirror)) {\n return;\n }\n if (this.addedSet.has(n)) {\n deepDelete(this.addedSet, n);\n this.droppedSet.add(n);\n }\n else if (this.addedSet.has(m.target) && nodeId === -1) ;\n else if (isAncestorRemoved(m.target, this.mirror)) ;\n else if (this.movedSet.has(n) &&\n this.movedMap[moveKey(nodeId, parentId)]) {\n deepDelete(this.movedSet, n);\n }\n else {\n this.removes.push({\n parentId,\n id: nodeId,\n isShadow: isShadowRoot(m.target) && isNativeShadowDom(m.target)\n ? true\n : undefined,\n });\n }\n this.mapRemoves.push(n);\n });\n break;\n }\n }\n };\n this.genAdds = (n, target) => {\n if (this.processedNodeManager.inOtherBuffer(n, this))\n return;\n if (this.addedSet.has(n) || this.movedSet.has(n))\n return;\n if (this.mirror.hasNode(n)) {\n if (isIgnored(n, this.mirror)) {\n return;\n }\n this.movedSet.add(n);\n let targetId = null;\n if (target && this.mirror.hasNode(target)) {\n targetId = this.mirror.getId(target);\n }\n if (targetId && targetId !== -1) {\n this.movedMap[moveKey(this.mirror.getId(n), targetId)] = true;\n }\n }\n else {\n this.addedSet.add(n);\n this.droppedSet.delete(n);\n }\n if (!isBlocked(n, this.blockClass, this.blockSelector, this.unblockSelector, false)) {\n n.childNodes.forEach((childN) => this.genAdds(childN));\n if (hasShadowRoot(n)) {\n n.shadowRoot.childNodes.forEach((childN) => {\n this.processedNodeManager.add(childN, this);\n this.genAdds(childN, n);\n });\n }\n }\n };\n }\n init(options) {\n [\n 'mutationCb',\n 'blockClass',\n 'blockSelector',\n 'unblockSelector',\n 'maskAllText',\n 'maskTextClass',\n 'unmaskTextClass',\n 'maskTextSelector',\n 'unmaskTextSelector',\n 'inlineStylesheet',\n 'maskInputOptions',\n 'maskAttributeFn',\n 'maskTextFn',\n 'maskInputFn',\n 'keepIframeSrcFn',\n 'recordCanvas',\n 'inlineImages',\n 'slimDOMOptions',\n 'dataURLOptions',\n 'doc',\n 'mirror',\n 'iframeManager',\n 'stylesheetManager',\n 'shadowDomManager',\n 'canvasManager',\n 'processedNodeManager',\n ].forEach((key) => {\n this[key] = options[key];\n });\n }\n freeze() {\n this.frozen = true;\n this.canvasManager.freeze();\n }\n unfreeze() {\n this.frozen = false;\n this.canvasManager.unfreeze();\n this.emit();\n }\n isFrozen() {\n return this.frozen;\n }\n lock() {\n this.locked = true;\n this.canvasManager.lock();\n }\n unlock() {\n this.locked = false;\n this.canvasManager.unlock();\n this.emit();\n }\n reset() {\n this.shadowDomManager.reset();\n this.canvasManager.reset();\n }\n}\nfunction deepDelete(addsSet, n) {\n addsSet.delete(n);\n n.childNodes.forEach((childN) => deepDelete(addsSet, childN));\n}\nfunction isParentRemoved(removes, n, mirror) {\n if (removes.length === 0)\n return false;\n return _isParentRemoved(removes, n, mirror);\n}\nfunction _isParentRemoved(removes, n, mirror) {\n let node = n.parentNode;\n while (node) {\n const parentId = mirror.getId(node);\n if (removes.some((r) => r.id === parentId)) {\n return true;\n }\n node = node.parentNode;\n }\n return false;\n}\nfunction isAncestorInSet(set, n) {\n if (set.size === 0)\n return false;\n return _isAncestorInSet(set, n);\n}\nfunction _isAncestorInSet(set, n) {\n const { parentNode } = n;\n if (!parentNode) {\n return false;\n }\n if (set.has(parentNode)) {\n return true;\n }\n return _isAncestorInSet(set, parentNode);\n}\n\nlet errorHandler;\nfunction registerErrorHandler(handler) {\n errorHandler = handler;\n}\nfunction unregisterErrorHandler() {\n errorHandler = undefined;\n}\nconst callbackWrapper = (cb) => {\n if (!errorHandler) {\n return cb;\n }\n const rrwebWrapped = ((...rest) => {\n try {\n return cb(...rest);\n }\n catch (error) {\n if (errorHandler && errorHandler(error) === true) {\n return () => {\n };\n }\n throw error;\n }\n });\n return rrwebWrapped;\n};\n\nfunction _optionalChain$2(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }\nconst mutationBuffers = [];\nfunction getEventTarget(event) {\n try {\n if ('composedPath' in event) {\n const path = event.composedPath();\n if (path.length) {\n return path[0];\n }\n }\n else if ('path' in event && event.path.length) {\n return event.path[0];\n }\n }\n catch (e2) {\n }\n return event && event.target;\n}\nfunction initMutationObserver(options, rootEl) {\n const mutationBuffer = new MutationBuffer();\n mutationBuffers.push(mutationBuffer);\n mutationBuffer.init(options);\n let mutationObserverCtor = window.MutationObserver ||\n window.__rrMutationObserver;\n const angularZoneSymbol = _optionalChain$2([window, 'optionalAccess', _ => _.Zone, 'optionalAccess', _2 => _2.__symbol__, 'optionalCall', _3 => _3('MutationObserver')]);\n if (angularZoneSymbol &&\n window[angularZoneSymbol]) {\n mutationObserverCtor = window[angularZoneSymbol];\n }\n const observer = new mutationObserverCtor(callbackWrapper((mutations) => {\n if (options.onMutation && options.onMutation(mutations) === false) {\n return;\n }\n mutationBuffer.processMutations.bind(mutationBuffer)(mutations);\n }));\n observer.observe(rootEl, {\n attributes: true,\n attributeOldValue: true,\n characterData: true,\n characterDataOldValue: true,\n childList: true,\n subtree: true,\n });\n return observer;\n}\nfunction initMoveObserver({ mousemoveCb, sampling, doc, mirror, }) {\n if (sampling.mousemove === false) {\n return () => {\n };\n }\n const threshold = typeof sampling.mousemove === 'number' ? sampling.mousemove : 50;\n const callbackThreshold = typeof sampling.mousemoveCallback === 'number'\n ? sampling.mousemoveCallback\n : 500;\n let positions = [];\n let timeBaseline;\n const wrappedCb = throttle$1(callbackWrapper((source) => {\n const totalOffset = Date.now() - timeBaseline;\n mousemoveCb(positions.map((p) => {\n p.timeOffset -= totalOffset;\n return p;\n }), source);\n positions = [];\n timeBaseline = null;\n }), callbackThreshold);\n const updatePosition = callbackWrapper(throttle$1(callbackWrapper((evt) => {\n const target = getEventTarget(evt);\n const { clientX, clientY } = legacy_isTouchEvent(evt)\n ? evt.changedTouches[0]\n : evt;\n if (!timeBaseline) {\n timeBaseline = nowTimestamp();\n }\n positions.push({\n x: clientX,\n y: clientY,\n id: mirror.getId(target),\n timeOffset: nowTimestamp() - timeBaseline,\n });\n wrappedCb(typeof DragEvent !== 'undefined' && evt instanceof DragEvent\n ? IncrementalSource.Drag\n : evt instanceof MouseEvent\n ? IncrementalSource.MouseMove\n : IncrementalSource.TouchMove);\n }), threshold, {\n trailing: false,\n }));\n const handlers = [\n on('mousemove', updatePosition, doc),\n on('touchmove', updatePosition, doc),\n on('drag', updatePosition, doc),\n ];\n return callbackWrapper(() => {\n handlers.forEach((h) => h());\n });\n}\nfunction initMouseInteractionObserver({ mouseInteractionCb, doc, mirror, blockClass, blockSelector, unblockSelector, sampling, }) {\n if (sampling.mouseInteraction === false) {\n return () => {\n };\n }\n const disableMap = sampling.mouseInteraction === true ||\n sampling.mouseInteraction === undefined\n ? {}\n : sampling.mouseInteraction;\n const handlers = [];\n let currentPointerType = null;\n const getHandler = (eventKey) => {\n return (event) => {\n const target = getEventTarget(event);\n if (isBlocked(target, blockClass, blockSelector, unblockSelector, true)) {\n return;\n }\n let pointerType = null;\n let thisEventKey = eventKey;\n if ('pointerType' in event) {\n switch (event.pointerType) {\n case 'mouse':\n pointerType = PointerTypes.Mouse;\n break;\n case 'touch':\n pointerType = PointerTypes.Touch;\n break;\n case 'pen':\n pointerType = PointerTypes.Pen;\n break;\n }\n if (pointerType === PointerTypes.Touch) {\n if (MouseInteractions[eventKey] === MouseInteractions.MouseDown) {\n thisEventKey = 'TouchStart';\n }\n else if (MouseInteractions[eventKey] === MouseInteractions.MouseUp) {\n thisEventKey = 'TouchEnd';\n }\n }\n else if (pointerType === PointerTypes.Pen) ;\n }\n else if (legacy_isTouchEvent(event)) {\n pointerType = PointerTypes.Touch;\n }\n if (pointerType !== null) {\n currentPointerType = pointerType;\n if ((thisEventKey.startsWith('Touch') &&\n pointerType === PointerTypes.Touch) ||\n (thisEventKey.startsWith('Mouse') &&\n pointerType === PointerTypes.Mouse)) {\n pointerType = null;\n }\n }\n else if (MouseInteractions[eventKey] === MouseInteractions.Click) {\n pointerType = currentPointerType;\n currentPointerType = null;\n }\n const e = legacy_isTouchEvent(event) ? event.changedTouches[0] : event;\n if (!e) {\n return;\n }\n const id = mirror.getId(target);\n const { clientX, clientY } = e;\n callbackWrapper(mouseInteractionCb)({\n type: MouseInteractions[thisEventKey],\n id,\n x: clientX,\n y: clientY,\n ...(pointerType !== null && { pointerType }),\n });\n };\n };\n Object.keys(MouseInteractions)\n .filter((key) => Number.isNaN(Number(key)) &&\n !key.endsWith('_Departed') &&\n disableMap[key] !== false)\n .forEach((eventKey) => {\n let eventName = toLowerCase(eventKey);\n const handler = getHandler(eventKey);\n if (window.PointerEvent) {\n switch (MouseInteractions[eventKey]) {\n case MouseInteractions.MouseDown:\n case MouseInteractions.MouseUp:\n eventName = eventName.replace('mouse', 'pointer');\n break;\n case MouseInteractions.TouchStart:\n case MouseInteractions.TouchEnd:\n return;\n }\n }\n handlers.push(on(eventName, handler, doc));\n });\n return callbackWrapper(() => {\n handlers.forEach((h) => h());\n });\n}\nfunction initScrollObserver({ scrollCb, doc, mirror, blockClass, blockSelector, unblockSelector, sampling, }) {\n const updatePosition = callbackWrapper(throttle$1(callbackWrapper((evt) => {\n const target = getEventTarget(evt);\n if (!target ||\n isBlocked(target, blockClass, blockSelector, unblockSelector, true)) {\n return;\n }\n const id = mirror.getId(target);\n if (target === doc && doc.defaultView) {\n const scrollLeftTop = getWindowScroll(doc.defaultView);\n scrollCb({\n id,\n x: scrollLeftTop.left,\n y: scrollLeftTop.top,\n });\n }\n else {\n scrollCb({\n id,\n x: target.scrollLeft,\n y: target.scrollTop,\n });\n }\n }), sampling.scroll || 100));\n return on('scroll', updatePosition, doc);\n}\nfunction initViewportResizeObserver({ viewportResizeCb }, { win }) {\n let lastH = -1;\n let lastW = -1;\n const updateDimension = callbackWrapper(throttle$1(callbackWrapper(() => {\n const height = getWindowHeight();\n const width = getWindowWidth();\n if (lastH !== height || lastW !== width) {\n viewportResizeCb({\n width: Number(width),\n height: Number(height),\n });\n lastH = height;\n lastW = width;\n }\n }), 200));\n return on('resize', updateDimension, win);\n}\nconst INPUT_TAGS = ['INPUT', 'TEXTAREA', 'SELECT'];\nconst lastInputValueMap = new WeakMap();\nfunction initInputObserver({ inputCb, doc, mirror, blockClass, blockSelector, unblockSelector, ignoreClass, ignoreSelector, maskInputOptions, maskInputFn, sampling, userTriggeredOnInput, maskTextClass, unmaskTextClass, maskTextSelector, unmaskTextSelector, }) {\n function eventHandler(event) {\n let target = getEventTarget(event);\n const userTriggered = event.isTrusted;\n const tagName = target && toUpperCase(target.tagName);\n if (tagName === 'OPTION')\n target = target.parentElement;\n if (!target ||\n !tagName ||\n INPUT_TAGS.indexOf(tagName) < 0 ||\n isBlocked(target, blockClass, blockSelector, unblockSelector, true)) {\n return;\n }\n const el = target;\n if (el.classList.contains(ignoreClass) ||\n (ignoreSelector && el.matches(ignoreSelector))) {\n return;\n }\n const type = getInputType(target);\n let text = getInputValue(el, tagName, type);\n let isChecked = false;\n const isInputMasked = shouldMaskInput({\n maskInputOptions,\n tagName,\n type,\n });\n const forceMask = needMaskingText(target, maskTextClass, maskTextSelector, unmaskTextClass, unmaskTextSelector, isInputMasked);\n if (type === 'radio' || type === 'checkbox') {\n isChecked = target.checked;\n }\n text = maskInputValue({\n isMasked: forceMask,\n element: target,\n value: text,\n maskInputFn,\n });\n cbWithDedup(target, userTriggeredOnInput\n ? { text, isChecked, userTriggered }\n : { text, isChecked });\n const name = target.name;\n if (type === 'radio' && name && isChecked) {\n doc\n .querySelectorAll(`input[type=\"radio\"][name=\"${name}\"]`)\n .forEach((el) => {\n if (el !== target) {\n const text = maskInputValue({\n isMasked: forceMask,\n element: el,\n value: getInputValue(el, tagName, type),\n maskInputFn,\n });\n cbWithDedup(el, userTriggeredOnInput\n ? { text, isChecked: !isChecked, userTriggered: false }\n : { text, isChecked: !isChecked });\n }\n });\n }\n }\n function cbWithDedup(target, v) {\n const lastInputValue = lastInputValueMap.get(target);\n if (!lastInputValue ||\n lastInputValue.text !== v.text ||\n lastInputValue.isChecked !== v.isChecked) {\n lastInputValueMap.set(target, v);\n const id = mirror.getId(target);\n callbackWrapper(inputCb)({\n ...v,\n id,\n });\n }\n }\n const events = sampling.input === 'last' ? ['change'] : ['input', 'change'];\n const handlers = events.map((eventName) => on(eventName, callbackWrapper(eventHandler), doc));\n const currentWindow = doc.defaultView;\n if (!currentWindow) {\n return () => {\n handlers.forEach((h) => h());\n };\n }\n const propertyDescriptor = currentWindow.Object.getOwnPropertyDescriptor(currentWindow.HTMLInputElement.prototype, 'value');\n const hookProperties = [\n [currentWindow.HTMLInputElement.prototype, 'value'],\n [currentWindow.HTMLInputElement.prototype, 'checked'],\n [currentWindow.HTMLSelectElement.prototype, 'value'],\n [currentWindow.HTMLTextAreaElement.prototype, 'value'],\n [currentWindow.HTMLSelectElement.prototype, 'selectedIndex'],\n [currentWindow.HTMLOptionElement.prototype, 'selected'],\n ];\n if (propertyDescriptor && propertyDescriptor.set) {\n handlers.push(...hookProperties.map((p) => hookSetter(p[0], p[1], {\n set() {\n callbackWrapper(eventHandler)({\n target: this,\n isTrusted: false,\n });\n },\n }, false, currentWindow)));\n }\n return callbackWrapper(() => {\n handlers.forEach((h) => h());\n });\n}\nfunction getNestedCSSRulePositions(rule) {\n const positions = [];\n function recurse(childRule, pos) {\n if ((hasNestedCSSRule('CSSGroupingRule') &&\n childRule.parentRule instanceof CSSGroupingRule) ||\n (hasNestedCSSRule('CSSMediaRule') &&\n childRule.parentRule instanceof CSSMediaRule) ||\n (hasNestedCSSRule('CSSSupportsRule') &&\n childRule.parentRule instanceof CSSSupportsRule) ||\n (hasNestedCSSRule('CSSConditionRule') &&\n childRule.parentRule instanceof CSSConditionRule)) {\n const rules = Array.from(childRule.parentRule.cssRules);\n const index = rules.indexOf(childRule);\n pos.unshift(index);\n }\n else if (childRule.parentStyleSheet) {\n const rules = Array.from(childRule.parentStyleSheet.cssRules);\n const index = rules.indexOf(childRule);\n pos.unshift(index);\n }\n return pos;\n }\n return recurse(rule, positions);\n}\nfunction getIdAndStyleId(sheet, mirror, styleMirror) {\n let id, styleId;\n if (!sheet)\n return {};\n if (sheet.ownerNode)\n id = mirror.getId(sheet.ownerNode);\n else\n styleId = styleMirror.getId(sheet);\n return {\n styleId,\n id,\n };\n}\nfunction initStyleSheetObserver({ styleSheetRuleCb, mirror, stylesheetManager }, { win }) {\n if (!win.CSSStyleSheet || !win.CSSStyleSheet.prototype) {\n return () => {\n };\n }\n const insertRule = win.CSSStyleSheet.prototype.insertRule;\n win.CSSStyleSheet.prototype.insertRule = new Proxy(insertRule, {\n apply: callbackWrapper((target, thisArg, argumentsList) => {\n const [rule, index] = argumentsList;\n const { id, styleId } = getIdAndStyleId(thisArg, mirror, stylesheetManager.styleMirror);\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\n styleSheetRuleCb({\n id,\n styleId,\n adds: [{ rule, index }],\n });\n }\n return target.apply(thisArg, argumentsList);\n }),\n });\n const deleteRule = win.CSSStyleSheet.prototype.deleteRule;\n win.CSSStyleSheet.prototype.deleteRule = new Proxy(deleteRule, {\n apply: callbackWrapper((target, thisArg, argumentsList) => {\n const [index] = argumentsList;\n const { id, styleId } = getIdAndStyleId(thisArg, mirror, stylesheetManager.styleMirror);\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\n styleSheetRuleCb({\n id,\n styleId,\n removes: [{ index }],\n });\n }\n return target.apply(thisArg, argumentsList);\n }),\n });\n let replace;\n if (win.CSSStyleSheet.prototype.replace) {\n replace = win.CSSStyleSheet.prototype.replace;\n win.CSSStyleSheet.prototype.replace = new Proxy(replace, {\n apply: callbackWrapper((target, thisArg, argumentsList) => {\n const [text] = argumentsList;\n const { id, styleId } = getIdAndStyleId(thisArg, mirror, stylesheetManager.styleMirror);\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\n styleSheetRuleCb({\n id,\n styleId,\n replace: text,\n });\n }\n return target.apply(thisArg, argumentsList);\n }),\n });\n }\n let replaceSync;\n if (win.CSSStyleSheet.prototype.replaceSync) {\n replaceSync = win.CSSStyleSheet.prototype.replaceSync;\n win.CSSStyleSheet.prototype.replaceSync = new Proxy(replaceSync, {\n apply: callbackWrapper((target, thisArg, argumentsList) => {\n const [text] = argumentsList;\n const { id, styleId } = getIdAndStyleId(thisArg, mirror, stylesheetManager.styleMirror);\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\n styleSheetRuleCb({\n id,\n styleId,\n replaceSync: text,\n });\n }\n return target.apply(thisArg, argumentsList);\n }),\n });\n }\n const supportedNestedCSSRuleTypes = {};\n if (canMonkeyPatchNestedCSSRule('CSSGroupingRule')) {\n supportedNestedCSSRuleTypes.CSSGroupingRule = win.CSSGroupingRule;\n }\n else {\n if (canMonkeyPatchNestedCSSRule('CSSMediaRule')) {\n supportedNestedCSSRuleTypes.CSSMediaRule = win.CSSMediaRule;\n }\n if (canMonkeyPatchNestedCSSRule('CSSConditionRule')) {\n supportedNestedCSSRuleTypes.CSSConditionRule = win.CSSConditionRule;\n }\n if (canMonkeyPatchNestedCSSRule('CSSSupportsRule')) {\n supportedNestedCSSRuleTypes.CSSSupportsRule = win.CSSSupportsRule;\n }\n }\n const unmodifiedFunctions = {};\n Object.entries(supportedNestedCSSRuleTypes).forEach(([typeKey, type]) => {\n unmodifiedFunctions[typeKey] = {\n insertRule: type.prototype.insertRule,\n deleteRule: type.prototype.deleteRule,\n };\n type.prototype.insertRule = new Proxy(unmodifiedFunctions[typeKey].insertRule, {\n apply: callbackWrapper((target, thisArg, argumentsList) => {\n const [rule, index] = argumentsList;\n const { id, styleId } = getIdAndStyleId(thisArg.parentStyleSheet, mirror, stylesheetManager.styleMirror);\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\n styleSheetRuleCb({\n id,\n styleId,\n adds: [\n {\n rule,\n index: [\n ...getNestedCSSRulePositions(thisArg),\n index || 0,\n ],\n },\n ],\n });\n }\n return target.apply(thisArg, argumentsList);\n }),\n });\n type.prototype.deleteRule = new Proxy(unmodifiedFunctions[typeKey].deleteRule, {\n apply: callbackWrapper((target, thisArg, argumentsList) => {\n const [index] = argumentsList;\n const { id, styleId } = getIdAndStyleId(thisArg.parentStyleSheet, mirror, stylesheetManager.styleMirror);\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\n styleSheetRuleCb({\n id,\n styleId,\n removes: [\n { index: [...getNestedCSSRulePositions(thisArg), index] },\n ],\n });\n }\n return target.apply(thisArg, argumentsList);\n }),\n });\n });\n return callbackWrapper(() => {\n win.CSSStyleSheet.prototype.insertRule = insertRule;\n win.CSSStyleSheet.prototype.deleteRule = deleteRule;\n replace && (win.CSSStyleSheet.prototype.replace = replace);\n replaceSync && (win.CSSStyleSheet.prototype.replaceSync = replaceSync);\n Object.entries(supportedNestedCSSRuleTypes).forEach(([typeKey, type]) => {\n type.prototype.insertRule = unmodifiedFunctions[typeKey].insertRule;\n type.prototype.deleteRule = unmodifiedFunctions[typeKey].deleteRule;\n });\n });\n}\nfunction initAdoptedStyleSheetObserver({ mirror, stylesheetManager, }, host) {\n let hostId = null;\n if (host.nodeName === '#document')\n hostId = mirror.getId(host);\n else\n hostId = mirror.getId(host.host);\n const patchTarget = host.nodeName === '#document'\n ? _optionalChain$2([host, 'access', _4 => _4.defaultView, 'optionalAccess', _5 => _5.Document])\n : _optionalChain$2([host, 'access', _6 => _6.ownerDocument, 'optionalAccess', _7 => _7.defaultView, 'optionalAccess', _8 => _8.ShadowRoot]);\n const originalPropertyDescriptor = _optionalChain$2([patchTarget, 'optionalAccess', _9 => _9.prototype])\n ? Object.getOwnPropertyDescriptor(_optionalChain$2([patchTarget, 'optionalAccess', _10 => _10.prototype]), 'adoptedStyleSheets')\n : undefined;\n if (hostId === null ||\n hostId === -1 ||\n !patchTarget ||\n !originalPropertyDescriptor)\n return () => {\n };\n Object.defineProperty(host, 'adoptedStyleSheets', {\n configurable: originalPropertyDescriptor.configurable,\n enumerable: originalPropertyDescriptor.enumerable,\n get() {\n return _optionalChain$2([originalPropertyDescriptor, 'access', _11 => _11.get, 'optionalAccess', _12 => _12.call, 'call', _13 => _13(this)]);\n },\n set(sheets) {\n const result = _optionalChain$2([originalPropertyDescriptor, 'access', _14 => _14.set, 'optionalAccess', _15 => _15.call, 'call', _16 => _16(this, sheets)]);\n if (hostId !== null && hostId !== -1) {\n try {\n stylesheetManager.adoptStyleSheets(sheets, hostId);\n }\n catch (e) {\n }\n }\n return result;\n },\n });\n return callbackWrapper(() => {\n Object.defineProperty(host, 'adoptedStyleSheets', {\n configurable: originalPropertyDescriptor.configurable,\n enumerable: originalPropertyDescriptor.enumerable,\n get: originalPropertyDescriptor.get,\n set: originalPropertyDescriptor.set,\n });\n });\n}\nfunction initStyleDeclarationObserver({ styleDeclarationCb, mirror, ignoreCSSAttributes, stylesheetManager, }, { win }) {\n const setProperty = win.CSSStyleDeclaration.prototype.setProperty;\n win.CSSStyleDeclaration.prototype.setProperty = new Proxy(setProperty, {\n apply: callbackWrapper((target, thisArg, argumentsList) => {\n const [property, value, priority] = argumentsList;\n if (ignoreCSSAttributes.has(property)) {\n return setProperty.apply(thisArg, [property, value, priority]);\n }\n const { id, styleId } = getIdAndStyleId(_optionalChain$2([thisArg, 'access', _17 => _17.parentRule, 'optionalAccess', _18 => _18.parentStyleSheet]), mirror, stylesheetManager.styleMirror);\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\n styleDeclarationCb({\n id,\n styleId,\n set: {\n property,\n value,\n priority,\n },\n index: getNestedCSSRulePositions(thisArg.parentRule),\n });\n }\n return target.apply(thisArg, argumentsList);\n }),\n });\n const removeProperty = win.CSSStyleDeclaration.prototype.removeProperty;\n win.CSSStyleDeclaration.prototype.removeProperty = new Proxy(removeProperty, {\n apply: callbackWrapper((target, thisArg, argumentsList) => {\n const [property] = argumentsList;\n if (ignoreCSSAttributes.has(property)) {\n return removeProperty.apply(thisArg, [property]);\n }\n const { id, styleId } = getIdAndStyleId(_optionalChain$2([thisArg, 'access', _19 => _19.parentRule, 'optionalAccess', _20 => _20.parentStyleSheet]), mirror, stylesheetManager.styleMirror);\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\n styleDeclarationCb({\n id,\n styleId,\n remove: {\n property,\n },\n index: getNestedCSSRulePositions(thisArg.parentRule),\n });\n }\n return target.apply(thisArg, argumentsList);\n }),\n });\n return callbackWrapper(() => {\n win.CSSStyleDeclaration.prototype.setProperty = setProperty;\n win.CSSStyleDeclaration.prototype.removeProperty = removeProperty;\n });\n}\nfunction initMediaInteractionObserver({ mediaInteractionCb, blockClass, blockSelector, unblockSelector, mirror, sampling, doc, }) {\n const handler = callbackWrapper((type) => throttle$1(callbackWrapper((event) => {\n const target = getEventTarget(event);\n if (!target ||\n isBlocked(target, blockClass, blockSelector, unblockSelector, true)) {\n return;\n }\n const { currentTime, volume, muted, playbackRate } = target;\n mediaInteractionCb({\n type,\n id: mirror.getId(target),\n currentTime,\n volume,\n muted,\n playbackRate,\n });\n }), sampling.media || 500));\n const handlers = [\n on('play', handler(0), doc),\n on('pause', handler(1), doc),\n on('seeked', handler(2), doc),\n on('volumechange', handler(3), doc),\n on('ratechange', handler(4), doc),\n ];\n return callbackWrapper(() => {\n handlers.forEach((h) => h());\n });\n}\nfunction initFontObserver({ fontCb, doc }) {\n const win = doc.defaultView;\n if (!win) {\n return () => {\n };\n }\n const handlers = [];\n const fontMap = new WeakMap();\n const originalFontFace = win.FontFace;\n win.FontFace = function FontFace(family, source, descriptors) {\n const fontFace = new originalFontFace(family, source, descriptors);\n fontMap.set(fontFace, {\n family,\n buffer: typeof source !== 'string',\n descriptors,\n fontSource: typeof source === 'string'\n ? source\n : JSON.stringify(Array.from(new Uint8Array(source))),\n });\n return fontFace;\n };\n const restoreHandler = patch(doc.fonts, 'add', function (original) {\n return function (fontFace) {\n setTimeout$1(callbackWrapper(() => {\n const p = fontMap.get(fontFace);\n if (p) {\n fontCb(p);\n fontMap.delete(fontFace);\n }\n }), 0);\n return original.apply(this, [fontFace]);\n };\n });\n handlers.push(() => {\n win.FontFace = originalFontFace;\n });\n handlers.push(restoreHandler);\n return callbackWrapper(() => {\n handlers.forEach((h) => h());\n });\n}\nfunction initSelectionObserver(param) {\n const { doc, mirror, blockClass, blockSelector, unblockSelector, selectionCb, } = param;\n let collapsed = true;\n const updateSelection = callbackWrapper(() => {\n const selection = doc.getSelection();\n if (!selection || (collapsed && _optionalChain$2([selection, 'optionalAccess', _21 => _21.isCollapsed])))\n return;\n collapsed = selection.isCollapsed || false;\n const ranges = [];\n const count = selection.rangeCount || 0;\n for (let i = 0; i < count; i++) {\n const range = selection.getRangeAt(i);\n const { startContainer, startOffset, endContainer, endOffset } = range;\n const blocked = isBlocked(startContainer, blockClass, blockSelector, unblockSelector, true) ||\n isBlocked(endContainer, blockClass, blockSelector, unblockSelector, true);\n if (blocked)\n continue;\n ranges.push({\n start: mirror.getId(startContainer),\n startOffset,\n end: mirror.getId(endContainer),\n endOffset,\n });\n }\n selectionCb({ ranges });\n });\n updateSelection();\n return on('selectionchange', updateSelection);\n}\nfunction initCustomElementObserver({ doc, customElementCb, }) {\n const win = doc.defaultView;\n if (!win || !win.customElements)\n return () => { };\n const restoreHandler = patch(win.customElements, 'define', function (original) {\n return function (name, constructor, options) {\n try {\n customElementCb({\n define: {\n name,\n },\n });\n }\n catch (e) {\n }\n return original.apply(this, [name, constructor, options]);\n };\n });\n return restoreHandler;\n}\nfunction initObservers(o, _hooks = {}) {\n const currentWindow = o.doc.defaultView;\n if (!currentWindow) {\n return () => {\n };\n }\n let mutationObserver;\n if (o.recordDOM) {\n mutationObserver = initMutationObserver(o, o.doc);\n }\n const mousemoveHandler = initMoveObserver(o);\n const mouseInteractionHandler = initMouseInteractionObserver(o);\n const scrollHandler = initScrollObserver(o);\n const viewportResizeHandler = initViewportResizeObserver(o, {\n win: currentWindow,\n });\n const inputHandler = initInputObserver(o);\n const mediaInteractionHandler = initMediaInteractionObserver(o);\n let styleSheetObserver = () => { };\n let adoptedStyleSheetObserver = () => { };\n let styleDeclarationObserver = () => { };\n let fontObserver = () => { };\n if (o.recordDOM) {\n styleSheetObserver = initStyleSheetObserver(o, { win: currentWindow });\n adoptedStyleSheetObserver = initAdoptedStyleSheetObserver(o, o.doc);\n styleDeclarationObserver = initStyleDeclarationObserver(o, {\n win: currentWindow,\n });\n if (o.collectFonts) {\n fontObserver = initFontObserver(o);\n }\n }\n const selectionObserver = initSelectionObserver(o);\n const customElementObserver = initCustomElementObserver(o);\n const pluginHandlers = [];\n for (const plugin of o.plugins) {\n pluginHandlers.push(plugin.observer(plugin.callback, currentWindow, plugin.options));\n }\n return callbackWrapper(() => {\n mutationBuffers.forEach((b) => b.reset());\n _optionalChain$2([mutationObserver, 'optionalAccess', _22 => _22.disconnect, 'call', _23 => _23()]);\n mousemoveHandler();\n mouseInteractionHandler();\n scrollHandler();\n viewportResizeHandler();\n inputHandler();\n mediaInteractionHandler();\n styleSheetObserver();\n adoptedStyleSheetObserver();\n styleDeclarationObserver();\n fontObserver();\n selectionObserver();\n customElementObserver();\n pluginHandlers.forEach((h) => h());\n });\n}\nfunction hasNestedCSSRule(prop) {\n return typeof window[prop] !== 'undefined';\n}\nfunction canMonkeyPatchNestedCSSRule(prop) {\n return Boolean(typeof window[prop] !== 'undefined' &&\n window[prop].prototype &&\n 'insertRule' in window[prop].prototype &&\n 'deleteRule' in window[prop].prototype);\n}\n\nclass CrossOriginIframeMirror {\n constructor(generateIdFn) {\n this.generateIdFn = generateIdFn;\n this.iframeIdToRemoteIdMap = new WeakMap();\n this.iframeRemoteIdToIdMap = new WeakMap();\n }\n getId(iframe, remoteId, idToRemoteMap, remoteToIdMap) {\n const idToRemoteIdMap = idToRemoteMap || this.getIdToRemoteIdMap(iframe);\n const remoteIdToIdMap = remoteToIdMap || this.getRemoteIdToIdMap(iframe);\n let id = idToRemoteIdMap.get(remoteId);\n if (!id) {\n id = this.generateIdFn();\n idToRemoteIdMap.set(remoteId, id);\n remoteIdToIdMap.set(id, remoteId);\n }\n return id;\n }\n getIds(iframe, remoteId) {\n const idToRemoteIdMap = this.getIdToRemoteIdMap(iframe);\n const remoteIdToIdMap = this.getRemoteIdToIdMap(iframe);\n return remoteId.map((id) => this.getId(iframe, id, idToRemoteIdMap, remoteIdToIdMap));\n }\n getRemoteId(iframe, id, map) {\n const remoteIdToIdMap = map || this.getRemoteIdToIdMap(iframe);\n if (typeof id !== 'number')\n return id;\n const remoteId = remoteIdToIdMap.get(id);\n if (!remoteId)\n return -1;\n return remoteId;\n }\n getRemoteIds(iframe, ids) {\n const remoteIdToIdMap = this.getRemoteIdToIdMap(iframe);\n return ids.map((id) => this.getRemoteId(iframe, id, remoteIdToIdMap));\n }\n reset(iframe) {\n if (!iframe) {\n this.iframeIdToRemoteIdMap = new WeakMap();\n this.iframeRemoteIdToIdMap = new WeakMap();\n return;\n }\n this.iframeIdToRemoteIdMap.delete(iframe);\n this.iframeRemoteIdToIdMap.delete(iframe);\n }\n getIdToRemoteIdMap(iframe) {\n let idToRemoteIdMap = this.iframeIdToRemoteIdMap.get(iframe);\n if (!idToRemoteIdMap) {\n idToRemoteIdMap = new Map();\n this.iframeIdToRemoteIdMap.set(iframe, idToRemoteIdMap);\n }\n return idToRemoteIdMap;\n }\n getRemoteIdToIdMap(iframe) {\n let remoteIdToIdMap = this.iframeRemoteIdToIdMap.get(iframe);\n if (!remoteIdToIdMap) {\n remoteIdToIdMap = new Map();\n this.iframeRemoteIdToIdMap.set(iframe, remoteIdToIdMap);\n }\n return remoteIdToIdMap;\n }\n}\n\nfunction _optionalChain$1(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }\nclass IframeManagerNoop {\n constructor() {\n this.crossOriginIframeMirror = new CrossOriginIframeMirror(genId);\n this.crossOriginIframeRootIdMap = new WeakMap();\n }\n addIframe() {\n }\n addLoadListener() {\n }\n attachIframe() {\n }\n}\nclass IframeManager {\n constructor(options) {\n this.iframes = new WeakMap();\n this.crossOriginIframeMap = new WeakMap();\n this.crossOriginIframeMirror = new CrossOriginIframeMirror(genId);\n this.crossOriginIframeRootIdMap = new WeakMap();\n this.mutationCb = options.mutationCb;\n this.wrappedEmit = options.wrappedEmit;\n this.stylesheetManager = options.stylesheetManager;\n this.recordCrossOriginIframes = options.recordCrossOriginIframes;\n this.crossOriginIframeStyleMirror = new CrossOriginIframeMirror(this.stylesheetManager.styleMirror.generateId.bind(this.stylesheetManager.styleMirror));\n this.mirror = options.mirror;\n if (this.recordCrossOriginIframes) {\n window.addEventListener('message', this.handleMessage.bind(this));\n }\n }\n addIframe(iframeEl) {\n this.iframes.set(iframeEl, true);\n if (iframeEl.contentWindow)\n this.crossOriginIframeMap.set(iframeEl.contentWindow, iframeEl);\n }\n addLoadListener(cb) {\n this.loadListener = cb;\n }\n attachIframe(iframeEl, childSn) {\n this.mutationCb({\n adds: [\n {\n parentId: this.mirror.getId(iframeEl),\n nextId: null,\n node: childSn,\n },\n ],\n removes: [],\n texts: [],\n attributes: [],\n isAttachIframe: true,\n });\n _optionalChain$1([this, 'access', _ => _.loadListener, 'optionalCall', _2 => _2(iframeEl)]);\n if (iframeEl.contentDocument &&\n iframeEl.contentDocument.adoptedStyleSheets &&\n iframeEl.contentDocument.adoptedStyleSheets.length > 0)\n this.stylesheetManager.adoptStyleSheets(iframeEl.contentDocument.adoptedStyleSheets, this.mirror.getId(iframeEl.contentDocument));\n }\n handleMessage(message) {\n const crossOriginMessageEvent = message;\n if (crossOriginMessageEvent.data.type !== 'rrweb' ||\n crossOriginMessageEvent.origin !== crossOriginMessageEvent.data.origin)\n return;\n const iframeSourceWindow = message.source;\n if (!iframeSourceWindow)\n return;\n const iframeEl = this.crossOriginIframeMap.get(message.source);\n if (!iframeEl)\n return;\n const transformedEvent = this.transformCrossOriginEvent(iframeEl, crossOriginMessageEvent.data.event);\n if (transformedEvent)\n this.wrappedEmit(transformedEvent, crossOriginMessageEvent.data.isCheckout);\n }\n transformCrossOriginEvent(iframeEl, e) {\n switch (e.type) {\n case EventType.FullSnapshot: {\n this.crossOriginIframeMirror.reset(iframeEl);\n this.crossOriginIframeStyleMirror.reset(iframeEl);\n this.replaceIdOnNode(e.data.node, iframeEl);\n const rootId = e.data.node.id;\n this.crossOriginIframeRootIdMap.set(iframeEl, rootId);\n this.patchRootIdOnNode(e.data.node, rootId);\n return {\n timestamp: e.timestamp,\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.Mutation,\n adds: [\n {\n parentId: this.mirror.getId(iframeEl),\n nextId: null,\n node: e.data.node,\n },\n ],\n removes: [],\n texts: [],\n attributes: [],\n isAttachIframe: true,\n },\n };\n }\n case EventType.Meta:\n case EventType.Load:\n case EventType.DomContentLoaded: {\n return false;\n }\n case EventType.Plugin: {\n return e;\n }\n case EventType.Custom: {\n this.replaceIds(e.data.payload, iframeEl, ['id', 'parentId', 'previousId', 'nextId']);\n return e;\n }\n case EventType.IncrementalSnapshot: {\n switch (e.data.source) {\n case IncrementalSource.Mutation: {\n e.data.adds.forEach((n) => {\n this.replaceIds(n, iframeEl, [\n 'parentId',\n 'nextId',\n 'previousId',\n ]);\n this.replaceIdOnNode(n.node, iframeEl);\n const rootId = this.crossOriginIframeRootIdMap.get(iframeEl);\n rootId && this.patchRootIdOnNode(n.node, rootId);\n });\n e.data.removes.forEach((n) => {\n this.replaceIds(n, iframeEl, ['parentId', 'id']);\n });\n e.data.attributes.forEach((n) => {\n this.replaceIds(n, iframeEl, ['id']);\n });\n e.data.texts.forEach((n) => {\n this.replaceIds(n, iframeEl, ['id']);\n });\n return e;\n }\n case IncrementalSource.Drag:\n case IncrementalSource.TouchMove:\n case IncrementalSource.MouseMove: {\n e.data.positions.forEach((p) => {\n this.replaceIds(p, iframeEl, ['id']);\n });\n return e;\n }\n case IncrementalSource.ViewportResize: {\n return false;\n }\n case IncrementalSource.MediaInteraction:\n case IncrementalSource.MouseInteraction:\n case IncrementalSource.Scroll:\n case IncrementalSource.CanvasMutation:\n case IncrementalSource.Input: {\n this.replaceIds(e.data, iframeEl, ['id']);\n return e;\n }\n case IncrementalSource.StyleSheetRule:\n case IncrementalSource.StyleDeclaration: {\n this.replaceIds(e.data, iframeEl, ['id']);\n this.replaceStyleIds(e.data, iframeEl, ['styleId']);\n return e;\n }\n case IncrementalSource.Font: {\n return e;\n }\n case IncrementalSource.Selection: {\n e.data.ranges.forEach((range) => {\n this.replaceIds(range, iframeEl, ['start', 'end']);\n });\n return e;\n }\n case IncrementalSource.AdoptedStyleSheet: {\n this.replaceIds(e.data, iframeEl, ['id']);\n this.replaceStyleIds(e.data, iframeEl, ['styleIds']);\n _optionalChain$1([e, 'access', _3 => _3.data, 'access', _4 => _4.styles, 'optionalAccess', _5 => _5.forEach, 'call', _6 => _6((style) => {\n this.replaceStyleIds(style, iframeEl, ['styleId']);\n })]);\n return e;\n }\n }\n }\n }\n return false;\n }\n replace(iframeMirror, obj, iframeEl, keys) {\n for (const key of keys) {\n if (!Array.isArray(obj[key]) && typeof obj[key] !== 'number')\n continue;\n if (Array.isArray(obj[key])) {\n obj[key] = iframeMirror.getIds(iframeEl, obj[key]);\n }\n else {\n obj[key] = iframeMirror.getId(iframeEl, obj[key]);\n }\n }\n return obj;\n }\n replaceIds(obj, iframeEl, keys) {\n return this.replace(this.crossOriginIframeMirror, obj, iframeEl, keys);\n }\n replaceStyleIds(obj, iframeEl, keys) {\n return this.replace(this.crossOriginIframeStyleMirror, obj, iframeEl, keys);\n }\n replaceIdOnNode(node, iframeEl) {\n this.replaceIds(node, iframeEl, ['id', 'rootId']);\n if ('childNodes' in node) {\n node.childNodes.forEach((child) => {\n this.replaceIdOnNode(child, iframeEl);\n });\n }\n }\n patchRootIdOnNode(node, rootId) {\n if (node.type !== NodeType$1.Document && !node.rootId)\n node.rootId = rootId;\n if ('childNodes' in node) {\n node.childNodes.forEach((child) => {\n this.patchRootIdOnNode(child, rootId);\n });\n }\n }\n}\n\nclass ShadowDomManagerNoop {\n init() {\n }\n addShadowRoot() {\n }\n observeAttachShadow() {\n }\n reset() {\n }\n}\nclass ShadowDomManager {\n constructor(options) {\n this.shadowDoms = new WeakSet();\n this.restoreHandlers = [];\n this.mutationCb = options.mutationCb;\n this.scrollCb = options.scrollCb;\n this.bypassOptions = options.bypassOptions;\n this.mirror = options.mirror;\n this.init();\n }\n init() {\n this.reset();\n this.patchAttachShadow(Element, document);\n }\n addShadowRoot(shadowRoot, doc) {\n if (!isNativeShadowDom(shadowRoot))\n return;\n if (this.shadowDoms.has(shadowRoot))\n return;\n this.shadowDoms.add(shadowRoot);\n this.bypassOptions.canvasManager.addShadowRoot(shadowRoot);\n const observer = initMutationObserver({\n ...this.bypassOptions,\n doc,\n mutationCb: this.mutationCb,\n mirror: this.mirror,\n shadowDomManager: this,\n }, shadowRoot);\n this.restoreHandlers.push(() => observer.disconnect());\n this.restoreHandlers.push(initScrollObserver({\n ...this.bypassOptions,\n scrollCb: this.scrollCb,\n doc: shadowRoot,\n mirror: this.mirror,\n }));\n setTimeout$1(() => {\n if (shadowRoot.adoptedStyleSheets &&\n shadowRoot.adoptedStyleSheets.length > 0)\n this.bypassOptions.stylesheetManager.adoptStyleSheets(shadowRoot.adoptedStyleSheets, this.mirror.getId(shadowRoot.host));\n this.restoreHandlers.push(initAdoptedStyleSheetObserver({\n mirror: this.mirror,\n stylesheetManager: this.bypassOptions.stylesheetManager,\n }, shadowRoot));\n }, 0);\n }\n observeAttachShadow(iframeElement) {\n if (!iframeElement.contentWindow || !iframeElement.contentDocument)\n return;\n this.patchAttachShadow(iframeElement.contentWindow.Element, iframeElement.contentDocument);\n }\n patchAttachShadow(element, doc) {\n const manager = this;\n this.restoreHandlers.push(patch(element.prototype, 'attachShadow', function (original) {\n return function (option) {\n const shadowRoot = original.call(this, option);\n if (this.shadowRoot && inDom(this))\n manager.addShadowRoot(this.shadowRoot, doc);\n return shadowRoot;\n };\n }));\n }\n reset() {\n this.restoreHandlers.forEach((handler) => {\n try {\n handler();\n }\n catch (e) {\n }\n });\n this.restoreHandlers = [];\n this.shadowDoms = new WeakSet();\n this.bypassOptions.canvasManager.resetShadowRoots();\n }\n}\n\nclass CanvasManagerNoop {\n reset() {\n }\n freeze() {\n }\n unfreeze() {\n }\n lock() {\n }\n unlock() {\n }\n snapshot() {\n }\n addWindow() {\n }\n addShadowRoot() {\n }\n resetShadowRoots() {\n }\n}\n\nclass StylesheetManager {\n constructor(options) {\n this.trackedLinkElements = new WeakSet();\n this.styleMirror = new StyleSheetMirror();\n this.mutationCb = options.mutationCb;\n this.adoptedStyleSheetCb = options.adoptedStyleSheetCb;\n }\n attachLinkElement(linkEl, childSn) {\n if ('_cssText' in childSn.attributes)\n this.mutationCb({\n adds: [],\n removes: [],\n texts: [],\n attributes: [\n {\n id: childSn.id,\n attributes: childSn\n .attributes,\n },\n ],\n });\n this.trackLinkElement(linkEl);\n }\n trackLinkElement(linkEl) {\n if (this.trackedLinkElements.has(linkEl))\n return;\n this.trackedLinkElements.add(linkEl);\n this.trackStylesheetInLinkElement(linkEl);\n }\n adoptStyleSheets(sheets, hostId) {\n if (sheets.length === 0)\n return;\n const adoptedStyleSheetData = {\n id: hostId,\n styleIds: [],\n };\n const styles = [];\n for (const sheet of sheets) {\n let styleId;\n if (!this.styleMirror.has(sheet)) {\n styleId = this.styleMirror.add(sheet);\n styles.push({\n styleId,\n rules: Array.from(sheet.rules || CSSRule, (r, index) => ({\n rule: stringifyRule(r),\n index,\n })),\n });\n }\n else\n styleId = this.styleMirror.getId(sheet);\n adoptedStyleSheetData.styleIds.push(styleId);\n }\n if (styles.length > 0)\n adoptedStyleSheetData.styles = styles;\n this.adoptedStyleSheetCb(adoptedStyleSheetData);\n }\n reset() {\n this.styleMirror.reset();\n this.trackedLinkElements = new WeakSet();\n }\n trackStylesheetInLinkElement(linkEl) {\n }\n}\n\nclass ProcessedNodeManager {\n constructor() {\n this.nodeMap = new WeakMap();\n this.active = false;\n }\n inOtherBuffer(node, thisBuffer) {\n const buffers = this.nodeMap.get(node);\n return (buffers && Array.from(buffers).some((buffer) => buffer !== thisBuffer));\n }\n add(node, buffer) {\n if (!this.active) {\n this.active = true;\n onRequestAnimationFrame(() => {\n this.nodeMap = new WeakMap();\n this.active = false;\n });\n }\n this.nodeMap.set(node, (this.nodeMap.get(node) || new Set()).add(buffer));\n }\n destroy() {\n }\n}\n\nlet wrappedEmit;\nlet _takeFullSnapshot;\ntry {\n if (Array.from([1], (x) => x * 2)[0] !== 2) {\n const cleanFrame = document.createElement('iframe');\n document.body.appendChild(cleanFrame);\n Array.from = _optionalChain([cleanFrame, 'access', _ => _.contentWindow, 'optionalAccess', _2 => _2.Array, 'access', _3 => _3.from]) || Array.from;\n document.body.removeChild(cleanFrame);\n }\n}\ncatch (err) {\n console.debug('Unable to override Array.from', err);\n}\nconst mirror = createMirror();\nfunction record(options = {}) {\n const { emit, checkoutEveryNms, checkoutEveryNth, blockClass = 'rr-block', blockSelector = null, unblockSelector = null, ignoreClass = 'rr-ignore', ignoreSelector = null, maskAllText = false, maskTextClass = 'rr-mask', unmaskTextClass = null, maskTextSelector = null, unmaskTextSelector = null, inlineStylesheet = true, maskAllInputs, maskInputOptions: _maskInputOptions, slimDOMOptions: _slimDOMOptions, maskAttributeFn, maskInputFn, maskTextFn, maxCanvasSize = null, packFn, sampling = {}, dataURLOptions = {}, mousemoveWait, recordDOM = true, recordCanvas = false, recordCrossOriginIframes = false, recordAfter = options.recordAfter === 'DOMContentLoaded'\n ? options.recordAfter\n : 'load', userTriggeredOnInput = false, collectFonts = false, inlineImages = false, plugins, keepIframeSrcFn = () => false, ignoreCSSAttributes = new Set([]), errorHandler, onMutation, getCanvasManager, } = options;\n registerErrorHandler(errorHandler);\n const inEmittingFrame = recordCrossOriginIframes\n ? window.parent === window\n : true;\n let passEmitsToParent = false;\n if (!inEmittingFrame) {\n try {\n if (window.parent.document) {\n passEmitsToParent = false;\n }\n }\n catch (e) {\n passEmitsToParent = true;\n }\n }\n if (inEmittingFrame && !emit) {\n throw new Error('emit function is required');\n }\n if (!inEmittingFrame && !passEmitsToParent) {\n return () => {\n };\n }\n if (mousemoveWait !== undefined && sampling.mousemove === undefined) {\n sampling.mousemove = mousemoveWait;\n }\n mirror.reset();\n const maskInputOptions = maskAllInputs === true\n ? {\n color: true,\n date: true,\n 'datetime-local': true,\n email: true,\n month: true,\n number: true,\n range: true,\n search: true,\n tel: true,\n text: true,\n time: true,\n url: true,\n week: true,\n textarea: true,\n select: true,\n radio: true,\n checkbox: true,\n }\n : _maskInputOptions !== undefined\n ? _maskInputOptions\n : {};\n const slimDOMOptions = _slimDOMOptions === true || _slimDOMOptions === 'all'\n ? {\n script: true,\n comment: true,\n headFavicon: true,\n headWhitespace: true,\n headMetaSocial: true,\n headMetaRobots: true,\n headMetaHttpEquiv: true,\n headMetaVerification: true,\n headMetaAuthorship: _slimDOMOptions === 'all',\n headMetaDescKeywords: _slimDOMOptions === 'all',\n }\n : _slimDOMOptions\n ? _slimDOMOptions\n : {};\n polyfill();\n let lastFullSnapshotEvent;\n let incrementalSnapshotCount = 0;\n const eventProcessor = (e) => {\n for (const plugin of plugins || []) {\n if (plugin.eventProcessor) {\n e = plugin.eventProcessor(e);\n }\n }\n if (packFn &&\n !passEmitsToParent) {\n e = packFn(e);\n }\n return e;\n };\n wrappedEmit = (r, isCheckout) => {\n const e = r;\n e.timestamp = nowTimestamp();\n if (_optionalChain([mutationBuffers, 'access', _4 => _4[0], 'optionalAccess', _5 => _5.isFrozen, 'call', _6 => _6()]) &&\n e.type !== EventType.FullSnapshot &&\n !(e.type === EventType.IncrementalSnapshot &&\n e.data.source === IncrementalSource.Mutation)) {\n mutationBuffers.forEach((buf) => buf.unfreeze());\n }\n if (inEmittingFrame) {\n _optionalChain([emit, 'optionalCall', _7 => _7(eventProcessor(e), isCheckout)]);\n }\n else if (passEmitsToParent) {\n const message = {\n type: 'rrweb',\n event: eventProcessor(e),\n origin: window.location.origin,\n isCheckout,\n };\n window.parent.postMessage(message, '*');\n }\n if (e.type === EventType.FullSnapshot) {\n lastFullSnapshotEvent = e;\n incrementalSnapshotCount = 0;\n }\n else if (e.type === EventType.IncrementalSnapshot) {\n if (e.data.source === IncrementalSource.Mutation &&\n e.data.isAttachIframe) {\n return;\n }\n incrementalSnapshotCount++;\n const exceedCount = checkoutEveryNth && incrementalSnapshotCount >= checkoutEveryNth;\n const exceedTime = checkoutEveryNms &&\n lastFullSnapshotEvent &&\n e.timestamp - lastFullSnapshotEvent.timestamp > checkoutEveryNms;\n if (exceedCount || exceedTime) {\n takeFullSnapshot(true);\n }\n }\n };\n const wrappedMutationEmit = (m) => {\n wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.Mutation,\n ...m,\n },\n });\n };\n const wrappedScrollEmit = (p) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.Scroll,\n ...p,\n },\n });\n const wrappedCanvasMutationEmit = (p) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.CanvasMutation,\n ...p,\n },\n });\n const wrappedAdoptedStyleSheetEmit = (a) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.AdoptedStyleSheet,\n ...a,\n },\n });\n const stylesheetManager = new StylesheetManager({\n mutationCb: wrappedMutationEmit,\n adoptedStyleSheetCb: wrappedAdoptedStyleSheetEmit,\n });\n const iframeManager = typeof __RRWEB_EXCLUDE_IFRAME__ === 'boolean' && __RRWEB_EXCLUDE_IFRAME__\n ? new IframeManagerNoop()\n : new IframeManager({\n mirror,\n mutationCb: wrappedMutationEmit,\n stylesheetManager: stylesheetManager,\n recordCrossOriginIframes,\n wrappedEmit,\n });\n for (const plugin of plugins || []) {\n if (plugin.getMirror)\n plugin.getMirror({\n nodeMirror: mirror,\n crossOriginIframeMirror: iframeManager.crossOriginIframeMirror,\n crossOriginIframeStyleMirror: iframeManager.crossOriginIframeStyleMirror,\n });\n }\n const processedNodeManager = new ProcessedNodeManager();\n const canvasManager = _getCanvasManager(getCanvasManager, {\n mirror,\n win: window,\n mutationCb: (p) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.CanvasMutation,\n ...p,\n },\n }),\n recordCanvas,\n blockClass,\n blockSelector,\n unblockSelector,\n maxCanvasSize,\n sampling: sampling['canvas'],\n dataURLOptions,\n errorHandler,\n });\n const shadowDomManager = typeof __RRWEB_EXCLUDE_SHADOW_DOM__ === 'boolean' &&\n __RRWEB_EXCLUDE_SHADOW_DOM__\n ? new ShadowDomManagerNoop()\n : new ShadowDomManager({\n mutationCb: wrappedMutationEmit,\n scrollCb: wrappedScrollEmit,\n bypassOptions: {\n onMutation,\n blockClass,\n blockSelector,\n unblockSelector,\n maskAllText,\n maskTextClass,\n unmaskTextClass,\n maskTextSelector,\n unmaskTextSelector,\n inlineStylesheet,\n maskInputOptions,\n dataURLOptions,\n maskAttributeFn,\n maskTextFn,\n maskInputFn,\n recordCanvas,\n inlineImages,\n sampling,\n slimDOMOptions,\n iframeManager,\n stylesheetManager,\n canvasManager,\n keepIframeSrcFn,\n processedNodeManager,\n },\n mirror,\n });\n const takeFullSnapshot = (isCheckout = false) => {\n if (!recordDOM) {\n return;\n }\n wrappedEmit({\n type: EventType.Meta,\n data: {\n href: window.location.href,\n width: getWindowWidth(),\n height: getWindowHeight(),\n },\n }, isCheckout);\n stylesheetManager.reset();\n shadowDomManager.init();\n mutationBuffers.forEach((buf) => buf.lock());\n const node = snapshot(document, {\n mirror,\n blockClass,\n blockSelector,\n unblockSelector,\n maskAllText,\n maskTextClass,\n unmaskTextClass,\n maskTextSelector,\n unmaskTextSelector,\n inlineStylesheet,\n maskAllInputs: maskInputOptions,\n maskAttributeFn,\n maskInputFn,\n maskTextFn,\n slimDOM: slimDOMOptions,\n dataURLOptions,\n recordCanvas,\n inlineImages,\n onSerialize: (n) => {\n if (isSerializedIframe(n, mirror)) {\n iframeManager.addIframe(n);\n }\n if (isSerializedStylesheet(n, mirror)) {\n stylesheetManager.trackLinkElement(n);\n }\n if (hasShadowRoot(n)) {\n shadowDomManager.addShadowRoot(n.shadowRoot, document);\n }\n },\n onIframeLoad: (iframe, childSn) => {\n iframeManager.attachIframe(iframe, childSn);\n if (iframe.contentWindow) {\n canvasManager.addWindow(iframe.contentWindow);\n }\n shadowDomManager.observeAttachShadow(iframe);\n },\n onStylesheetLoad: (linkEl, childSn) => {\n stylesheetManager.attachLinkElement(linkEl, childSn);\n },\n keepIframeSrcFn,\n });\n if (!node) {\n return console.warn('Failed to snapshot the document');\n }\n wrappedEmit({\n type: EventType.FullSnapshot,\n data: {\n node,\n initialOffset: getWindowScroll(window),\n },\n });\n mutationBuffers.forEach((buf) => buf.unlock());\n if (document.adoptedStyleSheets && document.adoptedStyleSheets.length > 0)\n stylesheetManager.adoptStyleSheets(document.adoptedStyleSheets, mirror.getId(document));\n };\n _takeFullSnapshot = takeFullSnapshot;\n try {\n const handlers = [];\n const observe = (doc) => {\n return callbackWrapper(initObservers)({\n onMutation,\n mutationCb: wrappedMutationEmit,\n mousemoveCb: (positions, source) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source,\n positions,\n },\n }),\n mouseInteractionCb: (d) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.MouseInteraction,\n ...d,\n },\n }),\n scrollCb: wrappedScrollEmit,\n viewportResizeCb: (d) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.ViewportResize,\n ...d,\n },\n }),\n inputCb: (v) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.Input,\n ...v,\n },\n }),\n mediaInteractionCb: (p) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.MediaInteraction,\n ...p,\n },\n }),\n styleSheetRuleCb: (r) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.StyleSheetRule,\n ...r,\n },\n }),\n styleDeclarationCb: (r) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.StyleDeclaration,\n ...r,\n },\n }),\n canvasMutationCb: wrappedCanvasMutationEmit,\n fontCb: (p) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.Font,\n ...p,\n },\n }),\n selectionCb: (p) => {\n wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.Selection,\n ...p,\n },\n });\n },\n customElementCb: (c) => {\n wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.CustomElement,\n ...c,\n },\n });\n },\n blockClass,\n ignoreClass,\n ignoreSelector,\n maskAllText,\n maskTextClass,\n unmaskTextClass,\n maskTextSelector,\n unmaskTextSelector,\n maskInputOptions,\n inlineStylesheet,\n sampling,\n recordDOM,\n recordCanvas,\n inlineImages,\n userTriggeredOnInput,\n collectFonts,\n doc,\n maskAttributeFn,\n maskInputFn,\n maskTextFn,\n keepIframeSrcFn,\n blockSelector,\n unblockSelector,\n slimDOMOptions,\n dataURLOptions,\n mirror,\n iframeManager,\n stylesheetManager,\n shadowDomManager,\n processedNodeManager,\n canvasManager,\n ignoreCSSAttributes,\n plugins: _optionalChain([plugins\n, 'optionalAccess', _8 => _8.filter, 'call', _9 => _9((p) => p.observer)\n, 'optionalAccess', _10 => _10.map, 'call', _11 => _11((p) => ({\n observer: p.observer,\n options: p.options,\n callback: (payload) => wrappedEmit({\n type: EventType.Plugin,\n data: {\n plugin: p.name,\n payload,\n },\n }),\n }))]) || [],\n }, {});\n };\n iframeManager.addLoadListener((iframeEl) => {\n try {\n handlers.push(observe(iframeEl.contentDocument));\n }\n catch (error) {\n console.warn(error);\n }\n });\n const init = () => {\n takeFullSnapshot();\n handlers.push(observe(document));\n };\n if (document.readyState === 'interactive' ||\n document.readyState === 'complete') {\n init();\n }\n else {\n handlers.push(on('DOMContentLoaded', () => {\n wrappedEmit({\n type: EventType.DomContentLoaded,\n data: {},\n });\n if (recordAfter === 'DOMContentLoaded')\n init();\n }));\n handlers.push(on('load', () => {\n wrappedEmit({\n type: EventType.Load,\n data: {},\n });\n if (recordAfter === 'load')\n init();\n }, window));\n }\n return () => {\n handlers.forEach((h) => h());\n processedNodeManager.destroy();\n _takeFullSnapshot = undefined;\n unregisterErrorHandler();\n };\n }\n catch (error) {\n console.warn(error);\n }\n}\nfunction takeFullSnapshot(isCheckout) {\n if (!_takeFullSnapshot) {\n throw new Error('please take full snapshot after start recording');\n }\n _takeFullSnapshot(isCheckout);\n}\nrecord.mirror = mirror;\nrecord.takeFullSnapshot = takeFullSnapshot;\nfunction _getCanvasManager(getCanvasManagerFn, options) {\n try {\n return getCanvasManagerFn\n ? getCanvasManagerFn(options)\n : new CanvasManagerNoop();\n }\n catch (e2) {\n console.warn('Unable to initialize CanvasManager');\n return new CanvasManagerNoop();\n }\n}\n\n/**\n * This serves as a build time flag that will be true by default, but false in non-debug builds or if users replace `__SENTRY_DEBUG__` in their generated code.\n *\n * ATTENTION: This constant must never cross package boundaries (i.e. be exported) to guarantee that it can be used for tree shaking.\n */\nconst DEBUG_BUILD = (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__);\n\nconst CONSOLE_LEVELS = ['info', 'warn', 'error', 'log'] ;\nconst PREFIX = '[Replay] ';\n\nfunction _addBreadcrumb(message, level = 'info') {\n addBreadcrumb(\n {\n category: 'console',\n data: {\n logger: 'replay',\n },\n level,\n message: `${PREFIX}${message}`,\n },\n { level },\n );\n}\n\nfunction makeReplayLogger() {\n let _capture = false;\n let _trace = false;\n\n const _logger = {\n exception: () => undefined,\n infoTick: () => undefined,\n setConfig: (opts) => {\n _capture = opts.captureExceptions;\n _trace = opts.traceInternals;\n },\n };\n\n if (DEBUG_BUILD) {\n CONSOLE_LEVELS.forEach(name => {\n _logger[name] = (...args) => {\n logger$1[name](PREFIX, ...args);\n if (_trace) {\n _addBreadcrumb(args.join(''), severityLevelFromString(name));\n }\n };\n });\n\n _logger.exception = (error, ...message) => {\n if (message.length && _logger.error) {\n _logger.error(...message);\n }\n\n logger$1.error(PREFIX, error);\n\n if (_capture) {\n captureException(error);\n } else if (_trace) {\n // No need for a breadcrumb if `_capture` is enabled since it should be\n // captured as an exception\n _addBreadcrumb(error, 'error');\n }\n };\n\n _logger.infoTick = (...args) => {\n logger$1.info(PREFIX, ...args);\n if (_trace) {\n // Wait a tick here to avoid race conditions for some initial logs\n // which may be added before replay is initialized\n setTimeout(() => _addBreadcrumb(args[0]), 0);\n }\n };\n } else {\n CONSOLE_LEVELS.forEach(name => {\n _logger[name] = () => undefined;\n });\n }\n\n return _logger ;\n}\n\nconst logger = makeReplayLogger();\n\nconst ReplayEventTypeIncrementalSnapshot = 3;\nconst ReplayEventTypeCustom = 5;\n\n/**\n * Converts a timestamp to ms, if it was in s, or keeps it as ms.\n */\nfunction timestampToMs(timestamp) {\n const isMs = timestamp > 9999999999;\n return isMs ? timestamp : timestamp * 1000;\n}\n\n/**\n * Converts a timestamp to s, if it was in ms, or keeps it as s.\n */\nfunction timestampToS(timestamp) {\n const isMs = timestamp > 9999999999;\n return isMs ? timestamp / 1000 : timestamp;\n}\n\n/**\n * Add a breadcrumb event to replay.\n */\nfunction addBreadcrumbEvent(replay, breadcrumb) {\n if (breadcrumb.category === 'sentry.transaction') {\n return;\n }\n\n if (['ui.click', 'ui.input'].includes(breadcrumb.category )) {\n replay.triggerUserActivity();\n } else {\n replay.checkAndHandleExpiredSession();\n }\n\n replay.addUpdate(() => {\n // This should never reject\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n replay.throttledAddEvent({\n type: EventType.Custom,\n // TODO: We were converting from ms to seconds for breadcrumbs, spans,\n // but maybe we should just keep them as milliseconds\n timestamp: (breadcrumb.timestamp || 0) * 1000,\n data: {\n tag: 'breadcrumb',\n // normalize to max. 10 depth and 1_000 properties per object\n payload: normalize(breadcrumb, 10, 1000),\n },\n });\n\n // Do not flush after console log messages\n return breadcrumb.category === 'console';\n });\n}\n\nconst INTERACTIVE_SELECTOR = 'button,a';\n\n/** Get the closest interactive parent element, or else return the given element. */\nfunction getClosestInteractive(element) {\n const closestInteractive = element.closest(INTERACTIVE_SELECTOR);\n return closestInteractive || element;\n}\n\n/**\n * For clicks, we check if the target is inside of a button or link\n * If so, we use this as the target instead\n * This is useful because if you click on the image in ,\n * The target will be the image, not the button, which we don't want here\n */\nfunction getClickTargetNode(event) {\n const target = getTargetNode(event);\n\n if (!target || !(target instanceof Element)) {\n return target;\n }\n\n return getClosestInteractive(target);\n}\n\n/** Get the event target node. */\nfunction getTargetNode(event) {\n if (isEventWithTarget(event)) {\n return event.target ;\n }\n\n return event;\n}\n\nfunction isEventWithTarget(event) {\n return typeof event === 'object' && !!event && 'target' in event;\n}\n\nlet handlers;\n\n/**\n * Register a handler to be called when `window.open()` is called.\n * Returns a cleanup function.\n */\nfunction onWindowOpen(cb) {\n // Ensure to only register this once\n if (!handlers) {\n handlers = [];\n monkeyPatchWindowOpen();\n }\n\n handlers.push(cb);\n\n return () => {\n const pos = handlers ? handlers.indexOf(cb) : -1;\n if (pos > -1) {\n (handlers ).splice(pos, 1);\n }\n };\n}\n\nfunction monkeyPatchWindowOpen() {\n fill(WINDOW, 'open', function (originalWindowOpen) {\n return function (...args) {\n if (handlers) {\n try {\n handlers.forEach(handler => handler());\n } catch (e) {\n // ignore errors in here\n }\n }\n\n return originalWindowOpen.apply(WINDOW, args);\n };\n });\n}\n\n/** Any IncrementalSource for rrweb that we interpret as a kind of mutation. */\nconst IncrementalMutationSources = new Set([\n IncrementalSource.Mutation,\n IncrementalSource.StyleSheetRule,\n IncrementalSource.StyleDeclaration,\n IncrementalSource.AdoptedStyleSheet,\n IncrementalSource.CanvasMutation,\n IncrementalSource.Selection,\n IncrementalSource.MediaInteraction,\n]);\n\n/** Handle a click. */\nfunction handleClick(clickDetector, clickBreadcrumb, node) {\n clickDetector.handleClick(clickBreadcrumb, node);\n}\n\n/** A click detector class that can be used to detect slow or rage clicks on elements. */\nclass ClickDetector {\n // protected for testing\n\n constructor(\n replay,\n slowClickConfig,\n // Just for easier testing\n _addBreadcrumbEvent = addBreadcrumbEvent,\n ) {\n this._lastMutation = 0;\n this._lastScroll = 0;\n this._clicks = [];\n\n // We want everything in s, but options are in ms\n this._timeout = slowClickConfig.timeout / 1000;\n this._threshold = slowClickConfig.threshold / 1000;\n this._scollTimeout = slowClickConfig.scrollTimeout / 1000;\n this._replay = replay;\n this._ignoreSelector = slowClickConfig.ignoreSelector;\n this._addBreadcrumbEvent = _addBreadcrumbEvent;\n }\n\n /** Register click detection handlers on mutation or scroll. */\n addListeners() {\n const cleanupWindowOpen = onWindowOpen(() => {\n // Treat window.open as mutation\n this._lastMutation = nowInSeconds();\n });\n\n this._teardown = () => {\n cleanupWindowOpen();\n\n this._clicks = [];\n this._lastMutation = 0;\n this._lastScroll = 0;\n };\n }\n\n /** Clean up listeners. */\n removeListeners() {\n if (this._teardown) {\n this._teardown();\n }\n\n if (this._checkClickTimeout) {\n clearTimeout(this._checkClickTimeout);\n }\n }\n\n /** @inheritDoc */\n handleClick(breadcrumb, node) {\n if (ignoreElement(node, this._ignoreSelector) || !isClickBreadcrumb(breadcrumb)) {\n return;\n }\n\n const newClick = {\n timestamp: timestampToS(breadcrumb.timestamp),\n clickBreadcrumb: breadcrumb,\n // Set this to 0 so we know it originates from the click breadcrumb\n clickCount: 0,\n node,\n };\n\n // If there was a click in the last 1s on the same element, ignore it - only keep a single reference per second\n if (\n this._clicks.some(click => click.node === newClick.node && Math.abs(click.timestamp - newClick.timestamp) < 1)\n ) {\n return;\n }\n\n this._clicks.push(newClick);\n\n // If this is the first new click, set a timeout to check for multi clicks\n if (this._clicks.length === 1) {\n this._scheduleCheckClicks();\n }\n }\n\n /** @inheritDoc */\n registerMutation(timestamp = Date.now()) {\n this._lastMutation = timestampToS(timestamp);\n }\n\n /** @inheritDoc */\n registerScroll(timestamp = Date.now()) {\n this._lastScroll = timestampToS(timestamp);\n }\n\n /** @inheritDoc */\n registerClick(element) {\n const node = getClosestInteractive(element);\n this._handleMultiClick(node );\n }\n\n /** Count multiple clicks on elements. */\n _handleMultiClick(node) {\n this._getClicks(node).forEach(click => {\n click.clickCount++;\n });\n }\n\n /** Get all pending clicks for a given node. */\n _getClicks(node) {\n return this._clicks.filter(click => click.node === node);\n }\n\n /** Check the clicks that happened. */\n _checkClicks() {\n const timedOutClicks = [];\n\n const now = nowInSeconds();\n\n this._clicks.forEach(click => {\n if (!click.mutationAfter && this._lastMutation) {\n click.mutationAfter = click.timestamp <= this._lastMutation ? this._lastMutation - click.timestamp : undefined;\n }\n if (!click.scrollAfter && this._lastScroll) {\n click.scrollAfter = click.timestamp <= this._lastScroll ? this._lastScroll - click.timestamp : undefined;\n }\n\n // All of these are in seconds!\n if (click.timestamp + this._timeout <= now) {\n timedOutClicks.push(click);\n }\n });\n\n // Remove \"old\" clicks\n for (const click of timedOutClicks) {\n const pos = this._clicks.indexOf(click);\n\n if (pos > -1) {\n this._generateBreadcrumbs(click);\n this._clicks.splice(pos, 1);\n }\n }\n\n // Trigger new check, unless no clicks left\n if (this._clicks.length) {\n this._scheduleCheckClicks();\n }\n }\n\n /** Generate matching breadcrumb(s) for the click. */\n _generateBreadcrumbs(click) {\n const replay = this._replay;\n const hadScroll = click.scrollAfter && click.scrollAfter <= this._scollTimeout;\n const hadMutation = click.mutationAfter && click.mutationAfter <= this._threshold;\n\n const isSlowClick = !hadScroll && !hadMutation;\n const { clickCount, clickBreadcrumb } = click;\n\n // Slow click\n if (isSlowClick) {\n // If `mutationAfter` is set, it means a mutation happened after the threshold, but before the timeout\n // If not, it means we just timed out without scroll & mutation\n const timeAfterClickMs = Math.min(click.mutationAfter || this._timeout, this._timeout) * 1000;\n const endReason = timeAfterClickMs < this._timeout * 1000 ? 'mutation' : 'timeout';\n\n const breadcrumb = {\n type: 'default',\n message: clickBreadcrumb.message,\n timestamp: clickBreadcrumb.timestamp,\n category: 'ui.slowClickDetected',\n data: {\n ...clickBreadcrumb.data,\n url: WINDOW.location.href,\n route: replay.getCurrentRoute(),\n timeAfterClickMs,\n endReason,\n // If clickCount === 0, it means multiClick was not correctly captured here\n // - we still want to send 1 in this case\n clickCount: clickCount || 1,\n },\n };\n\n this._addBreadcrumbEvent(replay, breadcrumb);\n return;\n }\n\n // Multi click\n if (clickCount > 1) {\n const breadcrumb = {\n type: 'default',\n message: clickBreadcrumb.message,\n timestamp: clickBreadcrumb.timestamp,\n category: 'ui.multiClick',\n data: {\n ...clickBreadcrumb.data,\n url: WINDOW.location.href,\n route: replay.getCurrentRoute(),\n clickCount,\n metric: true,\n },\n };\n\n this._addBreadcrumbEvent(replay, breadcrumb);\n }\n }\n\n /** Schedule to check current clicks. */\n _scheduleCheckClicks() {\n if (this._checkClickTimeout) {\n clearTimeout(this._checkClickTimeout);\n }\n\n this._checkClickTimeout = setTimeout$3(() => this._checkClicks(), 1000);\n }\n}\n\nconst SLOW_CLICK_TAGS = ['A', 'BUTTON', 'INPUT'];\n\n/** exported for tests only */\nfunction ignoreElement(node, ignoreSelector) {\n if (!SLOW_CLICK_TAGS.includes(node.tagName)) {\n return true;\n }\n\n // If tag, we only want to consider input[type='submit'] & input[type='button']\n if (node.tagName === 'INPUT' && !['submit', 'button'].includes(node.getAttribute('type') || '')) {\n return true;\n }\n\n // If tag, detect special variants that may not lead to an action\n // If target !== _self, we may open the link somewhere else, which would lead to no action\n // Also, when downloading a file, we may not leave the page, but still not trigger an action\n if (\n node.tagName === 'A' &&\n (node.hasAttribute('download') || (node.hasAttribute('target') && node.getAttribute('target') !== '_self'))\n ) {\n return true;\n }\n\n if (ignoreSelector && node.matches(ignoreSelector)) {\n return true;\n }\n\n return false;\n}\n\nfunction isClickBreadcrumb(breadcrumb) {\n return !!(breadcrumb.data && typeof breadcrumb.data.nodeId === 'number' && breadcrumb.timestamp);\n}\n\n// This is good enough for us, and is easier to test/mock than `timestampInSeconds`\nfunction nowInSeconds() {\n return Date.now() / 1000;\n}\n\n/** Update the click detector based on a recording event of rrweb. */\nfunction updateClickDetectorForRecordingEvent(clickDetector, event) {\n try {\n // note: We only consider incremental snapshots here\n // This means that any full snapshot is ignored for mutation detection - the reason is that we simply cannot know if a mutation happened here.\n // E.g. think that we are buffering, an error happens and we take a full snapshot because we switched to session mode -\n // in this scenario, we would not know if a dead click happened because of the error, which is a key dead click scenario.\n // Instead, by ignoring full snapshots, we have the risk that we generate a false positive\n // (if a mutation _did_ happen but was \"swallowed\" by the full snapshot)\n // But this should be more unlikely as we'd generally capture the incremental snapshot right away\n\n if (!isIncrementalEvent(event)) {\n return;\n }\n\n const { source } = event.data;\n if (IncrementalMutationSources.has(source)) {\n clickDetector.registerMutation(event.timestamp);\n }\n\n if (source === IncrementalSource.Scroll) {\n clickDetector.registerScroll(event.timestamp);\n }\n\n if (isIncrementalMouseInteraction(event)) {\n const { type, id } = event.data;\n const node = record.mirror.getNode(id);\n\n if (node instanceof HTMLElement && type === MouseInteractions.Click) {\n clickDetector.registerClick(node);\n }\n }\n } catch (e) {\n // ignore errors here, e.g. if accessing something that does not exist\n }\n}\n\nfunction isIncrementalEvent(event) {\n return event.type === ReplayEventTypeIncrementalSnapshot;\n}\n\nfunction isIncrementalMouseInteraction(\n event,\n) {\n return event.data.source === IncrementalSource.MouseInteraction;\n}\n\n/**\n * Create a breadcrumb for a replay.\n */\nfunction createBreadcrumb(\n breadcrumb,\n) {\n return {\n timestamp: Date.now() / 1000,\n type: 'default',\n ...breadcrumb,\n };\n}\n\nvar NodeType;\n(function (NodeType) {\n NodeType[NodeType[\"Document\"] = 0] = \"Document\";\n NodeType[NodeType[\"DocumentType\"] = 1] = \"DocumentType\";\n NodeType[NodeType[\"Element\"] = 2] = \"Element\";\n NodeType[NodeType[\"Text\"] = 3] = \"Text\";\n NodeType[NodeType[\"CDATA\"] = 4] = \"CDATA\";\n NodeType[NodeType[\"Comment\"] = 5] = \"Comment\";\n})(NodeType || (NodeType = {}));\n\n// Note that these are the serialized attributes and not attributes directly on\n// the DOM Node. Attributes we are interested in:\nconst ATTRIBUTES_TO_RECORD = new Set([\n 'id',\n 'class',\n 'aria-label',\n 'role',\n 'name',\n 'alt',\n 'title',\n 'data-test-id',\n 'data-testid',\n 'disabled',\n 'aria-disabled',\n 'data-sentry-component',\n]);\n\n/**\n * Inclusion list of attributes that we want to record from the DOM element\n */\nfunction getAttributesToRecord(attributes) {\n const obj = {};\n if (!attributes['data-sentry-component'] && attributes['data-sentry-element']) {\n attributes['data-sentry-component'] = attributes['data-sentry-element'];\n }\n for (const key in attributes) {\n if (ATTRIBUTES_TO_RECORD.has(key)) {\n let normalizedKey = key;\n\n if (key === 'data-testid' || key === 'data-test-id') {\n normalizedKey = 'testId';\n }\n\n obj[normalizedKey] = attributes[key];\n }\n }\n\n return obj;\n}\n\nconst handleDomListener = (\n replay,\n) => {\n return (handlerData) => {\n if (!replay.isEnabled()) {\n return;\n }\n\n const result = handleDom(handlerData);\n\n if (!result) {\n return;\n }\n\n const isClick = handlerData.name === 'click';\n const event = isClick ? (handlerData.event ) : undefined;\n // Ignore clicks if ctrl/alt/meta/shift keys are held down as they alter behavior of clicks (e.g. open in new tab)\n if (\n isClick &&\n replay.clickDetector &&\n event &&\n event.target &&\n !event.altKey &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.shiftKey\n ) {\n handleClick(\n replay.clickDetector,\n result ,\n getClickTargetNode(handlerData.event ) ,\n );\n }\n\n addBreadcrumbEvent(replay, result);\n };\n};\n\n/** Get the base DOM breadcrumb. */\nfunction getBaseDomBreadcrumb(target, message) {\n const nodeId = record.mirror.getId(target);\n const node = nodeId && record.mirror.getNode(nodeId);\n const meta = node && record.mirror.getMeta(node);\n const element = meta && isElement(meta) ? meta : null;\n\n return {\n message,\n data: element\n ? {\n nodeId,\n node: {\n id: nodeId,\n tagName: element.tagName,\n textContent: Array.from(element.childNodes)\n .map((node) => node.type === NodeType.Text && node.textContent)\n .filter(Boolean) // filter out empty values\n .map(text => (text ).trim())\n .join(''),\n attributes: getAttributesToRecord(element.attributes),\n },\n }\n : {},\n };\n}\n\n/**\n * An event handler to react to DOM events.\n * Exported for tests.\n */\nfunction handleDom(handlerData) {\n const { target, message } = getDomTarget(handlerData);\n\n return createBreadcrumb({\n category: `ui.${handlerData.name}`,\n ...getBaseDomBreadcrumb(target, message),\n });\n}\n\nfunction getDomTarget(handlerData) {\n const isClick = handlerData.name === 'click';\n\n let message;\n let target = null;\n\n // Accessing event.target can throw (see getsentry/raven-js#838, #768)\n try {\n target = isClick ? getClickTargetNode(handlerData.event ) : getTargetNode(handlerData.event );\n message = htmlTreeAsString(target, { maxStringLength: 200 }) || '';\n } catch (e) {\n message = '';\n }\n\n return { target, message };\n}\n\nfunction isElement(node) {\n return node.type === NodeType.Element;\n}\n\n/** Handle keyboard events & create breadcrumbs. */\nfunction handleKeyboardEvent(replay, event) {\n if (!replay.isEnabled()) {\n return;\n }\n\n // Update user activity, but do not restart recording as it can create\n // noisy/low-value replays (e.g. user comes back from idle, hits alt-tab, new\n // session with a single \"keydown\" breadcrumb is created)\n replay.updateUserActivity();\n\n const breadcrumb = getKeyboardBreadcrumb(event);\n\n if (!breadcrumb) {\n return;\n }\n\n addBreadcrumbEvent(replay, breadcrumb);\n}\n\n/** exported only for tests */\nfunction getKeyboardBreadcrumb(event) {\n const { metaKey, shiftKey, ctrlKey, altKey, key, target } = event;\n\n // never capture for input fields\n if (!target || isInputElement(target ) || !key) {\n return null;\n }\n\n // Note: We do not consider shift here, as that means \"uppercase\"\n const hasModifierKey = metaKey || ctrlKey || altKey;\n const isCharacterKey = key.length === 1; // other keys like Escape, Tab, etc have a longer length\n\n // Do not capture breadcrumb if only a word key is pressed\n // This could leak e.g. user input\n if (!hasModifierKey && isCharacterKey) {\n return null;\n }\n\n const message = htmlTreeAsString(target, { maxStringLength: 200 }) || '';\n const baseBreadcrumb = getBaseDomBreadcrumb(target , message);\n\n return createBreadcrumb({\n category: 'ui.keyDown',\n message,\n data: {\n ...baseBreadcrumb.data,\n metaKey,\n shiftKey,\n ctrlKey,\n altKey,\n key,\n },\n });\n}\n\nfunction isInputElement(target) {\n return target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable;\n}\n\n// Map entryType -> function to normalize data for event\nconst ENTRY_TYPES\n\n = {\n // @ts-expect-error TODO: entry type does not fit the create* functions entry type\n resource: createResourceEntry,\n paint: createPaintEntry,\n // @ts-expect-error TODO: entry type does not fit the create* functions entry type\n navigation: createNavigationEntry,\n};\n\n/**\n * Handler creater for web vitals\n */\nfunction webVitalHandler(\n getter,\n replay,\n) {\n return ({ metric }) => void replay.replayPerformanceEntries.push(getter(metric));\n}\n\n/**\n * Create replay performance entries from the browser performance entries.\n */\nfunction createPerformanceEntries(\n entries,\n) {\n return entries.map(createPerformanceEntry).filter(Boolean) ;\n}\n\nfunction createPerformanceEntry(entry) {\n const entryType = ENTRY_TYPES[entry.entryType];\n if (!entryType) {\n return null;\n }\n\n return entryType(entry);\n}\n\nfunction getAbsoluteTime(time) {\n // browserPerformanceTimeOrigin can be undefined if `performance` or\n // `performance.now` doesn't exist, but this is already checked by this integration\n return ((browserPerformanceTimeOrigin || WINDOW.performance.timeOrigin) + time) / 1000;\n}\n\nfunction createPaintEntry(entry) {\n const { duration, entryType, name, startTime } = entry;\n\n const start = getAbsoluteTime(startTime);\n return {\n type: entryType,\n name,\n start,\n end: start + duration,\n data: undefined,\n };\n}\n\nfunction createNavigationEntry(entry) {\n const {\n entryType,\n name,\n decodedBodySize,\n duration,\n domComplete,\n encodedBodySize,\n domContentLoadedEventStart,\n domContentLoadedEventEnd,\n domInteractive,\n loadEventStart,\n loadEventEnd,\n redirectCount,\n startTime,\n transferSize,\n type,\n } = entry;\n\n // Ignore entries with no duration, they do not seem to be useful and cause dupes\n if (duration === 0) {\n return null;\n }\n\n return {\n type: `${entryType}.${type}`,\n start: getAbsoluteTime(startTime),\n end: getAbsoluteTime(domComplete),\n name,\n data: {\n size: transferSize,\n decodedBodySize,\n encodedBodySize,\n duration,\n domInteractive,\n domContentLoadedEventStart,\n domContentLoadedEventEnd,\n loadEventStart,\n loadEventEnd,\n domComplete,\n redirectCount,\n },\n };\n}\n\nfunction createResourceEntry(\n entry,\n) {\n const {\n entryType,\n initiatorType,\n name,\n responseEnd,\n startTime,\n decodedBodySize,\n encodedBodySize,\n responseStatus,\n transferSize,\n } = entry;\n\n // Core SDK handles these\n if (['fetch', 'xmlhttprequest'].includes(initiatorType)) {\n return null;\n }\n\n return {\n type: `${entryType}.${initiatorType}`,\n start: getAbsoluteTime(startTime),\n end: getAbsoluteTime(responseEnd),\n name,\n data: {\n size: transferSize,\n statusCode: responseStatus,\n decodedBodySize,\n encodedBodySize,\n },\n };\n}\n\n/**\n * Add a LCP event to the replay based on a LCP metric.\n */\nfunction getLargestContentfulPaint(metric) {\n const lastEntry = metric.entries[metric.entries.length - 1] ;\n const node = lastEntry && lastEntry.element ? [lastEntry.element] : undefined;\n return getWebVital(metric, 'largest-contentful-paint', node);\n}\n\nfunction isLayoutShift(entry) {\n return (entry ).sources !== undefined;\n}\n\n/**\n * Add a CLS event to the replay based on a CLS metric.\n */\nfunction getCumulativeLayoutShift(metric) {\n const layoutShifts = [];\n const nodes = [];\n for (const entry of metric.entries) {\n if (isLayoutShift(entry)) {\n const nodeIds = [];\n for (const source of entry.sources) {\n if (source.node) {\n nodes.push(source.node);\n const nodeId = record.mirror.getId(source.node);\n if (nodeId) {\n nodeIds.push(nodeId);\n }\n }\n }\n layoutShifts.push({ value: entry.value, nodeIds: nodeIds.length ? nodeIds : undefined });\n }\n }\n\n return getWebVital(metric, 'cumulative-layout-shift', nodes, layoutShifts);\n}\n\n/**\n * Add a FID event to the replay based on a FID metric.\n */\nfunction getFirstInputDelay(metric) {\n const lastEntry = metric.entries[metric.entries.length - 1] ;\n const node = lastEntry && lastEntry.target ? [lastEntry.target] : undefined;\n return getWebVital(metric, 'first-input-delay', node);\n}\n\n/**\n * Add an INP event to the replay based on an INP metric.\n */\nfunction getInteractionToNextPaint(metric) {\n const lastEntry = metric.entries[metric.entries.length - 1] ;\n const node = lastEntry && lastEntry.target ? [lastEntry.target] : undefined;\n return getWebVital(metric, 'interaction-to-next-paint', node);\n}\n\n/**\n * Add an web vital event to the replay based on the web vital metric.\n */\nfunction getWebVital(\n metric,\n name,\n nodes,\n attributions,\n) {\n const value = metric.value;\n const rating = metric.rating;\n\n const end = getAbsoluteTime(value);\n\n return {\n type: 'web-vital',\n name,\n start: end,\n end,\n data: {\n value,\n size: value,\n rating,\n nodeIds: nodes ? nodes.map(node => record.mirror.getId(node)) : undefined,\n attributions,\n },\n };\n}\n\n/**\n * Sets up a PerformanceObserver to listen to all performance entry types.\n * Returns a callback to stop observing.\n */\nfunction setupPerformanceObserver(replay) {\n function addPerformanceEntry(entry) {\n // It is possible for entries to come up multiple times\n if (!replay.performanceEntries.includes(entry)) {\n replay.performanceEntries.push(entry);\n }\n }\n\n function onEntries({ entries }) {\n entries.forEach(addPerformanceEntry);\n }\n\n const clearCallbacks = [];\n\n (['navigation', 'paint', 'resource'] ).forEach(type => {\n clearCallbacks.push(addPerformanceInstrumentationHandler(type, onEntries));\n });\n\n clearCallbacks.push(\n addLcpInstrumentationHandler(webVitalHandler(getLargestContentfulPaint, replay)),\n addClsInstrumentationHandler(webVitalHandler(getCumulativeLayoutShift, replay)),\n addFidInstrumentationHandler(webVitalHandler(getFirstInputDelay, replay)),\n addInpInstrumentationHandler(webVitalHandler(getInteractionToNextPaint, replay)),\n );\n\n // A callback to cleanup all handlers\n return () => {\n clearCallbacks.forEach(clearCallback => clearCallback());\n };\n}\n\nconst r = `var t=Uint8Array,n=Uint16Array,r=Int32Array,e=new t([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),i=new t([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),a=new t([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),s=function(t,e){for(var i=new n(31),a=0;a<31;++a)i[a]=e+=1<>1|(21845&c)<<1;v=(61680&(v=(52428&v)>>2|(13107&v)<<2))>>4|(3855&v)<<4,u[c]=((65280&v)>>8|(255&v)<<8)>>1}var d=function(t,r,e){for(var i=t.length,a=0,s=new n(r);a>h]=l}else for(o=new n(i),a=0;a>15-t[a]);return o},g=new t(288);for(c=0;c<144;++c)g[c]=8;for(c=144;c<256;++c)g[c]=9;for(c=256;c<280;++c)g[c]=7;for(c=280;c<288;++c)g[c]=8;var w=new t(32);for(c=0;c<32;++c)w[c]=5;var p=d(g,9,0),y=d(w,5,0),m=function(t){return(t+7)/8|0},b=function(n,r,e){return(null==r||r<0)&&(r=0),(null==e||e>n.length)&&(e=n.length),new t(n.subarray(r,e))},M=[\"unexpected EOF\",\"invalid block type\",\"invalid length/literal\",\"invalid distance\",\"stream finished\",\"no stream handler\",,\"no callback\",\"invalid UTF-8 data\",\"extra field too long\",\"date not in range 1980-2099\",\"filename too long\",\"stream finishing\",\"invalid zip data\"],E=function(t,n,r){var e=new Error(n||M[t]);if(e.code=t,Error.captureStackTrace&&Error.captureStackTrace(e,E),!r)throw e;return e},z=function(t,n,r){r<<=7&n;var e=n/8|0;t[e]|=r,t[e+1]|=r>>8},A=function(t,n,r){r<<=7&n;var e=n/8|0;t[e]|=r,t[e+1]|=r>>8,t[e+2]|=r>>16},_=function(r,e){for(var i=[],a=0;ad&&(d=o[a].s);var g=new n(d+1),w=x(i[c-1],g,0);if(w>e){a=0;var p=0,y=w-e,m=1<e))break;p+=m-(1<>=y;p>0;){var M=o[a].s;g[M]=0&&p;--a){var E=o[a].s;g[E]==e&&(--g[E],++p)}w=e}return{t:new t(g),l:w}},x=function(t,n,r){return-1==t.s?Math.max(x(t.l,n,r+1),x(t.r,n,r+1)):n[t.s]=r},D=function(t){for(var r=t.length;r&&!t[--r];);for(var e=new n(++r),i=0,a=t[0],s=1,o=function(t){e[i++]=t},f=1;f<=r;++f)if(t[f]==a&&f!=r)++s;else{if(!a&&s>2){for(;s>138;s-=138)o(32754);s>2&&(o(s>10?s-11<<5|28690:s-3<<5|12305),s=0)}else if(s>3){for(o(a),--s;s>6;s-=6)o(8304);s>2&&(o(s-3<<5|8208),s=0)}for(;s--;)o(a);s=1,a=t[f]}return{c:e.subarray(0,i),n:r}},T=function(t,n){for(var r=0,e=0;e>8,t[i+2]=255^t[i],t[i+3]=255^t[i+1];for(var a=0;a4&&!H[a[K-1]];--K);var N,P,Q,R,V=v+5<<3,W=T(f,g)+T(h,w)+l,X=T(f,M)+T(h,C)+l+14+3*K+T(q,H)+2*q[16]+3*q[17]+7*q[18];if(c>=0&&V<=W&&V<=X)return k(r,m,t.subarray(c,c+v));if(z(r,m,1+(X15&&(z(r,m,tt[B]>>5&127),m+=tt[B]>>12)}}}else N=p,P=g,Q=y,R=w;for(B=0;B255){A(r,m,N[(nt=rt>>18&31)+257]),m+=P[nt+257],nt>7&&(z(r,m,rt>>23&31),m+=e[nt]);var et=31&rt;A(r,m,Q[et]),m+=R[et],et>3&&(A(r,m,rt>>5&8191),m+=i[et])}else A(r,m,N[rt]),m+=P[rt]}return A(r,m,N[256]),m+P[256]},U=new r([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),F=new t(0),I=function(){for(var t=new Int32Array(256),n=0;n<256;++n){for(var r=n,e=9;--e;)r=(1&r&&-306674912)^r>>>1;t[n]=r}return t}(),S=function(){var t=-1;return{p:function(n){for(var r=t,e=0;e>>8;t=r},d:function(){return~t}}},L=function(){var t=1,n=0;return{p:function(r){for(var e=t,i=n,a=0|r.length,s=0;s!=a;){for(var o=Math.min(s+2655,a);s>16),i=(65535&i)+15*(i>>16)}t=e,n=i},d:function(){return(255&(t%=65521))<<24|(65280&t)<<8|(255&(n%=65521))<<8|n>>8}}},O=function(a,s,o,f,u){if(!u&&(u={l:1},s.dictionary)){var c=s.dictionary.subarray(-32768),v=new t(c.length+a.length);v.set(c),v.set(a,c.length),a=v,u.w=c.length}return function(a,s,o,f,u,c){var v=c.z||a.length,d=new t(f+v+5*(1+Math.ceil(v/7e3))+u),g=d.subarray(f,d.length-u),w=c.l,p=7&(c.r||0);if(s){p&&(g[0]=c.r>>3);for(var y=U[s-1],M=y>>13,E=8191&y,z=(1<7e3||q>24576)&&(N>423||!w)){p=C(a,g,0,F,I,S,O,q,G,j-G,p),q=L=O=0,G=j;for(var P=0;P<286;++P)I[P]=0;for(P=0;P<30;++P)S[P]=0}var Q=2,R=0,V=E,W=J-K&32767;if(N>2&&H==T(j-W))for(var X=Math.min(M,N)-1,Y=Math.min(32767,j),Z=Math.min(258,N);W<=Y&&--V&&J!=K;){if(a[j+Q]==a[j+Q-W]){for(var $=0;$Q){if(Q=$,R=W,$>X)break;var tt=Math.min(W,$-2),nt=0;for(P=0;Pnt&&(nt=et,K=rt)}}}W+=(J=K)-(K=A[J])&32767}if(R){F[q++]=268435456|h[Q]<<18|l[R];var it=31&h[Q],at=31&l[R];O+=e[it]+i[at],++I[257+it],++S[at],B=j+Q,++L}else F[q++]=a[j],++I[a[j]]}}for(j=Math.max(j,B);j=v&&(g[p/8|0]=w,st=v),p=k(g,p+1,a.subarray(j,st))}c.i=v}return b(d,0,f+m(p)+u)}(a,null==s.level?6:s.level,null==s.mem?Math.ceil(1.5*Math.max(8,Math.min(13,Math.log(a.length)))):12+s.mem,o,f,u)},j=function(t,n,r){for(;r;++n)t[n]=r,r>>>=8},q=function(t,n){var r=n.filename;if(t[0]=31,t[1]=139,t[2]=8,t[8]=n.level<2?4:9==n.level?2:0,t[9]=3,0!=n.mtime&&j(t,4,Math.floor(new Date(n.mtime||Date.now())/1e3)),r){t[3]=8;for(var e=0;e<=r.length;++e)t[e+10]=r.charCodeAt(e)}},B=function(t){return 10+(t.filename?t.filename.length+1:0)},G=function(){function n(n,r){if(\"function\"==typeof n&&(r=n,n={}),this.ondata=r,this.o=n||{},this.s={l:0,i:32768,w:32768,z:32768},this.b=new t(98304),this.o.dictionary){var e=this.o.dictionary.subarray(-32768);this.b.set(e,32768-e.length),this.s.i=32768-e.length}}return n.prototype.p=function(t,n){this.ondata(O(t,this.o,0,0,this.s),n)},n.prototype.push=function(n,r){this.ondata||E(5),this.s.l&&E(4);var e=n.length+this.s.z;if(e>this.b.length){if(e>2*this.b.length-32768){var i=new t(-32768&e);i.set(this.b.subarray(0,this.s.z)),this.b=i}var a=this.b.length-this.s.z;a&&(this.b.set(n.subarray(0,a),this.s.z),this.s.z=this.b.length,this.p(this.b,!1)),this.b.set(this.b.subarray(-32768)),this.b.set(n.subarray(a),32768),this.s.z=n.length-a+32768,this.s.i=32766,this.s.w=32768}else this.b.set(n,this.s.z),this.s.z+=n.length;this.s.l=1&r,(this.s.z>this.s.w+8191||r)&&(this.p(this.b,r||!1),this.s.w=this.s.i,this.s.i-=2)},n}();var H=function(){function t(t,n){this.c=L(),this.v=1,G.call(this,t,n)}return t.prototype.push=function(t,n){this.c.p(t),G.prototype.push.call(this,t,n)},t.prototype.p=function(t,n){var r=O(t,this.o,this.v&&(this.o.dictionary?6:2),n&&4,this.s);this.v&&(function(t,n){var r=n.level,e=0==r?0:r<6?1:9==r?3:2;if(t[0]=120,t[1]=e<<6|(n.dictionary&&32),t[1]|=31-(t[0]<<8|t[1])%31,n.dictionary){var i=L();i.p(n.dictionary),j(t,2,i.d())}}(r,this.o),this.v=0),n&&j(r,r.length-4,this.c.d()),this.ondata(r,n)},t}(),J=\"undefined\"!=typeof TextEncoder&&new TextEncoder,K=\"undefined\"!=typeof TextDecoder&&new TextDecoder;try{K.decode(F,{stream:!0})}catch(t){}var N=function(){function t(t){this.ondata=t}return t.prototype.push=function(t,n){this.ondata||E(5),this.d&&E(4),this.ondata(P(t),this.d=n||!1)},t}();function P(n,r){if(r){for(var e=new t(n.length),i=0;i>1)),o=0,f=function(t){s[o++]=t};for(i=0;is.length){var h=new t(o+8+(a-i<<1));h.set(s),s=h}var l=n.charCodeAt(i);l<128||r?f(l):l<2048?(f(192|l>>6),f(128|63&l)):l>55295&&l<57344?(f(240|(l=65536+(1047552&l)|1023&n.charCodeAt(++i))>>18),f(128|l>>12&63),f(128|l>>6&63),f(128|63&l)):(f(224|l>>12),f(128|l>>6&63),f(128|63&l))}return b(s,0,o)}function Q(t){return function(t,n){n||(n={});var r=S(),e=t.length;r.p(t);var i=O(t,n,B(n),8),a=i.length;return q(i,n),j(i,a-8,r.d()),j(i,a-4,e),i}(P(t))}const R=new class{constructor(){this._init()}clear(){this._init()}addEvent(t){if(!t)throw new Error(\"Adding invalid event\");const n=this._hasEvents?\",\":\"\";this.stream.push(n+t),this._hasEvents=!0}finish(){this.stream.push(\"]\",!0);const t=function(t){let n=0;for(const r of t)n+=r.length;const r=new Uint8Array(n);for(let n=0,e=0,i=t.length;n{this._deflatedData.push(t)},this.stream=new N(((t,n)=>{this.deflate.push(t,n)})),this.stream.push(\"[\")}},V={clear:()=>{R.clear()},addEvent:t=>R.addEvent(t),finish:()=>R.finish(),compress:t=>Q(t)};addEventListener(\"message\",(function(t){const n=t.data.method,r=t.data.id,e=t.data.arg;if(n in V&&\"function\"==typeof V[n])try{const t=V[n](e);postMessage({id:r,method:n,success:!0,response:t})}catch(t){postMessage({id:r,method:n,success:!1,response:t.message}),console.error(t)}})),postMessage({id:void 0,method:\"init\",success:!0,response:void 0});`;\n\nfunction e(){const e=new Blob([r]);return URL.createObjectURL(e)}\n\n/** This error indicates that the event buffer size exceeded the limit.. */\nclass EventBufferSizeExceededError extends Error {\n constructor() {\n super(`Event buffer exceeded maximum size of ${REPLAY_MAX_EVENT_BUFFER_SIZE}.`);\n }\n}\n\n/**\n * A basic event buffer that does not do any compression.\n * Used as fallback if the compression worker cannot be loaded or is disabled.\n */\nclass EventBufferArray {\n /** All the events that are buffered to be sent. */\n\n /** @inheritdoc */\n\n constructor() {\n this.events = [];\n this._totalSize = 0;\n this.hasCheckout = false;\n }\n\n /** @inheritdoc */\n get hasEvents() {\n return this.events.length > 0;\n }\n\n /** @inheritdoc */\n get type() {\n return 'sync';\n }\n\n /** @inheritdoc */\n destroy() {\n this.events = [];\n }\n\n /** @inheritdoc */\n async addEvent(event) {\n const eventSize = JSON.stringify(event).length;\n this._totalSize += eventSize;\n if (this._totalSize > REPLAY_MAX_EVENT_BUFFER_SIZE) {\n throw new EventBufferSizeExceededError();\n }\n\n this.events.push(event);\n }\n\n /** @inheritdoc */\n finish() {\n return new Promise(resolve => {\n // Make a copy of the events array reference and immediately clear the\n // events member so that we do not lose new events while uploading\n // attachment.\n const eventsRet = this.events;\n this.clear();\n resolve(JSON.stringify(eventsRet));\n });\n }\n\n /** @inheritdoc */\n clear() {\n this.events = [];\n this._totalSize = 0;\n this.hasCheckout = false;\n }\n\n /** @inheritdoc */\n getEarliestTimestamp() {\n const timestamp = this.events.map(event => event.timestamp).sort()[0];\n\n if (!timestamp) {\n return null;\n }\n\n return timestampToMs(timestamp);\n }\n}\n\n/**\n * Event buffer that uses a web worker to compress events.\n * Exported only for testing.\n */\nclass WorkerHandler {\n\n constructor(worker) {\n this._worker = worker;\n this._id = 0;\n }\n\n /**\n * Ensure the worker is ready (or not).\n * This will either resolve when the worker is ready, or reject if an error occured.\n */\n ensureReady() {\n // Ensure we only check once\n if (this._ensureReadyPromise) {\n return this._ensureReadyPromise;\n }\n\n this._ensureReadyPromise = new Promise((resolve, reject) => {\n this._worker.addEventListener(\n 'message',\n ({ data }) => {\n if ((data ).success) {\n resolve();\n } else {\n reject();\n }\n },\n { once: true },\n );\n\n this._worker.addEventListener(\n 'error',\n error => {\n reject(error);\n },\n { once: true },\n );\n });\n\n return this._ensureReadyPromise;\n }\n\n /**\n * Destroy the worker.\n */\n destroy() {\n DEBUG_BUILD && logger.info('Destroying compression worker');\n this._worker.terminate();\n }\n\n /**\n * Post message to worker and wait for response before resolving promise.\n */\n postMessage(method, arg) {\n const id = this._getAndIncrementId();\n\n return new Promise((resolve, reject) => {\n const listener = ({ data }) => {\n const response = data ;\n if (response.method !== method) {\n return;\n }\n\n // There can be multiple listeners for a single method, the id ensures\n // that the response matches the caller.\n if (response.id !== id) {\n return;\n }\n\n // At this point, we'll always want to remove listener regardless of result status\n this._worker.removeEventListener('message', listener);\n\n if (!response.success) {\n // TODO: Do some error handling, not sure what\n DEBUG_BUILD && logger.error('Error in compression worker: ', response.response);\n\n reject(new Error('Error in compression worker'));\n return;\n }\n\n resolve(response.response );\n };\n\n // Note: we can't use `once` option because it's possible it needs to\n // listen to multiple messages\n this._worker.addEventListener('message', listener);\n this._worker.postMessage({ id, method, arg });\n });\n }\n\n /** Get the current ID and increment it for the next call. */\n _getAndIncrementId() {\n return this._id++;\n }\n}\n\n/**\n * Event buffer that uses a web worker to compress events.\n * Exported only for testing.\n */\nclass EventBufferCompressionWorker {\n /** @inheritdoc */\n\n constructor(worker) {\n this._worker = new WorkerHandler(worker);\n this._earliestTimestamp = null;\n this._totalSize = 0;\n this.hasCheckout = false;\n }\n\n /** @inheritdoc */\n get hasEvents() {\n return !!this._earliestTimestamp;\n }\n\n /** @inheritdoc */\n get type() {\n return 'worker';\n }\n\n /**\n * Ensure the worker is ready (or not).\n * This will either resolve when the worker is ready, or reject if an error occured.\n */\n ensureReady() {\n return this._worker.ensureReady();\n }\n\n /**\n * Destroy the event buffer.\n */\n destroy() {\n this._worker.destroy();\n }\n\n /**\n * Add an event to the event buffer.\n *\n * Returns true if event was successfuly received and processed by worker.\n */\n addEvent(event) {\n const timestamp = timestampToMs(event.timestamp);\n if (!this._earliestTimestamp || timestamp < this._earliestTimestamp) {\n this._earliestTimestamp = timestamp;\n }\n\n const data = JSON.stringify(event);\n this._totalSize += data.length;\n\n if (this._totalSize > REPLAY_MAX_EVENT_BUFFER_SIZE) {\n return Promise.reject(new EventBufferSizeExceededError());\n }\n\n return this._sendEventToWorker(data);\n }\n\n /**\n * Finish the event buffer and return the compressed data.\n */\n finish() {\n return this._finishRequest();\n }\n\n /** @inheritdoc */\n clear() {\n this._earliestTimestamp = null;\n this._totalSize = 0;\n this.hasCheckout = false;\n\n // We do not wait on this, as we assume the order of messages is consistent for the worker\n this._worker.postMessage('clear').then(null, e => {\n DEBUG_BUILD && logger.exception(e, 'Sending \"clear\" message to worker failed', e);\n });\n }\n\n /** @inheritdoc */\n getEarliestTimestamp() {\n return this._earliestTimestamp;\n }\n\n /**\n * Send the event to the worker.\n */\n _sendEventToWorker(data) {\n return this._worker.postMessage('addEvent', data);\n }\n\n /**\n * Finish the request and return the compressed data from the worker.\n */\n async _finishRequest() {\n const response = await this._worker.postMessage('finish');\n\n this._earliestTimestamp = null;\n this._totalSize = 0;\n\n return response;\n }\n}\n\n/**\n * This proxy will try to use the compression worker, and fall back to use the simple buffer if an error occurs there.\n * This can happen e.g. if the worker cannot be loaded.\n * Exported only for testing.\n */\nclass EventBufferProxy {\n\n constructor(worker) {\n this._fallback = new EventBufferArray();\n this._compression = new EventBufferCompressionWorker(worker);\n this._used = this._fallback;\n\n this._ensureWorkerIsLoadedPromise = this._ensureWorkerIsLoaded();\n }\n\n /** @inheritdoc */\n get type() {\n return this._used.type;\n }\n\n /** @inheritDoc */\n get hasEvents() {\n return this._used.hasEvents;\n }\n\n /** @inheritdoc */\n get hasCheckout() {\n return this._used.hasCheckout;\n }\n /** @inheritdoc */\n set hasCheckout(value) {\n this._used.hasCheckout = value;\n }\n\n /** @inheritDoc */\n destroy() {\n this._fallback.destroy();\n this._compression.destroy();\n }\n\n /** @inheritdoc */\n clear() {\n return this._used.clear();\n }\n\n /** @inheritdoc */\n getEarliestTimestamp() {\n return this._used.getEarliestTimestamp();\n }\n\n /**\n * Add an event to the event buffer.\n *\n * Returns true if event was successfully added.\n */\n addEvent(event) {\n return this._used.addEvent(event);\n }\n\n /** @inheritDoc */\n async finish() {\n // Ensure the worker is loaded, so the sent event is compressed\n await this.ensureWorkerIsLoaded();\n\n return this._used.finish();\n }\n\n /** Ensure the worker has loaded. */\n ensureWorkerIsLoaded() {\n return this._ensureWorkerIsLoadedPromise;\n }\n\n /** Actually check if the worker has been loaded. */\n async _ensureWorkerIsLoaded() {\n try {\n await this._compression.ensureReady();\n } catch (error) {\n // If the worker fails to load, we fall back to the simple buffer.\n // Nothing more to do from our side here\n DEBUG_BUILD && logger.exception(error, 'Failed to load the compression worker, falling back to simple buffer');\n return;\n }\n\n // Now we need to switch over the array buffer to the compression worker\n await this._switchToCompressionWorker();\n }\n\n /** Switch the used buffer to the compression worker. */\n async _switchToCompressionWorker() {\n const { events, hasCheckout } = this._fallback;\n\n const addEventPromises = [];\n for (const event of events) {\n addEventPromises.push(this._compression.addEvent(event));\n }\n\n this._compression.hasCheckout = hasCheckout;\n\n // We switch over to the new buffer immediately - any further events will be added\n // after the previously buffered ones\n this._used = this._compression;\n\n // Wait for original events to be re-added before resolving\n try {\n await Promise.all(addEventPromises);\n\n // Can now clear fallback buffer as it's no longer necessary\n this._fallback.clear();\n } catch (error) {\n DEBUG_BUILD && logger.exception(error, 'Failed to add events when switching buffers.');\n }\n }\n}\n\n/**\n * Create an event buffer for replays.\n */\nfunction createEventBuffer({\n useCompression,\n workerUrl: customWorkerUrl,\n}) {\n if (\n useCompression &&\n // eslint-disable-next-line no-restricted-globals\n window.Worker\n ) {\n const worker = _loadWorker(customWorkerUrl);\n\n if (worker) {\n return worker;\n }\n }\n\n DEBUG_BUILD && logger.info('Using simple buffer');\n return new EventBufferArray();\n}\n\nfunction _loadWorker(customWorkerUrl) {\n try {\n const workerUrl = customWorkerUrl || _getWorkerUrl();\n\n if (!workerUrl) {\n return;\n }\n\n DEBUG_BUILD && logger.info(`Using compression worker${customWorkerUrl ? ` from ${customWorkerUrl}` : ''}`);\n const worker = new Worker(workerUrl);\n return new EventBufferProxy(worker);\n } catch (error) {\n DEBUG_BUILD && logger.exception(error, 'Failed to create compression worker');\n // Fall back to use simple event buffer array\n }\n}\n\nfunction _getWorkerUrl() {\n if (typeof __SENTRY_EXCLUDE_REPLAY_WORKER__ === 'undefined' || !__SENTRY_EXCLUDE_REPLAY_WORKER__) {\n return e();\n }\n\n return '';\n}\n\n/** If sessionStorage is available. */\nfunction hasSessionStorage() {\n try {\n // This can throw, e.g. when being accessed in a sandboxed iframe\n return 'sessionStorage' in WINDOW && !!WINDOW.sessionStorage;\n } catch (e) {\n return false;\n }\n}\n\n/**\n * Removes the session from Session Storage and unsets session in replay instance\n */\nfunction clearSession(replay) {\n deleteSession();\n replay.session = undefined;\n}\n\n/**\n * Deletes a session from storage\n */\nfunction deleteSession() {\n if (!hasSessionStorage()) {\n return;\n }\n\n try {\n WINDOW.sessionStorage.removeItem(REPLAY_SESSION_KEY);\n } catch (e) {\n // Ignore potential SecurityError exceptions\n }\n}\n\n/**\n * Given a sample rate, returns true if replay should be sampled.\n *\n * 1.0 = 100% sampling\n * 0.0 = 0% sampling\n */\nfunction isSampled(sampleRate) {\n if (sampleRate === undefined) {\n return false;\n }\n\n // Math.random() returns a number in range of 0 to 1 (inclusive of 0, but not 1)\n return Math.random() < sampleRate;\n}\n\n/**\n * Get a session with defaults & applied sampling.\n */\nfunction makeSession(session) {\n const now = Date.now();\n const id = session.id || uuid4();\n // Note that this means we cannot set a started/lastActivity of `0`, but this should not be relevant outside of tests.\n const started = session.started || now;\n const lastActivity = session.lastActivity || now;\n const segmentId = session.segmentId || 0;\n const sampled = session.sampled;\n const previousSessionId = session.previousSessionId;\n\n return {\n id,\n started,\n lastActivity,\n segmentId,\n sampled,\n previousSessionId,\n };\n}\n\n/**\n * Save a session to session storage.\n */\nfunction saveSession(session) {\n if (!hasSessionStorage()) {\n return;\n }\n\n try {\n WINDOW.sessionStorage.setItem(REPLAY_SESSION_KEY, JSON.stringify(session));\n } catch (e) {\n // Ignore potential SecurityError exceptions\n }\n}\n\n/**\n * Get the sampled status for a session based on sample rates & current sampled status.\n */\nfunction getSessionSampleType(sessionSampleRate, allowBuffering) {\n return isSampled(sessionSampleRate) ? 'session' : allowBuffering ? 'buffer' : false;\n}\n\n/**\n * Create a new session, which in its current implementation is a Sentry event\n * that all replays will be saved to as attachments. Currently, we only expect\n * one of these Sentry events per \"replay session\".\n */\nfunction createSession(\n { sessionSampleRate, allowBuffering, stickySession = false },\n { previousSessionId } = {},\n) {\n const sampled = getSessionSampleType(sessionSampleRate, allowBuffering);\n const session = makeSession({\n sampled,\n previousSessionId,\n });\n\n if (stickySession) {\n saveSession(session);\n }\n\n return session;\n}\n\n/**\n * Fetches a session from storage\n */\nfunction fetchSession() {\n if (!hasSessionStorage()) {\n return null;\n }\n\n try {\n // This can throw if cookies are disabled\n const sessionStringFromStorage = WINDOW.sessionStorage.getItem(REPLAY_SESSION_KEY);\n\n if (!sessionStringFromStorage) {\n return null;\n }\n\n const sessionObj = JSON.parse(sessionStringFromStorage) ;\n\n DEBUG_BUILD && logger.infoTick('Loading existing session');\n\n return makeSession(sessionObj);\n } catch (e) {\n return null;\n }\n}\n\n/**\n * Given an initial timestamp and an expiry duration, checks to see if current\n * time should be considered as expired.\n */\nfunction isExpired(\n initialTime,\n expiry,\n targetTime = +new Date(),\n) {\n // Always expired if < 0\n if (initialTime === null || expiry === undefined || expiry < 0) {\n return true;\n }\n\n // Never expires if == 0\n if (expiry === 0) {\n return false;\n }\n\n return initialTime + expiry <= targetTime;\n}\n\n/**\n * Checks to see if session is expired\n */\nfunction isSessionExpired(\n session,\n {\n maxReplayDuration,\n sessionIdleExpire,\n targetTime = Date.now(),\n },\n) {\n return (\n // First, check that maximum session length has not been exceeded\n isExpired(session.started, maxReplayDuration, targetTime) ||\n // check that the idle timeout has not been exceeded (i.e. user has\n // performed an action within the last `sessionIdleExpire` ms)\n isExpired(session.lastActivity, sessionIdleExpire, targetTime)\n );\n}\n\n/** If the session should be refreshed or not. */\nfunction shouldRefreshSession(\n session,\n { sessionIdleExpire, maxReplayDuration },\n) {\n // If not expired, all good, just keep the session\n if (!isSessionExpired(session, { sessionIdleExpire, maxReplayDuration })) {\n return false;\n }\n\n // If we are buffering & haven't ever flushed yet, always continue\n if (session.sampled === 'buffer' && session.segmentId === 0) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Get or create a session, when initializing the replay.\n * Returns a session that may be unsampled.\n */\nfunction loadOrCreateSession(\n {\n sessionIdleExpire,\n maxReplayDuration,\n previousSessionId,\n }\n\n,\n sessionOptions,\n) {\n const existingSession = sessionOptions.stickySession && fetchSession();\n\n // No session exists yet, just create a new one\n if (!existingSession) {\n DEBUG_BUILD && logger.infoTick('Creating new session');\n return createSession(sessionOptions, { previousSessionId });\n }\n\n if (!shouldRefreshSession(existingSession, { sessionIdleExpire, maxReplayDuration })) {\n return existingSession;\n }\n\n DEBUG_BUILD && logger.infoTick('Session in sessionStorage is expired, creating new one...');\n return createSession(sessionOptions, { previousSessionId: existingSession.id });\n}\n\nfunction isCustomEvent(event) {\n return event.type === EventType.Custom;\n}\n\n/**\n * Add an event to the event buffer.\n * In contrast to `addEvent`, this does not return a promise & does not wait for the adding of the event to succeed/fail.\n * Instead this returns `true` if we tried to add the event, else false.\n * It returns `false` e.g. if we are paused, disabled, or out of the max replay duration.\n *\n * `isCheckout` is true if this is either the very first event, or an event triggered by `checkoutEveryNms`.\n */\nfunction addEventSync(replay, event, isCheckout) {\n if (!shouldAddEvent(replay, event)) {\n return false;\n }\n\n // This should never reject\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n _addEvent(replay, event, isCheckout);\n\n return true;\n}\n\n/**\n * Add an event to the event buffer.\n * Resolves to `null` if no event was added, else to `void`.\n *\n * `isCheckout` is true if this is either the very first event, or an event triggered by `checkoutEveryNms`.\n */\nfunction addEvent(\n replay,\n event,\n isCheckout,\n) {\n if (!shouldAddEvent(replay, event)) {\n return Promise.resolve(null);\n }\n\n return _addEvent(replay, event, isCheckout);\n}\n\nasync function _addEvent(\n replay,\n event,\n isCheckout,\n) {\n if (!replay.eventBuffer) {\n return null;\n }\n\n try {\n if (isCheckout && replay.recordingMode === 'buffer') {\n replay.eventBuffer.clear();\n }\n\n if (isCheckout) {\n replay.eventBuffer.hasCheckout = true;\n }\n\n const replayOptions = replay.getOptions();\n\n const eventAfterPossibleCallback = maybeApplyCallback(event, replayOptions.beforeAddRecordingEvent);\n\n if (!eventAfterPossibleCallback) {\n return;\n }\n\n return await replay.eventBuffer.addEvent(eventAfterPossibleCallback);\n } catch (error) {\n const reason = error && error instanceof EventBufferSizeExceededError ? 'addEventSizeExceeded' : 'addEvent';\n replay.handleException(error);\n\n await replay.stop({ reason });\n\n const client = getClient();\n\n if (client) {\n client.recordDroppedEvent('internal_sdk_error', 'replay');\n }\n }\n}\n\n/** Exported only for tests. */\nfunction shouldAddEvent(replay, event) {\n if (!replay.eventBuffer || replay.isPaused() || !replay.isEnabled()) {\n return false;\n }\n\n const timestampInMs = timestampToMs(event.timestamp);\n\n // Throw out events that happen more than 5 minutes ago. This can happen if\n // page has been left open and idle for a long period of time and user\n // comes back to trigger a new session. The performance entries rely on\n // `performance.timeOrigin`, which is when the page first opened.\n if (timestampInMs + replay.timeouts.sessionIdlePause < Date.now()) {\n return false;\n }\n\n // Throw out events that are +60min from the initial timestamp\n if (timestampInMs > replay.getContext().initialTimestamp + replay.getOptions().maxReplayDuration) {\n DEBUG_BUILD &&\n logger.infoTick(`Skipping event with timestamp ${timestampInMs} because it is after maxReplayDuration`);\n return false;\n }\n\n return true;\n}\n\nfunction maybeApplyCallback(\n event,\n callback,\n) {\n try {\n if (typeof callback === 'function' && isCustomEvent(event)) {\n return callback(event);\n }\n } catch (error) {\n DEBUG_BUILD &&\n logger.exception(error, 'An error occured in the `beforeAddRecordingEvent` callback, skipping the event...');\n return null;\n }\n\n return event;\n}\n\n/** If the event is an error event */\nfunction isErrorEvent(event) {\n return !event.type;\n}\n\n/** If the event is a transaction event */\nfunction isTransactionEvent(event) {\n return event.type === 'transaction';\n}\n\n/** If the event is an replay event */\nfunction isReplayEvent(event) {\n return event.type === 'replay_event';\n}\n\n/** If the event is a feedback event */\nfunction isFeedbackEvent(event) {\n return event.type === 'feedback';\n}\n\n/**\n * Returns a listener to be added to `client.on('afterSendErrorEvent, listener)`.\n */\nfunction handleAfterSendEvent(replay) {\n return (event, sendResponse) => {\n if (!replay.isEnabled() || (!isErrorEvent(event) && !isTransactionEvent(event))) {\n return;\n }\n\n const statusCode = sendResponse && sendResponse.statusCode;\n\n // We only want to do stuff on successful error sending, otherwise you get error replays without errors attached\n // If not using the base transport, we allow `undefined` response (as a custom transport may not implement this correctly yet)\n // If we do use the base transport, we skip if we encountered an non-OK status code\n if (!statusCode || statusCode < 200 || statusCode >= 300) {\n return;\n }\n\n if (isTransactionEvent(event)) {\n handleTransactionEvent(replay, event);\n return;\n }\n\n handleErrorEvent(replay, event);\n };\n}\n\nfunction handleTransactionEvent(replay, event) {\n const replayContext = replay.getContext();\n\n // Collect traceIds in _context regardless of `recordingMode`\n // In error mode, _context gets cleared on every checkout\n // We limit to max. 100 transactions linked\n if (event.contexts && event.contexts.trace && event.contexts.trace.trace_id && replayContext.traceIds.size < 100) {\n replayContext.traceIds.add(event.contexts.trace.trace_id );\n }\n}\n\nfunction handleErrorEvent(replay, event) {\n const replayContext = replay.getContext();\n\n // Add error to list of errorIds of replay. This is ok to do even if not\n // sampled because context will get reset at next checkout.\n // XXX: There is also a race condition where it's possible to capture an\n // error to Sentry before Replay SDK has loaded, but response returns after\n // it was loaded, and this gets called.\n // We limit to max. 100 errors linked\n if (event.event_id && replayContext.errorIds.size < 100) {\n replayContext.errorIds.add(event.event_id);\n }\n\n // If error event is tagged with replay id it means it was sampled (when in buffer mode)\n // Need to be very careful that this does not cause an infinite loop\n if (replay.recordingMode !== 'buffer' || !event.tags || !event.tags.replayId) {\n return;\n }\n\n const { beforeErrorSampling } = replay.getOptions();\n if (typeof beforeErrorSampling === 'function' && !beforeErrorSampling(event)) {\n return;\n }\n\n setTimeout$3(async () => {\n try {\n // Capture current event buffer as new replay\n await replay.sendBufferedReplayOrFlush();\n } catch (err) {\n replay.handleException(err);\n }\n });\n}\n\n/**\n * Returns a listener to be added to `client.on('afterSendErrorEvent, listener)`.\n */\nfunction handleBeforeSendEvent(replay) {\n return (event) => {\n if (!replay.isEnabled() || !isErrorEvent(event)) {\n return;\n }\n\n handleHydrationError(replay, event);\n };\n}\n\nfunction handleHydrationError(replay, event) {\n const exceptionValue =\n event.exception && event.exception.values && event.exception.values[0] && event.exception.values[0].value;\n if (typeof exceptionValue !== 'string') {\n return;\n }\n\n if (\n // Only matches errors in production builds of react-dom\n // Example https://reactjs.org/docs/error-decoder.html?invariant=423\n // With newer React versions, the messages changed to a different website https://react.dev/errors/418\n exceptionValue.match(\n /(reactjs\\.org\\/docs\\/error-decoder\\.html\\?invariant=|react\\.dev\\/errors\\/)(418|419|422|423|425)/,\n ) ||\n // Development builds of react-dom\n // Error 1: Hydration failed because the initial UI does not match what was rendered on the server.\n // Error 2: Text content does not match server-rendered HTML. Warning: Text content did not match.\n exceptionValue.match(/(does not match server-rendered HTML|Hydration failed because)/i)\n ) {\n const breadcrumb = createBreadcrumb({\n category: 'replay.hydrate-error',\n data: {\n url: getLocationHref(),\n },\n });\n addBreadcrumbEvent(replay, breadcrumb);\n }\n}\n\n/**\n * Handle breadcrumbs that Sentry captures, and make sure to capture relevant breadcrumbs to Replay as well.\n */\nfunction handleBreadcrumbs(replay) {\n const client = getClient();\n\n if (!client) {\n return;\n }\n\n client.on('beforeAddBreadcrumb', breadcrumb => beforeAddBreadcrumb(replay, breadcrumb));\n}\n\nfunction beforeAddBreadcrumb(replay, breadcrumb) {\n if (!replay.isEnabled() || !isBreadcrumbWithCategory(breadcrumb)) {\n return;\n }\n\n const result = normalizeBreadcrumb(breadcrumb);\n if (result) {\n addBreadcrumbEvent(replay, result);\n }\n}\n\n/** Exported only for tests. */\nfunction normalizeBreadcrumb(breadcrumb) {\n if (\n !isBreadcrumbWithCategory(breadcrumb) ||\n [\n // fetch & xhr are handled separately,in handleNetworkBreadcrumbs\n 'fetch',\n 'xhr',\n // These two are breadcrumbs for emitted sentry events, we don't care about them\n 'sentry.event',\n 'sentry.transaction',\n ].includes(breadcrumb.category) ||\n // We capture UI breadcrumbs separately\n breadcrumb.category.startsWith('ui.')\n ) {\n return null;\n }\n\n if (breadcrumb.category === 'console') {\n return normalizeConsoleBreadcrumb(breadcrumb);\n }\n\n return createBreadcrumb(breadcrumb);\n}\n\n/** exported for tests only */\nfunction normalizeConsoleBreadcrumb(\n breadcrumb,\n) {\n const args = breadcrumb.data && breadcrumb.data.arguments;\n\n if (!Array.isArray(args) || args.length === 0) {\n return createBreadcrumb(breadcrumb);\n }\n\n let isTruncated = false;\n\n // Avoid giant args captures\n const normalizedArgs = args.map(arg => {\n if (!arg) {\n return arg;\n }\n if (typeof arg === 'string') {\n if (arg.length > CONSOLE_ARG_MAX_SIZE) {\n isTruncated = true;\n return `${arg.slice(0, CONSOLE_ARG_MAX_SIZE)}…`;\n }\n\n return arg;\n }\n if (typeof arg === 'object') {\n try {\n const normalizedArg = normalize(arg, 7);\n const stringified = JSON.stringify(normalizedArg);\n if (stringified.length > CONSOLE_ARG_MAX_SIZE) {\n isTruncated = true;\n // We use the pretty printed JSON string here as a base\n return `${JSON.stringify(normalizedArg, null, 2).slice(0, CONSOLE_ARG_MAX_SIZE)}…`;\n }\n return normalizedArg;\n } catch (e) {\n // fall back to default\n }\n }\n\n return arg;\n });\n\n return createBreadcrumb({\n ...breadcrumb,\n data: {\n ...breadcrumb.data,\n arguments: normalizedArgs,\n ...(isTruncated ? { _meta: { warnings: ['CONSOLE_ARG_TRUNCATED'] } } : {}),\n },\n });\n}\n\nfunction isBreadcrumbWithCategory(breadcrumb) {\n return !!breadcrumb.category;\n}\n\n/**\n * Returns true if we think the given event is an error originating inside of rrweb.\n */\nfunction isRrwebError(event, hint) {\n if (event.type || !event.exception || !event.exception.values || !event.exception.values.length) {\n return false;\n }\n\n // @ts-expect-error this may be set by rrweb when it finds errors\n if (hint.originalException && hint.originalException.__rrweb__) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Add a feedback breadcrumb event to replay.\n */\nfunction addFeedbackBreadcrumb(replay, event) {\n replay.triggerUserActivity();\n replay.addUpdate(() => {\n if (!event.timestamp) {\n // Ignore events that don't have timestamps (this shouldn't happen, more of a typing issue)\n // Return true here so that we don't flush\n return true;\n }\n\n // This should never reject\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n replay.throttledAddEvent({\n type: EventType.Custom,\n timestamp: event.timestamp * 1000,\n data: {\n tag: 'breadcrumb',\n payload: {\n timestamp: event.timestamp,\n type: 'default',\n category: 'sentry.feedback',\n data: {\n feedbackId: event.event_id,\n },\n },\n },\n } );\n\n return false;\n });\n}\n\n/**\n * Determine if event should be sampled (only applies in buffer mode).\n * When an event is captured by `hanldleGlobalEvent`, when in buffer mode\n * we determine if we want to sample the error or not.\n */\nfunction shouldSampleForBufferEvent(replay, event) {\n if (replay.recordingMode !== 'buffer') {\n return false;\n }\n\n // ignore this error because otherwise we could loop indefinitely with\n // trying to capture replay and failing\n if (event.message === UNABLE_TO_SEND_REPLAY) {\n return false;\n }\n\n // Require the event to be an error event & to have an exception\n if (!event.exception || event.type) {\n return false;\n }\n\n return isSampled(replay.getOptions().errorSampleRate);\n}\n\n/**\n * Returns a listener to be added to `addEventProcessor(listener)`.\n */\nfunction handleGlobalEventListener(replay) {\n return Object.assign(\n (event, hint) => {\n // Do nothing if replay has been disabled or paused\n if (!replay.isEnabled() || replay.isPaused()) {\n return event;\n }\n\n if (isReplayEvent(event)) {\n // Replays have separate set of breadcrumbs, do not include breadcrumbs\n // from core SDK\n delete event.breadcrumbs;\n return event;\n }\n\n // We only want to handle errors, transactions, and feedbacks, nothing else\n if (!isErrorEvent(event) && !isTransactionEvent(event) && !isFeedbackEvent(event)) {\n return event;\n }\n\n // Ensure we do not add replay_id if the session is expired\n const isSessionActive = replay.checkAndHandleExpiredSession();\n if (!isSessionActive) {\n return event;\n }\n\n if (isFeedbackEvent(event)) {\n // This should never reject\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n replay.flush();\n event.contexts.feedback.replay_id = replay.getSessionId();\n // Add a replay breadcrumb for this piece of feedback\n addFeedbackBreadcrumb(replay, event);\n return event;\n }\n\n // Unless `captureExceptions` is enabled, we want to ignore errors coming from rrweb\n // As there can be a bunch of stuff going wrong in internals there, that we don't want to bubble up to users\n if (isRrwebError(event, hint) && !replay.getOptions()._experiments.captureExceptions) {\n DEBUG_BUILD && logger.log('Ignoring error from rrweb internals', event);\n return null;\n }\n\n // When in buffer mode, we decide to sample here.\n // Later, in `handleAfterSendEvent`, if the replayId is set, we know that we sampled\n // And convert the buffer session to a full session\n const isErrorEventSampled = shouldSampleForBufferEvent(replay, event);\n\n // Tag errors if it has been sampled in buffer mode, or if it is session mode\n // Only tag transactions if in session mode\n const shouldTagReplayId = isErrorEventSampled || replay.recordingMode === 'session';\n\n if (shouldTagReplayId) {\n event.tags = { ...event.tags, replayId: replay.getSessionId() };\n }\n\n return event;\n },\n { id: 'Replay' },\n );\n}\n\n/**\n * Create a \"span\" for each performance entry.\n */\nfunction createPerformanceSpans(\n replay,\n entries,\n) {\n return entries.map(({ type, start, end, name, data }) => {\n const response = replay.throttledAddEvent({\n type: EventType.Custom,\n timestamp: start,\n data: {\n tag: 'performanceSpan',\n payload: {\n op: type,\n description: name,\n startTimestamp: start,\n endTimestamp: end,\n data,\n },\n },\n });\n\n // If response is a string, it means its either THROTTLED or SKIPPED\n return typeof response === 'string' ? Promise.resolve(null) : response;\n });\n}\n\nfunction handleHistory(handlerData) {\n const { from, to } = handlerData;\n\n const now = Date.now() / 1000;\n\n return {\n type: 'navigation.push',\n start: now,\n end: now,\n name: to,\n data: {\n previous: from,\n },\n };\n}\n\n/**\n * Returns a listener to be added to `addHistoryInstrumentationHandler(listener)`.\n */\nfunction handleHistorySpanListener(replay) {\n return (handlerData) => {\n if (!replay.isEnabled()) {\n return;\n }\n\n const result = handleHistory(handlerData);\n\n if (result === null) {\n return;\n }\n\n // Need to collect visited URLs\n replay.getContext().urls.push(result.name);\n replay.triggerUserActivity();\n\n replay.addUpdate(() => {\n createPerformanceSpans(replay, [result]);\n // Returning false to flush\n return false;\n });\n };\n}\n\n/**\n * Check whether a given request URL should be filtered out. This is so we\n * don't log Sentry ingest requests.\n */\nfunction shouldFilterRequest(replay, url) {\n // If we enabled the `traceInternals` experiment, we want to trace everything\n if (DEBUG_BUILD && replay.getOptions()._experiments.traceInternals) {\n return false;\n }\n\n return isSentryRequestUrl(url, getClient());\n}\n\n/** Add a performance entry breadcrumb */\nfunction addNetworkBreadcrumb(\n replay,\n result,\n) {\n if (!replay.isEnabled()) {\n return;\n }\n\n if (result === null) {\n return;\n }\n\n if (shouldFilterRequest(replay, result.name)) {\n return;\n }\n\n replay.addUpdate(() => {\n createPerformanceSpans(replay, [result]);\n // Returning true will cause `addUpdate` to not flush\n // We do not want network requests to cause a flush. This will prevent\n // recurring/polling requests from keeping the replay session alive.\n return true;\n });\n}\n\n/** Get the size of a body. */\nfunction getBodySize(body) {\n if (!body) {\n return undefined;\n }\n\n const textEncoder = new TextEncoder();\n\n try {\n if (typeof body === 'string') {\n return textEncoder.encode(body).length;\n }\n\n if (body instanceof URLSearchParams) {\n return textEncoder.encode(body.toString()).length;\n }\n\n if (body instanceof FormData) {\n const formDataStr = _serializeFormData(body);\n return textEncoder.encode(formDataStr).length;\n }\n\n if (body instanceof Blob) {\n return body.size;\n }\n\n if (body instanceof ArrayBuffer) {\n return body.byteLength;\n }\n\n // Currently unhandled types: ArrayBufferView, ReadableStream\n } catch (e) {\n // just return undefined\n }\n\n return undefined;\n}\n\n/** Convert a Content-Length header to number/undefined. */\nfunction parseContentLengthHeader(header) {\n if (!header) {\n return undefined;\n }\n\n const size = parseInt(header, 10);\n return isNaN(size) ? undefined : size;\n}\n\n/** Get the string representation of a body. */\nfunction getBodyString(body) {\n try {\n if (typeof body === 'string') {\n return [body];\n }\n\n if (body instanceof URLSearchParams) {\n return [body.toString()];\n }\n\n if (body instanceof FormData) {\n return [_serializeFormData(body)];\n }\n\n if (!body) {\n return [undefined];\n }\n } catch (error) {\n DEBUG_BUILD && logger.exception(error, 'Failed to serialize body', body);\n return [undefined, 'BODY_PARSE_ERROR'];\n }\n\n DEBUG_BUILD && logger.info('Skipping network body because of body type', body);\n\n return [undefined, 'UNPARSEABLE_BODY_TYPE'];\n}\n\n/** Merge a warning into an existing network request/response. */\nfunction mergeWarning(\n info,\n warning,\n) {\n if (!info) {\n return {\n headers: {},\n size: undefined,\n _meta: {\n warnings: [warning],\n },\n };\n }\n\n const newMeta = { ...info._meta };\n const existingWarnings = newMeta.warnings || [];\n newMeta.warnings = [...existingWarnings, warning];\n\n info._meta = newMeta;\n return info;\n}\n\n/** Convert ReplayNetworkRequestData to a PerformanceEntry. */\nfunction makeNetworkReplayBreadcrumb(\n type,\n data,\n) {\n if (!data) {\n return null;\n }\n\n const { startTimestamp, endTimestamp, url, method, statusCode, request, response } = data;\n\n const result = {\n type,\n start: startTimestamp / 1000,\n end: endTimestamp / 1000,\n name: url,\n data: dropUndefinedKeys({\n method,\n statusCode,\n request,\n response,\n }),\n };\n\n return result;\n}\n\n/** Build the request or response part of a replay network breadcrumb that was skipped. */\nfunction buildSkippedNetworkRequestOrResponse(bodySize) {\n return {\n headers: {},\n size: bodySize,\n _meta: {\n warnings: ['URL_SKIPPED'],\n },\n };\n}\n\n/** Build the request or response part of a replay network breadcrumb. */\nfunction buildNetworkRequestOrResponse(\n headers,\n bodySize,\n body,\n) {\n if (!bodySize && Object.keys(headers).length === 0) {\n return undefined;\n }\n\n if (!bodySize) {\n return {\n headers,\n };\n }\n\n if (!body) {\n return {\n headers,\n size: bodySize,\n };\n }\n\n const info = {\n headers,\n size: bodySize,\n };\n\n const { body: normalizedBody, warnings } = normalizeNetworkBody(body);\n info.body = normalizedBody;\n if (warnings && warnings.length > 0) {\n info._meta = {\n warnings,\n };\n }\n\n return info;\n}\n\n/** Filter a set of headers */\nfunction getAllowedHeaders(headers, allowedHeaders) {\n return Object.entries(headers).reduce((filteredHeaders, [key, value]) => {\n const normalizedKey = key.toLowerCase();\n // Avoid putting empty strings into the headers\n if (allowedHeaders.includes(normalizedKey) && headers[key]) {\n filteredHeaders[normalizedKey] = value;\n }\n return filteredHeaders;\n }, {});\n}\n\nfunction _serializeFormData(formData) {\n // This is a bit simplified, but gives us a decent estimate\n // This converts e.g. { name: 'Anne Smith', age: 13 } to 'name=Anne+Smith&age=13'\n // @ts-expect-error passing FormData to URLSearchParams actually works\n return new URLSearchParams(formData).toString();\n}\n\nfunction normalizeNetworkBody(body)\n\n {\n if (!body || typeof body !== 'string') {\n return {\n body,\n };\n }\n\n const exceedsSizeLimit = body.length > NETWORK_BODY_MAX_SIZE;\n const isProbablyJson = _strIsProbablyJson(body);\n\n if (exceedsSizeLimit) {\n const truncatedBody = body.slice(0, NETWORK_BODY_MAX_SIZE);\n\n if (isProbablyJson) {\n return {\n body: truncatedBody,\n warnings: ['MAYBE_JSON_TRUNCATED'],\n };\n }\n\n return {\n body: `${truncatedBody}…`,\n warnings: ['TEXT_TRUNCATED'],\n };\n }\n\n if (isProbablyJson) {\n try {\n const jsonBody = JSON.parse(body);\n return {\n body: jsonBody,\n };\n } catch (e2) {\n // fall back to just send the body as string\n }\n }\n\n return {\n body,\n };\n}\n\nfunction _strIsProbablyJson(str) {\n const first = str[0];\n const last = str[str.length - 1];\n\n // Simple check: If this does not start & end with {} or [], it's not JSON\n return (first === '[' && last === ']') || (first === '{' && last === '}');\n}\n\n/** Match an URL against a list of strings/Regex. */\nfunction urlMatches(url, urls) {\n const fullUrl = getFullUrl(url);\n\n return stringMatchesSomePattern(fullUrl, urls);\n}\n\n/** exported for tests */\nfunction getFullUrl(url, baseURI = WINDOW.document.baseURI) {\n // Short circuit for common cases:\n if (url.startsWith('http://') || url.startsWith('https://') || url.startsWith(WINDOW.location.origin)) {\n return url;\n }\n const fixedUrl = new URL(url, baseURI);\n\n // If these do not match, we are not dealing with a relative URL, so just return it\n if (fixedUrl.origin !== new URL(baseURI).origin) {\n return url;\n }\n\n const fullUrl = fixedUrl.href;\n\n // Remove trailing slashes, if they don't match the original URL\n if (!url.endsWith('/') && fullUrl.endsWith('/')) {\n return fullUrl.slice(0, -1);\n }\n\n return fullUrl;\n}\n\n/**\n * Capture a fetch breadcrumb to a replay.\n * This adds additional data (where approriate).\n */\nasync function captureFetchBreadcrumbToReplay(\n breadcrumb,\n hint,\n options\n\n,\n) {\n try {\n const data = await _prepareFetchData(breadcrumb, hint, options);\n\n // Create a replay performance entry from this breadcrumb\n const result = makeNetworkReplayBreadcrumb('resource.fetch', data);\n addNetworkBreadcrumb(options.replay, result);\n } catch (error) {\n DEBUG_BUILD && logger.exception(error, 'Failed to capture fetch breadcrumb');\n }\n}\n\n/**\n * Enrich a breadcrumb with additional data.\n * This has to be sync & mutate the given breadcrumb,\n * as the breadcrumb is afterwards consumed by other handlers.\n */\nfunction enrichFetchBreadcrumb(\n breadcrumb,\n hint,\n) {\n const { input, response } = hint;\n\n const body = input ? _getFetchRequestArgBody(input) : undefined;\n const reqSize = getBodySize(body);\n\n const resSize = response ? parseContentLengthHeader(response.headers.get('content-length')) : undefined;\n\n if (reqSize !== undefined) {\n breadcrumb.data.request_body_size = reqSize;\n }\n if (resSize !== undefined) {\n breadcrumb.data.response_body_size = resSize;\n }\n}\n\nasync function _prepareFetchData(\n breadcrumb,\n hint,\n options,\n) {\n const now = Date.now();\n const { startTimestamp = now, endTimestamp = now } = hint;\n\n const {\n url,\n method,\n status_code: statusCode = 0,\n request_body_size: requestBodySize,\n response_body_size: responseBodySize,\n } = breadcrumb.data;\n\n const captureDetails =\n urlMatches(url, options.networkDetailAllowUrls) && !urlMatches(url, options.networkDetailDenyUrls);\n\n const request = captureDetails\n ? _getRequestInfo(options, hint.input, requestBodySize)\n : buildSkippedNetworkRequestOrResponse(requestBodySize);\n const response = await _getResponseInfo(captureDetails, options, hint.response, responseBodySize);\n\n return {\n startTimestamp,\n endTimestamp,\n url,\n method,\n statusCode,\n request,\n response,\n };\n}\n\nfunction _getRequestInfo(\n { networkCaptureBodies, networkRequestHeaders },\n input,\n requestBodySize,\n) {\n const headers = input ? getRequestHeaders(input, networkRequestHeaders) : {};\n\n if (!networkCaptureBodies) {\n return buildNetworkRequestOrResponse(headers, requestBodySize, undefined);\n }\n\n // We only want to transmit string or string-like bodies\n const requestBody = _getFetchRequestArgBody(input);\n const [bodyStr, warning] = getBodyString(requestBody);\n const data = buildNetworkRequestOrResponse(headers, requestBodySize, bodyStr);\n\n if (warning) {\n return mergeWarning(data, warning);\n }\n\n return data;\n}\n\n/** Exported only for tests. */\nasync function _getResponseInfo(\n captureDetails,\n {\n networkCaptureBodies,\n networkResponseHeaders,\n },\n response,\n responseBodySize,\n) {\n if (!captureDetails && responseBodySize !== undefined) {\n return buildSkippedNetworkRequestOrResponse(responseBodySize);\n }\n\n const headers = response ? getAllHeaders(response.headers, networkResponseHeaders) : {};\n\n if (!response || (!networkCaptureBodies && responseBodySize !== undefined)) {\n return buildNetworkRequestOrResponse(headers, responseBodySize, undefined);\n }\n\n const [bodyText, warning] = await _parseFetchResponseBody(response);\n const result = getResponseData(bodyText, {\n networkCaptureBodies,\n\n responseBodySize,\n captureDetails,\n headers,\n });\n\n if (warning) {\n return mergeWarning(result, warning);\n }\n\n return result;\n}\n\nfunction getResponseData(\n bodyText,\n {\n networkCaptureBodies,\n responseBodySize,\n captureDetails,\n headers,\n }\n\n,\n) {\n try {\n const size =\n bodyText && bodyText.length && responseBodySize === undefined ? getBodySize(bodyText) : responseBodySize;\n\n if (!captureDetails) {\n return buildSkippedNetworkRequestOrResponse(size);\n }\n\n if (networkCaptureBodies) {\n return buildNetworkRequestOrResponse(headers, size, bodyText);\n }\n\n return buildNetworkRequestOrResponse(headers, size, undefined);\n } catch (error) {\n DEBUG_BUILD && logger.exception(error, 'Failed to serialize response body');\n // fallback\n return buildNetworkRequestOrResponse(headers, responseBodySize, undefined);\n }\n}\n\nasync function _parseFetchResponseBody(response) {\n const res = _tryCloneResponse(response);\n\n if (!res) {\n return [undefined, 'BODY_PARSE_ERROR'];\n }\n\n try {\n const text = await _tryGetResponseText(res);\n return [text];\n } catch (error) {\n DEBUG_BUILD && logger.exception(error, 'Failed to get text body from response');\n return [undefined, 'BODY_PARSE_ERROR'];\n }\n}\n\nfunction _getFetchRequestArgBody(fetchArgs = []) {\n // We only support getting the body from the fetch options\n if (fetchArgs.length !== 2 || typeof fetchArgs[1] !== 'object') {\n return undefined;\n }\n\n return (fetchArgs[1] ).body;\n}\n\nfunction getAllHeaders(headers, allowedHeaders) {\n const allHeaders = {};\n\n allowedHeaders.forEach(header => {\n if (headers.get(header)) {\n allHeaders[header] = headers.get(header) ;\n }\n });\n\n return allHeaders;\n}\n\nfunction getRequestHeaders(fetchArgs, allowedHeaders) {\n if (fetchArgs.length === 1 && typeof fetchArgs[0] !== 'string') {\n return getHeadersFromOptions(fetchArgs[0] , allowedHeaders);\n }\n\n if (fetchArgs.length === 2) {\n return getHeadersFromOptions(fetchArgs[1] , allowedHeaders);\n }\n\n return {};\n}\n\nfunction getHeadersFromOptions(\n input,\n allowedHeaders,\n) {\n if (!input) {\n return {};\n }\n\n const headers = input.headers;\n\n if (!headers) {\n return {};\n }\n\n if (headers instanceof Headers) {\n return getAllHeaders(headers, allowedHeaders);\n }\n\n // We do not support this, as it is not really documented (anymore?)\n if (Array.isArray(headers)) {\n return {};\n }\n\n return getAllowedHeaders(headers, allowedHeaders);\n}\n\nfunction _tryCloneResponse(response) {\n try {\n // We have to clone this, as the body can only be read once\n return response.clone();\n } catch (error) {\n // this can throw if the response was already consumed before\n DEBUG_BUILD && logger.exception(error, 'Failed to clone response body');\n }\n}\n\n/**\n * Get the response body of a fetch request, or timeout after 500ms.\n * Fetch can return a streaming body, that may not resolve (or not for a long time).\n * If that happens, we rather abort after a short time than keep waiting for this.\n */\nfunction _tryGetResponseText(response) {\n return new Promise((resolve, reject) => {\n const timeout = setTimeout$3(() => reject(new Error('Timeout while trying to read response body')), 500);\n\n _getResponseText(response)\n .then(\n txt => resolve(txt),\n reason => reject(reason),\n )\n .finally(() => clearTimeout(timeout));\n });\n}\n\nasync function _getResponseText(response) {\n // Force this to be a promise, just to be safe\n // eslint-disable-next-line no-return-await\n return await response.text();\n}\n\n/**\n * Capture an XHR breadcrumb to a replay.\n * This adds additional data (where approriate).\n */\nasync function captureXhrBreadcrumbToReplay(\n breadcrumb,\n hint,\n options,\n) {\n try {\n const data = _prepareXhrData(breadcrumb, hint, options);\n\n // Create a replay performance entry from this breadcrumb\n const result = makeNetworkReplayBreadcrumb('resource.xhr', data);\n addNetworkBreadcrumb(options.replay, result);\n } catch (error) {\n DEBUG_BUILD && logger.exception(error, 'Failed to capture xhr breadcrumb');\n }\n}\n\n/**\n * Enrich a breadcrumb with additional data.\n * This has to be sync & mutate the given breadcrumb,\n * as the breadcrumb is afterwards consumed by other handlers.\n */\nfunction enrichXhrBreadcrumb(\n breadcrumb,\n hint,\n) {\n const { xhr, input } = hint;\n\n if (!xhr) {\n return;\n }\n\n const reqSize = getBodySize(input);\n const resSize = xhr.getResponseHeader('content-length')\n ? parseContentLengthHeader(xhr.getResponseHeader('content-length'))\n : _getBodySize(xhr.response, xhr.responseType);\n\n if (reqSize !== undefined) {\n breadcrumb.data.request_body_size = reqSize;\n }\n if (resSize !== undefined) {\n breadcrumb.data.response_body_size = resSize;\n }\n}\n\nfunction _prepareXhrData(\n breadcrumb,\n hint,\n options,\n) {\n const now = Date.now();\n const { startTimestamp = now, endTimestamp = now, input, xhr } = hint;\n\n const {\n url,\n method,\n status_code: statusCode = 0,\n request_body_size: requestBodySize,\n response_body_size: responseBodySize,\n } = breadcrumb.data;\n\n if (!url) {\n return null;\n }\n\n if (!xhr || !urlMatches(url, options.networkDetailAllowUrls) || urlMatches(url, options.networkDetailDenyUrls)) {\n const request = buildSkippedNetworkRequestOrResponse(requestBodySize);\n const response = buildSkippedNetworkRequestOrResponse(responseBodySize);\n return {\n startTimestamp,\n endTimestamp,\n url,\n method,\n statusCode,\n request,\n response,\n };\n }\n\n const xhrInfo = xhr[SENTRY_XHR_DATA_KEY];\n const networkRequestHeaders = xhrInfo\n ? getAllowedHeaders(xhrInfo.request_headers, options.networkRequestHeaders)\n : {};\n const networkResponseHeaders = getAllowedHeaders(getResponseHeaders(xhr), options.networkResponseHeaders);\n\n const [requestBody, requestWarning] = options.networkCaptureBodies ? getBodyString(input) : [undefined];\n const [responseBody, responseWarning] = options.networkCaptureBodies ? _getXhrResponseBody(xhr) : [undefined];\n\n const request = buildNetworkRequestOrResponse(networkRequestHeaders, requestBodySize, requestBody);\n const response = buildNetworkRequestOrResponse(networkResponseHeaders, responseBodySize, responseBody);\n\n return {\n startTimestamp,\n endTimestamp,\n url,\n method,\n statusCode,\n request: requestWarning ? mergeWarning(request, requestWarning) : request,\n response: responseWarning ? mergeWarning(response, responseWarning) : response,\n };\n}\n\nfunction getResponseHeaders(xhr) {\n const headers = xhr.getAllResponseHeaders();\n\n if (!headers) {\n return {};\n }\n\n return headers.split('\\r\\n').reduce((acc, line) => {\n const [key, value] = line.split(': ') ;\n if (value) {\n acc[key.toLowerCase()] = value;\n }\n return acc;\n }, {});\n}\n\nfunction _getXhrResponseBody(xhr) {\n // We collect errors that happen, but only log them if we can't get any response body\n const errors = [];\n\n try {\n return [xhr.responseText];\n } catch (e) {\n errors.push(e);\n }\n\n // Try to manually parse the response body, if responseText fails\n try {\n return _parseXhrResponse(xhr.response, xhr.responseType);\n } catch (e) {\n errors.push(e);\n }\n\n DEBUG_BUILD && logger.warn('Failed to get xhr response body', ...errors);\n\n return [undefined];\n}\n\n/**\n * Get the string representation of the XHR response.\n * Based on MDN, these are the possible types of the response:\n * string\n * ArrayBuffer\n * Blob\n * Document\n * POJO\n *\n * Exported only for tests.\n */\nfunction _parseXhrResponse(\n body,\n responseType,\n) {\n try {\n if (typeof body === 'string') {\n return [body];\n }\n\n if (body instanceof Document) {\n return [body.body.outerHTML];\n }\n\n if (responseType === 'json' && body && typeof body === 'object') {\n return [JSON.stringify(body)];\n }\n\n if (!body) {\n return [undefined];\n }\n } catch (error) {\n DEBUG_BUILD && logger.exception(error, 'Failed to serialize body', body);\n return [undefined, 'BODY_PARSE_ERROR'];\n }\n\n DEBUG_BUILD && logger.info('Skipping network body because of body type', body);\n\n return [undefined, 'UNPARSEABLE_BODY_TYPE'];\n}\n\nfunction _getBodySize(\n body,\n responseType,\n) {\n try {\n const bodyStr = responseType === 'json' && body && typeof body === 'object' ? JSON.stringify(body) : body;\n return getBodySize(bodyStr);\n } catch (e2) {\n return undefined;\n }\n}\n\n/**\n * This method does two things:\n * - It enriches the regular XHR/fetch breadcrumbs with request/response size data\n * - It captures the XHR/fetch breadcrumbs to the replay\n * (enriching it with further data that is _not_ added to the regular breadcrumbs)\n */\nfunction handleNetworkBreadcrumbs(replay) {\n const client = getClient();\n\n try {\n const {\n networkDetailAllowUrls,\n networkDetailDenyUrls,\n networkCaptureBodies,\n networkRequestHeaders,\n networkResponseHeaders,\n } = replay.getOptions();\n\n const options = {\n replay,\n networkDetailAllowUrls,\n networkDetailDenyUrls,\n networkCaptureBodies,\n networkRequestHeaders,\n networkResponseHeaders,\n };\n\n if (client) {\n client.on('beforeAddBreadcrumb', (breadcrumb, hint) => beforeAddNetworkBreadcrumb(options, breadcrumb, hint));\n }\n } catch (e2) {\n // Do nothing\n }\n}\n\n/** just exported for tests */\nfunction beforeAddNetworkBreadcrumb(\n options,\n breadcrumb,\n hint,\n) {\n if (!breadcrumb.data) {\n return;\n }\n\n try {\n if (_isXhrBreadcrumb(breadcrumb) && _isXhrHint(hint)) {\n // This has to be sync, as we need to ensure the breadcrumb is enriched in the same tick\n // Because the hook runs synchronously, and the breadcrumb is afterwards passed on\n // So any async mutations to it will not be reflected in the final breadcrumb\n enrichXhrBreadcrumb(breadcrumb, hint);\n\n // This call should not reject\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n captureXhrBreadcrumbToReplay(breadcrumb, hint, options);\n }\n\n if (_isFetchBreadcrumb(breadcrumb) && _isFetchHint(hint)) {\n // This has to be sync, as we need to ensure the breadcrumb is enriched in the same tick\n // Because the hook runs synchronously, and the breadcrumb is afterwards passed on\n // So any async mutations to it will not be reflected in the final breadcrumb\n enrichFetchBreadcrumb(breadcrumb, hint);\n\n // This call should not reject\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n captureFetchBreadcrumbToReplay(breadcrumb, hint, options);\n }\n } catch (e) {\n DEBUG_BUILD && logger.exception(e, 'Error when enriching network breadcrumb');\n }\n}\n\nfunction _isXhrBreadcrumb(breadcrumb) {\n return breadcrumb.category === 'xhr';\n}\n\nfunction _isFetchBreadcrumb(breadcrumb) {\n return breadcrumb.category === 'fetch';\n}\n\nfunction _isXhrHint(hint) {\n return hint && hint.xhr;\n}\n\nfunction _isFetchHint(hint) {\n return hint && hint.response;\n}\n\n/**\n * Add global listeners that cannot be removed.\n */\nfunction addGlobalListeners(replay) {\n // Listeners from core SDK //\n const client = getClient();\n\n addClickKeypressInstrumentationHandler(handleDomListener(replay));\n addHistoryInstrumentationHandler(handleHistorySpanListener(replay));\n handleBreadcrumbs(replay);\n handleNetworkBreadcrumbs(replay);\n\n // Tag all (non replay) events that get sent to Sentry with the current\n // replay ID so that we can reference them later in the UI\n const eventProcessor = handleGlobalEventListener(replay);\n addEventProcessor(eventProcessor);\n\n // If a custom client has no hooks yet, we continue to use the \"old\" implementation\n if (client) {\n client.on('beforeSendEvent', handleBeforeSendEvent(replay));\n client.on('afterSendEvent', handleAfterSendEvent(replay));\n client.on('createDsc', (dsc) => {\n const replayId = replay.getSessionId();\n // We do not want to set the DSC when in buffer mode, as that means the replay has not been sent (yet)\n if (replayId && replay.isEnabled() && replay.recordingMode === 'session') {\n // Ensure to check that the session is still active - it could have expired in the meanwhile\n const isSessionActive = replay.checkAndHandleExpiredSession();\n if (isSessionActive) {\n dsc.replay_id = replayId;\n }\n }\n });\n\n client.on('spanStart', span => {\n replay.lastActiveSpan = span;\n });\n\n // We may be missing the initial spanStart due to timing issues,\n // so we capture it on finish again.\n client.on('spanEnd', span => {\n replay.lastActiveSpan = span;\n });\n\n // We want to flush replay\n client.on('beforeSendFeedback', (feedbackEvent, options) => {\n const replayId = replay.getSessionId();\n if (options && options.includeReplay && replay.isEnabled() && replayId) {\n // This should never reject\n if (feedbackEvent.contexts && feedbackEvent.contexts.feedback) {\n feedbackEvent.contexts.feedback.replay_id = replayId;\n }\n }\n });\n }\n}\n\n/**\n * Create a \"span\" for the total amount of memory being used by JS objects\n * (including v8 internal objects).\n */\nasync function addMemoryEntry(replay) {\n // window.performance.memory is a non-standard API and doesn't work on all browsers, so we try-catch this\n try {\n return Promise.all(\n createPerformanceSpans(replay, [\n // @ts-expect-error memory doesn't exist on type Performance as the API is non-standard (we check that it exists above)\n createMemoryEntry(WINDOW.performance.memory),\n ]),\n );\n } catch (error) {\n // Do nothing\n return [];\n }\n}\n\nfunction createMemoryEntry(memoryEntry) {\n const { jsHeapSizeLimit, totalJSHeapSize, usedJSHeapSize } = memoryEntry;\n // we don't want to use `getAbsoluteTime` because it adds the event time to the\n // time origin, so we get the current timestamp instead\n const time = Date.now() / 1000;\n return {\n type: 'memory',\n name: 'memory',\n start: time,\n end: time,\n data: {\n memory: {\n jsHeapSizeLimit,\n totalJSHeapSize,\n usedJSHeapSize,\n },\n },\n };\n}\n\n/**\n * Heavily simplified debounce function based on lodash.debounce.\n *\n * This function takes a callback function (@param fun) and delays its invocation\n * by @param wait milliseconds. Optionally, a maxWait can be specified in @param options,\n * which ensures that the callback is invoked at least once after the specified max. wait time.\n *\n * @param func the function whose invocation is to be debounced\n * @param wait the minimum time until the function is invoked after it was called once\n * @param options the options object, which can contain the `maxWait` property\n *\n * @returns the debounced version of the function, which needs to be called at least once to start the\n * debouncing process. Subsequent calls will reset the debouncing timer and, in case @paramfunc\n * was already invoked in the meantime, return @param func's return value.\n * The debounced function has two additional properties:\n * - `flush`: Invokes the debounced function immediately and returns its return value\n * - `cancel`: Cancels the debouncing process and resets the debouncing timer\n */\nfunction debounce(func, wait, options) {\n let callbackReturnValue;\n\n let timerId;\n let maxTimerId;\n\n const maxWait = options && options.maxWait ? Math.max(options.maxWait, wait) : 0;\n\n function invokeFunc() {\n cancelTimers();\n callbackReturnValue = func();\n return callbackReturnValue;\n }\n\n function cancelTimers() {\n timerId !== undefined && clearTimeout(timerId);\n maxTimerId !== undefined && clearTimeout(maxTimerId);\n timerId = maxTimerId = undefined;\n }\n\n function flush() {\n if (timerId !== undefined || maxTimerId !== undefined) {\n return invokeFunc();\n }\n return callbackReturnValue;\n }\n\n function debounced() {\n if (timerId) {\n clearTimeout(timerId);\n }\n timerId = setTimeout$3(invokeFunc, wait);\n\n if (maxWait && maxTimerId === undefined) {\n maxTimerId = setTimeout$3(invokeFunc, maxWait);\n }\n\n return callbackReturnValue;\n }\n\n debounced.cancel = cancelTimers;\n debounced.flush = flush;\n return debounced;\n}\n\n/**\n * Handler for recording events.\n *\n * Adds to event buffer, and has varying flushing behaviors if the event was a checkout.\n */\nfunction getHandleRecordingEmit(replay) {\n let hadFirstEvent = false;\n\n return (event, _isCheckout) => {\n // If this is false, it means session is expired, create and a new session and wait for checkout\n if (!replay.checkAndHandleExpiredSession()) {\n DEBUG_BUILD && logger.warn('Received replay event after session expired.');\n\n return;\n }\n\n // `_isCheckout` is only set when the checkout is due to `checkoutEveryNms`\n // We also want to treat the first event as a checkout, so we handle this specifically here\n const isCheckout = _isCheckout || !hadFirstEvent;\n hadFirstEvent = true;\n\n if (replay.clickDetector) {\n updateClickDetectorForRecordingEvent(replay.clickDetector, event);\n }\n\n // The handler returns `true` if we do not want to trigger debounced flush, `false` if we want to debounce flush.\n replay.addUpdate(() => {\n // The session is always started immediately on pageload/init, but for\n // error-only replays, it should reflect the most recent checkout\n // when an error occurs. Clear any state that happens before this current\n // checkout. This needs to happen before `addEvent()` which updates state\n // dependent on this reset.\n if (replay.recordingMode === 'buffer' && isCheckout) {\n replay.setInitialState();\n }\n\n // If the event is not added (e.g. due to being paused, disabled, or out of the max replay duration),\n // Skip all further steps\n if (!addEventSync(replay, event, isCheckout)) {\n // Return true to skip scheduling a debounced flush\n return true;\n }\n\n // Different behavior for full snapshots (type=2), ignore other event types\n // See https://github.com/rrweb-io/rrweb/blob/d8f9290ca496712aa1e7d472549480c4e7876594/packages/rrweb/src/types.ts#L16\n if (!isCheckout) {\n return false;\n }\n\n const session = replay.session;\n\n // Additionally, create a meta event that will capture certain SDK settings.\n // In order to handle buffer mode, this needs to either be done when we\n // receive checkout events or at flush time. We have an experimental mode\n // to perform multiple checkouts a session (the idea is to improve\n // seeking during playback), so also only include if segmentId is 0\n // (handled in `addSettingsEvent`).\n //\n // `isCheckout` is always true, but want to be explicit that it should\n // only be added for checkouts\n addSettingsEvent(replay, isCheckout);\n\n // If there is a previousSessionId after a full snapshot occurs, then\n // the replay session was started due to session expiration. The new session\n // is started before triggering a new checkout and contains the id\n // of the previous session. Do not immediately flush in this case\n // to avoid capturing only the checkout and instead the replay will\n // be captured if they perform any follow-up actions.\n if (session && session.previousSessionId) {\n return true;\n }\n\n // When in buffer mode, make sure we adjust the session started date to the current earliest event of the buffer\n // this should usually be the timestamp of the checkout event, but to be safe...\n if (replay.recordingMode === 'buffer' && session && replay.eventBuffer) {\n const earliestEvent = replay.eventBuffer.getEarliestTimestamp();\n if (earliestEvent) {\n DEBUG_BUILD &&\n logger.info(`Updating session start time to earliest event in buffer to ${new Date(earliestEvent)}`);\n\n session.started = earliestEvent;\n\n if (replay.getOptions().stickySession) {\n saveSession(session);\n }\n }\n }\n\n if (replay.recordingMode === 'session') {\n // If the full snapshot is due to an initial load, we will not have\n // a previous session ID. In this case, we want to buffer events\n // for a set amount of time before flushing. This can help avoid\n // capturing replays of users that immediately close the window.\n\n // This should never reject\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n void replay.flush();\n }\n\n return true;\n });\n };\n}\n\n/**\n * Exported for tests\n */\nfunction createOptionsEvent(replay) {\n const options = replay.getOptions();\n return {\n type: EventType.Custom,\n timestamp: Date.now(),\n data: {\n tag: 'options',\n payload: {\n shouldRecordCanvas: replay.isRecordingCanvas(),\n sessionSampleRate: options.sessionSampleRate,\n errorSampleRate: options.errorSampleRate,\n useCompressionOption: options.useCompression,\n blockAllMedia: options.blockAllMedia,\n maskAllText: options.maskAllText,\n maskAllInputs: options.maskAllInputs,\n useCompression: replay.eventBuffer ? replay.eventBuffer.type === 'worker' : false,\n networkDetailHasUrls: options.networkDetailAllowUrls.length > 0,\n networkCaptureBodies: options.networkCaptureBodies,\n networkRequestHasHeaders: options.networkRequestHeaders.length > 0,\n networkResponseHasHeaders: options.networkResponseHeaders.length > 0,\n },\n },\n };\n}\n\n/**\n * Add a \"meta\" event that contains a simplified view on current configuration\n * options. This should only be included on the first segment of a recording.\n */\nfunction addSettingsEvent(replay, isCheckout) {\n // Only need to add this event when sending the first segment\n if (!isCheckout || !replay.session || replay.session.segmentId !== 0) {\n return;\n }\n\n addEventSync(replay, createOptionsEvent(replay), false);\n}\n\n/**\n * Reset the `replay_id` field on the DSC.\n */\nfunction resetReplayIdOnDynamicSamplingContext() {\n // Reset DSC on the current scope, if there is one\n const dsc = getCurrentScope().getPropagationContext().dsc;\n if (dsc) {\n delete dsc.replay_id;\n }\n\n // Clear it from frozen DSC on the active span\n const activeSpan = getActiveSpan();\n if (activeSpan) {\n const dsc = getDynamicSamplingContextFromSpan(activeSpan);\n delete (dsc ).replay_id;\n }\n}\n\n/**\n * Create a replay envelope ready to be sent.\n * This includes both the replay event, as well as the recording data.\n */\nfunction createReplayEnvelope(\n replayEvent,\n recordingData,\n dsn,\n tunnel,\n) {\n return createEnvelope(\n createEventEnvelopeHeaders(replayEvent, getSdkMetadataForEnvelopeHeader(replayEvent), tunnel, dsn),\n [\n [{ type: 'replay_event' }, replayEvent],\n [\n {\n type: 'replay_recording',\n // If string then we need to encode to UTF8, otherwise will have\n // wrong size. TextEncoder has similar browser support to\n // MutationObserver, although it does not accept IE11.\n length:\n typeof recordingData === 'string' ? new TextEncoder().encode(recordingData).length : recordingData.length,\n },\n recordingData,\n ],\n ],\n );\n}\n\n/**\n * Prepare the recording data ready to be sent.\n */\nfunction prepareRecordingData({\n recordingData,\n headers,\n}\n\n) {\n let payloadWithSequence;\n\n // XXX: newline is needed to separate sequence id from events\n const replayHeaders = `${JSON.stringify(headers)}\n`;\n\n if (typeof recordingData === 'string') {\n payloadWithSequence = `${replayHeaders}${recordingData}`;\n } else {\n const enc = new TextEncoder();\n // XXX: newline is needed to separate sequence id from events\n const sequence = enc.encode(replayHeaders);\n // Merge the two Uint8Arrays\n payloadWithSequence = new Uint8Array(sequence.length + recordingData.length);\n payloadWithSequence.set(sequence);\n payloadWithSequence.set(recordingData, sequence.length);\n }\n\n return payloadWithSequence;\n}\n\n/**\n * Prepare a replay event & enrich it with the SDK metadata.\n */\nasync function prepareReplayEvent({\n client,\n scope,\n replayId: event_id,\n event,\n}\n\n) {\n const integrations =\n typeof client._integrations === 'object' && client._integrations !== null && !Array.isArray(client._integrations)\n ? Object.keys(client._integrations)\n : undefined;\n\n const eventHint = { event_id, integrations };\n\n client.emit('preprocessEvent', event, eventHint);\n\n const preparedEvent = (await prepareEvent(\n client.getOptions(),\n event,\n eventHint,\n scope,\n client,\n getIsolationScope(),\n )) ;\n\n // If e.g. a global event processor returned null\n if (!preparedEvent) {\n return null;\n }\n\n // This normally happens in browser client \"_prepareEvent\"\n // but since we do not use this private method from the client, but rather the plain import\n // we need to do this manually.\n preparedEvent.platform = preparedEvent.platform || 'javascript';\n\n // extract the SDK name because `client._prepareEvent` doesn't add it to the event\n const metadata = client.getSdkMetadata();\n const { name, version } = (metadata && metadata.sdk) || {};\n\n preparedEvent.sdk = {\n ...preparedEvent.sdk,\n name: name || 'sentry.javascript.unknown',\n version: version || '0.0.0',\n };\n\n return preparedEvent;\n}\n\n/**\n * Send replay attachment using `fetch()`\n */\nasync function sendReplayRequest({\n recordingData,\n replayId,\n segmentId: segment_id,\n eventContext,\n timestamp,\n session,\n}) {\n const preparedRecordingData = prepareRecordingData({\n recordingData,\n headers: {\n segment_id,\n },\n });\n\n const { urls, errorIds, traceIds, initialTimestamp } = eventContext;\n\n const client = getClient();\n const scope = getCurrentScope();\n const transport = client && client.getTransport();\n const dsn = client && client.getDsn();\n\n if (!client || !transport || !dsn || !session.sampled) {\n return resolvedSyncPromise({});\n }\n\n const baseEvent = {\n type: REPLAY_EVENT_NAME,\n replay_start_timestamp: initialTimestamp / 1000,\n timestamp: timestamp / 1000,\n error_ids: errorIds,\n trace_ids: traceIds,\n urls,\n replay_id: replayId,\n segment_id,\n replay_type: session.sampled,\n };\n\n const replayEvent = await prepareReplayEvent({ scope, client, replayId, event: baseEvent });\n\n if (!replayEvent) {\n // Taken from baseclient's `_processEvent` method, where this is handled for errors/transactions\n client.recordDroppedEvent('event_processor', 'replay', baseEvent);\n DEBUG_BUILD && logger.info('An event processor returned `null`, will not send event.');\n return resolvedSyncPromise({});\n }\n\n /*\n For reference, the fully built event looks something like this:\n {\n \"type\": \"replay_event\",\n \"timestamp\": 1670837008.634,\n \"error_ids\": [\n \"errorId\"\n ],\n \"trace_ids\": [\n \"traceId\"\n ],\n \"urls\": [\n \"https://example.com\"\n ],\n \"replay_id\": \"eventId\",\n \"segment_id\": 3,\n \"replay_type\": \"error\",\n \"platform\": \"javascript\",\n \"event_id\": \"eventId\",\n \"environment\": \"production\",\n \"sdk\": {\n \"integrations\": [\n \"BrowserTracing\",\n \"Replay\"\n ],\n \"name\": \"sentry.javascript.browser\",\n \"version\": \"7.25.0\"\n },\n \"sdkProcessingMetadata\": {},\n \"contexts\": {\n },\n }\n */\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 replayEvent.sdkProcessingMetadata;\n\n const envelope = createReplayEnvelope(replayEvent, preparedRecordingData, dsn, client.getOptions().tunnel);\n\n let response;\n\n try {\n response = await transport.send(envelope);\n } catch (err) {\n const error = new Error(UNABLE_TO_SEND_REPLAY);\n\n try {\n // In case browsers don't allow this property to be writable\n // @ts-expect-error This needs lib es2022 and newer\n error.cause = err;\n } catch (e) {\n // nothing to do\n }\n throw error;\n }\n\n // If the status code is invalid, we want to immediately stop & not retry\n if (typeof response.statusCode === 'number' && (response.statusCode < 200 || response.statusCode >= 300)) {\n throw new TransportStatusCodeError(response.statusCode);\n }\n\n const rateLimits = updateRateLimits({}, response);\n if (isRateLimited(rateLimits, 'replay')) {\n throw new RateLimitError(rateLimits);\n }\n\n return response;\n}\n\n/**\n * This error indicates that the transport returned an invalid status code.\n */\nclass TransportStatusCodeError extends Error {\n constructor(statusCode) {\n super(`Transport returned status code ${statusCode}`);\n }\n}\n\n/**\n * This error indicates that we hit a rate limit API error.\n */\nclass RateLimitError extends Error {\n\n constructor(rateLimits) {\n super('Rate limit hit');\n this.rateLimits = rateLimits;\n }\n}\n\n/**\n * Finalize and send the current replay event to Sentry\n */\nasync function sendReplay(\n replayData,\n retryConfig = {\n count: 0,\n interval: RETRY_BASE_INTERVAL,\n },\n) {\n const { recordingData, onError } = replayData;\n\n // short circuit if there's no events to upload (this shouldn't happen as _runFlush makes this check)\n if (!recordingData.length) {\n return;\n }\n\n try {\n await sendReplayRequest(replayData);\n return true;\n } catch (err) {\n if (err instanceof TransportStatusCodeError || err instanceof RateLimitError) {\n throw err;\n }\n\n // Capture error for every failed replay\n setContext('Replays', {\n _retryCount: retryConfig.count,\n });\n\n if (onError) {\n onError(err);\n }\n\n // If an error happened here, it's likely that uploading the attachment\n // failed, we'll can retry with the same events payload\n if (retryConfig.count >= RETRY_MAX_COUNT) {\n const error = new Error(`${UNABLE_TO_SEND_REPLAY} - max retries exceeded`);\n\n try {\n // In case browsers don't allow this property to be writable\n // @ts-expect-error This needs lib es2022 and newer\n error.cause = err;\n } catch (e) {\n // nothing to do\n }\n\n throw error;\n }\n\n // will retry in intervals of 5, 10, 30\n retryConfig.interval *= ++retryConfig.count;\n\n return new Promise((resolve, reject) => {\n setTimeout$3(async () => {\n try {\n await sendReplay(replayData, retryConfig);\n resolve(true);\n } catch (err) {\n reject(err);\n }\n }, retryConfig.interval);\n });\n }\n}\n\nconst THROTTLED = '__THROTTLED';\nconst SKIPPED = '__SKIPPED';\n\n/**\n * Create a throttled function off a given function.\n * When calling the throttled function, it will call the original function only\n * if it hasn't been called more than `maxCount` times in the last `durationSeconds`.\n *\n * Returns `THROTTLED` if throttled for the first time, after that `SKIPPED`,\n * or else the return value of the original function.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction throttle(\n fn,\n maxCount,\n durationSeconds,\n) {\n const counter = new Map();\n\n const _cleanup = (now) => {\n const threshold = now - durationSeconds;\n counter.forEach((_value, key) => {\n if (key < threshold) {\n counter.delete(key);\n }\n });\n };\n\n const _getTotalCount = () => {\n return [...counter.values()].reduce((a, b) => a + b, 0);\n };\n\n let isThrottled = false;\n\n return (...rest) => {\n // Date in second-precision, which we use as basis for the throttling\n const now = Math.floor(Date.now() / 1000);\n\n // First, make sure to delete any old entries\n _cleanup(now);\n\n // If already over limit, do nothing\n if (_getTotalCount() >= maxCount) {\n const wasThrottled = isThrottled;\n isThrottled = true;\n return wasThrottled ? SKIPPED : THROTTLED;\n }\n\n isThrottled = false;\n const count = counter.get(now) || 0;\n counter.set(now, count + 1);\n\n return fn(...rest);\n };\n}\n\n/* eslint-disable max-lines */ // TODO: We might want to split this file up\n\n/**\n * The main replay container class, which holds all the state and methods for recording and sending replays.\n */\nclass ReplayContainer {\n\n /**\n * Recording can happen in one of three modes:\n * - session: Record the whole session, sending it continuously\n * - buffer: Always keep the last 60s of recording, requires:\n * - having replaysOnErrorSampleRate > 0 to capture replay when an error occurs\n * - or calling `flush()` to send the replay\n */\n\n /**\n * The current or last active span.\n * This is only available when performance is enabled.\n */\n\n /**\n * These are here so we can overwrite them in tests etc.\n * @hidden\n */\n\n /** The replay has to be manually started, because no sample rate (neither session or error) was provided. */\n\n /**\n * Options to pass to `rrweb.record()`\n */\n\n /**\n * Timestamp of the last user activity. This lives across sessions.\n */\n\n /**\n * Is the integration currently active?\n */\n\n /**\n * Paused is a state where:\n * - DOM Recording is not listening at all\n * - Nothing will be added to event buffer (e.g. core SDK events)\n */\n\n /**\n * Have we attached listeners to the core SDK?\n * Note we have to track this as there is no way to remove instrumentation handlers.\n */\n\n /**\n * Function to stop recording\n */\n\n /**\n * Internal use for canvas recording options\n */\n\n constructor({\n options,\n recordingOptions,\n }\n\n) {ReplayContainer.prototype.__init.call(this);ReplayContainer.prototype.__init2.call(this);ReplayContainer.prototype.__init3.call(this);ReplayContainer.prototype.__init4.call(this);ReplayContainer.prototype.__init5.call(this);ReplayContainer.prototype.__init6.call(this);\n this.eventBuffer = null;\n this.performanceEntries = [];\n this.replayPerformanceEntries = [];\n this.recordingMode = 'session';\n this.timeouts = {\n sessionIdlePause: SESSION_IDLE_PAUSE_DURATION,\n sessionIdleExpire: SESSION_IDLE_EXPIRE_DURATION,\n } ;\n this._lastActivity = Date.now();\n this._isEnabled = false;\n this._isPaused = false;\n this._requiresManualStart = false;\n this._hasInitializedCoreListeners = false;\n this._context = {\n errorIds: new Set(),\n traceIds: new Set(),\n urls: [],\n initialTimestamp: Date.now(),\n initialUrl: '',\n };\n\n this._recordingOptions = recordingOptions;\n this._options = options;\n\n this._debouncedFlush = debounce(() => this._flush(), this._options.flushMinDelay, {\n maxWait: this._options.flushMaxDelay,\n });\n\n this._throttledAddEvent = throttle(\n (event, isCheckout) => addEvent(this, event, isCheckout),\n // Max 300 events...\n 300,\n // ... per 5s\n 5,\n );\n\n const { slowClickTimeout, slowClickIgnoreSelectors } = this.getOptions();\n\n const slowClickConfig = slowClickTimeout\n ? {\n threshold: Math.min(SLOW_CLICK_THRESHOLD, slowClickTimeout),\n timeout: slowClickTimeout,\n scrollTimeout: SLOW_CLICK_SCROLL_TIMEOUT,\n ignoreSelector: slowClickIgnoreSelectors ? slowClickIgnoreSelectors.join(',') : '',\n }\n : undefined;\n\n if (slowClickConfig) {\n this.clickDetector = new ClickDetector(this, slowClickConfig);\n }\n\n // Configure replay logger w/ experimental options\n if (DEBUG_BUILD) {\n const experiments = options._experiments;\n logger.setConfig({\n captureExceptions: !!experiments.captureExceptions,\n traceInternals: !!experiments.traceInternals,\n });\n }\n }\n\n /** Get the event context. */\n getContext() {\n return this._context;\n }\n\n /** If recording is currently enabled. */\n isEnabled() {\n return this._isEnabled;\n }\n\n /** If recording is currently paused. */\n isPaused() {\n return this._isPaused;\n }\n\n /**\n * Determine if canvas recording is enabled\n */\n isRecordingCanvas() {\n return Boolean(this._canvas);\n }\n\n /** Get the replay integration options. */\n getOptions() {\n return this._options;\n }\n\n /** A wrapper to conditionally capture exceptions. */\n handleException(error) {\n DEBUG_BUILD && logger.exception(error);\n if (this._options.onError) {\n this._options.onError(error);\n }\n }\n\n /**\n * Initializes the plugin based on sampling configuration. Should not be\n * called outside of constructor.\n */\n initializeSampling(previousSessionId) {\n const { errorSampleRate, sessionSampleRate } = this._options;\n\n // If neither sample rate is > 0, then do nothing - user will need to call one of\n // `start()` or `startBuffering` themselves.\n const requiresManualStart = errorSampleRate <= 0 && sessionSampleRate <= 0;\n\n this._requiresManualStart = requiresManualStart;\n\n if (requiresManualStart) {\n return;\n }\n\n // Otherwise if there is _any_ sample rate set, try to load an existing\n // session, or create a new one.\n this._initializeSessionForSampling(previousSessionId);\n\n if (!this.session) {\n // This should not happen, something wrong has occurred\n DEBUG_BUILD && logger.exception(new Error('Unable to initialize and create session'));\n return;\n }\n\n if (this.session.sampled === false) {\n // This should only occur if `errorSampleRate` is 0 and was unsampled for\n // session-based replay. In this case there is nothing to do.\n return;\n }\n\n // If segmentId > 0, it means we've previously already captured this session\n // In this case, we still want to continue in `session` recording mode\n this.recordingMode = this.session.sampled === 'buffer' && this.session.segmentId === 0 ? 'buffer' : 'session';\n\n DEBUG_BUILD && logger.infoTick(`Starting replay in ${this.recordingMode} mode`);\n\n this._initializeRecording();\n }\n\n /**\n * Start a replay regardless of sampling rate. Calling this will always\n * create a new session. Will log a message if replay is already in progress.\n *\n * Creates or loads a session, attaches listeners to varying events (DOM,\n * _performanceObserver, Recording, Sentry SDK, etc)\n */\n start() {\n if (this._isEnabled && this.recordingMode === 'session') {\n DEBUG_BUILD && logger.info('Recording is already in progress');\n return;\n }\n\n if (this._isEnabled && this.recordingMode === 'buffer') {\n DEBUG_BUILD && logger.info('Buffering is in progress, call `flush()` to save the replay');\n return;\n }\n\n DEBUG_BUILD && logger.infoTick('Starting replay in session mode');\n\n // Required as user activity is initially set in\n // constructor, so if `start()` is called after\n // session idle expiration, a replay will not be\n // created due to an idle timeout.\n this._updateUserActivity();\n\n const session = loadOrCreateSession(\n {\n maxReplayDuration: this._options.maxReplayDuration,\n sessionIdleExpire: this.timeouts.sessionIdleExpire,\n },\n {\n stickySession: this._options.stickySession,\n // This is intentional: create a new session-based replay when calling `start()`\n sessionSampleRate: 1,\n allowBuffering: false,\n },\n );\n\n this.session = session;\n\n this._initializeRecording();\n }\n\n /**\n * Start replay buffering. Buffers until `flush()` is called or, if\n * `replaysOnErrorSampleRate` > 0, an error occurs.\n */\n startBuffering() {\n if (this._isEnabled) {\n DEBUG_BUILD && logger.info('Buffering is in progress, call `flush()` to save the replay');\n return;\n }\n\n DEBUG_BUILD && logger.infoTick('Starting replay in buffer mode');\n\n const session = loadOrCreateSession(\n {\n sessionIdleExpire: this.timeouts.sessionIdleExpire,\n maxReplayDuration: this._options.maxReplayDuration,\n },\n {\n stickySession: this._options.stickySession,\n sessionSampleRate: 0,\n allowBuffering: true,\n },\n );\n\n this.session = session;\n\n this.recordingMode = 'buffer';\n this._initializeRecording();\n }\n\n /**\n * Start recording.\n *\n * Note that this will cause a new DOM checkout\n */\n startRecording() {\n try {\n const canvasOptions = this._canvas;\n\n this._stopRecording = record({\n ...this._recordingOptions,\n // When running in error sampling mode, we need to overwrite `checkoutEveryNms`\n // Without this, it would record forever, until an error happens, which we don't want\n // instead, we'll always keep the last 60 seconds of replay before an error happened\n ...(this.recordingMode === 'buffer'\n ? { checkoutEveryNms: BUFFER_CHECKOUT_TIME }\n : // Otherwise, use experimental option w/ min checkout time of 6 minutes\n // This is to improve playback seeking as there could potentially be\n // less mutations to process in the worse cases.\n //\n // checkout by \"N\" events is probably ideal, but means we have less\n // control about the number of checkouts we make (which generally\n // increases replay size)\n this._options._experiments.continuousCheckout && {\n // Minimum checkout time is 6 minutes\n checkoutEveryNms: Math.max(360000, this._options._experiments.continuousCheckout),\n }),\n emit: getHandleRecordingEmit(this),\n onMutation: this._onMutationHandler,\n ...(canvasOptions\n ? {\n recordCanvas: canvasOptions.recordCanvas,\n getCanvasManager: canvasOptions.getCanvasManager,\n sampling: canvasOptions.sampling,\n dataURLOptions: canvasOptions.dataURLOptions,\n }\n : {}),\n });\n } catch (err) {\n this.handleException(err);\n }\n }\n\n /**\n * Stops the recording, if it was running.\n *\n * Returns true if it was previously stopped, or is now stopped,\n * otherwise false.\n */\n stopRecording() {\n try {\n if (this._stopRecording) {\n this._stopRecording();\n this._stopRecording = undefined;\n }\n\n return true;\n } catch (err) {\n this.handleException(err);\n return false;\n }\n }\n\n /**\n * Currently, this needs to be manually called (e.g. for tests). Sentry SDK\n * does not support a teardown\n */\n async stop({ forceFlush = false, reason } = {}) {\n if (!this._isEnabled) {\n return;\n }\n\n // We can't move `_isEnabled` after awaiting a flush, otherwise we can\n // enter into an infinite loop when `stop()` is called while flushing.\n this._isEnabled = false;\n\n try {\n DEBUG_BUILD && logger.info(`Stopping Replay${reason ? ` triggered by ${reason}` : ''}`);\n\n resetReplayIdOnDynamicSamplingContext();\n\n this._removeListeners();\n this.stopRecording();\n\n this._debouncedFlush.cancel();\n // See comment above re: `_isEnabled`, we \"force\" a flush, ignoring the\n // `_isEnabled` state of the plugin since it was disabled above.\n if (forceFlush) {\n await this._flush({ force: true });\n }\n\n // After flush, destroy event buffer\n this.eventBuffer && this.eventBuffer.destroy();\n this.eventBuffer = null;\n\n // Clear session from session storage, note this means if a new session\n // is started after, it will not have `previousSessionId`\n clearSession(this);\n } catch (err) {\n this.handleException(err);\n }\n }\n\n /**\n * Pause some replay functionality. See comments for `_isPaused`.\n * This differs from stop as this only stops DOM recording, it is\n * not as thorough of a shutdown as `stop()`.\n */\n pause() {\n if (this._isPaused) {\n return;\n }\n\n this._isPaused = true;\n this.stopRecording();\n\n DEBUG_BUILD && logger.info('Pausing replay');\n }\n\n /**\n * Resumes recording, see notes for `pause().\n *\n * Note that calling `startRecording()` here will cause a\n * new DOM checkout.`\n */\n resume() {\n if (!this._isPaused || !this._checkSession()) {\n return;\n }\n\n this._isPaused = false;\n this.startRecording();\n\n DEBUG_BUILD && logger.info('Resuming replay');\n }\n\n /**\n * If not in \"session\" recording mode, flush event buffer which will create a new replay.\n * Unless `continueRecording` is false, the replay will continue to record and\n * behave as a \"session\"-based replay.\n *\n * Otherwise, queue up a flush.\n */\n async sendBufferedReplayOrFlush({ continueRecording = true } = {}) {\n if (this.recordingMode === 'session') {\n return this.flushImmediate();\n }\n\n const activityTime = Date.now();\n\n DEBUG_BUILD && logger.info('Converting buffer to session');\n\n // Allow flush to complete before resuming as a session recording, otherwise\n // the checkout from `startRecording` may be included in the payload.\n // Prefer to keep the error replay as a separate (and smaller) segment\n // than the session replay.\n await this.flushImmediate();\n\n const hasStoppedRecording = this.stopRecording();\n\n if (!continueRecording || !hasStoppedRecording) {\n return;\n }\n\n // To avoid race conditions where this is called multiple times, we check here again that we are still buffering\n if ((this.recordingMode ) === 'session') {\n return;\n }\n\n // Re-start recording in session-mode\n this.recordingMode = 'session';\n\n // Once this session ends, we do not want to refresh it\n if (this.session) {\n this._updateUserActivity(activityTime);\n this._updateSessionActivity(activityTime);\n this._maybeSaveSession();\n }\n\n this.startRecording();\n }\n\n /**\n * We want to batch uploads of replay events. Save events only if\n * `` milliseconds have elapsed since the last event\n * *OR* if `` milliseconds have elapsed.\n *\n * Accepts a callback to perform side-effects and returns true to stop batch\n * processing and hand back control to caller.\n */\n addUpdate(cb) {\n // We need to always run `cb` (e.g. in the case of `this.recordingMode == 'buffer'`)\n const cbResult = cb();\n\n // If this option is turned on then we will only want to call `flush`\n // explicitly\n if (this.recordingMode === 'buffer') {\n return;\n }\n\n // If callback is true, we do not want to continue with flushing -- the\n // caller will need to handle it.\n if (cbResult === true) {\n return;\n }\n\n // addUpdate is called quite frequently - use _debouncedFlush so that it\n // respects the flush delays and does not flush immediately\n this._debouncedFlush();\n }\n\n /**\n * Updates the user activity timestamp and resumes recording. This should be\n * called in an event handler for a user action that we consider as the user\n * being \"active\" (e.g. a mouse click).\n */\n triggerUserActivity() {\n this._updateUserActivity();\n\n // This case means that recording was once stopped due to inactivity.\n // Ensure that recording is resumed.\n if (!this._stopRecording) {\n // Create a new session, otherwise when the user action is flushed, it\n // will get rejected due to an expired session.\n if (!this._checkSession()) {\n return;\n }\n\n // Note: This will cause a new DOM checkout\n this.resume();\n return;\n }\n\n // Otherwise... recording was never suspended, continue as normalish\n this.checkAndHandleExpiredSession();\n\n this._updateSessionActivity();\n }\n\n /**\n * Updates the user activity timestamp *without* resuming\n * recording. Some user events (e.g. keydown) can be create\n * low-value replays that only contain the keypress as a\n * breadcrumb. Instead this would require other events to\n * create a new replay after a session has expired.\n */\n updateUserActivity() {\n this._updateUserActivity();\n this._updateSessionActivity();\n }\n\n /**\n * Only flush if `this.recordingMode === 'session'`\n */\n conditionalFlush() {\n if (this.recordingMode === 'buffer') {\n return Promise.resolve();\n }\n\n return this.flushImmediate();\n }\n\n /**\n * Flush using debounce flush\n */\n flush() {\n return this._debouncedFlush() ;\n }\n\n /**\n * Always flush via `_debouncedFlush` so that we do not have flushes triggered\n * from calling both `flush` and `_debouncedFlush`. Otherwise, there could be\n * cases of mulitple flushes happening closely together.\n */\n flushImmediate() {\n this._debouncedFlush();\n // `.flush` is provided by the debounced function, analogously to lodash.debounce\n return this._debouncedFlush.flush() ;\n }\n\n /**\n * Cancels queued up flushes.\n */\n cancelFlush() {\n this._debouncedFlush.cancel();\n }\n\n /** Get the current sesion (=replay) ID */\n getSessionId() {\n return this.session && this.session.id;\n }\n\n /**\n * Checks if recording should be stopped due to user inactivity. Otherwise\n * check if session is expired and create a new session if so. Triggers a new\n * full snapshot on new session.\n *\n * Returns true if session is not expired, false otherwise.\n * @hidden\n */\n checkAndHandleExpiredSession() {\n // Prevent starting a new session if the last user activity is older than\n // SESSION_IDLE_PAUSE_DURATION. Otherwise non-user activity can trigger a new\n // session+recording. This creates noisy replays that do not have much\n // content in them.\n if (\n this._lastActivity &&\n isExpired(this._lastActivity, this.timeouts.sessionIdlePause) &&\n this.session &&\n this.session.sampled === 'session'\n ) {\n // Pause recording only for session-based replays. Otherwise, resuming\n // will create a new replay and will conflict with users who only choose\n // to record error-based replays only. (e.g. the resumed replay will not\n // contain a reference to an error)\n this.pause();\n return;\n }\n\n // --- There is recent user activity --- //\n // This will create a new session if expired, based on expiry length\n if (!this._checkSession()) {\n // Check session handles the refreshing itself\n return false;\n }\n\n return true;\n }\n\n /**\n * Capture some initial state that can change throughout the lifespan of the\n * replay. This is required because otherwise they would be captured at the\n * first flush.\n */\n setInitialState() {\n const urlPath = `${WINDOW.location.pathname}${WINDOW.location.hash}${WINDOW.location.search}`;\n const url = `${WINDOW.location.origin}${urlPath}`;\n\n this.performanceEntries = [];\n this.replayPerformanceEntries = [];\n\n // Reset _context as well\n this._clearContext();\n\n this._context.initialUrl = url;\n this._context.initialTimestamp = Date.now();\n this._context.urls.push(url);\n }\n\n /**\n * Add a breadcrumb event, that may be throttled.\n * If it was throttled, we add a custom breadcrumb to indicate that.\n */\n throttledAddEvent(\n event,\n isCheckout,\n ) {\n const res = this._throttledAddEvent(event, isCheckout);\n\n // If this is THROTTLED, it means we have throttled the event for the first time\n // In this case, we want to add a breadcrumb indicating that something was skipped\n if (res === THROTTLED) {\n const breadcrumb = createBreadcrumb({\n category: 'replay.throttled',\n });\n\n this.addUpdate(() => {\n // Return `false` if the event _was_ added, as that means we schedule a flush\n return !addEventSync(this, {\n type: ReplayEventTypeCustom,\n timestamp: breadcrumb.timestamp || 0,\n data: {\n tag: 'breadcrumb',\n payload: breadcrumb,\n metric: true,\n },\n });\n });\n }\n\n return res;\n }\n\n /**\n * This will get the parametrized route name of the current page.\n * This is only available if performance is enabled, and if an instrumented router is used.\n */\n getCurrentRoute() {\n const lastActiveSpan = this.lastActiveSpan || getActiveSpan();\n const lastRootSpan = lastActiveSpan && getRootSpan(lastActiveSpan);\n\n const attributes = (lastRootSpan && spanToJSON(lastRootSpan).data) || {};\n const source = attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE];\n if (!lastRootSpan || !source || !['route', 'custom'].includes(source)) {\n return undefined;\n }\n\n return spanToJSON(lastRootSpan).description;\n }\n\n /**\n * Initialize and start all listeners to varying events (DOM,\n * Performance Observer, Recording, Sentry SDK, etc)\n */\n _initializeRecording() {\n this.setInitialState();\n\n // this method is generally called on page load or manually - in both cases\n // we should treat it as an activity\n this._updateSessionActivity();\n\n this.eventBuffer = createEventBuffer({\n useCompression: this._options.useCompression,\n workerUrl: this._options.workerUrl,\n });\n\n this._removeListeners();\n this._addListeners();\n\n // Need to set as enabled before we start recording, as `record()` can trigger a flush with a new checkout\n this._isEnabled = true;\n this._isPaused = false;\n\n this.startRecording();\n }\n\n /**\n * Loads (or refreshes) the current session.\n */\n _initializeSessionForSampling(previousSessionId) {\n // Whenever there is _any_ error sample rate, we always allow buffering\n // Because we decide on sampling when an error occurs, we need to buffer at all times if sampling for errors\n const allowBuffering = this._options.errorSampleRate > 0;\n\n const session = loadOrCreateSession(\n {\n sessionIdleExpire: this.timeouts.sessionIdleExpire,\n maxReplayDuration: this._options.maxReplayDuration,\n previousSessionId,\n },\n {\n stickySession: this._options.stickySession,\n sessionSampleRate: this._options.sessionSampleRate,\n allowBuffering,\n },\n );\n\n this.session = session;\n }\n\n /**\n * Checks and potentially refreshes the current session.\n * Returns false if session is not recorded.\n */\n _checkSession() {\n // If there is no session yet, we do not want to refresh anything\n // This should generally not happen, but to be safe....\n if (!this.session) {\n return false;\n }\n\n const currentSession = this.session;\n\n if (\n shouldRefreshSession(currentSession, {\n sessionIdleExpire: this.timeouts.sessionIdleExpire,\n maxReplayDuration: this._options.maxReplayDuration,\n })\n ) {\n // This should never reject\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._refreshSession(currentSession);\n return false;\n }\n\n return true;\n }\n\n /**\n * Refresh a session with a new one.\n * This stops the current session (without forcing a flush, as that would never work since we are expired),\n * and then does a new sampling based on the refreshed session.\n */\n async _refreshSession(session) {\n if (!this._isEnabled) {\n return;\n }\n await this.stop({ reason: 'refresh session' });\n this.initializeSampling(session.id);\n }\n\n /**\n * Adds listeners to record events for the replay\n */\n _addListeners() {\n try {\n WINDOW.document.addEventListener('visibilitychange', this._handleVisibilityChange);\n WINDOW.addEventListener('blur', this._handleWindowBlur);\n WINDOW.addEventListener('focus', this._handleWindowFocus);\n WINDOW.addEventListener('keydown', this._handleKeyboardEvent);\n\n if (this.clickDetector) {\n this.clickDetector.addListeners();\n }\n\n // There is no way to remove these listeners, so ensure they are only added once\n if (!this._hasInitializedCoreListeners) {\n addGlobalListeners(this);\n\n this._hasInitializedCoreListeners = true;\n }\n } catch (err) {\n this.handleException(err);\n }\n\n this._performanceCleanupCallback = setupPerformanceObserver(this);\n }\n\n /**\n * Cleans up listeners that were created in `_addListeners`\n */\n _removeListeners() {\n try {\n WINDOW.document.removeEventListener('visibilitychange', this._handleVisibilityChange);\n\n WINDOW.removeEventListener('blur', this._handleWindowBlur);\n WINDOW.removeEventListener('focus', this._handleWindowFocus);\n WINDOW.removeEventListener('keydown', this._handleKeyboardEvent);\n\n if (this.clickDetector) {\n this.clickDetector.removeListeners();\n }\n\n if (this._performanceCleanupCallback) {\n this._performanceCleanupCallback();\n }\n } catch (err) {\n this.handleException(err);\n }\n }\n\n /**\n * Handle when visibility of the page content changes. Opening a new tab will\n * cause the state to change to hidden because of content of current page will\n * be hidden. Likewise, moving a different window to cover the contents of the\n * page will also trigger a change to a hidden state.\n */\n __init() {this._handleVisibilityChange = () => {\n if (WINDOW.document.visibilityState === 'visible') {\n this._doChangeToForegroundTasks();\n } else {\n this._doChangeToBackgroundTasks();\n }\n };}\n\n /**\n * Handle when page is blurred\n */\n __init2() {this._handleWindowBlur = () => {\n const breadcrumb = createBreadcrumb({\n category: 'ui.blur',\n });\n\n // Do not count blur as a user action -- it's part of the process of them\n // leaving the page\n this._doChangeToBackgroundTasks(breadcrumb);\n };}\n\n /**\n * Handle when page is focused\n */\n __init3() {this._handleWindowFocus = () => {\n const breadcrumb = createBreadcrumb({\n category: 'ui.focus',\n });\n\n // Do not count focus as a user action -- instead wait until they focus and\n // interactive with page\n this._doChangeToForegroundTasks(breadcrumb);\n };}\n\n /** Ensure page remains active when a key is pressed. */\n __init4() {this._handleKeyboardEvent = (event) => {\n handleKeyboardEvent(this, event);\n };}\n\n /**\n * Tasks to run when we consider a page to be hidden (via blurring and/or visibility)\n */\n _doChangeToBackgroundTasks(breadcrumb) {\n if (!this.session) {\n return;\n }\n\n const expired = isSessionExpired(this.session, {\n maxReplayDuration: this._options.maxReplayDuration,\n sessionIdleExpire: this.timeouts.sessionIdleExpire,\n });\n\n if (expired) {\n return;\n }\n\n if (breadcrumb) {\n this._createCustomBreadcrumb(breadcrumb);\n }\n\n // Send replay when the page/tab becomes hidden. There is no reason to send\n // replay if it becomes visible, since no actions we care about were done\n // while it was hidden\n // This should never reject\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n void this.conditionalFlush();\n }\n\n /**\n * Tasks to run when we consider a page to be visible (via focus and/or visibility)\n */\n _doChangeToForegroundTasks(breadcrumb) {\n if (!this.session) {\n return;\n }\n\n const isSessionActive = this.checkAndHandleExpiredSession();\n\n if (!isSessionActive) {\n // If the user has come back to the page within SESSION_IDLE_PAUSE_DURATION\n // ms, we will re-use the existing session, otherwise create a new\n // session\n DEBUG_BUILD && logger.info('Document has become active, but session has expired');\n return;\n }\n\n if (breadcrumb) {\n this._createCustomBreadcrumb(breadcrumb);\n }\n }\n\n /**\n * Update user activity (across session lifespans)\n */\n _updateUserActivity(_lastActivity = Date.now()) {\n this._lastActivity = _lastActivity;\n }\n\n /**\n * Updates the session's last activity timestamp\n */\n _updateSessionActivity(_lastActivity = Date.now()) {\n if (this.session) {\n this.session.lastActivity = _lastActivity;\n this._maybeSaveSession();\n }\n }\n\n /**\n * Helper to create (and buffer) a replay breadcrumb from a core SDK breadcrumb\n */\n _createCustomBreadcrumb(breadcrumb) {\n this.addUpdate(() => {\n // This should never reject\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.throttledAddEvent({\n type: EventType.Custom,\n timestamp: breadcrumb.timestamp || 0,\n data: {\n tag: 'breadcrumb',\n payload: breadcrumb,\n },\n });\n });\n }\n\n /**\n * Observed performance events are added to `this.performanceEntries`. These\n * are included in the replay event before it is finished and sent to Sentry.\n */\n _addPerformanceEntries() {\n const performanceEntries = createPerformanceEntries(this.performanceEntries).concat(this.replayPerformanceEntries);\n\n this.performanceEntries = [];\n this.replayPerformanceEntries = [];\n\n return Promise.all(createPerformanceSpans(this, performanceEntries));\n }\n\n /**\n * Clear _context\n */\n _clearContext() {\n // XXX: `initialTimestamp` and `initialUrl` do not get cleared\n this._context.errorIds.clear();\n this._context.traceIds.clear();\n this._context.urls = [];\n }\n\n /** Update the initial timestamp based on the buffer content. */\n _updateInitialTimestampFromEventBuffer() {\n const { session, eventBuffer } = this;\n // If replay was started manually (=no sample rate was given),\n // We do not want to back-port the initial timestamp\n if (!session || !eventBuffer || this._requiresManualStart) {\n return;\n }\n\n // we only ever update this on the initial segment\n if (session.segmentId) {\n return;\n }\n\n const earliestEvent = eventBuffer.getEarliestTimestamp();\n if (earliestEvent && earliestEvent < this._context.initialTimestamp) {\n this._context.initialTimestamp = earliestEvent;\n }\n }\n\n /**\n * Return and clear _context\n */\n _popEventContext() {\n const _context = {\n initialTimestamp: this._context.initialTimestamp,\n initialUrl: this._context.initialUrl,\n errorIds: Array.from(this._context.errorIds),\n traceIds: Array.from(this._context.traceIds),\n urls: this._context.urls,\n };\n\n this._clearContext();\n\n return _context;\n }\n\n /**\n * Flushes replay event buffer to Sentry.\n *\n * Performance events are only added right before flushing - this is\n * due to the buffered performance observer events.\n *\n * Should never be called directly, only by `flush`\n */\n async _runFlush() {\n const replayId = this.getSessionId();\n\n if (!this.session || !this.eventBuffer || !replayId) {\n DEBUG_BUILD && logger.error('No session or eventBuffer found to flush.');\n return;\n }\n\n await this._addPerformanceEntries();\n\n // Check eventBuffer again, as it could have been stopped in the meanwhile\n if (!this.eventBuffer || !this.eventBuffer.hasEvents) {\n return;\n }\n\n // Only attach memory event if eventBuffer is not empty\n await addMemoryEntry(this);\n\n // Check eventBuffer again, as it could have been stopped in the meanwhile\n if (!this.eventBuffer) {\n return;\n }\n\n // if this changed in the meanwhile, e.g. because the session was refreshed or similar, we abort here\n if (replayId !== this.getSessionId()) {\n return;\n }\n\n try {\n // This uses the data from the eventBuffer, so we need to call this before `finish()\n this._updateInitialTimestampFromEventBuffer();\n\n const timestamp = Date.now();\n\n // Check total duration again, to avoid sending outdated stuff\n // We leave 30s wiggle room to accomodate late flushing etc.\n // This _could_ happen when the browser is suspended during flushing, in which case we just want to stop\n if (timestamp - this._context.initialTimestamp > this._options.maxReplayDuration + 30000) {\n throw new Error('Session is too long, not sending replay');\n }\n\n const eventContext = this._popEventContext();\n // Always increment segmentId regardless of outcome of sending replay\n const segmentId = this.session.segmentId++;\n this._maybeSaveSession();\n\n // Note this empties the event buffer regardless of outcome of sending replay\n const recordingData = await this.eventBuffer.finish();\n\n await sendReplay({\n replayId,\n recordingData,\n segmentId,\n eventContext,\n session: this.session,\n timestamp,\n onError: err => this.handleException(err),\n });\n } catch (err) {\n this.handleException(err);\n\n // This means we retried 3 times and all of them failed,\n // or we ran into a problem we don't want to retry, like rate limiting.\n // In this case, we want to completely stop the replay - otherwise, we may get inconsistent segments\n // This should never reject\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.stop({ reason: 'sendReplay' });\n\n const client = getClient();\n\n if (client) {\n const dropReason = err instanceof RateLimitError ? 'ratelimit_backoff' : 'send_error';\n client.recordDroppedEvent(dropReason, 'replay');\n }\n }\n }\n\n /**\n * Flush recording data to Sentry. Creates a lock so that only a single flush\n * can be active at a time. Do not call this directly.\n */\n __init5() {this._flush = async ({\n force = false,\n }\n\n = {}) => {\n if (!this._isEnabled && !force) {\n // This can happen if e.g. the replay was stopped because of exceeding the retry limit\n return;\n }\n\n if (!this.checkAndHandleExpiredSession()) {\n DEBUG_BUILD && logger.error('Attempting to finish replay event after session expired.');\n return;\n }\n\n if (!this.session) {\n // should never happen, as we would have bailed out before\n return;\n }\n\n const start = this.session.started;\n const now = Date.now();\n const duration = now - start;\n\n // A flush is about to happen, cancel any queued flushes\n this._debouncedFlush.cancel();\n\n // If session is too short, or too long (allow some wiggle room over maxReplayDuration), do not send it\n // This _should_ not happen, but it may happen if flush is triggered due to a page activity change or similar\n const tooShort = duration < this._options.minReplayDuration;\n const tooLong = duration > this._options.maxReplayDuration + 5000;\n if (tooShort || tooLong) {\n DEBUG_BUILD &&\n logger.info(\n `Session duration (${Math.floor(duration / 1000)}s) is too ${\n tooShort ? 'short' : 'long'\n }, not sending replay.`,\n );\n\n if (tooShort) {\n this._debouncedFlush();\n }\n return;\n }\n\n const eventBuffer = this.eventBuffer;\n if (eventBuffer && this.session.segmentId === 0 && !eventBuffer.hasCheckout) {\n DEBUG_BUILD && logger.info('Flushing initial segment without checkout.');\n // TODO FN: Evaluate if we want to stop here, or remove this again?\n }\n\n const _flushInProgress = !!this._flushLock;\n\n // this._flushLock acts as a lock so that future calls to `_flush()` will\n // be blocked until current flush is finished (i.e. this promise resolves)\n if (!this._flushLock) {\n this._flushLock = this._runFlush();\n }\n\n try {\n await this._flushLock;\n } catch (err) {\n this.handleException(err);\n } finally {\n this._flushLock = undefined;\n\n if (_flushInProgress) {\n // Wait for previous flush to finish, then call the debounced\n // `_flush()`. It's possible there are other flush requests queued and\n // waiting for it to resolve. We want to reduce all outstanding\n // requests (as well as any new flush requests that occur within a\n // second of the locked flush completing) into a single flush.\n this._debouncedFlush();\n }\n }\n };}\n\n /** Save the session, if it is sticky */\n _maybeSaveSession() {\n if (this.session && this._options.stickySession) {\n saveSession(this.session);\n }\n }\n\n /** Handler for rrweb.record.onMutation */\n __init6() {this._onMutationHandler = (mutations) => {\n const count = mutations.length;\n\n const mutationLimit = this._options.mutationLimit;\n const mutationBreadcrumbLimit = this._options.mutationBreadcrumbLimit;\n const overMutationLimit = mutationLimit && count > mutationLimit;\n\n // Create a breadcrumb if a lot of mutations happen at the same time\n // We can show this in the UI as an information with potential performance improvements\n if (count > mutationBreadcrumbLimit || overMutationLimit) {\n const breadcrumb = createBreadcrumb({\n category: 'replay.mutations',\n data: {\n count,\n limit: overMutationLimit,\n },\n });\n this._createCustomBreadcrumb(breadcrumb);\n }\n\n // Stop replay if over the mutation limit\n if (overMutationLimit) {\n // This should never reject\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.stop({ reason: 'mutationLimit', forceFlush: this.recordingMode === 'session' });\n return false;\n }\n\n // `true` means we use the regular mutation handling by rrweb\n return true;\n };}\n}\n\nfunction getOption(selectors, defaultSelectors) {\n return [\n ...selectors,\n // sentry defaults\n ...defaultSelectors,\n ].join(',');\n}\n\n/**\n * Returns privacy related configuration for use in rrweb\n */\nfunction getPrivacyOptions({ mask, unmask, block, unblock, ignore }) {\n const defaultBlockedElements = ['base[href=\"/\"]'];\n\n const maskSelector = getOption(mask, ['.sentry-mask', '[data-sentry-mask]']);\n const unmaskSelector = getOption(unmask, []);\n\n const options = {\n // We are making the decision to make text and input selectors the same\n maskTextSelector: maskSelector,\n unmaskTextSelector: unmaskSelector,\n\n blockSelector: getOption(block, ['.sentry-block', '[data-sentry-block]', ...defaultBlockedElements]),\n unblockSelector: getOption(unblock, []),\n ignoreSelector: getOption(ignore, ['.sentry-ignore', '[data-sentry-ignore]', 'input[type=\"file\"]']),\n };\n\n return options;\n}\n\n/**\n * Masks an attribute if necessary, otherwise return attribute value as-is.\n */\nfunction maskAttribute({\n el,\n key,\n maskAttributes,\n maskAllText,\n privacyOptions,\n value,\n}) {\n // We only mask attributes if `maskAllText` is true\n if (!maskAllText) {\n return value;\n }\n\n // unmaskTextSelector takes precendence\n if (privacyOptions.unmaskTextSelector && el.matches(privacyOptions.unmaskTextSelector)) {\n return value;\n }\n\n if (\n maskAttributes.includes(key) ||\n // Need to mask `value` attribute for `` if it's a button-like\n // type\n (key === 'value' && el.tagName === 'INPUT' && ['submit', 'button'].includes(el.getAttribute('type') || ''))\n ) {\n return value.replace(/[\\S]/g, '*');\n }\n\n return value;\n}\n\nconst MEDIA_SELECTORS =\n 'img,image,svg,video,object,picture,embed,map,audio,link[rel=\"icon\"],link[rel=\"apple-touch-icon\"]';\n\nconst DEFAULT_NETWORK_HEADERS = ['content-length', 'content-type', 'accept'];\n\nlet _initialized = false;\n\n/**\n * Sentry integration for [Session Replay](https://sentry.io/for/session-replay/).\n *\n * See the [Replay documentation](https://docs.sentry.io/platforms/javascript/guides/session-replay/) for more information.\n *\n * @example\n *\n * ```\n * Sentry.init({\n * dsn: '__DSN__',\n * integrations: [Sentry.replayIntegration()],\n * });\n * ```\n */\nconst replayIntegration = ((options) => {\n return new Replay(options);\n}) ;\n\n/**\n * Replay integration\n *\n * TODO: Rewrite this to be functional integration\n * Exported for tests.\n */\nclass Replay {\n /**\n * @inheritDoc\n */\n static __initStatic() {this.id = 'Replay';}\n\n /**\n * @inheritDoc\n */\n\n /**\n * Options to pass to `rrweb.record()`\n */\n\n /**\n * Initial options passed to the replay integration, merged with default values.\n * Note: `sessionSampleRate` and `errorSampleRate` are not required here, as they\n * can only be finally set when setupOnce() is called.\n *\n * @private\n */\n\n constructor({\n flushMinDelay = DEFAULT_FLUSH_MIN_DELAY,\n flushMaxDelay = DEFAULT_FLUSH_MAX_DELAY,\n minReplayDuration = MIN_REPLAY_DURATION,\n maxReplayDuration = MAX_REPLAY_DURATION,\n stickySession = true,\n useCompression = true,\n workerUrl,\n _experiments = {},\n maskAllText = true,\n maskAllInputs = true,\n blockAllMedia = true,\n\n mutationBreadcrumbLimit = 750,\n mutationLimit = 10000,\n\n slowClickTimeout = 7000,\n slowClickIgnoreSelectors = [],\n\n networkDetailAllowUrls = [],\n networkDetailDenyUrls = [],\n networkCaptureBodies = true,\n networkRequestHeaders = [],\n networkResponseHeaders = [],\n\n mask = [],\n maskAttributes = ['title', 'placeholder'],\n unmask = [],\n block = [],\n unblock = [],\n ignore = [],\n maskFn,\n\n beforeAddRecordingEvent,\n beforeErrorSampling,\n } = {}) {\n this.name = Replay.id;\n\n const privacyOptions = getPrivacyOptions({\n mask,\n unmask,\n block,\n unblock,\n ignore,\n });\n\n this._recordingOptions = {\n maskAllInputs,\n maskAllText,\n maskInputOptions: { password: true },\n maskTextFn: maskFn,\n maskInputFn: maskFn,\n maskAttributeFn: (key, value, el) =>\n maskAttribute({\n maskAttributes,\n maskAllText,\n privacyOptions,\n key,\n value,\n el,\n }),\n\n ...privacyOptions,\n\n // Our defaults\n slimDOMOptions: 'all',\n inlineStylesheet: true,\n // Disable inline images as it will increase segment/replay size\n inlineImages: false,\n // collect fonts, but be aware that `sentry.io` needs to be an allowed\n // origin for playback\n collectFonts: true,\n errorHandler: (err) => {\n try {\n err.__rrweb__ = true;\n } catch (error) {\n // ignore errors here\n // this can happen if the error is frozen or does not allow mutation for other reasons\n }\n },\n };\n\n this._initialOptions = {\n flushMinDelay,\n flushMaxDelay,\n minReplayDuration: Math.min(minReplayDuration, MIN_REPLAY_DURATION_LIMIT),\n maxReplayDuration: Math.min(maxReplayDuration, MAX_REPLAY_DURATION),\n stickySession,\n useCompression,\n workerUrl,\n blockAllMedia,\n maskAllInputs,\n maskAllText,\n mutationBreadcrumbLimit,\n mutationLimit,\n slowClickTimeout,\n slowClickIgnoreSelectors,\n networkDetailAllowUrls,\n networkDetailDenyUrls,\n networkCaptureBodies,\n networkRequestHeaders: _getMergedNetworkHeaders(networkRequestHeaders),\n networkResponseHeaders: _getMergedNetworkHeaders(networkResponseHeaders),\n beforeAddRecordingEvent,\n beforeErrorSampling,\n\n _experiments,\n };\n\n if (this._initialOptions.blockAllMedia) {\n // `blockAllMedia` is a more user friendly option to configure blocking\n // embedded media elements\n this._recordingOptions.blockSelector = !this._recordingOptions.blockSelector\n ? MEDIA_SELECTORS\n : `${this._recordingOptions.blockSelector},${MEDIA_SELECTORS}`;\n }\n\n if (this._isInitialized && isBrowser()) {\n throw new Error('Multiple Sentry Session Replay instances are not supported');\n }\n\n this._isInitialized = true;\n }\n\n /** If replay has already been initialized */\n get _isInitialized() {\n return _initialized;\n }\n\n /** Update _isInitialized */\n set _isInitialized(value) {\n _initialized = value;\n }\n\n /**\n * Setup and initialize replay container\n */\n afterAllSetup(client) {\n if (!isBrowser() || this._replay) {\n return;\n }\n\n this._setup(client);\n this._initialize(client);\n }\n\n /**\n * Start a replay regardless of sampling rate. Calling this will always\n * create a new session. Will log a message if replay is already in progress.\n *\n * Creates or loads a session, attaches listeners to varying events (DOM,\n * PerformanceObserver, Recording, Sentry SDK, etc)\n */\n start() {\n if (!this._replay) {\n return;\n }\n this._replay.start();\n }\n\n /**\n * Start replay buffering. Buffers until `flush()` is called or, if\n * `replaysOnErrorSampleRate` > 0, until an error occurs.\n */\n startBuffering() {\n if (!this._replay) {\n return;\n }\n\n this._replay.startBuffering();\n }\n\n /**\n * Currently, this needs to be manually called (e.g. for tests). Sentry SDK\n * does not support a teardown\n */\n stop() {\n if (!this._replay) {\n return Promise.resolve();\n }\n\n return this._replay.stop({ forceFlush: this._replay.recordingMode === 'session' });\n }\n\n /**\n * If not in \"session\" recording mode, flush event buffer which will create a new replay.\n * If replay is not enabled, a new session replay is started.\n * Unless `continueRecording` is false, the replay will continue to record and\n * behave as a \"session\"-based replay.\n *\n * Otherwise, queue up a flush.\n */\n flush(options) {\n if (!this._replay) {\n return Promise.resolve();\n }\n\n // assuming a session should be recorded in this case\n if (!this._replay.isEnabled()) {\n this._replay.start();\n return Promise.resolve();\n }\n\n return this._replay.sendBufferedReplayOrFlush(options);\n }\n\n /**\n * Get the current session ID.\n */\n getReplayId() {\n if (!this._replay || !this._replay.isEnabled()) {\n return;\n }\n\n return this._replay.getSessionId();\n }\n\n /**\n * Initializes replay.\n */\n _initialize(client) {\n if (!this._replay) {\n return;\n }\n\n this._maybeLoadFromReplayCanvasIntegration(client);\n this._replay.initializeSampling();\n }\n\n /** Setup the integration. */\n _setup(client) {\n // Client is not available in constructor, so we need to wait until setupOnce\n const finalOptions = loadReplayOptionsFromClient(this._initialOptions, client);\n\n this._replay = new ReplayContainer({\n options: finalOptions,\n recordingOptions: this._recordingOptions,\n });\n }\n\n /** Get canvas options from ReplayCanvas integration, if it is also added. */\n _maybeLoadFromReplayCanvasIntegration(client) {\n // To save bundle size, we skip checking for stuff here\n // and instead just try-catch everything - as generally this should all be defined\n /* eslint-disable @typescript-eslint/no-non-null-assertion */\n try {\n const canvasIntegration = client.getIntegrationByName('ReplayCanvas')\n\n;\n if (!canvasIntegration) {\n return;\n }\n\n this._replay['_canvas'] = canvasIntegration.getOptions();\n } catch (e) {\n // ignore errors here\n }\n /* eslint-enable @typescript-eslint/no-non-null-assertion */\n }\n}Replay.__initStatic();\n\n/** Parse Replay-related options from SDK options */\nfunction loadReplayOptionsFromClient(initialOptions, client) {\n const opt = client.getOptions() ;\n\n const finalOptions = {\n sessionSampleRate: 0,\n errorSampleRate: 0,\n ...dropUndefinedKeys(initialOptions),\n };\n\n const replaysSessionSampleRate = parseSampleRate(opt.replaysSessionSampleRate);\n const replaysOnErrorSampleRate = parseSampleRate(opt.replaysOnErrorSampleRate);\n\n if (replaysSessionSampleRate == null && replaysOnErrorSampleRate == null) {\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.warn(\n 'Replay is disabled because neither `replaysSessionSampleRate` nor `replaysOnErrorSampleRate` are set.',\n );\n });\n }\n\n if (replaysSessionSampleRate != null) {\n finalOptions.sessionSampleRate = replaysSessionSampleRate;\n }\n\n if (replaysOnErrorSampleRate != null) {\n finalOptions.errorSampleRate = replaysOnErrorSampleRate;\n }\n\n return finalOptions;\n}\n\nfunction _getMergedNetworkHeaders(headers) {\n return [...DEFAULT_NETWORK_HEADERS, ...headers.map(header => header.toLowerCase())];\n}\n\n/**\n * This is a small utility to get a type-safe instance of the Replay integration.\n */\nfunction getReplay() {\n const client = getClient();\n return client && client.getIntegrationByName('Replay');\n}\n\nexport { getReplay, replayIntegration };\n//# sourceMappingURL=index.js.map\n","import { addXhrInstrumentationHandler, addPerformanceInstrumentationHandler, SENTRY_XHR_DATA_KEY } from '@sentry-internal/browser-utils';\nimport { instrumentFetchRequest, spanToJSON, hasTracingEnabled, setHttpStatus, getActiveSpan, startInactiveSpan, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, SEMANTIC_ATTRIBUTE_SENTRY_OP, SentryNonRecordingSpan, getClient, getCurrentScope, getIsolationScope, spanToTraceHeader, getDynamicSamplingContextFromSpan, getDynamicSamplingContextFromClient } from '@sentry/core';\nimport { addFetchEndInstrumentationHandler, addFetchInstrumentationHandler, parseUrl, browserPerformanceTimeOrigin, generateSentryTraceHeader, dynamicSamplingContextToSentryBaggageHeader, BAGGAGE_HEADER_NAME, stringMatchesSomePattern } from '@sentry/utils';\nimport { WINDOW } from '../helpers.js';\n\n/** Options for Request Instrumentation */\n\nconst responseToSpanId = new WeakMap();\nconst spanIdToEndTimestamp = new Map();\n\nconst defaultRequestInstrumentationOptions = {\n traceFetch: true,\n traceXHR: true,\n enableHTTPTimings: true,\n};\n\n/** Registers span creators for xhr and fetch requests */\nfunction instrumentOutgoingRequests(client, _options) {\n const { traceFetch, traceXHR, shouldCreateSpanForRequest, enableHTTPTimings, tracePropagationTargets } = {\n traceFetch: defaultRequestInstrumentationOptions.traceFetch,\n traceXHR: defaultRequestInstrumentationOptions.traceXHR,\n ..._options,\n };\n\n const shouldCreateSpan =\n typeof shouldCreateSpanForRequest === 'function' ? shouldCreateSpanForRequest : (_) => true;\n\n const shouldAttachHeadersWithTargets = (url) => shouldAttachHeaders(url, tracePropagationTargets);\n\n const spans = {};\n\n if (traceFetch) {\n // Keeping track of http requests, whose body payloads resolved later than the intial resolved request\n // e.g. streaming using server sent events (SSE)\n client.addEventProcessor(event => {\n if (event.type === 'transaction' && event.spans) {\n event.spans.forEach(span => {\n if (span.op === 'http.client') {\n const updatedTimestamp = spanIdToEndTimestamp.get(span.span_id);\n if (updatedTimestamp) {\n span.timestamp = updatedTimestamp / 1000;\n spanIdToEndTimestamp.delete(span.span_id);\n }\n }\n });\n }\n return event;\n });\n\n addFetchEndInstrumentationHandler(handlerData => {\n if (handlerData.response) {\n const span = responseToSpanId.get(handlerData.response);\n if (span && handlerData.endTimestamp) {\n spanIdToEndTimestamp.set(span, handlerData.endTimestamp);\n }\n }\n });\n\n addFetchInstrumentationHandler(handlerData => {\n const createdSpan = instrumentFetchRequest(handlerData, shouldCreateSpan, shouldAttachHeadersWithTargets, spans);\n\n if (handlerData.response && handlerData.fetchData.__span) {\n responseToSpanId.set(handlerData.response, handlerData.fetchData.__span);\n }\n\n // We cannot use `window.location` in the generic fetch instrumentation,\n // but we need it for reliable `server.address` attribute.\n // so we extend this in here\n if (createdSpan) {\n const fullUrl = getFullURL(handlerData.fetchData.url);\n const host = fullUrl ? parseUrl(fullUrl).host : undefined;\n createdSpan.setAttributes({\n 'http.url': fullUrl,\n 'server.address': host,\n });\n }\n\n if (enableHTTPTimings && createdSpan) {\n addHTTPTimings(createdSpan);\n }\n });\n }\n\n if (traceXHR) {\n addXhrInstrumentationHandler(handlerData => {\n const createdSpan = xhrCallback(handlerData, shouldCreateSpan, shouldAttachHeadersWithTargets, spans);\n if (enableHTTPTimings && createdSpan) {\n addHTTPTimings(createdSpan);\n }\n });\n }\n}\n\nfunction isPerformanceResourceTiming(entry) {\n return (\n entry.entryType === 'resource' &&\n 'initiatorType' in entry &&\n typeof (entry ).nextHopProtocol === 'string' &&\n (entry.initiatorType === 'fetch' || entry.initiatorType === 'xmlhttprequest')\n );\n}\n\n/**\n * Creates a temporary observer to listen to the next fetch/xhr resourcing timings,\n * so that when timings hit their per-browser limit they don't need to be removed.\n *\n * @param span A span that has yet to be finished, must contain `url` on data.\n */\nfunction addHTTPTimings(span) {\n const { url } = spanToJSON(span).data || {};\n\n if (!url || typeof url !== 'string') {\n return;\n }\n\n const cleanup = addPerformanceInstrumentationHandler('resource', ({ entries }) => {\n entries.forEach(entry => {\n if (isPerformanceResourceTiming(entry) && entry.name.endsWith(url)) {\n const spanData = resourceTimingEntryToSpanData(entry);\n spanData.forEach(data => span.setAttribute(...data));\n // In the next tick, clean this handler up\n // We have to wait here because otherwise this cleans itself up before it is fully done\n setTimeout(cleanup);\n }\n });\n });\n}\n\n/**\n * Converts ALPN protocol ids to name and version.\n *\n * (https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml#alpn-protocol-ids)\n * @param nextHopProtocol PerformanceResourceTiming.nextHopProtocol\n */\nfunction extractNetworkProtocol(nextHopProtocol) {\n let name = 'unknown';\n let version = 'unknown';\n let _name = '';\n for (const char of nextHopProtocol) {\n // http/1.1 etc.\n if (char === '/') {\n [name, version] = nextHopProtocol.split('/') ;\n break;\n }\n // h2, h3 etc.\n if (!isNaN(Number(char))) {\n name = _name === 'h' ? 'http' : _name;\n version = nextHopProtocol.split(_name)[1] ;\n break;\n }\n _name += char;\n }\n if (_name === nextHopProtocol) {\n // webrtc, ftp, etc.\n name = _name;\n }\n return { name, version };\n}\n\nfunction getAbsoluteTime(time = 0) {\n return ((browserPerformanceTimeOrigin || performance.timeOrigin) + time) / 1000;\n}\n\nfunction resourceTimingEntryToSpanData(resourceTiming) {\n const { name, version } = extractNetworkProtocol(resourceTiming.nextHopProtocol);\n\n const timingSpanData = [];\n\n timingSpanData.push(['network.protocol.version', version], ['network.protocol.name', name]);\n\n if (!browserPerformanceTimeOrigin) {\n return timingSpanData;\n }\n return [\n ...timingSpanData,\n ['http.request.redirect_start', getAbsoluteTime(resourceTiming.redirectStart)],\n ['http.request.fetch_start', getAbsoluteTime(resourceTiming.fetchStart)],\n ['http.request.domain_lookup_start', getAbsoluteTime(resourceTiming.domainLookupStart)],\n ['http.request.domain_lookup_end', getAbsoluteTime(resourceTiming.domainLookupEnd)],\n ['http.request.connect_start', getAbsoluteTime(resourceTiming.connectStart)],\n ['http.request.secure_connection_start', getAbsoluteTime(resourceTiming.secureConnectionStart)],\n ['http.request.connection_end', getAbsoluteTime(resourceTiming.connectEnd)],\n ['http.request.request_start', getAbsoluteTime(resourceTiming.requestStart)],\n ['http.request.response_start', getAbsoluteTime(resourceTiming.responseStart)],\n ['http.request.response_end', getAbsoluteTime(resourceTiming.responseEnd)],\n ];\n}\n\n/**\n * A function that determines whether to attach tracing headers to a request.\n * We only export this function for testing purposes.\n */\nfunction shouldAttachHeaders(\n targetUrl,\n tracePropagationTargets,\n) {\n // window.location.href not being defined is an edge case in the browser but we need to handle it.\n // Potentially dangerous situations where it may not be defined: Browser Extensions, Web Workers, patching of the location obj\n const href = WINDOW.location && WINDOW.location.href;\n\n if (!href) {\n // If there is no window.location.origin, we default to only attaching tracing headers to relative requests, i.e. ones that start with `/`\n // BIG DISCLAIMER: Users can call URLs with a double slash (fetch(\"//example.com/api\")), this is a shorthand for \"send to the same protocol\",\n // so we need a to exclude those requests, because they might be cross origin.\n const isRelativeSameOriginRequest = !!targetUrl.match(/^\\/(?!\\/)/);\n if (!tracePropagationTargets) {\n return isRelativeSameOriginRequest;\n } else {\n return stringMatchesSomePattern(targetUrl, tracePropagationTargets);\n }\n } else {\n let resolvedUrl;\n let currentOrigin;\n\n // URL parsing may fail, we default to not attaching trace headers in that case.\n try {\n resolvedUrl = new URL(targetUrl, href);\n currentOrigin = new URL(href).origin;\n } catch (e) {\n return false;\n }\n\n const isSameOriginRequest = resolvedUrl.origin === currentOrigin;\n if (!tracePropagationTargets) {\n return isSameOriginRequest;\n } else {\n return (\n stringMatchesSomePattern(resolvedUrl.toString(), tracePropagationTargets) ||\n (isSameOriginRequest && stringMatchesSomePattern(resolvedUrl.pathname, tracePropagationTargets))\n );\n }\n }\n}\n\n/**\n * Create and track xhr request spans\n *\n * @returns Span if a span was created, otherwise void.\n */\nfunction xhrCallback(\n handlerData,\n shouldCreateSpan,\n shouldAttachHeaders,\n spans,\n) {\n const xhr = handlerData.xhr;\n const sentryXhrData = xhr && xhr[SENTRY_XHR_DATA_KEY];\n\n if (!xhr || xhr.__sentry_own_request__ || !sentryXhrData) {\n return undefined;\n }\n\n const shouldCreateSpanResult = hasTracingEnabled() && shouldCreateSpan(sentryXhrData.url);\n\n // check first if the request has finished and is tracked by an existing span which should now end\n if (handlerData.endTimestamp && shouldCreateSpanResult) {\n const spanId = xhr.__sentry_xhr_span_id__;\n if (!spanId) return;\n\n const span = spans[spanId];\n if (span && sentryXhrData.status_code !== undefined) {\n setHttpStatus(span, sentryXhrData.status_code);\n span.end();\n\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete spans[spanId];\n }\n return undefined;\n }\n\n const fullUrl = getFullURL(sentryXhrData.url);\n const host = fullUrl ? parseUrl(fullUrl).host : undefined;\n\n const hasParent = !!getActiveSpan();\n\n const span =\n shouldCreateSpanResult && hasParent\n ? startInactiveSpan({\n name: `${sentryXhrData.method} ${sentryXhrData.url}`,\n attributes: {\n type: 'xhr',\n 'http.method': sentryXhrData.method,\n 'http.url': fullUrl,\n url: sentryXhrData.url,\n 'server.address': host,\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.browser',\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'http.client',\n },\n })\n : new SentryNonRecordingSpan();\n\n xhr.__sentry_xhr_span_id__ = span.spanContext().spanId;\n spans[xhr.__sentry_xhr_span_id__] = span;\n\n const client = getClient();\n\n if (xhr.setRequestHeader && shouldAttachHeaders(sentryXhrData.url) && client) {\n addTracingHeadersToXhrRequest(\n xhr,\n client,\n // If performance is disabled (TWP) or there's no active root span (pageload/navigation/interaction),\n // we do not want to use the span as base for the trace headers,\n // which means that the headers will be generated from the scope and the sampling decision is deferred\n hasTracingEnabled() && hasParent ? span : undefined,\n );\n }\n\n return span;\n}\n\nfunction addTracingHeadersToXhrRequest(xhr, client, span) {\n const scope = getCurrentScope();\n const isolationScope = getIsolationScope();\n const { traceId, spanId, sampled, dsc } = {\n ...isolationScope.getPropagationContext(),\n ...scope.getPropagationContext(),\n };\n\n const sentryTraceHeader =\n span && hasTracingEnabled() ? spanToTraceHeader(span) : generateSentryTraceHeader(traceId, spanId, sampled);\n\n const sentryBaggageHeader = dynamicSamplingContextToSentryBaggageHeader(\n dsc || (span ? getDynamicSamplingContextFromSpan(span) : getDynamicSamplingContextFromClient(traceId, client)),\n );\n\n setHeaderOnXhr(xhr, sentryTraceHeader, sentryBaggageHeader);\n}\n\nfunction setHeaderOnXhr(\n xhr,\n sentryTraceHeader,\n sentryBaggageHeader,\n) {\n try {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n xhr.setRequestHeader('sentry-trace', sentryTraceHeader);\n if (sentryBaggageHeader) {\n // From MDN: \"If this method is called several times with the same header, the values are merged into one single request header.\"\n // We can therefore simply set a baggage header without checking what was there before\n // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/setRequestHeader\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n xhr.setRequestHeader(BAGGAGE_HEADER_NAME, sentryBaggageHeader);\n }\n } catch (_) {\n // Error: InvalidStateError: Failed to execute 'setRequestHeader' on 'XMLHttpRequest': The object's state must be OPENED.\n }\n}\n\nfunction getFullURL(url) {\n try {\n // By adding a base URL to new URL(), this will also work for relative urls\n // If `url` is a full URL, the base URL is ignored anyhow\n const parsed = new URL(url, WINDOW.location.origin);\n return parsed.href;\n } catch (e2) {\n return undefined;\n }\n}\n\nexport { defaultRequestInstrumentationOptions, extractNetworkProtocol, instrumentOutgoingRequests, shouldAttachHeaders, xhrCallback };\n//# sourceMappingURL=request.js.map\n","import { getActiveSpan, getRootSpan, spanToJSON, SPAN_STATUS_ERROR } from '@sentry/core';\nimport { logger } from '@sentry/utils';\nimport { DEBUG_BUILD } from '../debug-build.js';\nimport { WINDOW } from '../helpers.js';\n\n/**\n * Add a listener that cancels and finishes a transaction when the global\n * document is hidden.\n */\nfunction registerBackgroundTabDetection() {\n if (WINDOW && WINDOW.document) {\n WINDOW.document.addEventListener('visibilitychange', () => {\n const activeSpan = getActiveSpan();\n if (!activeSpan) {\n return;\n }\n\n const rootSpan = getRootSpan(activeSpan);\n\n if (WINDOW.document.hidden && rootSpan) {\n const cancelledStatus = 'cancelled';\n\n const { op, status } = spanToJSON(rootSpan);\n\n if (DEBUG_BUILD) {\n logger.log(`[Tracing] Transaction: ${cancelledStatus} -> since tab moved to the background, op: ${op}`);\n }\n\n // We should not set status if it is already set, this prevent important statuses like\n // error or data loss from being overwritten on transaction.\n if (!status) {\n rootSpan.setStatus({ code: SPAN_STATUS_ERROR, message: cancelledStatus });\n }\n\n rootSpan.setAttribute('sentry.cancellation_reason', 'document.hidden');\n rootSpan.end();\n }\n });\n } else {\n DEBUG_BUILD && logger.warn('[Tracing] Could not set up background tab detection due to lack of global document');\n }\n}\n\nexport { registerBackgroundTabDetection };\n//# sourceMappingURL=backgroundtab.js.map\n","import { startTrackingWebVitals, startTrackingINP, startTrackingLongAnimationFrames, startTrackingLongTasks, startTrackingInteractions, addHistoryInstrumentationHandler, registerInpInteractionListener, addPerformanceEntries } from '@sentry-internal/browser-utils';\nimport { TRACING_DEFAULTS, registerSpanErrorInstrumentation, getClient, spanToJSON, getCurrentScope, getRootSpan, spanIsSampled, getDynamicSamplingContextFromSpan, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, getActiveSpan, getIsolationScope, startIdleSpan, SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON } from '@sentry/core';\nimport { GLOBAL_OBJ, logger, propagationContextFromHeaders, browserPerformanceTimeOrigin, generatePropagationContext, getDomElement } from '@sentry/utils';\nimport { DEBUG_BUILD } from '../debug-build.js';\nimport { WINDOW } from '../helpers.js';\nimport { registerBackgroundTabDetection } from './backgroundtab.js';\nimport { defaultRequestInstrumentationOptions, instrumentOutgoingRequests } from './request.js';\n\n/* eslint-disable max-lines */\n\nconst BROWSER_TRACING_INTEGRATION_ID = 'BrowserTracing';\n\nconst DEFAULT_BROWSER_TRACING_OPTIONS = {\n ...TRACING_DEFAULTS,\n instrumentNavigation: true,\n instrumentPageLoad: true,\n markBackgroundSpan: true,\n enableLongTask: true,\n enableLongAnimationFrame: true,\n enableInp: true,\n _experiments: {},\n ...defaultRequestInstrumentationOptions,\n};\n\n/**\n * The Browser Tracing integration automatically instruments browser pageload/navigation\n * actions as transactions, and captures requests, metrics and errors as spans.\n *\n * The integration can be configured with a variety of options, and can be extended to use\n * any routing library.\n *\n * We explicitly export the proper type here, as this has to be extended in some cases.\n */\nconst browserTracingIntegration = ((_options = {}) => {\n registerSpanErrorInstrumentation();\n\n const {\n enableInp,\n enableLongTask,\n enableLongAnimationFrame,\n _experiments: { enableInteractions, enableStandaloneClsSpans },\n beforeStartSpan,\n idleTimeout,\n finalTimeout,\n childSpanTimeout,\n markBackgroundSpan,\n traceFetch,\n traceXHR,\n shouldCreateSpanForRequest,\n enableHTTPTimings,\n instrumentPageLoad,\n instrumentNavigation,\n } = {\n ...DEFAULT_BROWSER_TRACING_OPTIONS,\n ..._options,\n };\n\n const _collectWebVitals = startTrackingWebVitals({ recordClsStandaloneSpans: enableStandaloneClsSpans || false });\n\n if (enableInp) {\n startTrackingINP();\n }\n\n if (\n enableLongAnimationFrame &&\n GLOBAL_OBJ.PerformanceObserver &&\n PerformanceObserver.supportedEntryTypes &&\n PerformanceObserver.supportedEntryTypes.includes('long-animation-frame')\n ) {\n startTrackingLongAnimationFrames();\n } else if (enableLongTask) {\n startTrackingLongTasks();\n }\n\n if (enableInteractions) {\n startTrackingInteractions();\n }\n\n const latestRoute = {\n name: undefined,\n source: undefined,\n };\n\n /** Create routing idle transaction. */\n function _createRouteSpan(client, startSpanOptions) {\n const isPageloadTransaction = startSpanOptions.op === 'pageload';\n\n const finalStartSpanOptions = beforeStartSpan\n ? beforeStartSpan(startSpanOptions)\n : startSpanOptions;\n\n const attributes = finalStartSpanOptions.attributes || {};\n\n // If `finalStartSpanOptions.name` is different than `startSpanOptions.name`\n // it is because `beforeStartSpan` set a custom name. Therefore we set the source to 'custom'.\n if (startSpanOptions.name !== finalStartSpanOptions.name) {\n attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE] = 'custom';\n finalStartSpanOptions.attributes = attributes;\n }\n\n latestRoute.name = finalStartSpanOptions.name;\n latestRoute.source = attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE];\n\n const idleSpan = startIdleSpan(finalStartSpanOptions, {\n idleTimeout,\n finalTimeout,\n childSpanTimeout,\n // should wait for finish signal if it's a pageload transaction\n disableAutoFinish: isPageloadTransaction,\n beforeSpanEnd: span => {\n _collectWebVitals();\n addPerformanceEntries(span, { recordClsOnPageloadSpan: !enableStandaloneClsSpans });\n },\n });\n\n function emitFinish() {\n if (['interactive', 'complete'].includes(WINDOW.document.readyState)) {\n client.emit('idleSpanEnableAutoFinish', idleSpan);\n }\n }\n\n if (isPageloadTransaction && WINDOW.document) {\n WINDOW.document.addEventListener('readystatechange', () => {\n emitFinish();\n });\n\n emitFinish();\n }\n\n return idleSpan;\n }\n\n return {\n name: BROWSER_TRACING_INTEGRATION_ID,\n afterAllSetup(client) {\n let activeSpan;\n let startingUrl = WINDOW.location && WINDOW.location.href;\n\n client.on('startNavigationSpan', startSpanOptions => {\n if (getClient() !== client) {\n return;\n }\n\n if (activeSpan && !spanToJSON(activeSpan).timestamp) {\n DEBUG_BUILD && logger.log(`[Tracing] Finishing current root span with op: ${spanToJSON(activeSpan).op}`);\n // If there's an open transaction on the scope, we need to finish it before creating an new one.\n activeSpan.end();\n }\n\n activeSpan = _createRouteSpan(client, {\n op: 'navigation',\n ...startSpanOptions,\n });\n });\n\n client.on('startPageLoadSpan', (startSpanOptions, traceOptions = {}) => {\n if (getClient() !== client) {\n return;\n }\n\n if (activeSpan && !spanToJSON(activeSpan).timestamp) {\n DEBUG_BUILD && logger.log(`[Tracing] Finishing current root span with op: ${spanToJSON(activeSpan).op}`);\n // If there's an open transaction on the scope, we need to finish it before creating an new one.\n activeSpan.end();\n }\n\n const sentryTrace = traceOptions.sentryTrace || getMetaContent('sentry-trace');\n const baggage = traceOptions.baggage || getMetaContent('baggage');\n\n const propagationContext = propagationContextFromHeaders(sentryTrace, baggage);\n getCurrentScope().setPropagationContext(propagationContext);\n\n activeSpan = _createRouteSpan(client, {\n op: 'pageload',\n ...startSpanOptions,\n });\n });\n\n // A trace should to stay the consistent over the entire time span of one route.\n // Therefore, when the initial pageload or navigation root span ends, we update the\n // scope's propagation context to keep span-specific attributes like the `sampled` decision and\n // the dynamic sampling context valid, even after the root span has ended.\n // This ensures that the trace data is consistent for the entire duration of the route.\n client.on('spanEnd', span => {\n const op = spanToJSON(span).op;\n if (span !== getRootSpan(span) || (op !== 'navigation' && op !== 'pageload')) {\n return;\n }\n\n const scope = getCurrentScope();\n const oldPropagationContext = scope.getPropagationContext();\n\n scope.setPropagationContext({\n ...oldPropagationContext,\n sampled: oldPropagationContext.sampled !== undefined ? oldPropagationContext.sampled : spanIsSampled(span),\n dsc: oldPropagationContext.dsc || getDynamicSamplingContextFromSpan(span),\n });\n });\n\n if (WINDOW.location) {\n if (instrumentPageLoad) {\n startBrowserTracingPageLoadSpan(client, {\n name: WINDOW.location.pathname,\n // pageload should always start at timeOrigin (and needs to be in s, not ms)\n startTime: browserPerformanceTimeOrigin ? browserPerformanceTimeOrigin / 1000 : undefined,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'url',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.pageload.browser',\n },\n });\n }\n\n if (instrumentNavigation) {\n addHistoryInstrumentationHandler(({ to, from }) => {\n /**\n * This early return is there to account for some cases where a navigation transaction starts right after\n * long-running pageload. We make sure that if `from` is undefined and a valid `startingURL` exists, we don't\n * create an uneccessary navigation transaction.\n *\n * This was hard to duplicate, but this behavior stopped as soon as this fix was applied. This issue might also\n * only be caused in certain development environments where the usage of a hot module reloader is causing\n * errors.\n */\n if (from === undefined && startingUrl && startingUrl.indexOf(to) !== -1) {\n startingUrl = undefined;\n return;\n }\n\n if (from !== to) {\n startingUrl = undefined;\n startBrowserTracingNavigationSpan(client, {\n name: WINDOW.location.pathname,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'url',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.navigation.browser',\n },\n });\n }\n });\n }\n }\n\n if (markBackgroundSpan) {\n registerBackgroundTabDetection();\n }\n\n if (enableInteractions) {\n registerInteractionListener(idleTimeout, finalTimeout, childSpanTimeout, latestRoute);\n }\n\n if (enableInp) {\n registerInpInteractionListener();\n }\n\n instrumentOutgoingRequests(client, {\n traceFetch,\n traceXHR,\n tracePropagationTargets: client.getOptions().tracePropagationTargets,\n shouldCreateSpanForRequest,\n enableHTTPTimings,\n });\n },\n };\n}) ;\n\n/**\n * Manually start a page load span.\n * This will only do something if a browser tracing integration integration has been setup.\n *\n * If you provide a custom `traceOptions` object, it will be used to continue the trace\n * instead of the default behavior, which is to look it up on the tags.\n */\nfunction startBrowserTracingPageLoadSpan(\n client,\n spanOptions,\n traceOptions,\n) {\n client.emit('startPageLoadSpan', spanOptions, traceOptions);\n\n getCurrentScope().setTransactionName(spanOptions.name);\n\n const span = getActiveSpan();\n const op = span && spanToJSON(span).op;\n return op === 'pageload' ? span : undefined;\n}\n\n/**\n * Manually start a navigation span.\n * This will only do something if a browser tracing integration has been setup.\n */\nfunction startBrowserTracingNavigationSpan(client, spanOptions) {\n getIsolationScope().setPropagationContext(generatePropagationContext());\n getCurrentScope().setPropagationContext(generatePropagationContext());\n\n client.emit('startNavigationSpan', spanOptions);\n\n getCurrentScope().setTransactionName(spanOptions.name);\n\n const span = getActiveSpan();\n const op = span && spanToJSON(span).op;\n return op === 'navigation' ? span : undefined;\n}\n\n/** Returns the value of a meta tag */\nfunction getMetaContent(metaName) {\n // Can't specify generic to `getDomElement` because tracing can be used\n // in a variety of environments, have to disable `no-unsafe-member-access`\n // as a result.\n const metaTag = getDomElement(`meta[name=${metaName}]`);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return metaTag ? metaTag.getAttribute('content') : undefined;\n}\n\n/** Start listener for interaction transactions */\nfunction registerInteractionListener(\n idleTimeout,\n finalTimeout,\n childSpanTimeout,\n latestRoute,\n) {\n let inflightInteractionSpan;\n const registerInteractionTransaction = () => {\n const op = 'ui.action.click';\n\n const activeSpan = getActiveSpan();\n const rootSpan = activeSpan && getRootSpan(activeSpan);\n if (rootSpan) {\n const currentRootSpanOp = spanToJSON(rootSpan).op;\n if (['navigation', 'pageload'].includes(currentRootSpanOp )) {\n DEBUG_BUILD &&\n logger.warn(`[Tracing] Did not create ${op} span because a pageload or navigation span is in progress.`);\n return undefined;\n }\n }\n\n if (inflightInteractionSpan) {\n inflightInteractionSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON, 'interactionInterrupted');\n inflightInteractionSpan.end();\n inflightInteractionSpan = undefined;\n }\n\n if (!latestRoute.name) {\n DEBUG_BUILD && logger.warn(`[Tracing] Did not create ${op} transaction because _latestRouteName is missing.`);\n return undefined;\n }\n\n inflightInteractionSpan = startIdleSpan(\n {\n name: latestRoute.name,\n op,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: latestRoute.source || 'url',\n },\n },\n {\n idleTimeout,\n finalTimeout,\n childSpanTimeout,\n },\n );\n };\n\n if (WINDOW.document) {\n addEventListener('click', registerInteractionTransaction, { once: false, capture: true });\n }\n}\n\nexport { BROWSER_TRACING_INTEGRATION_ID, browserTracingIntegration, getMetaContent, startBrowserTracingNavigationSpan, startBrowserTracingPageLoadSpan };\n//# sourceMappingURL=browserTracingIntegration.js.map\n","import { captureException } from '@sentry/browser';\nimport { getCurrentScope, spanToJSON, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, getActiveSpan, getRootSpan } from '@sentry/core';\n\n// The following type is an intersection of the Route type from VueRouter v2, v3, and v4.\n// This is not great, but kinda necessary to make it work with all versions at the same time.\n\n/**\n * Instrument the Vue router to create navigation spans.\n */\nfunction instrumentVueRouter(\n router,\n options\n\n,\n startNavigationSpanFn,\n) {\n let isFirstPageLoad = true;\n\n router.onError(error => captureException(error, { mechanism: { handled: false } }));\n\n router.beforeEach((to, from, next) => {\n // According to docs we could use `from === VueRouter.START_LOCATION` but I couldn't get it working for Vue 2\n // https://router.vuejs.org/api/#router-start-location\n // https://next.router.vuejs.org/api/#start-location\n // Additionally, Nuxt does not provide the possibility to check for `from.matched.length === 0` (this is never 0).\n // Therefore, a flag was added to track the page-load: isFirstPageLoad\n\n // from.name:\n // - Vue 2: null\n // - Vue 3: undefined\n // - Nuxt: undefined\n // hence only '==' instead of '===', because `undefined == null` evaluates to `true`\n const isPageLoadNavigation =\n (from.name == null && from.matched.length === 0) || (from.name === undefined && isFirstPageLoad);\n\n if (isFirstPageLoad) {\n isFirstPageLoad = false;\n }\n\n const attributes = {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.navigation.vue',\n };\n\n for (const key of Object.keys(to.params)) {\n attributes[`params.${key}`] = to.params[key];\n }\n for (const key of Object.keys(to.query)) {\n const value = to.query[key];\n if (value) {\n attributes[`query.${key}`] = value;\n }\n }\n\n // Determine a name for the routing transaction and where that name came from\n let spanName = to.path;\n let transactionSource = 'url';\n if (to.name && options.routeLabel !== 'path') {\n spanName = to.name.toString();\n transactionSource = 'custom';\n } else if (to.matched.length > 0) {\n const lastIndex = to.matched.length - 1;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n spanName = to.matched[lastIndex].path;\n transactionSource = 'route';\n }\n\n getCurrentScope().setTransactionName(spanName);\n\n if (options.instrumentPageLoad && isPageLoadNavigation) {\n const activeRootSpan = getActiveRootSpan();\n if (activeRootSpan) {\n const existingAttributes = spanToJSON(activeRootSpan).data || {};\n if (existingAttributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE] !== 'custom') {\n activeRootSpan.updateName(spanName);\n activeRootSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, transactionSource);\n }\n // Set router attributes on the existing pageload transaction\n // This will override the origin, and add params & query attributes\n activeRootSpan.setAttributes({\n ...attributes,\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.pageload.vue',\n });\n }\n }\n\n if (options.instrumentNavigation && !isPageLoadNavigation) {\n attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE] = transactionSource;\n attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] = 'auto.navigation.vue';\n startNavigationSpanFn({\n name: spanName,\n op: 'navigation',\n attributes,\n });\n }\n\n // Vue Router 4 no longer exposes the `next` function, so we need to\n // check if it's available before calling it.\n // `next` needs to be called in Vue Router 3 so that the hook is resolved.\n if (next) {\n next();\n }\n });\n}\n\nfunction getActiveRootSpan() {\n const span = getActiveSpan();\n const rootSpan = span && getRootSpan(span);\n\n if (!rootSpan) {\n return undefined;\n }\n\n const op = spanToJSON(rootSpan).op;\n\n // Only use this root span if it is a pageload or navigation span\n return op === 'navigation' || op === 'pageload' ? rootSpan : undefined;\n}\n\nexport { instrumentVueRouter };\n//# sourceMappingURL=router.js.map\n","import { browserTracingIntegration as browserTracingIntegration$1, startBrowserTracingNavigationSpan } from '@sentry/browser';\nimport { instrumentVueRouter } from './router.js';\n\n// The following type is an intersection of the Route type from VueRouter v2, v3, and v4.\n// This is not great, but kinda necessary to make it work with all versions at the same time.\n\n/**\n * A custom browser tracing integrations for Vue.\n */\nfunction browserTracingIntegration(options = {}) {\n // If router is not passed, we just use the normal implementation\n if (!options.router) {\n return browserTracingIntegration$1(options);\n }\n\n const integration = browserTracingIntegration$1({\n ...options,\n instrumentNavigation: false,\n });\n\n const { router, instrumentNavigation = true, instrumentPageLoad = true, routeLabel = 'name' } = options;\n\n return {\n ...integration,\n afterAllSetup(client) {\n integration.afterAllSetup(client);\n\n const startNavigationSpan = (options) => {\n startBrowserTracingNavigationSpan(client, options);\n };\n\n instrumentVueRouter(router, { routeLabel, instrumentNavigation, instrumentPageLoad }, startNavigationSpan);\n },\n };\n}\n\nexport { browserTracingIntegration };\n//# sourceMappingURL=browserTracingIntegration.js.map\n"],"names":["isNodeEnv","isBrowserBundle","isBrowser","isElectronNodeRenderer","GLOBAL_OBJ","_nullishCoalesce","lhs","rhsFn","_optionalChain","ops","lastAccessLHS","value","i","op","fn","args","errorsInstrumented","registerSpanErrorInstrumentation","addGlobalErrorInstrumentationHandler","errorCallback","addGlobalUnhandledRejectionInstrumentationHandler","activeSpan","getActiveSpan","rootSpan","getRootSpan","message","DEBUG_BUILD","logger","SPAN_STATUS_ERROR","TRACING_DEFAULTS","FINISH_REASON_HEARTBEAT_FAILED","FINISH_REASON_IDLE_TIMEOUT","FINISH_REASON_FINAL_TIMEOUT","FINISH_REASON_EXTERNAL_FINISH","startIdleSpan","startSpanOptions","options","activities","_finished","_idleTimeoutID","_finishReason","_autoFinishAllowed","_cleanupHooks","idleTimeout","finalTimeout","childSpanTimeout","beforeSpanEnd","client","getClient","hasTracingEnabled","SentryNonRecordingSpan","scope","getCurrentScope","previousActiveSpan","span","_startIdleSpan","target","thisArg","definedEndTimestamp","rest","timestamp","timestampInSeconds","spanEndTimestamp","spanTimeInputToSeconds","spans","getSpanDescendants","child","onIdleSpanEnded","childEndTimestamps","spanToJSON","latestSpanEndTimestamp","spanStartTimestamp","endTimestamp","_cancelIdleTimeout","_restartIdleTimeout","_restartChildSpanTimeout","_pushActivity","spanId","_popActivity","cleanup","_setSpanForScope","spanJSON","startTimestamp","SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON","childSpans","discardedSpans","childSpan","childSpanJSON","childEndTimestamp","childStartTimestamp","spanStartedBeforeIdleSpanEnd","timeoutWithMarginOfError","spanEndedBeforeFinalTimeout","stringifiedSpan","removeChildSpanFromSpan","startedSpan","endedSpan","spanToAllowAutoFinish","startInactiveSpan","isSentryRequestUrl","url","dsn","tunnel","checkDsn","checkTunnel","removeTrailingSlash","str","instrumentFetchRequest","handlerData","shouldCreateSpan","shouldAttachHeaders","spanOrigin","shouldCreateSpanResult","endSpan","method","fullUrl","getFullURL","host","parseUrl","hasParent","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","SEMANTIC_ATTRIBUTE_SENTRY_OP","request","addTracingHeadersToFetchRequest","isolationScope","getIsolationScope","traceId","sampled","dsc","sentryTraceHeader","spanToTraceHeader","generateSentryTraceHeader","sentryBaggageHeader","dynamicSamplingContextToSentryBaggageHeader","getDynamicSamplingContextFromSpan","getDynamicSamplingContextFromClient","headers","isInstanceOf","newHeaders","BAGGAGE_HEADER_NAME","existingBaggageHeader","newBaggageHeaders","setHttpStatus","contentLength","contentLengthNum","getRating","thresholds","bindReporter","callback","metric","reportAllChanges","prevValue","delta","forceReport","generateUniqueID","getNavigationEntry","WINDOW","getActivationStart","navEntry","initMetric","name","navigationType","observe","type","opts","po","list","onHidden","cb","onHiddenOrPageHide","event","runOnce","called","arg","firstHiddenTime","initHiddenTime","onVisibilityUpdate","addChangeListeners","getVisibilityWatcher","whenActivated","FCPThresholds","onFCP","onReport","visibilityWatcher","report","entries","entry","CLSThresholds","onCLS","sessionValue","sessionEntries","handleEntries","firstSessionEntry","lastSessionEntry","FIDThresholds","onFID","handleEntry","interactionCountEstimate","minKnownInteractionId","maxKnownInteractionId","updateEstimate","e","getInteractionCount","initInteractionCountPolyfill","INPThresholds","prevInteractionCount","getInteractionCountForNavigation","MAX_INTERACTIONS_TO_CONSIDER","longestInteractionList","longestInteractionMap","processEntry","minLongestInteraction","existingInteraction","interaction","a","b","estimateP98LongestInteraction","candidateInteractionIndex","onINP","prevEntry","inp","LCPThresholds","reportedMetricIDs","onLCP","lastEntry","stopListening","TTFBThresholds","whenReady","onTTFB","responseStart","handlers","instrumented","_previousCls","_previousFid","_previousLcp","_previousTtfb","_previousInp","addClsInstrumentationHandler","stopOnCallback","addMetricObserver","instrumentCls","addLcpInstrumentationHandler","instrumentLcp","addFidInstrumentationHandler","instrumentFid","addTtfbInstrumentationHandler","instrumentTtfb","addInpInstrumentationHandler","instrumentInp","addPerformanceInstrumentationHandler","addHandler","instrumentPerformanceObserver","getCleanupCallback","triggerHandlers","data","typeHandlers","handler","getFunctionName","instrumentFn","previousValue","index","isPerformanceEventTiming","isMeasurementValue","startAndEndSpan","parentSpan","startTimeInSeconds","endTime","ctx","parentStartTime","withActiveSpan","startStandaloneWebVitalSpan","transaction","passedAttributes","startTime","release","environment","replay","replayId","user","userDisplay","profileId","attributes","getBrowserPerformanceAPI","msToSec","time","trackClsAsStandaloneSpan","standaloneCLsValue","standaloneClsEntry","pageloadSpanId","supportsLayoutShift","sentSpan","_collectClsOnce","sendStandaloneClsSpan","cleanupClsHandler","unsubscribeStartNavigation","_","_2","clsValue","browserPerformanceTimeOrigin","_3","routeName","htmlTreeAsString","_4","_5","_6","dropUndefinedKeys","SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME","_7","_8","_9","SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT","SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE","_10","_11","_12","_13","_14","MAX_INT_AS_BYTES","_performanceCursor","_measurements","_lcpEntry","_clsEntry","startTrackingWebVitals","recordClsStandaloneSpans","performance","fidCleanupCallback","_trackFID","lcpCleanupCallback","_trackLCP","ttfbCleanupCallback","_trackTtfb","clsCleanupCallback","_trackCLS","startTrackingLongTasks","duration","startTrackingLongAnimationFrames","initialScript","invoker","invokerType","sourceURL","sourceFunctionName","sourceCharPosition","startTrackingInteractions","spanOptions","componentName","getComponentName","timeOrigin","addPerformanceEntries","performanceEntries","transactionStartTime","_addNavigationSpans","_addMeasureSpans","firstHidden","shouldRecord","_addResourceSpans","_trackNavigator","_addTtfbRequestTimeToMeasurements","fidMark","measurementName","measurement","setMeasurement","_setWebVitalAttributes","requestTime","measureStartTimestamp","startTimeStamp","measureEndTimestamp","_addPerformanceNavigationTiming","_addRequest","eventEnd","end","start","requestStartTimestamp","responseEndTimestamp","responseStartTimestamp","resourceUrl","parsedUrl","setResourceEntrySizeData","navigator","connection","source","key","dataKey","entryVal","requestStart","LAST_INTERACTIONS","INTERACTIONS_SPAN_MAP","startTrackingINP","inpCallback","_trackINP","INP_ENTRY_MAP","interactionId","interactionType","spanToUse","registerInpInteractionListener","_latestRoute","activeRootSpan","last","REPLAY_SESSION_KEY","REPLAY_EVENT_NAME","UNABLE_TO_SEND_REPLAY","SESSION_IDLE_PAUSE_DURATION","SESSION_IDLE_EXPIRE_DURATION","DEFAULT_FLUSH_MIN_DELAY","DEFAULT_FLUSH_MAX_DELAY","BUFFER_CHECKOUT_TIME","RETRY_BASE_INTERVAL","RETRY_MAX_COUNT","NETWORK_BODY_MAX_SIZE","CONSOLE_ARG_MAX_SIZE","SLOW_CLICK_THRESHOLD","SLOW_CLICK_SCROLL_TIMEOUT","REPLAY_MAX_EVENT_BUFFER_SIZE","MIN_REPLAY_DURATION","MIN_REPLAY_DURATION_LIMIT","MAX_REPLAY_DURATION","_nullishCoalesce$1","_optionalChain$5","NodeType$1","NodeType","isElement$1","n","isShadowRoot","isNativeShadowDom","shadowRoot","fixBrowserCompatibilityIssuesInCSS","cssText","escapeImportStatement","rule","statement","stringifyStylesheet","s","rules","stringifyRule","importStringified","isCSSImportRule","isCSSStyleRule","fixSafariColons","cssStringified","regex","Mirror","id","childNode","node","meta","oldNode","createMirror","shouldMaskInput","maskInputOptions","tagName","maskInputValue","isMasked","element","maskInputFn","text","toLowerCase","toUpperCase","ORIGINAL_ATTRIBUTE_NAME","is2DCanvasBlank","canvas","chunkSize","x","y","getImageData","originalGetImageData","pixel","getInputType","getInputValue","el","extractFileExtension","path","baseURL","match","cachedImplementations$1","getImplementation$1","cached","document","impl","sandbox","contentWindow","setTimeout$2","clearTimeout$2","_id","tagNameRegex","IGNORED_NODE","genId","getValidTagName","processedTagName","extractOrigin","origin","canvasService","canvasCtx","URL_IN_CSS_REF","URL_PROTOCOL_MATCH","URL_WWW_MATCH","DATA_URI","absoluteToStylesheet","href","quote1","path1","quote2","path2","path3","filePath","maybeQuote","stack","parts","part","SRCSET_NOT_SPACES","SRCSET_COMMAS_OR_SPACES","getAbsoluteSrcsetString","doc","attributeValue","pos","collectCharacters","regEx","chars","output","absoluteToDoc","descriptorsStr","inParens","c","cachedDocument","getHref","isSVGElement","customHref","transformAttribute","maskAttributeFn","ignoreAttribute","_value","_isBlockedElement","blockClass","blockSelector","unblockSelector","eIndex","className","elementClassMatchesRegex","distanceToMatch","matchPredicate","limit","distance","createMatchPredicate","selector","needMaskingText","maskTextClass","maskTextSelector","unmaskTextClass","unmaskTextSelector","maskAllText","autocomplete","maskDistance","unmaskDistance","onceIframeLoaded","iframeEl","listener","iframeLoadTimeout","win","fired","readyState","timer","blankUrl","onceStylesheetLoaded","link","styleSheetLoadTimeout","styleSheetLoaded","serializeNode","mirror","inlineStylesheet","maskTextFn","dataURLOptions","inlineImages","recordCanvas","keepIframeSrcFn","newlyAddedElement","rootId","getRootId","serializeElementNode","serializeTextNode","docId","parentTagName","textContent","isStyle","isScript","isTextarea","err","forceMask","isInputMasked","needBlock","len","attr","stylesheet","checked","canvasDataURL","blankCanvas","blankCanvasDataURL","image","imageSrc","priorCrossOrigin","recordInlineImage","width","height","isCustomElement","lowerIfExists","maybeAttr","slimDOMExcluded","sn","slimDOMOptions","serializeNodeWithId","skipChild","onSerialize","onIframeLoad","onStylesheetLoad","stylesheetLoadTimeout","preserveWhiteSpace","_serializedNode","serializedNode","recordChild","bypassOptions","childN","serializedChildNode","iframeDoc","serializedIframeNode","serializedLinkNode","snapshot","maskAllInputs","slimDOM","_optionalChain$4","on","DEPARTED_MIRROR_ACCESS_WARNING","_mirror","prop","receiver","throttle$1","func","wait","timeout","previous","now","remaining","context","clearTimeout$1","setTimeout$1","hookSetter","d","isRevoked","original","patch","replacement","wrapped","nowTimestamp","getWindowScroll","getWindowHeight","getWindowWidth","closestElementOfNode","isBlocked","checkAncestors","blockedPredicate","isUnblocked","blockDistance","unblockDistance","isSerialized","isIgnored","isAncestorRemoved","legacy_isTouchEvent","polyfill","isSerializedIframe","isSerializedStylesheet","hasShadowRoot","_18","StyleSheetMirror","newId","getShadowHost","shadowHost","_19","_20","_21","getRootShadowHost","rootShadowHost","shadowHostInDom","inDom","cachedImplementations","getImplementation","onRequestAnimationFrame","EventType","EventType2","IncrementalSource","IncrementalSource2","MouseInteractions","MouseInteractions2","PointerTypes","PointerTypes2","_optionalChain$3","isNodeInLinkedList","DoubleLinkedList","position","current","moveKey","parentId","MutationBuffer","mutations","adds","addedIds","addList","getNextId","ns","nextId","pushAdd","currentN","iframe","childSn","isParentRemoved","isAncestorInSet","candidate","tailNode","_node","unhandledNode","payload","attribute","diffAsStr","unchangedAsStr","m","attributeName","item","old","pname","newValue","newPriority","nodeId","deepDelete","targetId","addsSet","removes","_isParentRemoved","r","set","_isAncestorInSet","parentNode","errorHandler","registerErrorHandler","unregisterErrorHandler","callbackWrapper","error","_optionalChain$2","mutationBuffers","getEventTarget","initMutationObserver","rootEl","mutationBuffer","mutationObserverCtor","angularZoneSymbol","observer","initMoveObserver","mousemoveCb","sampling","threshold","callbackThreshold","positions","timeBaseline","wrappedCb","totalOffset","p","updatePosition","evt","clientX","clientY","h","initMouseInteractionObserver","mouseInteractionCb","disableMap","currentPointerType","getHandler","eventKey","pointerType","thisEventKey","eventName","initScrollObserver","scrollCb","scrollLeftTop","initViewportResizeObserver","viewportResizeCb","lastH","lastW","updateDimension","INPUT_TAGS","lastInputValueMap","initInputObserver","inputCb","ignoreClass","ignoreSelector","userTriggeredOnInput","eventHandler","userTriggered","isChecked","cbWithDedup","lastInputValue","currentWindow","propertyDescriptor","hookProperties","getNestedCSSRulePositions","recurse","childRule","hasNestedCSSRule","getIdAndStyleId","sheet","styleMirror","styleId","initStyleSheetObserver","styleSheetRuleCb","stylesheetManager","insertRule","argumentsList","deleteRule","replace","replaceSync","supportedNestedCSSRuleTypes","canMonkeyPatchNestedCSSRule","unmodifiedFunctions","typeKey","initAdoptedStyleSheetObserver","hostId","patchTarget","originalPropertyDescriptor","sheets","result","_15","_16","initStyleDeclarationObserver","styleDeclarationCb","ignoreCSSAttributes","setProperty","property","priority","_17","removeProperty","initMediaInteractionObserver","mediaInteractionCb","currentTime","volume","muted","playbackRate","initFontObserver","fontCb","fontMap","originalFontFace","family","descriptors","fontFace","restoreHandler","initSelectionObserver","param","selectionCb","collapsed","updateSelection","selection","ranges","count","range","startContainer","startOffset","endContainer","endOffset","initCustomElementObserver","customElementCb","constructor","initObservers","o","_hooks","mutationObserver","mousemoveHandler","mouseInteractionHandler","scrollHandler","viewportResizeHandler","inputHandler","mediaInteractionHandler","styleSheetObserver","adoptedStyleSheetObserver","styleDeclarationObserver","fontObserver","selectionObserver","customElementObserver","pluginHandlers","plugin","_22","_23","CrossOriginIframeMirror","generateIdFn","remoteId","idToRemoteMap","remoteToIdMap","idToRemoteIdMap","remoteIdToIdMap","map","ids","_optionalChain$1","IframeManagerNoop","IframeManager","crossOriginMessageEvent","transformedEvent","style","iframeMirror","obj","keys","ShadowDomManagerNoop","ShadowDomManager","iframeElement","manager","option","CanvasManagerNoop","StylesheetManager","linkEl","adoptedStyleSheetData","styles","ProcessedNodeManager","thisBuffer","buffers","buffer","wrappedEmit","_takeFullSnapshot","cleanFrame","record","emit","checkoutEveryNms","checkoutEveryNth","_maskInputOptions","_slimDOMOptions","maxCanvasSize","packFn","mousemoveWait","recordDOM","recordCrossOriginIframes","recordAfter","collectFonts","plugins","onMutation","getCanvasManager","inEmittingFrame","passEmitsToParent","lastFullSnapshotEvent","incrementalSnapshotCount","eventProcessor","isCheckout","buf","exceedCount","exceedTime","takeFullSnapshot","wrappedMutationEmit","wrappedScrollEmit","wrappedCanvasMutationEmit","wrappedAdoptedStyleSheetEmit","iframeManager","processedNodeManager","canvasManager","_getCanvasManager","shadowDomManager","v","init","getCanvasManagerFn","CONSOLE_LEVELS","PREFIX","_addBreadcrumb","level","addBreadcrumb","makeReplayLogger","_capture","_trace","_logger","logger$1","severityLevelFromString","captureException","ReplayEventTypeIncrementalSnapshot","ReplayEventTypeCustom","timestampToMs","timestampToS","addBreadcrumbEvent","breadcrumb","normalize","INTERACTIVE_SELECTOR","getClosestInteractive","getClickTargetNode","getTargetNode","isEventWithTarget","onWindowOpen","monkeyPatchWindowOpen","fill","originalWindowOpen","IncrementalMutationSources","handleClick","clickDetector","clickBreadcrumb","ClickDetector","slowClickConfig","_addBreadcrumbEvent","cleanupWindowOpen","nowInSeconds","ignoreElement","isClickBreadcrumb","newClick","click","timedOutClicks","hadScroll","hadMutation","isSlowClick","clickCount","timeAfterClickMs","endReason","setTimeout$3","SLOW_CLICK_TAGS","updateClickDetectorForRecordingEvent","isIncrementalEvent","isIncrementalMouseInteraction","createBreadcrumb","ATTRIBUTES_TO_RECORD","getAttributesToRecord","normalizedKey","handleDomListener","handleDom","isClick","getBaseDomBreadcrumb","isElement","getDomTarget","handleKeyboardEvent","getKeyboardBreadcrumb","metaKey","shiftKey","ctrlKey","altKey","isInputElement","hasModifierKey","isCharacterKey","baseBreadcrumb","ENTRY_TYPES","createResourceEntry","createPaintEntry","createNavigationEntry","webVitalHandler","getter","createPerformanceEntries","createPerformanceEntry","entryType","getAbsoluteTime","decodedBodySize","domComplete","encodedBodySize","domContentLoadedEventStart","domContentLoadedEventEnd","domInteractive","loadEventStart","loadEventEnd","redirectCount","transferSize","initiatorType","responseEnd","responseStatus","getLargestContentfulPaint","getWebVital","isLayoutShift","getCumulativeLayoutShift","layoutShifts","nodes","nodeIds","getFirstInputDelay","getInteractionToNextPaint","attributions","rating","setupPerformanceObserver","addPerformanceEntry","onEntries","clearCallbacks","clearCallback","EventBufferSizeExceededError","EventBufferArray","eventSize","resolve","eventsRet","WorkerHandler","worker","reject","response","EventBufferCompressionWorker","EventBufferProxy","events","hasCheckout","addEventPromises","createEventBuffer","useCompression","customWorkerUrl","_loadWorker","workerUrl","_getWorkerUrl","hasSessionStorage","clearSession","deleteSession","isSampled","sampleRate","makeSession","session","uuid4","started","lastActivity","segmentId","previousSessionId","saveSession","getSessionSampleType","sessionSampleRate","allowBuffering","createSession","stickySession","fetchSession","sessionStringFromStorage","sessionObj","isExpired","initialTime","expiry","targetTime","isSessionExpired","maxReplayDuration","sessionIdleExpire","shouldRefreshSession","loadOrCreateSession","sessionOptions","existingSession","isCustomEvent","addEventSync","shouldAddEvent","_addEvent","addEvent","replayOptions","eventAfterPossibleCallback","maybeApplyCallback","reason","timestampInMs","isErrorEvent","isTransactionEvent","isReplayEvent","isFeedbackEvent","handleAfterSendEvent","sendResponse","statusCode","handleTransactionEvent","handleErrorEvent","replayContext","beforeErrorSampling","handleBeforeSendEvent","handleHydrationError","exceptionValue","getLocationHref","handleBreadcrumbs","beforeAddBreadcrumb","isBreadcrumbWithCategory","normalizeBreadcrumb","normalizeConsoleBreadcrumb","isTruncated","normalizedArgs","normalizedArg","isRrwebError","hint","addFeedbackBreadcrumb","shouldSampleForBufferEvent","handleGlobalEventListener","createPerformanceSpans","handleHistory","from","to","handleHistorySpanListener","shouldFilterRequest","addNetworkBreadcrumb","getBodySize","body","textEncoder","formDataStr","_serializeFormData","parseContentLengthHeader","header","size","getBodyString","mergeWarning","info","warning","newMeta","existingWarnings","makeNetworkReplayBreadcrumb","buildSkippedNetworkRequestOrResponse","bodySize","buildNetworkRequestOrResponse","normalizedBody","warnings","normalizeNetworkBody","getAllowedHeaders","allowedHeaders","filteredHeaders","formData","exceedsSizeLimit","isProbablyJson","_strIsProbablyJson","truncatedBody","first","urlMatches","urls","getFullUrl","stringMatchesSomePattern","baseURI","fixedUrl","captureFetchBreadcrumbToReplay","_prepareFetchData","enrichFetchBreadcrumb","input","_getFetchRequestArgBody","reqSize","resSize","requestBodySize","responseBodySize","captureDetails","_getRequestInfo","_getResponseInfo","networkCaptureBodies","networkRequestHeaders","getRequestHeaders","requestBody","bodyStr","networkResponseHeaders","getAllHeaders","bodyText","_parseFetchResponseBody","getResponseData","res","_tryCloneResponse","_tryGetResponseText","fetchArgs","allHeaders","getHeadersFromOptions","_getResponseText","txt","captureXhrBreadcrumbToReplay","_prepareXhrData","enrichXhrBreadcrumb","xhr","_getBodySize","xhrInfo","SENTRY_XHR_DATA_KEY","getResponseHeaders","requestWarning","responseBody","responseWarning","_getXhrResponseBody","acc","line","errors","_parseXhrResponse","responseType","handleNetworkBreadcrumbs","networkDetailAllowUrls","networkDetailDenyUrls","beforeAddNetworkBreadcrumb","_isXhrBreadcrumb","_isXhrHint","_isFetchBreadcrumb","_isFetchHint","addGlobalListeners","addClickKeypressInstrumentationHandler","addHistoryInstrumentationHandler","addEventProcessor","feedbackEvent","addMemoryEntry","createMemoryEntry","memoryEntry","jsHeapSizeLimit","totalJSHeapSize","usedJSHeapSize","debounce","callbackReturnValue","timerId","maxTimerId","maxWait","invokeFunc","cancelTimers","flush","debounced","getHandleRecordingEmit","hadFirstEvent","_isCheckout","addSettingsEvent","earliestEvent","createOptionsEvent","resetReplayIdOnDynamicSamplingContext","createReplayEnvelope","replayEvent","recordingData","createEnvelope","createEventEnvelopeHeaders","getSdkMetadataForEnvelopeHeader","prepareRecordingData","payloadWithSequence","replayHeaders","sequence","prepareReplayEvent","event_id","integrations","eventHint","preparedEvent","prepareEvent","metadata","version","sendReplayRequest","segment_id","eventContext","preparedRecordingData","errorIds","traceIds","initialTimestamp","transport","resolvedSyncPromise","baseEvent","envelope","TransportStatusCodeError","rateLimits","updateRateLimits","isRateLimited","RateLimitError","sendReplay","replayData","retryConfig","onError","setContext","THROTTLED","SKIPPED","throttle","maxCount","durationSeconds","counter","_cleanup","_getTotalCount","isThrottled","wasThrottled","ReplayContainer","recordingOptions","slowClickTimeout","slowClickIgnoreSelectors","experiments","errorSampleRate","requiresManualStart","canvasOptions","forceFlush","continueRecording","activityTime","hasStoppedRecording","cbResult","urlPath","lastActiveSpan","lastRootSpan","SEMANTIC_ATTRIBUTE_SENTRY_SOURCE","currentSession","_lastActivity","eventBuffer","_context","dropReason","force","tooShort","tooLong","_flushInProgress","mutationLimit","mutationBreadcrumbLimit","overMutationLimit","getOption","selectors","defaultSelectors","getPrivacyOptions","mask","unmask","block","unblock","ignore","defaultBlockedElements","maskSelector","unmaskSelector","maskAttribute","maskAttributes","privacyOptions","MEDIA_SELECTORS","DEFAULT_NETWORK_HEADERS","_initialized","replayIntegration","Replay","flushMinDelay","flushMaxDelay","minReplayDuration","_experiments","blockAllMedia","maskFn","beforeAddRecordingEvent","_getMergedNetworkHeaders","finalOptions","loadReplayOptionsFromClient","canvasIntegration","initialOptions","opt","replaysSessionSampleRate","parseSampleRate","replaysOnErrorSampleRate","consoleSandbox","responseToSpanId","spanIdToEndTimestamp","defaultRequestInstrumentationOptions","instrumentOutgoingRequests","_options","traceFetch","traceXHR","shouldCreateSpanForRequest","enableHTTPTimings","tracePropagationTargets","shouldAttachHeadersWithTargets","updatedTimestamp","addFetchEndInstrumentationHandler","addFetchInstrumentationHandler","createdSpan","addHTTPTimings","addXhrInstrumentationHandler","xhrCallback","isPerformanceResourceTiming","resourceTimingEntryToSpanData","extractNetworkProtocol","nextHopProtocol","_name","char","resourceTiming","timingSpanData","targetUrl","resolvedUrl","currentOrigin","isSameOriginRequest","isRelativeSameOriginRequest","sentryXhrData","addTracingHeadersToXhrRequest","setHeaderOnXhr","registerBackgroundTabDetection","cancelledStatus","status","BROWSER_TRACING_INTEGRATION_ID","DEFAULT_BROWSER_TRACING_OPTIONS","browserTracingIntegration","enableInp","enableLongTask","enableLongAnimationFrame","enableInteractions","enableStandaloneClsSpans","beforeStartSpan","markBackgroundSpan","instrumentPageLoad","instrumentNavigation","_collectWebVitals","latestRoute","_createRouteSpan","isPageloadTransaction","finalStartSpanOptions","idleSpan","emitFinish","startingUrl","traceOptions","sentryTrace","getMetaContent","baggage","propagationContext","propagationContextFromHeaders","oldPropagationContext","spanIsSampled","startBrowserTracingPageLoadSpan","startBrowserTracingNavigationSpan","registerInteractionListener","generatePropagationContext","metaName","metaTag","getDomElement","inflightInteractionSpan","registerInteractionTransaction","currentRootSpanOp","instrumentVueRouter","router","startNavigationSpanFn","isFirstPageLoad","next","isPageLoadNavigation","spanName","transactionSource","lastIndex","getActiveRootSpan","browserTracingIntegration$1","integration","routeLabel"],"mappings":"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","debug_id":"71f6dbd4-261d-5b0e-b446-72192325ae0d"}