{"version":3,"file":"js/5846-b023f2303a849c0aea4b.js","mappings":"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","sources":["webpack://artfully-walls/./node_modules/@sentry-internal/replay/build/npm/esm/index.js"],"sourcesContent":["import { _nullishCoalesce, _optionalChain } from '@sentry/core';\nimport { GLOBAL_OBJ, normalize, fill, htmlTreeAsString, browserPerformanceTimeOrigin, logger as logger$1, severityLevelFromString, captureException, addBreadcrumb, uuid4, getClient, getLocationHref, getCurrentScope, getActiveSpan, getDynamicSamplingContextFromSpan, isSentryRequestUrl, dropUndefinedKeys, stringMatchesSomePattern, addEventProcessor, createEnvelope, createEventEnvelopeHeaders, getSdkMetadataForEnvelopeHeader, prepareEvent, getIsolationScope, resolvedSyncPromise, updateRateLimits, isRateLimited, setContext, getRootSpan, spanToJSON, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, isBrowser, parseSampleRate, consoleSandbox } from '@sentry/core';\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$3;\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$3 || (NodeType$3 = {}));\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 fixAllCssProperty(rule) {\n let styles = '';\n for (let i = 0; i < rule.style.length; i++) {\n const styleDeclaration = rule.style;\n const attribute = styleDeclaration[i];\n const isImportant = styleDeclaration.getPropertyPriority(attribute);\n styles += `${attribute}:${styleDeclaration.getPropertyValue(attribute)}${isImportant ? ` !important` : ''};`;\n }\n return `${rule.selectorText} { ${styles} }`;\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)) {\n let cssText = rule.cssText;\n const needsSafariColonFix = rule.selectorText.includes(':');\n const needsAllFix = typeof rule.style['all'] === 'string' && rule.style['all'];\n if (needsAllFix) {\n cssText = fixAllCssProperty(rule);\n }\n if (needsSafariColonFix) {\n cssText = fixSafariColons(cssText);\n }\n if (needsSafariColonFix || needsAllFix) {\n return cssText;\n }\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}\nfunction getIframeContentDocument(iframe) {\n try {\n return iframe.contentDocument;\n }\n catch (e) {\n }\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$3.Document,\n childNodes: [],\n compatMode: n.compatMode,\n };\n }\n else {\n return {\n type: NodeType$3.Document,\n childNodes: [],\n };\n }\n case n.DOCUMENT_TYPE_NODE:\n return {\n type: NodeType$3.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$3.CDATA,\n textContent: '',\n rootId,\n };\n case n.COMMENT_NODE:\n return {\n type: NodeType$3.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$3.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 attributes.rel = null;\n attributes.href = null;\n attributes.crossorigin = null;\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 && !getIframeContentDocument(n)) {\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$3.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$3.Comment) {\n return true;\n }\n else if (sn.type === NodeType$3.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.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$3.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$3.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$3.Document ||\n serializedNode.type === NodeType$3.Element) &&\n recordChild) {\n if (slimDOMOptions.headWhitespace &&\n serializedNode.type === NodeType$3.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$3.Element &&\n serializedNode.tagName === 'iframe') {\n onceIframeLoaded(n, () => {\n const iframeDoc = getIframeContentDocument(n);\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$3.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\nvar 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 = {}));\nvar NodeType$2;\n(function (NodeType) {\n NodeType[NodeType[\"PLACEHOLDER\"] = 0] = \"PLACEHOLDER\";\n NodeType[NodeType[\"ELEMENT_NODE\"] = 1] = \"ELEMENT_NODE\";\n NodeType[NodeType[\"ATTRIBUTE_NODE\"] = 2] = \"ATTRIBUTE_NODE\";\n NodeType[NodeType[\"TEXT_NODE\"] = 3] = \"TEXT_NODE\";\n NodeType[NodeType[\"CDATA_SECTION_NODE\"] = 4] = \"CDATA_SECTION_NODE\";\n NodeType[NodeType[\"ENTITY_REFERENCE_NODE\"] = 5] = \"ENTITY_REFERENCE_NODE\";\n NodeType[NodeType[\"ENTITY_NODE\"] = 6] = \"ENTITY_NODE\";\n NodeType[NodeType[\"PROCESSING_INSTRUCTION_NODE\"] = 7] = \"PROCESSING_INSTRUCTION_NODE\";\n NodeType[NodeType[\"COMMENT_NODE\"] = 8] = \"COMMENT_NODE\";\n NodeType[NodeType[\"DOCUMENT_NODE\"] = 9] = \"DOCUMENT_NODE\";\n NodeType[NodeType[\"DOCUMENT_TYPE_NODE\"] = 10] = \"DOCUMENT_TYPE_NODE\";\n NodeType[NodeType[\"DOCUMENT_FRAGMENT_NODE\"] = 11] = \"DOCUMENT_FRAGMENT_NODE\";\n})(NodeType$2 || (NodeType$2 = {}));\n\nfunction getIFrameContentDocument(iframe) {\n try {\n return iframe.contentDocument;\n }\n catch (e) {\n }\n}\nfunction getIFrameContentWindow(iframe) {\n try {\n return iframe.contentWindow;\n }\n catch (e) {\n }\n}\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 const iframeDoc = getIFrameContentDocument(target);\n if (!iframeDoc) {\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 const iframeDoc = getIFrameContentDocument(iframeEl);\n if (iframeDoc &&\n iframeDoc.adoptedStyleSheets &&\n iframeDoc.adoptedStyleSheets.length > 0)\n this.stylesheetManager.adoptStyleSheets(iframeDoc.adoptedStyleSheets, this.mirror.getId(iframeDoc));\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$3.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 const iframeDoc = getIFrameContentDocument(iframeElement);\n const iframeWindow = getIFrameContentWindow(iframeElement);\n if (!iframeDoc || !iframeWindow)\n return;\n this.patchAttachShadow(iframeWindow.Element, iframeDoc);\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\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._scrollTimeout = 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._scrollTimeout;\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\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 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==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},_=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},x=function(r,e){for(var i=[],a=0;ad&&(d=o[a].s);var g=new n(d+1),w=A(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}},A=function(t,n,r){return-1==t.s?Math.max(A(t.l,n,r+1),A(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,U)+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){_(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;_(r,m,Q[et]),m+=R[et],et>3&&(_(r,m,rt>>5&8191),m+=i[et])}else _(r,m,N[rt]),m+=P[rt]}return _(r,m,N[256]),m+P[256]},C=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=C[s-1],M=y>>13,E=8191&y,z=(1<7e3||q>24576)&&(N>423||!w)){p=U(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=_[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(J)return J.encode(n);for(var e=n.length,i=new t(n.length+(n.length>>1)),a=0,s=function(t){i[a++]=t},o=0;oi.length){var f=new t(a+8+(e-o<<1));f.set(i),i=f}var h=n.charCodeAt(o);h<128||r?s(h):h<2048?(s(192|h>>6),s(128|63&h)):h>55295&&h<57344?(s(240|(h=65536+(1047552&h)|1023&n.charCodeAt(++o))>>18),s(128|h>>12&63),s(128|h>>6&63),s(128|63&h)):(s(224|h>>12),s(128|h>>6&63),s(128|63&h))}return b(i,0,a)}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\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\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 /** @inheritdoc */\n\n constructor() {\n this.events = [];\n this._totalSize = 0;\n this.hasCheckout = false;\n this.waitForCheckout = 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 occurred.\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 /** @inheritdoc */\n\n constructor(worker) {\n this._worker = new WorkerHandler(worker);\n this._earliestTimestamp = null;\n this._totalSize = 0;\n this.hasCheckout = false;\n this.waitForCheckout = 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 occurred.\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 successfully 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 waitForCheckout() {\n return this._used.waitForCheckout;\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 // eslint-disable-next-line @typescript-eslint/adjacent-overload-signatures\n set waitForCheckout(value) {\n this._used.waitForCheckout = 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, waitForCheckout } = 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 this._compression.waitForCheckout = waitForCheckout;\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 const { eventBuffer } = replay;\n\n if (!eventBuffer || (eventBuffer.waitForCheckout && !isCheckout)) {\n return null;\n }\n\n const isBufferMode = replay.recordingMode === 'buffer';\n\n try {\n if (isCheckout && isBufferMode) {\n eventBuffer.clear();\n }\n\n if (isCheckout) {\n eventBuffer.hasCheckout = true;\n eventBuffer.waitForCheckout = false;\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 eventBuffer.addEvent(eventAfterPossibleCallback);\n } catch (error) {\n const isExceeded = error && error instanceof EventBufferSizeExceededError;\n const reason = isExceeded ? 'addEventSizeExceeded' : 'addEvent';\n\n if (isExceeded && isBufferMode) {\n // Clear buffer and wait for next checkout\n eventBuffer.clear();\n eventBuffer.waitForCheckout = true;\n\n return null;\n }\n\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 occurred 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 * 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 * 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 `handleGlobalEvent`, 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 // prevent exceeding replay durations by removing the expired replayId from the DSC\n resetReplayIdOnDynamicSamplingContext();\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 appropriate).\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 if (error instanceof Error && error.message.indexOf('Timeout') > -1) {\n DEBUG_BUILD && logger.warn('Parsing text body from response timed out');\n return [undefined, 'BODY_PARSE_TIMEOUT'];\n }\n\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 appropriate).\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 // 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 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 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 * 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 two 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 multiple 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 session (=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 let performanceEntries = createPerformanceEntries(this.performanceEntries).concat(this.replayPerformanceEntries);\n\n this.performanceEntries = [];\n this.replayPerformanceEntries = [];\n\n // If we are manually starting, we want to ensure we only include performance entries\n // that are after the initial timestamp\n // The reason for this is that we may have performance entries from the page load, but may decide to start\n // the replay later on, in which case we do not want to include these entries.\n // without this, manually started replays can have events long before the actual replay recording starts,\n // which messes with the timeline etc.\n if (this._requiresManualStart) {\n const initialTimestampInSeconds = this._context.initialTimestamp / 1000;\n performanceEntries = performanceEntries.filter(entry => entry.start >= initialTimestampInSeconds);\n }\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 accommodate 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 precedence\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 onError,\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 onError,\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 * Get the current recording mode. This can be either `session` or `buffer`.\n *\n * `session`: Recording the whole session, sending it continuously\n * `buffer`: Always keeping 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 getRecordingMode() {\n if (!this._replay || !this._replay.isEnabled()) {\n return;\n }\n\n return this._replay.recordingMode;\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"],"names":["WINDOW","REPLAY_SESSION_KEY","UNABLE_TO_SEND_REPLAY","NETWORK_BODY_MAX_SIZE","CONSOLE_ARG_MAX_SIZE","REPLAY_MAX_EVENT_BUFFER_SIZE","MAX_REPLAY_DURATION","_nullishCoalesce$1","lhs","rhsFn","_optionalChain$5","ops","lastAccessLHS","value","i","length","op","fn","args","call","undefined","NodeType$3","isShadowRoot","n","host","_","Boolean","_2","shadowRoot","isNativeShadowDom","Object","prototype","toString","stringifyStylesheet","s","rules","cssRules","cssText","Array","from","stringifyRule","join","includes","replace","error","rule","importStringified","isCSSImportRule","styleSheet","split","statement","JSON","stringify","href","layerName","push","supportsText","media","mediaText","escapeImportStatement","isCSSStyleRule","needsSafariColonFix","selectorText","needsAllFix","style","styles","styleDeclaration","attribute","isImportant","getPropertyPriority","getPropertyValue","fixAllCssProperty","cssStringified","regex","fixSafariColons","NodeType","Mirror","constructor","this","idNodeMap","Map","nodeMetaMap","WeakMap","getId","_3","getMeta","_4","_5","id","getNode","get","getIds","keys","removeNodeFromMap","delete","childNodes","forEach","childNode","has","hasNode","node","add","meta","set","oldNode","reset","shouldMaskInput","maskInputOptions","tagName","type","toLowerCase","maskInputValue","isMasked","element","maskInputFn","text","repeat","str","toUpperCase","ORIGINAL_ATTRIBUTE_NAME","getInputType","hasAttribute","getInputValue","el","getAttribute","extractFileExtension","path","baseURL","url","URL","window","location","err","pathname","match","_6","cachedImplementations$1","getImplementation$1","name","cached","document","impl","createElement","sandbox","hidden","head","appendChild","contentWindow","removeChild","e","bind","setTimeout$2","rest","clearTimeout$2","getIframeContentDocument","iframe","contentDocument","_id","tagNameRegex","RegExp","genId","canvasService","canvasCtx","URL_IN_CSS_REF","URL_PROTOCOL_MATCH","URL_WWW_MATCH","DATA_URI","absoluteToStylesheet","origin","quote1","path1","quote2","path2","path3","filePath","maybeQuote","test","indexOf","slice","extractOrigin","stack","parts","pop","part","SRCSET_NOT_SPACES","SRCSET_COMMAS_OR_SPACES","cachedDocument","absoluteToDoc","doc","attributeValue","trim","getHref","isSVGElement","ownerSVGElement","customHref","a","startsWith","setAttribute","transformAttribute","maskAttributeFn","pos","collectCharacters","regEx","chars","exec","substring","output","descriptorsStr","inParens","c","charAt","getAbsoluteSrcsetString","ignoreAttribute","_value","distanceToMatch","matchPredicate","limit","Infinity","distance","nodeType","ELEMENT_NODE","parentNode","createMatchPredicate","className","selector","matches","eIndex","classList","elementClassMatchesRegex","e2","needMaskingText","maskTextClass","maskTextSelector","unmaskTextClass","unmaskTextSelector","maskAllText","parentElement","autocomplete","maskDistance","unmaskDistance","serializeNode","options","mirror","blockClass","blockSelector","unblockSelector","inlineStylesheet","maskTextFn","dataURLOptions","inlineImages","recordCanvas","keepIframeSrcFn","newlyAddedElement","rootId","docId","getRootId","DOCUMENT_NODE","compatMode","Document","DOCUMENT_TYPE_NODE","DocumentType","publicId","systemId","needBlock","contains","_isBlockedElement","HTMLFormElement","processedTagName","getValidTagName","attributes","len","attr","stylesheet","styleSheets","find","rel","crossorigin","_cssText","sheet","innerText","textContent","checked","forceMask","selected","__context","canvas","ctx","getContext","x","width","y","height","getImageData","originalGetImageData","Uint32Array","Math","min","data","buffer","some","pixel","is2DCanvasBlank","rr_dataURL","toDataURL","quality","canvasDataURL","blankCanvas","image","imageSrc","currentSrc","priorCrossOrigin","crossOrigin","recordInlineImage","removeEventListener","naturalWidth","naturalHeight","drawImage","complete","addEventListener","console","warn","removeAttribute","rr_mediaState","paused","rr_mediaCurrentTime","currentTime","scrollLeft","rr_scrollLeft","scrollTop","rr_scrollTop","getBoundingClientRect","class","rr_width","rr_height","src","rr_src","isCustomElement","customElements","Element","isSVG","isCustom","serializeElementNode","TEXT_NODE","parentTagName","isStyle","isScript","isTextarea","nextSibling","previousSibling","_7","_8","_9","textarea","Text","serializeTextNode","CDATA_SECTION_NODE","CDATA","COMMENT_NODE","Comment","lowerIfExists","maybeAttr","serializeNodeWithId","skipChild","slimDOMOptions","onSerialize","onIframeLoad","iframeLoadTimeout","onStylesheetLoad","stylesheetLoadTimeout","preserveWhiteSpace","_serializedNode","sn","comment","script","headFavicon","headMetaDescKeywords","headMetaSocial","property","headMetaRobots","headMetaHttpEquiv","headMetaAuthorship","headMetaVerification","slimDOMExcluded","serializedNode","assign","recordChild","isShadowHost","headWhitespace","bypassOptions","childN","serializedChildNode","isElement$1","isShadow","iframeEl","listener","win","readyState","fired","timer","blankUrl","onceIframeLoaded","iframeDoc","serializedIframeNode","link","styleSheetLoadTimeout","styleSheetLoaded","onceStylesheetLoaded","serializedLinkNode","_optionalChain$4","on","target","capture","passive","DEPARTED_MIRROR_ACCESS_WARNING","_mirror","map","throttle$1","func","wait","timeout","previous","now","Date","leading","remaining","context","getImplementation","clearTimeout$1","apply","trailing","setTimeout$1","hookSetter","key","d","isRevoked","original","getOwnPropertyDescriptor","defineProperty","patch","source","replacement","wrapped","defineProperties","__rrweb_original__","enumerable","Proxy","Reflect","prop","receiver","nowTimestamp","getWindowScroll","left","scrollingElement","pageXOffset","documentElement","body","top","pageYOffset","_10","_11","_12","_13","_14","getWindowHeight","innerHeight","clientHeight","getWindowWidth","innerWidth","clientWidth","closestElementOfNode","isBlocked","checkAncestors","blockedPredicate","isUnblocked","blockDistance","unblockDistance","isIgnored","isAncestorRemoved","legacy_isTouchEvent","event","changedTouches","isSerializedIframe","nodeName","isSerializedStylesheet","hasShadowRoot","_18","getTime","StyleSheetMirror","styleIDMap","idStyleMap","newId","getStyle","generateId","getShadowHost","shadowHost","_19","getRootNode","_20","_21","Node","DOCUMENT_FRAGMENT_NODE","shadowHostInDom","ownerDocument","rootShadowHost","getRootShadowHost","inDom","cachedImplementations","NodeType$1","NodeType$2","EventType","EventType2","IncrementalSource","IncrementalSource2","MouseInteractions","MouseInteractions2","PointerTypes","PointerTypes2","getIFrameContentDocument","_optionalChain$3","isNodeInLinkedList","DoubleLinkedList","tail","position","Error","current","index","next","addNode","__ln","removeNode","moveKey","parentId","MutationBuffer","frozen","locked","texts","attributeMap","removes","mapRemoves","movedMap","addedSet","Set","movedSet","droppedSet","processMutations","mutations","processMutation","emit","adds","addedIds","addList","getNextId","ns","nextId","pushAdd","currentN","iframeManager","addIframe","stylesheetManager","trackLinkElement","shadowDomManager","addShadowRoot","childSn","attachIframe","canvasManager","addWindow","observeAttachShadow","attachLinkElement","shift","isParentRemoved","isAncestorInSet","candidate","tailNode","_node","unhandledNode","payload","filter","diffAsStr","styleDiff","unchangedAsStr","_unchangedStyles","mutationCb","m","oldValue","attributeName","isInputMasked","item","unattachedDoc","implementation","createHTMLDocument","old","pname","newValue","newPriority","addedNodes","genAdds","removedNodes","nodeId","isSerialized","deepDelete","processedNodeManager","inOtherBuffer","targetId","init","freeze","unfreeze","isFrozen","lock","unlock","addsSet","r","_isParentRemoved","size","_isAncestorInSet","errorHandler","registerErrorHandler","handler","unregisterErrorHandler","callbackWrapper","cb","_optionalChain$2","mutationBuffers","getEventTarget","composedPath","initMutationObserver","rootEl","mutationBuffer","mutationObserverCtor","MutationObserver","__rrMutationObserver","angularZoneSymbol","Zone","__symbol__","observer","onMutation","observe","attributeOldValue","characterData","characterDataOldValue","childList","subtree","initMouseInteractionObserver","mouseInteractionCb","sampling","mouseInteraction","disableMap","handlers","currentPointerType","Number","isNaN","endsWith","eventKey","eventName","pointerType","thisEventKey","Mouse","Touch","Pen","MouseDown","MouseUp","Click","clientX","clientY","getHandler","PointerEvent","TouchStart","TouchEnd","h","initScrollObserver","scrollCb","evt","defaultView","scrollLeftTop","scroll","INPUT_TAGS","lastInputValueMap","initInputObserver","inputCb","ignoreClass","ignoreSelector","userTriggeredOnInput","eventHandler","userTriggered","isTrusted","isChecked","cbWithDedup","querySelectorAll","v","lastInputValue","input","currentWindow","propertyDescriptor","HTMLInputElement","hookProperties","HTMLSelectElement","HTMLTextAreaElement","HTMLOptionElement","p","getNestedCSSRulePositions","childRule","hasNestedCSSRule","parentRule","CSSGroupingRule","CSSMediaRule","CSSSupportsRule","CSSConditionRule","unshift","parentStyleSheet","recurse","getIdAndStyleId","styleMirror","styleId","ownerNode","initAdoptedStyleSheetObserver","hostId","patchTarget","ShadowRoot","originalPropertyDescriptor","configurable","sheets","result","_15","_16","adoptStyleSheets","initObservers","o","_hooks","mutationObserver","recordDOM","mousemoveHandler","mousemoveCb","mousemove","threshold","callbackThreshold","mousemoveCallback","timeBaseline","positions","wrappedCb","totalOffset","timeOffset","updatePosition","DragEvent","Drag","MouseEvent","MouseMove","TouchMove","initMoveObserver","mouseInteractionHandler","scrollHandler","viewportResizeHandler","viewportResizeCb","lastH","lastW","initViewportResizeObserver","inputHandler","mediaInteractionHandler","mediaInteractionCb","volume","muted","playbackRate","initMediaInteractionObserver","styleSheetObserver","adoptedStyleSheetObserver","styleDeclarationObserver","fontObserver","styleSheetRuleCb","CSSStyleSheet","insertRule","thisArg","argumentsList","deleteRule","replaceSync","supportedNestedCSSRuleTypes","canMonkeyPatchNestedCSSRule","unmodifiedFunctions","entries","typeKey","initStyleSheetObserver","styleDeclarationCb","ignoreCSSAttributes","setProperty","CSSStyleDeclaration","priority","_17","removeProperty","remove","initStyleDeclarationObserver","collectFonts","fontCb","fontMap","originalFontFace","FontFace","family","descriptors","fontFace","fontSource","Uint8Array","restoreHandler","fonts","initFontObserver","selectionObserver","param","selectionCb","collapsed","updateSelection","selection","getSelection","isCollapsed","ranges","count","rangeCount","range","getRangeAt","startContainer","startOffset","endContainer","endOffset","start","end","initSelectionObserver","customElementObserver","customElementCb","define","initCustomElementObserver","pluginHandlers","plugin","plugins","callback","b","_22","disconnect","_23","CrossOriginIframeMirror","generateIdFn","iframeIdToRemoteIdMap","iframeRemoteIdToIdMap","remoteId","idToRemoteMap","remoteToIdMap","idToRemoteIdMap","getIdToRemoteIdMap","remoteIdToIdMap","getRemoteIdToIdMap","getRemoteId","getRemoteIds","ids","_optionalChain$1","IframeManagerNoop","crossOriginIframeMirror","crossOriginIframeRootIdMap","addLoadListener","IframeManager","iframes","crossOriginIframeMap","wrappedEmit","recordCrossOriginIframes","crossOriginIframeStyleMirror","handleMessage","loadListener","isAttachIframe","adoptedStyleSheets","message","crossOriginMessageEvent","transformedEvent","transformCrossOriginEvent","isCheckout","FullSnapshot","replaceIdOnNode","patchRootIdOnNode","timestamp","IncrementalSnapshot","Mutation","Meta","Load","DomContentLoaded","Plugin","Custom","replaceIds","ViewportResize","MediaInteraction","MouseInteraction","Scroll","CanvasMutation","Input","StyleSheetRule","StyleDeclaration","replaceStyleIds","Font","Selection","AdoptedStyleSheet","iframeMirror","obj","isArray","child","ShadowDomManagerNoop","ShadowDomManager","shadowDoms","WeakSet","restoreHandlers","patchAttachShadow","iframeElement","iframeWindow","getIFrameContentWindow","manager","option","resetShadowRoots","CanvasManagerNoop","snapshot","StylesheetManager","trackedLinkElements","adoptedStyleSheetCb","linkEl","trackStylesheetInLinkElement","adoptedStyleSheetData","styleIds","CSSRule","ProcessedNodeManager","nodeMap","active","thisBuffer","buffers","onRequestAnimationFrame","destroy","_takeFullSnapshot","cleanFrame","debug","record","checkoutEveryNms","checkoutEveryNth","maskAllInputs","_maskInputOptions","_slimDOMOptions","maxCanvasSize","packFn","mousemoveWait","recordAfter","getCanvasManager","inEmittingFrame","parent","passEmitsToParent","color","date","email","month","number","search","tel","time","week","select","radio","checkbox","lastFullSnapshotEvent","NodeList","DOMTokenList","TypeError","polyfill","incrementalSnapshotCount","eventProcessor","buf","postMessage","exceedCount","exceedTime","takeFullSnapshot","wrappedMutationEmit","wrappedScrollEmit","wrappedCanvasMutationEmit","__RRWEB_EXCLUDE_IFRAME__","getMirror","nodeMirror","getCanvasManagerFn","_getCanvasManager","__RRWEB_EXCLUDE_SHADOW_DOM__","slimDOM","initialOffset","canvasMutationCb","CustomElement","timestampToMs","timestampToS","addBreadcrumbEvent","replay","breadcrumb","category","triggerUserActivity","checkAndHandleExpiredSession","addUpdate","throttledAddEvent","tag","getClosestInteractive","closest","getClickTargetNode","getTargetNode","isEventWithTarget","onWindowOpen","originalWindowOpen","splice","IncrementalMutationSources","ClickDetector","slowClickConfig","_addBreadcrumbEvent","_lastMutation","_lastScroll","_clicks","_timeout","_threshold","_scrollTimeout","scrollTimeout","_replay","_ignoreSelector","addListeners","cleanupWindowOpen","nowInSeconds","_teardown","removeListeners","_checkClickTimeout","clearTimeout","handleClick","SLOW_CLICK_TAGS","ignoreElement","isClickBreadcrumb","newClick","clickBreadcrumb","clickCount","click","abs","_scheduleCheckClicks","registerMutation","registerScroll","registerClick","_handleMultiClick","_getClicks","_checkClicks","timedOutClicks","mutationAfter","scrollAfter","_generateBreadcrumbs","hadScroll","hadMutation","isSlowClick","timeAfterClickMs","endReason","route","getCurrentRoute","metric","updateClickDetectorForRecordingEvent","clickDetector","isIncrementalEvent","isIncrementalMouseInteraction","HTMLElement","createBreadcrumb","ATTRIBUTES_TO_RECORD","getAttributesToRecord","normalizedKey","handleDomListener","handlerData","isEnabled","isClick","maxStringLength","getDomTarget","getBaseDomBreadcrumb","handleDom","altKey","metaKey","ctrlKey","shiftKey","isElement","handleKeyboardEvent","updateUserActivity","isContentEditable","isInputElement","hasModifierKey","isCharacterKey","baseBreadcrumb","getKeyboardBreadcrumb","ENTRY_TYPES","resource","entry","entryType","initiatorType","responseEnd","startTime","decodedBodySize","encodedBodySize","responseStatus","transferSize","getAbsoluteTime","statusCode","paint","duration","navigation","domComplete","domContentLoadedEventStart","domContentLoadedEventEnd","domInteractive","loadEventStart","loadEventEnd","redirectCount","webVitalHandler","getter","replayPerformanceEntries","createPerformanceEntry","performance","timeOrigin","getLargestContentfulPaint","lastEntry","getWebVital","isLayoutShift","sources","getCumulativeLayoutShift","layoutShifts","nodes","nodeIds","getFirstInputDelay","getInteractionToNextPaint","attributions","rating","DEBUG_BUILD","__SENTRY_DEBUG__","CONSOLE_LEVELS","PREFIX","_addBreadcrumb","level","logger","_capture","_trace","_logger","exception","infoTick","setConfig","opts","captureExceptions","traceInternals","info","setTimeout","makeReplayLogger","EventBufferSizeExceededError","super","EventBufferArray","events","_totalSize","hasCheckout","waitForCheckout","hasEvents","addEvent","eventSize","finish","Promise","resolve","eventsRet","clear","getEarliestTimestamp","sort","WorkerHandler","worker","_worker","ensureReady","_ensureReadyPromise","reject","success","once","terminate","method","arg","_getAndIncrementId","response","EventBufferCompressionWorker","_earliestTimestamp","_sendEventToWorker","_finishRequest","then","EventBufferProxy","_fallback","_compression","_used","_ensureWorkerIsLoadedPromise","_ensureWorkerIsLoaded","ensureWorkerIsLoaded","_switchToCompressionWorker","addEventPromises","all","createEventBuffer","useCompression","workerUrl","customWorkerUrl","Worker","__SENTRY_EXCLUDE_REPLAY_WORKER__","Blob","createObjectURL","_getWorkerUrl","_loadWorker","hasSessionStorage","sessionStorage","clearSession","removeItem","deleteSession","session","isSampled","sampleRate","random","makeSession","started","lastActivity","segmentId","sampled","previousSessionId","saveSession","setItem","createSession","sessionSampleRate","allowBuffering","stickySession","getSessionSampleType","isExpired","initialTime","expiry","targetTime","isSessionExpired","maxReplayDuration","sessionIdleExpire","shouldRefreshSession","loadOrCreateSession","sessionOptions","existingSession","sessionStringFromStorage","getItem","sessionObj","parse","fetchSession","addEventSync","shouldAddEvent","_addEvent","async","eventBuffer","isBufferMode","recordingMode","eventAfterPossibleCallback","isCustomEvent","maybeApplyCallback","getOptions","beforeAddRecordingEvent","isExceeded","reason","handleException","stop","client","recordDroppedEvent","isPaused","timestampInMs","timeouts","sessionIdlePause","initialTimestamp","isErrorEvent","isTransactionEvent","isFeedbackEvent","handleAfterSendEvent","sendResponse","replayContext","contexts","trace","trace_id","traceIds","handleTransactionEvent","event_id","errorIds","tags","replayId","beforeErrorSampling","sendBufferedReplayOrFlush","handleErrorEvent","handleBeforeSendEvent","exceptionValue","values","handleHydrationError","handleBreadcrumbs","isBreadcrumbWithCategory","arguments","isTruncated","normalizedArgs","normalizedArg","_meta","warnings","normalizeConsoleBreadcrumb","normalizeBreadcrumb","beforeAddBreadcrumb","resetReplayIdOnDynamicSamplingContext","dsc","getPropagationContext","replay_id","activeSpan","handleGlobalEventListener","hint","isReplayEvent","breadcrumbs","flush","feedback","getSessionId","feedbackId","addFeedbackBreadcrumb","originalException","__rrweb__","isRrwebError","_experiments","log","isErrorEventSampled","errorSampleRate","shouldSampleForBufferEvent","createPerformanceSpans","description","startTimestamp","endTimestamp","handleHistorySpanListener","to","handleHistory","urls","addNetworkBreadcrumb","shouldFilterRequest","getBodySize","textEncoder","TextEncoder","encode","URLSearchParams","FormData","formDataStr","_serializeFormData","ArrayBuffer","byteLength","parseContentLengthHeader","header","parseInt","getBodyString","mergeWarning","warning","headers","newMeta","existingWarnings","makeNetworkReplayBreadcrumb","request","buildSkippedNetworkRequestOrResponse","bodySize","buildNetworkRequestOrResponse","normalizedBody","exceedsSizeLimit","isProbablyJson","first","last","_strIsProbablyJson","truncatedBody","normalizeNetworkBody","getAllowedHeaders","allowedHeaders","reduce","filteredHeaders","formData","urlMatches","fullUrl","baseURI","fixedUrl","getFullUrl","captureFetchBreadcrumbToReplay","status_code","request_body_size","requestBodySize","response_body_size","responseBodySize","captureDetails","networkDetailAllowUrls","networkDetailDenyUrls","networkCaptureBodies","networkRequestHeaders","fetchArgs","getHeadersFromOptions","getRequestHeaders","requestBody","_getFetchRequestArgBody","bodyStr","_getRequestInfo","networkResponseHeaders","getAllHeaders","bodyText","res","clone","_tryCloneResponse","_getResponseText","txt","finally","_tryGetResponseText","_parseFetchResponseBody","getResponseData","_getResponseInfo","_prepareFetchData","allHeaders","Headers","captureXhrBreadcrumbToReplay","xhr","xhrInfo","request_headers","getAllResponseHeaders","acc","line","getResponseHeaders","requestWarning","responseBody","responseWarning","errors","responseText","responseType","outerHTML","_parseXhrResponse","_getXhrResponseBody","_prepareXhrData","enrichXhrBreadcrumb","reqSize","resSize","getResponseHeader","_getBodySize","handleNetworkBreadcrumbs","_isXhrBreadcrumb","_isXhrHint","_isFetchBreadcrumb","_isFetchHint","enrichFetchBreadcrumb","beforeAddNetworkBreadcrumb","createMemoryEntry","memoryEntry","jsHeapSizeLimit","totalJSHeapSize","usedJSHeapSize","memory","getHandleRecordingEmit","hadFirstEvent","_isCheckout","setInitialState","shouldRecordCanvas","isRecordingCanvas","useCompressionOption","blockAllMedia","networkDetailHasUrls","networkRequestHasHeaders","networkResponseHasHeaders","createOptionsEvent","addSettingsEvent","earliestEvent","sendReplayRequest","recordingData","segment_id","eventContext","preparedRecordingData","payloadWithSequence","replayHeaders","sequence","prepareRecordingData","scope","transport","getTransport","dsn","getDsn","baseEvent","replay_start_timestamp","error_ids","trace_ids","replay_type","replayEvent","eventHint","integrations","_integrations","preparedEvent","platform","metadata","getSdkMetadata","version","sdk","prepareReplayEvent","sdkProcessingMetadata","envelope","tunnel","createReplayEnvelope","send","cause","TransportStatusCodeError","rateLimits","RateLimitError","sendReplay","replayData","retryConfig","interval","onError","_retryCount","THROTTLED","throttle","maxCount","durationSeconds","counter","isThrottled","floor","_cleanup","wasThrottled","ReplayContainer","recordingOptions","__init","__init2","__init3","__init4","__init5","__init6","performanceEntries","_lastActivity","_isEnabled","_isPaused","_requiresManualStart","_hasInitializedCoreListeners","_context","initialUrl","_recordingOptions","_options","_debouncedFlush","callbackReturnValue","timerId","maxTimerId","maxWait","max","invokeFunc","cancelTimers","debounced","cancel","debounce","_flush","flushMinDelay","flushMaxDelay","_throttledAddEvent","slowClickTimeout","slowClickIgnoreSelectors","experiments","_canvas","initializeSampling","requiresManualStart","_initializeSessionForSampling","_initializeRecording","_updateUserActivity","startBuffering","startRecording","canvasOptions","_stopRecording","continuousCheckout","_onMutationHandler","stopRecording","forceFlush","_removeListeners","force","pause","resume","_checkSession","continueRecording","flushImmediate","activityTime","hasStoppedRecording","_updateSessionActivity","_maybeSaveSession","cbResult","conditionalFlush","cancelFlush","urlPath","hash","_clearContext","lastActiveSpan","lastRootSpan","_addListeners","currentSession","_refreshSession","_handleVisibilityChange","_handleWindowBlur","_handleWindowFocus","_handleKeyboardEvent","span","feedbackEvent","includeReplay","addGlobalListeners","_performanceCleanupCallback","addPerformanceEntry","onEntries","clearCallbacks","clearCallback","setupPerformanceObserver","visibilityState","_doChangeToForegroundTasks","_doChangeToBackgroundTasks","_createCustomBreadcrumb","_addPerformanceEntries","concat","initialTimestampInSeconds","_updateInitialTimestampFromEventBuffer","_popEventContext","_runFlush","addMemoryEntry","dropReason","tooShort","minReplayDuration","tooLong","_flushInProgress","_flushLock","mutationLimit","overMutationLimit","mutationBreadcrumbLimit","getOption","selectors","defaultSelectors","MEDIA_SELECTORS","DEFAULT_NETWORK_HEADERS","_initialized","replayIntegration","Replay","__initStatic","mask","maskAttributes","unmask","block","unblock","ignore","maskFn","privacyOptions","getPrivacyOptions","password","maskAttribute","_initialOptions","_getMergedNetworkHeaders","_isInitialized","afterAllSetup","_setup","_initialize","getReplayId","getRecordingMode","_maybeLoadFromReplayCanvasIntegration","finalOptions","initialOptions","opt","replaysSessionSampleRate","replaysOnErrorSampleRate","loadReplayOptionsFromClient","canvasIntegration","getIntegrationByName","getReplay"],"sourceRoot":""}