@anyreplay/browser 0.2.3 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -9
- package/dist/index.cjs +58 -16
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +24 -12
- package/dist/index.d.ts +24 -12
- package/dist/index.js +58 -16
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb-snapshot/es/rrweb-snapshot.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/utils.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/types/dist/types.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/mutation.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/observer.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/cross-origin-iframe-mirror.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/iframe-manager.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/shadow-dom-manager.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/ext/tslib/tslib.es6.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/ext/base64-arraybuffer/dist/base64-arraybuffer.es5.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/observers/canvas/serialize-args.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/observers/canvas/2d.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/observers/canvas/canvas.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/observers/canvas/webgl.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/_virtual/_rollup-plugin-web-worker-loader__helper__node__WorkerClass.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/_virtual/_rollup-plugin-web-worker-loader__helper__node__createBase64WorkerFactory.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/_virtual/_rollup-plugin-web-worker-loader__helper__browser__createBase64WorkerFactory.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/_virtual/_rollup-plugin-web-worker-loader__helper__auto__isNodeJS.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/_virtual/_rollup-plugin-web-worker-loader__helper__auto__createBase64WorkerFactory.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/_virtual/image-bitmap-data-url-worker.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/observers/canvas/canvas-manager.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/stylesheet-manager.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/index.js","../src/assets.ts","../src/config.ts","../src/masking.ts","../src/diagnostics.ts","../src/events.ts","../src/sampling.ts","../src/transport.ts","../src/version.ts","../src/visitor.ts","../src/recorder.ts"],"sourcesContent":["export { createRecorder, type RecorderHandle, type RecorderStatus, type ShellInfo } from './recorder.js';\nexport {\n ASSET_TAG, ASSET_LIMITS, defaultAssetMode, localAssetPrefix,\n type AssetMode, type AssetPayload, type AssetLimits,\n} from './assets.js';\nexport { resolveOptions, ConfigError, DEFAULTS, type AnyReplayOptions, type ResolvedOptions } from './config.js';\nexport { isSampledIn, hashToUnitInterval } from './sampling.js';\nexport { Transport, type RecordedEvent, type SessionMeta } from './transport.js';\nexport { resolveIdentity, forgetVisitor, safeStorage, uuidv4 } from './visitor.js';\nexport { TRACK_TAG, NAVIGATE_TAG, EVENT_NAME_PATTERN, MAX_PROPERTIES_BYTES, validateTrack, type TrackPayload } from './events.js';\nexport {\n ERROR_TAG, CONSOLE_TAG, NETWORK_TAG, LIMITS, REDACTED, redactText, redactUrl,\n errorPayload, consolePayload, startDiagnostics,\n type ErrorPayload, type ConsolePayload, type NetworkPayload, type DiagnosticsHandle,\n} from './diagnostics.js';\nexport { SDK_NAME, SDK_VERSION } from './version.js';\n","var NodeType;\r\n(function (NodeType) {\r\n NodeType[NodeType[\"Document\"] = 0] = \"Document\";\r\n NodeType[NodeType[\"DocumentType\"] = 1] = \"DocumentType\";\r\n NodeType[NodeType[\"Element\"] = 2] = \"Element\";\r\n NodeType[NodeType[\"Text\"] = 3] = \"Text\";\r\n NodeType[NodeType[\"CDATA\"] = 4] = \"CDATA\";\r\n NodeType[NodeType[\"Comment\"] = 5] = \"Comment\";\r\n})(NodeType || (NodeType = {}));\n\nfunction isElement(n) {\r\n return n.nodeType === n.ELEMENT_NODE;\r\n}\r\nfunction isShadowRoot(n) {\r\n var host = n === null || n === void 0 ? void 0 : n.host;\r\n return Boolean((host === null || host === void 0 ? void 0 : host.shadowRoot) === n);\r\n}\r\nfunction isNativeShadowDom(shadowRoot) {\r\n return Object.prototype.toString.call(shadowRoot) === '[object ShadowRoot]';\r\n}\r\nfunction fixBrowserCompatibilityIssuesInCSS(cssText) {\r\n if (cssText.includes(' background-clip: text;') &&\r\n !cssText.includes(' -webkit-background-clip: text;')) {\r\n cssText = cssText.replace(' background-clip: text;', ' -webkit-background-clip: text; background-clip: text;');\r\n }\r\n return cssText;\r\n}\r\nfunction getCssRulesString(s) {\r\n try {\r\n var rules = s.rules || s.cssRules;\r\n return rules\r\n ? fixBrowserCompatibilityIssuesInCSS(Array.from(rules).map(getCssRuleString).join(''))\r\n : null;\r\n }\r\n catch (error) {\r\n return null;\r\n }\r\n}\r\nfunction getCssRuleString(rule) {\r\n var cssStringified = rule.cssText;\r\n if (isCSSImportRule(rule)) {\r\n try {\r\n cssStringified = getCssRulesString(rule.styleSheet) || cssStringified;\r\n }\r\n catch (_a) {\r\n }\r\n }\r\n return cssStringified;\r\n}\r\nfunction isCSSImportRule(rule) {\r\n return 'styleSheet' in rule;\r\n}\r\nvar Mirror = (function () {\r\n function Mirror() {\r\n this.idNodeMap = new Map();\r\n this.nodeMetaMap = new WeakMap();\r\n }\r\n Mirror.prototype.getId = function (n) {\r\n var _a;\r\n if (!n)\r\n return -1;\r\n var id = (_a = this.getMeta(n)) === null || _a === void 0 ? void 0 : _a.id;\r\n return id !== null && id !== void 0 ? id : -1;\r\n };\r\n Mirror.prototype.getNode = function (id) {\r\n return this.idNodeMap.get(id) || null;\r\n };\r\n Mirror.prototype.getIds = function () {\r\n return Array.from(this.idNodeMap.keys());\r\n };\r\n Mirror.prototype.getMeta = function (n) {\r\n return this.nodeMetaMap.get(n) || null;\r\n };\r\n Mirror.prototype.removeNodeFromMap = function (n) {\r\n var _this = this;\r\n var id = this.getId(n);\r\n this.idNodeMap[\"delete\"](id);\r\n if (n.childNodes) {\r\n n.childNodes.forEach(function (childNode) {\r\n return _this.removeNodeFromMap(childNode);\r\n });\r\n }\r\n };\r\n Mirror.prototype.has = function (id) {\r\n return this.idNodeMap.has(id);\r\n };\r\n Mirror.prototype.hasNode = function (node) {\r\n return this.nodeMetaMap.has(node);\r\n };\r\n Mirror.prototype.add = function (n, meta) {\r\n var id = meta.id;\r\n this.idNodeMap.set(id, n);\r\n this.nodeMetaMap.set(n, meta);\r\n };\r\n Mirror.prototype.replace = function (id, n) {\r\n var oldNode = this.getNode(id);\r\n if (oldNode) {\r\n var meta = this.nodeMetaMap.get(oldNode);\r\n if (meta)\r\n this.nodeMetaMap.set(n, meta);\r\n }\r\n this.idNodeMap.set(id, n);\r\n };\r\n Mirror.prototype.reset = function () {\r\n this.idNodeMap = new Map();\r\n this.nodeMetaMap = new WeakMap();\r\n };\r\n return Mirror;\r\n}());\r\nfunction createMirror() {\r\n return new Mirror();\r\n}\r\nfunction maskInputValue(_a) {\r\n var maskInputOptions = _a.maskInputOptions, tagName = _a.tagName, type = _a.type, value = _a.value, maskInputFn = _a.maskInputFn;\r\n var text = value || '';\r\n if (maskInputOptions[tagName.toLowerCase()] ||\r\n maskInputOptions[type]) {\r\n if (maskInputFn) {\r\n text = maskInputFn(text);\r\n }\r\n else {\r\n text = '*'.repeat(text.length);\r\n }\r\n }\r\n return text;\r\n}\r\nvar ORIGINAL_ATTRIBUTE_NAME = '__rrweb_original__';\r\nfunction is2DCanvasBlank(canvas) {\r\n var ctx = canvas.getContext('2d');\r\n if (!ctx)\r\n return true;\r\n var chunkSize = 50;\r\n for (var x = 0; x < canvas.width; x += chunkSize) {\r\n for (var y = 0; y < canvas.height; y += chunkSize) {\r\n var getImageData = ctx.getImageData;\r\n var originalGetImageData = ORIGINAL_ATTRIBUTE_NAME in getImageData\r\n ? getImageData[ORIGINAL_ATTRIBUTE_NAME]\r\n : getImageData;\r\n var pixelBuffer = new Uint32Array(originalGetImageData.call(ctx, x, y, Math.min(chunkSize, canvas.width - x), Math.min(chunkSize, canvas.height - y)).data.buffer);\r\n if (pixelBuffer.some(function (pixel) { return pixel !== 0; }))\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\n\nvar _id = 1;\r\nvar tagNameRegex = new RegExp('[^a-z0-9-_:]');\r\nvar IGNORED_NODE = -2;\r\nfunction genId() {\r\n return _id++;\r\n}\r\nfunction getValidTagName(element) {\r\n if (element instanceof HTMLFormElement) {\r\n return 'form';\r\n }\r\n var processedTagName = element.tagName.toLowerCase().trim();\r\n if (tagNameRegex.test(processedTagName)) {\r\n return 'div';\r\n }\r\n return processedTagName;\r\n}\r\nfunction stringifyStyleSheet(sheet) {\r\n return sheet.cssRules\r\n ? Array.from(sheet.cssRules)\r\n .map(function (rule) { return rule.cssText || ''; })\r\n .join('')\r\n : '';\r\n}\r\nfunction extractOrigin(url) {\r\n var origin = '';\r\n if (url.indexOf('//') > -1) {\r\n origin = url.split('/').slice(0, 3).join('/');\r\n }\r\n else {\r\n origin = url.split('/')[0];\r\n }\r\n origin = origin.split('?')[0];\r\n return origin;\r\n}\r\nvar canvasService;\r\nvar canvasCtx;\r\nvar URL_IN_CSS_REF = /url\\((?:(')([^']*)'|(\")(.*?)\"|([^)]*))\\)/gm;\r\nvar RELATIVE_PATH = /^(?!www\\.|(?:http|ftp)s?:\\/\\/|[A-Za-z]:\\\\|\\/\\/|#).*/;\r\nvar DATA_URI = /^(data:)([^,]*),(.*)/i;\r\nfunction absoluteToStylesheet(cssText, href) {\r\n return (cssText || '').replace(URL_IN_CSS_REF, function (origin, quote1, path1, quote2, path2, path3) {\r\n var filePath = path1 || path2 || path3;\r\n var maybeQuote = quote1 || quote2 || '';\r\n if (!filePath) {\r\n return origin;\r\n }\r\n if (!RELATIVE_PATH.test(filePath)) {\r\n return \"url(\".concat(maybeQuote).concat(filePath).concat(maybeQuote, \")\");\r\n }\r\n if (DATA_URI.test(filePath)) {\r\n return \"url(\".concat(maybeQuote).concat(filePath).concat(maybeQuote, \")\");\r\n }\r\n if (filePath[0] === '/') {\r\n return \"url(\".concat(maybeQuote).concat(extractOrigin(href) + filePath).concat(maybeQuote, \")\");\r\n }\r\n var stack = href.split('/');\r\n var parts = filePath.split('/');\r\n stack.pop();\r\n for (var _i = 0, parts_1 = parts; _i < parts_1.length; _i++) {\r\n var part = parts_1[_i];\r\n if (part === '.') {\r\n continue;\r\n }\r\n else if (part === '..') {\r\n stack.pop();\r\n }\r\n else {\r\n stack.push(part);\r\n }\r\n }\r\n return \"url(\".concat(maybeQuote).concat(stack.join('/')).concat(maybeQuote, \")\");\r\n });\r\n}\r\nvar SRCSET_NOT_SPACES = /^[^ \\t\\n\\r\\u000c]+/;\r\nvar SRCSET_COMMAS_OR_SPACES = /^[, \\t\\n\\r\\u000c]+/;\r\nfunction getAbsoluteSrcsetString(doc, attributeValue) {\r\n if (attributeValue.trim() === '') {\r\n return attributeValue;\r\n }\r\n var pos = 0;\r\n function collectCharacters(regEx) {\r\n var chars;\r\n var match = regEx.exec(attributeValue.substring(pos));\r\n if (match) {\r\n chars = match[0];\r\n pos += chars.length;\r\n return chars;\r\n }\r\n return '';\r\n }\r\n var output = [];\r\n while (true) {\r\n collectCharacters(SRCSET_COMMAS_OR_SPACES);\r\n if (pos >= attributeValue.length) {\r\n break;\r\n }\r\n var url = collectCharacters(SRCSET_NOT_SPACES);\r\n if (url.slice(-1) === ',') {\r\n url = absoluteToDoc(doc, url.substring(0, url.length - 1));\r\n output.push(url);\r\n }\r\n else {\r\n var descriptorsStr = '';\r\n url = absoluteToDoc(doc, url);\r\n var inParens = false;\r\n while (true) {\r\n var c = attributeValue.charAt(pos);\r\n if (c === '') {\r\n output.push((url + descriptorsStr).trim());\r\n break;\r\n }\r\n else if (!inParens) {\r\n if (c === ',') {\r\n pos += 1;\r\n output.push((url + descriptorsStr).trim());\r\n break;\r\n }\r\n else if (c === '(') {\r\n inParens = true;\r\n }\r\n }\r\n else {\r\n if (c === ')') {\r\n inParens = false;\r\n }\r\n }\r\n descriptorsStr += c;\r\n pos += 1;\r\n }\r\n }\r\n }\r\n return output.join(', ');\r\n}\r\nfunction absoluteToDoc(doc, attributeValue) {\r\n if (!attributeValue || attributeValue.trim() === '') {\r\n return attributeValue;\r\n }\r\n var a = doc.createElement('a');\r\n a.href = attributeValue;\r\n return a.href;\r\n}\r\nfunction isSVGElement(el) {\r\n return Boolean(el.tagName === 'svg' || el.ownerSVGElement);\r\n}\r\nfunction getHref() {\r\n var a = document.createElement('a');\r\n a.href = '';\r\n return a.href;\r\n}\r\nfunction transformAttribute(doc, tagName, name, value) {\r\n if (name === 'src' ||\r\n (name === 'href' && value && !(tagName === 'use' && value[0] === '#'))) {\r\n return absoluteToDoc(doc, value);\r\n }\r\n else if (name === 'xlink:href' && value && value[0] !== '#') {\r\n return absoluteToDoc(doc, value);\r\n }\r\n else if (name === 'background' &&\r\n value &&\r\n (tagName === 'table' || tagName === 'td' || tagName === 'th')) {\r\n return absoluteToDoc(doc, value);\r\n }\r\n else if (name === 'srcset' && value) {\r\n return getAbsoluteSrcsetString(doc, value);\r\n }\r\n else if (name === 'style' && value) {\r\n return absoluteToStylesheet(value, getHref());\r\n }\r\n else if (tagName === 'object' && name === 'data' && value) {\r\n return absoluteToDoc(doc, value);\r\n }\r\n else {\r\n return value;\r\n }\r\n}\r\nfunction _isBlockedElement(element, blockClass, blockSelector) {\r\n if (typeof blockClass === 'string') {\r\n if (element.classList.contains(blockClass)) {\r\n return true;\r\n }\r\n }\r\n else {\r\n for (var eIndex = element.classList.length; eIndex--;) {\r\n var className = element.classList[eIndex];\r\n if (blockClass.test(className)) {\r\n return true;\r\n }\r\n }\r\n }\r\n if (blockSelector) {\r\n return element.matches(blockSelector);\r\n }\r\n return false;\r\n}\r\nfunction classMatchesRegex(node, regex, checkAncestors) {\r\n if (!node)\r\n return false;\r\n if (node.nodeType !== node.ELEMENT_NODE) {\r\n if (!checkAncestors)\r\n return false;\r\n return classMatchesRegex(node.parentNode, regex, checkAncestors);\r\n }\r\n for (var eIndex = node.classList.length; eIndex--;) {\r\n var className = node.classList[eIndex];\r\n if (regex.test(className)) {\r\n return true;\r\n }\r\n }\r\n if (!checkAncestors)\r\n return false;\r\n return classMatchesRegex(node.parentNode, regex, checkAncestors);\r\n}\r\nfunction needMaskingText(node, maskTextClass, maskTextSelector) {\r\n var el = node.nodeType === node.ELEMENT_NODE\r\n ? node\r\n : node.parentElement;\r\n if (el === null)\r\n return false;\r\n if (typeof maskTextClass === 'string') {\r\n if (el.classList.contains(maskTextClass))\r\n return true;\r\n if (el.closest(\".\".concat(maskTextClass)))\r\n return true;\r\n }\r\n else {\r\n if (classMatchesRegex(el, maskTextClass, true))\r\n return true;\r\n }\r\n if (maskTextSelector) {\r\n if (el.matches(maskTextSelector))\r\n return true;\r\n if (el.closest(maskTextSelector))\r\n return true;\r\n }\r\n return false;\r\n}\r\nfunction onceIframeLoaded(iframeEl, listener, iframeLoadTimeout) {\r\n var win = iframeEl.contentWindow;\r\n if (!win) {\r\n return;\r\n }\r\n var fired = false;\r\n var readyState;\r\n try {\r\n readyState = win.document.readyState;\r\n }\r\n catch (error) {\r\n return;\r\n }\r\n if (readyState !== 'complete') {\r\n var timer_1 = setTimeout(function () {\r\n if (!fired) {\r\n listener();\r\n fired = true;\r\n }\r\n }, iframeLoadTimeout);\r\n iframeEl.addEventListener('load', function () {\r\n clearTimeout(timer_1);\r\n fired = true;\r\n listener();\r\n });\r\n return;\r\n }\r\n var blankUrl = 'about:blank';\r\n if (win.location.href !== blankUrl ||\r\n iframeEl.src === blankUrl ||\r\n iframeEl.src === '') {\r\n setTimeout(listener, 0);\r\n return iframeEl.addEventListener('load', listener);\r\n }\r\n iframeEl.addEventListener('load', listener);\r\n}\r\nfunction onceStylesheetLoaded(link, listener, styleSheetLoadTimeout) {\r\n var fired = false;\r\n var styleSheetLoaded;\r\n try {\r\n styleSheetLoaded = link.sheet;\r\n }\r\n catch (error) {\r\n return;\r\n }\r\n if (styleSheetLoaded)\r\n return;\r\n var timer = setTimeout(function () {\r\n if (!fired) {\r\n listener();\r\n fired = true;\r\n }\r\n }, styleSheetLoadTimeout);\r\n link.addEventListener('load', function () {\r\n clearTimeout(timer);\r\n fired = true;\r\n listener();\r\n });\r\n}\r\nfunction serializeNode(n, options) {\r\n var doc = options.doc, mirror = options.mirror, blockClass = options.blockClass, blockSelector = options.blockSelector, maskTextClass = options.maskTextClass, maskTextSelector = options.maskTextSelector, inlineStylesheet = options.inlineStylesheet, _a = options.maskInputOptions, maskInputOptions = _a === void 0 ? {} : _a, maskTextFn = options.maskTextFn, maskInputFn = options.maskInputFn, _b = options.dataURLOptions, dataURLOptions = _b === void 0 ? {} : _b, inlineImages = options.inlineImages, recordCanvas = options.recordCanvas, keepIframeSrcFn = options.keepIframeSrcFn, _c = options.newlyAddedElement, newlyAddedElement = _c === void 0 ? false : _c;\r\n var rootId = getRootId(doc, mirror);\r\n switch (n.nodeType) {\r\n case n.DOCUMENT_NODE:\r\n if (n.compatMode !== 'CSS1Compat') {\r\n return {\r\n type: NodeType.Document,\r\n childNodes: [],\r\n compatMode: n.compatMode\r\n };\r\n }\r\n else {\r\n return {\r\n type: NodeType.Document,\r\n childNodes: []\r\n };\r\n }\r\n case n.DOCUMENT_TYPE_NODE:\r\n return {\r\n type: NodeType.DocumentType,\r\n name: n.name,\r\n publicId: n.publicId,\r\n systemId: n.systemId,\r\n rootId: rootId\r\n };\r\n case n.ELEMENT_NODE:\r\n return serializeElementNode(n, {\r\n doc: doc,\r\n blockClass: blockClass,\r\n blockSelector: blockSelector,\r\n inlineStylesheet: inlineStylesheet,\r\n maskInputOptions: maskInputOptions,\r\n maskInputFn: maskInputFn,\r\n dataURLOptions: dataURLOptions,\r\n inlineImages: inlineImages,\r\n recordCanvas: recordCanvas,\r\n keepIframeSrcFn: keepIframeSrcFn,\r\n newlyAddedElement: newlyAddedElement,\r\n rootId: rootId\r\n });\r\n case n.TEXT_NODE:\r\n return serializeTextNode(n, {\r\n maskTextClass: maskTextClass,\r\n maskTextSelector: maskTextSelector,\r\n maskTextFn: maskTextFn,\r\n rootId: rootId\r\n });\r\n case n.CDATA_SECTION_NODE:\r\n return {\r\n type: NodeType.CDATA,\r\n textContent: '',\r\n rootId: rootId\r\n };\r\n case n.COMMENT_NODE:\r\n return {\r\n type: NodeType.Comment,\r\n textContent: n.textContent || '',\r\n rootId: rootId\r\n };\r\n default:\r\n return false;\r\n }\r\n}\r\nfunction getRootId(doc, mirror) {\r\n if (!mirror.hasNode(doc))\r\n return undefined;\r\n var docId = mirror.getId(doc);\r\n return docId === 1 ? undefined : docId;\r\n}\r\nfunction serializeTextNode(n, options) {\r\n var _a;\r\n var maskTextClass = options.maskTextClass, maskTextSelector = options.maskTextSelector, maskTextFn = options.maskTextFn, rootId = options.rootId;\r\n var parentTagName = n.parentNode && n.parentNode.tagName;\r\n var textContent = n.textContent;\r\n var isStyle = parentTagName === 'STYLE' ? true : undefined;\r\n var isScript = parentTagName === 'SCRIPT' ? true : undefined;\r\n if (isStyle && textContent) {\r\n try {\r\n if (n.nextSibling || n.previousSibling) {\r\n }\r\n else if ((_a = n.parentNode.sheet) === null || _a === void 0 ? void 0 : _a.cssRules) {\r\n textContent = stringifyStyleSheet(n.parentNode.sheet);\r\n }\r\n }\r\n catch (err) {\r\n console.warn(\"Cannot get CSS styles from text's parentNode. Error: \".concat(err), n);\r\n }\r\n textContent = absoluteToStylesheet(textContent, getHref());\r\n }\r\n if (isScript) {\r\n textContent = 'SCRIPT_PLACEHOLDER';\r\n }\r\n if (!isStyle &&\r\n !isScript &&\r\n textContent &&\r\n needMaskingText(n, maskTextClass, maskTextSelector)) {\r\n textContent = maskTextFn\r\n ? maskTextFn(textContent)\r\n : textContent.replace(/[\\S]/g, '*');\r\n }\r\n return {\r\n type: NodeType.Text,\r\n textContent: textContent || '',\r\n isStyle: isStyle,\r\n rootId: rootId\r\n };\r\n}\r\nfunction serializeElementNode(n, options) {\r\n var doc = options.doc, blockClass = options.blockClass, blockSelector = options.blockSelector, inlineStylesheet = options.inlineStylesheet, _a = options.maskInputOptions, maskInputOptions = _a === void 0 ? {} : _a, maskInputFn = options.maskInputFn, _b = options.dataURLOptions, dataURLOptions = _b === void 0 ? {} : _b, inlineImages = options.inlineImages, recordCanvas = options.recordCanvas, keepIframeSrcFn = options.keepIframeSrcFn, _c = options.newlyAddedElement, newlyAddedElement = _c === void 0 ? false : _c, rootId = options.rootId;\r\n var needBlock = _isBlockedElement(n, blockClass, blockSelector);\r\n var tagName = getValidTagName(n);\r\n var attributes = {};\r\n var len = n.attributes.length;\r\n for (var i = 0; i < len; i++) {\r\n var attr = n.attributes[i];\r\n attributes[attr.name] = transformAttribute(doc, tagName, attr.name, attr.value);\r\n }\r\n if (tagName === 'link' && inlineStylesheet) {\r\n var stylesheet = Array.from(doc.styleSheets).find(function (s) {\r\n return s.href === n.href;\r\n });\r\n var cssText = null;\r\n if (stylesheet) {\r\n cssText = getCssRulesString(stylesheet);\r\n }\r\n if (cssText) {\r\n delete attributes.rel;\r\n delete attributes.href;\r\n attributes._cssText = absoluteToStylesheet(cssText, stylesheet.href);\r\n }\r\n }\r\n if (tagName === 'style' &&\r\n n.sheet &&\r\n !(n.innerText || n.textContent || '').trim().length) {\r\n var cssText = getCssRulesString(n.sheet);\r\n if (cssText) {\r\n attributes._cssText = absoluteToStylesheet(cssText, getHref());\r\n }\r\n }\r\n if (tagName === 'input' || tagName === 'textarea' || tagName === 'select') {\r\n var value = n.value;\r\n var checked = n.checked;\r\n if (attributes.type !== 'radio' &&\r\n attributes.type !== 'checkbox' &&\r\n attributes.type !== 'submit' &&\r\n attributes.type !== 'button' &&\r\n value) {\r\n attributes.value = maskInputValue({\r\n type: attributes.type,\r\n tagName: tagName,\r\n value: value,\r\n maskInputOptions: maskInputOptions,\r\n maskInputFn: maskInputFn\r\n });\r\n }\r\n else if (checked) {\r\n attributes.checked = checked;\r\n }\r\n }\r\n if (tagName === 'option') {\r\n if (n.selected && !maskInputOptions['select']) {\r\n attributes.selected = true;\r\n }\r\n else {\r\n delete attributes.selected;\r\n }\r\n }\r\n if (tagName === 'canvas' && recordCanvas) {\r\n if (n.__context === '2d') {\r\n if (!is2DCanvasBlank(n)) {\r\n attributes.rr_dataURL = n.toDataURL(dataURLOptions.type, dataURLOptions.quality);\r\n }\r\n }\r\n else if (!('__context' in n)) {\r\n var canvasDataURL = n.toDataURL(dataURLOptions.type, dataURLOptions.quality);\r\n var blankCanvas = document.createElement('canvas');\r\n blankCanvas.width = n.width;\r\n blankCanvas.height = n.height;\r\n var blankCanvasDataURL = blankCanvas.toDataURL(dataURLOptions.type, dataURLOptions.quality);\r\n if (canvasDataURL !== blankCanvasDataURL) {\r\n attributes.rr_dataURL = canvasDataURL;\r\n }\r\n }\r\n }\r\n if (tagName === 'img' && inlineImages) {\r\n if (!canvasService) {\r\n canvasService = doc.createElement('canvas');\r\n canvasCtx = canvasService.getContext('2d');\r\n }\r\n var image_1 = n;\r\n var oldValue_1 = image_1.crossOrigin;\r\n image_1.crossOrigin = 'anonymous';\r\n var recordInlineImage = function () {\r\n try {\r\n canvasService.width = image_1.naturalWidth;\r\n canvasService.height = image_1.naturalHeight;\r\n canvasCtx.drawImage(image_1, 0, 0);\r\n attributes.rr_dataURL = canvasService.toDataURL(dataURLOptions.type, dataURLOptions.quality);\r\n }\r\n catch (err) {\r\n console.warn(\"Cannot inline img src=\".concat(image_1.currentSrc, \"! Error: \").concat(err));\r\n }\r\n oldValue_1\r\n ? (attributes.crossOrigin = oldValue_1)\r\n : image_1.removeAttribute('crossorigin');\r\n };\r\n if (image_1.complete && image_1.naturalWidth !== 0)\r\n recordInlineImage();\r\n else\r\n image_1.onload = recordInlineImage;\r\n }\r\n if (tagName === 'audio' || tagName === 'video') {\r\n attributes.rr_mediaState = n.paused\r\n ? 'paused'\r\n : 'played';\r\n attributes.rr_mediaCurrentTime = n.currentTime;\r\n }\r\n if (!newlyAddedElement) {\r\n if (n.scrollLeft) {\r\n attributes.rr_scrollLeft = n.scrollLeft;\r\n }\r\n if (n.scrollTop) {\r\n attributes.rr_scrollTop = n.scrollTop;\r\n }\r\n }\r\n if (needBlock) {\r\n var _d = n.getBoundingClientRect(), width = _d.width, height = _d.height;\r\n attributes = {\r\n \"class\": attributes[\"class\"],\r\n rr_width: \"\".concat(width, \"px\"),\r\n rr_height: \"\".concat(height, \"px\")\r\n };\r\n }\r\n if (tagName === 'iframe' && !keepIframeSrcFn(attributes.src)) {\r\n if (!n.contentDocument) {\r\n attributes.rr_src = attributes.src;\r\n }\r\n delete attributes.src;\r\n }\r\n return {\r\n type: NodeType.Element,\r\n tagName: tagName,\r\n attributes: attributes,\r\n childNodes: [],\r\n isSVG: isSVGElement(n) || undefined,\r\n needBlock: needBlock,\r\n rootId: rootId\r\n };\r\n}\r\nfunction lowerIfExists(maybeAttr) {\r\n if (maybeAttr === undefined) {\r\n return '';\r\n }\r\n else {\r\n return maybeAttr.toLowerCase();\r\n }\r\n}\r\nfunction slimDOMExcluded(sn, slimDOMOptions) {\r\n if (slimDOMOptions.comment && sn.type === NodeType.Comment) {\r\n return true;\r\n }\r\n else if (sn.type === NodeType.Element) {\r\n if (slimDOMOptions.script &&\r\n (sn.tagName === 'script' ||\r\n (sn.tagName === 'link' &&\r\n sn.attributes.rel === 'preload' &&\r\n sn.attributes.as === 'script') ||\r\n (sn.tagName === 'link' &&\r\n sn.attributes.rel === 'prefetch' &&\r\n typeof sn.attributes.href === 'string' &&\r\n sn.attributes.href.endsWith('.js')))) {\r\n return true;\r\n }\r\n else if (slimDOMOptions.headFavicon &&\r\n ((sn.tagName === 'link' && sn.attributes.rel === 'shortcut icon') ||\r\n (sn.tagName === 'meta' &&\r\n (lowerIfExists(sn.attributes.name).match(/^msapplication-tile(image|color)$/) ||\r\n lowerIfExists(sn.attributes.name) === 'application-name' ||\r\n lowerIfExists(sn.attributes.rel) === 'icon' ||\r\n lowerIfExists(sn.attributes.rel) === 'apple-touch-icon' ||\r\n lowerIfExists(sn.attributes.rel) === 'shortcut icon')))) {\r\n return true;\r\n }\r\n else if (sn.tagName === 'meta') {\r\n if (slimDOMOptions.headMetaDescKeywords &&\r\n lowerIfExists(sn.attributes.name).match(/^description|keywords$/)) {\r\n return true;\r\n }\r\n else if (slimDOMOptions.headMetaSocial &&\r\n (lowerIfExists(sn.attributes.property).match(/^(og|twitter|fb):/) ||\r\n lowerIfExists(sn.attributes.name).match(/^(og|twitter):/) ||\r\n lowerIfExists(sn.attributes.name) === 'pinterest')) {\r\n return true;\r\n }\r\n else if (slimDOMOptions.headMetaRobots &&\r\n (lowerIfExists(sn.attributes.name) === 'robots' ||\r\n lowerIfExists(sn.attributes.name) === 'googlebot' ||\r\n lowerIfExists(sn.attributes.name) === 'bingbot')) {\r\n return true;\r\n }\r\n else if (slimDOMOptions.headMetaHttpEquiv &&\r\n sn.attributes['http-equiv'] !== undefined) {\r\n return true;\r\n }\r\n else if (slimDOMOptions.headMetaAuthorship &&\r\n (lowerIfExists(sn.attributes.name) === 'author' ||\r\n lowerIfExists(sn.attributes.name) === 'generator' ||\r\n lowerIfExists(sn.attributes.name) === 'framework' ||\r\n lowerIfExists(sn.attributes.name) === 'publisher' ||\r\n lowerIfExists(sn.attributes.name) === 'progid' ||\r\n lowerIfExists(sn.attributes.property).match(/^article:/) ||\r\n lowerIfExists(sn.attributes.property).match(/^product:/))) {\r\n return true;\r\n }\r\n else if (slimDOMOptions.headMetaVerification &&\r\n (lowerIfExists(sn.attributes.name) === 'google-site-verification' ||\r\n lowerIfExists(sn.attributes.name) === 'yandex-verification' ||\r\n lowerIfExists(sn.attributes.name) === 'csrf-token' ||\r\n lowerIfExists(sn.attributes.name) === 'p:domain_verify' ||\r\n lowerIfExists(sn.attributes.name) === 'verify-v1' ||\r\n lowerIfExists(sn.attributes.name) === 'verification' ||\r\n lowerIfExists(sn.attributes.name) === 'shopify-checkout-api-token')) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\nfunction serializeNodeWithId(n, options) {\r\n var doc = options.doc, mirror = options.mirror, blockClass = options.blockClass, blockSelector = options.blockSelector, maskTextClass = options.maskTextClass, maskTextSelector = options.maskTextSelector, _a = options.skipChild, skipChild = _a === void 0 ? false : _a, _b = options.inlineStylesheet, inlineStylesheet = _b === void 0 ? true : _b, _c = options.maskInputOptions, maskInputOptions = _c === void 0 ? {} : _c, maskTextFn = options.maskTextFn, maskInputFn = options.maskInputFn, slimDOMOptions = options.slimDOMOptions, _d = options.dataURLOptions, dataURLOptions = _d === void 0 ? {} : _d, _e = options.inlineImages, inlineImages = _e === void 0 ? false : _e, _f = options.recordCanvas, recordCanvas = _f === void 0 ? false : _f, onSerialize = options.onSerialize, onIframeLoad = options.onIframeLoad, _g = options.iframeLoadTimeout, iframeLoadTimeout = _g === void 0 ? 5000 : _g, onStylesheetLoad = options.onStylesheetLoad, _h = options.stylesheetLoadTimeout, stylesheetLoadTimeout = _h === void 0 ? 5000 : _h, _j = options.keepIframeSrcFn, keepIframeSrcFn = _j === void 0 ? function () { return false; } : _j, _k = options.newlyAddedElement, newlyAddedElement = _k === void 0 ? false : _k;\r\n var _l = options.preserveWhiteSpace, preserveWhiteSpace = _l === void 0 ? true : _l;\r\n var _serializedNode = serializeNode(n, {\r\n doc: doc,\r\n mirror: mirror,\r\n blockClass: blockClass,\r\n blockSelector: blockSelector,\r\n maskTextClass: maskTextClass,\r\n maskTextSelector: maskTextSelector,\r\n inlineStylesheet: inlineStylesheet,\r\n maskInputOptions: maskInputOptions,\r\n maskTextFn: maskTextFn,\r\n maskInputFn: maskInputFn,\r\n dataURLOptions: dataURLOptions,\r\n inlineImages: inlineImages,\r\n recordCanvas: recordCanvas,\r\n keepIframeSrcFn: keepIframeSrcFn,\r\n newlyAddedElement: newlyAddedElement\r\n });\r\n if (!_serializedNode) {\r\n console.warn(n, 'not serialized');\r\n return null;\r\n }\r\n var id;\r\n if (mirror.hasNode(n)) {\r\n id = mirror.getId(n);\r\n }\r\n else if (slimDOMExcluded(_serializedNode, slimDOMOptions) ||\r\n (!preserveWhiteSpace &&\r\n _serializedNode.type === NodeType.Text &&\r\n !_serializedNode.isStyle &&\r\n !_serializedNode.textContent.replace(/^\\s+|\\s+$/gm, '').length)) {\r\n id = IGNORED_NODE;\r\n }\r\n else {\r\n id = genId();\r\n }\r\n var serializedNode = Object.assign(_serializedNode, { id: id });\r\n mirror.add(n, serializedNode);\r\n if (id === IGNORED_NODE) {\r\n return null;\r\n }\r\n if (onSerialize) {\r\n onSerialize(n);\r\n }\r\n var recordChild = !skipChild;\r\n if (serializedNode.type === NodeType.Element) {\r\n recordChild = recordChild && !serializedNode.needBlock;\r\n delete serializedNode.needBlock;\r\n var shadowRoot = n.shadowRoot;\r\n if (shadowRoot && isNativeShadowDom(shadowRoot))\r\n serializedNode.isShadowHost = true;\r\n }\r\n if ((serializedNode.type === NodeType.Document ||\r\n serializedNode.type === NodeType.Element) &&\r\n recordChild) {\r\n if (slimDOMOptions.headWhitespace &&\r\n serializedNode.type === NodeType.Element &&\r\n serializedNode.tagName === 'head') {\r\n preserveWhiteSpace = false;\r\n }\r\n var bypassOptions = {\r\n doc: doc,\r\n mirror: mirror,\r\n blockClass: blockClass,\r\n blockSelector: blockSelector,\r\n maskTextClass: maskTextClass,\r\n maskTextSelector: maskTextSelector,\r\n skipChild: skipChild,\r\n inlineStylesheet: inlineStylesheet,\r\n maskInputOptions: maskInputOptions,\r\n maskTextFn: maskTextFn,\r\n maskInputFn: maskInputFn,\r\n slimDOMOptions: slimDOMOptions,\r\n dataURLOptions: dataURLOptions,\r\n inlineImages: inlineImages,\r\n recordCanvas: recordCanvas,\r\n preserveWhiteSpace: preserveWhiteSpace,\r\n onSerialize: onSerialize,\r\n onIframeLoad: onIframeLoad,\r\n iframeLoadTimeout: iframeLoadTimeout,\r\n onStylesheetLoad: onStylesheetLoad,\r\n stylesheetLoadTimeout: stylesheetLoadTimeout,\r\n keepIframeSrcFn: keepIframeSrcFn\r\n };\r\n for (var _i = 0, _m = Array.from(n.childNodes); _i < _m.length; _i++) {\r\n var childN = _m[_i];\r\n var serializedChildNode = serializeNodeWithId(childN, bypassOptions);\r\n if (serializedChildNode) {\r\n serializedNode.childNodes.push(serializedChildNode);\r\n }\r\n }\r\n if (isElement(n) && n.shadowRoot) {\r\n for (var _o = 0, _p = Array.from(n.shadowRoot.childNodes); _o < _p.length; _o++) {\r\n var childN = _p[_o];\r\n var serializedChildNode = serializeNodeWithId(childN, bypassOptions);\r\n if (serializedChildNode) {\r\n isNativeShadowDom(n.shadowRoot) &&\r\n (serializedChildNode.isShadow = true);\r\n serializedNode.childNodes.push(serializedChildNode);\r\n }\r\n }\r\n }\r\n }\r\n if (n.parentNode &&\r\n isShadowRoot(n.parentNode) &&\r\n isNativeShadowDom(n.parentNode)) {\r\n serializedNode.isShadow = true;\r\n }\r\n if (serializedNode.type === NodeType.Element &&\r\n serializedNode.tagName === 'iframe') {\r\n onceIframeLoaded(n, function () {\r\n var iframeDoc = n.contentDocument;\r\n if (iframeDoc && onIframeLoad) {\r\n var serializedIframeNode = serializeNodeWithId(iframeDoc, {\r\n doc: iframeDoc,\r\n mirror: mirror,\r\n blockClass: blockClass,\r\n blockSelector: blockSelector,\r\n maskTextClass: maskTextClass,\r\n maskTextSelector: maskTextSelector,\r\n skipChild: false,\r\n inlineStylesheet: inlineStylesheet,\r\n maskInputOptions: maskInputOptions,\r\n maskTextFn: maskTextFn,\r\n maskInputFn: maskInputFn,\r\n slimDOMOptions: slimDOMOptions,\r\n dataURLOptions: dataURLOptions,\r\n inlineImages: inlineImages,\r\n recordCanvas: recordCanvas,\r\n preserveWhiteSpace: preserveWhiteSpace,\r\n onSerialize: onSerialize,\r\n onIframeLoad: onIframeLoad,\r\n iframeLoadTimeout: iframeLoadTimeout,\r\n onStylesheetLoad: onStylesheetLoad,\r\n stylesheetLoadTimeout: stylesheetLoadTimeout,\r\n keepIframeSrcFn: keepIframeSrcFn\r\n });\r\n if (serializedIframeNode) {\r\n onIframeLoad(n, serializedIframeNode);\r\n }\r\n }\r\n }, iframeLoadTimeout);\r\n }\r\n if (serializedNode.type === NodeType.Element &&\r\n serializedNode.tagName === 'link' &&\r\n serializedNode.attributes.rel === 'stylesheet') {\r\n onceStylesheetLoaded(n, function () {\r\n if (onStylesheetLoad) {\r\n var serializedLinkNode = serializeNodeWithId(n, {\r\n doc: doc,\r\n mirror: mirror,\r\n blockClass: blockClass,\r\n blockSelector: blockSelector,\r\n maskTextClass: maskTextClass,\r\n maskTextSelector: maskTextSelector,\r\n skipChild: false,\r\n inlineStylesheet: inlineStylesheet,\r\n maskInputOptions: maskInputOptions,\r\n maskTextFn: maskTextFn,\r\n maskInputFn: maskInputFn,\r\n slimDOMOptions: slimDOMOptions,\r\n dataURLOptions: dataURLOptions,\r\n inlineImages: inlineImages,\r\n recordCanvas: recordCanvas,\r\n preserveWhiteSpace: preserveWhiteSpace,\r\n onSerialize: onSerialize,\r\n onIframeLoad: onIframeLoad,\r\n iframeLoadTimeout: iframeLoadTimeout,\r\n onStylesheetLoad: onStylesheetLoad,\r\n stylesheetLoadTimeout: stylesheetLoadTimeout,\r\n keepIframeSrcFn: keepIframeSrcFn\r\n });\r\n if (serializedLinkNode) {\r\n onStylesheetLoad(n, serializedLinkNode);\r\n }\r\n }\r\n }, stylesheetLoadTimeout);\r\n }\r\n return serializedNode;\r\n}\r\nfunction snapshot(n, options) {\r\n var _a = options || {}, _b = _a.mirror, mirror = _b === void 0 ? new Mirror() : _b, _c = _a.blockClass, blockClass = _c === void 0 ? 'rr-block' : _c, _d = _a.blockSelector, blockSelector = _d === void 0 ? null : _d, _e = _a.maskTextClass, maskTextClass = _e === void 0 ? 'rr-mask' : _e, _f = _a.maskTextSelector, maskTextSelector = _f === void 0 ? null : _f, _g = _a.inlineStylesheet, inlineStylesheet = _g === void 0 ? true : _g, _h = _a.inlineImages, inlineImages = _h === void 0 ? false : _h, _j = _a.recordCanvas, recordCanvas = _j === void 0 ? false : _j, _k = _a.maskAllInputs, maskAllInputs = _k === void 0 ? false : _k, maskTextFn = _a.maskTextFn, maskInputFn = _a.maskInputFn, _l = _a.slimDOM, slimDOM = _l === void 0 ? false : _l, dataURLOptions = _a.dataURLOptions, preserveWhiteSpace = _a.preserveWhiteSpace, onSerialize = _a.onSerialize, onIframeLoad = _a.onIframeLoad, iframeLoadTimeout = _a.iframeLoadTimeout, onStylesheetLoad = _a.onStylesheetLoad, stylesheetLoadTimeout = _a.stylesheetLoadTimeout, _m = _a.keepIframeSrcFn, keepIframeSrcFn = _m === void 0 ? function () { return false; } : _m;\r\n var maskInputOptions = maskAllInputs === true\r\n ? {\r\n color: true,\r\n date: true,\r\n 'datetime-local': true,\r\n email: true,\r\n month: true,\r\n number: true,\r\n range: true,\r\n search: true,\r\n tel: true,\r\n text: true,\r\n time: true,\r\n url: true,\r\n week: true,\r\n textarea: true,\r\n select: true,\r\n password: true\r\n }\r\n : maskAllInputs === false\r\n ? {\r\n password: true\r\n }\r\n : maskAllInputs;\r\n var slimDOMOptions = slimDOM === true || slimDOM === 'all'\r\n ?\r\n {\r\n script: true,\r\n comment: true,\r\n headFavicon: true,\r\n headWhitespace: true,\r\n headMetaDescKeywords: slimDOM === 'all',\r\n headMetaSocial: true,\r\n headMetaRobots: true,\r\n headMetaHttpEquiv: true,\r\n headMetaAuthorship: true,\r\n headMetaVerification: true\r\n }\r\n : slimDOM === false\r\n ? {}\r\n : slimDOM;\r\n return serializeNodeWithId(n, {\r\n doc: n,\r\n mirror: mirror,\r\n blockClass: blockClass,\r\n blockSelector: blockSelector,\r\n maskTextClass: maskTextClass,\r\n maskTextSelector: maskTextSelector,\r\n skipChild: false,\r\n inlineStylesheet: inlineStylesheet,\r\n maskInputOptions: maskInputOptions,\r\n maskTextFn: maskTextFn,\r\n maskInputFn: maskInputFn,\r\n slimDOMOptions: slimDOMOptions,\r\n dataURLOptions: dataURLOptions,\r\n inlineImages: inlineImages,\r\n recordCanvas: recordCanvas,\r\n preserveWhiteSpace: preserveWhiteSpace,\r\n onSerialize: onSerialize,\r\n onIframeLoad: onIframeLoad,\r\n iframeLoadTimeout: iframeLoadTimeout,\r\n onStylesheetLoad: onStylesheetLoad,\r\n stylesheetLoadTimeout: stylesheetLoadTimeout,\r\n keepIframeSrcFn: keepIframeSrcFn,\r\n newlyAddedElement: false\r\n });\r\n}\r\n\nvar commentre = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//g;\r\nfunction parse(css, options) {\r\n if (options === void 0) { options = {}; }\r\n var lineno = 1;\r\n var column = 1;\r\n function updatePosition(str) {\r\n var lines = str.match(/\\n/g);\r\n if (lines) {\r\n lineno += lines.length;\r\n }\r\n var i = str.lastIndexOf('\\n');\r\n column = i === -1 ? column + str.length : str.length - i;\r\n }\r\n function position() {\r\n var start = { line: lineno, column: column };\r\n return function (node) {\r\n node.position = new Position(start);\r\n whitespace();\r\n return node;\r\n };\r\n }\r\n var Position = (function () {\r\n function Position(start) {\r\n this.start = start;\r\n this.end = { line: lineno, column: column };\r\n this.source = options.source;\r\n }\r\n return Position;\r\n }());\r\n Position.prototype.content = css;\r\n var errorsList = [];\r\n function error(msg) {\r\n var err = new Error(\"\".concat(options.source || '', \":\").concat(lineno, \":\").concat(column, \": \").concat(msg));\r\n err.reason = msg;\r\n err.filename = options.source;\r\n err.line = lineno;\r\n err.column = column;\r\n err.source = css;\r\n if (options.silent) {\r\n errorsList.push(err);\r\n }\r\n else {\r\n throw err;\r\n }\r\n }\r\n function stylesheet() {\r\n var rulesList = rules();\r\n return {\r\n type: 'stylesheet',\r\n stylesheet: {\r\n source: options.source,\r\n rules: rulesList,\r\n parsingErrors: errorsList\r\n }\r\n };\r\n }\r\n function open() {\r\n return match(/^{\\s*/);\r\n }\r\n function close() {\r\n return match(/^}/);\r\n }\r\n function rules() {\r\n var node;\r\n var rules = [];\r\n whitespace();\r\n comments(rules);\r\n while (css.length && css.charAt(0) !== '}' && (node = atrule() || rule())) {\r\n if (node !== false) {\r\n rules.push(node);\r\n comments(rules);\r\n }\r\n }\r\n return rules;\r\n }\r\n function match(re) {\r\n var m = re.exec(css);\r\n if (!m) {\r\n return;\r\n }\r\n var str = m[0];\r\n updatePosition(str);\r\n css = css.slice(str.length);\r\n return m;\r\n }\r\n function whitespace() {\r\n match(/^\\s*/);\r\n }\r\n function comments(rules) {\r\n if (rules === void 0) { rules = []; }\r\n var c;\r\n while ((c = comment())) {\r\n if (c !== false) {\r\n rules.push(c);\r\n }\r\n c = comment();\r\n }\r\n return rules;\r\n }\r\n function comment() {\r\n var pos = position();\r\n if ('/' !== css.charAt(0) || '*' !== css.charAt(1)) {\r\n return;\r\n }\r\n var i = 2;\r\n while ('' !== css.charAt(i) &&\r\n ('*' !== css.charAt(i) || '/' !== css.charAt(i + 1))) {\r\n ++i;\r\n }\r\n i += 2;\r\n if ('' === css.charAt(i - 1)) {\r\n return error('End of comment missing');\r\n }\r\n var str = css.slice(2, i - 2);\r\n column += 2;\r\n updatePosition(str);\r\n css = css.slice(i);\r\n column += 2;\r\n return pos({\r\n type: 'comment',\r\n comment: str\r\n });\r\n }\r\n function selector() {\r\n var m = match(/^([^{]+)/);\r\n if (!m) {\r\n return;\r\n }\r\n return trim(m[0])\r\n .replace(/\\/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*\\/+/g, '')\r\n .replace(/\"(?:\\\\\"|[^\"])*\"|'(?:\\\\'|[^'])*'/g, function (m) {\r\n return m.replace(/,/g, '\\u200C');\r\n })\r\n .split(/\\s*(?![^(]*\\)),\\s*/)\r\n .map(function (s) {\r\n return s.replace(/\\u200C/g, ',');\r\n });\r\n }\r\n function declaration() {\r\n var pos = position();\r\n var propMatch = match(/^(\\*?[-#\\/\\*\\\\\\w]+(\\[[0-9a-z_-]+\\])?)\\s*/);\r\n if (!propMatch) {\r\n return;\r\n }\r\n var prop = trim(propMatch[0]);\r\n if (!match(/^:\\s*/)) {\r\n return error(\"property missing ':'\");\r\n }\r\n var val = match(/^((?:'(?:\\\\'|.)*?'|\"(?:\\\\\"|.)*?\"|\\([^\\)]*?\\)|[^};])+)/);\r\n var ret = pos({\r\n type: 'declaration',\r\n property: prop.replace(commentre, ''),\r\n value: val ? trim(val[0]).replace(commentre, '') : ''\r\n });\r\n match(/^[;\\s]*/);\r\n return ret;\r\n }\r\n function declarations() {\r\n var decls = [];\r\n if (!open()) {\r\n return error(\"missing '{'\");\r\n }\r\n comments(decls);\r\n var decl;\r\n while ((decl = declaration())) {\r\n if (decl !== false) {\r\n decls.push(decl);\r\n comments(decls);\r\n }\r\n decl = declaration();\r\n }\r\n if (!close()) {\r\n return error(\"missing '}'\");\r\n }\r\n return decls;\r\n }\r\n function keyframe() {\r\n var m;\r\n var vals = [];\r\n var pos = position();\r\n while ((m = match(/^((\\d+\\.\\d+|\\.\\d+|\\d+)%?|[a-z]+)\\s*/))) {\r\n vals.push(m[1]);\r\n match(/^,\\s*/);\r\n }\r\n if (!vals.length) {\r\n return;\r\n }\r\n return pos({\r\n type: 'keyframe',\r\n values: vals,\r\n declarations: declarations()\r\n });\r\n }\r\n function atkeyframes() {\r\n var pos = position();\r\n var m = match(/^@([-\\w]+)?keyframes\\s*/);\r\n if (!m) {\r\n return;\r\n }\r\n var vendor = m[1];\r\n m = match(/^([-\\w]+)\\s*/);\r\n if (!m) {\r\n return error('@keyframes missing name');\r\n }\r\n var name = m[1];\r\n if (!open()) {\r\n return error(\"@keyframes missing '{'\");\r\n }\r\n var frame;\r\n var frames = comments();\r\n while ((frame = keyframe())) {\r\n frames.push(frame);\r\n frames = frames.concat(comments());\r\n }\r\n if (!close()) {\r\n return error(\"@keyframes missing '}'\");\r\n }\r\n return pos({\r\n type: 'keyframes',\r\n name: name,\r\n vendor: vendor,\r\n keyframes: frames\r\n });\r\n }\r\n function atsupports() {\r\n var pos = position();\r\n var m = match(/^@supports *([^{]+)/);\r\n if (!m) {\r\n return;\r\n }\r\n var supports = trim(m[1]);\r\n if (!open()) {\r\n return error(\"@supports missing '{'\");\r\n }\r\n var style = comments().concat(rules());\r\n if (!close()) {\r\n return error(\"@supports missing '}'\");\r\n }\r\n return pos({\r\n type: 'supports',\r\n supports: supports,\r\n rules: style\r\n });\r\n }\r\n function athost() {\r\n var pos = position();\r\n var m = match(/^@host\\s*/);\r\n if (!m) {\r\n return;\r\n }\r\n if (!open()) {\r\n return error(\"@host missing '{'\");\r\n }\r\n var style = comments().concat(rules());\r\n if (!close()) {\r\n return error(\"@host missing '}'\");\r\n }\r\n return pos({\r\n type: 'host',\r\n rules: style\r\n });\r\n }\r\n function atmedia() {\r\n var pos = position();\r\n var m = match(/^@media *([^{]+)/);\r\n if (!m) {\r\n return;\r\n }\r\n var media = trim(m[1]);\r\n if (!open()) {\r\n return error(\"@media missing '{'\");\r\n }\r\n var style = comments().concat(rules());\r\n if (!close()) {\r\n return error(\"@media missing '}'\");\r\n }\r\n return pos({\r\n type: 'media',\r\n media: media,\r\n rules: style\r\n });\r\n }\r\n function atcustommedia() {\r\n var pos = position();\r\n var m = match(/^@custom-media\\s+(--[^\\s]+)\\s*([^{;]+);/);\r\n if (!m) {\r\n return;\r\n }\r\n return pos({\r\n type: 'custom-media',\r\n name: trim(m[1]),\r\n media: trim(m[2])\r\n });\r\n }\r\n function atpage() {\r\n var pos = position();\r\n var m = match(/^@page */);\r\n if (!m) {\r\n return;\r\n }\r\n var sel = selector() || [];\r\n if (!open()) {\r\n return error(\"@page missing '{'\");\r\n }\r\n var decls = comments();\r\n var decl;\r\n while ((decl = declaration())) {\r\n decls.push(decl);\r\n decls = decls.concat(comments());\r\n }\r\n if (!close()) {\r\n return error(\"@page missing '}'\");\r\n }\r\n return pos({\r\n type: 'page',\r\n selectors: sel,\r\n declarations: decls\r\n });\r\n }\r\n function atdocument() {\r\n var pos = position();\r\n var m = match(/^@([-\\w]+)?document *([^{]+)/);\r\n if (!m) {\r\n return;\r\n }\r\n var vendor = trim(m[1]);\r\n var doc = trim(m[2]);\r\n if (!open()) {\r\n return error(\"@document missing '{'\");\r\n }\r\n var style = comments().concat(rules());\r\n if (!close()) {\r\n return error(\"@document missing '}'\");\r\n }\r\n return pos({\r\n type: 'document',\r\n document: doc,\r\n vendor: vendor,\r\n rules: style\r\n });\r\n }\r\n function atfontface() {\r\n var pos = position();\r\n var m = match(/^@font-face\\s*/);\r\n if (!m) {\r\n return;\r\n }\r\n if (!open()) {\r\n return error(\"@font-face missing '{'\");\r\n }\r\n var decls = comments();\r\n var decl;\r\n while ((decl = declaration())) {\r\n decls.push(decl);\r\n decls = decls.concat(comments());\r\n }\r\n if (!close()) {\r\n return error(\"@font-face missing '}'\");\r\n }\r\n return pos({\r\n type: 'font-face',\r\n declarations: decls\r\n });\r\n }\r\n var atimport = _compileAtrule('import');\r\n var atcharset = _compileAtrule('charset');\r\n var atnamespace = _compileAtrule('namespace');\r\n function _compileAtrule(name) {\r\n var re = new RegExp('^@' + name + '\\\\s*([^;]+);');\r\n return function () {\r\n var pos = position();\r\n var m = match(re);\r\n if (!m) {\r\n return;\r\n }\r\n var ret = { type: name };\r\n ret[name] = m[1].trim();\r\n return pos(ret);\r\n };\r\n }\r\n function atrule() {\r\n if (css[0] !== '@') {\r\n return;\r\n }\r\n return (atkeyframes() ||\r\n atmedia() ||\r\n atcustommedia() ||\r\n atsupports() ||\r\n atimport() ||\r\n atcharset() ||\r\n atnamespace() ||\r\n atdocument() ||\r\n atpage() ||\r\n athost() ||\r\n atfontface());\r\n }\r\n function rule() {\r\n var pos = position();\r\n var sel = selector();\r\n if (!sel) {\r\n return error('selector missing');\r\n }\r\n comments();\r\n return pos({\r\n type: 'rule',\r\n selectors: sel,\r\n declarations: declarations()\r\n });\r\n }\r\n return addParent(stylesheet());\r\n}\r\nfunction trim(str) {\r\n return str ? str.replace(/^\\s+|\\s+$/g, '') : '';\r\n}\r\nfunction addParent(obj, parent) {\r\n var isNode = obj && typeof obj.type === 'string';\r\n var childParent = isNode ? obj : parent;\r\n for (var _i = 0, _a = Object.keys(obj); _i < _a.length; _i++) {\r\n var k = _a[_i];\r\n var value = obj[k];\r\n if (Array.isArray(value)) {\r\n value.forEach(function (v) {\r\n addParent(v, childParent);\r\n });\r\n }\r\n else if (value && typeof value === 'object') {\r\n addParent(value, childParent);\r\n }\r\n }\r\n if (isNode) {\r\n Object.defineProperty(obj, 'parent', {\r\n configurable: true,\r\n writable: true,\r\n enumerable: false,\r\n value: parent || null\r\n });\r\n }\r\n return obj;\r\n}\n\nvar tagMap = {\r\n script: 'noscript',\r\n altglyph: 'altGlyph',\r\n altglyphdef: 'altGlyphDef',\r\n altglyphitem: 'altGlyphItem',\r\n animatecolor: 'animateColor',\r\n animatemotion: 'animateMotion',\r\n animatetransform: 'animateTransform',\r\n clippath: 'clipPath',\r\n feblend: 'feBlend',\r\n fecolormatrix: 'feColorMatrix',\r\n fecomponenttransfer: 'feComponentTransfer',\r\n fecomposite: 'feComposite',\r\n feconvolvematrix: 'feConvolveMatrix',\r\n fediffuselighting: 'feDiffuseLighting',\r\n fedisplacementmap: 'feDisplacementMap',\r\n fedistantlight: 'feDistantLight',\r\n fedropshadow: 'feDropShadow',\r\n feflood: 'feFlood',\r\n fefunca: 'feFuncA',\r\n fefuncb: 'feFuncB',\r\n fefuncg: 'feFuncG',\r\n fefuncr: 'feFuncR',\r\n fegaussianblur: 'feGaussianBlur',\r\n feimage: 'feImage',\r\n femerge: 'feMerge',\r\n femergenode: 'feMergeNode',\r\n femorphology: 'feMorphology',\r\n feoffset: 'feOffset',\r\n fepointlight: 'fePointLight',\r\n fespecularlighting: 'feSpecularLighting',\r\n fespotlight: 'feSpotLight',\r\n fetile: 'feTile',\r\n feturbulence: 'feTurbulence',\r\n foreignobject: 'foreignObject',\r\n glyphref: 'glyphRef',\r\n lineargradient: 'linearGradient',\r\n radialgradient: 'radialGradient'\r\n};\r\nfunction getTagName(n) {\r\n var tagName = tagMap[n.tagName] ? tagMap[n.tagName] : n.tagName;\r\n if (tagName === 'link' && n.attributes._cssText) {\r\n tagName = 'style';\r\n }\r\n return tagName;\r\n}\r\nfunction escapeRegExp(str) {\r\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n}\r\nvar HOVER_SELECTOR = /([^\\\\]):hover/;\r\nvar HOVER_SELECTOR_GLOBAL = new RegExp(HOVER_SELECTOR.source, 'g');\r\nfunction addHoverClass(cssText, cache) {\r\n var cachedStyle = cache === null || cache === void 0 ? void 0 : cache.stylesWithHoverClass.get(cssText);\r\n if (cachedStyle)\r\n return cachedStyle;\r\n var ast = parse(cssText, {\r\n silent: true\r\n });\r\n if (!ast.stylesheet) {\r\n return cssText;\r\n }\r\n var selectors = [];\r\n ast.stylesheet.rules.forEach(function (rule) {\r\n if ('selectors' in rule) {\r\n (rule.selectors || []).forEach(function (selector) {\r\n if (HOVER_SELECTOR.test(selector)) {\r\n selectors.push(selector);\r\n }\r\n });\r\n }\r\n });\r\n if (selectors.length === 0) {\r\n return cssText;\r\n }\r\n var selectorMatcher = new RegExp(selectors\r\n .filter(function (selector, index) { return selectors.indexOf(selector) === index; })\r\n .sort(function (a, b) { return b.length - a.length; })\r\n .map(function (selector) {\r\n return escapeRegExp(selector);\r\n })\r\n .join('|'), 'g');\r\n var result = cssText.replace(selectorMatcher, function (selector) {\r\n var newSelector = selector.replace(HOVER_SELECTOR_GLOBAL, '$1.\\\\:hover');\r\n return \"\".concat(selector, \", \").concat(newSelector);\r\n });\r\n cache === null || cache === void 0 ? void 0 : cache.stylesWithHoverClass.set(cssText, result);\r\n return result;\r\n}\r\nfunction createCache() {\r\n var stylesWithHoverClass = new Map();\r\n return {\r\n stylesWithHoverClass: stylesWithHoverClass\r\n };\r\n}\r\nfunction buildNode(n, options) {\r\n var doc = options.doc, hackCss = options.hackCss, cache = options.cache;\r\n switch (n.type) {\r\n case NodeType.Document:\r\n return doc.implementation.createDocument(null, '', null);\r\n case NodeType.DocumentType:\r\n return doc.implementation.createDocumentType(n.name || 'html', n.publicId, n.systemId);\r\n case NodeType.Element: {\r\n var tagName = getTagName(n);\r\n var node_1;\r\n if (n.isSVG) {\r\n node_1 = doc.createElementNS('http://www.w3.org/2000/svg', tagName);\r\n }\r\n else {\r\n node_1 = doc.createElement(tagName);\r\n }\r\n var specialAttributes = {};\r\n for (var name_1 in n.attributes) {\r\n if (!Object.prototype.hasOwnProperty.call(n.attributes, name_1)) {\r\n continue;\r\n }\r\n var value = n.attributes[name_1];\r\n if (tagName === 'option' &&\r\n name_1 === 'selected' &&\r\n value === false) {\r\n continue;\r\n }\r\n if (value === true)\r\n value = '';\r\n if (name_1.startsWith('rr_')) {\r\n specialAttributes[name_1] = value;\r\n continue;\r\n }\r\n var isTextarea = tagName === 'textarea' && name_1 === 'value';\r\n var isRemoteOrDynamicCss = tagName === 'style' && name_1 === '_cssText';\r\n if (isRemoteOrDynamicCss && hackCss && typeof value === 'string') {\r\n value = addHoverClass(value, cache);\r\n }\r\n if ((isTextarea || isRemoteOrDynamicCss) && typeof value === 'string') {\r\n var child = doc.createTextNode(value);\r\n for (var _i = 0, _a = Array.from(node_1.childNodes); _i < _a.length; _i++) {\r\n var c = _a[_i];\r\n if (c.nodeType === node_1.TEXT_NODE) {\r\n node_1.removeChild(c);\r\n }\r\n }\r\n node_1.appendChild(child);\r\n continue;\r\n }\r\n try {\r\n if (n.isSVG && name_1 === 'xlink:href') {\r\n node_1.setAttributeNS('http://www.w3.org/1999/xlink', name_1, value.toString());\r\n }\r\n else if (name_1 === 'onload' ||\r\n name_1 === 'onclick' ||\r\n name_1.substring(0, 7) === 'onmouse') {\r\n node_1.setAttribute('_' + name_1, value.toString());\r\n }\r\n else if (tagName === 'meta' &&\r\n n.attributes['http-equiv'] === 'Content-Security-Policy' &&\r\n name_1 === 'content') {\r\n node_1.setAttribute('csp-content', value.toString());\r\n continue;\r\n }\r\n else if (tagName === 'link' &&\r\n n.attributes.rel === 'preload' &&\r\n n.attributes.as === 'script') {\r\n }\r\n else if (tagName === 'link' &&\r\n n.attributes.rel === 'prefetch' &&\r\n typeof n.attributes.href === 'string' &&\r\n n.attributes.href.endsWith('.js')) {\r\n }\r\n else if (tagName === 'img' &&\r\n n.attributes.srcset &&\r\n n.attributes.rr_dataURL) {\r\n node_1.setAttribute('rrweb-original-srcset', n.attributes.srcset);\r\n }\r\n else {\r\n node_1.setAttribute(name_1, value.toString());\r\n }\r\n }\r\n catch (error) {\r\n }\r\n }\r\n var _loop_1 = function (name_2) {\r\n var value = specialAttributes[name_2];\r\n if (tagName === 'canvas' && name_2 === 'rr_dataURL') {\r\n var image_1 = document.createElement('img');\r\n image_1.onload = function () {\r\n var ctx = node_1.getContext('2d');\r\n if (ctx) {\r\n ctx.drawImage(image_1, 0, 0, image_1.width, image_1.height);\r\n }\r\n };\r\n image_1.src = value.toString();\r\n if (node_1.RRNodeType)\r\n node_1.rr_dataURL = value.toString();\r\n }\r\n else if (tagName === 'img' && name_2 === 'rr_dataURL') {\r\n var image = node_1;\r\n if (!image.currentSrc.startsWith('data:')) {\r\n image.setAttribute('rrweb-original-src', n.attributes.src);\r\n image.src = value.toString();\r\n }\r\n }\r\n if (name_2 === 'rr_width') {\r\n node_1.style.width = value.toString();\r\n }\r\n else if (name_2 === 'rr_height') {\r\n node_1.style.height = value.toString();\r\n }\r\n else if (name_2 === 'rr_mediaCurrentTime' &&\r\n typeof value === 'number') {\r\n node_1.currentTime = value;\r\n }\r\n else if (name_2 === 'rr_mediaState') {\r\n switch (value) {\r\n case 'played':\r\n node_1\r\n .play()[\"catch\"](function (e) { return console.warn('media playback error', e); });\r\n break;\r\n case 'paused':\r\n node_1.pause();\r\n break;\r\n }\r\n }\r\n };\r\n for (var name_2 in specialAttributes) {\r\n _loop_1(name_2);\r\n }\r\n if (n.isShadowHost) {\r\n if (!node_1.shadowRoot) {\r\n node_1.attachShadow({ mode: 'open' });\r\n }\r\n else {\r\n while (node_1.shadowRoot.firstChild) {\r\n node_1.shadowRoot.removeChild(node_1.shadowRoot.firstChild);\r\n }\r\n }\r\n }\r\n return node_1;\r\n }\r\n case NodeType.Text:\r\n return doc.createTextNode(n.isStyle && hackCss\r\n ? addHoverClass(n.textContent, cache)\r\n : n.textContent);\r\n case NodeType.CDATA:\r\n return doc.createCDATASection(n.textContent);\r\n case NodeType.Comment:\r\n return doc.createComment(n.textContent);\r\n default:\r\n return null;\r\n }\r\n}\r\nfunction buildNodeWithSN(n, options) {\r\n var doc = options.doc, mirror = options.mirror, _a = options.skipChild, skipChild = _a === void 0 ? false : _a, _b = options.hackCss, hackCss = _b === void 0 ? true : _b, afterAppend = options.afterAppend, cache = options.cache;\r\n var node = buildNode(n, { doc: doc, hackCss: hackCss, cache: cache });\r\n if (!node) {\r\n return null;\r\n }\r\n if (n.rootId && mirror.getNode(n.rootId) !== doc) {\r\n mirror.replace(n.rootId, doc);\r\n }\r\n if (n.type === NodeType.Document) {\r\n doc.close();\r\n doc.open();\r\n if (n.compatMode === 'BackCompat' &&\r\n n.childNodes &&\r\n n.childNodes[0].type !== NodeType.DocumentType) {\r\n if (n.childNodes[0].type === NodeType.Element &&\r\n 'xmlns' in n.childNodes[0].attributes &&\r\n n.childNodes[0].attributes.xmlns === 'http://www.w3.org/1999/xhtml') {\r\n doc.write('<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"\">');\r\n }\r\n else {\r\n doc.write('<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"\">');\r\n }\r\n }\r\n node = doc;\r\n }\r\n mirror.add(node, n);\r\n if ((n.type === NodeType.Document || n.type === NodeType.Element) &&\r\n !skipChild) {\r\n for (var _i = 0, _c = n.childNodes; _i < _c.length; _i++) {\r\n var childN = _c[_i];\r\n var childNode = buildNodeWithSN(childN, {\r\n doc: doc,\r\n mirror: mirror,\r\n skipChild: false,\r\n hackCss: hackCss,\r\n afterAppend: afterAppend,\r\n cache: cache\r\n });\r\n if (!childNode) {\r\n console.warn('Failed to rebuild', childN);\r\n continue;\r\n }\r\n if (childN.isShadow && isElement(node) && node.shadowRoot) {\r\n node.shadowRoot.appendChild(childNode);\r\n }\r\n else {\r\n node.appendChild(childNode);\r\n }\r\n if (afterAppend) {\r\n afterAppend(childNode, childN.id);\r\n }\r\n }\r\n }\r\n return node;\r\n}\r\nfunction visit(mirror, onVisit) {\r\n function walk(node) {\r\n onVisit(node);\r\n }\r\n for (var _i = 0, _a = mirror.getIds(); _i < _a.length; _i++) {\r\n var id = _a[_i];\r\n if (mirror.has(id)) {\r\n walk(mirror.getNode(id));\r\n }\r\n }\r\n}\r\nfunction handleScroll(node, mirror) {\r\n var n = mirror.getMeta(node);\r\n if ((n === null || n === void 0 ? void 0 : n.type) !== NodeType.Element) {\r\n return;\r\n }\r\n var el = node;\r\n for (var name_3 in n.attributes) {\r\n if (!(Object.prototype.hasOwnProperty.call(n.attributes, name_3) &&\r\n name_3.startsWith('rr_'))) {\r\n continue;\r\n }\r\n var value = n.attributes[name_3];\r\n if (name_3 === 'rr_scrollLeft') {\r\n el.scrollLeft = value;\r\n }\r\n if (name_3 === 'rr_scrollTop') {\r\n el.scrollTop = value;\r\n }\r\n }\r\n}\r\nfunction rebuild(n, options) {\r\n var doc = options.doc, onVisit = options.onVisit, _a = options.hackCss, hackCss = _a === void 0 ? true : _a, afterAppend = options.afterAppend, cache = options.cache, _b = options.mirror, mirror = _b === void 0 ? new Mirror() : _b;\r\n var node = buildNodeWithSN(n, {\r\n doc: doc,\r\n mirror: mirror,\r\n skipChild: false,\r\n hackCss: hackCss,\r\n afterAppend: afterAppend,\r\n cache: cache\r\n });\r\n visit(mirror, function (visitedNode) {\r\n if (onVisit) {\r\n onVisit(visitedNode);\r\n }\r\n handleScroll(visitedNode, mirror);\r\n });\r\n return node;\r\n}\n\nexport { IGNORED_NODE, Mirror, NodeType, addHoverClass, buildNodeWithSN, classMatchesRegex, createCache, createMirror, genId, getCssRuleString, getCssRulesString, is2DCanvasBlank, isCSSImportRule, isElement, isNativeShadowDom, isShadowRoot, maskInputValue, needMaskingText, rebuild, serializeNodeWithId, snapshot, transformAttribute };\n","import { classMatchesRegex, IGNORED_NODE, isShadowRoot } from '../../rrweb-snapshot/es/rrweb-snapshot.js';\n\nfunction on(type, fn, target = document) {\r\n const options = { capture: true, passive: true };\r\n target.addEventListener(type, fn, options);\r\n return () => target.removeEventListener(type, fn, options);\r\n}\r\nconst DEPARTED_MIRROR_ACCESS_WARNING = 'Please stop import mirror directly. Instead of that,' +\r\n '\\r\\n' +\r\n 'now you can use replayer.getMirror() to access the mirror instance of a replayer,' +\r\n '\\r\\n' +\r\n 'or you can use record.mirror to access the mirror instance during recording.';\r\nlet _mirror = {\r\n map: {},\r\n getId() {\r\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\r\n return -1;\r\n },\r\n getNode() {\r\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\r\n return null;\r\n },\r\n removeNodeFromMap() {\r\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\r\n },\r\n has() {\r\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\r\n return false;\r\n },\r\n reset() {\r\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\r\n },\r\n};\r\nif (typeof window !== 'undefined' && window.Proxy && window.Reflect) {\r\n _mirror = new Proxy(_mirror, {\r\n get(target, prop, receiver) {\r\n if (prop === 'map') {\r\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\r\n }\r\n return Reflect.get(target, prop, receiver);\r\n },\r\n });\r\n}\r\nfunction throttle(func, wait, options = {}) {\r\n let timeout = null;\r\n let previous = 0;\r\n return function (...args) {\r\n const now = Date.now();\r\n if (!previous && options.leading === false) {\r\n previous = now;\r\n }\r\n const remaining = wait - (now - previous);\r\n const context = this;\r\n if (remaining <= 0 || remaining > wait) {\r\n if (timeout) {\r\n clearTimeout(timeout);\r\n timeout = null;\r\n }\r\n previous = now;\r\n func.apply(context, args);\r\n }\r\n else if (!timeout && options.trailing !== false) {\r\n timeout = setTimeout(() => {\r\n previous = options.leading === false ? 0 : Date.now();\r\n timeout = null;\r\n func.apply(context, args);\r\n }, remaining);\r\n }\r\n };\r\n}\r\nfunction hookSetter(target, key, d, isRevoked, win = window) {\r\n const original = win.Object.getOwnPropertyDescriptor(target, key);\r\n win.Object.defineProperty(target, key, isRevoked\r\n ? d\r\n : {\r\n set(value) {\r\n setTimeout(() => {\r\n d.set.call(this, value);\r\n }, 0);\r\n if (original && original.set) {\r\n original.set.call(this, value);\r\n }\r\n },\r\n });\r\n return () => hookSetter(target, key, original || {}, true);\r\n}\r\nfunction patch(source, name, replacement) {\r\n try {\r\n if (!(name in source)) {\r\n return () => {\r\n };\r\n }\r\n const original = source[name];\r\n const wrapped = replacement(original);\r\n if (typeof wrapped === 'function') {\r\n wrapped.prototype = wrapped.prototype || {};\r\n Object.defineProperties(wrapped, {\r\n __rrweb_original__: {\r\n enumerable: false,\r\n value: original,\r\n },\r\n });\r\n }\r\n source[name] = wrapped;\r\n return () => {\r\n source[name] = original;\r\n };\r\n }\r\n catch (_a) {\r\n return () => {\r\n };\r\n }\r\n}\r\nfunction getWindowHeight() {\r\n return (window.innerHeight ||\r\n (document.documentElement && document.documentElement.clientHeight) ||\r\n (document.body && document.body.clientHeight));\r\n}\r\nfunction getWindowWidth() {\r\n return (window.innerWidth ||\r\n (document.documentElement && document.documentElement.clientWidth) ||\r\n (document.body && document.body.clientWidth));\r\n}\r\nfunction isBlocked(node, blockClass, blockSelector, checkAncestors) {\r\n if (!node) {\r\n return false;\r\n }\r\n const el = node.nodeType === node.ELEMENT_NODE\r\n ? node\r\n : node.parentElement;\r\n if (!el)\r\n return false;\r\n if (typeof blockClass === 'string') {\r\n if (el.classList.contains(blockClass))\r\n return true;\r\n if (checkAncestors && el.closest('.' + blockClass) !== null)\r\n return true;\r\n }\r\n else {\r\n if (classMatchesRegex(el, blockClass, checkAncestors))\r\n return true;\r\n }\r\n if (blockSelector) {\r\n if (node.matches(blockSelector))\r\n return true;\r\n if (checkAncestors && el.closest(blockSelector) !== null)\r\n return true;\r\n }\r\n return false;\r\n}\r\nfunction isSerialized(n, mirror) {\r\n return mirror.getId(n) !== -1;\r\n}\r\nfunction isIgnored(n, mirror) {\r\n return mirror.getId(n) === IGNORED_NODE;\r\n}\r\nfunction isAncestorRemoved(target, mirror) {\r\n if (isShadowRoot(target)) {\r\n return false;\r\n }\r\n const id = mirror.getId(target);\r\n if (!mirror.has(id)) {\r\n return true;\r\n }\r\n if (target.parentNode &&\r\n target.parentNode.nodeType === target.DOCUMENT_NODE) {\r\n return false;\r\n }\r\n if (!target.parentNode) {\r\n return true;\r\n }\r\n return isAncestorRemoved(target.parentNode, mirror);\r\n}\r\nfunction isTouchEvent(event) {\r\n return Boolean(event.changedTouches);\r\n}\r\nfunction polyfill(win = window) {\r\n if ('NodeList' in win && !win.NodeList.prototype.forEach) {\r\n win.NodeList.prototype.forEach = Array.prototype\r\n .forEach;\r\n }\r\n if ('DOMTokenList' in win && !win.DOMTokenList.prototype.forEach) {\r\n win.DOMTokenList.prototype.forEach = Array.prototype\r\n .forEach;\r\n }\r\n if (!Node.prototype.contains) {\r\n Node.prototype.contains = (...args) => {\r\n let node = args[0];\r\n if (!(0 in args)) {\r\n throw new TypeError('1 argument is required');\r\n }\r\n do {\r\n if (this === node) {\r\n return true;\r\n }\r\n } while ((node = node && node.parentNode));\r\n return false;\r\n };\r\n }\r\n}\r\nfunction queueToResolveTrees(queue) {\r\n const queueNodeMap = {};\r\n const putIntoMap = (m, parent) => {\r\n const nodeInTree = {\r\n value: m,\r\n parent,\r\n children: [],\r\n };\r\n queueNodeMap[m.node.id] = nodeInTree;\r\n return nodeInTree;\r\n };\r\n const queueNodeTrees = [];\r\n for (const mutation of queue) {\r\n const { nextId, parentId } = mutation;\r\n if (nextId && nextId in queueNodeMap) {\r\n const nextInTree = queueNodeMap[nextId];\r\n if (nextInTree.parent) {\r\n const idx = nextInTree.parent.children.indexOf(nextInTree);\r\n nextInTree.parent.children.splice(idx, 0, putIntoMap(mutation, nextInTree.parent));\r\n }\r\n else {\r\n const idx = queueNodeTrees.indexOf(nextInTree);\r\n queueNodeTrees.splice(idx, 0, putIntoMap(mutation, null));\r\n }\r\n continue;\r\n }\r\n if (parentId in queueNodeMap) {\r\n const parentInTree = queueNodeMap[parentId];\r\n parentInTree.children.push(putIntoMap(mutation, parentInTree));\r\n continue;\r\n }\r\n queueNodeTrees.push(putIntoMap(mutation, null));\r\n }\r\n return queueNodeTrees;\r\n}\r\nfunction iterateResolveTree(tree, cb) {\r\n cb(tree.value);\r\n for (let i = tree.children.length - 1; i >= 0; i--) {\r\n iterateResolveTree(tree.children[i], cb);\r\n }\r\n}\r\nfunction isSerializedIframe(n, mirror) {\r\n return Boolean(n.nodeName === 'IFRAME' && mirror.getMeta(n));\r\n}\r\nfunction isSerializedStylesheet(n, mirror) {\r\n return Boolean(n.nodeName === 'LINK' &&\r\n n.nodeType === n.ELEMENT_NODE &&\r\n n.getAttribute &&\r\n n.getAttribute('rel') === 'stylesheet' &&\r\n mirror.getMeta(n));\r\n}\r\nfunction getBaseDimension(node, rootIframe) {\r\n var _a, _b;\r\n const frameElement = (_b = (_a = node.ownerDocument) === null || _a === void 0 ? void 0 : _a.defaultView) === null || _b === void 0 ? void 0 : _b.frameElement;\r\n if (!frameElement || frameElement === rootIframe) {\r\n return {\r\n x: 0,\r\n y: 0,\r\n relativeScale: 1,\r\n absoluteScale: 1,\r\n };\r\n }\r\n const frameDimension = frameElement.getBoundingClientRect();\r\n const frameBaseDimension = getBaseDimension(frameElement, rootIframe);\r\n const relativeScale = frameDimension.height / frameElement.clientHeight;\r\n return {\r\n x: frameDimension.x * frameBaseDimension.relativeScale +\r\n frameBaseDimension.x,\r\n y: frameDimension.y * frameBaseDimension.relativeScale +\r\n frameBaseDimension.y,\r\n relativeScale,\r\n absoluteScale: frameBaseDimension.absoluteScale * relativeScale,\r\n };\r\n}\r\nfunction hasShadowRoot(n) {\r\n return Boolean(n === null || n === void 0 ? void 0 : n.shadowRoot);\r\n}\r\nfunction getNestedRule(rules, position) {\r\n const rule = rules[position[0]];\r\n if (position.length === 1) {\r\n return rule;\r\n }\r\n else {\r\n return getNestedRule(rule.cssRules[position[1]].cssRules, position.slice(2));\r\n }\r\n}\r\nfunction getPositionsAndIndex(nestedIndex) {\r\n const positions = [...nestedIndex];\r\n const index = positions.pop();\r\n return { positions, index };\r\n}\r\nfunction uniqueTextMutations(mutations) {\r\n const idSet = new Set();\r\n const uniqueMutations = [];\r\n for (let i = mutations.length; i--;) {\r\n const mutation = mutations[i];\r\n if (!idSet.has(mutation.id)) {\r\n uniqueMutations.push(mutation);\r\n idSet.add(mutation.id);\r\n }\r\n }\r\n return uniqueMutations;\r\n}\r\nclass StyleSheetMirror {\r\n constructor() {\r\n this.id = 1;\r\n this.styleIDMap = new WeakMap();\r\n this.idStyleMap = new Map();\r\n }\r\n getId(stylesheet) {\r\n var _a;\r\n return (_a = this.styleIDMap.get(stylesheet)) !== null && _a !== void 0 ? _a : -1;\r\n }\r\n has(stylesheet) {\r\n return this.styleIDMap.has(stylesheet);\r\n }\r\n add(stylesheet, id) {\r\n if (this.has(stylesheet))\r\n return this.getId(stylesheet);\r\n let newId;\r\n if (id === undefined) {\r\n newId = this.id++;\r\n }\r\n else\r\n newId = id;\r\n this.styleIDMap.set(stylesheet, newId);\r\n this.idStyleMap.set(newId, stylesheet);\r\n return newId;\r\n }\r\n getStyle(id) {\r\n return this.idStyleMap.get(id) || null;\r\n }\r\n reset() {\r\n this.styleIDMap = new WeakMap();\r\n this.idStyleMap = new Map();\r\n this.id = 1;\r\n }\r\n generateId() {\r\n return this.id++;\r\n }\r\n}\n\nexport { StyleSheetMirror, _mirror, getBaseDimension, getNestedRule, getPositionsAndIndex, getWindowHeight, getWindowWidth, hasShadowRoot, hookSetter, isAncestorRemoved, isBlocked, isIgnored, isSerialized, isSerializedIframe, isSerializedStylesheet, isTouchEvent, iterateResolveTree, on, patch, polyfill, queueToResolveTrees, throttle, uniqueTextMutations };\n","var 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 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 CanvasContext = /* @__PURE__ */ ((CanvasContext2) => {\n CanvasContext2[CanvasContext2[\"2D\"] = 0] = \"2D\";\n CanvasContext2[CanvasContext2[\"WebGL\"] = 1] = \"WebGL\";\n CanvasContext2[CanvasContext2[\"WebGL2\"] = 2] = \"WebGL2\";\n return CanvasContext2;\n})(CanvasContext || {});\nvar ReplayerEvents = /* @__PURE__ */ ((ReplayerEvents2) => {\n ReplayerEvents2[\"Start\"] = \"start\";\n ReplayerEvents2[\"Pause\"] = \"pause\";\n ReplayerEvents2[\"Resume\"] = \"resume\";\n ReplayerEvents2[\"Resize\"] = \"resize\";\n ReplayerEvents2[\"Finish\"] = \"finish\";\n ReplayerEvents2[\"FullsnapshotRebuilded\"] = \"fullsnapshot-rebuilded\";\n ReplayerEvents2[\"LoadStylesheetStart\"] = \"load-stylesheet-start\";\n ReplayerEvents2[\"LoadStylesheetEnd\"] = \"load-stylesheet-end\";\n ReplayerEvents2[\"SkipStart\"] = \"skip-start\";\n ReplayerEvents2[\"SkipEnd\"] = \"skip-end\";\n ReplayerEvents2[\"MouseInteraction\"] = \"mouse-interaction\";\n ReplayerEvents2[\"EventCast\"] = \"event-cast\";\n ReplayerEvents2[\"CustomEvent\"] = \"custom-event\";\n ReplayerEvents2[\"Flush\"] = \"flush\";\n ReplayerEvents2[\"StateChange\"] = \"state-change\";\n ReplayerEvents2[\"PlayBack\"] = \"play-back\";\n ReplayerEvents2[\"Destroy\"] = \"destroy\";\n return ReplayerEvents2;\n})(ReplayerEvents || {});\n\nexport { CanvasContext, EventType, IncrementalSource, MouseInteractions, ReplayerEvents };\n","import { isShadowRoot, isNativeShadowDom, maskInputValue, transformAttribute, needMaskingText, IGNORED_NODE, serializeNodeWithId } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\nimport { isIgnored, isBlocked, isSerialized, isAncestorRemoved, isSerializedIframe, isSerializedStylesheet, hasShadowRoot } from '../utils.js';\n\nfunction isNodeInLinkedList(n) {\r\n return '__ln' in n;\r\n}\r\nclass DoubleLinkedList {\r\n constructor() {\r\n this.length = 0;\r\n this.head = null;\r\n }\r\n get(position) {\r\n if (position >= this.length) {\r\n throw new Error('Position outside of list range');\r\n }\r\n let current = this.head;\r\n for (let index = 0; index < position; index++) {\r\n current = (current === null || current === void 0 ? void 0 : current.next) || null;\r\n }\r\n return current;\r\n }\r\n addNode(n) {\r\n const node = {\r\n value: n,\r\n previous: null,\r\n next: null,\r\n };\r\n n.__ln = node;\r\n if (n.previousSibling && isNodeInLinkedList(n.previousSibling)) {\r\n const current = n.previousSibling.__ln.next;\r\n node.next = current;\r\n node.previous = n.previousSibling.__ln;\r\n n.previousSibling.__ln.next = node;\r\n if (current) {\r\n current.previous = node;\r\n }\r\n }\r\n else if (n.nextSibling &&\r\n isNodeInLinkedList(n.nextSibling) &&\r\n n.nextSibling.__ln.previous) {\r\n const current = n.nextSibling.__ln.previous;\r\n node.previous = current;\r\n node.next = n.nextSibling.__ln;\r\n n.nextSibling.__ln.previous = node;\r\n if (current) {\r\n current.next = node;\r\n }\r\n }\r\n else {\r\n if (this.head) {\r\n this.head.previous = node;\r\n }\r\n node.next = this.head;\r\n this.head = node;\r\n }\r\n this.length++;\r\n }\r\n removeNode(n) {\r\n const current = n.__ln;\r\n if (!this.head) {\r\n return;\r\n }\r\n if (!current.previous) {\r\n this.head = current.next;\r\n if (this.head) {\r\n this.head.previous = null;\r\n }\r\n }\r\n else {\r\n current.previous.next = current.next;\r\n if (current.next) {\r\n current.next.previous = current.previous;\r\n }\r\n }\r\n if (n.__ln) {\r\n delete n.__ln;\r\n }\r\n this.length--;\r\n }\r\n}\r\nconst moveKey = (id, parentId) => `${id}@${parentId}`;\r\nclass MutationBuffer {\r\n constructor() {\r\n this.frozen = false;\r\n this.locked = false;\r\n this.texts = [];\r\n this.attributes = [];\r\n this.removes = [];\r\n this.mapRemoves = [];\r\n this.movedMap = {};\r\n this.addedSet = new Set();\r\n this.movedSet = new Set();\r\n this.droppedSet = new Set();\r\n this.processMutations = (mutations) => {\r\n mutations.forEach(this.processMutation);\r\n this.emit();\r\n };\r\n this.emit = () => {\r\n if (this.frozen || this.locked) {\r\n return;\r\n }\r\n const adds = [];\r\n const addList = new DoubleLinkedList();\r\n const getNextId = (n) => {\r\n let ns = n;\r\n let nextId = IGNORED_NODE;\r\n while (nextId === IGNORED_NODE) {\r\n ns = ns && ns.nextSibling;\r\n nextId = ns && this.mirror.getId(ns);\r\n }\r\n return nextId;\r\n };\r\n const pushAdd = (n) => {\r\n var _a, _b, _c, _d;\r\n let shadowHost = null;\r\n if (((_b = (_a = n.getRootNode) === null || _a === void 0 ? void 0 : _a.call(n)) === null || _b === void 0 ? void 0 : _b.nodeType) === Node.DOCUMENT_FRAGMENT_NODE &&\r\n n.getRootNode().host)\r\n shadowHost = n.getRootNode().host;\r\n let rootShadowHost = shadowHost;\r\n while (((_d = (_c = rootShadowHost === null || rootShadowHost === void 0 ? void 0 : rootShadowHost.getRootNode) === null || _c === void 0 ? void 0 : _c.call(rootShadowHost)) === null || _d === void 0 ? void 0 : _d.nodeType) ===\r\n Node.DOCUMENT_FRAGMENT_NODE &&\r\n rootShadowHost.getRootNode().host)\r\n rootShadowHost = rootShadowHost.getRootNode().host;\r\n const notInDoc = !this.doc.contains(n) &&\r\n (!rootShadowHost || !this.doc.contains(rootShadowHost));\r\n if (!n.parentNode || notInDoc) {\r\n return;\r\n }\r\n const parentId = isShadowRoot(n.parentNode)\r\n ? this.mirror.getId(shadowHost)\r\n : this.mirror.getId(n.parentNode);\r\n const nextId = getNextId(n);\r\n if (parentId === -1 || nextId === -1) {\r\n return addList.addNode(n);\r\n }\r\n const sn = serializeNodeWithId(n, {\r\n doc: this.doc,\r\n mirror: this.mirror,\r\n blockClass: this.blockClass,\r\n blockSelector: this.blockSelector,\r\n maskTextClass: this.maskTextClass,\r\n maskTextSelector: this.maskTextSelector,\r\n skipChild: true,\r\n newlyAddedElement: true,\r\n inlineStylesheet: this.inlineStylesheet,\r\n maskInputOptions: this.maskInputOptions,\r\n maskTextFn: this.maskTextFn,\r\n maskInputFn: this.maskInputFn,\r\n slimDOMOptions: this.slimDOMOptions,\r\n dataURLOptions: this.dataURLOptions,\r\n recordCanvas: this.recordCanvas,\r\n inlineImages: this.inlineImages,\r\n onSerialize: (currentN) => {\r\n if (isSerializedIframe(currentN, this.mirror)) {\r\n this.iframeManager.addIframe(currentN);\r\n }\r\n if (isSerializedStylesheet(currentN, this.mirror)) {\r\n this.stylesheetManager.trackLinkElement(currentN);\r\n }\r\n if (hasShadowRoot(n)) {\r\n this.shadowDomManager.addShadowRoot(n.shadowRoot, this.doc);\r\n }\r\n },\r\n onIframeLoad: (iframe, childSn) => {\r\n this.iframeManager.attachIframe(iframe, childSn);\r\n this.shadowDomManager.observeAttachShadow(iframe);\r\n },\r\n onStylesheetLoad: (link, childSn) => {\r\n this.stylesheetManager.attachLinkElement(link, childSn);\r\n },\r\n });\r\n if (sn) {\r\n adds.push({\r\n parentId,\r\n nextId,\r\n node: sn,\r\n });\r\n }\r\n };\r\n while (this.mapRemoves.length) {\r\n this.mirror.removeNodeFromMap(this.mapRemoves.shift());\r\n }\r\n for (const n of Array.from(this.movedSet.values())) {\r\n if (isParentRemoved(this.removes, n, this.mirror) &&\r\n !this.movedSet.has(n.parentNode)) {\r\n continue;\r\n }\r\n pushAdd(n);\r\n }\r\n for (const n of Array.from(this.addedSet.values())) {\r\n if (!isAncestorInSet(this.droppedSet, n) &&\r\n !isParentRemoved(this.removes, n, this.mirror)) {\r\n pushAdd(n);\r\n }\r\n else if (isAncestorInSet(this.movedSet, n)) {\r\n pushAdd(n);\r\n }\r\n else {\r\n this.droppedSet.add(n);\r\n }\r\n }\r\n let candidate = null;\r\n while (addList.length) {\r\n let node = null;\r\n if (candidate) {\r\n const parentId = this.mirror.getId(candidate.value.parentNode);\r\n const nextId = getNextId(candidate.value);\r\n if (parentId !== -1 && nextId !== -1) {\r\n node = candidate;\r\n }\r\n }\r\n if (!node) {\r\n for (let index = addList.length - 1; index >= 0; index--) {\r\n const _node = addList.get(index);\r\n if (_node) {\r\n const parentId = this.mirror.getId(_node.value.parentNode);\r\n const nextId = getNextId(_node.value);\r\n if (nextId === -1)\r\n continue;\r\n else if (parentId !== -1) {\r\n node = _node;\r\n break;\r\n }\r\n else {\r\n const unhandledNode = _node.value;\r\n if (unhandledNode.parentNode &&\r\n unhandledNode.parentNode.nodeType ===\r\n Node.DOCUMENT_FRAGMENT_NODE) {\r\n const shadowHost = unhandledNode.parentNode\r\n .host;\r\n const parentId = this.mirror.getId(shadowHost);\r\n if (parentId !== -1) {\r\n node = _node;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n if (!node) {\r\n while (addList.head) {\r\n addList.removeNode(addList.head.value);\r\n }\r\n break;\r\n }\r\n candidate = node.previous;\r\n addList.removeNode(node.value);\r\n pushAdd(node.value);\r\n }\r\n const payload = {\r\n texts: this.texts\r\n .map((text) => ({\r\n id: this.mirror.getId(text.node),\r\n value: text.value,\r\n }))\r\n .filter((text) => this.mirror.has(text.id)),\r\n attributes: this.attributes\r\n .map((attribute) => ({\r\n id: this.mirror.getId(attribute.node),\r\n attributes: attribute.attributes,\r\n }))\r\n .filter((attribute) => this.mirror.has(attribute.id)),\r\n removes: this.removes,\r\n adds,\r\n };\r\n if (!payload.texts.length &&\r\n !payload.attributes.length &&\r\n !payload.removes.length &&\r\n !payload.adds.length) {\r\n return;\r\n }\r\n this.texts = [];\r\n this.attributes = [];\r\n this.removes = [];\r\n this.addedSet = new Set();\r\n this.movedSet = new Set();\r\n this.droppedSet = new Set();\r\n this.movedMap = {};\r\n this.mutationCb(payload);\r\n };\r\n this.processMutation = (m) => {\r\n if (isIgnored(m.target, this.mirror)) {\r\n return;\r\n }\r\n switch (m.type) {\r\n case 'characterData': {\r\n const value = m.target.textContent;\r\n if (!isBlocked(m.target, this.blockClass, this.blockSelector, false) &&\r\n value !== m.oldValue) {\r\n this.texts.push({\r\n value: needMaskingText(m.target, this.maskTextClass, this.maskTextSelector) && value\r\n ? this.maskTextFn\r\n ? this.maskTextFn(value)\r\n : value.replace(/[\\S]/g, '*')\r\n : value,\r\n node: m.target,\r\n });\r\n }\r\n break;\r\n }\r\n case 'attributes': {\r\n const target = m.target;\r\n let value = m.target.getAttribute(m.attributeName);\r\n if (m.attributeName === 'value') {\r\n value = maskInputValue({\r\n maskInputOptions: this.maskInputOptions,\r\n tagName: m.target.tagName,\r\n type: m.target.getAttribute('type'),\r\n value,\r\n maskInputFn: this.maskInputFn,\r\n });\r\n }\r\n if (isBlocked(m.target, this.blockClass, this.blockSelector, false) ||\r\n value === m.oldValue) {\r\n return;\r\n }\r\n let item = this.attributes.find((a) => a.node === m.target);\r\n if (target.tagName === 'IFRAME' &&\r\n m.attributeName === 'src' &&\r\n !this.keepIframeSrcFn(value)) {\r\n if (!target.contentDocument) {\r\n m.attributeName = 'rr_src';\r\n }\r\n else {\r\n return;\r\n }\r\n }\r\n if (!item) {\r\n item = {\r\n node: m.target,\r\n attributes: {},\r\n };\r\n this.attributes.push(item);\r\n }\r\n if (m.attributeName === 'style') {\r\n const old = this.doc.createElement('span');\r\n if (m.oldValue) {\r\n old.setAttribute('style', m.oldValue);\r\n }\r\n if (item.attributes.style === undefined ||\r\n item.attributes.style === null) {\r\n item.attributes.style = {};\r\n }\r\n const styleObj = item.attributes.style;\r\n for (const pname of Array.from(target.style)) {\r\n const newValue = target.style.getPropertyValue(pname);\r\n const newPriority = target.style.getPropertyPriority(pname);\r\n if (newValue !== old.style.getPropertyValue(pname) ||\r\n newPriority !== old.style.getPropertyPriority(pname)) {\r\n if (newPriority === '') {\r\n styleObj[pname] = newValue;\r\n }\r\n else {\r\n styleObj[pname] = [newValue, newPriority];\r\n }\r\n }\r\n }\r\n for (const pname of Array.from(old.style)) {\r\n if (target.style.getPropertyValue(pname) === '') {\r\n styleObj[pname] = false;\r\n }\r\n }\r\n }\r\n else {\r\n item.attributes[m.attributeName] = transformAttribute(this.doc, target.tagName, m.attributeName, value);\r\n }\r\n break;\r\n }\r\n case 'childList': {\r\n if (isBlocked(m.target, this.blockClass, this.blockSelector, true))\r\n return;\r\n m.addedNodes.forEach((n) => this.genAdds(n, m.target));\r\n m.removedNodes.forEach((n) => {\r\n const nodeId = this.mirror.getId(n);\r\n const parentId = isShadowRoot(m.target)\r\n ? this.mirror.getId(m.target.host)\r\n : this.mirror.getId(m.target);\r\n if (isBlocked(m.target, this.blockClass, this.blockSelector, false) ||\r\n isIgnored(n, this.mirror) ||\r\n !isSerialized(n, this.mirror)) {\r\n return;\r\n }\r\n if (this.addedSet.has(n)) {\r\n deepDelete(this.addedSet, n);\r\n this.droppedSet.add(n);\r\n }\r\n else if (this.addedSet.has(m.target) && nodeId === -1) ;\r\n else if (isAncestorRemoved(m.target, this.mirror)) ;\r\n else if (this.movedSet.has(n) &&\r\n this.movedMap[moveKey(nodeId, parentId)]) {\r\n deepDelete(this.movedSet, n);\r\n }\r\n else {\r\n this.removes.push({\r\n parentId,\r\n id: nodeId,\r\n isShadow: isShadowRoot(m.target) && isNativeShadowDom(m.target)\r\n ? true\r\n : undefined,\r\n });\r\n }\r\n this.mapRemoves.push(n);\r\n });\r\n break;\r\n }\r\n }\r\n };\r\n this.genAdds = (n, target) => {\r\n if (this.mirror.hasNode(n)) {\r\n if (isIgnored(n, this.mirror)) {\r\n return;\r\n }\r\n this.movedSet.add(n);\r\n let targetId = null;\r\n if (target && this.mirror.hasNode(target)) {\r\n targetId = this.mirror.getId(target);\r\n }\r\n if (targetId && targetId !== -1) {\r\n this.movedMap[moveKey(this.mirror.getId(n), targetId)] = true;\r\n }\r\n }\r\n else {\r\n this.addedSet.add(n);\r\n this.droppedSet.delete(n);\r\n }\r\n if (!isBlocked(n, this.blockClass, this.blockSelector, false))\r\n n.childNodes.forEach((childN) => this.genAdds(childN));\r\n };\r\n }\r\n init(options) {\r\n [\r\n 'mutationCb',\r\n 'blockClass',\r\n 'blockSelector',\r\n 'maskTextClass',\r\n 'maskTextSelector',\r\n 'inlineStylesheet',\r\n 'maskInputOptions',\r\n 'maskTextFn',\r\n 'maskInputFn',\r\n 'keepIframeSrcFn',\r\n 'recordCanvas',\r\n 'inlineImages',\r\n 'slimDOMOptions',\r\n 'dataURLOptions',\r\n 'doc',\r\n 'mirror',\r\n 'iframeManager',\r\n 'stylesheetManager',\r\n 'shadowDomManager',\r\n 'canvasManager',\r\n ].forEach((key) => {\r\n this[key] = options[key];\r\n });\r\n }\r\n freeze() {\r\n this.frozen = true;\r\n this.canvasManager.freeze();\r\n }\r\n unfreeze() {\r\n this.frozen = false;\r\n this.canvasManager.unfreeze();\r\n this.emit();\r\n }\r\n isFrozen() {\r\n return this.frozen;\r\n }\r\n lock() {\r\n this.locked = true;\r\n this.canvasManager.lock();\r\n }\r\n unlock() {\r\n this.locked = false;\r\n this.canvasManager.unlock();\r\n this.emit();\r\n }\r\n reset() {\r\n this.shadowDomManager.reset();\r\n this.canvasManager.reset();\r\n }\r\n}\r\nfunction deepDelete(addsSet, n) {\r\n addsSet.delete(n);\r\n n.childNodes.forEach((childN) => deepDelete(addsSet, childN));\r\n}\r\nfunction isParentRemoved(removes, n, mirror) {\r\n if (removes.length === 0)\r\n return false;\r\n return _isParentRemoved(removes, n, mirror);\r\n}\r\nfunction _isParentRemoved(removes, n, mirror) {\r\n const { parentNode } = n;\r\n if (!parentNode) {\r\n return false;\r\n }\r\n const parentId = mirror.getId(parentNode);\r\n if (removes.some((r) => r.id === parentId)) {\r\n return true;\r\n }\r\n return _isParentRemoved(removes, parentNode, mirror);\r\n}\r\nfunction isAncestorInSet(set, n) {\r\n if (set.size === 0)\r\n return false;\r\n return _isAncestorInSet(set, n);\r\n}\r\nfunction _isAncestorInSet(set, n) {\r\n const { parentNode } = n;\r\n if (!parentNode) {\r\n return false;\r\n }\r\n if (set.has(parentNode)) {\r\n return true;\r\n }\r\n return _isAncestorInSet(set, parentNode);\r\n}\n\nexport { MutationBuffer as default };\n","import { maskInputValue } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\nimport { on, throttle, isBlocked, getWindowHeight, getWindowWidth, hookSetter, patch, isTouchEvent } from '../utils.js';\nimport { MouseInteractions, IncrementalSource } from '../../../types/dist/types.js';\nimport MutationBuffer from './mutation.js';\n\nconst mutationBuffers = [];\r\nconst isCSSGroupingRuleSupported = typeof CSSGroupingRule !== 'undefined';\r\nconst isCSSMediaRuleSupported = typeof CSSMediaRule !== 'undefined';\r\nconst isCSSSupportsRuleSupported = typeof CSSSupportsRule !== 'undefined';\r\nconst isCSSConditionRuleSupported = typeof CSSConditionRule !== 'undefined';\r\nfunction getEventTarget(event) {\r\n try {\r\n if ('composedPath' in event) {\r\n const path = event.composedPath();\r\n if (path.length) {\r\n return path[0];\r\n }\r\n }\r\n else if ('path' in event && event.path.length) {\r\n return event.path[0];\r\n }\r\n return event.target;\r\n }\r\n catch (_a) {\r\n return event.target;\r\n }\r\n}\r\nfunction initMutationObserver(options, rootEl) {\r\n var _a, _b;\r\n const mutationBuffer = new MutationBuffer();\r\n mutationBuffers.push(mutationBuffer);\r\n mutationBuffer.init(options);\r\n let mutationObserverCtor = window.MutationObserver ||\r\n window.__rrMutationObserver;\r\n const angularZoneSymbol = (_b = (_a = window === null || window === void 0 ? void 0 : window.Zone) === null || _a === void 0 ? void 0 : _a.__symbol__) === null || _b === void 0 ? void 0 : _b.call(_a, 'MutationObserver');\r\n if (angularZoneSymbol &&\r\n window[angularZoneSymbol]) {\r\n mutationObserverCtor = window[angularZoneSymbol];\r\n }\r\n const observer = new mutationObserverCtor(mutationBuffer.processMutations.bind(mutationBuffer));\r\n observer.observe(rootEl, {\r\n attributes: true,\r\n attributeOldValue: true,\r\n characterData: true,\r\n characterDataOldValue: true,\r\n childList: true,\r\n subtree: true,\r\n });\r\n return observer;\r\n}\r\nfunction initMoveObserver({ mousemoveCb, sampling, doc, mirror, }) {\r\n if (sampling.mousemove === false) {\r\n return () => {\r\n };\r\n }\r\n const threshold = typeof sampling.mousemove === 'number' ? sampling.mousemove : 50;\r\n const callbackThreshold = typeof sampling.mousemoveCallback === 'number'\r\n ? sampling.mousemoveCallback\r\n : 500;\r\n let positions = [];\r\n let timeBaseline;\r\n const wrappedCb = throttle((source) => {\r\n const totalOffset = Date.now() - timeBaseline;\r\n mousemoveCb(positions.map((p) => {\r\n p.timeOffset -= totalOffset;\r\n return p;\r\n }), source);\r\n positions = [];\r\n timeBaseline = null;\r\n }, callbackThreshold);\r\n const updatePosition = throttle((evt) => {\r\n const target = getEventTarget(evt);\r\n const { clientX, clientY } = isTouchEvent(evt)\r\n ? evt.changedTouches[0]\r\n : evt;\r\n if (!timeBaseline) {\r\n timeBaseline = Date.now();\r\n }\r\n positions.push({\r\n x: clientX,\r\n y: clientY,\r\n id: mirror.getId(target),\r\n timeOffset: Date.now() - timeBaseline,\r\n });\r\n wrappedCb(typeof DragEvent !== 'undefined' && evt instanceof DragEvent\r\n ? IncrementalSource.Drag\r\n : evt instanceof MouseEvent\r\n ? IncrementalSource.MouseMove\r\n : IncrementalSource.TouchMove);\r\n }, threshold, {\r\n trailing: false,\r\n });\r\n const handlers = [\r\n on('mousemove', updatePosition, doc),\r\n on('touchmove', updatePosition, doc),\r\n on('drag', updatePosition, doc),\r\n ];\r\n return () => {\r\n handlers.forEach((h) => h());\r\n };\r\n}\r\nfunction initMouseInteractionObserver({ mouseInteractionCb, doc, mirror, blockClass, blockSelector, sampling, }) {\r\n if (sampling.mouseInteraction === false) {\r\n return () => {\r\n };\r\n }\r\n const disableMap = sampling.mouseInteraction === true ||\r\n sampling.mouseInteraction === undefined\r\n ? {}\r\n : sampling.mouseInteraction;\r\n const handlers = [];\r\n const getHandler = (eventKey) => {\r\n return (event) => {\r\n const target = getEventTarget(event);\r\n if (isBlocked(target, blockClass, blockSelector, true)) {\r\n return;\r\n }\r\n const e = isTouchEvent(event) ? event.changedTouches[0] : event;\r\n if (!e) {\r\n return;\r\n }\r\n const id = mirror.getId(target);\r\n const { clientX, clientY } = e;\r\n mouseInteractionCb({\r\n type: MouseInteractions[eventKey],\r\n id,\r\n x: clientX,\r\n y: clientY,\r\n });\r\n };\r\n };\r\n Object.keys(MouseInteractions)\r\n .filter((key) => Number.isNaN(Number(key)) &&\r\n !key.endsWith('_Departed') &&\r\n disableMap[key] !== false)\r\n .forEach((eventKey) => {\r\n const eventName = eventKey.toLowerCase();\r\n const handler = getHandler(eventKey);\r\n handlers.push(on(eventName, handler, doc));\r\n });\r\n return () => {\r\n handlers.forEach((h) => h());\r\n };\r\n}\r\nfunction initScrollObserver({ scrollCb, doc, mirror, blockClass, blockSelector, sampling, }) {\r\n const updatePosition = throttle((evt) => {\r\n const target = getEventTarget(evt);\r\n if (!target || isBlocked(target, blockClass, blockSelector, true)) {\r\n return;\r\n }\r\n const id = mirror.getId(target);\r\n if (target === doc) {\r\n const scrollEl = (doc.scrollingElement || doc.documentElement);\r\n scrollCb({\r\n id,\r\n x: scrollEl.scrollLeft,\r\n y: scrollEl.scrollTop,\r\n });\r\n }\r\n else {\r\n scrollCb({\r\n id,\r\n x: target.scrollLeft,\r\n y: target.scrollTop,\r\n });\r\n }\r\n }, sampling.scroll || 100);\r\n return on('scroll', updatePosition, doc);\r\n}\r\nfunction initViewportResizeObserver({ viewportResizeCb, }) {\r\n let lastH = -1;\r\n let lastW = -1;\r\n const updateDimension = throttle(() => {\r\n const height = getWindowHeight();\r\n const width = getWindowWidth();\r\n if (lastH !== height || lastW !== width) {\r\n viewportResizeCb({\r\n width: Number(width),\r\n height: Number(height),\r\n });\r\n lastH = height;\r\n lastW = width;\r\n }\r\n }, 200);\r\n return on('resize', updateDimension, window);\r\n}\r\nfunction wrapEventWithUserTriggeredFlag(v, enable) {\r\n const value = Object.assign({}, v);\r\n if (!enable)\r\n delete value.userTriggered;\r\n return value;\r\n}\r\nconst INPUT_TAGS = ['INPUT', 'TEXTAREA', 'SELECT'];\r\nconst lastInputValueMap = new WeakMap();\r\nfunction initInputObserver({ inputCb, doc, mirror, blockClass, blockSelector, ignoreClass, maskInputOptions, maskInputFn, sampling, userTriggeredOnInput, }) {\r\n function eventHandler(event) {\r\n let target = getEventTarget(event);\r\n const userTriggered = event.isTrusted;\r\n if (target && target.tagName === 'OPTION')\r\n target = target.parentElement;\r\n if (!target ||\r\n !target.tagName ||\r\n INPUT_TAGS.indexOf(target.tagName) < 0 ||\r\n isBlocked(target, blockClass, blockSelector, true)) {\r\n return;\r\n }\r\n const type = target.type;\r\n if (target.classList.contains(ignoreClass)) {\r\n return;\r\n }\r\n let text = target.value;\r\n let isChecked = false;\r\n if (type === 'radio' || type === 'checkbox') {\r\n isChecked = target.checked;\r\n }\r\n else if (maskInputOptions[target.tagName.toLowerCase()] ||\r\n maskInputOptions[type]) {\r\n text = maskInputValue({\r\n maskInputOptions,\r\n tagName: target.tagName,\r\n type,\r\n value: text,\r\n maskInputFn,\r\n });\r\n }\r\n cbWithDedup(target, wrapEventWithUserTriggeredFlag({ text, isChecked, userTriggered }, userTriggeredOnInput));\r\n const name = target.name;\r\n if (type === 'radio' && name && isChecked) {\r\n doc\r\n .querySelectorAll(`input[type=\"radio\"][name=\"${name}\"]`)\r\n .forEach((el) => {\r\n if (el !== target) {\r\n cbWithDedup(el, wrapEventWithUserTriggeredFlag({\r\n text: el.value,\r\n isChecked: !isChecked,\r\n userTriggered: false,\r\n }, userTriggeredOnInput));\r\n }\r\n });\r\n }\r\n }\r\n function cbWithDedup(target, v) {\r\n const lastInputValue = lastInputValueMap.get(target);\r\n if (!lastInputValue ||\r\n lastInputValue.text !== v.text ||\r\n lastInputValue.isChecked !== v.isChecked) {\r\n lastInputValueMap.set(target, v);\r\n const id = mirror.getId(target);\r\n inputCb(Object.assign(Object.assign({}, v), { id }));\r\n }\r\n }\r\n const events = sampling.input === 'last' ? ['change'] : ['input', 'change'];\r\n const handlers = events.map((eventName) => on(eventName, eventHandler, doc));\r\n const currentWindow = doc.defaultView;\r\n if (!currentWindow) {\r\n return () => {\r\n handlers.forEach((h) => h());\r\n };\r\n }\r\n const propertyDescriptor = currentWindow.Object.getOwnPropertyDescriptor(currentWindow.HTMLInputElement.prototype, 'value');\r\n const hookProperties = [\r\n [currentWindow.HTMLInputElement.prototype, 'value'],\r\n [currentWindow.HTMLInputElement.prototype, 'checked'],\r\n [currentWindow.HTMLSelectElement.prototype, 'value'],\r\n [currentWindow.HTMLTextAreaElement.prototype, 'value'],\r\n [currentWindow.HTMLSelectElement.prototype, 'selectedIndex'],\r\n [currentWindow.HTMLOptionElement.prototype, 'selected'],\r\n ];\r\n if (propertyDescriptor && propertyDescriptor.set) {\r\n handlers.push(...hookProperties.map((p) => hookSetter(p[0], p[1], {\r\n set() {\r\n eventHandler({ target: this });\r\n },\r\n }, false, currentWindow)));\r\n }\r\n return () => {\r\n handlers.forEach((h) => h());\r\n };\r\n}\r\nfunction getNestedCSSRulePositions(rule) {\r\n const positions = [];\r\n function recurse(childRule, pos) {\r\n if ((isCSSGroupingRuleSupported &&\r\n childRule.parentRule instanceof CSSGroupingRule) ||\r\n (isCSSMediaRuleSupported &&\r\n childRule.parentRule instanceof CSSMediaRule) ||\r\n (isCSSSupportsRuleSupported &&\r\n childRule.parentRule instanceof CSSSupportsRule) ||\r\n (isCSSConditionRuleSupported &&\r\n childRule.parentRule instanceof CSSConditionRule)) {\r\n const rules = Array.from(childRule.parentRule.cssRules);\r\n const index = rules.indexOf(childRule);\r\n pos.unshift(index);\r\n }\r\n else if (childRule.parentStyleSheet) {\r\n const rules = Array.from(childRule.parentStyleSheet.cssRules);\r\n const index = rules.indexOf(childRule);\r\n pos.unshift(index);\r\n }\r\n return pos;\r\n }\r\n return recurse(rule, positions);\r\n}\r\nfunction getIdAndStyleId(sheet, mirror, styleMirror) {\r\n let id, styleId;\r\n if (!sheet)\r\n return {};\r\n if (sheet.ownerNode)\r\n id = mirror.getId(sheet.ownerNode);\r\n else\r\n styleId = styleMirror.getId(sheet);\r\n return {\r\n styleId,\r\n id,\r\n };\r\n}\r\nfunction initStyleSheetObserver({ styleSheetRuleCb, mirror, stylesheetManager }, { win }) {\r\n const insertRule = win.CSSStyleSheet.prototype.insertRule;\r\n win.CSSStyleSheet.prototype.insertRule = function (rule, index) {\r\n const { id, styleId } = getIdAndStyleId(this, mirror, stylesheetManager.styleMirror);\r\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n styleSheetRuleCb({\r\n id,\r\n styleId,\r\n adds: [{ rule, index }],\r\n });\r\n }\r\n return insertRule.apply(this, [rule, index]);\r\n };\r\n const deleteRule = win.CSSStyleSheet.prototype.deleteRule;\r\n win.CSSStyleSheet.prototype.deleteRule = function (index) {\r\n const { id, styleId } = getIdAndStyleId(this, mirror, stylesheetManager.styleMirror);\r\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n styleSheetRuleCb({\r\n id,\r\n styleId,\r\n removes: [{ index }],\r\n });\r\n }\r\n return deleteRule.apply(this, [index]);\r\n };\r\n let replace;\r\n if (win.CSSStyleSheet.prototype.replace) {\r\n replace = win.CSSStyleSheet.prototype.replace;\r\n win.CSSStyleSheet.prototype.replace = function (text) {\r\n const { id, styleId } = getIdAndStyleId(this, mirror, stylesheetManager.styleMirror);\r\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n styleSheetRuleCb({\r\n id,\r\n styleId,\r\n replace: text,\r\n });\r\n }\r\n return replace.apply(this, [text]);\r\n };\r\n }\r\n let replaceSync;\r\n if (win.CSSStyleSheet.prototype.replaceSync) {\r\n replaceSync = win.CSSStyleSheet.prototype.replaceSync;\r\n win.CSSStyleSheet.prototype.replaceSync = function (text) {\r\n const { id, styleId } = getIdAndStyleId(this, mirror, stylesheetManager.styleMirror);\r\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n styleSheetRuleCb({\r\n id,\r\n styleId,\r\n replaceSync: text,\r\n });\r\n }\r\n return replaceSync.apply(this, [text]);\r\n };\r\n }\r\n const supportedNestedCSSRuleTypes = {};\r\n if (isCSSGroupingRuleSupported) {\r\n supportedNestedCSSRuleTypes.CSSGroupingRule = win.CSSGroupingRule;\r\n }\r\n else {\r\n if (isCSSMediaRuleSupported) {\r\n supportedNestedCSSRuleTypes.CSSMediaRule = win.CSSMediaRule;\r\n }\r\n if (isCSSConditionRuleSupported) {\r\n supportedNestedCSSRuleTypes.CSSConditionRule = win.CSSConditionRule;\r\n }\r\n if (isCSSSupportsRuleSupported) {\r\n supportedNestedCSSRuleTypes.CSSSupportsRule = win.CSSSupportsRule;\r\n }\r\n }\r\n const unmodifiedFunctions = {};\r\n Object.entries(supportedNestedCSSRuleTypes).forEach(([typeKey, type]) => {\r\n unmodifiedFunctions[typeKey] = {\r\n insertRule: type.prototype.insertRule,\r\n deleteRule: type.prototype.deleteRule,\r\n };\r\n type.prototype.insertRule = function (rule, index) {\r\n const { id, styleId } = getIdAndStyleId(this.parentStyleSheet, mirror, stylesheetManager.styleMirror);\r\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n styleSheetRuleCb({\r\n id,\r\n styleId,\r\n adds: [\r\n {\r\n rule,\r\n index: [\r\n ...getNestedCSSRulePositions(this),\r\n index || 0,\r\n ],\r\n },\r\n ],\r\n });\r\n }\r\n return unmodifiedFunctions[typeKey].insertRule.apply(this, [rule, index]);\r\n };\r\n type.prototype.deleteRule = function (index) {\r\n const { id, styleId } = getIdAndStyleId(this.parentStyleSheet, mirror, stylesheetManager.styleMirror);\r\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n styleSheetRuleCb({\r\n id,\r\n styleId,\r\n removes: [\r\n { index: [...getNestedCSSRulePositions(this), index] },\r\n ],\r\n });\r\n }\r\n return unmodifiedFunctions[typeKey].deleteRule.apply(this, [index]);\r\n };\r\n });\r\n return () => {\r\n win.CSSStyleSheet.prototype.insertRule = insertRule;\r\n win.CSSStyleSheet.prototype.deleteRule = deleteRule;\r\n replace && (win.CSSStyleSheet.prototype.replace = replace);\r\n replaceSync && (win.CSSStyleSheet.prototype.replaceSync = replaceSync);\r\n Object.entries(supportedNestedCSSRuleTypes).forEach(([typeKey, type]) => {\r\n type.prototype.insertRule = unmodifiedFunctions[typeKey].insertRule;\r\n type.prototype.deleteRule = unmodifiedFunctions[typeKey].deleteRule;\r\n });\r\n };\r\n}\r\nfunction initAdoptedStyleSheetObserver({ mirror, stylesheetManager, }, host) {\r\n var _a, _b, _c;\r\n let hostId = null;\r\n if (host.nodeName === '#document')\r\n hostId = mirror.getId(host);\r\n else\r\n hostId = mirror.getId(host.host);\r\n const patchTarget = host.nodeName === '#document'\r\n ? (_a = host.defaultView) === null || _a === void 0 ? void 0 : _a.Document\r\n : (_c = (_b = host.ownerDocument) === null || _b === void 0 ? void 0 : _b.defaultView) === null || _c === void 0 ? void 0 : _c.ShadowRoot;\r\n const originalPropertyDescriptor = Object.getOwnPropertyDescriptor(patchTarget === null || patchTarget === void 0 ? void 0 : patchTarget.prototype, 'adoptedStyleSheets');\r\n if (hostId === null ||\r\n hostId === -1 ||\r\n !patchTarget ||\r\n !originalPropertyDescriptor)\r\n return () => {\r\n };\r\n Object.defineProperty(host, 'adoptedStyleSheets', {\r\n configurable: originalPropertyDescriptor.configurable,\r\n enumerable: originalPropertyDescriptor.enumerable,\r\n get() {\r\n var _a;\r\n return (_a = originalPropertyDescriptor.get) === null || _a === void 0 ? void 0 : _a.call(this);\r\n },\r\n set(sheets) {\r\n var _a;\r\n const result = (_a = originalPropertyDescriptor.set) === null || _a === void 0 ? void 0 : _a.call(this, sheets);\r\n if (hostId !== null && hostId !== -1) {\r\n try {\r\n stylesheetManager.adoptStyleSheets(sheets, hostId);\r\n }\r\n catch (e) {\r\n }\r\n }\r\n return result;\r\n },\r\n });\r\n return () => {\r\n Object.defineProperty(host, 'adoptedStyleSheets', {\r\n configurable: originalPropertyDescriptor.configurable,\r\n enumerable: originalPropertyDescriptor.enumerable,\r\n get: originalPropertyDescriptor.get,\r\n set: originalPropertyDescriptor.set,\r\n });\r\n };\r\n}\r\nfunction initStyleDeclarationObserver({ styleDeclarationCb, mirror, ignoreCSSAttributes, stylesheetManager, }, { win }) {\r\n const setProperty = win.CSSStyleDeclaration.prototype.setProperty;\r\n win.CSSStyleDeclaration.prototype.setProperty = function (property, value, priority) {\r\n var _a;\r\n if (ignoreCSSAttributes.has(property)) {\r\n return setProperty.apply(this, [property, value, priority]);\r\n }\r\n const { id, styleId } = getIdAndStyleId((_a = this.parentRule) === null || _a === void 0 ? void 0 : _a.parentStyleSheet, mirror, stylesheetManager.styleMirror);\r\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n styleDeclarationCb({\r\n id,\r\n styleId,\r\n set: {\r\n property,\r\n value,\r\n priority,\r\n },\r\n index: getNestedCSSRulePositions(this.parentRule),\r\n });\r\n }\r\n return setProperty.apply(this, [property, value, priority]);\r\n };\r\n const removeProperty = win.CSSStyleDeclaration.prototype.removeProperty;\r\n win.CSSStyleDeclaration.prototype.removeProperty = function (property) {\r\n var _a;\r\n if (ignoreCSSAttributes.has(property)) {\r\n return removeProperty.apply(this, [property]);\r\n }\r\n const { id, styleId } = getIdAndStyleId((_a = this.parentRule) === null || _a === void 0 ? void 0 : _a.parentStyleSheet, mirror, stylesheetManager.styleMirror);\r\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n styleDeclarationCb({\r\n id,\r\n styleId,\r\n remove: {\r\n property,\r\n },\r\n index: getNestedCSSRulePositions(this.parentRule),\r\n });\r\n }\r\n return removeProperty.apply(this, [property]);\r\n };\r\n return () => {\r\n win.CSSStyleDeclaration.prototype.setProperty = setProperty;\r\n win.CSSStyleDeclaration.prototype.removeProperty = removeProperty;\r\n };\r\n}\r\nfunction initMediaInteractionObserver({ mediaInteractionCb, blockClass, blockSelector, mirror, sampling, }) {\r\n const handler = (type) => throttle((event) => {\r\n const target = getEventTarget(event);\r\n if (!target ||\r\n isBlocked(target, blockClass, blockSelector, true)) {\r\n return;\r\n }\r\n const { currentTime, volume, muted, playbackRate, } = target;\r\n mediaInteractionCb({\r\n type,\r\n id: mirror.getId(target),\r\n currentTime,\r\n volume,\r\n muted,\r\n playbackRate,\r\n });\r\n }, sampling.media || 500);\r\n const handlers = [\r\n on('play', handler(0)),\r\n on('pause', handler(1)),\r\n on('seeked', handler(2)),\r\n on('volumechange', handler(3)),\r\n on('ratechange', handler(4)),\r\n ];\r\n return () => {\r\n handlers.forEach((h) => h());\r\n };\r\n}\r\nfunction initFontObserver({ fontCb, doc }) {\r\n const win = doc.defaultView;\r\n if (!win) {\r\n return () => {\r\n };\r\n }\r\n const handlers = [];\r\n const fontMap = new WeakMap();\r\n const originalFontFace = win.FontFace;\r\n win.FontFace = function FontFace(family, source, descriptors) {\r\n const fontFace = new originalFontFace(family, source, descriptors);\r\n fontMap.set(fontFace, {\r\n family,\r\n buffer: typeof source !== 'string',\r\n descriptors,\r\n fontSource: typeof source === 'string'\r\n ? source\r\n : JSON.stringify(Array.from(new Uint8Array(source))),\r\n });\r\n return fontFace;\r\n };\r\n const restoreHandler = patch(doc.fonts, 'add', function (original) {\r\n return function (fontFace) {\r\n setTimeout(() => {\r\n const p = fontMap.get(fontFace);\r\n if (p) {\r\n fontCb(p);\r\n fontMap.delete(fontFace);\r\n }\r\n }, 0);\r\n return original.apply(this, [fontFace]);\r\n };\r\n });\r\n handlers.push(() => {\r\n win.FontFace = originalFontFace;\r\n });\r\n handlers.push(restoreHandler);\r\n return () => {\r\n handlers.forEach((h) => h());\r\n };\r\n}\r\nfunction initSelectionObserver(param) {\r\n const { doc, mirror, blockClass, blockSelector, selectionCb } = param;\r\n let collapsed = true;\r\n const updateSelection = () => {\r\n const selection = doc.getSelection();\r\n if (!selection || (collapsed && (selection === null || selection === void 0 ? void 0 : selection.isCollapsed)))\r\n return;\r\n collapsed = selection.isCollapsed || false;\r\n const ranges = [];\r\n const count = selection.rangeCount || 0;\r\n for (let i = 0; i < count; i++) {\r\n const range = selection.getRangeAt(i);\r\n const { startContainer, startOffset, endContainer, endOffset } = range;\r\n const blocked = isBlocked(startContainer, blockClass, blockSelector, true) ||\r\n isBlocked(endContainer, blockClass, blockSelector, true);\r\n if (blocked)\r\n continue;\r\n ranges.push({\r\n start: mirror.getId(startContainer),\r\n startOffset,\r\n end: mirror.getId(endContainer),\r\n endOffset,\r\n });\r\n }\r\n selectionCb({ ranges });\r\n };\r\n updateSelection();\r\n return on('selectionchange', updateSelection);\r\n}\r\nfunction mergeHooks(o, hooks) {\r\n const { mutationCb, mousemoveCb, mouseInteractionCb, scrollCb, viewportResizeCb, inputCb, mediaInteractionCb, styleSheetRuleCb, styleDeclarationCb, canvasMutationCb, fontCb, selectionCb, } = o;\r\n o.mutationCb = (...p) => {\r\n if (hooks.mutation) {\r\n hooks.mutation(...p);\r\n }\r\n mutationCb(...p);\r\n };\r\n o.mousemoveCb = (...p) => {\r\n if (hooks.mousemove) {\r\n hooks.mousemove(...p);\r\n }\r\n mousemoveCb(...p);\r\n };\r\n o.mouseInteractionCb = (...p) => {\r\n if (hooks.mouseInteraction) {\r\n hooks.mouseInteraction(...p);\r\n }\r\n mouseInteractionCb(...p);\r\n };\r\n o.scrollCb = (...p) => {\r\n if (hooks.scroll) {\r\n hooks.scroll(...p);\r\n }\r\n scrollCb(...p);\r\n };\r\n o.viewportResizeCb = (...p) => {\r\n if (hooks.viewportResize) {\r\n hooks.viewportResize(...p);\r\n }\r\n viewportResizeCb(...p);\r\n };\r\n o.inputCb = (...p) => {\r\n if (hooks.input) {\r\n hooks.input(...p);\r\n }\r\n inputCb(...p);\r\n };\r\n o.mediaInteractionCb = (...p) => {\r\n if (hooks.mediaInteaction) {\r\n hooks.mediaInteaction(...p);\r\n }\r\n mediaInteractionCb(...p);\r\n };\r\n o.styleSheetRuleCb = (...p) => {\r\n if (hooks.styleSheetRule) {\r\n hooks.styleSheetRule(...p);\r\n }\r\n styleSheetRuleCb(...p);\r\n };\r\n o.styleDeclarationCb = (...p) => {\r\n if (hooks.styleDeclaration) {\r\n hooks.styleDeclaration(...p);\r\n }\r\n styleDeclarationCb(...p);\r\n };\r\n o.canvasMutationCb = (...p) => {\r\n if (hooks.canvasMutation) {\r\n hooks.canvasMutation(...p);\r\n }\r\n canvasMutationCb(...p);\r\n };\r\n o.fontCb = (...p) => {\r\n if (hooks.font) {\r\n hooks.font(...p);\r\n }\r\n fontCb(...p);\r\n };\r\n o.selectionCb = (...p) => {\r\n if (hooks.selection) {\r\n hooks.selection(...p);\r\n }\r\n selectionCb(...p);\r\n };\r\n}\r\nfunction initObservers(o, hooks = {}) {\r\n const currentWindow = o.doc.defaultView;\r\n if (!currentWindow) {\r\n return () => {\r\n };\r\n }\r\n mergeHooks(o, hooks);\r\n const mutationObserver = initMutationObserver(o, o.doc);\r\n const mousemoveHandler = initMoveObserver(o);\r\n const mouseInteractionHandler = initMouseInteractionObserver(o);\r\n const scrollHandler = initScrollObserver(o);\r\n const viewportResizeHandler = initViewportResizeObserver(o);\r\n const inputHandler = initInputObserver(o);\r\n const mediaInteractionHandler = initMediaInteractionObserver(o);\r\n const styleSheetObserver = initStyleSheetObserver(o, { win: currentWindow });\r\n const adoptedStyleSheetObserver = initAdoptedStyleSheetObserver(o, o.doc);\r\n const styleDeclarationObserver = initStyleDeclarationObserver(o, {\r\n win: currentWindow,\r\n });\r\n const fontObserver = o.collectFonts\r\n ? initFontObserver(o)\r\n : () => {\r\n };\r\n const selectionObserver = initSelectionObserver(o);\r\n const pluginHandlers = [];\r\n for (const plugin of o.plugins) {\r\n pluginHandlers.push(plugin.observer(plugin.callback, currentWindow, plugin.options));\r\n }\r\n return () => {\r\n mutationBuffers.forEach((b) => b.reset());\r\n mutationObserver.disconnect();\r\n mousemoveHandler();\r\n mouseInteractionHandler();\r\n scrollHandler();\r\n viewportResizeHandler();\r\n inputHandler();\r\n mediaInteractionHandler();\r\n styleSheetObserver();\r\n adoptedStyleSheetObserver();\r\n styleDeclarationObserver();\r\n fontObserver();\r\n selectionObserver();\r\n pluginHandlers.forEach((h) => h());\r\n };\r\n}\n\nexport { INPUT_TAGS, initAdoptedStyleSheetObserver, initMutationObserver, initObservers, initScrollObserver, mutationBuffers };\n","class CrossOriginIframeMirror {\r\n constructor(generateIdFn) {\r\n this.generateIdFn = generateIdFn;\r\n this.iframeIdToRemoteIdMap = new WeakMap();\r\n this.iframeRemoteIdToIdMap = new WeakMap();\r\n }\r\n getId(iframe, remoteId, idToRemoteMap, remoteToIdMap) {\r\n const idToRemoteIdMap = idToRemoteMap || this.getIdToRemoteIdMap(iframe);\r\n const remoteIdToIdMap = remoteToIdMap || this.getRemoteIdToIdMap(iframe);\r\n let id = idToRemoteIdMap.get(remoteId);\r\n if (!id) {\r\n id = this.generateIdFn();\r\n idToRemoteIdMap.set(remoteId, id);\r\n remoteIdToIdMap.set(id, remoteId);\r\n }\r\n return id;\r\n }\r\n getIds(iframe, remoteId) {\r\n const idToRemoteIdMap = this.getIdToRemoteIdMap(iframe);\r\n const remoteIdToIdMap = this.getRemoteIdToIdMap(iframe);\r\n return remoteId.map((id) => this.getId(iframe, id, idToRemoteIdMap, remoteIdToIdMap));\r\n }\r\n getRemoteId(iframe, id, map) {\r\n const remoteIdToIdMap = map || this.getRemoteIdToIdMap(iframe);\r\n if (typeof id !== 'number')\r\n return id;\r\n const remoteId = remoteIdToIdMap.get(id);\r\n if (!remoteId)\r\n return -1;\r\n return remoteId;\r\n }\r\n getRemoteIds(iframe, ids) {\r\n const remoteIdToIdMap = this.getRemoteIdToIdMap(iframe);\r\n return ids.map((id) => this.getRemoteId(iframe, id, remoteIdToIdMap));\r\n }\r\n reset(iframe) {\r\n if (!iframe) {\r\n this.iframeIdToRemoteIdMap = new WeakMap();\r\n this.iframeRemoteIdToIdMap = new WeakMap();\r\n return;\r\n }\r\n this.iframeIdToRemoteIdMap.delete(iframe);\r\n this.iframeRemoteIdToIdMap.delete(iframe);\r\n }\r\n getIdToRemoteIdMap(iframe) {\r\n let idToRemoteIdMap = this.iframeIdToRemoteIdMap.get(iframe);\r\n if (!idToRemoteIdMap) {\r\n idToRemoteIdMap = new Map();\r\n this.iframeIdToRemoteIdMap.set(iframe, idToRemoteIdMap);\r\n }\r\n return idToRemoteIdMap;\r\n }\r\n getRemoteIdToIdMap(iframe) {\r\n let remoteIdToIdMap = this.iframeRemoteIdToIdMap.get(iframe);\r\n if (!remoteIdToIdMap) {\r\n remoteIdToIdMap = new Map();\r\n this.iframeRemoteIdToIdMap.set(iframe, remoteIdToIdMap);\r\n }\r\n return remoteIdToIdMap;\r\n }\r\n}\n\nexport { CrossOriginIframeMirror as default };\n","import { genId } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\nimport CrossOriginIframeMirror from './cross-origin-iframe-mirror.js';\nimport { EventType, IncrementalSource } from '../../../types/dist/types.js';\n\nclass IframeManager {\r\n constructor(options) {\r\n this.iframes = new WeakMap();\r\n this.crossOriginIframeMap = new WeakMap();\r\n this.crossOriginIframeMirror = new CrossOriginIframeMirror(genId);\r\n this.mutationCb = options.mutationCb;\r\n this.wrappedEmit = options.wrappedEmit;\r\n this.stylesheetManager = options.stylesheetManager;\r\n this.recordCrossOriginIframes = options.recordCrossOriginIframes;\r\n this.crossOriginIframeStyleMirror = new CrossOriginIframeMirror(this.stylesheetManager.styleMirror.generateId.bind(this.stylesheetManager.styleMirror));\r\n this.mirror = options.mirror;\r\n if (this.recordCrossOriginIframes) {\r\n window.addEventListener('message', this.handleMessage.bind(this));\r\n }\r\n }\r\n addIframe(iframeEl) {\r\n this.iframes.set(iframeEl, true);\r\n if (iframeEl.contentWindow)\r\n this.crossOriginIframeMap.set(iframeEl.contentWindow, iframeEl);\r\n }\r\n addLoadListener(cb) {\r\n this.loadListener = cb;\r\n }\r\n attachIframe(iframeEl, childSn) {\r\n var _a;\r\n this.mutationCb({\r\n adds: [\r\n {\r\n parentId: this.mirror.getId(iframeEl),\r\n nextId: null,\r\n node: childSn,\r\n },\r\n ],\r\n removes: [],\r\n texts: [],\r\n attributes: [],\r\n isAttachIframe: true,\r\n });\r\n (_a = this.loadListener) === null || _a === void 0 ? void 0 : _a.call(this, iframeEl);\r\n if (iframeEl.contentDocument &&\r\n iframeEl.contentDocument.adoptedStyleSheets &&\r\n iframeEl.contentDocument.adoptedStyleSheets.length > 0)\r\n this.stylesheetManager.adoptStyleSheets(iframeEl.contentDocument.adoptedStyleSheets, this.mirror.getId(iframeEl.contentDocument));\r\n }\r\n handleMessage(message) {\r\n if (message.data.type === 'rrweb') {\r\n const iframeSourceWindow = message.source;\r\n if (!iframeSourceWindow)\r\n return;\r\n const iframeEl = this.crossOriginIframeMap.get(message.source);\r\n if (!iframeEl)\r\n return;\r\n const transformedEvent = this.transformCrossOriginEvent(iframeEl, message.data.event);\r\n if (transformedEvent)\r\n this.wrappedEmit(transformedEvent, message.data.isCheckout);\r\n }\r\n }\r\n transformCrossOriginEvent(iframeEl, e) {\r\n var _a;\r\n switch (e.type) {\r\n case EventType.FullSnapshot: {\r\n this.crossOriginIframeMirror.reset(iframeEl);\r\n this.crossOriginIframeStyleMirror.reset(iframeEl);\r\n this.replaceIdOnNode(e.data.node, iframeEl);\r\n return {\r\n timestamp: e.timestamp,\r\n type: EventType.IncrementalSnapshot,\r\n data: {\r\n source: IncrementalSource.Mutation,\r\n adds: [\r\n {\r\n parentId: this.mirror.getId(iframeEl),\r\n nextId: null,\r\n node: e.data.node,\r\n },\r\n ],\r\n removes: [],\r\n texts: [],\r\n attributes: [],\r\n isAttachIframe: true,\r\n },\r\n };\r\n }\r\n case EventType.Meta:\r\n case EventType.Load:\r\n case EventType.DomContentLoaded: {\r\n return false;\r\n }\r\n case EventType.Plugin: {\r\n return e;\r\n }\r\n case EventType.Custom: {\r\n this.replaceIds(e.data.payload, iframeEl, ['id', 'parentId', 'previousId', 'nextId']);\r\n return e;\r\n }\r\n case EventType.IncrementalSnapshot: {\r\n switch (e.data.source) {\r\n case IncrementalSource.Mutation: {\r\n e.data.adds.forEach((n) => {\r\n this.replaceIds(n, iframeEl, [\r\n 'parentId',\r\n 'nextId',\r\n 'previousId',\r\n ]);\r\n this.replaceIdOnNode(n.node, iframeEl);\r\n });\r\n e.data.removes.forEach((n) => {\r\n this.replaceIds(n, iframeEl, ['parentId', 'id']);\r\n });\r\n e.data.attributes.forEach((n) => {\r\n this.replaceIds(n, iframeEl, ['id']);\r\n });\r\n e.data.texts.forEach((n) => {\r\n this.replaceIds(n, iframeEl, ['id']);\r\n });\r\n return e;\r\n }\r\n case IncrementalSource.Drag:\r\n case IncrementalSource.TouchMove:\r\n case IncrementalSource.MouseMove: {\r\n e.data.positions.forEach((p) => {\r\n this.replaceIds(p, iframeEl, ['id']);\r\n });\r\n return e;\r\n }\r\n case IncrementalSource.ViewportResize: {\r\n return false;\r\n }\r\n case IncrementalSource.MediaInteraction:\r\n case IncrementalSource.MouseInteraction:\r\n case IncrementalSource.Scroll:\r\n case IncrementalSource.CanvasMutation:\r\n case IncrementalSource.Input: {\r\n this.replaceIds(e.data, iframeEl, ['id']);\r\n return e;\r\n }\r\n case IncrementalSource.StyleSheetRule:\r\n case IncrementalSource.StyleDeclaration: {\r\n this.replaceIds(e.data, iframeEl, ['id']);\r\n this.replaceStyleIds(e.data, iframeEl, ['styleId']);\r\n return e;\r\n }\r\n case IncrementalSource.Font: {\r\n return e;\r\n }\r\n case IncrementalSource.Selection: {\r\n e.data.ranges.forEach((range) => {\r\n this.replaceIds(range, iframeEl, ['start', 'end']);\r\n });\r\n return e;\r\n }\r\n case IncrementalSource.AdoptedStyleSheet: {\r\n this.replaceIds(e.data, iframeEl, ['id']);\r\n this.replaceStyleIds(e.data, iframeEl, ['styleIds']);\r\n (_a = e.data.styles) === null || _a === void 0 ? void 0 : _a.forEach((style) => {\r\n this.replaceStyleIds(style, iframeEl, ['styleId']);\r\n });\r\n return e;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n replace(iframeMirror, obj, iframeEl, keys) {\r\n for (const key of keys) {\r\n if (!Array.isArray(obj[key]) && typeof obj[key] !== 'number')\r\n continue;\r\n if (Array.isArray(obj[key])) {\r\n obj[key] = iframeMirror.getIds(iframeEl, obj[key]);\r\n }\r\n else {\r\n obj[key] = iframeMirror.getId(iframeEl, obj[key]);\r\n }\r\n }\r\n return obj;\r\n }\r\n replaceIds(obj, iframeEl, keys) {\r\n return this.replace(this.crossOriginIframeMirror, obj, iframeEl, keys);\r\n }\r\n replaceStyleIds(obj, iframeEl, keys) {\r\n return this.replace(this.crossOriginIframeStyleMirror, obj, iframeEl, keys);\r\n }\r\n replaceIdOnNode(node, iframeEl) {\r\n this.replaceIds(node, iframeEl, ['id']);\r\n if ('childNodes' in node) {\r\n node.childNodes.forEach((child) => {\r\n this.replaceIdOnNode(child, iframeEl);\r\n });\r\n }\r\n }\r\n}\n\nexport { IframeManager };\n","import { initMutationObserver, initScrollObserver, initAdoptedStyleSheetObserver } from './observer.js';\nimport { patch } from '../utils.js';\nimport { isNativeShadowDom } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\n\nclass ShadowDomManager {\r\n constructor(options) {\r\n this.shadowDoms = new WeakSet();\r\n this.restorePatches = [];\r\n this.mutationCb = options.mutationCb;\r\n this.scrollCb = options.scrollCb;\r\n this.bypassOptions = options.bypassOptions;\r\n this.mirror = options.mirror;\r\n const manager = this;\r\n this.restorePatches.push(patch(Element.prototype, 'attachShadow', function (original) {\r\n return function (option) {\r\n const shadowRoot = original.call(this, option);\r\n if (this.shadowRoot)\r\n manager.addShadowRoot(this.shadowRoot, this.ownerDocument);\r\n return shadowRoot;\r\n };\r\n }));\r\n }\r\n addShadowRoot(shadowRoot, doc) {\r\n if (!isNativeShadowDom(shadowRoot))\r\n return;\r\n if (this.shadowDoms.has(shadowRoot))\r\n return;\r\n this.shadowDoms.add(shadowRoot);\r\n initMutationObserver(Object.assign(Object.assign({}, this.bypassOptions), { doc, mutationCb: this.mutationCb, mirror: this.mirror, shadowDomManager: this }), shadowRoot);\r\n initScrollObserver(Object.assign(Object.assign({}, this.bypassOptions), { scrollCb: this.scrollCb, doc: shadowRoot, mirror: this.mirror }));\r\n setTimeout(() => {\r\n if (shadowRoot.adoptedStyleSheets &&\r\n shadowRoot.adoptedStyleSheets.length > 0)\r\n this.bypassOptions.stylesheetManager.adoptStyleSheets(shadowRoot.adoptedStyleSheets, this.mirror.getId(shadowRoot.host));\r\n initAdoptedStyleSheetObserver({\r\n mirror: this.mirror,\r\n stylesheetManager: this.bypassOptions.stylesheetManager,\r\n }, shadowRoot);\r\n }, 0);\r\n }\r\n observeAttachShadow(iframeElement) {\r\n if (iframeElement.contentWindow) {\r\n const manager = this;\r\n this.restorePatches.push(patch(iframeElement.contentWindow.HTMLElement.prototype, 'attachShadow', function (original) {\r\n return function (option) {\r\n const shadowRoot = original.call(this, option);\r\n if (this.shadowRoot)\r\n manager.addShadowRoot(this.shadowRoot, iframeElement.contentDocument);\r\n return shadowRoot;\r\n };\r\n }));\r\n }\r\n }\r\n reset() {\r\n this.restorePatches.forEach((restorePatch) => restorePatch());\r\n this.shadowDoms = new WeakSet();\r\n }\r\n}\n\nexport { ShadowDomManager };\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n\r\nfunction __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nfunction __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\n\nexport { __awaiter, __rest };\n","/*\n * base64-arraybuffer 1.0.1 <https://github.com/niklasvh/base64-arraybuffer>\n * Copyright (c) 2021 Niklas von Hertzen <https://hertzen.com>\n * Released under MIT License\n */\nvar chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n// Use a lookup table to find the index.\nvar lookup = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256);\nfor (var i = 0; i < chars.length; i++) {\n lookup[chars.charCodeAt(i)] = i;\n}\nvar encode = function (arraybuffer) {\n var bytes = new Uint8Array(arraybuffer), i, len = bytes.length, base64 = '';\n for (i = 0; i < len; i += 3) {\n base64 += chars[bytes[i] >> 2];\n base64 += chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];\n base64 += chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];\n base64 += chars[bytes[i + 2] & 63];\n }\n if (len % 3 === 2) {\n base64 = base64.substring(0, base64.length - 1) + '=';\n }\n else if (len % 3 === 1) {\n base64 = base64.substring(0, base64.length - 2) + '==';\n }\n return base64;\n};\nvar decode = function (base64) {\n var bufferLength = base64.length * 0.75, len = base64.length, i, p = 0, encoded1, encoded2, encoded3, encoded4;\n if (base64[base64.length - 1] === '=') {\n bufferLength--;\n if (base64[base64.length - 2] === '=') {\n bufferLength--;\n }\n }\n var arraybuffer = new ArrayBuffer(bufferLength), bytes = new Uint8Array(arraybuffer);\n for (i = 0; i < len; i += 4) {\n encoded1 = lookup[base64.charCodeAt(i)];\n encoded2 = lookup[base64.charCodeAt(i + 1)];\n encoded3 = lookup[base64.charCodeAt(i + 2)];\n encoded4 = lookup[base64.charCodeAt(i + 3)];\n bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n }\n return arraybuffer;\n};\n\nexport { decode, encode };\n","import { encode } from './../../../../../../ext/base64-arraybuffer/dist/base64-arraybuffer.es5.js';\n\nconst canvasVarMap = new Map();\r\nfunction variableListFor(ctx, ctor) {\r\n let contextMap = canvasVarMap.get(ctx);\r\n if (!contextMap) {\r\n contextMap = new Map();\r\n canvasVarMap.set(ctx, contextMap);\r\n }\r\n if (!contextMap.has(ctor)) {\r\n contextMap.set(ctor, []);\r\n }\r\n return contextMap.get(ctor);\r\n}\r\nconst saveWebGLVar = (value, win, ctx) => {\r\n if (!value ||\r\n !(isInstanceOfWebGLObject(value, win) || typeof value === 'object'))\r\n return;\r\n const name = value.constructor.name;\r\n const list = variableListFor(ctx, name);\r\n let index = list.indexOf(value);\r\n if (index === -1) {\r\n index = list.length;\r\n list.push(value);\r\n }\r\n return index;\r\n};\r\nfunction serializeArg(value, win, ctx) {\r\n if (value instanceof Array) {\r\n return value.map((arg) => serializeArg(arg, win, ctx));\r\n }\r\n else if (value === null) {\r\n return value;\r\n }\r\n else if (value instanceof Float32Array ||\r\n value instanceof Float64Array ||\r\n value instanceof Int32Array ||\r\n value instanceof Uint32Array ||\r\n value instanceof Uint8Array ||\r\n value instanceof Uint16Array ||\r\n value instanceof Int16Array ||\r\n value instanceof Int8Array ||\r\n value instanceof Uint8ClampedArray) {\r\n const name = value.constructor.name;\r\n return {\r\n rr_type: name,\r\n args: [Object.values(value)],\r\n };\r\n }\r\n else if (value instanceof ArrayBuffer) {\r\n const name = value.constructor.name;\r\n const base64 = encode(value);\r\n return {\r\n rr_type: name,\r\n base64,\r\n };\r\n }\r\n else if (value instanceof DataView) {\r\n const name = value.constructor.name;\r\n return {\r\n rr_type: name,\r\n args: [\r\n serializeArg(value.buffer, win, ctx),\r\n value.byteOffset,\r\n value.byteLength,\r\n ],\r\n };\r\n }\r\n else if (value instanceof HTMLImageElement) {\r\n const name = value.constructor.name;\r\n const { src } = value;\r\n return {\r\n rr_type: name,\r\n src,\r\n };\r\n }\r\n else if (value instanceof HTMLCanvasElement) {\r\n const name = 'HTMLImageElement';\r\n const src = value.toDataURL();\r\n return {\r\n rr_type: name,\r\n src,\r\n };\r\n }\r\n else if (value instanceof ImageData) {\r\n const name = value.constructor.name;\r\n return {\r\n rr_type: name,\r\n args: [serializeArg(value.data, win, ctx), value.width, value.height],\r\n };\r\n }\r\n else if (isInstanceOfWebGLObject(value, win) || typeof value === 'object') {\r\n const name = value.constructor.name;\r\n const index = saveWebGLVar(value, win, ctx);\r\n return {\r\n rr_type: name,\r\n index: index,\r\n };\r\n }\r\n return value;\r\n}\r\nconst serializeArgs = (args, win, ctx) => {\r\n return [...args].map((arg) => serializeArg(arg, win, ctx));\r\n};\r\nconst isInstanceOfWebGLObject = (value, win) => {\r\n const webGLConstructorNames = [\r\n 'WebGLActiveInfo',\r\n 'WebGLBuffer',\r\n 'WebGLFramebuffer',\r\n 'WebGLProgram',\r\n 'WebGLRenderbuffer',\r\n 'WebGLShader',\r\n 'WebGLShaderPrecisionFormat',\r\n 'WebGLTexture',\r\n 'WebGLUniformLocation',\r\n 'WebGLVertexArrayObject',\r\n 'WebGLVertexArrayObjectOES',\r\n ];\r\n const supportedWebGLConstructorNames = webGLConstructorNames.filter((name) => typeof win[name] === 'function');\r\n return Boolean(supportedWebGLConstructorNames.find((name) => value instanceof win[name]));\r\n};\n\nexport { isInstanceOfWebGLObject, saveWebGLVar, serializeArg, serializeArgs, variableListFor };\n","import { CanvasContext } from '../../../../../types/dist/types.js';\nimport { patch, isBlocked, hookSetter } from '../../../utils.js';\nimport { serializeArgs } from './serialize-args.js';\n\nfunction initCanvas2DMutationObserver(cb, win, blockClass, blockSelector) {\r\n const handlers = [];\r\n const props2D = Object.getOwnPropertyNames(win.CanvasRenderingContext2D.prototype);\r\n for (const prop of props2D) {\r\n try {\r\n if (typeof win.CanvasRenderingContext2D.prototype[prop] !== 'function') {\r\n continue;\r\n }\r\n const restoreHandler = patch(win.CanvasRenderingContext2D.prototype, prop, function (original) {\r\n return function (...args) {\r\n if (!isBlocked(this.canvas, blockClass, blockSelector, true)) {\r\n setTimeout(() => {\r\n const recordArgs = serializeArgs([...args], win, this);\r\n cb(this.canvas, {\r\n type: CanvasContext['2D'],\r\n property: prop,\r\n args: recordArgs,\r\n });\r\n }, 0);\r\n }\r\n return original.apply(this, args);\r\n };\r\n });\r\n handlers.push(restoreHandler);\r\n }\r\n catch (_a) {\r\n const hookHandler = hookSetter(win.CanvasRenderingContext2D.prototype, prop, {\r\n set(v) {\r\n cb(this.canvas, {\r\n type: CanvasContext['2D'],\r\n property: prop,\r\n args: [v],\r\n setter: true,\r\n });\r\n },\r\n });\r\n handlers.push(hookHandler);\r\n }\r\n }\r\n return () => {\r\n handlers.forEach((h) => h());\r\n };\r\n}\n\nexport { initCanvas2DMutationObserver as default };\n","import { patch, isBlocked } from '../../../utils.js';\n\nfunction initCanvasContextObserver(win, blockClass, blockSelector) {\r\n const handlers = [];\r\n try {\r\n const restoreHandler = patch(win.HTMLCanvasElement.prototype, 'getContext', function (original) {\r\n return function (contextType, ...args) {\r\n if (!isBlocked(this, blockClass, blockSelector, true)) {\r\n if (!('__context' in this))\r\n this.__context = contextType;\r\n }\r\n return original.apply(this, [contextType, ...args]);\r\n };\r\n });\r\n handlers.push(restoreHandler);\r\n }\r\n catch (_a) {\r\n console.error('failed to patch HTMLCanvasElement.prototype.getContext');\r\n }\r\n return () => {\r\n handlers.forEach((h) => h());\r\n };\r\n}\n\nexport { initCanvasContextObserver as default };\n","import { CanvasContext } from '../../../../../types/dist/types.js';\nimport { patch, isBlocked, hookSetter } from '../../../utils.js';\nimport { saveWebGLVar, serializeArgs } from './serialize-args.js';\n\nfunction patchGLPrototype(prototype, type, cb, blockClass, blockSelector, mirror, win) {\r\n const handlers = [];\r\n const props = Object.getOwnPropertyNames(prototype);\r\n for (const prop of props) {\r\n if ([\r\n 'isContextLost',\r\n 'canvas',\r\n 'drawingBufferWidth',\r\n 'drawingBufferHeight',\r\n ].includes(prop)) {\r\n continue;\r\n }\r\n try {\r\n if (typeof prototype[prop] !== 'function') {\r\n continue;\r\n }\r\n const restoreHandler = patch(prototype, prop, function (original) {\r\n return function (...args) {\r\n const result = original.apply(this, args);\r\n saveWebGLVar(result, win, this);\r\n if (!isBlocked(this.canvas, blockClass, blockSelector, true)) {\r\n const recordArgs = serializeArgs([...args], win, this);\r\n const mutation = {\r\n type,\r\n property: prop,\r\n args: recordArgs,\r\n };\r\n cb(this.canvas, mutation);\r\n }\r\n return result;\r\n };\r\n });\r\n handlers.push(restoreHandler);\r\n }\r\n catch (_a) {\r\n const hookHandler = hookSetter(prototype, prop, {\r\n set(v) {\r\n cb(this.canvas, {\r\n type,\r\n property: prop,\r\n args: [v],\r\n setter: true,\r\n });\r\n },\r\n });\r\n handlers.push(hookHandler);\r\n }\r\n }\r\n return handlers;\r\n}\r\nfunction initCanvasWebGLMutationObserver(cb, win, blockClass, blockSelector, mirror) {\r\n const handlers = [];\r\n handlers.push(...patchGLPrototype(win.WebGLRenderingContext.prototype, CanvasContext.WebGL, cb, blockClass, blockSelector, mirror, win));\r\n if (typeof win.WebGL2RenderingContext !== 'undefined') {\r\n handlers.push(...patchGLPrototype(win.WebGL2RenderingContext.prototype, CanvasContext.WebGL2, cb, blockClass, blockSelector, mirror, win));\r\n }\r\n return () => {\r\n handlers.forEach((h) => h());\r\n };\r\n}\n\nexport { initCanvasWebGLMutationObserver as default };\n","var WorkerClass = null;\n\ntry {\n var WorkerThreads =\n typeof module !== 'undefined' && typeof module.require === 'function' && module.require('worker_threads') ||\n typeof __non_webpack_require__ === 'function' && __non_webpack_require__('worker_threads') ||\n typeof require === 'function' && require('worker_threads');\n WorkerClass = WorkerThreads.Worker;\n} catch(e) {} // eslint-disable-line\n\nexport { WorkerClass };\n","import { WorkerClass } from './_rollup-plugin-web-worker-loader__helper__node__WorkerClass.js';\n\nfunction decodeBase64(base64, enableUnicode) {\n return Buffer.from(base64, 'base64').toString(enableUnicode ? 'utf16' : 'utf8');\n}\n\nfunction createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {\n var sourcemap = sourcemapArg === undefined ? null : sourcemapArg;\n var enableUnicode = enableUnicodeArg === undefined ? false : enableUnicodeArg;\n var source = decodeBase64(base64, enableUnicode);\n var start = source.indexOf('\\n', 10) + 1;\n var body = source.substring(start) + (sourcemap ? '\\/\\/# sourceMappingURL=' + sourcemap : '');\n return function WorkerFactory(options) {\n return new WorkerClass(body, Object.assign({}, options, { eval: true }));\n };\n}\n\nexport { createBase64WorkerFactory };\n","function decodeBase64(base64, enableUnicode) {\n var binaryString = atob(base64);\n if (enableUnicode) {\n var binaryView = new Uint8Array(binaryString.length);\n for (var i = 0, n = binaryString.length; i < n; ++i) {\n binaryView[i] = binaryString.charCodeAt(i);\n }\n return String.fromCharCode.apply(null, new Uint16Array(binaryView.buffer));\n }\n return binaryString;\n}\n\nfunction createURL(base64, sourcemapArg, enableUnicodeArg) {\n var sourcemap = sourcemapArg === undefined ? null : sourcemapArg;\n var enableUnicode = enableUnicodeArg === undefined ? false : enableUnicodeArg;\n var source = decodeBase64(base64, enableUnicode);\n var start = source.indexOf('\\n', 10) + 1;\n var body = source.substring(start) + (sourcemap ? '\\/\\/# sourceMappingURL=' + sourcemap : '');\n var blob = new Blob([body], { type: 'application/javascript' });\n return URL.createObjectURL(blob);\n}\n\nfunction createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {\n var url;\n return function WorkerFactory(options) {\n url = url || createURL(base64, sourcemapArg, enableUnicodeArg);\n return new Worker(url, options);\n };\n}\n\nexport { createBase64WorkerFactory };\n","var kIsNodeJS = Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]';\n\nfunction isNodeJS() {\n return kIsNodeJS;\n}\n\nexport { isNodeJS };\n","import { createBase64WorkerFactory as createBase64WorkerFactory$1 } from './_rollup-plugin-web-worker-loader__helper__node__createBase64WorkerFactory.js';\nimport { createBase64WorkerFactory as createBase64WorkerFactory$2 } from './_rollup-plugin-web-worker-loader__helper__browser__createBase64WorkerFactory.js';\nimport { isNodeJS } from './_rollup-plugin-web-worker-loader__helper__auto__isNodeJS.js';\n\nfunction createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {\n if (isNodeJS()) {\n return createBase64WorkerFactory$1(base64, sourcemapArg, enableUnicodeArg);\n }\n return createBase64WorkerFactory$2(base64, sourcemapArg, enableUnicodeArg);\n}\n\nexport { createBase64WorkerFactory };\n","import { createBase64WorkerFactory } from './_rollup-plugin-web-worker-loader__helper__auto__createBase64WorkerFactory.js';\n\nvar WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLg0KDQogICAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55DQogICAgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLg0KDQogICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEgNCiAgICBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkNCiAgICBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsDQogICAgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NDQogICAgTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1INCiAgICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SDQogICAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4NCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQogICAgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikgew0KICAgICAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH0NCiAgICAgICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7DQogICAgICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9DQogICAgICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvclsidGhyb3ciXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9DQogICAgICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfQ0KICAgICAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpOw0KICAgICAgICB9KTsNCiAgICB9CgogICAgLyoKICAgICAqIGJhc2U2NC1hcnJheWJ1ZmZlciAxLjAuMSA8aHR0cHM6Ly9naXRodWIuY29tL25pa2xhc3ZoL2Jhc2U2NC1hcnJheWJ1ZmZlcj4KICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBOaWtsYXMgdm9uIEhlcnR6ZW4gPGh0dHBzOi8vaGVydHplbi5jb20+CiAgICAgKiBSZWxlYXNlZCB1bmRlciBNSVQgTGljZW5zZQogICAgICovCiAgICB2YXIgY2hhcnMgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyc7CiAgICAvLyBVc2UgYSBsb29rdXAgdGFibGUgdG8gZmluZCB0aGUgaW5kZXguCiAgICB2YXIgbG9va3VwID0gdHlwZW9mIFVpbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gW10gOiBuZXcgVWludDhBcnJheSgyNTYpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykgewogICAgICAgIGxvb2t1cFtjaGFycy5jaGFyQ29kZUF0KGkpXSA9IGk7CiAgICB9CiAgICB2YXIgZW5jb2RlID0gZnVuY3Rpb24gKGFycmF5YnVmZmVyKSB7CiAgICAgICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlidWZmZXIpLCBpLCBsZW4gPSBieXRlcy5sZW5ndGgsIGJhc2U2NCA9ICcnOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMykgewogICAgICAgICAgICBiYXNlNjQgKz0gY2hhcnNbYnl0ZXNbaV0gPj4gMl07CiAgICAgICAgICAgIGJhc2U2NCArPSBjaGFyc1soKGJ5dGVzW2ldICYgMykgPDwgNCkgfCAoYnl0ZXNbaSArIDFdID4+IDQpXTsKICAgICAgICAgICAgYmFzZTY0ICs9IGNoYXJzWygoYnl0ZXNbaSArIDFdICYgMTUpIDw8IDIpIHwgKGJ5dGVzW2kgKyAyXSA+PiA2KV07CiAgICAgICAgICAgIGJhc2U2NCArPSBjaGFyc1tieXRlc1tpICsgMl0gJiA2M107CiAgICAgICAgfQogICAgICAgIGlmIChsZW4gJSAzID09PSAyKSB7CiAgICAgICAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDEpICsgJz0nOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChsZW4gJSAzID09PSAxKSB7CiAgICAgICAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDIpICsgJz09JzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJhc2U2NDsKICAgIH07CgogICAgY29uc3QgbGFzdEJsb2JNYXAgPSBuZXcgTWFwKCk7DQogICAgY29uc3QgdHJhbnNwYXJlbnRCbG9iTWFwID0gbmV3IE1hcCgpOw0KICAgIGZ1bmN0aW9uIGdldFRyYW5zcGFyZW50QmxvYkZvcih3aWR0aCwgaGVpZ2h0LCBkYXRhVVJMT3B0aW9ucykgew0KICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgew0KICAgICAgICAgICAgY29uc3QgaWQgPSBgJHt3aWR0aH0tJHtoZWlnaHR9YDsNCiAgICAgICAgICAgIGlmICgnT2Zmc2NyZWVuQ2FudmFzJyBpbiBnbG9iYWxUaGlzKSB7DQogICAgICAgICAgICAgICAgaWYgKHRyYW5zcGFyZW50QmxvYk1hcC5oYXMoaWQpKQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNwYXJlbnRCbG9iTWFwLmdldChpZCk7DQogICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2NyZWVuID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh3aWR0aCwgaGVpZ2h0KTsNCiAgICAgICAgICAgICAgICBvZmZzY3JlZW4uZ2V0Q29udGV4dCgnMmQnKTsNCiAgICAgICAgICAgICAgICBjb25zdCBibG9iID0geWllbGQgb2Zmc2NyZWVuLmNvbnZlcnRUb0Jsb2IoZGF0YVVSTE9wdGlvbnMpOw0KICAgICAgICAgICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0geWllbGQgYmxvYi5hcnJheUJ1ZmZlcigpOw0KICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U2NCA9IGVuY29kZShhcnJheUJ1ZmZlcik7DQogICAgICAgICAgICAgICAgdHJhbnNwYXJlbnRCbG9iTWFwLnNldChpZCwgYmFzZTY0KTsNCiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZTY0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICcnOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICB9DQogICAgY29uc3Qgd29ya2VyID0gc2VsZjsNCiAgICB3b3JrZXIub25tZXNzYWdlID0gZnVuY3Rpb24gKGUpIHsNCiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsNCiAgICAgICAgICAgIGlmICgnT2Zmc2NyZWVuQ2FudmFzJyBpbiBnbG9iYWxUaGlzKSB7DQogICAgICAgICAgICAgICAgY29uc3QgeyBpZCwgYml0bWFwLCB3aWR0aCwgaGVpZ2h0LCBkYXRhVVJMT3B0aW9ucyB9ID0gZS5kYXRhOw0KICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zcGFyZW50QmFzZTY0ID0gZ2V0VHJhbnNwYXJlbnRCbG9iRm9yKHdpZHRoLCBoZWlnaHQsIGRhdGFVUkxPcHRpb25zKTsNCiAgICAgICAgICAgICAgICBjb25zdCBvZmZzY3JlZW4gPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKHdpZHRoLCBoZWlnaHQpOw0KICAgICAgICAgICAgICAgIGNvbnN0IGN0eCA9IG9mZnNjcmVlbi5nZXRDb250ZXh0KCcyZCcpOw0KICAgICAgICAgICAgICAgIGN0eC5kcmF3SW1hZ2UoYml0bWFwLCAwLCAwKTsNCiAgICAgICAgICAgICAgICBiaXRtYXAuY2xvc2UoKTsNCiAgICAgICAgICAgICAgICBjb25zdCBibG9iID0geWllbGQgb2Zmc2NyZWVuLmNvbnZlcnRUb0Jsb2IoZGF0YVVSTE9wdGlvbnMpOw0KICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBibG9iLnR5cGU7DQogICAgICAgICAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSB5aWVsZCBibG9iLmFycmF5QnVmZmVyKCk7DQogICAgICAgICAgICAgICAgY29uc3QgYmFzZTY0ID0gZW5jb2RlKGFycmF5QnVmZmVyKTsNCiAgICAgICAgICAgICAgICBpZiAoIWxhc3RCbG9iTWFwLmhhcyhpZCkgJiYgKHlpZWxkIHRyYW5zcGFyZW50QmFzZTY0KSA9PT0gYmFzZTY0KSB7DQogICAgICAgICAgICAgICAgICAgIGxhc3RCbG9iTWFwLnNldChpZCwgYmFzZTY0KTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdvcmtlci5wb3N0TWVzc2FnZSh7IGlkIH0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAobGFzdEJsb2JNYXAuZ2V0KGlkKSA9PT0gYmFzZTY0KQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gd29ya2VyLnBvc3RNZXNzYWdlKHsgaWQgfSk7DQogICAgICAgICAgICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHsNCiAgICAgICAgICAgICAgICAgICAgaWQsDQogICAgICAgICAgICAgICAgICAgIHR5cGUsDQogICAgICAgICAgICAgICAgICAgIGJhc2U2NCwNCiAgICAgICAgICAgICAgICAgICAgd2lkdGgsDQogICAgICAgICAgICAgICAgICAgIGhlaWdodCwNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICBsYXN0QmxvYk1hcC5zZXQoaWQsIGJhc2U2NCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gd29ya2VyLnBvc3RNZXNzYWdlKHsgaWQ6IGUuZGF0YS5pZCB9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgfTsKCn0pKCk7Cgo=', null, false);\n/* eslint-enable */\n\nexport { WorkerFactory as default };\n","import { __rest, __awaiter } from './../../../../../../ext/tslib/tslib.es6.js';\nimport { isBlocked } from '../../../utils.js';\nimport { CanvasContext } from '../../../../../types/dist/types.js';\nimport initCanvas2DMutationObserver from './2d.js';\nimport initCanvasContextObserver from './canvas.js';\nimport initCanvasWebGLMutationObserver from './webgl.js';\nimport WorkerFactory from '../../../../../../_virtual/image-bitmap-data-url-worker.js';\n\nclass CanvasManager {\r\n constructor(options) {\r\n this.pendingCanvasMutations = new Map();\r\n this.rafStamps = { latestId: 0, invokeId: null };\r\n this.frozen = false;\r\n this.locked = false;\r\n this.processMutation = (target, mutation) => {\r\n const newFrame = this.rafStamps.invokeId &&\r\n this.rafStamps.latestId !== this.rafStamps.invokeId;\r\n if (newFrame || !this.rafStamps.invokeId)\r\n this.rafStamps.invokeId = this.rafStamps.latestId;\r\n if (!this.pendingCanvasMutations.has(target)) {\r\n this.pendingCanvasMutations.set(target, []);\r\n }\r\n this.pendingCanvasMutations.get(target).push(mutation);\r\n };\r\n const { sampling = 'all', win, blockClass, blockSelector, recordCanvas, dataURLOptions, } = options;\r\n this.mutationCb = options.mutationCb;\r\n this.mirror = options.mirror;\r\n if (recordCanvas && sampling === 'all')\r\n this.initCanvasMutationObserver(win, blockClass, blockSelector);\r\n if (recordCanvas && typeof sampling === 'number')\r\n this.initCanvasFPSObserver(sampling, win, blockClass, blockSelector, {\r\n dataURLOptions,\r\n });\r\n }\r\n reset() {\r\n this.pendingCanvasMutations.clear();\r\n this.resetObservers && this.resetObservers();\r\n }\r\n freeze() {\r\n this.frozen = true;\r\n }\r\n unfreeze() {\r\n this.frozen = false;\r\n }\r\n lock() {\r\n this.locked = true;\r\n }\r\n unlock() {\r\n this.locked = false;\r\n }\r\n initCanvasFPSObserver(fps, win, blockClass, blockSelector, options) {\r\n const canvasContextReset = initCanvasContextObserver(win, blockClass, blockSelector);\r\n const snapshotInProgressMap = new Map();\r\n const worker = new WorkerFactory();\r\n worker.onmessage = (e) => {\r\n const { id } = e.data;\r\n snapshotInProgressMap.set(id, false);\r\n if (!('base64' in e.data))\r\n return;\r\n const { base64, type, width, height } = e.data;\r\n this.mutationCb({\r\n id,\r\n type: CanvasContext['2D'],\r\n commands: [\r\n {\r\n property: 'clearRect',\r\n args: [0, 0, width, height],\r\n },\r\n {\r\n property: 'drawImage',\r\n args: [\r\n {\r\n rr_type: 'ImageBitmap',\r\n args: [\r\n {\r\n rr_type: 'Blob',\r\n data: [{ rr_type: 'ArrayBuffer', base64 }],\r\n type,\r\n },\r\n ],\r\n },\r\n 0,\r\n 0,\r\n ],\r\n },\r\n ],\r\n });\r\n };\r\n const timeBetweenSnapshots = 1000 / fps;\r\n let lastSnapshotTime = 0;\r\n let rafId;\r\n const getCanvas = () => {\r\n const matchedCanvas = [];\r\n win.document.querySelectorAll('canvas').forEach((canvas) => {\r\n if (!isBlocked(canvas, blockClass, blockSelector, true)) {\r\n matchedCanvas.push(canvas);\r\n }\r\n });\r\n return matchedCanvas;\r\n };\r\n const takeCanvasSnapshots = (timestamp) => {\r\n if (lastSnapshotTime &&\r\n timestamp - lastSnapshotTime < timeBetweenSnapshots) {\r\n rafId = requestAnimationFrame(takeCanvasSnapshots);\r\n return;\r\n }\r\n lastSnapshotTime = timestamp;\r\n getCanvas()\r\n .forEach((canvas) => __awaiter(this, void 0, void 0, function* () {\r\n var _a;\r\n const id = this.mirror.getId(canvas);\r\n if (snapshotInProgressMap.get(id))\r\n return;\r\n snapshotInProgressMap.set(id, true);\r\n if (['webgl', 'webgl2'].includes(canvas.__context)) {\r\n const context = canvas.getContext(canvas.__context);\r\n if (((_a = context === null || context === void 0 ? void 0 : context.getContextAttributes()) === null || _a === void 0 ? void 0 : _a.preserveDrawingBuffer) === false) {\r\n context === null || context === void 0 ? void 0 : context.clear(context.COLOR_BUFFER_BIT);\r\n }\r\n }\r\n const bitmap = yield createImageBitmap(canvas);\r\n worker.postMessage({\r\n id,\r\n bitmap,\r\n width: canvas.width,\r\n height: canvas.height,\r\n dataURLOptions: options.dataURLOptions,\r\n }, [bitmap]);\r\n }));\r\n rafId = requestAnimationFrame(takeCanvasSnapshots);\r\n };\r\n rafId = requestAnimationFrame(takeCanvasSnapshots);\r\n this.resetObservers = () => {\r\n canvasContextReset();\r\n cancelAnimationFrame(rafId);\r\n };\r\n }\r\n initCanvasMutationObserver(win, blockClass, blockSelector) {\r\n this.startRAFTimestamping();\r\n this.startPendingCanvasMutationFlusher();\r\n const canvasContextReset = initCanvasContextObserver(win, blockClass, blockSelector);\r\n const canvas2DReset = initCanvas2DMutationObserver(this.processMutation.bind(this), win, blockClass, blockSelector);\r\n const canvasWebGL1and2Reset = initCanvasWebGLMutationObserver(this.processMutation.bind(this), win, blockClass, blockSelector, this.mirror);\r\n this.resetObservers = () => {\r\n canvasContextReset();\r\n canvas2DReset();\r\n canvasWebGL1and2Reset();\r\n };\r\n }\r\n startPendingCanvasMutationFlusher() {\r\n requestAnimationFrame(() => this.flushPendingCanvasMutations());\r\n }\r\n startRAFTimestamping() {\r\n const setLatestRAFTimestamp = (timestamp) => {\r\n this.rafStamps.latestId = timestamp;\r\n requestAnimationFrame(setLatestRAFTimestamp);\r\n };\r\n requestAnimationFrame(setLatestRAFTimestamp);\r\n }\r\n flushPendingCanvasMutations() {\r\n this.pendingCanvasMutations.forEach((values, canvas) => {\r\n const id = this.mirror.getId(canvas);\r\n this.flushPendingCanvasMutationFor(canvas, id);\r\n });\r\n requestAnimationFrame(() => this.flushPendingCanvasMutations());\r\n }\r\n flushPendingCanvasMutationFor(canvas, id) {\r\n if (this.frozen || this.locked) {\r\n return;\r\n }\r\n const valuesWithType = this.pendingCanvasMutations.get(canvas);\r\n if (!valuesWithType || id === -1)\r\n return;\r\n const values = valuesWithType.map((value) => {\r\n const rest = __rest(value, [\"type\"]);\r\n return rest;\r\n });\r\n const { type } = valuesWithType[0];\r\n this.mutationCb({ id, type, commands: values });\r\n this.pendingCanvasMutations.delete(canvas);\r\n }\r\n}\n\nexport { CanvasManager };\n","import { getCssRuleString } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\nimport { StyleSheetMirror } from '../utils.js';\n\nclass StylesheetManager {\r\n constructor(options) {\r\n this.trackedLinkElements = new WeakSet();\r\n this.styleMirror = new StyleSheetMirror();\r\n this.mutationCb = options.mutationCb;\r\n this.adoptedStyleSheetCb = options.adoptedStyleSheetCb;\r\n }\r\n attachLinkElement(linkEl, childSn) {\r\n if ('_cssText' in childSn.attributes)\r\n this.mutationCb({\r\n adds: [],\r\n removes: [],\r\n texts: [],\r\n attributes: [\r\n {\r\n id: childSn.id,\r\n attributes: childSn\r\n .attributes,\r\n },\r\n ],\r\n });\r\n this.trackLinkElement(linkEl);\r\n }\r\n trackLinkElement(linkEl) {\r\n if (this.trackedLinkElements.has(linkEl))\r\n return;\r\n this.trackedLinkElements.add(linkEl);\r\n this.trackStylesheetInLinkElement(linkEl);\r\n }\r\n adoptStyleSheets(sheets, hostId) {\r\n if (sheets.length === 0)\r\n return;\r\n const adoptedStyleSheetData = {\r\n id: hostId,\r\n styleIds: [],\r\n };\r\n const styles = [];\r\n for (const sheet of sheets) {\r\n let styleId;\r\n if (!this.styleMirror.has(sheet)) {\r\n styleId = this.styleMirror.add(sheet);\r\n const rules = Array.from(sheet.rules || CSSRule);\r\n styles.push({\r\n styleId,\r\n rules: rules.map((r, index) => {\r\n return {\r\n rule: getCssRuleString(r),\r\n index,\r\n };\r\n }),\r\n });\r\n }\r\n else\r\n styleId = this.styleMirror.getId(sheet);\r\n adoptedStyleSheetData.styleIds.push(styleId);\r\n }\r\n if (styles.length > 0)\r\n adoptedStyleSheetData.styles = styles;\r\n this.adoptedStyleSheetCb(adoptedStyleSheetData);\r\n }\r\n reset() {\r\n this.styleMirror.reset();\r\n this.trackedLinkElements = new WeakSet();\r\n }\r\n trackStylesheetInLinkElement(linkEl) {\r\n }\r\n}\n\nexport { StylesheetManager };\n","import { createMirror, snapshot } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\nimport { initObservers, mutationBuffers } from './observer.js';\nimport { polyfill, on, getWindowWidth, getWindowHeight, isSerializedIframe, isSerializedStylesheet, hasShadowRoot } from '../utils.js';\nimport { EventType, IncrementalSource } from '../../../types/dist/types.js';\nimport { IframeManager } from './iframe-manager.js';\nimport { ShadowDomManager } from './shadow-dom-manager.js';\nimport { CanvasManager } from './observers/canvas/canvas-manager.js';\nimport { StylesheetManager } from './stylesheet-manager.js';\n\nfunction wrapEvent(e) {\r\n return Object.assign(Object.assign({}, e), { timestamp: Date.now() });\r\n}\r\nlet wrappedEmit;\r\nlet takeFullSnapshot;\r\nlet canvasManager;\r\nlet recording = false;\r\nconst mirror = createMirror();\r\nfunction record(options = {}) {\r\n const { emit, checkoutEveryNms, checkoutEveryNth, blockClass = 'rr-block', blockSelector = null, ignoreClass = 'rr-ignore', maskTextClass = 'rr-mask', maskTextSelector = null, inlineStylesheet = true, maskAllInputs, maskInputOptions: _maskInputOptions, slimDOMOptions: _slimDOMOptions, maskInputFn, maskTextFn, hooks, packFn, sampling = {}, dataURLOptions = {}, mousemoveWait, recordCanvas = false, recordCrossOriginIframes = false, userTriggeredOnInput = false, collectFonts = false, inlineImages = false, plugins, keepIframeSrcFn = () => false, ignoreCSSAttributes = new Set([]), } = options;\r\n const inEmittingFrame = recordCrossOriginIframes\r\n ? window.parent === window\r\n : true;\r\n let passEmitsToParent = false;\r\n if (!inEmittingFrame) {\r\n try {\r\n window.parent.document;\r\n passEmitsToParent = false;\r\n }\r\n catch (e) {\r\n passEmitsToParent = true;\r\n }\r\n }\r\n if (inEmittingFrame && !emit) {\r\n throw new Error('emit function is required');\r\n }\r\n if (mousemoveWait !== undefined && sampling.mousemove === undefined) {\r\n sampling.mousemove = mousemoveWait;\r\n }\r\n mirror.reset();\r\n const maskInputOptions = maskAllInputs === true\r\n ? {\r\n color: true,\r\n date: true,\r\n 'datetime-local': true,\r\n email: true,\r\n month: true,\r\n number: true,\r\n range: true,\r\n search: true,\r\n tel: true,\r\n text: true,\r\n time: true,\r\n url: true,\r\n week: true,\r\n textarea: true,\r\n select: true,\r\n password: true,\r\n }\r\n : _maskInputOptions !== undefined\r\n ? _maskInputOptions\r\n : { password: true };\r\n const slimDOMOptions = _slimDOMOptions === true || _slimDOMOptions === 'all'\r\n ? {\r\n script: true,\r\n comment: true,\r\n headFavicon: true,\r\n headWhitespace: true,\r\n headMetaSocial: true,\r\n headMetaRobots: true,\r\n headMetaHttpEquiv: true,\r\n headMetaVerification: true,\r\n headMetaAuthorship: _slimDOMOptions === 'all',\r\n headMetaDescKeywords: _slimDOMOptions === 'all',\r\n }\r\n : _slimDOMOptions\r\n ? _slimDOMOptions\r\n : {};\r\n polyfill();\r\n let lastFullSnapshotEvent;\r\n let incrementalSnapshotCount = 0;\r\n const eventProcessor = (e) => {\r\n for (const plugin of plugins || []) {\r\n if (plugin.eventProcessor) {\r\n e = plugin.eventProcessor(e);\r\n }\r\n }\r\n if (packFn) {\r\n e = packFn(e);\r\n }\r\n return e;\r\n };\r\n wrappedEmit = (e, isCheckout) => {\r\n var _a;\r\n if (((_a = mutationBuffers[0]) === null || _a === void 0 ? void 0 : _a.isFrozen()) &&\r\n e.type !== EventType.FullSnapshot &&\r\n !(e.type === EventType.IncrementalSnapshot &&\r\n e.data.source === IncrementalSource.Mutation)) {\r\n mutationBuffers.forEach((buf) => buf.unfreeze());\r\n }\r\n if (inEmittingFrame) {\r\n emit === null || emit === void 0 ? void 0 : emit(eventProcessor(e), isCheckout);\r\n }\r\n else if (passEmitsToParent) {\r\n const message = {\r\n type: 'rrweb',\r\n event: eventProcessor(e),\r\n isCheckout,\r\n };\r\n window.parent.postMessage(message, '*');\r\n }\r\n if (e.type === EventType.FullSnapshot) {\r\n lastFullSnapshotEvent = e;\r\n incrementalSnapshotCount = 0;\r\n }\r\n else if (e.type === EventType.IncrementalSnapshot) {\r\n if (e.data.source === IncrementalSource.Mutation &&\r\n e.data.isAttachIframe) {\r\n return;\r\n }\r\n incrementalSnapshotCount++;\r\n const exceedCount = checkoutEveryNth && incrementalSnapshotCount >= checkoutEveryNth;\r\n const exceedTime = checkoutEveryNms &&\r\n e.timestamp - lastFullSnapshotEvent.timestamp > checkoutEveryNms;\r\n if (exceedCount || exceedTime) {\r\n takeFullSnapshot(true);\r\n }\r\n }\r\n };\r\n const wrappedMutationEmit = (m) => {\r\n wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.Mutation }, m),\r\n }));\r\n };\r\n const wrappedScrollEmit = (p) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.Scroll }, p),\r\n }));\r\n const wrappedCanvasMutationEmit = (p) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.CanvasMutation }, p),\r\n }));\r\n const wrappedAdoptedStyleSheetEmit = (a) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.AdoptedStyleSheet }, a),\r\n }));\r\n const stylesheetManager = new StylesheetManager({\r\n mutationCb: wrappedMutationEmit,\r\n adoptedStyleSheetCb: wrappedAdoptedStyleSheetEmit,\r\n });\r\n const iframeManager = new IframeManager({\r\n mirror,\r\n mutationCb: wrappedMutationEmit,\r\n stylesheetManager: stylesheetManager,\r\n recordCrossOriginIframes,\r\n wrappedEmit,\r\n });\r\n for (const plugin of plugins || []) {\r\n if (plugin.getMirror)\r\n plugin.getMirror({\r\n nodeMirror: mirror,\r\n crossOriginIframeMirror: iframeManager.crossOriginIframeMirror,\r\n crossOriginIframeStyleMirror: iframeManager.crossOriginIframeStyleMirror,\r\n });\r\n }\r\n canvasManager = new CanvasManager({\r\n recordCanvas,\r\n mutationCb: wrappedCanvasMutationEmit,\r\n win: window,\r\n blockClass,\r\n blockSelector,\r\n mirror,\r\n sampling: sampling.canvas,\r\n dataURLOptions,\r\n });\r\n const shadowDomManager = new ShadowDomManager({\r\n mutationCb: wrappedMutationEmit,\r\n scrollCb: wrappedScrollEmit,\r\n bypassOptions: {\r\n blockClass,\r\n blockSelector,\r\n maskTextClass,\r\n maskTextSelector,\r\n inlineStylesheet,\r\n maskInputOptions,\r\n dataURLOptions,\r\n maskTextFn,\r\n maskInputFn,\r\n recordCanvas,\r\n inlineImages,\r\n sampling,\r\n slimDOMOptions,\r\n iframeManager,\r\n stylesheetManager,\r\n canvasManager,\r\n keepIframeSrcFn,\r\n },\r\n mirror,\r\n });\r\n takeFullSnapshot = (isCheckout = false) => {\r\n var _a, _b, _c, _d, _e, _f;\r\n wrappedEmit(wrapEvent({\r\n type: EventType.Meta,\r\n data: {\r\n href: window.location.href,\r\n width: getWindowWidth(),\r\n height: getWindowHeight(),\r\n },\r\n }), isCheckout);\r\n stylesheetManager.reset();\r\n mutationBuffers.forEach((buf) => buf.lock());\r\n const node = snapshot(document, {\r\n mirror,\r\n blockClass,\r\n blockSelector,\r\n maskTextClass,\r\n maskTextSelector,\r\n inlineStylesheet,\r\n maskAllInputs: maskInputOptions,\r\n maskTextFn,\r\n slimDOM: slimDOMOptions,\r\n dataURLOptions,\r\n recordCanvas,\r\n inlineImages,\r\n onSerialize: (n) => {\r\n if (isSerializedIframe(n, mirror)) {\r\n iframeManager.addIframe(n);\r\n }\r\n if (isSerializedStylesheet(n, mirror)) {\r\n stylesheetManager.trackLinkElement(n);\r\n }\r\n if (hasShadowRoot(n)) {\r\n shadowDomManager.addShadowRoot(n.shadowRoot, document);\r\n }\r\n },\r\n onIframeLoad: (iframe, childSn) => {\r\n iframeManager.attachIframe(iframe, childSn);\r\n shadowDomManager.observeAttachShadow(iframe);\r\n },\r\n onStylesheetLoad: (linkEl, childSn) => {\r\n stylesheetManager.attachLinkElement(linkEl, childSn);\r\n },\r\n keepIframeSrcFn,\r\n });\r\n if (!node) {\r\n return console.warn('Failed to snapshot the document');\r\n }\r\n wrappedEmit(wrapEvent({\r\n type: EventType.FullSnapshot,\r\n data: {\r\n node,\r\n initialOffset: {\r\n left: window.pageXOffset !== undefined\r\n ? window.pageXOffset\r\n : (document === null || document === void 0 ? void 0 : document.documentElement.scrollLeft) ||\r\n ((_b = (_a = document === null || document === void 0 ? void 0 : document.body) === null || _a === void 0 ? void 0 : _a.parentElement) === null || _b === void 0 ? void 0 : _b.scrollLeft) ||\r\n ((_c = document === null || document === void 0 ? void 0 : document.body) === null || _c === void 0 ? void 0 : _c.scrollLeft) ||\r\n 0,\r\n top: window.pageYOffset !== undefined\r\n ? window.pageYOffset\r\n : (document === null || document === void 0 ? void 0 : document.documentElement.scrollTop) ||\r\n ((_e = (_d = document === null || document === void 0 ? void 0 : document.body) === null || _d === void 0 ? void 0 : _d.parentElement) === null || _e === void 0 ? void 0 : _e.scrollTop) ||\r\n ((_f = document === null || document === void 0 ? void 0 : document.body) === null || _f === void 0 ? void 0 : _f.scrollTop) ||\r\n 0,\r\n },\r\n },\r\n }));\r\n mutationBuffers.forEach((buf) => buf.unlock());\r\n if (document.adoptedStyleSheets && document.adoptedStyleSheets.length > 0)\r\n stylesheetManager.adoptStyleSheets(document.adoptedStyleSheets, mirror.getId(document));\r\n };\r\n try {\r\n const handlers = [];\r\n handlers.push(on('DOMContentLoaded', () => {\r\n wrappedEmit(wrapEvent({\r\n type: EventType.DomContentLoaded,\r\n data: {},\r\n }));\r\n }));\r\n const observe = (doc) => {\r\n var _a;\r\n return initObservers({\r\n mutationCb: wrappedMutationEmit,\r\n mousemoveCb: (positions, source) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: {\r\n source,\r\n positions,\r\n },\r\n })),\r\n mouseInteractionCb: (d) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.MouseInteraction }, d),\r\n })),\r\n scrollCb: wrappedScrollEmit,\r\n viewportResizeCb: (d) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.ViewportResize }, d),\r\n })),\r\n inputCb: (v) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.Input }, v),\r\n })),\r\n mediaInteractionCb: (p) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.MediaInteraction }, p),\r\n })),\r\n styleSheetRuleCb: (r) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.StyleSheetRule }, r),\r\n })),\r\n styleDeclarationCb: (r) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.StyleDeclaration }, r),\r\n })),\r\n canvasMutationCb: wrappedCanvasMutationEmit,\r\n fontCb: (p) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.Font }, p),\r\n })),\r\n selectionCb: (p) => {\r\n wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.Selection }, p),\r\n }));\r\n },\r\n blockClass,\r\n ignoreClass,\r\n maskTextClass,\r\n maskTextSelector,\r\n maskInputOptions,\r\n inlineStylesheet,\r\n sampling,\r\n recordCanvas,\r\n inlineImages,\r\n userTriggeredOnInput,\r\n collectFonts,\r\n doc,\r\n maskInputFn,\r\n maskTextFn,\r\n keepIframeSrcFn,\r\n blockSelector,\r\n slimDOMOptions,\r\n dataURLOptions,\r\n mirror,\r\n iframeManager,\r\n stylesheetManager,\r\n shadowDomManager,\r\n canvasManager,\r\n ignoreCSSAttributes,\r\n plugins: ((_a = plugins === null || plugins === void 0 ? void 0 : plugins.filter((p) => p.observer)) === null || _a === void 0 ? void 0 : _a.map((p) => ({\r\n observer: p.observer,\r\n options: p.options,\r\n callback: (payload) => wrappedEmit(wrapEvent({\r\n type: EventType.Plugin,\r\n data: {\r\n plugin: p.name,\r\n payload,\r\n },\r\n })),\r\n }))) || [],\r\n }, hooks);\r\n };\r\n iframeManager.addLoadListener((iframeEl) => {\r\n handlers.push(observe(iframeEl.contentDocument));\r\n });\r\n const init = () => {\r\n takeFullSnapshot();\r\n handlers.push(observe(document));\r\n recording = true;\r\n };\r\n if (document.readyState === 'interactive' ||\r\n document.readyState === 'complete') {\r\n init();\r\n }\r\n else {\r\n handlers.push(on('load', () => {\r\n wrappedEmit(wrapEvent({\r\n type: EventType.Load,\r\n data: {},\r\n }));\r\n init();\r\n }, window));\r\n }\r\n return () => {\r\n handlers.forEach((h) => h());\r\n recording = false;\r\n };\r\n }\r\n catch (error) {\r\n console.warn(error);\r\n }\r\n}\r\nrecord.addCustomEvent = (tag, payload) => {\r\n if (!recording) {\r\n throw new Error('please add custom event after start recording');\r\n }\r\n wrappedEmit(wrapEvent({\r\n type: EventType.Custom,\r\n data: {\r\n tag,\r\n payload,\r\n },\r\n }));\r\n};\r\nrecord.freezePage = () => {\r\n mutationBuffers.forEach((buf) => buf.freeze());\r\n};\r\nrecord.takeFullSnapshot = (isCheckout) => {\r\n if (!recording) {\r\n throw new Error('please take full snapshot after start recording');\r\n }\r\n takeFullSnapshot(isCheckout);\r\n};\r\nrecord.mirror = mirror;\n\nexport { record as default };\n","import type { RecordedEvent } from './transport.js';\n\n/**\n * Making a recording carry the files a page loaded from inside an app.\n *\n * A website's replay loads its stylesheets, fonts and images from the site,\n * later, in the reviewer's browser: the snapshot records `https://shop.com/\n * logo.png` and the dashboard asks shop.com for it. That is `'reference'`, and\n * it is right for anything on a public origin.\n *\n * A page inside an app has no such origin. Capacitor serves the app from\n * `capacitor://localhost` (iOS) or `https://localhost` (Android), Cordova from\n * `app://localhost`, `https://localhost` or `file://`, Ionic's older shells\n * from `ionic://localhost`, Tauri from `tauri://localhost`, Electron often from\n * `file://`. Those addresses mean \"inside this phone\" — no reviewer can load\n * them — so the replay came out as bare HTML.\n *\n * `'inline'` makes the recording carry what it needs instead:\n *\n * - **Stylesheets** were already inside it: rrweb copies every readable\n * stylesheet into the snapshot as text (`inlineStylesheet`, on in both\n * modes), and an app's own CSS is always readable.\n * - **Images** (PNG, JPEG, GIF, WebP) are uploaded once per project by\n * content hash through the same routes the native SDKs use (contract §9),\n * at most 3 MB each, and the session says which file stood at which URL.\n * - **Fonts** (WOFF2, WOFF, TTF, OTF) and **SVG images** cannot be uploaded —\n * ingest stores raster images only — so they travel inside the recording as\n * `data:` URLs, each in its own event, under a per-file cap and a per-page\n * budget that keep every chunk inside the transport's 256 KB target.\n *\n * In both cases the recording keeps the original URL wherever the page used\n * it, and an `anyreplay.asset` custom event maps that URL to the uploaded\n * hash or to the inline data. The dashboard's player rewrites those URLs\n * before it builds the replay. Nothing in the DOM snapshot is changed, so a\n * recording made with this on replays exactly as before in a player that does\n * not know about it — unstyled, as it always was.\n *\n * Only the app's own files are read: URLs under the page's own origin (for\n * `file://`, under the page's own folder). Capacitor's and Cordova's bridges\n * to the device's files (`/_capacitor_file_/…`, `/__cdvfile_…`) are excluded\n * by path, because what they serve is the user's photos and downloads, not\n * the app. Anything that fails — a fetch, an upload, a cap — leaves that one\n * file as it was: missing from the replay, and nothing else.\n */\n\nexport type AssetMode = 'reference' | 'inline';\n\n/** The custom event that maps a URL the page used to the file that was there. */\nexport const ASSET_TAG = 'anyreplay.asset';\n\n/** `{ url, sha256 }` for an uploaded image, `{ url, data }` for a file carried inline. */\nexport type AssetPayload = { url: string; sha256: string } | { url: string; data: string };\n\nexport interface AssetLimits {\n /** An image larger than this is not uploaded (ingest's own limit). */\n maxImageBytes: number;\n /** A font larger than this is not carried inline. */\n maxFontBytes: number;\n /** An SVG larger than this is not carried inline. */\n maxSvgBytes: number;\n /** All inline files of one page together, before base64. */\n inlineBudgetBytes: number;\n /** Distinct URLs looked at per page; anything after is left as it is. */\n maxUrls: number;\n}\n\n/**\n * The caps, and why each is what it is.\n *\n * A font of 160 KB is 214 KB as base64: alone in its chunk with the envelope\n * it stays under the transport's 256 KB target, so no chunk is ever built\n * around something ingest could refuse. Almost every WOFF2 an app ships is\n * well under it; an icon font or a CJK font that is not is left out, and the\n * replay falls back to the next font in the stack. One megabyte across a page\n * is about six fonts and a few icons, which is more than an app uses, and\n * small enough that a page with a hundred SVG icons does not turn its first\n * minute into a download.\n */\nexport const ASSET_LIMITS: AssetLimits = {\n maxImageBytes: 3 * 1024 * 1024,\n maxFontBytes: 160 * 1024,\n maxSvgBytes: 48 * 1024,\n inlineBudgetBytes: 1024 * 1024,\n maxUrls: 300,\n};\n\ninterface LocationLike {\n protocol: string;\n host: string;\n hostname: string;\n pathname: string;\n}\n\n/**\n * What `assets` is when the page does not say.\n *\n * `'inline'` for any scheme that is not `http:` or `https:` — `capacitor:`,\n * `ionic:`, `app:`, `tauri:`, `file:` and whatever a shell invents next. No\n * website is served that way, so nobody outside the device could load the\n * page's own files.\n *\n * `'reference'` for every `http(s)` page, `localhost` included. A developer\n * trying their website on `http://localhost:3000` should not upload its\n * images into the project's quota — the replay of a page on their own machine\n * loads fine on that machine. The shells that serve an app from an\n * `http(s)://localhost` address (Capacitor and Cordova on Android, Tauri on\n * Windows) say `'inline'` themselves: `@anyreplay/capacitor`,\n * `@anyreplay/cordova` and `@anyreplay/tauri` pass it, and so does\n * `@anyreplay/electron`.\n */\nexport function defaultAssetMode(loc: LocationLike | undefined = currentLocation()): AssetMode {\n if (!loc) return 'reference';\n const protocol = loc.protocol.toLowerCase();\n return protocol === 'http:' || protocol === 'https:' ? 'reference' : 'inline';\n}\n\n/**\n * The start every URL of the app's own files shares, or null when there is\n * nothing to look for.\n *\n * `scheme://host/` for anything with a host. For `file:` it is the page's own\n * folder: `file://` alone would match every file on the disk, and an Electron\n * app showing a document the user opened must not upload that document.\n */\nexport function localAssetPrefix(loc: LocationLike | undefined = currentLocation()): string | null {\n if (!loc) return null;\n const protocol = loc.protocol.toLowerCase();\n if (protocol === 'file:') {\n const folder = loc.pathname.slice(0, loc.pathname.lastIndexOf('/') + 1);\n return folder ? `file://${folder}` : null;\n }\n if (!loc.host) return null;\n return `${protocol}//${loc.host}/`;\n}\n\nfunction currentLocation(): LocationLike | undefined {\n try {\n return typeof location !== 'undefined' ? location : undefined;\n } catch {\n return undefined;\n }\n}\n\ntype Kind = { kind: 'image' } | { kind: 'inline'; mime: string; cap: keyof AssetLimits };\n\n/** What a URL is, from its extension. Anything not listed is left alone. */\nfunction classify(url: string): Kind | null {\n const path = url.split(/[?#]/, 1)[0]!.toLowerCase();\n const ext = path.slice(path.lastIndexOf('.') + 1);\n switch (ext) {\n case 'png': case 'jpg': case 'jpeg': case 'gif': case 'webp':\n return { kind: 'image' };\n case 'svg':\n return { kind: 'inline', mime: 'image/svg+xml', cap: 'maxSvgBytes' };\n case 'woff2': return { kind: 'inline', mime: 'font/woff2', cap: 'maxFontBytes' };\n case 'woff': return { kind: 'inline', mime: 'font/woff', cap: 'maxFontBytes' };\n case 'ttf': return { kind: 'inline', mime: 'font/ttf', cap: 'maxFontBytes' };\n case 'otf': return { kind: 'inline', mime: 'font/otf', cap: 'maxFontBytes' };\n default:\n return null;\n }\n}\n\n/**\n * The bridges Capacitor and Cordova put in front of the device's own files.\n * `Capacitor.convertFileSrc()` gives `/_capacitor_file_/…` (and\n * `_capacitor_content_` for Android content URIs); cordova-android's asset\n * loader serves `/__cdvfile_files__/…` and its siblings. Those are the user's\n * pictures, never the app's.\n */\nconst DEVICE_FILE_PATH = /^(_capacitor_|__cdvfile_)/;\n\n/** rrweb's event types and incremental sources that can carry a URL of the page's files. */\nconst EVENT_FULL_SNAPSHOT = 2;\nconst EVENT_INCREMENTAL = 3;\nconst SOURCES_WITH_URLS = new Set([\n 0, // Mutation: added nodes, changed attributes (`src`, `style`, `srcset`)\n 8, // StyleSheetRule: a rule inserted with insertRule\n 13, // StyleDeclaration: a property set through CSSOM\n 15, // AdoptedStyleSheet: constructed stylesheets (Ionic's web components)\n]);\n\nconst escapeRegExp = (text: string): string => text.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\nexport interface AssetCollectorDeps {\n /** From `localAssetPrefix`. */\n prefix: string;\n ingestUrl: string;\n projectKey: string;\n appId?: string;\n /** Hands an `anyreplay.asset` payload to the recording. */\n emit: (payload: AssetPayload) => void;\n /**\n * The `fetch` to read files and talk to ingest with. Taken before the\n * network diagnostics wrap the page's own, so reading the app's files does\n * not appear in the replay's network panel as if the app had done it.\n */\n fetch: typeof fetch;\n limits?: Partial<AssetLimits>;\n debug?: boolean;\n}\n\n/**\n * Finds the app's own files in what rrweb emits and makes each one available\n * to the replay, once per page.\n *\n * `scan` runs inside rrweb's emit and never waits: it only notes URLs. The\n * work — reading a file, hashing it, asking ingest, uploading — happens in the\n * background one file at a time, and the mapping is emitted when it is done.\n * The mapping can therefore land seconds after the snapshot that used the URL;\n * the player reads the whole session before it builds the replay, so order\n * does not matter. A recording must never stall on a network call.\n */\nexport class AssetCollector {\n private readonly limits: AssetLimits;\n private readonly pattern: RegExp;\n private readonly seen = new Set<string>();\n private readonly queue: string[] = [];\n /** Hashes ingest confirmed this page, so two URLs with the same bytes ask once. */\n private readonly confirmed = new Set<string>();\n private inlineSpent = 0;\n private running = false;\n private stopped = false;\n\n constructor(private readonly deps: AssetCollectorDeps) {\n this.limits = { ...ASSET_LIMITS, ...deps.limits };\n // Up to the first character that cannot be inside a URL in an attribute,\n // a srcset or a CSS `url(…)`. A URL with a comma or a parenthesis in its\n // path is missed; app bundlers do not produce those.\n this.pattern = new RegExp(`${escapeRegExp(deps.prefix)}[^\\\\s\"'()<>,\\\\\\\\]+`, 'g');\n }\n\n /** Notes every URL of the app's files in one event. Cheap when there are none. */\n scan(event: RecordedEvent): void {\n if (this.stopped) return;\n if (event.type === EVENT_FULL_SNAPSHOT) {\n this.walk(event.data, 0);\n } else if (event.type === EVENT_INCREMENTAL) {\n const source = (event.data as { source?: number } | undefined)?.source;\n if (source !== undefined && SOURCES_WITH_URLS.has(source)) this.walk(event.data, 0);\n }\n }\n\n stop(): void {\n this.stopped = true;\n this.queue.length = 0;\n }\n\n /** Resolves once everything queued so far has been handled. For tests. */\n async idle(): Promise<void> {\n while (this.running || this.queue.length > 0) await new Promise((resolve) => setTimeout(resolve, 1));\n }\n\n private walk(value: unknown, depth: number): void {\n // rrweb's trees are deep but not this deep; a cycle is not possible in\n // JSON-shaped events, the bound is only a guard against a pathological DOM.\n if (depth > 400 || value === null) return;\n if (typeof value === 'string') {\n if (value.length >= this.deps.prefix.length && value.includes(this.deps.prefix)) this.match(value);\n return;\n }\n if (typeof value !== 'object') return;\n if (Array.isArray(value)) {\n for (const item of value) this.walk(item, depth + 1);\n return;\n }\n for (const key in value as Record<string, unknown>) this.walk((value as Record<string, unknown>)[key], depth + 1);\n }\n\n private match(text: string): void {\n this.pattern.lastIndex = 0;\n for (const found of text.match(this.pattern) ?? []) {\n if (this.seen.has(found)) continue;\n if (this.seen.size >= this.limits.maxUrls) return;\n this.seen.add(found);\n if (DEVICE_FILE_PATH.test(found.slice(this.deps.prefix.length))) continue;\n if (!classify(found)) continue;\n this.queue.push(found);\n }\n if (this.queue.length > 0) void this.drain();\n }\n\n private async drain(): Promise<void> {\n if (this.running) return;\n this.running = true;\n try {\n while (this.queue.length > 0 && !this.stopped) {\n const url = this.queue.shift()!;\n try {\n const payload = await this.resolve(url);\n if (payload && !this.stopped) this.deps.emit(payload);\n } catch (error) {\n if (this.deps.debug) console.warn('[anyreplay] could not include', url, error);\n }\n }\n } finally {\n this.running = false;\n }\n }\n\n private async resolve(url: string): Promise<AssetPayload | null> {\n const kind = classify(url);\n if (!kind) return null;\n const response = await this.deps.fetch(url);\n if (!response.ok) return null;\n const bytes = new Uint8Array(await response.arrayBuffer());\n if (bytes.length === 0) return null;\n\n if (kind.kind === 'inline') {\n if (bytes.length > this.limits[kind.cap]) return this.skip(url, 'over its size cap');\n if (this.inlineSpent + bytes.length > this.limits.inlineBudgetBytes) return this.skip(url, 'over the page budget');\n this.inlineSpent += bytes.length;\n return { url, data: `data:${kind.mime};base64,${toBase64(bytes)}` };\n }\n\n if (bytes.length > this.limits.maxImageBytes) return this.skip(url, 'larger than 3 MB');\n const sha256 = await sha256Hex(bytes);\n if (this.confirmed.has(sha256) || await this.upload(sha256, bytes)) {\n this.confirmed.add(sha256);\n return { url, sha256 };\n }\n return null;\n }\n\n /** Contract §9: ask first, upload only what the project does not hold. */\n private async upload(sha256: string, bytes: Uint8Array): Promise<boolean> {\n const { ingestUrl, projectKey, appId } = this.deps;\n const app = appId ? { appId } : {};\n const post = (path: string, body: unknown): Promise<Response> => this.deps.fetch(`${ingestUrl}${path}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'omit',\n body: JSON.stringify(body),\n });\n\n const known = await post('/v1/ingest/assets/known', { projectKey, hashes: [sha256], ...app });\n if (!known.ok) {\n // Asking was refused, so uploading would be too, after sending the whole\n // file (found on a real Electron run with an app the project does not\n // list: every image went up only to come back 403). A 401 or 403 here is\n // about the key, the origin or the app, not this file: no later file\n // would fare better, so the rest are not read either.\n if (known.status === 401 || known.status === 403) this.stop();\n return false;\n }\n const answer = await known.json() as { known?: unknown };\n if (Array.isArray(answer.known) && answer.known.includes(sha256)) return true;\n // A 415 (not really an image), 413, 403 (quota) or 422 is an answer about\n // this file; it stays out of the replay and nothing is retried.\n const upload = await post('/v1/ingest/assets', { projectKey, sha256, data: toBase64(bytes), ...app });\n return upload.ok;\n }\n\n private skip(url: string, why: string): null {\n if (this.deps.debug) console.warn(`[anyreplay] not included in the replay (${why}): ${url}`);\n return null;\n }\n}\n\n/** Standard base64 with padding, in slices so a large file does not overflow the argument list. */\nexport function toBase64(bytes: Uint8Array): string {\n let binary = '';\n for (let i = 0; i < bytes.length; i += 0x8000) {\n binary += String.fromCharCode.apply(null, bytes.subarray(i, i + 0x8000) as unknown as number[]);\n }\n return btoa(binary);\n}\n\n/**\n * SHA-256 as 64 lowercase hex digits: the file's address in the project.\n *\n * WebCrypto where the page has it. Not every app's web view does —\n * `crypto.subtle` exists only in a secure context, and whether a custom\n * scheme such as `capacitor://` counts as one has differed between WebKit\n * releases — so a plain implementation follows, checked against Node's in\n * the tests.\n */\nexport async function sha256Hex(bytes: Uint8Array): Promise<string> {\n try {\n const subtle = typeof crypto !== 'undefined' ? crypto.subtle : undefined;\n if (subtle) {\n const digest = new Uint8Array(await subtle.digest('SHA-256', bytes));\n return Array.from(digest, (b) => b.toString(16).padStart(2, '0')).join('');\n }\n } catch {\n /* fall through to the plain implementation */\n }\n return sha256HexSync(bytes);\n}\n\nconst K = [\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n];\n\n/** The same algorithm as packages/recorder-native/src/assets.ts, which has no WebCrypto at all. */\nexport function sha256HexSync(bytes: Uint8Array): string {\n const length = bytes.length;\n const padded = new Uint8Array(((length + 9 + 63) >>> 6) << 6);\n padded.set(bytes);\n padded[length] = 0x80;\n const view = new DataView(padded.buffer);\n view.setUint32(padded.length - 8, Math.floor(length / 0x20000000));\n view.setUint32(padded.length - 4, (length << 3) >>> 0);\n\n const h = [0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19];\n const w = new Array<number>(64);\n const rotr = (x: number, n: number): number => (x >>> n) | (x << (32 - n));\n\n for (let offset = 0; offset < padded.length; offset += 64) {\n for (let i = 0; i < 16; i += 1) w[i] = view.getUint32(offset + i * 4);\n for (let i = 16; i < 64; i += 1) {\n const a = w[i - 15]!;\n const b = w[i - 2]!;\n w[i] = (w[i - 16]! + (rotr(a, 7) ^ rotr(a, 18) ^ (a >>> 3)) + w[i - 7]! + (rotr(b, 17) ^ rotr(b, 19) ^ (b >>> 10))) | 0;\n }\n let [a, b, c, d, e, f, g, hh] = h as [number, number, number, number, number, number, number, number];\n for (let i = 0; i < 64; i += 1) {\n const t1 = (hh + (rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25)) + ((e & f) ^ (~e & g)) + K[i]! + w[i]!) | 0;\n const t2 = ((rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22)) + ((a & b) ^ (a & c) ^ (b & c))) | 0;\n hh = g; g = f; f = e; e = (d + t1) | 0; d = c; c = b; b = a; a = (t1 + t2) | 0;\n }\n h[0] = (h[0]! + a) | 0; h[1] = (h[1]! + b) | 0; h[2] = (h[2]! + c) | 0; h[3] = (h[3]! + d) | 0;\n h[4] = (h[4]! + e) | 0; h[5] = (h[5]! + f) | 0; h[6] = (h[6]! + g) | 0; h[7] = (h[7]! + hh) | 0;\n }\n return h.map((x) => (x >>> 0).toString(16).padStart(8, '0')).join('');\n}\n","import { defaultAssetMode, type AssetMode } from './assets.js';\n\nexport interface AnyReplayOptions {\n /** Public project key from the dashboard. */\n projectKey: string;\n /** Ingest endpoint. Override only for self-hosted deployments. */\n ingestUrl?: string;\n /** Fraction of visitors recorded, 0–1. Decided once per visitor, not per page. */\n sampleRate?: number;\n /**\n * Mask the value of every form control.\n *\n * Off by default: a recording shows what a visitor typed into inputs,\n * textareas and rich-text editors, because a replay of a form nobody could\n * finish is worth watching only if you can see what they were trying to put\n * in it. Turn this on for a site whose forms carry anything you would not\n * want a teammate to read, and mark individual fields with the `maskClass`\n * when it is only some of them.\n *\n * Some fields are masked whatever this says, in every mode: passwords,\n * one-time codes, payment fields (card number, CVV, expiry, IBAN, routing\n * number, sort code), anything inside an element with the mask class, and any\n * value that looks like a card number. Email and telephone fields are not on\n * that list — they are ordinary fields, recorded by default and masked by this\n * option. See `isSensitiveField` in `masking.ts` for the exact list.\n */\n maskAllInputs?: boolean;\n /**\n * Mask everything a person types, wherever they type it.\n *\n * `maskAllInputs` covers form controls. This covers those *and* the other\n * place a person can type — an element with `contenteditable`, which is what\n * a rich-text editor, a comment box or a chat composer is made of. Their text\n * is not an input value but ordinary page text, so input masking does not\n * reach it. With this on, the text of every editable region is replaced with\n * asterisks in the first snapshot and in every change after it.\n *\n * The stricter of the two options, and a superset of it: `maskAllTyping: true`\n * masks form fields too, whatever `maskAllInputs` says. It is separate\n * because masking an editable region masks *all* of its text, including\n * whatever the page put there before anyone typed — a loaded document, a\n * quoted message — which is a bigger thing to ask for than hiding field\n * values.\n */\n maskAllTyping?: boolean;\n /** Elements with this class have their text masked. */\n maskClass?: string;\n /** Elements with this class are not recorded at all. */\n blockClass?: string;\n /** Wait for `anyreplay('consent', true)` before recording anything. */\n requireConsent?: boolean;\n /** Flush when the buffer reaches this many events. */\n maxEventsPerChunk?: number;\n /** Flush at least this often, in milliseconds. */\n flushIntervalMs?: number;\n /**\n * Stop recording after this many failed deliveries in a row (offline, a\n * timeout, `429`, `5xx`). `0`, the default, never stops: failed chunks are\n * kept (up to ten chunks' worth of events, oldest dropped first) and\n * retried with a backoff of 2 s doubling to a minute, and at once when the\n * browser comes back online or the tab becomes visible.\n */\n maxConsecutiveFailures?: number;\n /**\n * Record uncaught exceptions and unhandled rejections, with their stacks.\n *\n * On by default: a replay of a page that broke is worth far more with the\n * error beside it, and an exception is the page's own diagnostic rather than\n * anything a visitor typed. The message, the error name and the stack are\n * recorded; secrets, addresses and card-shaped numbers are taken out of all\n * three first (see `diagnostics.ts`).\n */\n recordErrors?: boolean;\n /**\n * Record `console.error` and `console.warn` calls.\n *\n * On by default, and the one stream here with no predictable contents: a\n * console line is whatever the page chose to print, which on some sites\n * includes data about the person using it. The same redaction runs over\n * every line, but a page that prints something it would not want a\n * teammate to read should turn this off. `log`, `info` and `debug` are\n * never recorded at any setting.\n */\n recordConsole?: boolean;\n /**\n * Record one entry per `fetch`/`XMLHttpRequest`: method, URL, status code\n * and duration.\n *\n * On by default. **No request or response body is ever recorded**, and no\n * headers — not a sampled copy, not a truncated one. The URL is redacted\n * before it is kept. Requests to the ingest endpoint are skipped.\n */\n recordNetwork?: boolean;\n /**\n * The most sessions this project may record per calendar month (UTC).\n *\n * Sent with the first chunk of every new session; ingest refuses a session\n * that would exceed it with 402 `session_cap_reached` and the recorder stops\n * for that visit. A cap set in the dashboard also applies, and the lower one\n * wins. Positive integer, at most 1,000,000.\n */\n maxSessionsPerMonth?: number;\n /**\n * The app this page runs inside, when it runs inside one: the bundle id or\n * package name of a Capacitor, Cordova or Electron app\n * (`com.example.shop`).\n *\n * Leave it out on a website. An app's web view has no real web origin —\n * `capacitor://localhost`, `https://localhost`, `file://` — so a project\n * that lists allowed domains refuses it; listing the same id under the\n * project's allowed apps, and passing it here, lets it record. Sent in\n * every request body, never as a header: a header would cost a CORS\n * preflight per request, and `sendBeacon` cannot send one.\n *\n * A filter, not a secret. Ingest ignores it on a request from a real\n * website, so it cannot open a web project's allow-list, and anyone holding\n * the public key can send any id from outside a browser.\n */\n appId?: string;\n /**\n * Whether the recording refers to the page's images and fonts by URL, or\n * carries them.\n *\n * `'reference'` records URLs, and the replay loads each file from where the\n * page did: right for a website, whose files anyone can load later.\n * `'inline'` is for a page whose files nobody else can load — an app's web\n * view (`capacitor://localhost`, `https://localhost`, `file://`) or a\n * desktop shell. Images the app ships are uploaded once per project by\n * content hash (PNG, JPEG, GIF, WebP, up to 3 MB each), and its fonts and\n * SVGs travel inside the recording (up to 160 KB per font, 48 KB per SVG and\n * 1 MB per page), so the replay looks like the app instead of bare HTML.\n * Stylesheets are copied into the recording in both modes.\n *\n * Leave it out and it is `'inline'` when the page is served from anything\n * other than `http:`/`https:`, or from `localhost`, `127.0.0.1`, `[::1]` or a\n * `*.localhost` host; `'reference'` everywhere else. Only files under the\n * page's own origin (for `file:`, its own folder) are ever read, and never\n * the device-file bridges Capacitor and Cordova serve user files through.\n * See `assets.ts`.\n */\n assets?: AssetMode;\n debug?: boolean;\n}\n\nexport interface ResolvedOptions extends Required<Omit<AnyReplayOptions, 'ingestUrl' | 'maxSessionsPerMonth' | 'appId' | 'assets'>> {\n /** Always decided: the page's choice, or what `defaultAssetMode` reads from its address. */\n assets: AssetMode;\n ingestUrl: string;\n maxSessionsPerMonth?: number;\n appId?: string;\n}\n\nexport const DEFAULTS: Omit<ResolvedOptions, 'projectKey' | 'assets'> = {\n ingestUrl: 'https://in.anyreplay.com',\n sampleRate: 1,\n // Both masking switches are opt-in: a recording shows what people typed,\n // which is the point of watching one. What that never includes is the floor\n // in masking.ts — passwords, payment fields and the rest — which no option\n // can switch off.\n maskAllInputs: false,\n maskAllTyping: false,\n maskClass: 'ar-mask',\n blockClass: 'ar-block',\n requireConsent: false,\n maxEventsPerChunk: 200,\n flushIntervalMs: 5000,\n // Never: an outage is what the buffer is for. Set a number to give up instead.\n maxConsecutiveFailures: 0,\n // The three diagnostic streams. On, because \"why did it break\" is the\n // question a replay is opened to answer; each is a documented switch, and\n // what they can and cannot contain is in diagnostics.ts.\n recordErrors: true,\n recordConsole: true,\n recordNetwork: true,\n debug: false,\n};\n\nexport class ConfigError extends Error {}\n\nconst KEY_PATTERN = /^ar_pk_(live|test)_[0-9a-f]{24}$/;\n/** Matches what ingest's schema accepts, so a value that passes here is never a 422 later. */\nconst MAX_SESSION_CAP = 1_000_000;\n/** What ingest reads as an app id (`APP_ID_PATTERN` in the server's shared package). */\nconst APP_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]{1,254}$/;\n\nexport function resolveOptions(input: AnyReplayOptions): ResolvedOptions {\n if (!input || typeof input !== 'object') throw new ConfigError('anyreplay: options object required');\n if (!KEY_PATTERN.test(input.projectKey ?? '')) {\n throw new ConfigError('anyreplay: projectKey looks wrong — copy it from the dashboard');\n }\n\n const sampleRate = input.sampleRate ?? DEFAULTS.sampleRate;\n if (!(sampleRate >= 0 && sampleRate <= 1)) {\n throw new ConfigError('anyreplay: sampleRate must be between 0 and 1');\n }\n\n const cap = input.maxSessionsPerMonth;\n if (cap !== undefined && !(Number.isInteger(cap) && cap >= 1 && cap <= MAX_SESSION_CAP)) {\n throw new ConfigError(`anyreplay: maxSessionsPerMonth must be a whole number between 1 and ${MAX_SESSION_CAP}`);\n }\n\n const appId = input.appId?.trim();\n if (input.appId !== undefined && !(appId && APP_ID_PATTERN.test(appId))) {\n throw new ConfigError('anyreplay: appId should be an app identifier such as com.example.app');\n }\n\n let assets = input.assets;\n if (assets !== undefined && assets !== 'reference' && assets !== 'inline') {\n if (typeof console !== 'undefined') {\n console.warn(`[anyreplay] assets ignored: expected 'reference' or 'inline', got ${JSON.stringify(assets)}.`);\n }\n assets = undefined;\n }\n\n return {\n ...DEFAULTS,\n ...input,\n ...(appId ? { appId } : {}),\n assets: assets ?? defaultAssetMode(),\n projectKey: input.projectKey,\n sampleRate,\n ingestUrl: (input.ingestUrl ?? DEFAULTS.ingestUrl).replace(/\\/+$/, ''),\n maskAllInputs: readSwitch(input, 'maskAllInputs'),\n maskAllTyping: readSwitch(input, 'maskAllTyping'),\n recordErrors: readSwitch(input, 'recordErrors'),\n recordConsole: readSwitch(input, 'recordConsole'),\n recordNetwork: readSwitch(input, 'recordNetwork'),\n };\n}\n\n/**\n * Reads one masking switch, and says so out loud when it cannot.\n *\n * Only a real `true` turns masking on: a string, a number or a typo is ignored\n * rather than guessed at. Ignoring it now means recording, which is the one\n * place in this file where being quiet would be the wrong thing — a tag\n * manager that hands over the string `\"true\"` would leave a customer believing\n * their forms were masked. So the warning is not behind `debug`: whoever wrote\n * the line needs to see it, and they are not the person who set `debug`.\n */\ntype Switch = 'maskAllInputs' | 'maskAllTyping' | 'recordErrors' | 'recordConsole' | 'recordNetwork';\n\nfunction readSwitch(input: AnyReplayOptions, name: Switch): boolean {\n const value = input[name];\n if (typeof value === 'boolean') return value;\n if (value !== undefined && typeof console !== 'undefined') {\n // The masking switches default to recording and the diagnostic ones to\n // capturing, so in both directions a value that was meant to restrict\n // something and did not has to be said out loud.\n const consequence = name.startsWith('mask')\n ? 'Nothing is masked by this option.'\n : `${name.slice('record'.length)} are recorded, as by default.`;\n console.warn(`[anyreplay] ${name} ignored: expected true or false, got ${typeof value}. ${consequence}`);\n }\n return DEFAULTS[name];\n}\n","/**\n * What a recording may contain, and what it may never contain.\n *\n * Out of the box the recorder keeps what a visitor types: that is what makes a\n * replay of a form nobody could finish worth watching. Two options turn that\n * off — `maskAllInputs` for form controls, `maskAllTyping` for form controls\n * plus every `contenteditable` region — and underneath both of them sits a\n * floor this file defines: fields whose value never leaves the browser in any\n * configuration, because no support ticket is worth a password or a card\n * number sitting in a session replay.\n *\n * Why the floor is applied to the *events* rather than through rrweb's own\n * hooks: rrweb takes a `maskInputFn`, but the version we bundle calls it with\n * the value alone — `maskInputFn(text)` — on every path, snapshot included. A\n * function that cannot see the field cannot tell a card number from a search\n * box, so rrweb's masking can only ever be all-or-nothing by input type. What\n * rrweb does put in every payload is the node's id, and the full snapshot\n * carries each field's attributes. That is enough: `scrubEvent` re-reads every\n * event before the transport sees it and masks what the policy says must be\n * masked. Nothing unmasked is ever queued, let alone sent.\n */\n\n/** Same length, no characters — what rrweb itself writes for a masked value. */\nexport const maskValue = (text: string): string => '*'.repeat(text.length);\n\n/**\n * Every form field, masked — spelled out rather than using rrweb's\n * `maskAllInputs: true` shorthand.\n *\n * The shorthand builds a map keyed by input *type*, and the snapshot reads that\n * type from the `type` attribute rather than the element. An `<input>` written\n * without one — `<input name=\"city\" value=\"…\">`, the shape React apps produce —\n * therefore matched no key, and its **initial** value was serialised in the\n * clear even with masking on. What the visitor then typed into it was masked,\n * because the input observer reads `element.type`, which defaults to `text`;\n * only the value already in the markup leaked. The `input` key closes that: it\n * is matched on the tag name, which every input has. Radio buttons and\n * check boxes are untouched — both paths settle them by `checked` before any\n * value masking is considered.\n */\nexport const MASK_EVERY_FIELD: Record<string, boolean> = {\n color: true, date: true, 'datetime-local': true, email: true, month: true,\n number: true, range: true, search: true, tel: true, text: true, time: true,\n url: true, week: true, textarea: true, select: true, password: true,\n input: true,\n};\n\n/* ------------------------------------------------------------ the floor -- */\n\n/**\n * Autocomplete tokens that name a credential or a payment instrument.\n *\n * `autocomplete` is the one signal a browser itself acts on — it is what makes\n * a browser offer to fill in a card number — so a field carrying one of these\n * is that field, whatever else it is called.\n */\nconst SENSITIVE_AUTOCOMPLETE = new Set([\n 'cc-number', 'cc-csc', 'cc-exp', 'cc-exp-month', 'cc-exp-year', 'cc-name', 'cc-type',\n 'cc-given-name', 'cc-family-name', 'cc-additional-name',\n 'current-password', 'new-password', 'one-time-code',\n]);\n\n/**\n * How a payment field is named when nobody set `autocomplete`.\n *\n * Deliberately narrow: every match here is a field a customer can never see\n * again, so a false positive costs them a replay they wanted. Each alternative\n * needs a payment word — `card`, `cc`, `cvv` and friends, `iban`, a bank\n * routing number — and the boundaries keep `discard`, `scoreboard` and\n * `accounting` out of it.\n */\nconst PAYMENT_FIELD = new RegExp(\n '(?:credit|debit|payment)[\\\\s_-]*card'\n + '|card[\\\\s_-]*(?:number|num|no|nr|code|pin|cvv|cvc|csc)'\n + '|(?:^|[^a-z])cc[\\\\s_-]*(?:number|num|no|nr|csc|cvv|cvc|exp)'\n + '|(?:^|[^a-z])(?:cvv|cvc|cvn|csc)(?:[^a-z]|$)'\n + '|security[\\\\s_-]*code'\n + '|(?:^|[^a-z])iban(?:[^a-z]|$)'\n + '|routing[\\\\s_-]*number'\n + '|sort[\\\\s_-]*code',\n 'i',\n);\n\n/** How a credential field is named. Covers the \"show password\" toggle, which flips `type` to text. */\nconst CREDENTIAL_FIELD = /pass(?:word|wd|phrase)|(?:^|[^a-z])pwd(?:[^a-z]|$)|(?:^|[^a-z])otp(?:[^a-z]|$)|one[\\s_-]*time[\\s_-]*code/i;\n\n/**\n * Input types that are never recorded, whatever the options say.\n *\n * Only `password`. `type=\"email\"` and `type=\"tel\"` were here once, and are not\n * any more: an address and a phone number are ordinary contact details that a\n * sign-up form is mostly made of, and a replay of a sign-up nobody could finish\n * is worth nothing with both of them starred out. They are recorded by default\n * and masked the way every other ordinary field is — `maskAllInputs`,\n * `maskAllTyping`, or the mask class on the field or anything around it.\n *\n * What stays is what a customer can never un-see: a credential, a one-time\n * code, a payment instrument. See the two patterns above and the Luhn check\n * below for the rest of it.\n */\nconst SENSITIVE_TYPES = new Set(['password']);\n\n/**\n * What rrweb itself masks when values are being recorded.\n *\n * Built from `SENSITIVE_TYPES` rather than written out a second time: rrweb's\n * masking is by input type, which is exactly the part of the floor a type can\n * express, and two hand-kept lists would eventually disagree about which one\n * the documentation describes. Everything else in the floor is applied by\n * `scrubEvent`, which can see the whole field.\n */\nexport const MASK_SENSITIVE_FIELDS: Record<string, boolean> = Object.fromEntries(\n [...SENSITIVE_TYPES].map((type) => [type, true]),\n);\n\n/** The attributes a field's purpose is written in, in practice. */\nconst NAMING_ATTRIBUTES = ['name', 'id', 'autocomplete', 'placeholder', 'aria-label', 'data-testid'];\n\n/** Reads one attribute of a field, whether it is a live element or a serialised node. */\ntype Attributes = (name: string) => string | null;\n\n/** The floor, decided from the attributes alone, so both callers get the same answer. */\nfunction isSensitiveByAttributes(read: Attributes, type: string): boolean {\n // rrweb's own marker, set by pages that toggle a password field to text.\n if (read('data-rr-is-password') !== null) return true;\n if (SENSITIVE_TYPES.has(type)) return true;\n\n const autocomplete = (read('autocomplete') ?? '').toLowerCase();\n // \"section-blue shipping cc-number\" — the meaning is in the last token, but\n // checking every token costs nothing and tolerates a hand-written value.\n for (const token of autocomplete.split(/\\s+/)) {\n if (SENSITIVE_AUTOCOMPLETE.has(token)) return true;\n }\n\n for (const attribute of NAMING_ATTRIBUTES) {\n const value = read(attribute);\n if (value && (PAYMENT_FIELD.test(value) || CREDENTIAL_FIELD.test(value))) return true;\n }\n return false;\n}\n\ntype MaybeElement = { getAttribute?: unknown } | null | undefined;\n\nconst asElement = (node: MaybeElement): Element | null =>\n node && typeof (node as Element).getAttribute === 'function' ? (node as Element) : null;\n\n/**\n * Is this live field one whose value never leaves the browser?\n *\n * Reads `element.type` rather than the attribute, so `<input>` with no type —\n * which is a text field — is judged as one.\n */\nexport function isSensitiveField(node: MaybeElement): boolean {\n const element = asElement(node);\n if (!element) return false;\n const type = ((element as HTMLInputElement).type || element.getAttribute('type') || '').toLowerCase();\n return isSensitiveByAttributes((name) => element.getAttribute(name), type);\n}\n\n/** The same question for a field as rrweb serialised it, where only the attributes exist. */\nfunction isSensitiveSerialised(attributes: Record<string, unknown>): boolean {\n const read: Attributes = (name) => (typeof attributes[name] === 'string' ? attributes[name] as string : null);\n return isSensitiveByAttributes(read, (read('type') ?? '').toLowerCase());\n}\n\n/**\n * Does this value look like a card number?\n *\n * The last line of defence, for the checkout that calls its field `field-2`\n * and sets no autocomplete. A card number is 13–19 digits and passes the Luhn\n * check, which one number in ten passes by chance — so an order number can be\n * caught by this, and that is the trade it makes: a masked order number is a\n * smaller loss than a recorded card number.\n */\nexport function looksLikeCardNumber(text: string): boolean {\n if (text.length < 13 || text.length > 24 || !/^[0-9][0-9 -]*[0-9]$/.test(text)) return false;\n const digits = text.replace(/[ -]/g, '');\n if (digits.length < 13 || digits.length > 19) return false;\n\n let sum = 0;\n let double = false;\n for (let i = digits.length - 1; i >= 0; i -= 1) {\n let digit = digits.charCodeAt(i) - 48;\n if (double) {\n digit *= 2;\n if (digit > 9) digit -= 9;\n }\n sum += digit;\n double = !double;\n }\n return sum % 10 === 0;\n}\n\n/**\n * Could this be a card number being typed?\n *\n * `looksLikeCardNumber` judges a whole number, and a person types one digit at\n * a time: every keystroke is an input event of its own, so a field named\n * nothing in particular sent `4`, `42`, … up to twelve or thirteen digits in\n * the clear before the value was long enough to pass the Luhn check (found on\n * a real Electron run). A value is therefore also masked while it could still\n * become one: digits only (spaces and dashes allowed), more than six of them —\n * the first six identify the issuer, not the card, and are what a receipt may\n * print — at most nineteen, and starting 2–6, where every card network's\n * numbers start.\n *\n * Telephone numbers written the way most of the world writes them (a leading\n * `0` or `+`, or in groups shorter than a card's), dates, quantities and\n * postcodes stay recorded; a run of seven or more digits starting 2–6 — an\n * order number, a phone number typed without a break — is masked, the same\n * trade `looksLikeCardNumber` makes.\n */\nexport function mayBecomeCardNumber(text: string): boolean {\n if (!/^[2-6][0-9 -]*$/.test(text)) return false;\n const groups = text.split(/[ -]+/);\n // Cards are grouped 4-4-4-4 or 4-6-5; a date (2026-09-18) or a telephone\n // number written in groups (415-555-0100, 532 123 45 67) has a shorter one.\n if (groups.slice(0, -1).some((group) => group.length < 4)) return false;\n const digits = groups.join('').length;\n return digits > 6 && digits <= 19;\n}\n\n/**\n * Has the customer marked this field, or something around it, with the mask\n * class?\n *\n * rrweb's `maskTextClass` reaches text nodes only — an `<input>` has none, so\n * `class=\"ar-mask\"` on a field did nothing to its value. This closes that: the\n * class means the same thing on a field as it does on a paragraph.\n */\nfunction isMarkedByCustomer(node: MaybeElement, maskClass: string): boolean {\n let element = asElement(node);\n while (element) {\n if (element.classList?.contains(maskClass)) return true;\n element = element.parentElement;\n }\n return false;\n}\n\nconst hasClass = (attributes: Record<string, unknown>, maskClass: string): boolean =>\n typeof attributes.class === 'string' && attributes.class.split(/\\s+/).includes(maskClass);\n\nexport interface MaskingPolicy {\n /** True when every field value is masked: `maskAllInputs` or `maskAllTyping`. */\n maskEveryField: boolean;\n /** The customer's mask class, honoured on fields as well as on the text around them. */\n maskClass: string;\n}\n\n/** The floor, plus whatever the customer asked for on top of it, for a live field. */\nexport function shouldMaskValue(text: string, node: MaybeElement, policy: MaskingPolicy): boolean {\n if (policy.maskEveryField) return true;\n if (isSensitiveField(node)) return true;\n if (isMarkedByCustomer(node, policy.maskClass)) return true;\n return cardShaped(text);\n}\n\n/** A card number, whole or still being typed: what the floor masks in any value a person typed. */\nconst cardShaped = (text: string): boolean => looksLikeCardNumber(text) || mayBecomeCardNumber(text);\n\n/** Digit groups joined by one space, no-break space or dash: where a card number can hide in text. */\nconst DIGIT_RUN = /[0-9]+(?:[ -][0-9]+)*/g;\n\n/**\n * Stars every card number inside longer text, and leaves the rest of it.\n *\n * The rules above judge a whole value, so \"my card is 4242 4242 4242 4242\" in\n * a notes field or a support chat went out in the clear, one keystroke at a\n * time (found on a real iOS run of the Capacitor SDK). Each run of digit\n * groups is searched for the longest stretch of whole groups that is card\n * shaped — complete or still being typed — so the number is masked from its\n * seventh digit wherever it sits: after a word, before another number, at the\n * end of what is being typed. Only its digits are starred; the words around\n * it, and every other number, stay.\n */\nexport function maskCardRuns(text: string): string {\n if (!/[0-9]/.test(text)) return text;\n return text.replace(DIGIT_RUN, (run) => {\n const groups = run.split(/[ -]/);\n // Where each group starts in the run, so a stretch of groups maps back to characters.\n const starts: number[] = [];\n let at = 0;\n for (const group of groups) {\n starts.push(at);\n at += group.length + 1;\n }\n const chars = run.split('');\n let i = 0;\n while (i < groups.length) {\n let matched = -1;\n for (let j = groups.length - 1; j >= i; j -= 1) {\n const end = starts[j]! + groups[j]!.length;\n if (cardShaped(run.slice(starts[i], end).replace(/ /g, ' '))) { matched = j; break; }\n }\n if (matched < 0) { i += 1; continue; }\n const end = starts[matched]! + groups[matched]!.length;\n for (let k = starts[i]!; k < end; k += 1) if (chars[k] !== ' ' && chars[k] !== ' ' && chars[k] !== '-') chars[k] = '*';\n i = matched + 1;\n }\n return chars.join('');\n });\n}\n\n/**\n * Everywhere a person can type that is not a form control — the selector\n * `maskAllTyping` masks. Without that option an editor's text is page text,\n * and only a card number in it is masked.\n */\nconst EDITABLE = '[contenteditable]:not([contenteditable=\"false\"])';\n\n/** Is this live node — a text node or an element — inside an editable region? */\nfunction insideEditable(node: unknown): boolean {\n const live = node as { nodeType?: number; parentElement?: Element | null } | null | undefined;\n const element = live?.nodeType === 3 ? live.parentElement ?? null : asElement(live as MaybeElement);\n return typeof element?.closest === 'function' && element.closest(EDITABLE) !== null;\n}\n\nconst isEditableSerialised = (attributes: Record<string, unknown>): boolean =>\n attributes.contenteditable !== undefined && attributes.contenteditable !== 'false';\n\n/**\n * Text typed into an editor, judged as a field value would be: an editor\n * writes a typed space as a no-break space, and often keeps a trailing one.\n */\nconst typedCardShaped = (text: string): boolean => cardShaped(text.replace(/\\u00a0/g, ' ').trim());\n\n/** What rrweb writes for masked text: every character but whitespace, starred. */\nconst maskText = (text: string): string => text.replace(/\\S/g, '*');\n\n/** Text typed into an editor: all of it starred when it is a card number, else any card number inside it. */\nconst maskTyped = (text: string): string => (typedCardShaped(text) ? maskText(text) : maskCardRuns(text));\n\n/* --------------------------------------------------------- the payloads -- */\n\ninterface SerialisedNode {\n type?: number;\n tagName?: string;\n textContent?: string;\n attributes?: Record<string, unknown>;\n childNodes?: SerialisedNode[];\n}\n\ninterface IncrementalData {\n source?: number;\n id?: unknown;\n text?: unknown;\n texts?: { id?: unknown; value?: unknown }[];\n attributes?: { id?: unknown; attributes?: Record<string, unknown> }[];\n adds?: { parentId?: unknown; node?: SerialisedNode }[];\n}\n\n/** rrweb's IncrementalSource values for the payloads that can carry a field value. */\nconst MUTATION = 0;\nconst INPUT = 5;\n/** rrweb's NodeType values. */\nconst ELEMENT_NODE = 2;\nconst TEXT_NODE = 3;\nconst FIELD_TAGS = new Set(['input', 'textarea', 'select']);\n\n/** Replaces every text node under a node with asterisks. A textarea's initial content is one. */\nfunction maskTextChildren(node: SerialisedNode): void {\n for (const child of node.childNodes ?? []) {\n if (child.type === TEXT_NODE && typeof child.textContent === 'string') {\n child.textContent = child.textContent.replace(/\\S/g, '*');\n }\n maskTextChildren(child);\n }\n}\n\n/** The text of an unmasked textarea, less any card number in it. */\nfunction maskCardRunsInChildren(node: SerialisedNode): void {\n for (const child of node.childNodes ?? []) {\n if (child.type === TEXT_NODE && typeof child.textContent === 'string') child.textContent = maskCardRuns(child.textContent);\n }\n}\n\n/**\n * Walks a serialised tree and masks the value of every field the policy covers.\n *\n * Used for the full snapshot and for nodes added later, which is where a value\n * that was in the markup — or one a framework rendered a second after load —\n * rides out of the browser. `masked` is inherited: a field inside an element\n * the customer marked is masked even though the mark is on the ancestor.\n * `editable` is inherited the same way: text inside a `contenteditable`\n * region was typed, and a card number in it is masked like one in a field.\n */\nfunction scrubTree(node: SerialisedNode | undefined, policy: MaskingPolicy, masked: boolean, editable = false): void {\n if (!node) return;\n const attributes = node.attributes ?? {};\n const inheritedMask = masked || hasClass(attributes, policy.maskClass);\n const inheritedEditable = editable || (node.type === ELEMENT_NODE && isEditableSerialised(attributes));\n\n if (editable && node.type === TEXT_NODE && typeof node.textContent === 'string') {\n node.textContent = maskTyped(node.textContent);\n }\n\n if (node.type === ELEMENT_NODE && node.tagName && FIELD_TAGS.has(node.tagName.toLowerCase())) {\n const value = attributes.value;\n const shouldMask = policy.maskEveryField\n || inheritedMask\n || isSensitiveSerialised(attributes)\n || (typeof value === 'string' && cardShaped(value));\n if (shouldMask) {\n if (typeof value === 'string' && value !== '') attributes.value = maskValue(value);\n // A textarea's initial content is a text node as well as a value, and\n // rrweb serialises both.\n if (node.tagName.toLowerCase() === 'textarea') maskTextChildren(node);\n } else {\n // An ordinary field keeps its value, less any card number written into it.\n if (typeof value === 'string') attributes.value = maskCardRuns(value);\n if (node.tagName.toLowerCase() === 'textarea') maskCardRunsInChildren(node);\n }\n }\n\n for (const child of node.childNodes ?? []) scrubTree(child, policy, inheritedMask, inheritedEditable);\n}\n\n/**\n * Re-applies the floor to an event rrweb has already built.\n *\n * Events are scrubbed in place, before the transport sees them.\n */\nexport function scrubEvent(\n event: { type?: number; data?: unknown },\n getNode: (id: number) => MaybeElement,\n policy: MaskingPolicy,\n): void {\n if (!event.data) return;\n\n // The first full picture of the page: every value that was in the markup.\n if (event.type === 2) {\n scrubTree((event.data as { node?: SerialisedNode }).node, policy, false);\n return;\n }\n if (event.type !== 3) return;\n const data = event.data as IncrementalData;\n\n if (data.source === INPUT) {\n if (typeof data.text !== 'string' || data.text === '') return;\n const node = typeof data.id === 'number' ? getNode(data.id) : null;\n // A check box or radio button reports `checked`; its `value` is markup the\n // page wrote, not anything a person typed, and the replayer needs it to\n // tell one radio button in a group from another.\n const type = ((asElement(node) as HTMLInputElement | null)?.type ?? '').toLowerCase();\n if (type === 'checkbox' || type === 'radio') return;\n data.text = shouldMaskValue(data.text, node, policy) ? maskValue(data.text) : maskCardRuns(data.text);\n return;\n }\n\n if (data.source !== MUTATION) return;\n\n // A value a script assigned, which arrives as an attribute change.\n for (const entry of data.attributes ?? []) {\n const value = entry?.attributes?.value;\n if (typeof value !== 'string' || value === '') continue;\n const node = typeof entry.id === 'number' ? getNode(entry.id) : null;\n entry.attributes!.value = shouldMaskValue(value, node, policy) ? maskValue(value) : maskCardRuns(value);\n }\n // A field the page added after the snapshot, serialised the same way. The\n // mark that covers it may be on an element that was already there, so the\n // parent it is being attached to decides where the walk starts.\n for (const add of data.adds ?? []) {\n const parent = typeof add?.parentId === 'number' ? getNode(add.parentId) : null;\n scrubTree(add?.node, policy, isMarkedByCustomer(parent, policy.maskClass), insideEditable(parent));\n }\n // Typing into a `contenteditable` region changes a text node's content, one\n // keystroke at a time — the same leak as a field's input events.\n for (const change of data.texts ?? []) {\n if (typeof change?.value !== 'string' || !/[0-9]/.test(change.value)) continue;\n if (typeof change.id === 'number' && insideEditable(getNode(change.id))) change.value = maskTyped(change.value);\n }\n}\n","/**\n * What a developer opens a replay to find out: what broke.\n *\n * Three streams, each a reserved custom-event tag inside the rrweb stream so\n * they carry the recording's own clock and replay in order with the clicks\n * that caused them:\n *\n * - `anyreplay.error` — uncaught exceptions and unhandled rejections.\n * - `anyreplay.console` — `console.error` and `console.warn` calls.\n * - `anyreplay.network` — one entry per fetch/XHR, metadata only.\n *\n * `anyreplay.error` and `anyreplay.network` are a contract that already has a\n * reader: `packages/insights/src/rrweb.ts` has been looking for those tags,\n * and the `js_error`, `error_click` and `network_error` detectors have been\n * waiting for them. The payload field names here are the ones that file reads\n * (`message`; `url`, `status`, `method`) — renaming one silently empties three\n * signals, so they are pinned by a test in both packages.\n *\n * ## What never leaves the page\n *\n * No request or response bodies, no request headers, no cookies. A URL is\n * recorded, so a URL is redacted first: a query value whose key names a\n * secret, anything shaped like an email address, a long opaque token and\n * anything that passes the card-number check are replaced before the entry is\n * built. The same redaction runs over console messages, which are arbitrary\n * strings a page chose to print and so the least predictable thing here.\n *\n * ## Why the caps are low\n *\n * A page in a render loop can print thousands of warnings a second, and a\n * dashboard polling four endpoints makes a request a second for an hour. The\n * value of all of it is in the first few of each kind near the moment\n * something went wrong, so each stream has a per-session ceiling and drops\n * quietly once it is reached. Nothing here grows without bound, and nothing\n * here throws: every entry point is wrapped, because this code runs inside\n * the page's own `fetch` and its own `console`.\n */\n\nimport { looksLikeCardNumber } from './masking.js';\n\n/** Contract with `packages/insights/src/rrweb.ts` and `apps/ingest/src/custom-events.ts`. */\nexport const ERROR_TAG = 'anyreplay.error';\nexport const CONSOLE_TAG = 'anyreplay.console';\nexport const NETWORK_TAG = 'anyreplay.network';\n\n/**\n * Per-session ceilings.\n *\n * Errors are the point of the feature and the rarest, so they get the most\n * room relative to how often they happen; network is the chattiest and so is\n * capped hardest per unit of value.\n */\nexport const LIMITS = { error: 100, console: 200, network: 500 } as const;\n\n/** An error message or console line longer than this is a stack trace in disguise. */\nconst MAX_MESSAGE = 1000;\n/** Stacks are what makes an error actionable, but only the top of one is. */\nconst MAX_STACK = 4000;\n/** A URL this long is carrying data, not addressing a resource. */\nconst MAX_URL = 500;\n\n/** Query keys whose value is a secret whatever it looks like. */\nconst SECRET_KEY = /^(?:.*[_-])?(?:token|secret|password|passwd|pwd|key|apikey|api_key|auth|authorization|session|sid|jwt|code|otp|signature|sig|credential|access|refresh)(?:[_-].*)?$/i;\n/** An email address anywhere in a string. */\nconst EMAIL = /[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}/g;\n/**\n * A long opaque run of token-ish characters: a JWT, a signed id, a bearer\n * token pasted into a path. Needs both length and a digit so that ordinary\n * words, slugs and hashes of English text are left alone.\n */\nconst OPAQUE = /\\b(?=[A-Za-z0-9_-]*\\d)[A-Za-z0-9_-]{24,}\\b/g;\n/** Digit runs that pass the card check, wherever they appear. */\nconst DIGITS = /\\b[0-9][0-9 -]{11,22}[0-9]\\b/g;\n\nexport const REDACTED = '[redacted]';\n\n/**\n * Removes from free text the three things that turn up in it by accident:\n * an address, a token, a card number.\n *\n * Deliberately blunt. This is applied to strings a page printed or a URL it\n * requested, where there is no structure to reason about and the cost of a\n * false positive — a redacted order id — is far below the cost of a miss.\n */\nexport function redactText(text: string): string {\n return text\n .replace(EMAIL, REDACTED)\n .replace(DIGITS, (match) => (looksLikeCardNumber(match.trim()) ? REDACTED : match))\n .replace(OPAQUE, REDACTED);\n}\n\n/**\n * A URL with its secrets taken out, kept absolute so the host is still visible.\n *\n * Query values are replaced by key first — `?token=abc` is a secret even when\n * `abc` is three letters — and then the whole thing goes through the free-text\n * redaction, which catches an address or a token sitting in the path. The hash\n * is dropped: it never reaches a server, and on a hash-routed app it is the\n * one part most likely to hold an id.\n */\nexport function redactUrl(raw: string): string {\n const text = raw.length > MAX_URL ? raw.slice(0, MAX_URL) : raw;\n let parsed: URL;\n try {\n parsed = new URL(text, typeof location !== 'undefined' ? location.href : 'http://localhost');\n } catch {\n return redactText(text);\n }\n for (const key of [...parsed.searchParams.keys()]) {\n if (SECRET_KEY.test(key)) parsed.searchParams.set(key, REDACTED);\n }\n parsed.hash = '';\n // `origin + path + search` rather than `href`, so a password in the\n // authority (`https://user:pw@host`) is dropped rather than redacted.\n return redactText(`${parsed.origin}${parsed.pathname}${parsed.search}`);\n}\n\nconst clip = (text: string, max: number): string => (text.length > max ? `${text.slice(0, max)}…` : text);\n\nexport interface ErrorPayload {\n /** Read by the insights timeline. Redacted and clipped. */\n message: string;\n /** `Error`, `TypeError`, … when the thrown value was an Error. */\n name?: string;\n /** Redacted and clipped; absent when the thrown value carried none. */\n stack?: string;\n /** How it reached us, which is how severe it is: a rejection nobody handled is not a thrown error. */\n kind: 'error' | 'rejection';\n /** Where it was thrown, when the browser said. Already a redacted URL. */\n source?: string;\n line?: number;\n column?: number;\n}\n\nexport interface ConsolePayload {\n level: 'error' | 'warn';\n /** The arguments, joined and redacted. */\n message: string;\n}\n\nexport interface NetworkPayload {\n /** Read by the insights timeline. A redacted absolute URL. */\n url: string;\n /** Read by the insights timeline. Upper case. */\n method: string;\n /** Read by the insights timeline. 0 when the request never got a response. */\n status: number;\n /** Wall-clock milliseconds from call to settled, rounded. */\n durationMs: number;\n /** Which API the page used, which is all the panel needs to group them. */\n initiator: 'fetch' | 'xhr';\n /** Present and true when the request failed outright (network error, CORS, abort). */\n failed?: boolean;\n}\n\n/** What the page prints, flattened. Objects are described, never serialised deeply. */\nfunction describe(value: unknown): string {\n if (typeof value === 'string') return value;\n if (value === null) return 'null';\n if (value === undefined) return 'undefined';\n if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'bigint') return String(value);\n if (value instanceof Error) return `${value.name}: ${value.message}`;\n try {\n const json = JSON.stringify(value);\n // `undefined`, a function, a symbol: JSON has nothing to say about them.\n return json === undefined ? Object.prototype.toString.call(value) : json;\n } catch {\n // Circular, or a getter that throws. The shape is still worth knowing.\n return Object.prototype.toString.call(value);\n }\n}\n\n/** The thrown value, described however it arrived — pages throw strings. */\nexport function errorPayload(\n kind: ErrorPayload['kind'],\n value: unknown,\n where?: { source?: unknown; line?: unknown; column?: unknown },\n): ErrorPayload {\n const error = value instanceof Error ? value : null;\n const message = error ? `${error.name}: ${error.message}` : describe(value);\n const payload: ErrorPayload = { message: clip(redactText(message) || 'error', MAX_MESSAGE), kind };\n if (error) {\n payload.name = error.name;\n if (typeof error.stack === 'string' && error.stack.length > 0) {\n payload.stack = clip(redactText(error.stack), MAX_STACK);\n }\n }\n if (typeof where?.source === 'string' && where.source.length > 0) payload.source = redactUrl(where.source);\n if (typeof where?.line === 'number' && Number.isFinite(where.line)) payload.line = where.line;\n if (typeof where?.column === 'number' && Number.isFinite(where.column)) payload.column = where.column;\n return payload;\n}\n\nexport function consolePayload(level: ConsolePayload['level'], args: readonly unknown[]): ConsolePayload {\n const joined = args.map(describe).join(' ');\n return { level, message: clip(redactText(joined), MAX_MESSAGE) };\n}\n\n/** The method, as a short upper-case word; anything stranger is not a method. */\nfunction methodOf(value: unknown): string {\n const text = typeof value === 'string' ? value.toUpperCase() : 'GET';\n return /^[A-Z]{3,10}$/.test(text) ? text : 'GET';\n}\n\nexport interface DiagnosticsOptions {\n /** Emit uncaught errors and unhandled rejections. */\n errors: boolean;\n /** Emit `console.error` and `console.warn`. */\n console: boolean;\n /** Emit one entry per fetch/XHR. */\n network: boolean;\n /** Where entries go. Called with a reserved tag and a payload. */\n emit: (tag: string, payload: unknown) => void;\n /** Called the first time an error or a failed request is seen, so the session is flagged. */\n onError: () => void;\n /** Ingest's own endpoint, so the recorder never records itself. */\n ingestUrl: string;\n}\n\nexport interface DiagnosticsHandle {\n /** Puts back every patched global, in reverse order. Safe to call twice. */\n stop: () => void;\n /**\n * An error the page caught itself (`trackError`): redacted, counted against\n * the same per-session ceiling and flagging the session exactly as an\n * uncaught one would.\n */\n error: (value: unknown) => void;\n}\n\n/**\n * Patches `console`, `window` and the two request APIs, and gives back the\n * single function that undoes all of it.\n *\n * Patching is the only way to see any of this from a library, so the rules\n * are strict: the original is captured once and always called, its return\n * value is always passed through untouched, and everything this adds sits in\n * a `try` so that a bug here cannot break a page's error handling or its\n * network layer. Requests to the ingest endpoint are skipped — recording the\n * recorder is noise that also grows with itself.\n */\nexport function startDiagnostics(options: DiagnosticsOptions): DiagnosticsHandle {\n const undo: (() => void)[] = [];\n const counts = { error: 0, console: 0, network: 0 };\n let flagged = false;\n\n const budget = (stream: keyof typeof counts): boolean => {\n if (counts[stream] >= LIMITS[stream]) return false;\n counts[stream] += 1;\n return true;\n };\n const flag = (): void => {\n if (flagged) return;\n flagged = true;\n try {\n options.onError();\n } catch { /* never the page's problem */ }\n };\n const send = (tag: string, payload: unknown): void => {\n try {\n options.emit(tag, payload);\n } catch { /* as above */ }\n };\n\n let ingestOrigin: string | null = null;\n try {\n ingestOrigin = new URL(options.ingestUrl).origin;\n } catch { /* a malformed endpoint cannot match anything */ }\n\n const ours = (url: string): boolean => ingestOrigin !== null && url.startsWith(ingestOrigin);\n\n if (options.errors && typeof window !== 'undefined') {\n const onError = (event: ErrorEvent): void => {\n flag();\n if (!budget('error')) return;\n send(ERROR_TAG, errorPayload('error', event.error ?? event.message, {\n source: event.filename, line: event.lineno, column: event.colno,\n }));\n };\n const onRejection = (event: PromiseRejectionEvent): void => {\n flag();\n if (!budget('error')) return;\n send(ERROR_TAG, errorPayload('rejection', event.reason));\n };\n // Capture phase, so a page that stops propagation in its own handler does\n // not also stop the recording from seeing the error.\n window.addEventListener('error', onError as EventListener, { capture: true });\n window.addEventListener('unhandledrejection', onRejection as EventListener, { capture: true });\n undo.push(() => {\n window.removeEventListener('error', onError as EventListener, { capture: true });\n window.removeEventListener('unhandledrejection', onRejection as EventListener, { capture: true });\n });\n }\n\n if (options.console && typeof console !== 'undefined') {\n for (const level of ['error', 'warn'] as const) {\n const original = console[level] as ((...args: unknown[]) => void) | undefined;\n if (typeof original !== 'function') continue;\n const patched = function patchedConsole(this: unknown, ...args: unknown[]): void {\n try {\n // A recorder warning is not the page's diagnostics, and recording it\n // would let one bad event print and record forever.\n const first = args[0];\n const own = typeof first === 'string' && first.startsWith('[anyreplay]');\n if (!own && budget('console')) send(CONSOLE_TAG, consolePayload(level, args));\n } catch { /* fall through to the real console */ }\n original.apply(this, args);\n };\n console[level] = patched as typeof console.error;\n undo.push(() => { console[level] = original as typeof console.error; });\n }\n }\n\n if (options.network && typeof window !== 'undefined') {\n const originalFetch = window.fetch;\n if (typeof originalFetch === 'function') {\n const patchedFetch = function patchedFetch(\n this: unknown, input: RequestInfo | URL, init?: RequestInit,\n ): Promise<Response> {\n let url = '';\n let method = 'GET';\n try {\n url = typeof input === 'string' ? input\n : input instanceof URL ? input.href\n : (input as Request).url ?? '';\n method = methodOf(init?.method ?? (input as Request | undefined)?.method);\n } catch { /* an exotic input still gets its request made */ }\n const started = Date.now();\n const result = originalFetch.call(window, input as RequestInfo, init);\n if (!url || ours(url)) return result;\n return result.then(\n (response) => {\n try {\n if (budget('network')) {\n if (response.status >= 400) flag();\n send(NETWORK_TAG, {\n url: redactUrl(url), method, status: response.status,\n durationMs: Date.now() - started, initiator: 'fetch',\n } satisfies NetworkPayload);\n }\n } catch { /* never change what the page receives */ }\n return response;\n },\n (reason: unknown) => {\n try {\n flag();\n if (budget('network')) {\n send(NETWORK_TAG, {\n url: redactUrl(url), method, status: 0,\n durationMs: Date.now() - started, initiator: 'fetch', failed: true,\n } satisfies NetworkPayload);\n }\n } catch { /* as above */ }\n // Rethrow the original reason: the page's catch must see what it\n // would have seen, including the identity of the error object.\n throw reason;\n },\n );\n };\n window.fetch = patchedFetch as typeof window.fetch;\n undo.push(() => { window.fetch = originalFetch; });\n }\n\n const Xhr = window.XMLHttpRequest;\n if (typeof Xhr === 'function') {\n const open = Xhr.prototype.open;\n const sendMethod = Xhr.prototype.send;\n // The request's own facts, kept off the instance's own property names.\n const seen = new WeakMap<XMLHttpRequest, { url: string; method: string; started: number }>();\n Xhr.prototype.open = function patchedOpen(\n this: XMLHttpRequest, method: string, url: string | URL, ...rest: unknown[]\n ) {\n try {\n const href = typeof url === 'string' ? url : url.href;\n if (href && !ours(href)) seen.set(this, { url: href, method: methodOf(method), started: 0 });\n } catch { /* the request still opens */ }\n return (open as (...args: unknown[]) => void).call(this, method, url, ...rest);\n } as typeof Xhr.prototype.open;\n Xhr.prototype.send = function patchedSend(this: XMLHttpRequest, ...args: unknown[]) {\n try {\n const request = seen.get(this);\n if (request) {\n request.started = Date.now();\n const done = (failed: boolean): void => {\n try {\n if (failed || this.status >= 400) flag();\n if (!budget('network')) return;\n send(NETWORK_TAG, {\n url: redactUrl(request.url), method: request.method, status: this.status || 0,\n durationMs: Date.now() - request.started, initiator: 'xhr',\n ...(failed ? { failed: true } : {}),\n } satisfies NetworkPayload);\n } catch { /* never the page's problem */ }\n };\n this.addEventListener('load', () => done(false));\n this.addEventListener('error', () => done(true));\n this.addEventListener('timeout', () => done(true));\n this.addEventListener('abort', () => done(true));\n }\n } catch { /* as above */ }\n return (sendMethod as (...args: unknown[]) => void).call(this, ...args);\n } as typeof Xhr.prototype.send;\n undo.push(() => {\n Xhr.prototype.open = open;\n Xhr.prototype.send = sendMethod;\n });\n }\n }\n\n let stopped = false;\n return {\n error: (value) => {\n if (stopped) return;\n flag();\n if (budget('error')) send(ERROR_TAG, errorPayload('error', value));\n },\n stop: () => {\n if (stopped) return;\n stopped = true;\n for (let i = undo.length - 1; i >= 0; i -= 1) {\n try {\n undo[i]!();\n } catch { /* put back as much as can be put back */ }\n }\n },\n };\n}\n","/**\n * Custom events: the moments a page tags with `track()`.\n *\n * They travel inside the rrweb stream as rrweb's own Custom event type, so\n * they carry the recording's clock and replay in order with everything else.\n * Ingest recognises them by these tags; the names are a contract with\n * apps/ingest/src/custom-events.ts.\n */\nexport const TRACK_TAG = 'anyreplay.track';\nexport const NAVIGATE_TAG = 'anyreplay.navigate';\n\n/** Short and URL-safe: an event name is a label, not a message. Ingest applies the same rule. */\nexport const EVENT_NAME_PATTERN = /^[A-Za-z0-9_.:-]{1,64}$/;\n/** Properties are stored with the event and indexed by nobody; a bag bigger than this is a payload, not context. */\nexport const MAX_PROPERTIES_BYTES = 4 * 1024;\n\nexport interface TrackPayload {\n name: string;\n properties: Record<string, unknown>;\n}\n\n/**\n * Checks what the page passed to `track()`, returning the payload to send or\n * the reason it was refused. Never throws: the page's own code is calling\n * this on a click handler, and a recorder that throws there breaks the click.\n */\nexport function validateTrack(name: unknown, properties: unknown): TrackPayload | string {\n if (typeof name !== 'string' || !EVENT_NAME_PATTERN.test(name)) {\n return `event name must be 1-64 characters of [A-Za-z0-9_.:-], got ${JSON.stringify(name)}`;\n }\n if (properties === undefined || properties === null) return { name, properties: {} };\n if (typeof properties !== 'object' || Array.isArray(properties)) {\n return `properties for \"${name}\" must be a plain object`;\n }\n let serialised: string;\n try {\n serialised = JSON.stringify(properties);\n } catch {\n return `properties for \"${name}\" are not JSON-serialisable`;\n }\n if (serialised === undefined || byteLength(serialised) > MAX_PROPERTIES_BYTES) {\n return `properties for \"${name}\" exceed ${MAX_PROPERTIES_BYTES} bytes once serialised`;\n }\n // The parsed copy, not the original: a getter or a class instance on the\n // caller's object must not reach the wire, and a later mutation must not\n // change what was tracked.\n return { name, properties: JSON.parse(serialised) as Record<string, unknown> };\n}\n\nfunction byteLength(text: string): number {\n return typeof TextEncoder === 'function' ? new TextEncoder().encode(text).length : text.length * 3;\n}\n","/**\n * FNV-1a. Small, fast, and good enough to spread visitor ids uniformly across\n * the unit interval — this is a bucketing decision, not a security one.\n */\nexport function hashToUnitInterval(input: string): number {\n let hash = 0x811c9dc5;\n for (let i = 0; i < input.length; i += 1) {\n hash ^= input.charCodeAt(i);\n hash = Math.imul(hash, 0x01000193) >>> 0;\n }\n return hash / 0xffffffff;\n}\n\n/**\n * Decides sampling from the visitor id rather than a coin flip.\n *\n * The same visitor therefore gets the same answer on every page and every\n * visit: a recorded journey stays whole instead of appearing as disconnected\n * fragments, and changing the rate moves a predictable slice of the population.\n */\nexport function isSampledIn(visitorId: string, sampleRate: number): boolean {\n if (sampleRate >= 1) return true;\n if (sampleRate <= 0) return false;\n return hashToUnitInterval(visitorId) < sampleRate;\n}\n","import type { ResolvedOptions } from './config.js';\n\nexport interface RecordedEvent {\n type: number;\n timestamp: number;\n data?: unknown;\n}\n\nexport interface SessionMeta {\n startedAt: number;\n url?: string;\n lang?: string;\n userAgent?: string;\n screenWidth?: number;\n screenHeight?: number;\n referrer?: string;\n /** `maxSessionsPerMonth`, sent only with chunk 0 of a new session. */\n sessionCap?: number;\n /** What this SDK records on — always `web` for this one. */\n platform?: string;\n /** This SDK, so a session says which release recorded it. */\n sdk?: { name: string; version: string };\n /** Only from a wrapper that knows the app (`ShellInfo` in recorder.ts). */\n appVersion?: string;\n deviceModel?: string;\n}\n\nexport interface ChunkFlags {\n hasError?: boolean;\n hasRageClick?: boolean;\n pageCount?: number;\n}\n\nexport interface TransportContext {\n projectKey: string;\n sessionId: string;\n visitorId: string;\n /** The first chunk number to use. Non-zero when a page resumes a session. */\n initialSeq?: number;\n}\n\n/** How many times one chunk may move to a new chunk number before giving up. */\nconst MAX_STALE_RECOVERIES = 3;\n\n/** rrweb's event types this file has to tell apart. */\nconst EVENT_FULL_SNAPSHOT = 2;\nconst EVENT_INCREMENTAL = 3;\n\n/**\n * Ingest refuses a body over 512 KB with `413` (`MAX_CHUNK_BYTES` in\n * apps/ingest/src/config.ts). Nothing this transport builds may exceed it.\n */\nexport const MAX_BODY_BYTES = 512 * 1024;\n\n/**\n * What one chunk aims for when several events share it: half the hard limit.\n *\n * The margin is for the envelope (meta, flags) and for a self-hosted ingest\n * configured a little lower than ours. A full snapshot bigger than this still\n * goes, alone, as long as it is under the hard limit.\n */\nexport const TARGET_CHUNK_BYTES = 256 * 1024;\n\n/**\n * The smallest body limit a run of `413`s can shrink this transport to. Below\n * it every rrweb snapshot would be \"too large\", and an ingest that refuses\n * 8 KB is misconfigured rather than strict.\n */\nconst MIN_BODY_BYTES = 8 * 1024;\n\n/** Room left for the envelope when deciding which events fit. */\nconst ENVELOPE_SLACK_BYTES = 1024;\n\n/** One flush sends at most this many chunks back to back; the next tick continues. */\nconst MAX_CHUNKS_PER_FLUSH = 20;\n\n/** Backoff after a delivery failure: 2 s, 4 s, 8 s … at most a minute, each with jitter. */\nconst BACKOFF_BASE_MS = 2_000;\nconst BACKOFF_MAX_MS = 60_000;\n\n/**\n * The longest `Retry-After` honoured. A server asking for more is either\n * misconfigured or answering for someone else; an hour of silence would cost\n * the whole visit, and ten minutes inside the in-memory buffer is already\n * most of it.\n */\nconst MAX_RETRY_AFTER_MS = 10 * 60_000;\n\n/**\n * Refusals of a chunk's contents (`400`, `422`) in a row before the transport\n * stops. One is a bad event and costs that chunk; three in a row means every\n * chunk is refused — a visitor id or key ingest will never take — and going\n * on would upload a fresh snapshot every few seconds for nothing.\n */\nconst MAX_CONSECUTIVE_REFUSALS = 3;\n\n/**\n * The first free chunk number, when ingest says the one just sent was taken.\n *\n * Ingest answers a repeated (session, seq) with 202 and `duplicate: true`,\n * because to the server it looks like a retry. When this transport had never\n * sent that number before, it was not a retry: the number was used by an\n * earlier page of the session, or by another tab sharing it, and the events\n * were discarded. Servers that know the answer say where numbering continues.\n */\nasync function staleSeqHint(response: Response, sent: number): Promise<number | undefined> {\n try {\n if (typeof response.json !== 'function') return undefined;\n const reply = await response.json() as { duplicate?: unknown; nextSeq?: unknown };\n if (reply.duplicate !== true) return undefined;\n const next = reply.nextSeq;\n return typeof next === 'number' && Number.isInteger(next) && next > sent ? next : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * How long the server asked us to wait, from `Retry-After`: either a number\n * of seconds or an HTTP date. Undefined when there is no usable header —\n * including when the browser hides it, which it does on a cross-origin\n * response unless ingest lists it in `Access-Control-Expose-Headers`.\n */\nexport function retryAfterMs(response: Response, now = Date.now()): number | undefined {\n let raw: string | null | undefined;\n try {\n raw = response.headers?.get?.('Retry-After');\n } catch {\n return undefined;\n }\n if (!raw) return undefined;\n const text = raw.trim();\n if (/^\\d+(\\.\\d+)?$/.test(text)) return Math.min(MAX_RETRY_AFTER_MS, Number(text) * 1000);\n const date = Date.parse(text);\n if (Number.isNaN(date)) return undefined;\n return Math.min(MAX_RETRY_AFTER_MS, Math.max(0, date - now));\n}\n\n/**\n * UTF-8 length of a string, without allocating its encoding.\n *\n * Every event is measured once, on its way into a chunk, and a full snapshot\n * runs to hundreds of kilobytes; `TextEncoder` would copy each of them only to\n * read `.length`. Lone surrogates count as the three bytes their replacement\n * character takes, which is what `JSON.stringify` + UTF-8 produce.\n */\nexport function utf8Length(text: string): number {\n let bytes = 0;\n for (let i = 0; i < text.length; i += 1) {\n const code = text.charCodeAt(i);\n if (code < 0x80) bytes += 1;\n else if (code < 0x800) bytes += 2;\n else if (code >= 0xd800 && code <= 0xdbff && i + 1 < text.length) {\n const next = text.charCodeAt(i + 1);\n if (next >= 0xdc00 && next <= 0xdfff) { bytes += 4; i += 1; } else bytes += 3;\n } else bytes += 3;\n }\n return bytes;\n}\n\nexport type TransportState = 'open' | 'stopped';\n\n/**\n * The Fetch standard caps the total body size of in-flight `keepalive`\n * requests at 64 KiB, and a browser rejects an oversized one outright — the\n * promise rejects with a bare TypeError, indistinguishable from being offline.\n * `sendBeacon` shares the same budget.\n *\n * The margin below is for the request headers, which count towards the same\n * budget, and for a second flush overlapping the first.\n */\nexport const KEEPALIVE_BODY_LIMIT_BYTES = 56 * 1024;\n\n/**\n * Whether a payload may be sent with `keepalive`.\n *\n * Deciding this from the event *count* is the trap: the first chunk of every\n * session is a Meta plus a single full DOM snapshot — two events, and on a real\n * page routinely several hundred kilobytes. Sizing by count marks it as small,\n * the browser refuses it, and the recorder counts a network failure for a\n * request that can never succeed. The symptom is a site that records nothing\n * at all while the snippet looks perfectly installed.\n */\nexport function withinKeepaliveLimit(payload: string): boolean {\n return utf8Length(payload) <= KEEPALIVE_BODY_LIMIT_BYTES;\n}\n\nexport interface TransportHooks {\n onStopped?: (reason: string) => void;\n onSent?: (seq: number, eventCount: number) => void;\n /** Called with the next free chunk number before a request using the current one leaves. */\n onSeqReserved?: (nextSeq: number) => void;\n /**\n * Called when events had to be dropped and the recording needs a fresh\n * full snapshot to make sense again. The recorder answers by taking one\n * (`record.takeFullSnapshot`); until it arrives, DOM changes are not kept,\n * since they would describe nodes the server never saw.\n */\n onResyncNeeded?: () => void;\n /** Debug-only explanations: an event dropped, a body limit lowered. */\n onWarning?: (message: string) => void;\n}\n\n/** A chunk with its number, built once and resent byte-for-byte on every retry. */\ninterface Chunk {\n seq: number;\n events: RecordedEvent[];\n /** The events, already serialised, in order. */\n parts: string[];\n /** Attempts under the current `seq`. A duplicate answer to a retry means it arrived. */\n attempts: number;\n}\n\ntype Outcome = 'sent' | 'again' | 'wait' | 'stopped';\n\n/**\n * Ships buffered events to ingest.\n *\n * Three properties matter more than throughput here, because this code runs\n * inside somebody else's product:\n *\n * - It must never throw into the host page.\n * - It must never keep retrying a request the server has rejected on its\n * merits (a bad key, a disallowed origin) — that is an infinite loop.\n * - It must not lose the session to a network that is merely away: a train\n * tunnel, a laptop lid, a flaky café connection. It backs off and waits\n * instead of giving up, and keeps a bounded buffer meanwhile.\n *\n * And one property of every body it sends: under ingest's size limit. An\n * outage leaves up to 2000 events waiting; they go out as a run of chunks of\n * at most 200 events and about 256 KB each, in order, never as one body ingest\n * would refuse.\n */\nexport class Transport {\n private buffer: RecordedEvent[] = [];\n /** The chunk being delivered: built, numbered, maybe already attempted. */\n private pending: Chunk | undefined;\n /** The next unused chunk number. */\n private seq = 0;\n private consecutiveFailures = 0;\n private consecutiveRefusals = 0;\n private state: TransportState = 'open';\n private timer: ReturnType<typeof setInterval> | undefined;\n private retryTimer: ReturnType<typeof setTimeout> | undefined;\n private pendingMeta: SessionMeta | undefined;\n private flags: ChunkFlags = {};\n private inFlight = false;\n private staleRecoveries = 0;\n /** Our own backoff after a failure. Cleared when the network comes back. */\n private backoffUntil = 0;\n /** What the server asked for in `Retry-After`. Not cleared by anything but time. */\n private serverWaitUntil = 0;\n /** Largest body this transport will build; lowered by a `413`. */\n private bodyLimit = MAX_BODY_BYTES;\n private targetBytes = TARGET_CHUNK_BYTES;\n /**\n * Set when events were dropped and a full snapshot has been asked for:\n * DOM changes are not kept until it arrives.\n */\n private awaitingSnapshot = false;\n /** Serialised events, so a retry or a re-split does not stringify a snapshot twice. */\n private readonly serialised = new WeakMap<RecordedEvent, string>();\n\n constructor(\n private readonly options: ResolvedOptions,\n private readonly context: TransportContext,\n private readonly hooks: TransportHooks = {},\n ) {\n this.seq = context.initialSeq ?? 0;\n }\n\n get isStopped(): boolean {\n return this.state === 'stopped';\n }\n\n /** Events not yet delivered, including a chunk waiting to be retried. */\n get bufferedCount(): number {\n return this.buffer.length + (this.pending?.events.length ?? 0);\n }\n\n /** The number the next undelivered chunk will carry — the count of chunks delivered, for a fresh session. */\n get sentChunks(): number {\n return this.pending?.seq ?? this.seq;\n }\n\n /** The most events kept while deliveries fail. Older ones are dropped first. */\n private get bufferLimit(): number {\n return this.options.maxEventsPerChunk * 10;\n }\n\n /** Attaches metadata to the next chunk. Sent once, with the session's first chunk. */\n setMeta(meta: SessionMeta): void {\n this.pendingMeta = meta;\n }\n\n mergeFlags(flags: ChunkFlags): void {\n this.flags = { ...this.flags, ...flags };\n }\n\n start(): void {\n if (this.timer) return;\n this.timer = setInterval(() => void this.flush(), this.options.flushIntervalMs);\n // Never hold a Node process open; harmless in browsers.\n (this.timer as unknown as { unref?: () => void }).unref?.();\n }\n\n stop(reason: string): void {\n this.state = 'stopped';\n if (this.timer) clearInterval(this.timer);\n if (this.retryTimer) clearTimeout(this.retryTimer);\n this.timer = undefined;\n this.retryTimer = undefined;\n this.buffer = [];\n this.pending = undefined;\n this.hooks.onStopped?.(reason);\n }\n\n push(event: RecordedEvent): void {\n if (this.state === 'stopped') return;\n if (this.awaitingSnapshot) {\n // A DOM change made before the fresh snapshot is already in it.\n if (event.type === EVENT_INCREMENTAL) return;\n if (event.type === EVENT_FULL_SNAPSHOT) this.awaitingSnapshot = false;\n }\n this.buffer.push(event);\n if (this.bufferedCount > this.bufferLimit) this.dropOldest(this.bufferedCount - this.bufferLimit);\n if (this.buffer.length >= this.options.maxEventsPerChunk) void this.flush();\n }\n\n /**\n * The network is back (`online`), or the page is visible again: try now\n * rather than at the end of the backoff. A server's `Retry-After` still\n * holds — it was not about our connection.\n */\n resume(): void {\n if (this.state === 'stopped') return;\n this.backoffUntil = 0;\n void this.flush();\n }\n\n /**\n * Sends whatever is buffered, as as many chunks as it takes. Safe to call\n * when there is nothing to send, and while waiting out a failure, when it\n * does nothing. `force` skips our own backoff (an explicit `flush()` from\n * the page) but never the server's `Retry-After`.\n */\n async flush(force = false): Promise<void> {\n if (this.state === 'stopped' || this.inFlight) return;\n const now = Date.now();\n if (now < this.serverWaitUntil) return;\n if (!force && now < this.backoffUntil) return;\n if (!this.pending && this.buffer.length === 0) return;\n\n this.inFlight = true;\n try {\n // `again` (a re-cut, a dropped chunk, a new number) does not count as a\n // chunk sent, so the attempts are bounded separately.\n for (let sent = 0, tries = 0; sent < MAX_CHUNKS_PER_FLUSH && tries < MAX_CHUNKS_PER_FLUSH * 3 && this.state === 'open'; tries += 1) {\n const chunk = this.pending ?? this.nextChunk(this.bodyLimit, this.targetBytes);\n if (!chunk) break;\n this.pending = chunk;\n const outcome = await this.send(chunk);\n if (outcome === 'sent') sent += 1;\n else if (outcome !== 'again') break;\n }\n } finally {\n this.inFlight = false;\n }\n }\n\n /**\n * Builds the next chunk from the front of the buffer: at most\n * `maxEventsPerChunk` events and `target` bytes, or one event alone up to\n * `limit`. An event too large for any chunk is dropped here — it would be\n * refused, and refused again, and hold up everything behind it. For a\n * beacon (`forBeacon`) it is left where it is instead: an ordinary request\n * can still carry what a beacon cannot.\n */\n private nextChunk(limit: number, target: number, forBeacon = false): Chunk | undefined {\n const envelope = utf8Length(this.envelope(this.seq)) + ENVELOPE_SLACK_BYTES;\n const events: RecordedEvent[] = [];\n const parts: string[] = [];\n let bytes = envelope;\n\n while (this.buffer.length > 0 && events.length < this.options.maxEventsPerChunk) {\n const event = this.buffer[0]!;\n const part = this.serialise(event);\n const size = utf8Length(part) + 1;\n if (events.length === 0 && bytes + size > limit) {\n if (forBeacon) return undefined;\n this.buffer.shift();\n if (!this.dropOversized(event, size)) return undefined;\n continue;\n }\n if (events.length > 0 && bytes + size > target) break;\n events.push(event);\n parts.push(part);\n bytes += size;\n this.buffer.shift();\n }\n if (events.length === 0) return undefined;\n\n const chunk: Chunk = { seq: this.seq, events, parts, attempts: 0 };\n this.seq += 1;\n return chunk;\n }\n\n /**\n * An event that no chunk can carry. A DOM change or a custom event is\n * dropped, and the DOM is re-sent whole if the dropped one described it.\n * A full snapshot that alone exceeds the limit is a page this transport\n * cannot record — re-taking it would only be refused again — so recording\n * stops instead of uploading a snapshot every few seconds forever.\n */\n private dropOversized(event: RecordedEvent, bytes: number): boolean {\n const kb = Math.ceil(bytes / 1024);\n if (event.type === EVENT_FULL_SNAPSHOT) {\n this.hooks.onWarning?.(`page snapshot is ${kb} KB, over the ${Math.floor(this.bodyLimit / 1024)} KB ingest accepts`);\n this.stop('snapshot_too_large');\n return false;\n }\n this.hooks.onWarning?.(`dropped one event of ${kb} KB: larger than ingest accepts`);\n if (event.type === EVENT_INCREMENTAL) this.afterGap();\n return true;\n }\n\n private serialise(event: RecordedEvent): string {\n let part = this.serialised.get(event);\n if (part === undefined) {\n part = JSON.stringify(event);\n this.serialised.set(event, part);\n }\n return part;\n }\n\n /** Everything in a chunk's body except its events, as a JSON object. */\n private envelope(seq: number): string {\n return JSON.stringify({\n projectKey: this.context.projectKey,\n sessionId: this.context.sessionId,\n visitorId: this.context.visitorId,\n seq,\n // The app this page runs inside, on every request: ingest reads it only\n // when the request has no real web origin. See `appId` in config.ts.\n ...(this.options.appId ? { appId: this.options.appId } : {}),\n ...(this.pendingMeta ? { meta: this.pendingMeta } : {}),\n ...(Object.keys(this.flags).length > 0 ? { flags: this.flags } : {}),\n // This device's clock as the request leaves, on the same clock as the\n // event timestamps. Ingest compares it with its own to catch a device\n // that runs ahead — a test phone three weeks fast would otherwise list\n // its sessions as starting \"in 3 weeks\". Stamped here, when the body is\n // built, so a retry or a queue flushed after a spell offline carries\n // the time it was actually sent rather than when it was recorded.\n sentAt: Date.now(),\n });\n }\n\n /**\n * The body, assembled from the events' cached JSON rather than by\n * stringifying them again: a retry resends exactly the bytes the first\n * attempt sent, which is also what lets ingest read it as a retry.\n */\n private body(chunk: Chunk): string {\n return `{\"events\":[${chunk.parts.join(',')}],${this.envelope(chunk.seq).slice(1)}`;\n }\n\n /** One request, and what to do next. */\n private async send(chunk: Chunk): Promise<Outcome> {\n const retry = chunk.attempts > 0;\n chunk.attempts += 1;\n // Reserved before the request leaves: a page that is closed mid-flight\n // must not hand this number to the next page of the same session.\n this.hooks.onSeqReserved?.(chunk.seq + 1);\n const payload = this.body(chunk);\n\n let response: Response;\n try {\n response = await fetch(`${this.options.ingestUrl}/v1/ingest/events`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: payload,\n // Ingest is unauthenticated by design; sending credentials would be a\n // cross-site cookie leak for no benefit.\n credentials: 'omit',\n keepalive: withinKeepaliveLimit(payload),\n });\n } catch {\n // Network error: the visitor may simply be offline. Keep the chunk.\n return this.registerFailure(undefined);\n }\n if (this.state === 'stopped' || this.pending !== chunk) return 'stopped';\n\n if (response.ok) {\n const nextSeq = retry ? undefined : await staleSeqHint(response, chunk.seq);\n if (nextSeq !== undefined && this.staleRecoveries < MAX_STALE_RECOVERIES) {\n // These events were new and the server discarded them. Send them\n // again under the first number it has not seen.\n this.staleRecoveries += 1;\n chunk.seq = nextSeq;\n chunk.attempts = 0;\n this.seq = Math.max(this.seq, nextSeq + 1);\n return 'again';\n }\n this.pending = undefined;\n this.staleRecoveries = 0;\n this.pendingMeta = undefined;\n this.consecutiveFailures = 0;\n this.consecutiveRefusals = 0;\n this.backoffUntil = 0;\n this.hooks.onSent?.(chunk.seq, chunk.events.length);\n return 'sent';\n }\n\n const status = response.status;\n if (status === 413) return this.shrink(chunk, utf8Length(payload));\n\n // The chunk's contents were refused. Retrying the same bytes cannot help,\n // and stopping would lose the rest of the visit over one bad event, so\n // that chunk goes and recording continues — unless every chunk is refused.\n if (status === 400 || status === 422) {\n this.pending = undefined;\n this.consecutiveRefusals += 1;\n if (this.consecutiveRefusals >= MAX_CONSECUTIVE_REFUSALS) {\n this.stop(`rejected_${status}`);\n return 'stopped';\n }\n this.hooks.onWarning?.(`ingest refused a chunk (${status}); its ${chunk.events.length} events are dropped`);\n this.afterGap();\n return 'again';\n }\n\n // A timeout, a rate limit or a server error: try again later.\n if (status === 408 || status === 429 || status >= 500) {\n return this.registerFailure(retryAfterMs(response));\n }\n\n // Any other 4xx is a verdict, not a hiccup: the key is wrong, the origin\n // is not allowed (403), the plan is full (402), the URL is not ingest\n // (404). Retrying cannot change the answer, so stop instead of hammering\n // the endpoint from every page load forever.\n this.stop(`rejected_${status}`);\n return 'stopped';\n }\n\n /**\n * `413`: this ingest takes less than we thought. The chunk was not stored,\n * so its events go back to the front of the queue and are re-cut under a\n * lower limit; its number is not reused, so no number ever carries two\n * different sets of events. A chunk of one event that is still too large is\n * dropped by `nextChunk` on the way back out.\n */\n private shrink(chunk: Chunk, bytes: number): Outcome {\n this.pending = undefined;\n if (this.bodyLimit <= MIN_BODY_BYTES) {\n // Refusing even this little is not a size limit any chunk can meet.\n this.stop('rejected_413');\n return 'stopped';\n }\n this.buffer = [...chunk.events, ...this.buffer];\n this.bodyLimit = Math.max(MIN_BODY_BYTES, Math.min(this.bodyLimit, Math.floor(bytes / 2)));\n this.targetBytes = Math.min(this.targetBytes, this.bodyLimit);\n this.hooks.onWarning?.(`ingest refused ${Math.ceil(bytes / 1024)} KB as too large; sending at most ${Math.floor(this.bodyLimit / 1024)} KB per chunk`);\n return 'again';\n }\n\n /**\n * Counts a failed delivery and schedules the next attempt: 2 s, 4 s, 8 s …\n * up to a minute, each with jitter so a thousand tabs that lost the same\n * Wi-Fi do not all come back in the same second. The chunk stays pending,\n * to be resent under the same number.\n *\n * Recording does not stop over this unless the page asked for it with\n * `maxConsecutiveFailures`: the buffer exists for exactly this, and a\n * phone in a tunnel for half a minute must not end the visit's recording.\n */\n private registerFailure(serverWaitMs: number | undefined): Outcome {\n this.consecutiveFailures += 1;\n const limit = this.options.maxConsecutiveFailures;\n if (limit > 0 && this.consecutiveFailures >= limit) {\n this.stop('too_many_failures');\n return 'stopped';\n }\n const now = Date.now();\n const ceiling = Math.min(BACKOFF_MAX_MS, BACKOFF_BASE_MS * 2 ** Math.min(this.consecutiveFailures - 1, 16));\n const delay = ceiling / 2 + Math.random() * (ceiling / 2);\n this.backoffUntil = now + delay;\n if (serverWaitMs !== undefined) this.serverWaitUntil = now + serverWaitMs;\n this.scheduleRetry(Math.max(this.backoffUntil, this.serverWaitUntil) - now);\n return 'wait';\n }\n\n /**\n * The attempt at the end of a backoff. It skips the backoff check itself:\n * a timer may fire a fraction of a millisecond \"early\" against `Date.now`,\n * and refusing then would leave nothing scheduled until the next tick.\n */\n private scheduleRetry(delayMs: number): void {\n if (this.retryTimer) clearTimeout(this.retryTimer);\n this.retryTimer = setTimeout(() => {\n this.retryTimer = undefined;\n void this.flush(true);\n }, Math.max(0, Math.ceil(delayMs)));\n (this.retryTimer as unknown as { unref?: () => void }).unref?.();\n }\n\n /**\n * Keeps the buffer bounded during a long outage. Older events go first — a\n * replay missing a stretch is still useful; a crashed page is not. A chunk\n * waiting to be retried is the oldest of all, and goes whole: sending part\n * of it under its number could clash with an attempt that did arrive.\n */\n private dropOldest(count: number): void {\n let remaining = count;\n if (this.pending && !this.inFlight) {\n remaining -= this.pending.events.length;\n this.pending = undefined;\n }\n if (remaining > 0) this.buffer.splice(0, remaining);\n this.hooks.onWarning?.(`dropped ${count} buffered events while ingest could not be reached`);\n this.afterGap();\n }\n\n /**\n * After events were dropped: DOM changes left before the next full snapshot\n * may describe nodes whose creation was dropped, and a replay applying them\n * breaks. They go, and when the buffer holds no snapshot to start again\n * from, the recorder is asked for one. Custom events, errors and the like\n * do not depend on the DOM and stay.\n */\n private afterGap(): void {\n const snapshot = this.buffer.findIndex((e) => e.type === EVENT_FULL_SNAPSHOT);\n const end = snapshot === -1 ? this.buffer.length : snapshot;\n this.buffer = [\n ...this.buffer.slice(0, end).filter((e) => e.type !== EVENT_INCREMENTAL),\n ...this.buffer.slice(end),\n ];\n if (snapshot === -1 && !this.awaitingSnapshot && this.hooks.onResyncNeeded) {\n this.awaitingSnapshot = true;\n this.hooks.onResyncNeeded();\n }\n }\n\n /**\n * Last-gasp send when the page is going away or hidden.\n *\n * `fetch` is cancelled once the document unloads, so the tail of every\n * session would be lost. `sendBeacon` hands the payload to the browser, which\n * delivers it after the page is gone — but only up to 64 KB in flight, so\n * the tail goes as a run of small chunks, oldest first, until the browser\n * says it has no room. What it refuses stays buffered for the page's next\n * flush, should there be one (a hidden tab that comes back, a page restored\n * from the back/forward cache).\n *\n * For a tab that is only hidden, and so likely to come back, nothing goes\n * while deliveries are failing or the server asked us to wait: a beacon\n * \"queued\" while offline is usually a beacon lost, where the buffer and the\n * backoff would have delivered it. On `pagehide` (`final`), the last\n * chance there is, it goes regardless.\n */\n flushWithBeacon(final = false): boolean {\n if (this.state === 'stopped' || (!this.pending && this.buffer.length === 0)) return false;\n if (!final && (this.consecutiveFailures > 0 || Date.now() < this.serverWaitUntil)) return false;\n if (typeof navigator === 'undefined' || typeof navigator.sendBeacon !== 'function') return false;\n\n const url = `${this.options.ingestUrl}/v1/ingest/events`;\n let queuedAny = false;\n let tooLarge = false;\n try {\n // A chunk that failed earlier goes first, under its own number. If it\n // is still in flight this may deliver it twice, which ingest reads as a\n // retry; the alternative is losing it with the page.\n const pending = this.pending;\n if (pending) {\n const payload = this.body(pending);\n if (!withinKeepaliveLimit(payload)) {\n tooLarge = true;\n } else {\n if (!this.beacon(url, pending, payload)) return queuedAny;\n queuedAny = true;\n if (!this.inFlight) {\n this.pending = undefined;\n this.pendingMeta = undefined;\n }\n }\n }\n\n while (!tooLarge && this.buffer.length > 0) {\n const chunk = this.nextChunk(KEEPALIVE_BODY_LIMIT_BYTES, KEEPALIVE_BODY_LIMIT_BYTES, true);\n if (!chunk) {\n // The next event alone is over what a beacon may carry.\n tooLarge = true;\n break;\n }\n const payload = this.body(chunk);\n if (!this.beacon(url, chunk, payload)) {\n // The browser's queue is full. The events go back, and the number\n // with them: nothing was sent under it.\n this.buffer = [...chunk.events, ...this.buffer];\n this.seq = chunk.seq;\n break;\n }\n queuedAny = true;\n this.pendingMeta = undefined;\n }\n } catch {\n /* never into the page */\n }\n\n // Something too big for any beacon — usually a fresh full snapshot. A\n // hidden page is still alive, and an ordinary request carries it.\n if (tooLarge) void this.flush(true);\n return queuedAny;\n }\n\n /** Hands one chunk to the browser. False when its beacon queue is full. */\n private beacon(url: string, chunk: Chunk, payload: string): boolean {\n this.hooks.onSeqReserved?.(chunk.seq + 1);\n // text/plain avoids a CORS preflight, which cannot complete during unload.\n const blob = new Blob([payload], { type: 'text/plain;charset=UTF-8' });\n return navigator.sendBeacon(url, blob);\n }\n}\n","/**\n * Which SDK recorded a session, as it tells ingest on the session's first chunk.\n *\n * The version is the package's own, written in at build time by tsup (and by\n * Vitest for the tests) from package.json — see `define` in tsup.config.ts.\n * Not imported from package.json at runtime: that would ship the whole\n * manifest inside the CDN bundle, and a bundler that does not resolve JSON\n * would fail on it. Source consumed without that build step (a workspace\n * importing `src/` directly) reports `0.0.0-dev`, which is honest about what\n * it is rather than a version that was never released.\n */\ndeclare const __ANYREPLAY_SDK_VERSION__: string | undefined;\n\nexport const SDK_NAME = '@anyreplay/browser';\n\nexport const SDK_VERSION: string =\n typeof __ANYREPLAY_SDK_VERSION__ === 'string' ? __ANYREPLAY_SDK_VERSION__ : '0.0.0-dev';\n\n/** What a browser page records on. An app shell (Capacitor, Electron) will have its own SDK say otherwise. */\nexport const PLATFORM = 'web';\n","const VISITOR_KEY = 'anyreplay.vid';\nconst SESSION_KEY = 'anyreplay.sid';\nconst SESSION_TS_KEY = 'anyreplay.sts';\n/** The next chunk number the current session may use. */\nconst SEQ_KEY = 'anyreplay.seq';\n/** Page views so far in the current session, so a reload continues the count. */\nconst PAGE_KEY = 'anyreplay.pc';\n/** Until when (epoch ms) this tab should not try to record, after ingest refused a new session. */\nconst COOLDOWN_KEY = 'anyreplay.cd';\n\n/**\n * How long a tab waits after a 402 before trying to record again.\n *\n * A quota or cap is a monthly fact; retrying on every page load would put one\n * refused request per navigation on ingest, from every visitor, for the rest\n * of the month. Two minutes is long enough to make that negligible and short\n * enough that an upgrade takes effect while the customer is still watching.\n */\nconst QUOTA_COOLDOWN_MS = 2 * 60 * 1000;\n\n/** A new session starts after this much inactivity, matching common analytics. */\nconst SESSION_IDLE_MS = 30 * 60 * 1000;\n\nfunction randomId(bytes = 16): string {\n const array = new Uint8Array(bytes);\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n crypto.getRandomValues(array);\n } else {\n for (let i = 0; i < bytes; i += 1) array[i] = Math.floor(Math.random() * 256);\n }\n return Array.from(array, (b) => b.toString(16).padStart(2, '0')).join('');\n}\n\n/** RFC 4122 v4, formatted. Ingest requires a UUID for the session id. */\nexport function uuidv4(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n const hex = randomId(16).split('');\n hex[12] = '4';\n hex[16] = ((parseInt(hex[16]!, 16) & 0x3) | 0x8).toString(16);\n const s = hex.join('');\n return `${s.slice(0, 8)}-${s.slice(8, 12)}-${s.slice(12, 16)}-${s.slice(16, 20)}-${s.slice(20)}`;\n}\n\ninterface Storage {\n get(key: string): string | null;\n set(key: string, value: string): void;\n remove(key: string): void;\n}\n\n/**\n * Storage that degrades instead of throwing.\n *\n * `localStorage` throws on access in some privacy modes, and a recorder that\n * throws inside the customer's page is far worse than one that stops recording.\n */\nexport function safeStorage(source: () => globalThis.Storage | undefined): Storage {\n const read = (): globalThis.Storage | undefined => {\n try { return source(); } catch { return undefined; }\n };\n return {\n get: (key) => { try { return read()?.getItem(key) ?? null; } catch { return null; } },\n set: (key, value) => { try { read()?.setItem(key, value); } catch { /* ignore */ } },\n remove: (key) => { try { read()?.removeItem(key); } catch { /* ignore */ } },\n };\n}\n\nexport interface Identity {\n visitorId: string;\n sessionId: string;\n isNewSession: boolean;\n /** The chunk number to continue from: 0 for a new session, later for a resumed one. */\n nextSeq: number;\n /** Which page view of the session this is: 1 for a new session, previous + 1 for a resumed one. */\n pageCount: number;\n}\n\n/**\n * Resolves who this is and which session they are in.\n *\n * The visitor id persists across visits (it is what sampling is decided on, so\n * a sampled-out visitor stays sampled out rather than flickering). The session\n * id resets after a period of inactivity.\n */\nexport function resolveIdentity(\n local: Storage,\n session: Storage,\n now: number = Date.now(),\n): Identity {\n let visitorId = local.get(VISITOR_KEY);\n if (!visitorId || !/^[A-Za-z0-9_-]{8,64}$/.test(visitorId)) {\n visitorId = `v${randomId(12)}`;\n local.set(VISITOR_KEY, visitorId);\n }\n\n const previousId = session.get(SESSION_KEY);\n const previousTs = Number(session.get(SESSION_TS_KEY) ?? 0);\n const expired = !previousId || !previousTs || now - previousTs > SESSION_IDLE_MS;\n\n const sessionId = expired ? uuidv4() : previousId;\n session.set(SESSION_KEY, sessionId);\n session.set(SESSION_TS_KEY, String(now));\n\n // A resumed session continues its chunk numbering. Starting again at 0 on\n // every page load collides with chunks the server already holds for this\n // session, and ingest drops a repeated (session, seq) as a retry — silently\n // losing everything recorded after the first page.\n const storedSeq = Number(session.get(SEQ_KEY));\n const nextSeq = !expired && Number.isInteger(storedSeq) && storedSeq > 0 ? storedSeq : 0;\n session.set(SEQ_KEY, String(nextSeq));\n\n // A full navigation is a page view of the same session. Starting the count\n // at 1 on every page would report a ten-page visit as one page.\n const storedPages = Number(session.get(PAGE_KEY));\n const pageCount = !expired && Number.isInteger(storedPages) && storedPages > 0 ? storedPages + 1 : 1;\n session.set(PAGE_KEY, String(pageCount));\n\n return { visitorId, sessionId, isNewSession: expired, nextSeq, pageCount };\n}\n\n/** Records the page count so the next page of the session continues from it. */\nexport function notePageCount(session: { set(key: string, value: string): void }, count: number): void {\n session.set(PAGE_KEY, String(count));\n}\n\n/** True while this tab is still inside the cool-down that followed a 402. */\nexport function inCooldown(session: Storage, now: number = Date.now()): boolean {\n const until = Number(session.get(COOLDOWN_KEY));\n return Number.isFinite(until) && until > now;\n}\n\nexport function startCooldown(session: Storage, now: number = Date.now()): void {\n session.set(COOLDOWN_KEY, String(now + QUOTA_COOLDOWN_MS));\n}\n\n/** Records that chunk numbers below `next` are taken, before the request that uses one leaves. */\nexport function reserveSeq(session: { set(key: string, value: string): void }, next: number): void {\n session.set(SEQ_KEY, String(next));\n}\n\nexport function touchSession(session: Storage, now: number = Date.now()): void {\n session.set(SESSION_TS_KEY, String(now));\n}\n\n/**\n * Removes everything the recorder has stored in this browser.\n *\n * Called when consent is refused. A refusal has to undo an earlier acceptance,\n * not merely stop the current page: the visitor id written last week is\n * exactly what the visitor is now saying no to, and leaving it in place would\n * make \"we store nothing without consent\" untrue for as long as it sat there.\n * The cool-down goes too — it is a fact about a session that no longer exists.\n * Removing a key that is not there creates nothing, so this is safe to call\n * before anything was ever written.\n */\nexport function forgetVisitor(local: Storage, session: Storage): void {\n local.remove(VISITOR_KEY);\n for (const key of [SESSION_KEY, SESSION_TS_KEY, SEQ_KEY, PAGE_KEY, COOLDOWN_KEY]) session.remove(key);\n}\n\nexport { VISITOR_KEY, SESSION_KEY, SESSION_TS_KEY, SEQ_KEY, PAGE_KEY, COOLDOWN_KEY, SESSION_IDLE_MS, QUOTA_COOLDOWN_MS };\n","import { record } from 'rrweb';\nimport { ASSET_TAG, AssetCollector, localAssetPrefix } from './assets.js';\nimport type { AnyReplayOptions, ResolvedOptions } from './config.js';\nimport { resolveOptions } from './config.js';\nimport { ERROR_TAG, errorPayload, startDiagnostics, type DiagnosticsHandle } from './diagnostics.js';\nimport { NAVIGATE_TAG, TRACK_TAG, validateTrack } from './events.js';\nimport { MASK_EVERY_FIELD, MASK_SENSITIVE_FIELDS, scrubEvent, type MaskingPolicy } from './masking.js';\nimport { isSampledIn } from './sampling.js';\nimport { Transport, type RecordedEvent, type SessionMeta } from './transport.js';\nimport { PLATFORM, SDK_NAME, SDK_VERSION } from './version.js';\nimport {\n forgetVisitor, inCooldown, notePageCount, resolveIdentity, reserveSeq, safeStorage, startCooldown, touchSession,\n type Identity,\n} from './visitor.js';\n\n/**\n * What an SDK that wraps this one says about the app the page runs in.\n *\n * Not an option: a website never has one. `@anyreplay/capacitor`,\n * `@anyreplay/cordova` and the desktop shells pass it as `createRecorder`'s\n * second argument, so a session names the SDK that was installed and the\n * platform it runs on (contract §2.3–§2.5) while the recording itself — rrweb,\n * masking, transport — stays this package's, unchanged (contract §4).\n */\nexport interface ShellInfo {\n /** One of the web family's platforms: `capacitor`, `cordova`, `electron`, `tauri`. */\n platform: string;\n /** The wrapper's own npm name and version. */\n sdk: { name: string; version: string };\n /** The app's user-visible version (`CFBundleShortVersionString`, `versionName`), ≤ 40. */\n appVersion?: string;\n /** The hardware model (`iPhone15,2`, `Pixel 8`), ≤ 64. */\n deviceModel?: string;\n /**\n * Called the moment a chunk number is reserved, before the request that\n * uses it leaves. A shell that copies the recorder's keys into native\n * storage copies them then: an app killed between a send and the shell's\n * next periodic copy came back with the old number, and sent its first\n * chunk under a number the server already held (seen on an iOS simulator).\n */\n onStateChanged?: () => void;\n}\n\nexport type RecorderStatus = 'idle' | 'awaiting-consent' | 'recording' | 'sampled-out' | 'stopped';\n\nexport interface IdentifyTraits {\n userId?: string;\n email?: string;\n}\n\nexport interface RecorderHandle {\n status: () => RecorderStatus;\n sessionId: () => string | null;\n consent: (granted: boolean) => void;\n identify: (traits: IdentifyTraits) => void;\n /**\n * Tags this moment of the recording so it shows on the player's timeline.\n *\n * `name` is 1–64 characters of `[A-Za-z0-9_.:-]`; `properties` must be a\n * plain JSON object of at most 4 KB. Anything else is dropped with a warning\n * in debug mode — never an exception, since this runs inside the page's\n * own handlers.\n */\n track: (name: string, properties?: Record<string, unknown>) => void;\n /**\n * Records an error the page caught itself — a failed checkout handled with a\n * message, an error another tracker saw first — as the same `anyreplay.error`\n * event an uncaught one becomes: redacted by the same rules, counted against\n * the same ceiling, and setting the session's `hasError`. Accepts anything\n * that can be thrown. Ignored with `recordErrors: false`. Before recording\n * starts it is held like `track` and still flags the session once it does.\n */\n trackError: (error: unknown) => void;\n stop: () => void;\n flush: () => Promise<void>;\n}\n\n/** Rage click: several clicks in nearly the same spot in quick succession. */\n/** rrweb's `EventType.DomContentLoaded` and `EventType.Load`: page milestones with no data. */\nconst RRWEB_DOM_CONTENT_LOADED = 0;\nconst RRWEB_LOAD = 1;\n\nconst RAGE_CLICK_COUNT = 3;\nconst RAGE_CLICK_WINDOW_MS = 1000;\nconst RAGE_CLICK_RADIUS_PX = 30;\n\n/**\n * Events tracked before rrweb is emitting — while consent is pending, or\n * while the document is still loading — wait here. Enough for an app's boot\n * sequence; a page that tracks more than this before anything is recorded is\n * looping, and keeping the oldest ones tells the story better than the newest.\n */\nconst MAX_PENDING_EVENTS = 32;\n\n/**\n * Everywhere a person can type that is not a form control.\n *\n * A `contenteditable` element's text is page text, not an input value, so\n * input masking never sees it — which is why `maskAllTyping` exists and why it\n * is expressed as a text selector. `contenteditable=\"false\"` is how a page\n * marks a part of an editor that cannot be edited (a mention chip, an embed),\n * so it is not itself a reason to mask; text inside it is still masked when an\n * editable ancestor is, which is the safe way round.\n */\nconst EDITABLE_SELECTOR = '[contenteditable]:not([contenteditable=\"false\"])';\n\nexport function createRecorder(rawOptions: AnyReplayOptions, shell?: ShellInfo): RecorderHandle {\n const options: ResolvedOptions = resolveOptions(rawOptions);\n\n const local = safeStorage(() => globalThis.localStorage);\n const session = safeStorage(() => globalThis.sessionStorage);\n\n let status: RecorderStatus = 'idle';\n /**\n * Who this is, and the channel to ingest. Neither exists until the recorder\n * is allowed to record — see `begin`. With `requireConsent` that is the\n * moment `consent(true)` is called; otherwise it is right now.\n */\n let identity: Identity | undefined;\n let transport: Transport | undefined;\n let stopRecording: (() => void) | undefined;\n /** Patched globals wait here to be put back; see `diagnostics.ts`. */\n let diagnostics: DiagnosticsHandle | undefined;\n /** With `assets: 'inline'`: makes the app's own files part of the recording. */\n let assets: AssetCollector | undefined;\n let pageCount = 0;\n /**\n * Traits given to `identify` before there was a session to attach them to.\n * Held in memory only, and sent the moment recording starts — so\n * `consent(true)` followed by `identify` on the next line works, and an\n * identity never leaves the page for a visitor who has not agreed.\n */\n let pendingTraits: IdentifyTraits | undefined;\n\n /**\n * Traits for the current session that wait for its first accepted chunk.\n *\n * Ingest attaches traits to a session that exists and answers `202\n * { applied: false }` to one that does not (contract §8.2). `identify` on\n * the line after `init` — the usual place, after a login on page load — went\n * out before the first chunk had made the session, nothing sent it again,\n * and the session was never linked to anyone (found by the Flutter SDK's\n * device test). The traits now wait for the first chunk ingest accepts;\n * after that, `identify` goes straight out.\n */\n let traitsAwaitingSession: IdentifyTraits | undefined;\n /** Traits ingest answered `applied: false` to: tried once more after the next accepted chunk. */\n let traitsToRetry: IdentifyTraits | undefined;\n /** Whether a chunk of the current session has been accepted, so the session exists. */\n let sessionDelivered = false;\n\n const postIdentity = (who: Identity, traits: IdentifyTraits, retryIfUnapplied: boolean): void => {\n void fetch(`${options.ingestUrl}/v1/ingest/identify`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'omit',\n body: JSON.stringify({\n projectKey: options.projectKey, sessionId: who.sessionId, ...traits,\n ...(options.appId ? { appId: options.appId } : {}),\n }),\n }).then(async (response) => {\n if (!retryIfUnapplied || response.status !== 202) return;\n const reply = await response.json() as { applied?: unknown };\n // The row was not there after all (a server that lost a race): one more\n // try after the next accepted chunk — unless newer traits have been\n // given since, or the session has changed.\n if (reply.applied === false && identity === who && !traitsAwaitingSession && !traitsToRetry) {\n traitsToRetry = traits;\n }\n }).catch(() => { /* identity is best-effort; never surface to the page */ });\n };\n\n const sendIdentity = (who: Identity, traits: IdentifyTraits): void => {\n traitsToRetry = undefined;\n if (!sessionDelivered) {\n // Two calls before the session exists send what both said, once.\n traitsAwaitingSession = { ...traitsAwaitingSession, ...traits };\n return;\n }\n postIdentity(who, traits, true);\n };\n\n /** A chunk of `channel` was accepted: the session exists, and what waited for it goes. */\n const noteDelivered = (channel: Transport): void => {\n if (channel !== transport || !identity) return;\n sessionDelivered = true;\n const waiting = traitsAwaitingSession;\n const retry = traitsToRetry;\n traitsAwaitingSession = undefined;\n traitsToRetry = undefined;\n if (waiting) postIdentity(identity, waiting, true);\n else if (retry) postIdentity(identity, retry, false);\n };\n\n const collectMeta = (who: Identity): SessionMeta => ({\n startedAt: Date.now(),\n url: safeLocation(),\n lang: typeof navigator !== 'undefined' ? navigator.language : undefined,\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : undefined,\n screenWidth: typeof window !== 'undefined' ? window.innerWidth : undefined,\n screenHeight: typeof window !== 'undefined' ? window.innerHeight : undefined,\n referrer: typeof document !== 'undefined' ? document.referrer || undefined : undefined,\n platform: shell?.platform ?? PLATFORM,\n sdk: shell?.sdk ?? { name: SDK_NAME, version: SDK_VERSION },\n ...(shell?.appVersion ? { appVersion: shell.appVersion.slice(0, 40) } : {}),\n ...(shell?.deviceModel ? { deviceModel: shell.deviceModel.slice(0, 64) } : {}),\n // The cap is a decision about starting a session, so it goes only where\n // ingest makes that decision: chunk 0. A resumed page starts later.\n ...(options.maxSessionsPerMonth !== undefined && who.nextSeq === 0\n ? { sessionCap: options.maxSessionsPerMonth }\n : {}),\n });\n\n const recentClicks: { x: number; y: number; t: number }[] = [];\n\n const noteInteraction = (event: RecordedEvent, channel: Transport): void => {\n // rrweb IncrementalSnapshot(3) with MouseInteraction(2) source carries clicks,\n // but it also carries the mousedown and mouseup around each of them — one\n // ordinary click is three interactions, which is exactly RAGE_CLICK_COUNT,\n // and every session with a single click was being flagged as rage. Only\n // the Click itself (interaction type 2) is a click. A tap on a phone\n // fires one as well, so touch devices are still counted.\n const data = event.data as { source?: number; type?: number; x?: number; y?: number } | undefined;\n if (event.type !== 3 || data?.source !== 2 || data.type !== 2 || typeof data.x !== 'number') return;\n\n const now = event.timestamp;\n recentClicks.push({ x: data.x, y: data.y ?? 0, t: now });\n while (recentClicks.length > 0 && now - recentClicks[0]!.t > RAGE_CLICK_WINDOW_MS) recentClicks.shift();\n\n // Counted around the click that just landed, not around the oldest one in\n // the window: a single click somewhere else a moment earlier must not hide\n // the burst that follows it on the button that is not answering.\n const near = recentClicks.filter(\n (c) => Math.abs(c.x - data.x!) < RAGE_CLICK_RADIUS_PX && Math.abs(c.y - (data.y ?? 0)) < RAGE_CLICK_RADIUS_PX,\n );\n if (near.length >= RAGE_CLICK_COUNT) channel.mergeFlags({ hasRageClick: true });\n };\n\n /* ----------------------------- custom events ---------------------------- */\n\n const pending: { tag: string; payload: unknown }[] = [];\n let draining = false;\n let drainScheduled = false;\n\n /**\n * Hands the queue of waiting events to rrweb, in order.\n *\n * `addCustomEvent` throws until rrweb has finished its first snapshot,\n * which it takes on `load` when the recorder starts in a still-loading\n * document — and it flips to accepting only after the snapshot's own\n * events have been emitted, so draining from inside `emit` can be refused\n * too. A refusal is retried on the next event and, in case no event comes,\n * on a timer. A queued event is stamped with the time it is handed over,\n * not the time `track` was called: a marker a few hundred milliseconds late\n * is still on the timeline, and one dated before the snapshot is not.\n */\n const drainPending = (): void => {\n if (draining || pending.length === 0) return;\n draining = true;\n try {\n while (pending.length > 0) {\n const next = pending[0]!;\n record.addCustomEvent(next.tag, next.payload);\n pending.shift();\n // An error held from before recording started flags the session as\n // one caught now would (contract §3.5, §8.3).\n if (next.tag === ERROR_TAG) transport?.mergeFlags({ hasError: true });\n }\n } catch {\n if (!drainScheduled && status === 'recording') {\n drainScheduled = true;\n setTimeout(() => { drainScheduled = false; drainPending(); }, 50);\n }\n } finally {\n draining = false;\n }\n };\n\n /**\n * The queue lives in memory only. An event tracked while consent is\n * pending must not leave a trace anywhere a refusal would have to clean up.\n */\n const emitCustom = (tag: string, payload: unknown): void => {\n if (status === 'stopped' || status === 'sampled-out') return;\n if (status === 'recording') {\n try {\n record.addCustomEvent(tag, payload);\n return;\n } catch {\n /* not emitting yet — queue it */\n }\n }\n if (pending.length >= MAX_PENDING_EVENTS) {\n if (options.debug) console.warn(`[anyreplay] dropped ${tag}: too many events before recording started`);\n return;\n }\n pending.push({ tag, payload });\n };\n\n /* ------------------------------ navigation ------------------------------ */\n\n let lastUrl: string | undefined;\n\n /**\n * A route change in a single-page app is a page view.\n *\n * rrweb records the DOM mutations that come with it, but nothing in the\n * stream says \"this is a new page\" — so the marker is emitted here, and\n * ingest indexes it for the player. Same-URL changes are ignored: routers\n * call `replaceState` for scroll positions and query tweaks, and each of\n * those is not a page.\n */\n const noteNavigation = (channel: Transport): void => {\n const url = safeLocation();\n if (!url || url === lastUrl) return;\n lastUrl = url;\n pageCount += 1;\n notePageCount(session, pageCount);\n channel.mergeFlags({ pageCount });\n emitCustom(NAVIGATE_TAG, { url, title: typeof document !== 'undefined' ? document.title : '' });\n };\n\n /**\n * Everything that leaves a trace happens here, and nothing before it.\n *\n * Resolving the identity writes the visitor id to `localStorage` and the\n * session to `sessionStorage`; opening the transport is what makes a request\n * possible; starting rrweb is what observes the page. With `requireConsent`\n * every one of those waits for `consent(true)`, because storing an\n * identifier on the device is the very thing the consent is for. Nor does\n * the recorder peek at an id an earlier page left behind to decide that\n * consent was already given: the id may predate a refusal — the visitor\n * accepted in May and rejected in June — or have been written by a version\n * of this recorder that stored it without asking. Only the page knows the\n * current answer, and it says so by calling `consent`.\n *\n * Sampling is still decided from the visitor id, so it is still the same\n * answer for the same visitor on every page. What moves is *when* it is\n * decided: a visitor is sampled on first consent rather than on first page\n * view, and a visitor who refuses is forgotten, so a later acceptance is a\n * fresh draw.\n */\n const begin = (): void => {\n if (status !== 'idle' && status !== 'awaiting-consent') return;\n\n const who = resolveIdentity(local, session);\n identity = who;\n pageCount = who.pageCount;\n\n if (!isSampledIn(who.visitorId, options.sampleRate)) {\n // Decided from the visitor id, so this answer is stable across pages.\n status = 'sampled-out';\n return;\n }\n\n if (inCooldown(session)) {\n // The previous page was told this session may not be started. That answer\n // will not have changed a page load later.\n status = 'stopped';\n if (options.debug) console.warn('[anyreplay] not recording: ingest refused a new session recently');\n return;\n }\n\n const channel = new Transport(\n options,\n {\n projectKey: options.projectKey,\n sessionId: who.sessionId,\n visitorId: who.visitorId,\n initialSeq: who.nextSeq,\n },\n {\n onSent: () => noteDelivered(channel),\n onSeqReserved: (next) => {\n reserveSeq(session, next);\n try { shell?.onStateChanged?.(); } catch { /* the shell's problem, never the recording's */ }\n },\n onStopped: (reason) => {\n status = 'stopped';\n stopRecording?.();\n stopRecording = undefined;\n diagnostics?.stop();\n diagnostics = undefined;\n assets?.stop();\n assets = undefined;\n // Only the verdict about the session itself is remembered across pages.\n // A transport failure or an origin problem is either transient or one\n // request per page load to notice it is fixed; a full quota is neither.\n if (reason === 'rejected_402') startCooldown(session);\n if (options.debug) console.warn(`[anyreplay] recording stopped: ${reason}`);\n },\n onWarning: (message) => {\n if (options.debug) console.warn(`[anyreplay] ${message}`);\n },\n // Events were dropped (a long outage, or one too large to send), so\n // the DOM changes after the gap describe nodes ingest never got. A\n // fresh full snapshot starts the page over. Taken on the next turn,\n // not here: this can be called from inside rrweb's own emit, in the\n // middle of handing over a batch of mutations.\n onResyncNeeded: () => setTimeout(() => takeSnapshot(2), 0),\n },\n );\n transport = channel;\n status = 'recording';\n\n /** A checkout snapshot (Meta + FullSnapshot), retried briefly if rrweb is not emitting yet. */\n const takeSnapshot = (triesLeft: number): void => {\n if (status !== 'recording' || !stopRecording) return;\n try {\n record.takeFullSnapshot(true);\n } catch {\n if (triesLeft > 0) setTimeout(() => takeSnapshot(triesLeft - 1), 1000);\n }\n };\n // The page the recording starts on is where route changes are counted from.\n lastUrl = safeLocation();\n\n channel.setMeta(collectMeta(who));\n // The page the recorder starts on is a page view. Without this the\n // counter only ever reflects in-app navigations, so a single-page visit\n // reports zero pages — and on a resumed session it is the previous page's\n // count plus one, so the hop is visible.\n channel.mergeFlags({ pageCount });\n channel.start();\n\n /**\n * What this recording may contain.\n *\n * `maskAllTyping` is the stricter of the two options and wins: a page that\n * asked for everything typed to be hidden does not get form fields back\n * because `maskAllInputs: false` is also set. With neither on, values are\n * recorded and `masking.ts` applies the floor — the fields no option can\n * un-mask.\n */\n const prefix = options.assets === 'inline' ? localAssetPrefix() : null;\n if (prefix && typeof fetch === 'function') {\n assets = new AssetCollector({\n prefix,\n ingestUrl: options.ingestUrl,\n projectKey: options.projectKey,\n appId: options.appId,\n // Bound now, before the network diagnostics wrap `fetch`: reading the\n // app's own files is the recorder's business, not the app's traffic.\n fetch: fetch.bind(globalThis),\n emit: (payload) => emitCustom(ASSET_TAG, payload),\n debug: options.debug,\n });\n }\n\n const policy: MaskingPolicy = {\n maskEveryField: options.maskAllInputs || options.maskAllTyping,\n maskClass: options.maskClass,\n };\n\n stopRecording = record({\n emit: (event) => {\n const typed = event as unknown as RecordedEvent;\n // Started before the page finished loading, rrweb announces\n // DOMContentLoaded (0) and load (1) as events of their own. They carry\n // nothing a replay uses, and they would open the recording ahead of\n // its Meta (contract §5.1, SEQ-002).\n if (typed.type === RRWEB_DOM_CONTENT_LOADED || typed.type === RRWEB_LOAD) return;\n // Before anything else touches the event: rrweb's own masking is\n // all-or-nothing by input type, so the floor — payment fields, marked\n // fields, anything shaped like a card number — is applied here, to the\n // event, with the node resolved through rrweb's mirror.\n scrubEvent(typed, (id) => record.mirror.getNode(id) as never, policy);\n assets?.scan(typed);\n noteInteraction(typed, channel);\n touchSession(session, typed.timestamp);\n channel.push(typed);\n drainPending();\n },\n maskInputOptions: (policy.maskEveryField\n ? MASK_EVERY_FIELD\n : MASK_SENSITIVE_FIELDS) as NonNullable<Parameters<typeof record>[0]>['maskInputOptions'],\n maskTextClass: options.maskClass,\n maskTextSelector: options.maskAllTyping ? EDITABLE_SELECTOR : undefined,\n blockClass: options.blockClass,\n // Readable stylesheets go into the snapshot as text, in both asset\n // modes. rrweb's default, written out because 'inline' depends on it.\n inlineStylesheet: true,\n // Canvas capture is expensive and off unless a customer opts in later.\n recordCanvas: false,\n collectFonts: false,\n });\n // Every page begins with a full snapshot (rrweb takes one on start), so\n // events tracked before this point land right after it.\n drainPending();\n if (pendingTraits) {\n sendIdentity(who, pendingTraits);\n pendingTraits = undefined;\n }\n\n attachLifecycleHooks(channel);\n };\n\n const attachLifecycleHooks = (channel: Transport): void => {\n if (typeof window === 'undefined') return;\n\n // pagehide is the reliable end-of-page signal; unload does not fire on\n // mobile Safari and beforeunload breaks the back/forward cache.\n window.addEventListener('pagehide', () => { channel.flushWithBeacon(true); }, { capture: true });\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'hidden') channel.flushWithBeacon();\n // Back on screen: if deliveries were failing, try now rather than at\n // the end of a backoff that may have been running while it was hidden.\n else channel.resume();\n });\n // The connection is back. `online` can fire for a network that still\n // reaches nothing; then the attempt fails and backs off again.\n window.addEventListener('online', () => channel.resume());\n /*\n * Errors, console lines and request metadata.\n *\n * This replaces two bare listeners that set `hasError` and kept nothing\n * else, which is why a replay could say an error happened and never say\n * which. `hasError` is still set — by the first error or failed request\n * either stream sees, through `onError` — so the session list's filter and\n * its partial index are unchanged.\n *\n * Started here rather than in `begin()` so that nothing is patched before\n * consent: `attachLifecycleHooks` runs once recording has actually\n * started, and `stop()` puts every global back.\n */\n diagnostics = startDiagnostics({\n errors: options.recordErrors,\n console: options.recordConsole,\n network: options.recordNetwork,\n ingestUrl: options.ingestUrl,\n emit: emitCustom,\n onError: () => channel.mergeFlags({ hasError: true }),\n });\n\n // Wrapped after the original runs, so `location` already shows the new URL.\n const patch = (method: 'pushState' | 'replaceState'): void => {\n const original = history[method].bind(history);\n history[method] = function patched(...args: Parameters<History['pushState']>) {\n const result = original(...args);\n noteNavigation(channel);\n return result;\n };\n };\n patch('pushState');\n patch('replaceState');\n window.addEventListener('popstate', () => noteNavigation(channel));\n };\n\n if (options.requireConsent) {\n status = 'awaiting-consent';\n } else {\n begin();\n }\n\n return {\n status: () => status,\n sessionId: () => identity?.sessionId ?? null,\n consent: (granted) => {\n if (granted) {\n begin();\n return;\n }\n // A refusal stops this page's recording and undoes what an earlier\n // acceptance stored — on this page or on one last month. Stopping\n // first, so no flush reserves a chunk number after the keys are gone.\n transport?.stop('consent_withdrawn');\n // Nothing was recording yet (still asking, or asked and sampled out):\n // the refusal is an answer, not a `stop()`. The recorder goes back to\n // waiting, so a visitor who says no and then changes their mind on the\n // same page — the banner's settings link — is recorded from then on, as\n // a new visitor with a fresh sampling draw (contract §3.5). A recording\n // that had started stays stopped for the page (§3.6).\n if (status === 'idle' || status === 'awaiting-consent' || status === 'sampled-out') {\n status = 'awaiting-consent';\n identity = undefined;\n }\n pendingTraits = undefined;\n traitsAwaitingSession = undefined;\n traitsToRetry = undefined;\n // What was tracked while asking belongs to the answer that was refused.\n pending.length = 0;\n forgetVisitor(local, session);\n },\n identify: (traits) => {\n if (!traits.userId && !traits.email) return;\n if (identity && transport) {\n sendIdentity(identity, traits);\n return;\n }\n // No session yet. While consent is pending the traits wait; a visitor\n // who is sampled out or stopped has no session to attach them to.\n if (status === 'idle' || status === 'awaiting-consent') pendingTraits = traits;\n else if (options.debug) console.warn('[anyreplay] identify() ignored: not recording');\n },\n track: (name, properties) => {\n const payload = validateTrack(name, properties);\n if (typeof payload === 'string') {\n if (options.debug) console.warn(`[anyreplay] track() ignored: ${payload}`);\n return;\n }\n emitCustom(TRACK_TAG, payload);\n },\n trackError: (error) => {\n if (!options.recordErrors) return;\n // While recording, through diagnostics: it owns the ceiling and the flag.\n if (diagnostics) {\n diagnostics.error(error);\n return;\n }\n emitCustom(ERROR_TAG, errorPayload('error', error));\n // Recording without diagnostics (no window to patch): flag it here.\n if (status === 'recording') transport?.mergeFlags({ hasError: true });\n },\n stop: () => {\n transport?.stop('stopped_by_page');\n // Stopped before it ever started: a later consent(true) must not start\n // what the page has already said it does not want.\n if (status === 'idle' || status === 'awaiting-consent') status = 'stopped';\n pendingTraits = undefined;\n },\n // Asked for by the page, so it skips our own backoff (never a server's Retry-After).\n flush: () => transport?.flush(true) ?? Promise.resolve(),\n };\n}\n\nfunction safeLocation(): string | undefined {\n try {\n return typeof location !== 'undefined' ? location.href : undefined;\n } catch {\n return undefined;\n }\n}\n"],"mappings":"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","names":["NodeType","Mirror","chars","mirror","mirror","mirror","parentId","mirror","mirror","_a","mirror","WorkerFactory","decodeBase64","createBase64WorkerFactory","WorkerFactory","createBase64WorkerFactory","createBase64WorkerFactory","a","b","chars","end","patchedFetch","EVENT_FULL_SNAPSHOT","EVENT_INCREMENTAL","snapshot","_a","patch"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb-snapshot/es/rrweb-snapshot.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/utils.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/types/dist/types.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/mutation.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/observer.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/cross-origin-iframe-mirror.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/iframe-manager.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/shadow-dom-manager.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/ext/tslib/tslib.es6.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/ext/base64-arraybuffer/dist/base64-arraybuffer.es5.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/observers/canvas/serialize-args.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/observers/canvas/2d.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/observers/canvas/canvas.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/observers/canvas/webgl.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/_virtual/_rollup-plugin-web-worker-loader__helper__node__WorkerClass.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/_virtual/_rollup-plugin-web-worker-loader__helper__node__createBase64WorkerFactory.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/_virtual/_rollup-plugin-web-worker-loader__helper__browser__createBase64WorkerFactory.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/_virtual/_rollup-plugin-web-worker-loader__helper__auto__isNodeJS.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/_virtual/_rollup-plugin-web-worker-loader__helper__auto__createBase64WorkerFactory.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/_virtual/image-bitmap-data-url-worker.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/observers/canvas/canvas-manager.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/stylesheet-manager.js","../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/index.js","../src/assets.ts","../src/config.ts","../src/masking.ts","../src/diagnostics.ts","../src/events.ts","../src/sampling.ts","../src/transport.ts","../src/version.ts","../src/visitor.ts","../src/recorder.ts"],"sourcesContent":["export { createRecorder, type RecorderHandle, type RecorderStatus, type ShellInfo } from './recorder.js';\nexport {\n ASSET_TAG, ASSET_LIMITS, defaultAssetMode, localAssetPrefix,\n type AssetMode, type AssetPayload, type AssetLimits,\n} from './assets.js';\nexport { resolveOptions, ConfigError, DEFAULTS, type AnyReplayOptions, type ResolvedOptions } from './config.js';\nexport { isSampledIn, hashToUnitInterval } from './sampling.js';\nexport { Transport, type RecordedEvent, type SessionMeta } from './transport.js';\nexport { resolveIdentity, forgetVisitor, safeStorage, uuidv4 } from './visitor.js';\nexport { TRACK_TAG, NAVIGATE_TAG, EVENT_NAME_PATTERN, MAX_PROPERTIES_BYTES, validateTrack, type TrackPayload } from './events.js';\nexport {\n ERROR_TAG, CONSOLE_TAG, NETWORK_TAG, LIMITS, REDACTED, redactText, redactUrl,\n errorPayload, consolePayload, startDiagnostics,\n type ErrorPayload, type ConsolePayload, type NetworkPayload, type DiagnosticsHandle,\n} from './diagnostics.js';\nexport { SDK_NAME, SDK_VERSION } from './version.js';\n","var NodeType;\r\n(function (NodeType) {\r\n NodeType[NodeType[\"Document\"] = 0] = \"Document\";\r\n NodeType[NodeType[\"DocumentType\"] = 1] = \"DocumentType\";\r\n NodeType[NodeType[\"Element\"] = 2] = \"Element\";\r\n NodeType[NodeType[\"Text\"] = 3] = \"Text\";\r\n NodeType[NodeType[\"CDATA\"] = 4] = \"CDATA\";\r\n NodeType[NodeType[\"Comment\"] = 5] = \"Comment\";\r\n})(NodeType || (NodeType = {}));\n\nfunction isElement(n) {\r\n return n.nodeType === n.ELEMENT_NODE;\r\n}\r\nfunction isShadowRoot(n) {\r\n var host = n === null || n === void 0 ? void 0 : n.host;\r\n return Boolean((host === null || host === void 0 ? void 0 : host.shadowRoot) === n);\r\n}\r\nfunction isNativeShadowDom(shadowRoot) {\r\n return Object.prototype.toString.call(shadowRoot) === '[object ShadowRoot]';\r\n}\r\nfunction fixBrowserCompatibilityIssuesInCSS(cssText) {\r\n if (cssText.includes(' background-clip: text;') &&\r\n !cssText.includes(' -webkit-background-clip: text;')) {\r\n cssText = cssText.replace(' background-clip: text;', ' -webkit-background-clip: text; background-clip: text;');\r\n }\r\n return cssText;\r\n}\r\nfunction getCssRulesString(s) {\r\n try {\r\n var rules = s.rules || s.cssRules;\r\n return rules\r\n ? fixBrowserCompatibilityIssuesInCSS(Array.from(rules).map(getCssRuleString).join(''))\r\n : null;\r\n }\r\n catch (error) {\r\n return null;\r\n }\r\n}\r\nfunction getCssRuleString(rule) {\r\n var cssStringified = rule.cssText;\r\n if (isCSSImportRule(rule)) {\r\n try {\r\n cssStringified = getCssRulesString(rule.styleSheet) || cssStringified;\r\n }\r\n catch (_a) {\r\n }\r\n }\r\n return cssStringified;\r\n}\r\nfunction isCSSImportRule(rule) {\r\n return 'styleSheet' in rule;\r\n}\r\nvar Mirror = (function () {\r\n function Mirror() {\r\n this.idNodeMap = new Map();\r\n this.nodeMetaMap = new WeakMap();\r\n }\r\n Mirror.prototype.getId = function (n) {\r\n var _a;\r\n if (!n)\r\n return -1;\r\n var id = (_a = this.getMeta(n)) === null || _a === void 0 ? void 0 : _a.id;\r\n return id !== null && id !== void 0 ? id : -1;\r\n };\r\n Mirror.prototype.getNode = function (id) {\r\n return this.idNodeMap.get(id) || null;\r\n };\r\n Mirror.prototype.getIds = function () {\r\n return Array.from(this.idNodeMap.keys());\r\n };\r\n Mirror.prototype.getMeta = function (n) {\r\n return this.nodeMetaMap.get(n) || null;\r\n };\r\n Mirror.prototype.removeNodeFromMap = function (n) {\r\n var _this = this;\r\n var id = this.getId(n);\r\n this.idNodeMap[\"delete\"](id);\r\n if (n.childNodes) {\r\n n.childNodes.forEach(function (childNode) {\r\n return _this.removeNodeFromMap(childNode);\r\n });\r\n }\r\n };\r\n Mirror.prototype.has = function (id) {\r\n return this.idNodeMap.has(id);\r\n };\r\n Mirror.prototype.hasNode = function (node) {\r\n return this.nodeMetaMap.has(node);\r\n };\r\n Mirror.prototype.add = function (n, meta) {\r\n var id = meta.id;\r\n this.idNodeMap.set(id, n);\r\n this.nodeMetaMap.set(n, meta);\r\n };\r\n Mirror.prototype.replace = function (id, n) {\r\n var oldNode = this.getNode(id);\r\n if (oldNode) {\r\n var meta = this.nodeMetaMap.get(oldNode);\r\n if (meta)\r\n this.nodeMetaMap.set(n, meta);\r\n }\r\n this.idNodeMap.set(id, n);\r\n };\r\n Mirror.prototype.reset = function () {\r\n this.idNodeMap = new Map();\r\n this.nodeMetaMap = new WeakMap();\r\n };\r\n return Mirror;\r\n}());\r\nfunction createMirror() {\r\n return new Mirror();\r\n}\r\nfunction maskInputValue(_a) {\r\n var maskInputOptions = _a.maskInputOptions, tagName = _a.tagName, type = _a.type, value = _a.value, maskInputFn = _a.maskInputFn;\r\n var text = value || '';\r\n if (maskInputOptions[tagName.toLowerCase()] ||\r\n maskInputOptions[type]) {\r\n if (maskInputFn) {\r\n text = maskInputFn(text);\r\n }\r\n else {\r\n text = '*'.repeat(text.length);\r\n }\r\n }\r\n return text;\r\n}\r\nvar ORIGINAL_ATTRIBUTE_NAME = '__rrweb_original__';\r\nfunction is2DCanvasBlank(canvas) {\r\n var ctx = canvas.getContext('2d');\r\n if (!ctx)\r\n return true;\r\n var chunkSize = 50;\r\n for (var x = 0; x < canvas.width; x += chunkSize) {\r\n for (var y = 0; y < canvas.height; y += chunkSize) {\r\n var getImageData = ctx.getImageData;\r\n var originalGetImageData = ORIGINAL_ATTRIBUTE_NAME in getImageData\r\n ? getImageData[ORIGINAL_ATTRIBUTE_NAME]\r\n : getImageData;\r\n var pixelBuffer = new Uint32Array(originalGetImageData.call(ctx, x, y, Math.min(chunkSize, canvas.width - x), Math.min(chunkSize, canvas.height - y)).data.buffer);\r\n if (pixelBuffer.some(function (pixel) { return pixel !== 0; }))\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\n\nvar _id = 1;\r\nvar tagNameRegex = new RegExp('[^a-z0-9-_:]');\r\nvar IGNORED_NODE = -2;\r\nfunction genId() {\r\n return _id++;\r\n}\r\nfunction getValidTagName(element) {\r\n if (element instanceof HTMLFormElement) {\r\n return 'form';\r\n }\r\n var processedTagName = element.tagName.toLowerCase().trim();\r\n if (tagNameRegex.test(processedTagName)) {\r\n return 'div';\r\n }\r\n return processedTagName;\r\n}\r\nfunction stringifyStyleSheet(sheet) {\r\n return sheet.cssRules\r\n ? Array.from(sheet.cssRules)\r\n .map(function (rule) { return rule.cssText || ''; })\r\n .join('')\r\n : '';\r\n}\r\nfunction extractOrigin(url) {\r\n var origin = '';\r\n if (url.indexOf('//') > -1) {\r\n origin = url.split('/').slice(0, 3).join('/');\r\n }\r\n else {\r\n origin = url.split('/')[0];\r\n }\r\n origin = origin.split('?')[0];\r\n return origin;\r\n}\r\nvar canvasService;\r\nvar canvasCtx;\r\nvar URL_IN_CSS_REF = /url\\((?:(')([^']*)'|(\")(.*?)\"|([^)]*))\\)/gm;\r\nvar RELATIVE_PATH = /^(?!www\\.|(?:http|ftp)s?:\\/\\/|[A-Za-z]:\\\\|\\/\\/|#).*/;\r\nvar DATA_URI = /^(data:)([^,]*),(.*)/i;\r\nfunction absoluteToStylesheet(cssText, href) {\r\n return (cssText || '').replace(URL_IN_CSS_REF, function (origin, quote1, path1, quote2, path2, path3) {\r\n var filePath = path1 || path2 || path3;\r\n var maybeQuote = quote1 || quote2 || '';\r\n if (!filePath) {\r\n return origin;\r\n }\r\n if (!RELATIVE_PATH.test(filePath)) {\r\n return \"url(\".concat(maybeQuote).concat(filePath).concat(maybeQuote, \")\");\r\n }\r\n if (DATA_URI.test(filePath)) {\r\n return \"url(\".concat(maybeQuote).concat(filePath).concat(maybeQuote, \")\");\r\n }\r\n if (filePath[0] === '/') {\r\n return \"url(\".concat(maybeQuote).concat(extractOrigin(href) + filePath).concat(maybeQuote, \")\");\r\n }\r\n var stack = href.split('/');\r\n var parts = filePath.split('/');\r\n stack.pop();\r\n for (var _i = 0, parts_1 = parts; _i < parts_1.length; _i++) {\r\n var part = parts_1[_i];\r\n if (part === '.') {\r\n continue;\r\n }\r\n else if (part === '..') {\r\n stack.pop();\r\n }\r\n else {\r\n stack.push(part);\r\n }\r\n }\r\n return \"url(\".concat(maybeQuote).concat(stack.join('/')).concat(maybeQuote, \")\");\r\n });\r\n}\r\nvar SRCSET_NOT_SPACES = /^[^ \\t\\n\\r\\u000c]+/;\r\nvar SRCSET_COMMAS_OR_SPACES = /^[, \\t\\n\\r\\u000c]+/;\r\nfunction getAbsoluteSrcsetString(doc, attributeValue) {\r\n if (attributeValue.trim() === '') {\r\n return attributeValue;\r\n }\r\n var pos = 0;\r\n function collectCharacters(regEx) {\r\n var chars;\r\n var match = regEx.exec(attributeValue.substring(pos));\r\n if (match) {\r\n chars = match[0];\r\n pos += chars.length;\r\n return chars;\r\n }\r\n return '';\r\n }\r\n var output = [];\r\n while (true) {\r\n collectCharacters(SRCSET_COMMAS_OR_SPACES);\r\n if (pos >= attributeValue.length) {\r\n break;\r\n }\r\n var url = collectCharacters(SRCSET_NOT_SPACES);\r\n if (url.slice(-1) === ',') {\r\n url = absoluteToDoc(doc, url.substring(0, url.length - 1));\r\n output.push(url);\r\n }\r\n else {\r\n var descriptorsStr = '';\r\n url = absoluteToDoc(doc, url);\r\n var inParens = false;\r\n while (true) {\r\n var c = attributeValue.charAt(pos);\r\n if (c === '') {\r\n output.push((url + descriptorsStr).trim());\r\n break;\r\n }\r\n else if (!inParens) {\r\n if (c === ',') {\r\n pos += 1;\r\n output.push((url + descriptorsStr).trim());\r\n break;\r\n }\r\n else if (c === '(') {\r\n inParens = true;\r\n }\r\n }\r\n else {\r\n if (c === ')') {\r\n inParens = false;\r\n }\r\n }\r\n descriptorsStr += c;\r\n pos += 1;\r\n }\r\n }\r\n }\r\n return output.join(', ');\r\n}\r\nfunction absoluteToDoc(doc, attributeValue) {\r\n if (!attributeValue || attributeValue.trim() === '') {\r\n return attributeValue;\r\n }\r\n var a = doc.createElement('a');\r\n a.href = attributeValue;\r\n return a.href;\r\n}\r\nfunction isSVGElement(el) {\r\n return Boolean(el.tagName === 'svg' || el.ownerSVGElement);\r\n}\r\nfunction getHref() {\r\n var a = document.createElement('a');\r\n a.href = '';\r\n return a.href;\r\n}\r\nfunction transformAttribute(doc, tagName, name, value) {\r\n if (name === 'src' ||\r\n (name === 'href' && value && !(tagName === 'use' && value[0] === '#'))) {\r\n return absoluteToDoc(doc, value);\r\n }\r\n else if (name === 'xlink:href' && value && value[0] !== '#') {\r\n return absoluteToDoc(doc, value);\r\n }\r\n else if (name === 'background' &&\r\n value &&\r\n (tagName === 'table' || tagName === 'td' || tagName === 'th')) {\r\n return absoluteToDoc(doc, value);\r\n }\r\n else if (name === 'srcset' && value) {\r\n return getAbsoluteSrcsetString(doc, value);\r\n }\r\n else if (name === 'style' && value) {\r\n return absoluteToStylesheet(value, getHref());\r\n }\r\n else if (tagName === 'object' && name === 'data' && value) {\r\n return absoluteToDoc(doc, value);\r\n }\r\n else {\r\n return value;\r\n }\r\n}\r\nfunction _isBlockedElement(element, blockClass, blockSelector) {\r\n if (typeof blockClass === 'string') {\r\n if (element.classList.contains(blockClass)) {\r\n return true;\r\n }\r\n }\r\n else {\r\n for (var eIndex = element.classList.length; eIndex--;) {\r\n var className = element.classList[eIndex];\r\n if (blockClass.test(className)) {\r\n return true;\r\n }\r\n }\r\n }\r\n if (blockSelector) {\r\n return element.matches(blockSelector);\r\n }\r\n return false;\r\n}\r\nfunction classMatchesRegex(node, regex, checkAncestors) {\r\n if (!node)\r\n return false;\r\n if (node.nodeType !== node.ELEMENT_NODE) {\r\n if (!checkAncestors)\r\n return false;\r\n return classMatchesRegex(node.parentNode, regex, checkAncestors);\r\n }\r\n for (var eIndex = node.classList.length; eIndex--;) {\r\n var className = node.classList[eIndex];\r\n if (regex.test(className)) {\r\n return true;\r\n }\r\n }\r\n if (!checkAncestors)\r\n return false;\r\n return classMatchesRegex(node.parentNode, regex, checkAncestors);\r\n}\r\nfunction needMaskingText(node, maskTextClass, maskTextSelector) {\r\n var el = node.nodeType === node.ELEMENT_NODE\r\n ? node\r\n : node.parentElement;\r\n if (el === null)\r\n return false;\r\n if (typeof maskTextClass === 'string') {\r\n if (el.classList.contains(maskTextClass))\r\n return true;\r\n if (el.closest(\".\".concat(maskTextClass)))\r\n return true;\r\n }\r\n else {\r\n if (classMatchesRegex(el, maskTextClass, true))\r\n return true;\r\n }\r\n if (maskTextSelector) {\r\n if (el.matches(maskTextSelector))\r\n return true;\r\n if (el.closest(maskTextSelector))\r\n return true;\r\n }\r\n return false;\r\n}\r\nfunction onceIframeLoaded(iframeEl, listener, iframeLoadTimeout) {\r\n var win = iframeEl.contentWindow;\r\n if (!win) {\r\n return;\r\n }\r\n var fired = false;\r\n var readyState;\r\n try {\r\n readyState = win.document.readyState;\r\n }\r\n catch (error) {\r\n return;\r\n }\r\n if (readyState !== 'complete') {\r\n var timer_1 = setTimeout(function () {\r\n if (!fired) {\r\n listener();\r\n fired = true;\r\n }\r\n }, iframeLoadTimeout);\r\n iframeEl.addEventListener('load', function () {\r\n clearTimeout(timer_1);\r\n fired = true;\r\n listener();\r\n });\r\n return;\r\n }\r\n var blankUrl = 'about:blank';\r\n if (win.location.href !== blankUrl ||\r\n iframeEl.src === blankUrl ||\r\n iframeEl.src === '') {\r\n setTimeout(listener, 0);\r\n return iframeEl.addEventListener('load', listener);\r\n }\r\n iframeEl.addEventListener('load', listener);\r\n}\r\nfunction onceStylesheetLoaded(link, listener, styleSheetLoadTimeout) {\r\n var fired = false;\r\n var styleSheetLoaded;\r\n try {\r\n styleSheetLoaded = link.sheet;\r\n }\r\n catch (error) {\r\n return;\r\n }\r\n if (styleSheetLoaded)\r\n return;\r\n var timer = setTimeout(function () {\r\n if (!fired) {\r\n listener();\r\n fired = true;\r\n }\r\n }, styleSheetLoadTimeout);\r\n link.addEventListener('load', function () {\r\n clearTimeout(timer);\r\n fired = true;\r\n listener();\r\n });\r\n}\r\nfunction serializeNode(n, options) {\r\n var doc = options.doc, mirror = options.mirror, blockClass = options.blockClass, blockSelector = options.blockSelector, maskTextClass = options.maskTextClass, maskTextSelector = options.maskTextSelector, inlineStylesheet = options.inlineStylesheet, _a = options.maskInputOptions, maskInputOptions = _a === void 0 ? {} : _a, maskTextFn = options.maskTextFn, maskInputFn = options.maskInputFn, _b = options.dataURLOptions, dataURLOptions = _b === void 0 ? {} : _b, inlineImages = options.inlineImages, recordCanvas = options.recordCanvas, keepIframeSrcFn = options.keepIframeSrcFn, _c = options.newlyAddedElement, newlyAddedElement = _c === void 0 ? false : _c;\r\n var rootId = getRootId(doc, mirror);\r\n switch (n.nodeType) {\r\n case n.DOCUMENT_NODE:\r\n if (n.compatMode !== 'CSS1Compat') {\r\n return {\r\n type: NodeType.Document,\r\n childNodes: [],\r\n compatMode: n.compatMode\r\n };\r\n }\r\n else {\r\n return {\r\n type: NodeType.Document,\r\n childNodes: []\r\n };\r\n }\r\n case n.DOCUMENT_TYPE_NODE:\r\n return {\r\n type: NodeType.DocumentType,\r\n name: n.name,\r\n publicId: n.publicId,\r\n systemId: n.systemId,\r\n rootId: rootId\r\n };\r\n case n.ELEMENT_NODE:\r\n return serializeElementNode(n, {\r\n doc: doc,\r\n blockClass: blockClass,\r\n blockSelector: blockSelector,\r\n inlineStylesheet: inlineStylesheet,\r\n maskInputOptions: maskInputOptions,\r\n maskInputFn: maskInputFn,\r\n dataURLOptions: dataURLOptions,\r\n inlineImages: inlineImages,\r\n recordCanvas: recordCanvas,\r\n keepIframeSrcFn: keepIframeSrcFn,\r\n newlyAddedElement: newlyAddedElement,\r\n rootId: rootId\r\n });\r\n case n.TEXT_NODE:\r\n return serializeTextNode(n, {\r\n maskTextClass: maskTextClass,\r\n maskTextSelector: maskTextSelector,\r\n maskTextFn: maskTextFn,\r\n rootId: rootId\r\n });\r\n case n.CDATA_SECTION_NODE:\r\n return {\r\n type: NodeType.CDATA,\r\n textContent: '',\r\n rootId: rootId\r\n };\r\n case n.COMMENT_NODE:\r\n return {\r\n type: NodeType.Comment,\r\n textContent: n.textContent || '',\r\n rootId: rootId\r\n };\r\n default:\r\n return false;\r\n }\r\n}\r\nfunction getRootId(doc, mirror) {\r\n if (!mirror.hasNode(doc))\r\n return undefined;\r\n var docId = mirror.getId(doc);\r\n return docId === 1 ? undefined : docId;\r\n}\r\nfunction serializeTextNode(n, options) {\r\n var _a;\r\n var maskTextClass = options.maskTextClass, maskTextSelector = options.maskTextSelector, maskTextFn = options.maskTextFn, rootId = options.rootId;\r\n var parentTagName = n.parentNode && n.parentNode.tagName;\r\n var textContent = n.textContent;\r\n var isStyle = parentTagName === 'STYLE' ? true : undefined;\r\n var isScript = parentTagName === 'SCRIPT' ? true : undefined;\r\n if (isStyle && textContent) {\r\n try {\r\n if (n.nextSibling || n.previousSibling) {\r\n }\r\n else if ((_a = n.parentNode.sheet) === null || _a === void 0 ? void 0 : _a.cssRules) {\r\n textContent = stringifyStyleSheet(n.parentNode.sheet);\r\n }\r\n }\r\n catch (err) {\r\n console.warn(\"Cannot get CSS styles from text's parentNode. Error: \".concat(err), n);\r\n }\r\n textContent = absoluteToStylesheet(textContent, getHref());\r\n }\r\n if (isScript) {\r\n textContent = 'SCRIPT_PLACEHOLDER';\r\n }\r\n if (!isStyle &&\r\n !isScript &&\r\n textContent &&\r\n needMaskingText(n, maskTextClass, maskTextSelector)) {\r\n textContent = maskTextFn\r\n ? maskTextFn(textContent)\r\n : textContent.replace(/[\\S]/g, '*');\r\n }\r\n return {\r\n type: NodeType.Text,\r\n textContent: textContent || '',\r\n isStyle: isStyle,\r\n rootId: rootId\r\n };\r\n}\r\nfunction serializeElementNode(n, options) {\r\n var doc = options.doc, blockClass = options.blockClass, blockSelector = options.blockSelector, inlineStylesheet = options.inlineStylesheet, _a = options.maskInputOptions, maskInputOptions = _a === void 0 ? {} : _a, maskInputFn = options.maskInputFn, _b = options.dataURLOptions, dataURLOptions = _b === void 0 ? {} : _b, inlineImages = options.inlineImages, recordCanvas = options.recordCanvas, keepIframeSrcFn = options.keepIframeSrcFn, _c = options.newlyAddedElement, newlyAddedElement = _c === void 0 ? false : _c, rootId = options.rootId;\r\n var needBlock = _isBlockedElement(n, blockClass, blockSelector);\r\n var tagName = getValidTagName(n);\r\n var attributes = {};\r\n var len = n.attributes.length;\r\n for (var i = 0; i < len; i++) {\r\n var attr = n.attributes[i];\r\n attributes[attr.name] = transformAttribute(doc, tagName, attr.name, attr.value);\r\n }\r\n if (tagName === 'link' && inlineStylesheet) {\r\n var stylesheet = Array.from(doc.styleSheets).find(function (s) {\r\n return s.href === n.href;\r\n });\r\n var cssText = null;\r\n if (stylesheet) {\r\n cssText = getCssRulesString(stylesheet);\r\n }\r\n if (cssText) {\r\n delete attributes.rel;\r\n delete attributes.href;\r\n attributes._cssText = absoluteToStylesheet(cssText, stylesheet.href);\r\n }\r\n }\r\n if (tagName === 'style' &&\r\n n.sheet &&\r\n !(n.innerText || n.textContent || '').trim().length) {\r\n var cssText = getCssRulesString(n.sheet);\r\n if (cssText) {\r\n attributes._cssText = absoluteToStylesheet(cssText, getHref());\r\n }\r\n }\r\n if (tagName === 'input' || tagName === 'textarea' || tagName === 'select') {\r\n var value = n.value;\r\n var checked = n.checked;\r\n if (attributes.type !== 'radio' &&\r\n attributes.type !== 'checkbox' &&\r\n attributes.type !== 'submit' &&\r\n attributes.type !== 'button' &&\r\n value) {\r\n attributes.value = maskInputValue({\r\n type: attributes.type,\r\n tagName: tagName,\r\n value: value,\r\n maskInputOptions: maskInputOptions,\r\n maskInputFn: maskInputFn\r\n });\r\n }\r\n else if (checked) {\r\n attributes.checked = checked;\r\n }\r\n }\r\n if (tagName === 'option') {\r\n if (n.selected && !maskInputOptions['select']) {\r\n attributes.selected = true;\r\n }\r\n else {\r\n delete attributes.selected;\r\n }\r\n }\r\n if (tagName === 'canvas' && recordCanvas) {\r\n if (n.__context === '2d') {\r\n if (!is2DCanvasBlank(n)) {\r\n attributes.rr_dataURL = n.toDataURL(dataURLOptions.type, dataURLOptions.quality);\r\n }\r\n }\r\n else if (!('__context' in n)) {\r\n var canvasDataURL = n.toDataURL(dataURLOptions.type, dataURLOptions.quality);\r\n var blankCanvas = document.createElement('canvas');\r\n blankCanvas.width = n.width;\r\n blankCanvas.height = n.height;\r\n var blankCanvasDataURL = blankCanvas.toDataURL(dataURLOptions.type, dataURLOptions.quality);\r\n if (canvasDataURL !== blankCanvasDataURL) {\r\n attributes.rr_dataURL = canvasDataURL;\r\n }\r\n }\r\n }\r\n if (tagName === 'img' && inlineImages) {\r\n if (!canvasService) {\r\n canvasService = doc.createElement('canvas');\r\n canvasCtx = canvasService.getContext('2d');\r\n }\r\n var image_1 = n;\r\n var oldValue_1 = image_1.crossOrigin;\r\n image_1.crossOrigin = 'anonymous';\r\n var recordInlineImage = function () {\r\n try {\r\n canvasService.width = image_1.naturalWidth;\r\n canvasService.height = image_1.naturalHeight;\r\n canvasCtx.drawImage(image_1, 0, 0);\r\n attributes.rr_dataURL = canvasService.toDataURL(dataURLOptions.type, dataURLOptions.quality);\r\n }\r\n catch (err) {\r\n console.warn(\"Cannot inline img src=\".concat(image_1.currentSrc, \"! Error: \").concat(err));\r\n }\r\n oldValue_1\r\n ? (attributes.crossOrigin = oldValue_1)\r\n : image_1.removeAttribute('crossorigin');\r\n };\r\n if (image_1.complete && image_1.naturalWidth !== 0)\r\n recordInlineImage();\r\n else\r\n image_1.onload = recordInlineImage;\r\n }\r\n if (tagName === 'audio' || tagName === 'video') {\r\n attributes.rr_mediaState = n.paused\r\n ? 'paused'\r\n : 'played';\r\n attributes.rr_mediaCurrentTime = n.currentTime;\r\n }\r\n if (!newlyAddedElement) {\r\n if (n.scrollLeft) {\r\n attributes.rr_scrollLeft = n.scrollLeft;\r\n }\r\n if (n.scrollTop) {\r\n attributes.rr_scrollTop = n.scrollTop;\r\n }\r\n }\r\n if (needBlock) {\r\n var _d = n.getBoundingClientRect(), width = _d.width, height = _d.height;\r\n attributes = {\r\n \"class\": attributes[\"class\"],\r\n rr_width: \"\".concat(width, \"px\"),\r\n rr_height: \"\".concat(height, \"px\")\r\n };\r\n }\r\n if (tagName === 'iframe' && !keepIframeSrcFn(attributes.src)) {\r\n if (!n.contentDocument) {\r\n attributes.rr_src = attributes.src;\r\n }\r\n delete attributes.src;\r\n }\r\n return {\r\n type: NodeType.Element,\r\n tagName: tagName,\r\n attributes: attributes,\r\n childNodes: [],\r\n isSVG: isSVGElement(n) || undefined,\r\n needBlock: needBlock,\r\n rootId: rootId\r\n };\r\n}\r\nfunction lowerIfExists(maybeAttr) {\r\n if (maybeAttr === undefined) {\r\n return '';\r\n }\r\n else {\r\n return maybeAttr.toLowerCase();\r\n }\r\n}\r\nfunction slimDOMExcluded(sn, slimDOMOptions) {\r\n if (slimDOMOptions.comment && sn.type === NodeType.Comment) {\r\n return true;\r\n }\r\n else if (sn.type === NodeType.Element) {\r\n if (slimDOMOptions.script &&\r\n (sn.tagName === 'script' ||\r\n (sn.tagName === 'link' &&\r\n sn.attributes.rel === 'preload' &&\r\n sn.attributes.as === 'script') ||\r\n (sn.tagName === 'link' &&\r\n sn.attributes.rel === 'prefetch' &&\r\n typeof sn.attributes.href === 'string' &&\r\n sn.attributes.href.endsWith('.js')))) {\r\n return true;\r\n }\r\n else if (slimDOMOptions.headFavicon &&\r\n ((sn.tagName === 'link' && sn.attributes.rel === 'shortcut icon') ||\r\n (sn.tagName === 'meta' &&\r\n (lowerIfExists(sn.attributes.name).match(/^msapplication-tile(image|color)$/) ||\r\n lowerIfExists(sn.attributes.name) === 'application-name' ||\r\n lowerIfExists(sn.attributes.rel) === 'icon' ||\r\n lowerIfExists(sn.attributes.rel) === 'apple-touch-icon' ||\r\n lowerIfExists(sn.attributes.rel) === 'shortcut icon')))) {\r\n return true;\r\n }\r\n else if (sn.tagName === 'meta') {\r\n if (slimDOMOptions.headMetaDescKeywords &&\r\n lowerIfExists(sn.attributes.name).match(/^description|keywords$/)) {\r\n return true;\r\n }\r\n else if (slimDOMOptions.headMetaSocial &&\r\n (lowerIfExists(sn.attributes.property).match(/^(og|twitter|fb):/) ||\r\n lowerIfExists(sn.attributes.name).match(/^(og|twitter):/) ||\r\n lowerIfExists(sn.attributes.name) === 'pinterest')) {\r\n return true;\r\n }\r\n else if (slimDOMOptions.headMetaRobots &&\r\n (lowerIfExists(sn.attributes.name) === 'robots' ||\r\n lowerIfExists(sn.attributes.name) === 'googlebot' ||\r\n lowerIfExists(sn.attributes.name) === 'bingbot')) {\r\n return true;\r\n }\r\n else if (slimDOMOptions.headMetaHttpEquiv &&\r\n sn.attributes['http-equiv'] !== undefined) {\r\n return true;\r\n }\r\n else if (slimDOMOptions.headMetaAuthorship &&\r\n (lowerIfExists(sn.attributes.name) === 'author' ||\r\n lowerIfExists(sn.attributes.name) === 'generator' ||\r\n lowerIfExists(sn.attributes.name) === 'framework' ||\r\n lowerIfExists(sn.attributes.name) === 'publisher' ||\r\n lowerIfExists(sn.attributes.name) === 'progid' ||\r\n lowerIfExists(sn.attributes.property).match(/^article:/) ||\r\n lowerIfExists(sn.attributes.property).match(/^product:/))) {\r\n return true;\r\n }\r\n else if (slimDOMOptions.headMetaVerification &&\r\n (lowerIfExists(sn.attributes.name) === 'google-site-verification' ||\r\n lowerIfExists(sn.attributes.name) === 'yandex-verification' ||\r\n lowerIfExists(sn.attributes.name) === 'csrf-token' ||\r\n lowerIfExists(sn.attributes.name) === 'p:domain_verify' ||\r\n lowerIfExists(sn.attributes.name) === 'verify-v1' ||\r\n lowerIfExists(sn.attributes.name) === 'verification' ||\r\n lowerIfExists(sn.attributes.name) === 'shopify-checkout-api-token')) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\nfunction serializeNodeWithId(n, options) {\r\n var doc = options.doc, mirror = options.mirror, blockClass = options.blockClass, blockSelector = options.blockSelector, maskTextClass = options.maskTextClass, maskTextSelector = options.maskTextSelector, _a = options.skipChild, skipChild = _a === void 0 ? false : _a, _b = options.inlineStylesheet, inlineStylesheet = _b === void 0 ? true : _b, _c = options.maskInputOptions, maskInputOptions = _c === void 0 ? {} : _c, maskTextFn = options.maskTextFn, maskInputFn = options.maskInputFn, slimDOMOptions = options.slimDOMOptions, _d = options.dataURLOptions, dataURLOptions = _d === void 0 ? {} : _d, _e = options.inlineImages, inlineImages = _e === void 0 ? false : _e, _f = options.recordCanvas, recordCanvas = _f === void 0 ? false : _f, onSerialize = options.onSerialize, onIframeLoad = options.onIframeLoad, _g = options.iframeLoadTimeout, iframeLoadTimeout = _g === void 0 ? 5000 : _g, onStylesheetLoad = options.onStylesheetLoad, _h = options.stylesheetLoadTimeout, stylesheetLoadTimeout = _h === void 0 ? 5000 : _h, _j = options.keepIframeSrcFn, keepIframeSrcFn = _j === void 0 ? function () { return false; } : _j, _k = options.newlyAddedElement, newlyAddedElement = _k === void 0 ? false : _k;\r\n var _l = options.preserveWhiteSpace, preserveWhiteSpace = _l === void 0 ? true : _l;\r\n var _serializedNode = serializeNode(n, {\r\n doc: doc,\r\n mirror: mirror,\r\n blockClass: blockClass,\r\n blockSelector: blockSelector,\r\n maskTextClass: maskTextClass,\r\n maskTextSelector: maskTextSelector,\r\n inlineStylesheet: inlineStylesheet,\r\n maskInputOptions: maskInputOptions,\r\n maskTextFn: maskTextFn,\r\n maskInputFn: maskInputFn,\r\n dataURLOptions: dataURLOptions,\r\n inlineImages: inlineImages,\r\n recordCanvas: recordCanvas,\r\n keepIframeSrcFn: keepIframeSrcFn,\r\n newlyAddedElement: newlyAddedElement\r\n });\r\n if (!_serializedNode) {\r\n console.warn(n, 'not serialized');\r\n return null;\r\n }\r\n var id;\r\n if (mirror.hasNode(n)) {\r\n id = mirror.getId(n);\r\n }\r\n else if (slimDOMExcluded(_serializedNode, slimDOMOptions) ||\r\n (!preserveWhiteSpace &&\r\n _serializedNode.type === NodeType.Text &&\r\n !_serializedNode.isStyle &&\r\n !_serializedNode.textContent.replace(/^\\s+|\\s+$/gm, '').length)) {\r\n id = IGNORED_NODE;\r\n }\r\n else {\r\n id = genId();\r\n }\r\n var serializedNode = Object.assign(_serializedNode, { id: id });\r\n mirror.add(n, serializedNode);\r\n if (id === IGNORED_NODE) {\r\n return null;\r\n }\r\n if (onSerialize) {\r\n onSerialize(n);\r\n }\r\n var recordChild = !skipChild;\r\n if (serializedNode.type === NodeType.Element) {\r\n recordChild = recordChild && !serializedNode.needBlock;\r\n delete serializedNode.needBlock;\r\n var shadowRoot = n.shadowRoot;\r\n if (shadowRoot && isNativeShadowDom(shadowRoot))\r\n serializedNode.isShadowHost = true;\r\n }\r\n if ((serializedNode.type === NodeType.Document ||\r\n serializedNode.type === NodeType.Element) &&\r\n recordChild) {\r\n if (slimDOMOptions.headWhitespace &&\r\n serializedNode.type === NodeType.Element &&\r\n serializedNode.tagName === 'head') {\r\n preserveWhiteSpace = false;\r\n }\r\n var bypassOptions = {\r\n doc: doc,\r\n mirror: mirror,\r\n blockClass: blockClass,\r\n blockSelector: blockSelector,\r\n maskTextClass: maskTextClass,\r\n maskTextSelector: maskTextSelector,\r\n skipChild: skipChild,\r\n inlineStylesheet: inlineStylesheet,\r\n maskInputOptions: maskInputOptions,\r\n maskTextFn: maskTextFn,\r\n maskInputFn: maskInputFn,\r\n slimDOMOptions: slimDOMOptions,\r\n dataURLOptions: dataURLOptions,\r\n inlineImages: inlineImages,\r\n recordCanvas: recordCanvas,\r\n preserveWhiteSpace: preserveWhiteSpace,\r\n onSerialize: onSerialize,\r\n onIframeLoad: onIframeLoad,\r\n iframeLoadTimeout: iframeLoadTimeout,\r\n onStylesheetLoad: onStylesheetLoad,\r\n stylesheetLoadTimeout: stylesheetLoadTimeout,\r\n keepIframeSrcFn: keepIframeSrcFn\r\n };\r\n for (var _i = 0, _m = Array.from(n.childNodes); _i < _m.length; _i++) {\r\n var childN = _m[_i];\r\n var serializedChildNode = serializeNodeWithId(childN, bypassOptions);\r\n if (serializedChildNode) {\r\n serializedNode.childNodes.push(serializedChildNode);\r\n }\r\n }\r\n if (isElement(n) && n.shadowRoot) {\r\n for (var _o = 0, _p = Array.from(n.shadowRoot.childNodes); _o < _p.length; _o++) {\r\n var childN = _p[_o];\r\n var serializedChildNode = serializeNodeWithId(childN, bypassOptions);\r\n if (serializedChildNode) {\r\n isNativeShadowDom(n.shadowRoot) &&\r\n (serializedChildNode.isShadow = true);\r\n serializedNode.childNodes.push(serializedChildNode);\r\n }\r\n }\r\n }\r\n }\r\n if (n.parentNode &&\r\n isShadowRoot(n.parentNode) &&\r\n isNativeShadowDom(n.parentNode)) {\r\n serializedNode.isShadow = true;\r\n }\r\n if (serializedNode.type === NodeType.Element &&\r\n serializedNode.tagName === 'iframe') {\r\n onceIframeLoaded(n, function () {\r\n var iframeDoc = n.contentDocument;\r\n if (iframeDoc && onIframeLoad) {\r\n var serializedIframeNode = serializeNodeWithId(iframeDoc, {\r\n doc: iframeDoc,\r\n mirror: mirror,\r\n blockClass: blockClass,\r\n blockSelector: blockSelector,\r\n maskTextClass: maskTextClass,\r\n maskTextSelector: maskTextSelector,\r\n skipChild: false,\r\n inlineStylesheet: inlineStylesheet,\r\n maskInputOptions: maskInputOptions,\r\n maskTextFn: maskTextFn,\r\n maskInputFn: maskInputFn,\r\n slimDOMOptions: slimDOMOptions,\r\n dataURLOptions: dataURLOptions,\r\n inlineImages: inlineImages,\r\n recordCanvas: recordCanvas,\r\n preserveWhiteSpace: preserveWhiteSpace,\r\n onSerialize: onSerialize,\r\n onIframeLoad: onIframeLoad,\r\n iframeLoadTimeout: iframeLoadTimeout,\r\n onStylesheetLoad: onStylesheetLoad,\r\n stylesheetLoadTimeout: stylesheetLoadTimeout,\r\n keepIframeSrcFn: keepIframeSrcFn\r\n });\r\n if (serializedIframeNode) {\r\n onIframeLoad(n, serializedIframeNode);\r\n }\r\n }\r\n }, iframeLoadTimeout);\r\n }\r\n if (serializedNode.type === NodeType.Element &&\r\n serializedNode.tagName === 'link' &&\r\n serializedNode.attributes.rel === 'stylesheet') {\r\n onceStylesheetLoaded(n, function () {\r\n if (onStylesheetLoad) {\r\n var serializedLinkNode = serializeNodeWithId(n, {\r\n doc: doc,\r\n mirror: mirror,\r\n blockClass: blockClass,\r\n blockSelector: blockSelector,\r\n maskTextClass: maskTextClass,\r\n maskTextSelector: maskTextSelector,\r\n skipChild: false,\r\n inlineStylesheet: inlineStylesheet,\r\n maskInputOptions: maskInputOptions,\r\n maskTextFn: maskTextFn,\r\n maskInputFn: maskInputFn,\r\n slimDOMOptions: slimDOMOptions,\r\n dataURLOptions: dataURLOptions,\r\n inlineImages: inlineImages,\r\n recordCanvas: recordCanvas,\r\n preserveWhiteSpace: preserveWhiteSpace,\r\n onSerialize: onSerialize,\r\n onIframeLoad: onIframeLoad,\r\n iframeLoadTimeout: iframeLoadTimeout,\r\n onStylesheetLoad: onStylesheetLoad,\r\n stylesheetLoadTimeout: stylesheetLoadTimeout,\r\n keepIframeSrcFn: keepIframeSrcFn\r\n });\r\n if (serializedLinkNode) {\r\n onStylesheetLoad(n, serializedLinkNode);\r\n }\r\n }\r\n }, stylesheetLoadTimeout);\r\n }\r\n return serializedNode;\r\n}\r\nfunction snapshot(n, options) {\r\n var _a = options || {}, _b = _a.mirror, mirror = _b === void 0 ? new Mirror() : _b, _c = _a.blockClass, blockClass = _c === void 0 ? 'rr-block' : _c, _d = _a.blockSelector, blockSelector = _d === void 0 ? null : _d, _e = _a.maskTextClass, maskTextClass = _e === void 0 ? 'rr-mask' : _e, _f = _a.maskTextSelector, maskTextSelector = _f === void 0 ? null : _f, _g = _a.inlineStylesheet, inlineStylesheet = _g === void 0 ? true : _g, _h = _a.inlineImages, inlineImages = _h === void 0 ? false : _h, _j = _a.recordCanvas, recordCanvas = _j === void 0 ? false : _j, _k = _a.maskAllInputs, maskAllInputs = _k === void 0 ? false : _k, maskTextFn = _a.maskTextFn, maskInputFn = _a.maskInputFn, _l = _a.slimDOM, slimDOM = _l === void 0 ? false : _l, dataURLOptions = _a.dataURLOptions, preserveWhiteSpace = _a.preserveWhiteSpace, onSerialize = _a.onSerialize, onIframeLoad = _a.onIframeLoad, iframeLoadTimeout = _a.iframeLoadTimeout, onStylesheetLoad = _a.onStylesheetLoad, stylesheetLoadTimeout = _a.stylesheetLoadTimeout, _m = _a.keepIframeSrcFn, keepIframeSrcFn = _m === void 0 ? function () { return false; } : _m;\r\n var maskInputOptions = maskAllInputs === true\r\n ? {\r\n color: true,\r\n date: true,\r\n 'datetime-local': true,\r\n email: true,\r\n month: true,\r\n number: true,\r\n range: true,\r\n search: true,\r\n tel: true,\r\n text: true,\r\n time: true,\r\n url: true,\r\n week: true,\r\n textarea: true,\r\n select: true,\r\n password: true\r\n }\r\n : maskAllInputs === false\r\n ? {\r\n password: true\r\n }\r\n : maskAllInputs;\r\n var slimDOMOptions = slimDOM === true || slimDOM === 'all'\r\n ?\r\n {\r\n script: true,\r\n comment: true,\r\n headFavicon: true,\r\n headWhitespace: true,\r\n headMetaDescKeywords: slimDOM === 'all',\r\n headMetaSocial: true,\r\n headMetaRobots: true,\r\n headMetaHttpEquiv: true,\r\n headMetaAuthorship: true,\r\n headMetaVerification: true\r\n }\r\n : slimDOM === false\r\n ? {}\r\n : slimDOM;\r\n return serializeNodeWithId(n, {\r\n doc: n,\r\n mirror: mirror,\r\n blockClass: blockClass,\r\n blockSelector: blockSelector,\r\n maskTextClass: maskTextClass,\r\n maskTextSelector: maskTextSelector,\r\n skipChild: false,\r\n inlineStylesheet: inlineStylesheet,\r\n maskInputOptions: maskInputOptions,\r\n maskTextFn: maskTextFn,\r\n maskInputFn: maskInputFn,\r\n slimDOMOptions: slimDOMOptions,\r\n dataURLOptions: dataURLOptions,\r\n inlineImages: inlineImages,\r\n recordCanvas: recordCanvas,\r\n preserveWhiteSpace: preserveWhiteSpace,\r\n onSerialize: onSerialize,\r\n onIframeLoad: onIframeLoad,\r\n iframeLoadTimeout: iframeLoadTimeout,\r\n onStylesheetLoad: onStylesheetLoad,\r\n stylesheetLoadTimeout: stylesheetLoadTimeout,\r\n keepIframeSrcFn: keepIframeSrcFn,\r\n newlyAddedElement: false\r\n });\r\n}\r\n\nvar commentre = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//g;\r\nfunction parse(css, options) {\r\n if (options === void 0) { options = {}; }\r\n var lineno = 1;\r\n var column = 1;\r\n function updatePosition(str) {\r\n var lines = str.match(/\\n/g);\r\n if (lines) {\r\n lineno += lines.length;\r\n }\r\n var i = str.lastIndexOf('\\n');\r\n column = i === -1 ? column + str.length : str.length - i;\r\n }\r\n function position() {\r\n var start = { line: lineno, column: column };\r\n return function (node) {\r\n node.position = new Position(start);\r\n whitespace();\r\n return node;\r\n };\r\n }\r\n var Position = (function () {\r\n function Position(start) {\r\n this.start = start;\r\n this.end = { line: lineno, column: column };\r\n this.source = options.source;\r\n }\r\n return Position;\r\n }());\r\n Position.prototype.content = css;\r\n var errorsList = [];\r\n function error(msg) {\r\n var err = new Error(\"\".concat(options.source || '', \":\").concat(lineno, \":\").concat(column, \": \").concat(msg));\r\n err.reason = msg;\r\n err.filename = options.source;\r\n err.line = lineno;\r\n err.column = column;\r\n err.source = css;\r\n if (options.silent) {\r\n errorsList.push(err);\r\n }\r\n else {\r\n throw err;\r\n }\r\n }\r\n function stylesheet() {\r\n var rulesList = rules();\r\n return {\r\n type: 'stylesheet',\r\n stylesheet: {\r\n source: options.source,\r\n rules: rulesList,\r\n parsingErrors: errorsList\r\n }\r\n };\r\n }\r\n function open() {\r\n return match(/^{\\s*/);\r\n }\r\n function close() {\r\n return match(/^}/);\r\n }\r\n function rules() {\r\n var node;\r\n var rules = [];\r\n whitespace();\r\n comments(rules);\r\n while (css.length && css.charAt(0) !== '}' && (node = atrule() || rule())) {\r\n if (node !== false) {\r\n rules.push(node);\r\n comments(rules);\r\n }\r\n }\r\n return rules;\r\n }\r\n function match(re) {\r\n var m = re.exec(css);\r\n if (!m) {\r\n return;\r\n }\r\n var str = m[0];\r\n updatePosition(str);\r\n css = css.slice(str.length);\r\n return m;\r\n }\r\n function whitespace() {\r\n match(/^\\s*/);\r\n }\r\n function comments(rules) {\r\n if (rules === void 0) { rules = []; }\r\n var c;\r\n while ((c = comment())) {\r\n if (c !== false) {\r\n rules.push(c);\r\n }\r\n c = comment();\r\n }\r\n return rules;\r\n }\r\n function comment() {\r\n var pos = position();\r\n if ('/' !== css.charAt(0) || '*' !== css.charAt(1)) {\r\n return;\r\n }\r\n var i = 2;\r\n while ('' !== css.charAt(i) &&\r\n ('*' !== css.charAt(i) || '/' !== css.charAt(i + 1))) {\r\n ++i;\r\n }\r\n i += 2;\r\n if ('' === css.charAt(i - 1)) {\r\n return error('End of comment missing');\r\n }\r\n var str = css.slice(2, i - 2);\r\n column += 2;\r\n updatePosition(str);\r\n css = css.slice(i);\r\n column += 2;\r\n return pos({\r\n type: 'comment',\r\n comment: str\r\n });\r\n }\r\n function selector() {\r\n var m = match(/^([^{]+)/);\r\n if (!m) {\r\n return;\r\n }\r\n return trim(m[0])\r\n .replace(/\\/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*\\/+/g, '')\r\n .replace(/\"(?:\\\\\"|[^\"])*\"|'(?:\\\\'|[^'])*'/g, function (m) {\r\n return m.replace(/,/g, '\\u200C');\r\n })\r\n .split(/\\s*(?![^(]*\\)),\\s*/)\r\n .map(function (s) {\r\n return s.replace(/\\u200C/g, ',');\r\n });\r\n }\r\n function declaration() {\r\n var pos = position();\r\n var propMatch = match(/^(\\*?[-#\\/\\*\\\\\\w]+(\\[[0-9a-z_-]+\\])?)\\s*/);\r\n if (!propMatch) {\r\n return;\r\n }\r\n var prop = trim(propMatch[0]);\r\n if (!match(/^:\\s*/)) {\r\n return error(\"property missing ':'\");\r\n }\r\n var val = match(/^((?:'(?:\\\\'|.)*?'|\"(?:\\\\\"|.)*?\"|\\([^\\)]*?\\)|[^};])+)/);\r\n var ret = pos({\r\n type: 'declaration',\r\n property: prop.replace(commentre, ''),\r\n value: val ? trim(val[0]).replace(commentre, '') : ''\r\n });\r\n match(/^[;\\s]*/);\r\n return ret;\r\n }\r\n function declarations() {\r\n var decls = [];\r\n if (!open()) {\r\n return error(\"missing '{'\");\r\n }\r\n comments(decls);\r\n var decl;\r\n while ((decl = declaration())) {\r\n if (decl !== false) {\r\n decls.push(decl);\r\n comments(decls);\r\n }\r\n decl = declaration();\r\n }\r\n if (!close()) {\r\n return error(\"missing '}'\");\r\n }\r\n return decls;\r\n }\r\n function keyframe() {\r\n var m;\r\n var vals = [];\r\n var pos = position();\r\n while ((m = match(/^((\\d+\\.\\d+|\\.\\d+|\\d+)%?|[a-z]+)\\s*/))) {\r\n vals.push(m[1]);\r\n match(/^,\\s*/);\r\n }\r\n if (!vals.length) {\r\n return;\r\n }\r\n return pos({\r\n type: 'keyframe',\r\n values: vals,\r\n declarations: declarations()\r\n });\r\n }\r\n function atkeyframes() {\r\n var pos = position();\r\n var m = match(/^@([-\\w]+)?keyframes\\s*/);\r\n if (!m) {\r\n return;\r\n }\r\n var vendor = m[1];\r\n m = match(/^([-\\w]+)\\s*/);\r\n if (!m) {\r\n return error('@keyframes missing name');\r\n }\r\n var name = m[1];\r\n if (!open()) {\r\n return error(\"@keyframes missing '{'\");\r\n }\r\n var frame;\r\n var frames = comments();\r\n while ((frame = keyframe())) {\r\n frames.push(frame);\r\n frames = frames.concat(comments());\r\n }\r\n if (!close()) {\r\n return error(\"@keyframes missing '}'\");\r\n }\r\n return pos({\r\n type: 'keyframes',\r\n name: name,\r\n vendor: vendor,\r\n keyframes: frames\r\n });\r\n }\r\n function atsupports() {\r\n var pos = position();\r\n var m = match(/^@supports *([^{]+)/);\r\n if (!m) {\r\n return;\r\n }\r\n var supports = trim(m[1]);\r\n if (!open()) {\r\n return error(\"@supports missing '{'\");\r\n }\r\n var style = comments().concat(rules());\r\n if (!close()) {\r\n return error(\"@supports missing '}'\");\r\n }\r\n return pos({\r\n type: 'supports',\r\n supports: supports,\r\n rules: style\r\n });\r\n }\r\n function athost() {\r\n var pos = position();\r\n var m = match(/^@host\\s*/);\r\n if (!m) {\r\n return;\r\n }\r\n if (!open()) {\r\n return error(\"@host missing '{'\");\r\n }\r\n var style = comments().concat(rules());\r\n if (!close()) {\r\n return error(\"@host missing '}'\");\r\n }\r\n return pos({\r\n type: 'host',\r\n rules: style\r\n });\r\n }\r\n function atmedia() {\r\n var pos = position();\r\n var m = match(/^@media *([^{]+)/);\r\n if (!m) {\r\n return;\r\n }\r\n var media = trim(m[1]);\r\n if (!open()) {\r\n return error(\"@media missing '{'\");\r\n }\r\n var style = comments().concat(rules());\r\n if (!close()) {\r\n return error(\"@media missing '}'\");\r\n }\r\n return pos({\r\n type: 'media',\r\n media: media,\r\n rules: style\r\n });\r\n }\r\n function atcustommedia() {\r\n var pos = position();\r\n var m = match(/^@custom-media\\s+(--[^\\s]+)\\s*([^{;]+);/);\r\n if (!m) {\r\n return;\r\n }\r\n return pos({\r\n type: 'custom-media',\r\n name: trim(m[1]),\r\n media: trim(m[2])\r\n });\r\n }\r\n function atpage() {\r\n var pos = position();\r\n var m = match(/^@page */);\r\n if (!m) {\r\n return;\r\n }\r\n var sel = selector() || [];\r\n if (!open()) {\r\n return error(\"@page missing '{'\");\r\n }\r\n var decls = comments();\r\n var decl;\r\n while ((decl = declaration())) {\r\n decls.push(decl);\r\n decls = decls.concat(comments());\r\n }\r\n if (!close()) {\r\n return error(\"@page missing '}'\");\r\n }\r\n return pos({\r\n type: 'page',\r\n selectors: sel,\r\n declarations: decls\r\n });\r\n }\r\n function atdocument() {\r\n var pos = position();\r\n var m = match(/^@([-\\w]+)?document *([^{]+)/);\r\n if (!m) {\r\n return;\r\n }\r\n var vendor = trim(m[1]);\r\n var doc = trim(m[2]);\r\n if (!open()) {\r\n return error(\"@document missing '{'\");\r\n }\r\n var style = comments().concat(rules());\r\n if (!close()) {\r\n return error(\"@document missing '}'\");\r\n }\r\n return pos({\r\n type: 'document',\r\n document: doc,\r\n vendor: vendor,\r\n rules: style\r\n });\r\n }\r\n function atfontface() {\r\n var pos = position();\r\n var m = match(/^@font-face\\s*/);\r\n if (!m) {\r\n return;\r\n }\r\n if (!open()) {\r\n return error(\"@font-face missing '{'\");\r\n }\r\n var decls = comments();\r\n var decl;\r\n while ((decl = declaration())) {\r\n decls.push(decl);\r\n decls = decls.concat(comments());\r\n }\r\n if (!close()) {\r\n return error(\"@font-face missing '}'\");\r\n }\r\n return pos({\r\n type: 'font-face',\r\n declarations: decls\r\n });\r\n }\r\n var atimport = _compileAtrule('import');\r\n var atcharset = _compileAtrule('charset');\r\n var atnamespace = _compileAtrule('namespace');\r\n function _compileAtrule(name) {\r\n var re = new RegExp('^@' + name + '\\\\s*([^;]+);');\r\n return function () {\r\n var pos = position();\r\n var m = match(re);\r\n if (!m) {\r\n return;\r\n }\r\n var ret = { type: name };\r\n ret[name] = m[1].trim();\r\n return pos(ret);\r\n };\r\n }\r\n function atrule() {\r\n if (css[0] !== '@') {\r\n return;\r\n }\r\n return (atkeyframes() ||\r\n atmedia() ||\r\n atcustommedia() ||\r\n atsupports() ||\r\n atimport() ||\r\n atcharset() ||\r\n atnamespace() ||\r\n atdocument() ||\r\n atpage() ||\r\n athost() ||\r\n atfontface());\r\n }\r\n function rule() {\r\n var pos = position();\r\n var sel = selector();\r\n if (!sel) {\r\n return error('selector missing');\r\n }\r\n comments();\r\n return pos({\r\n type: 'rule',\r\n selectors: sel,\r\n declarations: declarations()\r\n });\r\n }\r\n return addParent(stylesheet());\r\n}\r\nfunction trim(str) {\r\n return str ? str.replace(/^\\s+|\\s+$/g, '') : '';\r\n}\r\nfunction addParent(obj, parent) {\r\n var isNode = obj && typeof obj.type === 'string';\r\n var childParent = isNode ? obj : parent;\r\n for (var _i = 0, _a = Object.keys(obj); _i < _a.length; _i++) {\r\n var k = _a[_i];\r\n var value = obj[k];\r\n if (Array.isArray(value)) {\r\n value.forEach(function (v) {\r\n addParent(v, childParent);\r\n });\r\n }\r\n else if (value && typeof value === 'object') {\r\n addParent(value, childParent);\r\n }\r\n }\r\n if (isNode) {\r\n Object.defineProperty(obj, 'parent', {\r\n configurable: true,\r\n writable: true,\r\n enumerable: false,\r\n value: parent || null\r\n });\r\n }\r\n return obj;\r\n}\n\nvar tagMap = {\r\n script: 'noscript',\r\n altglyph: 'altGlyph',\r\n altglyphdef: 'altGlyphDef',\r\n altglyphitem: 'altGlyphItem',\r\n animatecolor: 'animateColor',\r\n animatemotion: 'animateMotion',\r\n animatetransform: 'animateTransform',\r\n clippath: 'clipPath',\r\n feblend: 'feBlend',\r\n fecolormatrix: 'feColorMatrix',\r\n fecomponenttransfer: 'feComponentTransfer',\r\n fecomposite: 'feComposite',\r\n feconvolvematrix: 'feConvolveMatrix',\r\n fediffuselighting: 'feDiffuseLighting',\r\n fedisplacementmap: 'feDisplacementMap',\r\n fedistantlight: 'feDistantLight',\r\n fedropshadow: 'feDropShadow',\r\n feflood: 'feFlood',\r\n fefunca: 'feFuncA',\r\n fefuncb: 'feFuncB',\r\n fefuncg: 'feFuncG',\r\n fefuncr: 'feFuncR',\r\n fegaussianblur: 'feGaussianBlur',\r\n feimage: 'feImage',\r\n femerge: 'feMerge',\r\n femergenode: 'feMergeNode',\r\n femorphology: 'feMorphology',\r\n feoffset: 'feOffset',\r\n fepointlight: 'fePointLight',\r\n fespecularlighting: 'feSpecularLighting',\r\n fespotlight: 'feSpotLight',\r\n fetile: 'feTile',\r\n feturbulence: 'feTurbulence',\r\n foreignobject: 'foreignObject',\r\n glyphref: 'glyphRef',\r\n lineargradient: 'linearGradient',\r\n radialgradient: 'radialGradient'\r\n};\r\nfunction getTagName(n) {\r\n var tagName = tagMap[n.tagName] ? tagMap[n.tagName] : n.tagName;\r\n if (tagName === 'link' && n.attributes._cssText) {\r\n tagName = 'style';\r\n }\r\n return tagName;\r\n}\r\nfunction escapeRegExp(str) {\r\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n}\r\nvar HOVER_SELECTOR = /([^\\\\]):hover/;\r\nvar HOVER_SELECTOR_GLOBAL = new RegExp(HOVER_SELECTOR.source, 'g');\r\nfunction addHoverClass(cssText, cache) {\r\n var cachedStyle = cache === null || cache === void 0 ? void 0 : cache.stylesWithHoverClass.get(cssText);\r\n if (cachedStyle)\r\n return cachedStyle;\r\n var ast = parse(cssText, {\r\n silent: true\r\n });\r\n if (!ast.stylesheet) {\r\n return cssText;\r\n }\r\n var selectors = [];\r\n ast.stylesheet.rules.forEach(function (rule) {\r\n if ('selectors' in rule) {\r\n (rule.selectors || []).forEach(function (selector) {\r\n if (HOVER_SELECTOR.test(selector)) {\r\n selectors.push(selector);\r\n }\r\n });\r\n }\r\n });\r\n if (selectors.length === 0) {\r\n return cssText;\r\n }\r\n var selectorMatcher = new RegExp(selectors\r\n .filter(function (selector, index) { return selectors.indexOf(selector) === index; })\r\n .sort(function (a, b) { return b.length - a.length; })\r\n .map(function (selector) {\r\n return escapeRegExp(selector);\r\n })\r\n .join('|'), 'g');\r\n var result = cssText.replace(selectorMatcher, function (selector) {\r\n var newSelector = selector.replace(HOVER_SELECTOR_GLOBAL, '$1.\\\\:hover');\r\n return \"\".concat(selector, \", \").concat(newSelector);\r\n });\r\n cache === null || cache === void 0 ? void 0 : cache.stylesWithHoverClass.set(cssText, result);\r\n return result;\r\n}\r\nfunction createCache() {\r\n var stylesWithHoverClass = new Map();\r\n return {\r\n stylesWithHoverClass: stylesWithHoverClass\r\n };\r\n}\r\nfunction buildNode(n, options) {\r\n var doc = options.doc, hackCss = options.hackCss, cache = options.cache;\r\n switch (n.type) {\r\n case NodeType.Document:\r\n return doc.implementation.createDocument(null, '', null);\r\n case NodeType.DocumentType:\r\n return doc.implementation.createDocumentType(n.name || 'html', n.publicId, n.systemId);\r\n case NodeType.Element: {\r\n var tagName = getTagName(n);\r\n var node_1;\r\n if (n.isSVG) {\r\n node_1 = doc.createElementNS('http://www.w3.org/2000/svg', tagName);\r\n }\r\n else {\r\n node_1 = doc.createElement(tagName);\r\n }\r\n var specialAttributes = {};\r\n for (var name_1 in n.attributes) {\r\n if (!Object.prototype.hasOwnProperty.call(n.attributes, name_1)) {\r\n continue;\r\n }\r\n var value = n.attributes[name_1];\r\n if (tagName === 'option' &&\r\n name_1 === 'selected' &&\r\n value === false) {\r\n continue;\r\n }\r\n if (value === true)\r\n value = '';\r\n if (name_1.startsWith('rr_')) {\r\n specialAttributes[name_1] = value;\r\n continue;\r\n }\r\n var isTextarea = tagName === 'textarea' && name_1 === 'value';\r\n var isRemoteOrDynamicCss = tagName === 'style' && name_1 === '_cssText';\r\n if (isRemoteOrDynamicCss && hackCss && typeof value === 'string') {\r\n value = addHoverClass(value, cache);\r\n }\r\n if ((isTextarea || isRemoteOrDynamicCss) && typeof value === 'string') {\r\n var child = doc.createTextNode(value);\r\n for (var _i = 0, _a = Array.from(node_1.childNodes); _i < _a.length; _i++) {\r\n var c = _a[_i];\r\n if (c.nodeType === node_1.TEXT_NODE) {\r\n node_1.removeChild(c);\r\n }\r\n }\r\n node_1.appendChild(child);\r\n continue;\r\n }\r\n try {\r\n if (n.isSVG && name_1 === 'xlink:href') {\r\n node_1.setAttributeNS('http://www.w3.org/1999/xlink', name_1, value.toString());\r\n }\r\n else if (name_1 === 'onload' ||\r\n name_1 === 'onclick' ||\r\n name_1.substring(0, 7) === 'onmouse') {\r\n node_1.setAttribute('_' + name_1, value.toString());\r\n }\r\n else if (tagName === 'meta' &&\r\n n.attributes['http-equiv'] === 'Content-Security-Policy' &&\r\n name_1 === 'content') {\r\n node_1.setAttribute('csp-content', value.toString());\r\n continue;\r\n }\r\n else if (tagName === 'link' &&\r\n n.attributes.rel === 'preload' &&\r\n n.attributes.as === 'script') {\r\n }\r\n else if (tagName === 'link' &&\r\n n.attributes.rel === 'prefetch' &&\r\n typeof n.attributes.href === 'string' &&\r\n n.attributes.href.endsWith('.js')) {\r\n }\r\n else if (tagName === 'img' &&\r\n n.attributes.srcset &&\r\n n.attributes.rr_dataURL) {\r\n node_1.setAttribute('rrweb-original-srcset', n.attributes.srcset);\r\n }\r\n else {\r\n node_1.setAttribute(name_1, value.toString());\r\n }\r\n }\r\n catch (error) {\r\n }\r\n }\r\n var _loop_1 = function (name_2) {\r\n var value = specialAttributes[name_2];\r\n if (tagName === 'canvas' && name_2 === 'rr_dataURL') {\r\n var image_1 = document.createElement('img');\r\n image_1.onload = function () {\r\n var ctx = node_1.getContext('2d');\r\n if (ctx) {\r\n ctx.drawImage(image_1, 0, 0, image_1.width, image_1.height);\r\n }\r\n };\r\n image_1.src = value.toString();\r\n if (node_1.RRNodeType)\r\n node_1.rr_dataURL = value.toString();\r\n }\r\n else if (tagName === 'img' && name_2 === 'rr_dataURL') {\r\n var image = node_1;\r\n if (!image.currentSrc.startsWith('data:')) {\r\n image.setAttribute('rrweb-original-src', n.attributes.src);\r\n image.src = value.toString();\r\n }\r\n }\r\n if (name_2 === 'rr_width') {\r\n node_1.style.width = value.toString();\r\n }\r\n else if (name_2 === 'rr_height') {\r\n node_1.style.height = value.toString();\r\n }\r\n else if (name_2 === 'rr_mediaCurrentTime' &&\r\n typeof value === 'number') {\r\n node_1.currentTime = value;\r\n }\r\n else if (name_2 === 'rr_mediaState') {\r\n switch (value) {\r\n case 'played':\r\n node_1\r\n .play()[\"catch\"](function (e) { return console.warn('media playback error', e); });\r\n break;\r\n case 'paused':\r\n node_1.pause();\r\n break;\r\n }\r\n }\r\n };\r\n for (var name_2 in specialAttributes) {\r\n _loop_1(name_2);\r\n }\r\n if (n.isShadowHost) {\r\n if (!node_1.shadowRoot) {\r\n node_1.attachShadow({ mode: 'open' });\r\n }\r\n else {\r\n while (node_1.shadowRoot.firstChild) {\r\n node_1.shadowRoot.removeChild(node_1.shadowRoot.firstChild);\r\n }\r\n }\r\n }\r\n return node_1;\r\n }\r\n case NodeType.Text:\r\n return doc.createTextNode(n.isStyle && hackCss\r\n ? addHoverClass(n.textContent, cache)\r\n : n.textContent);\r\n case NodeType.CDATA:\r\n return doc.createCDATASection(n.textContent);\r\n case NodeType.Comment:\r\n return doc.createComment(n.textContent);\r\n default:\r\n return null;\r\n }\r\n}\r\nfunction buildNodeWithSN(n, options) {\r\n var doc = options.doc, mirror = options.mirror, _a = options.skipChild, skipChild = _a === void 0 ? false : _a, _b = options.hackCss, hackCss = _b === void 0 ? true : _b, afterAppend = options.afterAppend, cache = options.cache;\r\n var node = buildNode(n, { doc: doc, hackCss: hackCss, cache: cache });\r\n if (!node) {\r\n return null;\r\n }\r\n if (n.rootId && mirror.getNode(n.rootId) !== doc) {\r\n mirror.replace(n.rootId, doc);\r\n }\r\n if (n.type === NodeType.Document) {\r\n doc.close();\r\n doc.open();\r\n if (n.compatMode === 'BackCompat' &&\r\n n.childNodes &&\r\n n.childNodes[0].type !== NodeType.DocumentType) {\r\n if (n.childNodes[0].type === NodeType.Element &&\r\n 'xmlns' in n.childNodes[0].attributes &&\r\n n.childNodes[0].attributes.xmlns === 'http://www.w3.org/1999/xhtml') {\r\n doc.write('<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"\">');\r\n }\r\n else {\r\n doc.write('<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"\">');\r\n }\r\n }\r\n node = doc;\r\n }\r\n mirror.add(node, n);\r\n if ((n.type === NodeType.Document || n.type === NodeType.Element) &&\r\n !skipChild) {\r\n for (var _i = 0, _c = n.childNodes; _i < _c.length; _i++) {\r\n var childN = _c[_i];\r\n var childNode = buildNodeWithSN(childN, {\r\n doc: doc,\r\n mirror: mirror,\r\n skipChild: false,\r\n hackCss: hackCss,\r\n afterAppend: afterAppend,\r\n cache: cache\r\n });\r\n if (!childNode) {\r\n console.warn('Failed to rebuild', childN);\r\n continue;\r\n }\r\n if (childN.isShadow && isElement(node) && node.shadowRoot) {\r\n node.shadowRoot.appendChild(childNode);\r\n }\r\n else {\r\n node.appendChild(childNode);\r\n }\r\n if (afterAppend) {\r\n afterAppend(childNode, childN.id);\r\n }\r\n }\r\n }\r\n return node;\r\n}\r\nfunction visit(mirror, onVisit) {\r\n function walk(node) {\r\n onVisit(node);\r\n }\r\n for (var _i = 0, _a = mirror.getIds(); _i < _a.length; _i++) {\r\n var id = _a[_i];\r\n if (mirror.has(id)) {\r\n walk(mirror.getNode(id));\r\n }\r\n }\r\n}\r\nfunction handleScroll(node, mirror) {\r\n var n = mirror.getMeta(node);\r\n if ((n === null || n === void 0 ? void 0 : n.type) !== NodeType.Element) {\r\n return;\r\n }\r\n var el = node;\r\n for (var name_3 in n.attributes) {\r\n if (!(Object.prototype.hasOwnProperty.call(n.attributes, name_3) &&\r\n name_3.startsWith('rr_'))) {\r\n continue;\r\n }\r\n var value = n.attributes[name_3];\r\n if (name_3 === 'rr_scrollLeft') {\r\n el.scrollLeft = value;\r\n }\r\n if (name_3 === 'rr_scrollTop') {\r\n el.scrollTop = value;\r\n }\r\n }\r\n}\r\nfunction rebuild(n, options) {\r\n var doc = options.doc, onVisit = options.onVisit, _a = options.hackCss, hackCss = _a === void 0 ? true : _a, afterAppend = options.afterAppend, cache = options.cache, _b = options.mirror, mirror = _b === void 0 ? new Mirror() : _b;\r\n var node = buildNodeWithSN(n, {\r\n doc: doc,\r\n mirror: mirror,\r\n skipChild: false,\r\n hackCss: hackCss,\r\n afterAppend: afterAppend,\r\n cache: cache\r\n });\r\n visit(mirror, function (visitedNode) {\r\n if (onVisit) {\r\n onVisit(visitedNode);\r\n }\r\n handleScroll(visitedNode, mirror);\r\n });\r\n return node;\r\n}\n\nexport { IGNORED_NODE, Mirror, NodeType, addHoverClass, buildNodeWithSN, classMatchesRegex, createCache, createMirror, genId, getCssRuleString, getCssRulesString, is2DCanvasBlank, isCSSImportRule, isElement, isNativeShadowDom, isShadowRoot, maskInputValue, needMaskingText, rebuild, serializeNodeWithId, snapshot, transformAttribute };\n","import { classMatchesRegex, IGNORED_NODE, isShadowRoot } from '../../rrweb-snapshot/es/rrweb-snapshot.js';\n\nfunction on(type, fn, target = document) {\r\n const options = { capture: true, passive: true };\r\n target.addEventListener(type, fn, options);\r\n return () => target.removeEventListener(type, fn, options);\r\n}\r\nconst DEPARTED_MIRROR_ACCESS_WARNING = 'Please stop import mirror directly. Instead of that,' +\r\n '\\r\\n' +\r\n 'now you can use replayer.getMirror() to access the mirror instance of a replayer,' +\r\n '\\r\\n' +\r\n 'or you can use record.mirror to access the mirror instance during recording.';\r\nlet _mirror = {\r\n map: {},\r\n getId() {\r\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\r\n return -1;\r\n },\r\n getNode() {\r\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\r\n return null;\r\n },\r\n removeNodeFromMap() {\r\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\r\n },\r\n has() {\r\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\r\n return false;\r\n },\r\n reset() {\r\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\r\n },\r\n};\r\nif (typeof window !== 'undefined' && window.Proxy && window.Reflect) {\r\n _mirror = new Proxy(_mirror, {\r\n get(target, prop, receiver) {\r\n if (prop === 'map') {\r\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\r\n }\r\n return Reflect.get(target, prop, receiver);\r\n },\r\n });\r\n}\r\nfunction throttle(func, wait, options = {}) {\r\n let timeout = null;\r\n let previous = 0;\r\n return function (...args) {\r\n const now = Date.now();\r\n if (!previous && options.leading === false) {\r\n previous = now;\r\n }\r\n const remaining = wait - (now - previous);\r\n const context = this;\r\n if (remaining <= 0 || remaining > wait) {\r\n if (timeout) {\r\n clearTimeout(timeout);\r\n timeout = null;\r\n }\r\n previous = now;\r\n func.apply(context, args);\r\n }\r\n else if (!timeout && options.trailing !== false) {\r\n timeout = setTimeout(() => {\r\n previous = options.leading === false ? 0 : Date.now();\r\n timeout = null;\r\n func.apply(context, args);\r\n }, remaining);\r\n }\r\n };\r\n}\r\nfunction hookSetter(target, key, d, isRevoked, win = window) {\r\n const original = win.Object.getOwnPropertyDescriptor(target, key);\r\n win.Object.defineProperty(target, key, isRevoked\r\n ? d\r\n : {\r\n set(value) {\r\n setTimeout(() => {\r\n d.set.call(this, value);\r\n }, 0);\r\n if (original && original.set) {\r\n original.set.call(this, value);\r\n }\r\n },\r\n });\r\n return () => hookSetter(target, key, original || {}, true);\r\n}\r\nfunction patch(source, name, replacement) {\r\n try {\r\n if (!(name in source)) {\r\n return () => {\r\n };\r\n }\r\n const original = source[name];\r\n const wrapped = replacement(original);\r\n if (typeof wrapped === 'function') {\r\n wrapped.prototype = wrapped.prototype || {};\r\n Object.defineProperties(wrapped, {\r\n __rrweb_original__: {\r\n enumerable: false,\r\n value: original,\r\n },\r\n });\r\n }\r\n source[name] = wrapped;\r\n return () => {\r\n source[name] = original;\r\n };\r\n }\r\n catch (_a) {\r\n return () => {\r\n };\r\n }\r\n}\r\nfunction getWindowHeight() {\r\n return (window.innerHeight ||\r\n (document.documentElement && document.documentElement.clientHeight) ||\r\n (document.body && document.body.clientHeight));\r\n}\r\nfunction getWindowWidth() {\r\n return (window.innerWidth ||\r\n (document.documentElement && document.documentElement.clientWidth) ||\r\n (document.body && document.body.clientWidth));\r\n}\r\nfunction isBlocked(node, blockClass, blockSelector, checkAncestors) {\r\n if (!node) {\r\n return false;\r\n }\r\n const el = node.nodeType === node.ELEMENT_NODE\r\n ? node\r\n : node.parentElement;\r\n if (!el)\r\n return false;\r\n if (typeof blockClass === 'string') {\r\n if (el.classList.contains(blockClass))\r\n return true;\r\n if (checkAncestors && el.closest('.' + blockClass) !== null)\r\n return true;\r\n }\r\n else {\r\n if (classMatchesRegex(el, blockClass, checkAncestors))\r\n return true;\r\n }\r\n if (blockSelector) {\r\n if (node.matches(blockSelector))\r\n return true;\r\n if (checkAncestors && el.closest(blockSelector) !== null)\r\n return true;\r\n }\r\n return false;\r\n}\r\nfunction isSerialized(n, mirror) {\r\n return mirror.getId(n) !== -1;\r\n}\r\nfunction isIgnored(n, mirror) {\r\n return mirror.getId(n) === IGNORED_NODE;\r\n}\r\nfunction isAncestorRemoved(target, mirror) {\r\n if (isShadowRoot(target)) {\r\n return false;\r\n }\r\n const id = mirror.getId(target);\r\n if (!mirror.has(id)) {\r\n return true;\r\n }\r\n if (target.parentNode &&\r\n target.parentNode.nodeType === target.DOCUMENT_NODE) {\r\n return false;\r\n }\r\n if (!target.parentNode) {\r\n return true;\r\n }\r\n return isAncestorRemoved(target.parentNode, mirror);\r\n}\r\nfunction isTouchEvent(event) {\r\n return Boolean(event.changedTouches);\r\n}\r\nfunction polyfill(win = window) {\r\n if ('NodeList' in win && !win.NodeList.prototype.forEach) {\r\n win.NodeList.prototype.forEach = Array.prototype\r\n .forEach;\r\n }\r\n if ('DOMTokenList' in win && !win.DOMTokenList.prototype.forEach) {\r\n win.DOMTokenList.prototype.forEach = Array.prototype\r\n .forEach;\r\n }\r\n if (!Node.prototype.contains) {\r\n Node.prototype.contains = (...args) => {\r\n let node = args[0];\r\n if (!(0 in args)) {\r\n throw new TypeError('1 argument is required');\r\n }\r\n do {\r\n if (this === node) {\r\n return true;\r\n }\r\n } while ((node = node && node.parentNode));\r\n return false;\r\n };\r\n }\r\n}\r\nfunction queueToResolveTrees(queue) {\r\n const queueNodeMap = {};\r\n const putIntoMap = (m, parent) => {\r\n const nodeInTree = {\r\n value: m,\r\n parent,\r\n children: [],\r\n };\r\n queueNodeMap[m.node.id] = nodeInTree;\r\n return nodeInTree;\r\n };\r\n const queueNodeTrees = [];\r\n for (const mutation of queue) {\r\n const { nextId, parentId } = mutation;\r\n if (nextId && nextId in queueNodeMap) {\r\n const nextInTree = queueNodeMap[nextId];\r\n if (nextInTree.parent) {\r\n const idx = nextInTree.parent.children.indexOf(nextInTree);\r\n nextInTree.parent.children.splice(idx, 0, putIntoMap(mutation, nextInTree.parent));\r\n }\r\n else {\r\n const idx = queueNodeTrees.indexOf(nextInTree);\r\n queueNodeTrees.splice(idx, 0, putIntoMap(mutation, null));\r\n }\r\n continue;\r\n }\r\n if (parentId in queueNodeMap) {\r\n const parentInTree = queueNodeMap[parentId];\r\n parentInTree.children.push(putIntoMap(mutation, parentInTree));\r\n continue;\r\n }\r\n queueNodeTrees.push(putIntoMap(mutation, null));\r\n }\r\n return queueNodeTrees;\r\n}\r\nfunction iterateResolveTree(tree, cb) {\r\n cb(tree.value);\r\n for (let i = tree.children.length - 1; i >= 0; i--) {\r\n iterateResolveTree(tree.children[i], cb);\r\n }\r\n}\r\nfunction isSerializedIframe(n, mirror) {\r\n return Boolean(n.nodeName === 'IFRAME' && mirror.getMeta(n));\r\n}\r\nfunction isSerializedStylesheet(n, mirror) {\r\n return Boolean(n.nodeName === 'LINK' &&\r\n n.nodeType === n.ELEMENT_NODE &&\r\n n.getAttribute &&\r\n n.getAttribute('rel') === 'stylesheet' &&\r\n mirror.getMeta(n));\r\n}\r\nfunction getBaseDimension(node, rootIframe) {\r\n var _a, _b;\r\n const frameElement = (_b = (_a = node.ownerDocument) === null || _a === void 0 ? void 0 : _a.defaultView) === null || _b === void 0 ? void 0 : _b.frameElement;\r\n if (!frameElement || frameElement === rootIframe) {\r\n return {\r\n x: 0,\r\n y: 0,\r\n relativeScale: 1,\r\n absoluteScale: 1,\r\n };\r\n }\r\n const frameDimension = frameElement.getBoundingClientRect();\r\n const frameBaseDimension = getBaseDimension(frameElement, rootIframe);\r\n const relativeScale = frameDimension.height / frameElement.clientHeight;\r\n return {\r\n x: frameDimension.x * frameBaseDimension.relativeScale +\r\n frameBaseDimension.x,\r\n y: frameDimension.y * frameBaseDimension.relativeScale +\r\n frameBaseDimension.y,\r\n relativeScale,\r\n absoluteScale: frameBaseDimension.absoluteScale * relativeScale,\r\n };\r\n}\r\nfunction hasShadowRoot(n) {\r\n return Boolean(n === null || n === void 0 ? void 0 : n.shadowRoot);\r\n}\r\nfunction getNestedRule(rules, position) {\r\n const rule = rules[position[0]];\r\n if (position.length === 1) {\r\n return rule;\r\n }\r\n else {\r\n return getNestedRule(rule.cssRules[position[1]].cssRules, position.slice(2));\r\n }\r\n}\r\nfunction getPositionsAndIndex(nestedIndex) {\r\n const positions = [...nestedIndex];\r\n const index = positions.pop();\r\n return { positions, index };\r\n}\r\nfunction uniqueTextMutations(mutations) {\r\n const idSet = new Set();\r\n const uniqueMutations = [];\r\n for (let i = mutations.length; i--;) {\r\n const mutation = mutations[i];\r\n if (!idSet.has(mutation.id)) {\r\n uniqueMutations.push(mutation);\r\n idSet.add(mutation.id);\r\n }\r\n }\r\n return uniqueMutations;\r\n}\r\nclass StyleSheetMirror {\r\n constructor() {\r\n this.id = 1;\r\n this.styleIDMap = new WeakMap();\r\n this.idStyleMap = new Map();\r\n }\r\n getId(stylesheet) {\r\n var _a;\r\n return (_a = this.styleIDMap.get(stylesheet)) !== null && _a !== void 0 ? _a : -1;\r\n }\r\n has(stylesheet) {\r\n return this.styleIDMap.has(stylesheet);\r\n }\r\n add(stylesheet, id) {\r\n if (this.has(stylesheet))\r\n return this.getId(stylesheet);\r\n let newId;\r\n if (id === undefined) {\r\n newId = this.id++;\r\n }\r\n else\r\n newId = id;\r\n this.styleIDMap.set(stylesheet, newId);\r\n this.idStyleMap.set(newId, stylesheet);\r\n return newId;\r\n }\r\n getStyle(id) {\r\n return this.idStyleMap.get(id) || null;\r\n }\r\n reset() {\r\n this.styleIDMap = new WeakMap();\r\n this.idStyleMap = new Map();\r\n this.id = 1;\r\n }\r\n generateId() {\r\n return this.id++;\r\n }\r\n}\n\nexport { StyleSheetMirror, _mirror, getBaseDimension, getNestedRule, getPositionsAndIndex, getWindowHeight, getWindowWidth, hasShadowRoot, hookSetter, isAncestorRemoved, isBlocked, isIgnored, isSerialized, isSerializedIframe, isSerializedStylesheet, isTouchEvent, iterateResolveTree, on, patch, polyfill, queueToResolveTrees, throttle, uniqueTextMutations };\n","var 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 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 CanvasContext = /* @__PURE__ */ ((CanvasContext2) => {\n CanvasContext2[CanvasContext2[\"2D\"] = 0] = \"2D\";\n CanvasContext2[CanvasContext2[\"WebGL\"] = 1] = \"WebGL\";\n CanvasContext2[CanvasContext2[\"WebGL2\"] = 2] = \"WebGL2\";\n return CanvasContext2;\n})(CanvasContext || {});\nvar ReplayerEvents = /* @__PURE__ */ ((ReplayerEvents2) => {\n ReplayerEvents2[\"Start\"] = \"start\";\n ReplayerEvents2[\"Pause\"] = \"pause\";\n ReplayerEvents2[\"Resume\"] = \"resume\";\n ReplayerEvents2[\"Resize\"] = \"resize\";\n ReplayerEvents2[\"Finish\"] = \"finish\";\n ReplayerEvents2[\"FullsnapshotRebuilded\"] = \"fullsnapshot-rebuilded\";\n ReplayerEvents2[\"LoadStylesheetStart\"] = \"load-stylesheet-start\";\n ReplayerEvents2[\"LoadStylesheetEnd\"] = \"load-stylesheet-end\";\n ReplayerEvents2[\"SkipStart\"] = \"skip-start\";\n ReplayerEvents2[\"SkipEnd\"] = \"skip-end\";\n ReplayerEvents2[\"MouseInteraction\"] = \"mouse-interaction\";\n ReplayerEvents2[\"EventCast\"] = \"event-cast\";\n ReplayerEvents2[\"CustomEvent\"] = \"custom-event\";\n ReplayerEvents2[\"Flush\"] = \"flush\";\n ReplayerEvents2[\"StateChange\"] = \"state-change\";\n ReplayerEvents2[\"PlayBack\"] = \"play-back\";\n ReplayerEvents2[\"Destroy\"] = \"destroy\";\n return ReplayerEvents2;\n})(ReplayerEvents || {});\n\nexport { CanvasContext, EventType, IncrementalSource, MouseInteractions, ReplayerEvents };\n","import { isShadowRoot, isNativeShadowDom, maskInputValue, transformAttribute, needMaskingText, IGNORED_NODE, serializeNodeWithId } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\nimport { isIgnored, isBlocked, isSerialized, isAncestorRemoved, isSerializedIframe, isSerializedStylesheet, hasShadowRoot } from '../utils.js';\n\nfunction isNodeInLinkedList(n) {\r\n return '__ln' in n;\r\n}\r\nclass DoubleLinkedList {\r\n constructor() {\r\n this.length = 0;\r\n this.head = null;\r\n }\r\n get(position) {\r\n if (position >= this.length) {\r\n throw new Error('Position outside of list range');\r\n }\r\n let current = this.head;\r\n for (let index = 0; index < position; index++) {\r\n current = (current === null || current === void 0 ? void 0 : current.next) || null;\r\n }\r\n return current;\r\n }\r\n addNode(n) {\r\n const node = {\r\n value: n,\r\n previous: null,\r\n next: null,\r\n };\r\n n.__ln = node;\r\n if (n.previousSibling && isNodeInLinkedList(n.previousSibling)) {\r\n const current = n.previousSibling.__ln.next;\r\n node.next = current;\r\n node.previous = n.previousSibling.__ln;\r\n n.previousSibling.__ln.next = node;\r\n if (current) {\r\n current.previous = node;\r\n }\r\n }\r\n else if (n.nextSibling &&\r\n isNodeInLinkedList(n.nextSibling) &&\r\n n.nextSibling.__ln.previous) {\r\n const current = n.nextSibling.__ln.previous;\r\n node.previous = current;\r\n node.next = n.nextSibling.__ln;\r\n n.nextSibling.__ln.previous = node;\r\n if (current) {\r\n current.next = node;\r\n }\r\n }\r\n else {\r\n if (this.head) {\r\n this.head.previous = node;\r\n }\r\n node.next = this.head;\r\n this.head = node;\r\n }\r\n this.length++;\r\n }\r\n removeNode(n) {\r\n const current = n.__ln;\r\n if (!this.head) {\r\n return;\r\n }\r\n if (!current.previous) {\r\n this.head = current.next;\r\n if (this.head) {\r\n this.head.previous = null;\r\n }\r\n }\r\n else {\r\n current.previous.next = current.next;\r\n if (current.next) {\r\n current.next.previous = current.previous;\r\n }\r\n }\r\n if (n.__ln) {\r\n delete n.__ln;\r\n }\r\n this.length--;\r\n }\r\n}\r\nconst moveKey = (id, parentId) => `${id}@${parentId}`;\r\nclass MutationBuffer {\r\n constructor() {\r\n this.frozen = false;\r\n this.locked = false;\r\n this.texts = [];\r\n this.attributes = [];\r\n this.removes = [];\r\n this.mapRemoves = [];\r\n this.movedMap = {};\r\n this.addedSet = new Set();\r\n this.movedSet = new Set();\r\n this.droppedSet = new Set();\r\n this.processMutations = (mutations) => {\r\n mutations.forEach(this.processMutation);\r\n this.emit();\r\n };\r\n this.emit = () => {\r\n if (this.frozen || this.locked) {\r\n return;\r\n }\r\n const adds = [];\r\n const addList = new DoubleLinkedList();\r\n const getNextId = (n) => {\r\n let ns = n;\r\n let nextId = IGNORED_NODE;\r\n while (nextId === IGNORED_NODE) {\r\n ns = ns && ns.nextSibling;\r\n nextId = ns && this.mirror.getId(ns);\r\n }\r\n return nextId;\r\n };\r\n const pushAdd = (n) => {\r\n var _a, _b, _c, _d;\r\n let shadowHost = null;\r\n if (((_b = (_a = n.getRootNode) === null || _a === void 0 ? void 0 : _a.call(n)) === null || _b === void 0 ? void 0 : _b.nodeType) === Node.DOCUMENT_FRAGMENT_NODE &&\r\n n.getRootNode().host)\r\n shadowHost = n.getRootNode().host;\r\n let rootShadowHost = shadowHost;\r\n while (((_d = (_c = rootShadowHost === null || rootShadowHost === void 0 ? void 0 : rootShadowHost.getRootNode) === null || _c === void 0 ? void 0 : _c.call(rootShadowHost)) === null || _d === void 0 ? void 0 : _d.nodeType) ===\r\n Node.DOCUMENT_FRAGMENT_NODE &&\r\n rootShadowHost.getRootNode().host)\r\n rootShadowHost = rootShadowHost.getRootNode().host;\r\n const notInDoc = !this.doc.contains(n) &&\r\n (!rootShadowHost || !this.doc.contains(rootShadowHost));\r\n if (!n.parentNode || notInDoc) {\r\n return;\r\n }\r\n const parentId = isShadowRoot(n.parentNode)\r\n ? this.mirror.getId(shadowHost)\r\n : this.mirror.getId(n.parentNode);\r\n const nextId = getNextId(n);\r\n if (parentId === -1 || nextId === -1) {\r\n return addList.addNode(n);\r\n }\r\n const sn = serializeNodeWithId(n, {\r\n doc: this.doc,\r\n mirror: this.mirror,\r\n blockClass: this.blockClass,\r\n blockSelector: this.blockSelector,\r\n maskTextClass: this.maskTextClass,\r\n maskTextSelector: this.maskTextSelector,\r\n skipChild: true,\r\n newlyAddedElement: true,\r\n inlineStylesheet: this.inlineStylesheet,\r\n maskInputOptions: this.maskInputOptions,\r\n maskTextFn: this.maskTextFn,\r\n maskInputFn: this.maskInputFn,\r\n slimDOMOptions: this.slimDOMOptions,\r\n dataURLOptions: this.dataURLOptions,\r\n recordCanvas: this.recordCanvas,\r\n inlineImages: this.inlineImages,\r\n onSerialize: (currentN) => {\r\n if (isSerializedIframe(currentN, this.mirror)) {\r\n this.iframeManager.addIframe(currentN);\r\n }\r\n if (isSerializedStylesheet(currentN, this.mirror)) {\r\n this.stylesheetManager.trackLinkElement(currentN);\r\n }\r\n if (hasShadowRoot(n)) {\r\n this.shadowDomManager.addShadowRoot(n.shadowRoot, this.doc);\r\n }\r\n },\r\n onIframeLoad: (iframe, childSn) => {\r\n this.iframeManager.attachIframe(iframe, childSn);\r\n this.shadowDomManager.observeAttachShadow(iframe);\r\n },\r\n onStylesheetLoad: (link, childSn) => {\r\n this.stylesheetManager.attachLinkElement(link, childSn);\r\n },\r\n });\r\n if (sn) {\r\n adds.push({\r\n parentId,\r\n nextId,\r\n node: sn,\r\n });\r\n }\r\n };\r\n while (this.mapRemoves.length) {\r\n this.mirror.removeNodeFromMap(this.mapRemoves.shift());\r\n }\r\n for (const n of Array.from(this.movedSet.values())) {\r\n if (isParentRemoved(this.removes, n, this.mirror) &&\r\n !this.movedSet.has(n.parentNode)) {\r\n continue;\r\n }\r\n pushAdd(n);\r\n }\r\n for (const n of Array.from(this.addedSet.values())) {\r\n if (!isAncestorInSet(this.droppedSet, n) &&\r\n !isParentRemoved(this.removes, n, this.mirror)) {\r\n pushAdd(n);\r\n }\r\n else if (isAncestorInSet(this.movedSet, n)) {\r\n pushAdd(n);\r\n }\r\n else {\r\n this.droppedSet.add(n);\r\n }\r\n }\r\n let candidate = null;\r\n while (addList.length) {\r\n let node = null;\r\n if (candidate) {\r\n const parentId = this.mirror.getId(candidate.value.parentNode);\r\n const nextId = getNextId(candidate.value);\r\n if (parentId !== -1 && nextId !== -1) {\r\n node = candidate;\r\n }\r\n }\r\n if (!node) {\r\n for (let index = addList.length - 1; index >= 0; index--) {\r\n const _node = addList.get(index);\r\n if (_node) {\r\n const parentId = this.mirror.getId(_node.value.parentNode);\r\n const nextId = getNextId(_node.value);\r\n if (nextId === -1)\r\n continue;\r\n else if (parentId !== -1) {\r\n node = _node;\r\n break;\r\n }\r\n else {\r\n const unhandledNode = _node.value;\r\n if (unhandledNode.parentNode &&\r\n unhandledNode.parentNode.nodeType ===\r\n Node.DOCUMENT_FRAGMENT_NODE) {\r\n const shadowHost = unhandledNode.parentNode\r\n .host;\r\n const parentId = this.mirror.getId(shadowHost);\r\n if (parentId !== -1) {\r\n node = _node;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n if (!node) {\r\n while (addList.head) {\r\n addList.removeNode(addList.head.value);\r\n }\r\n break;\r\n }\r\n candidate = node.previous;\r\n addList.removeNode(node.value);\r\n pushAdd(node.value);\r\n }\r\n const payload = {\r\n texts: this.texts\r\n .map((text) => ({\r\n id: this.mirror.getId(text.node),\r\n value: text.value,\r\n }))\r\n .filter((text) => this.mirror.has(text.id)),\r\n attributes: this.attributes\r\n .map((attribute) => ({\r\n id: this.mirror.getId(attribute.node),\r\n attributes: attribute.attributes,\r\n }))\r\n .filter((attribute) => this.mirror.has(attribute.id)),\r\n removes: this.removes,\r\n adds,\r\n };\r\n if (!payload.texts.length &&\r\n !payload.attributes.length &&\r\n !payload.removes.length &&\r\n !payload.adds.length) {\r\n return;\r\n }\r\n this.texts = [];\r\n this.attributes = [];\r\n this.removes = [];\r\n this.addedSet = new Set();\r\n this.movedSet = new Set();\r\n this.droppedSet = new Set();\r\n this.movedMap = {};\r\n this.mutationCb(payload);\r\n };\r\n this.processMutation = (m) => {\r\n if (isIgnored(m.target, this.mirror)) {\r\n return;\r\n }\r\n switch (m.type) {\r\n case 'characterData': {\r\n const value = m.target.textContent;\r\n if (!isBlocked(m.target, this.blockClass, this.blockSelector, false) &&\r\n value !== m.oldValue) {\r\n this.texts.push({\r\n value: needMaskingText(m.target, this.maskTextClass, this.maskTextSelector) && value\r\n ? this.maskTextFn\r\n ? this.maskTextFn(value)\r\n : value.replace(/[\\S]/g, '*')\r\n : value,\r\n node: m.target,\r\n });\r\n }\r\n break;\r\n }\r\n case 'attributes': {\r\n const target = m.target;\r\n let value = m.target.getAttribute(m.attributeName);\r\n if (m.attributeName === 'value') {\r\n value = maskInputValue({\r\n maskInputOptions: this.maskInputOptions,\r\n tagName: m.target.tagName,\r\n type: m.target.getAttribute('type'),\r\n value,\r\n maskInputFn: this.maskInputFn,\r\n });\r\n }\r\n if (isBlocked(m.target, this.blockClass, this.blockSelector, false) ||\r\n value === m.oldValue) {\r\n return;\r\n }\r\n let item = this.attributes.find((a) => a.node === m.target);\r\n if (target.tagName === 'IFRAME' &&\r\n m.attributeName === 'src' &&\r\n !this.keepIframeSrcFn(value)) {\r\n if (!target.contentDocument) {\r\n m.attributeName = 'rr_src';\r\n }\r\n else {\r\n return;\r\n }\r\n }\r\n if (!item) {\r\n item = {\r\n node: m.target,\r\n attributes: {},\r\n };\r\n this.attributes.push(item);\r\n }\r\n if (m.attributeName === 'style') {\r\n const old = this.doc.createElement('span');\r\n if (m.oldValue) {\r\n old.setAttribute('style', m.oldValue);\r\n }\r\n if (item.attributes.style === undefined ||\r\n item.attributes.style === null) {\r\n item.attributes.style = {};\r\n }\r\n const styleObj = item.attributes.style;\r\n for (const pname of Array.from(target.style)) {\r\n const newValue = target.style.getPropertyValue(pname);\r\n const newPriority = target.style.getPropertyPriority(pname);\r\n if (newValue !== old.style.getPropertyValue(pname) ||\r\n newPriority !== old.style.getPropertyPriority(pname)) {\r\n if (newPriority === '') {\r\n styleObj[pname] = newValue;\r\n }\r\n else {\r\n styleObj[pname] = [newValue, newPriority];\r\n }\r\n }\r\n }\r\n for (const pname of Array.from(old.style)) {\r\n if (target.style.getPropertyValue(pname) === '') {\r\n styleObj[pname] = false;\r\n }\r\n }\r\n }\r\n else {\r\n item.attributes[m.attributeName] = transformAttribute(this.doc, target.tagName, m.attributeName, value);\r\n }\r\n break;\r\n }\r\n case 'childList': {\r\n if (isBlocked(m.target, this.blockClass, this.blockSelector, true))\r\n return;\r\n m.addedNodes.forEach((n) => this.genAdds(n, m.target));\r\n m.removedNodes.forEach((n) => {\r\n const nodeId = this.mirror.getId(n);\r\n const parentId = isShadowRoot(m.target)\r\n ? this.mirror.getId(m.target.host)\r\n : this.mirror.getId(m.target);\r\n if (isBlocked(m.target, this.blockClass, this.blockSelector, false) ||\r\n isIgnored(n, this.mirror) ||\r\n !isSerialized(n, this.mirror)) {\r\n return;\r\n }\r\n if (this.addedSet.has(n)) {\r\n deepDelete(this.addedSet, n);\r\n this.droppedSet.add(n);\r\n }\r\n else if (this.addedSet.has(m.target) && nodeId === -1) ;\r\n else if (isAncestorRemoved(m.target, this.mirror)) ;\r\n else if (this.movedSet.has(n) &&\r\n this.movedMap[moveKey(nodeId, parentId)]) {\r\n deepDelete(this.movedSet, n);\r\n }\r\n else {\r\n this.removes.push({\r\n parentId,\r\n id: nodeId,\r\n isShadow: isShadowRoot(m.target) && isNativeShadowDom(m.target)\r\n ? true\r\n : undefined,\r\n });\r\n }\r\n this.mapRemoves.push(n);\r\n });\r\n break;\r\n }\r\n }\r\n };\r\n this.genAdds = (n, target) => {\r\n if (this.mirror.hasNode(n)) {\r\n if (isIgnored(n, this.mirror)) {\r\n return;\r\n }\r\n this.movedSet.add(n);\r\n let targetId = null;\r\n if (target && this.mirror.hasNode(target)) {\r\n targetId = this.mirror.getId(target);\r\n }\r\n if (targetId && targetId !== -1) {\r\n this.movedMap[moveKey(this.mirror.getId(n), targetId)] = true;\r\n }\r\n }\r\n else {\r\n this.addedSet.add(n);\r\n this.droppedSet.delete(n);\r\n }\r\n if (!isBlocked(n, this.blockClass, this.blockSelector, false))\r\n n.childNodes.forEach((childN) => this.genAdds(childN));\r\n };\r\n }\r\n init(options) {\r\n [\r\n 'mutationCb',\r\n 'blockClass',\r\n 'blockSelector',\r\n 'maskTextClass',\r\n 'maskTextSelector',\r\n 'inlineStylesheet',\r\n 'maskInputOptions',\r\n 'maskTextFn',\r\n 'maskInputFn',\r\n 'keepIframeSrcFn',\r\n 'recordCanvas',\r\n 'inlineImages',\r\n 'slimDOMOptions',\r\n 'dataURLOptions',\r\n 'doc',\r\n 'mirror',\r\n 'iframeManager',\r\n 'stylesheetManager',\r\n 'shadowDomManager',\r\n 'canvasManager',\r\n ].forEach((key) => {\r\n this[key] = options[key];\r\n });\r\n }\r\n freeze() {\r\n this.frozen = true;\r\n this.canvasManager.freeze();\r\n }\r\n unfreeze() {\r\n this.frozen = false;\r\n this.canvasManager.unfreeze();\r\n this.emit();\r\n }\r\n isFrozen() {\r\n return this.frozen;\r\n }\r\n lock() {\r\n this.locked = true;\r\n this.canvasManager.lock();\r\n }\r\n unlock() {\r\n this.locked = false;\r\n this.canvasManager.unlock();\r\n this.emit();\r\n }\r\n reset() {\r\n this.shadowDomManager.reset();\r\n this.canvasManager.reset();\r\n }\r\n}\r\nfunction deepDelete(addsSet, n) {\r\n addsSet.delete(n);\r\n n.childNodes.forEach((childN) => deepDelete(addsSet, childN));\r\n}\r\nfunction isParentRemoved(removes, n, mirror) {\r\n if (removes.length === 0)\r\n return false;\r\n return _isParentRemoved(removes, n, mirror);\r\n}\r\nfunction _isParentRemoved(removes, n, mirror) {\r\n const { parentNode } = n;\r\n if (!parentNode) {\r\n return false;\r\n }\r\n const parentId = mirror.getId(parentNode);\r\n if (removes.some((r) => r.id === parentId)) {\r\n return true;\r\n }\r\n return _isParentRemoved(removes, parentNode, mirror);\r\n}\r\nfunction isAncestorInSet(set, n) {\r\n if (set.size === 0)\r\n return false;\r\n return _isAncestorInSet(set, n);\r\n}\r\nfunction _isAncestorInSet(set, n) {\r\n const { parentNode } = n;\r\n if (!parentNode) {\r\n return false;\r\n }\r\n if (set.has(parentNode)) {\r\n return true;\r\n }\r\n return _isAncestorInSet(set, parentNode);\r\n}\n\nexport { MutationBuffer as default };\n","import { maskInputValue } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\nimport { on, throttle, isBlocked, getWindowHeight, getWindowWidth, hookSetter, patch, isTouchEvent } from '../utils.js';\nimport { MouseInteractions, IncrementalSource } from '../../../types/dist/types.js';\nimport MutationBuffer from './mutation.js';\n\nconst mutationBuffers = [];\r\nconst isCSSGroupingRuleSupported = typeof CSSGroupingRule !== 'undefined';\r\nconst isCSSMediaRuleSupported = typeof CSSMediaRule !== 'undefined';\r\nconst isCSSSupportsRuleSupported = typeof CSSSupportsRule !== 'undefined';\r\nconst isCSSConditionRuleSupported = typeof CSSConditionRule !== 'undefined';\r\nfunction getEventTarget(event) {\r\n try {\r\n if ('composedPath' in event) {\r\n const path = event.composedPath();\r\n if (path.length) {\r\n return path[0];\r\n }\r\n }\r\n else if ('path' in event && event.path.length) {\r\n return event.path[0];\r\n }\r\n return event.target;\r\n }\r\n catch (_a) {\r\n return event.target;\r\n }\r\n}\r\nfunction initMutationObserver(options, rootEl) {\r\n var _a, _b;\r\n const mutationBuffer = new MutationBuffer();\r\n mutationBuffers.push(mutationBuffer);\r\n mutationBuffer.init(options);\r\n let mutationObserverCtor = window.MutationObserver ||\r\n window.__rrMutationObserver;\r\n const angularZoneSymbol = (_b = (_a = window === null || window === void 0 ? void 0 : window.Zone) === null || _a === void 0 ? void 0 : _a.__symbol__) === null || _b === void 0 ? void 0 : _b.call(_a, 'MutationObserver');\r\n if (angularZoneSymbol &&\r\n window[angularZoneSymbol]) {\r\n mutationObserverCtor = window[angularZoneSymbol];\r\n }\r\n const observer = new mutationObserverCtor(mutationBuffer.processMutations.bind(mutationBuffer));\r\n observer.observe(rootEl, {\r\n attributes: true,\r\n attributeOldValue: true,\r\n characterData: true,\r\n characterDataOldValue: true,\r\n childList: true,\r\n subtree: true,\r\n });\r\n return observer;\r\n}\r\nfunction initMoveObserver({ mousemoveCb, sampling, doc, mirror, }) {\r\n if (sampling.mousemove === false) {\r\n return () => {\r\n };\r\n }\r\n const threshold = typeof sampling.mousemove === 'number' ? sampling.mousemove : 50;\r\n const callbackThreshold = typeof sampling.mousemoveCallback === 'number'\r\n ? sampling.mousemoveCallback\r\n : 500;\r\n let positions = [];\r\n let timeBaseline;\r\n const wrappedCb = throttle((source) => {\r\n const totalOffset = Date.now() - timeBaseline;\r\n mousemoveCb(positions.map((p) => {\r\n p.timeOffset -= totalOffset;\r\n return p;\r\n }), source);\r\n positions = [];\r\n timeBaseline = null;\r\n }, callbackThreshold);\r\n const updatePosition = throttle((evt) => {\r\n const target = getEventTarget(evt);\r\n const { clientX, clientY } = isTouchEvent(evt)\r\n ? evt.changedTouches[0]\r\n : evt;\r\n if (!timeBaseline) {\r\n timeBaseline = Date.now();\r\n }\r\n positions.push({\r\n x: clientX,\r\n y: clientY,\r\n id: mirror.getId(target),\r\n timeOffset: Date.now() - timeBaseline,\r\n });\r\n wrappedCb(typeof DragEvent !== 'undefined' && evt instanceof DragEvent\r\n ? IncrementalSource.Drag\r\n : evt instanceof MouseEvent\r\n ? IncrementalSource.MouseMove\r\n : IncrementalSource.TouchMove);\r\n }, threshold, {\r\n trailing: false,\r\n });\r\n const handlers = [\r\n on('mousemove', updatePosition, doc),\r\n on('touchmove', updatePosition, doc),\r\n on('drag', updatePosition, doc),\r\n ];\r\n return () => {\r\n handlers.forEach((h) => h());\r\n };\r\n}\r\nfunction initMouseInteractionObserver({ mouseInteractionCb, doc, mirror, blockClass, blockSelector, sampling, }) {\r\n if (sampling.mouseInteraction === false) {\r\n return () => {\r\n };\r\n }\r\n const disableMap = sampling.mouseInteraction === true ||\r\n sampling.mouseInteraction === undefined\r\n ? {}\r\n : sampling.mouseInteraction;\r\n const handlers = [];\r\n const getHandler = (eventKey) => {\r\n return (event) => {\r\n const target = getEventTarget(event);\r\n if (isBlocked(target, blockClass, blockSelector, true)) {\r\n return;\r\n }\r\n const e = isTouchEvent(event) ? event.changedTouches[0] : event;\r\n if (!e) {\r\n return;\r\n }\r\n const id = mirror.getId(target);\r\n const { clientX, clientY } = e;\r\n mouseInteractionCb({\r\n type: MouseInteractions[eventKey],\r\n id,\r\n x: clientX,\r\n y: clientY,\r\n });\r\n };\r\n };\r\n Object.keys(MouseInteractions)\r\n .filter((key) => Number.isNaN(Number(key)) &&\r\n !key.endsWith('_Departed') &&\r\n disableMap[key] !== false)\r\n .forEach((eventKey) => {\r\n const eventName = eventKey.toLowerCase();\r\n const handler = getHandler(eventKey);\r\n handlers.push(on(eventName, handler, doc));\r\n });\r\n return () => {\r\n handlers.forEach((h) => h());\r\n };\r\n}\r\nfunction initScrollObserver({ scrollCb, doc, mirror, blockClass, blockSelector, sampling, }) {\r\n const updatePosition = throttle((evt) => {\r\n const target = getEventTarget(evt);\r\n if (!target || isBlocked(target, blockClass, blockSelector, true)) {\r\n return;\r\n }\r\n const id = mirror.getId(target);\r\n if (target === doc) {\r\n const scrollEl = (doc.scrollingElement || doc.documentElement);\r\n scrollCb({\r\n id,\r\n x: scrollEl.scrollLeft,\r\n y: scrollEl.scrollTop,\r\n });\r\n }\r\n else {\r\n scrollCb({\r\n id,\r\n x: target.scrollLeft,\r\n y: target.scrollTop,\r\n });\r\n }\r\n }, sampling.scroll || 100);\r\n return on('scroll', updatePosition, doc);\r\n}\r\nfunction initViewportResizeObserver({ viewportResizeCb, }) {\r\n let lastH = -1;\r\n let lastW = -1;\r\n const updateDimension = throttle(() => {\r\n const height = getWindowHeight();\r\n const width = getWindowWidth();\r\n if (lastH !== height || lastW !== width) {\r\n viewportResizeCb({\r\n width: Number(width),\r\n height: Number(height),\r\n });\r\n lastH = height;\r\n lastW = width;\r\n }\r\n }, 200);\r\n return on('resize', updateDimension, window);\r\n}\r\nfunction wrapEventWithUserTriggeredFlag(v, enable) {\r\n const value = Object.assign({}, v);\r\n if (!enable)\r\n delete value.userTriggered;\r\n return value;\r\n}\r\nconst INPUT_TAGS = ['INPUT', 'TEXTAREA', 'SELECT'];\r\nconst lastInputValueMap = new WeakMap();\r\nfunction initInputObserver({ inputCb, doc, mirror, blockClass, blockSelector, ignoreClass, maskInputOptions, maskInputFn, sampling, userTriggeredOnInput, }) {\r\n function eventHandler(event) {\r\n let target = getEventTarget(event);\r\n const userTriggered = event.isTrusted;\r\n if (target && target.tagName === 'OPTION')\r\n target = target.parentElement;\r\n if (!target ||\r\n !target.tagName ||\r\n INPUT_TAGS.indexOf(target.tagName) < 0 ||\r\n isBlocked(target, blockClass, blockSelector, true)) {\r\n return;\r\n }\r\n const type = target.type;\r\n if (target.classList.contains(ignoreClass)) {\r\n return;\r\n }\r\n let text = target.value;\r\n let isChecked = false;\r\n if (type === 'radio' || type === 'checkbox') {\r\n isChecked = target.checked;\r\n }\r\n else if (maskInputOptions[target.tagName.toLowerCase()] ||\r\n maskInputOptions[type]) {\r\n text = maskInputValue({\r\n maskInputOptions,\r\n tagName: target.tagName,\r\n type,\r\n value: text,\r\n maskInputFn,\r\n });\r\n }\r\n cbWithDedup(target, wrapEventWithUserTriggeredFlag({ text, isChecked, userTriggered }, userTriggeredOnInput));\r\n const name = target.name;\r\n if (type === 'radio' && name && isChecked) {\r\n doc\r\n .querySelectorAll(`input[type=\"radio\"][name=\"${name}\"]`)\r\n .forEach((el) => {\r\n if (el !== target) {\r\n cbWithDedup(el, wrapEventWithUserTriggeredFlag({\r\n text: el.value,\r\n isChecked: !isChecked,\r\n userTriggered: false,\r\n }, userTriggeredOnInput));\r\n }\r\n });\r\n }\r\n }\r\n function cbWithDedup(target, v) {\r\n const lastInputValue = lastInputValueMap.get(target);\r\n if (!lastInputValue ||\r\n lastInputValue.text !== v.text ||\r\n lastInputValue.isChecked !== v.isChecked) {\r\n lastInputValueMap.set(target, v);\r\n const id = mirror.getId(target);\r\n inputCb(Object.assign(Object.assign({}, v), { id }));\r\n }\r\n }\r\n const events = sampling.input === 'last' ? ['change'] : ['input', 'change'];\r\n const handlers = events.map((eventName) => on(eventName, eventHandler, doc));\r\n const currentWindow = doc.defaultView;\r\n if (!currentWindow) {\r\n return () => {\r\n handlers.forEach((h) => h());\r\n };\r\n }\r\n const propertyDescriptor = currentWindow.Object.getOwnPropertyDescriptor(currentWindow.HTMLInputElement.prototype, 'value');\r\n const hookProperties = [\r\n [currentWindow.HTMLInputElement.prototype, 'value'],\r\n [currentWindow.HTMLInputElement.prototype, 'checked'],\r\n [currentWindow.HTMLSelectElement.prototype, 'value'],\r\n [currentWindow.HTMLTextAreaElement.prototype, 'value'],\r\n [currentWindow.HTMLSelectElement.prototype, 'selectedIndex'],\r\n [currentWindow.HTMLOptionElement.prototype, 'selected'],\r\n ];\r\n if (propertyDescriptor && propertyDescriptor.set) {\r\n handlers.push(...hookProperties.map((p) => hookSetter(p[0], p[1], {\r\n set() {\r\n eventHandler({ target: this });\r\n },\r\n }, false, currentWindow)));\r\n }\r\n return () => {\r\n handlers.forEach((h) => h());\r\n };\r\n}\r\nfunction getNestedCSSRulePositions(rule) {\r\n const positions = [];\r\n function recurse(childRule, pos) {\r\n if ((isCSSGroupingRuleSupported &&\r\n childRule.parentRule instanceof CSSGroupingRule) ||\r\n (isCSSMediaRuleSupported &&\r\n childRule.parentRule instanceof CSSMediaRule) ||\r\n (isCSSSupportsRuleSupported &&\r\n childRule.parentRule instanceof CSSSupportsRule) ||\r\n (isCSSConditionRuleSupported &&\r\n childRule.parentRule instanceof CSSConditionRule)) {\r\n const rules = Array.from(childRule.parentRule.cssRules);\r\n const index = rules.indexOf(childRule);\r\n pos.unshift(index);\r\n }\r\n else if (childRule.parentStyleSheet) {\r\n const rules = Array.from(childRule.parentStyleSheet.cssRules);\r\n const index = rules.indexOf(childRule);\r\n pos.unshift(index);\r\n }\r\n return pos;\r\n }\r\n return recurse(rule, positions);\r\n}\r\nfunction getIdAndStyleId(sheet, mirror, styleMirror) {\r\n let id, styleId;\r\n if (!sheet)\r\n return {};\r\n if (sheet.ownerNode)\r\n id = mirror.getId(sheet.ownerNode);\r\n else\r\n styleId = styleMirror.getId(sheet);\r\n return {\r\n styleId,\r\n id,\r\n };\r\n}\r\nfunction initStyleSheetObserver({ styleSheetRuleCb, mirror, stylesheetManager }, { win }) {\r\n const insertRule = win.CSSStyleSheet.prototype.insertRule;\r\n win.CSSStyleSheet.prototype.insertRule = function (rule, index) {\r\n const { id, styleId } = getIdAndStyleId(this, mirror, stylesheetManager.styleMirror);\r\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n styleSheetRuleCb({\r\n id,\r\n styleId,\r\n adds: [{ rule, index }],\r\n });\r\n }\r\n return insertRule.apply(this, [rule, index]);\r\n };\r\n const deleteRule = win.CSSStyleSheet.prototype.deleteRule;\r\n win.CSSStyleSheet.prototype.deleteRule = function (index) {\r\n const { id, styleId } = getIdAndStyleId(this, mirror, stylesheetManager.styleMirror);\r\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n styleSheetRuleCb({\r\n id,\r\n styleId,\r\n removes: [{ index }],\r\n });\r\n }\r\n return deleteRule.apply(this, [index]);\r\n };\r\n let replace;\r\n if (win.CSSStyleSheet.prototype.replace) {\r\n replace = win.CSSStyleSheet.prototype.replace;\r\n win.CSSStyleSheet.prototype.replace = function (text) {\r\n const { id, styleId } = getIdAndStyleId(this, mirror, stylesheetManager.styleMirror);\r\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n styleSheetRuleCb({\r\n id,\r\n styleId,\r\n replace: text,\r\n });\r\n }\r\n return replace.apply(this, [text]);\r\n };\r\n }\r\n let replaceSync;\r\n if (win.CSSStyleSheet.prototype.replaceSync) {\r\n replaceSync = win.CSSStyleSheet.prototype.replaceSync;\r\n win.CSSStyleSheet.prototype.replaceSync = function (text) {\r\n const { id, styleId } = getIdAndStyleId(this, mirror, stylesheetManager.styleMirror);\r\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n styleSheetRuleCb({\r\n id,\r\n styleId,\r\n replaceSync: text,\r\n });\r\n }\r\n return replaceSync.apply(this, [text]);\r\n };\r\n }\r\n const supportedNestedCSSRuleTypes = {};\r\n if (isCSSGroupingRuleSupported) {\r\n supportedNestedCSSRuleTypes.CSSGroupingRule = win.CSSGroupingRule;\r\n }\r\n else {\r\n if (isCSSMediaRuleSupported) {\r\n supportedNestedCSSRuleTypes.CSSMediaRule = win.CSSMediaRule;\r\n }\r\n if (isCSSConditionRuleSupported) {\r\n supportedNestedCSSRuleTypes.CSSConditionRule = win.CSSConditionRule;\r\n }\r\n if (isCSSSupportsRuleSupported) {\r\n supportedNestedCSSRuleTypes.CSSSupportsRule = win.CSSSupportsRule;\r\n }\r\n }\r\n const unmodifiedFunctions = {};\r\n Object.entries(supportedNestedCSSRuleTypes).forEach(([typeKey, type]) => {\r\n unmodifiedFunctions[typeKey] = {\r\n insertRule: type.prototype.insertRule,\r\n deleteRule: type.prototype.deleteRule,\r\n };\r\n type.prototype.insertRule = function (rule, index) {\r\n const { id, styleId } = getIdAndStyleId(this.parentStyleSheet, mirror, stylesheetManager.styleMirror);\r\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n styleSheetRuleCb({\r\n id,\r\n styleId,\r\n adds: [\r\n {\r\n rule,\r\n index: [\r\n ...getNestedCSSRulePositions(this),\r\n index || 0,\r\n ],\r\n },\r\n ],\r\n });\r\n }\r\n return unmodifiedFunctions[typeKey].insertRule.apply(this, [rule, index]);\r\n };\r\n type.prototype.deleteRule = function (index) {\r\n const { id, styleId } = getIdAndStyleId(this.parentStyleSheet, mirror, stylesheetManager.styleMirror);\r\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n styleSheetRuleCb({\r\n id,\r\n styleId,\r\n removes: [\r\n { index: [...getNestedCSSRulePositions(this), index] },\r\n ],\r\n });\r\n }\r\n return unmodifiedFunctions[typeKey].deleteRule.apply(this, [index]);\r\n };\r\n });\r\n return () => {\r\n win.CSSStyleSheet.prototype.insertRule = insertRule;\r\n win.CSSStyleSheet.prototype.deleteRule = deleteRule;\r\n replace && (win.CSSStyleSheet.prototype.replace = replace);\r\n replaceSync && (win.CSSStyleSheet.prototype.replaceSync = replaceSync);\r\n Object.entries(supportedNestedCSSRuleTypes).forEach(([typeKey, type]) => {\r\n type.prototype.insertRule = unmodifiedFunctions[typeKey].insertRule;\r\n type.prototype.deleteRule = unmodifiedFunctions[typeKey].deleteRule;\r\n });\r\n };\r\n}\r\nfunction initAdoptedStyleSheetObserver({ mirror, stylesheetManager, }, host) {\r\n var _a, _b, _c;\r\n let hostId = null;\r\n if (host.nodeName === '#document')\r\n hostId = mirror.getId(host);\r\n else\r\n hostId = mirror.getId(host.host);\r\n const patchTarget = host.nodeName === '#document'\r\n ? (_a = host.defaultView) === null || _a === void 0 ? void 0 : _a.Document\r\n : (_c = (_b = host.ownerDocument) === null || _b === void 0 ? void 0 : _b.defaultView) === null || _c === void 0 ? void 0 : _c.ShadowRoot;\r\n const originalPropertyDescriptor = Object.getOwnPropertyDescriptor(patchTarget === null || patchTarget === void 0 ? void 0 : patchTarget.prototype, 'adoptedStyleSheets');\r\n if (hostId === null ||\r\n hostId === -1 ||\r\n !patchTarget ||\r\n !originalPropertyDescriptor)\r\n return () => {\r\n };\r\n Object.defineProperty(host, 'adoptedStyleSheets', {\r\n configurable: originalPropertyDescriptor.configurable,\r\n enumerable: originalPropertyDescriptor.enumerable,\r\n get() {\r\n var _a;\r\n return (_a = originalPropertyDescriptor.get) === null || _a === void 0 ? void 0 : _a.call(this);\r\n },\r\n set(sheets) {\r\n var _a;\r\n const result = (_a = originalPropertyDescriptor.set) === null || _a === void 0 ? void 0 : _a.call(this, sheets);\r\n if (hostId !== null && hostId !== -1) {\r\n try {\r\n stylesheetManager.adoptStyleSheets(sheets, hostId);\r\n }\r\n catch (e) {\r\n }\r\n }\r\n return result;\r\n },\r\n });\r\n return () => {\r\n Object.defineProperty(host, 'adoptedStyleSheets', {\r\n configurable: originalPropertyDescriptor.configurable,\r\n enumerable: originalPropertyDescriptor.enumerable,\r\n get: originalPropertyDescriptor.get,\r\n set: originalPropertyDescriptor.set,\r\n });\r\n };\r\n}\r\nfunction initStyleDeclarationObserver({ styleDeclarationCb, mirror, ignoreCSSAttributes, stylesheetManager, }, { win }) {\r\n const setProperty = win.CSSStyleDeclaration.prototype.setProperty;\r\n win.CSSStyleDeclaration.prototype.setProperty = function (property, value, priority) {\r\n var _a;\r\n if (ignoreCSSAttributes.has(property)) {\r\n return setProperty.apply(this, [property, value, priority]);\r\n }\r\n const { id, styleId } = getIdAndStyleId((_a = this.parentRule) === null || _a === void 0 ? void 0 : _a.parentStyleSheet, mirror, stylesheetManager.styleMirror);\r\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n styleDeclarationCb({\r\n id,\r\n styleId,\r\n set: {\r\n property,\r\n value,\r\n priority,\r\n },\r\n index: getNestedCSSRulePositions(this.parentRule),\r\n });\r\n }\r\n return setProperty.apply(this, [property, value, priority]);\r\n };\r\n const removeProperty = win.CSSStyleDeclaration.prototype.removeProperty;\r\n win.CSSStyleDeclaration.prototype.removeProperty = function (property) {\r\n var _a;\r\n if (ignoreCSSAttributes.has(property)) {\r\n return removeProperty.apply(this, [property]);\r\n }\r\n const { id, styleId } = getIdAndStyleId((_a = this.parentRule) === null || _a === void 0 ? void 0 : _a.parentStyleSheet, mirror, stylesheetManager.styleMirror);\r\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n styleDeclarationCb({\r\n id,\r\n styleId,\r\n remove: {\r\n property,\r\n },\r\n index: getNestedCSSRulePositions(this.parentRule),\r\n });\r\n }\r\n return removeProperty.apply(this, [property]);\r\n };\r\n return () => {\r\n win.CSSStyleDeclaration.prototype.setProperty = setProperty;\r\n win.CSSStyleDeclaration.prototype.removeProperty = removeProperty;\r\n };\r\n}\r\nfunction initMediaInteractionObserver({ mediaInteractionCb, blockClass, blockSelector, mirror, sampling, }) {\r\n const handler = (type) => throttle((event) => {\r\n const target = getEventTarget(event);\r\n if (!target ||\r\n isBlocked(target, blockClass, blockSelector, true)) {\r\n return;\r\n }\r\n const { currentTime, volume, muted, playbackRate, } = target;\r\n mediaInteractionCb({\r\n type,\r\n id: mirror.getId(target),\r\n currentTime,\r\n volume,\r\n muted,\r\n playbackRate,\r\n });\r\n }, sampling.media || 500);\r\n const handlers = [\r\n on('play', handler(0)),\r\n on('pause', handler(1)),\r\n on('seeked', handler(2)),\r\n on('volumechange', handler(3)),\r\n on('ratechange', handler(4)),\r\n ];\r\n return () => {\r\n handlers.forEach((h) => h());\r\n };\r\n}\r\nfunction initFontObserver({ fontCb, doc }) {\r\n const win = doc.defaultView;\r\n if (!win) {\r\n return () => {\r\n };\r\n }\r\n const handlers = [];\r\n const fontMap = new WeakMap();\r\n const originalFontFace = win.FontFace;\r\n win.FontFace = function FontFace(family, source, descriptors) {\r\n const fontFace = new originalFontFace(family, source, descriptors);\r\n fontMap.set(fontFace, {\r\n family,\r\n buffer: typeof source !== 'string',\r\n descriptors,\r\n fontSource: typeof source === 'string'\r\n ? source\r\n : JSON.stringify(Array.from(new Uint8Array(source))),\r\n });\r\n return fontFace;\r\n };\r\n const restoreHandler = patch(doc.fonts, 'add', function (original) {\r\n return function (fontFace) {\r\n setTimeout(() => {\r\n const p = fontMap.get(fontFace);\r\n if (p) {\r\n fontCb(p);\r\n fontMap.delete(fontFace);\r\n }\r\n }, 0);\r\n return original.apply(this, [fontFace]);\r\n };\r\n });\r\n handlers.push(() => {\r\n win.FontFace = originalFontFace;\r\n });\r\n handlers.push(restoreHandler);\r\n return () => {\r\n handlers.forEach((h) => h());\r\n };\r\n}\r\nfunction initSelectionObserver(param) {\r\n const { doc, mirror, blockClass, blockSelector, selectionCb } = param;\r\n let collapsed = true;\r\n const updateSelection = () => {\r\n const selection = doc.getSelection();\r\n if (!selection || (collapsed && (selection === null || selection === void 0 ? void 0 : selection.isCollapsed)))\r\n return;\r\n collapsed = selection.isCollapsed || false;\r\n const ranges = [];\r\n const count = selection.rangeCount || 0;\r\n for (let i = 0; i < count; i++) {\r\n const range = selection.getRangeAt(i);\r\n const { startContainer, startOffset, endContainer, endOffset } = range;\r\n const blocked = isBlocked(startContainer, blockClass, blockSelector, true) ||\r\n isBlocked(endContainer, blockClass, blockSelector, true);\r\n if (blocked)\r\n continue;\r\n ranges.push({\r\n start: mirror.getId(startContainer),\r\n startOffset,\r\n end: mirror.getId(endContainer),\r\n endOffset,\r\n });\r\n }\r\n selectionCb({ ranges });\r\n };\r\n updateSelection();\r\n return on('selectionchange', updateSelection);\r\n}\r\nfunction mergeHooks(o, hooks) {\r\n const { mutationCb, mousemoveCb, mouseInteractionCb, scrollCb, viewportResizeCb, inputCb, mediaInteractionCb, styleSheetRuleCb, styleDeclarationCb, canvasMutationCb, fontCb, selectionCb, } = o;\r\n o.mutationCb = (...p) => {\r\n if (hooks.mutation) {\r\n hooks.mutation(...p);\r\n }\r\n mutationCb(...p);\r\n };\r\n o.mousemoveCb = (...p) => {\r\n if (hooks.mousemove) {\r\n hooks.mousemove(...p);\r\n }\r\n mousemoveCb(...p);\r\n };\r\n o.mouseInteractionCb = (...p) => {\r\n if (hooks.mouseInteraction) {\r\n hooks.mouseInteraction(...p);\r\n }\r\n mouseInteractionCb(...p);\r\n };\r\n o.scrollCb = (...p) => {\r\n if (hooks.scroll) {\r\n hooks.scroll(...p);\r\n }\r\n scrollCb(...p);\r\n };\r\n o.viewportResizeCb = (...p) => {\r\n if (hooks.viewportResize) {\r\n hooks.viewportResize(...p);\r\n }\r\n viewportResizeCb(...p);\r\n };\r\n o.inputCb = (...p) => {\r\n if (hooks.input) {\r\n hooks.input(...p);\r\n }\r\n inputCb(...p);\r\n };\r\n o.mediaInteractionCb = (...p) => {\r\n if (hooks.mediaInteaction) {\r\n hooks.mediaInteaction(...p);\r\n }\r\n mediaInteractionCb(...p);\r\n };\r\n o.styleSheetRuleCb = (...p) => {\r\n if (hooks.styleSheetRule) {\r\n hooks.styleSheetRule(...p);\r\n }\r\n styleSheetRuleCb(...p);\r\n };\r\n o.styleDeclarationCb = (...p) => {\r\n if (hooks.styleDeclaration) {\r\n hooks.styleDeclaration(...p);\r\n }\r\n styleDeclarationCb(...p);\r\n };\r\n o.canvasMutationCb = (...p) => {\r\n if (hooks.canvasMutation) {\r\n hooks.canvasMutation(...p);\r\n }\r\n canvasMutationCb(...p);\r\n };\r\n o.fontCb = (...p) => {\r\n if (hooks.font) {\r\n hooks.font(...p);\r\n }\r\n fontCb(...p);\r\n };\r\n o.selectionCb = (...p) => {\r\n if (hooks.selection) {\r\n hooks.selection(...p);\r\n }\r\n selectionCb(...p);\r\n };\r\n}\r\nfunction initObservers(o, hooks = {}) {\r\n const currentWindow = o.doc.defaultView;\r\n if (!currentWindow) {\r\n return () => {\r\n };\r\n }\r\n mergeHooks(o, hooks);\r\n const mutationObserver = initMutationObserver(o, o.doc);\r\n const mousemoveHandler = initMoveObserver(o);\r\n const mouseInteractionHandler = initMouseInteractionObserver(o);\r\n const scrollHandler = initScrollObserver(o);\r\n const viewportResizeHandler = initViewportResizeObserver(o);\r\n const inputHandler = initInputObserver(o);\r\n const mediaInteractionHandler = initMediaInteractionObserver(o);\r\n const styleSheetObserver = initStyleSheetObserver(o, { win: currentWindow });\r\n const adoptedStyleSheetObserver = initAdoptedStyleSheetObserver(o, o.doc);\r\n const styleDeclarationObserver = initStyleDeclarationObserver(o, {\r\n win: currentWindow,\r\n });\r\n const fontObserver = o.collectFonts\r\n ? initFontObserver(o)\r\n : () => {\r\n };\r\n const selectionObserver = initSelectionObserver(o);\r\n const pluginHandlers = [];\r\n for (const plugin of o.plugins) {\r\n pluginHandlers.push(plugin.observer(plugin.callback, currentWindow, plugin.options));\r\n }\r\n return () => {\r\n mutationBuffers.forEach((b) => b.reset());\r\n mutationObserver.disconnect();\r\n mousemoveHandler();\r\n mouseInteractionHandler();\r\n scrollHandler();\r\n viewportResizeHandler();\r\n inputHandler();\r\n mediaInteractionHandler();\r\n styleSheetObserver();\r\n adoptedStyleSheetObserver();\r\n styleDeclarationObserver();\r\n fontObserver();\r\n selectionObserver();\r\n pluginHandlers.forEach((h) => h());\r\n };\r\n}\n\nexport { INPUT_TAGS, initAdoptedStyleSheetObserver, initMutationObserver, initObservers, initScrollObserver, mutationBuffers };\n","class CrossOriginIframeMirror {\r\n constructor(generateIdFn) {\r\n this.generateIdFn = generateIdFn;\r\n this.iframeIdToRemoteIdMap = new WeakMap();\r\n this.iframeRemoteIdToIdMap = new WeakMap();\r\n }\r\n getId(iframe, remoteId, idToRemoteMap, remoteToIdMap) {\r\n const idToRemoteIdMap = idToRemoteMap || this.getIdToRemoteIdMap(iframe);\r\n const remoteIdToIdMap = remoteToIdMap || this.getRemoteIdToIdMap(iframe);\r\n let id = idToRemoteIdMap.get(remoteId);\r\n if (!id) {\r\n id = this.generateIdFn();\r\n idToRemoteIdMap.set(remoteId, id);\r\n remoteIdToIdMap.set(id, remoteId);\r\n }\r\n return id;\r\n }\r\n getIds(iframe, remoteId) {\r\n const idToRemoteIdMap = this.getIdToRemoteIdMap(iframe);\r\n const remoteIdToIdMap = this.getRemoteIdToIdMap(iframe);\r\n return remoteId.map((id) => this.getId(iframe, id, idToRemoteIdMap, remoteIdToIdMap));\r\n }\r\n getRemoteId(iframe, id, map) {\r\n const remoteIdToIdMap = map || this.getRemoteIdToIdMap(iframe);\r\n if (typeof id !== 'number')\r\n return id;\r\n const remoteId = remoteIdToIdMap.get(id);\r\n if (!remoteId)\r\n return -1;\r\n return remoteId;\r\n }\r\n getRemoteIds(iframe, ids) {\r\n const remoteIdToIdMap = this.getRemoteIdToIdMap(iframe);\r\n return ids.map((id) => this.getRemoteId(iframe, id, remoteIdToIdMap));\r\n }\r\n reset(iframe) {\r\n if (!iframe) {\r\n this.iframeIdToRemoteIdMap = new WeakMap();\r\n this.iframeRemoteIdToIdMap = new WeakMap();\r\n return;\r\n }\r\n this.iframeIdToRemoteIdMap.delete(iframe);\r\n this.iframeRemoteIdToIdMap.delete(iframe);\r\n }\r\n getIdToRemoteIdMap(iframe) {\r\n let idToRemoteIdMap = this.iframeIdToRemoteIdMap.get(iframe);\r\n if (!idToRemoteIdMap) {\r\n idToRemoteIdMap = new Map();\r\n this.iframeIdToRemoteIdMap.set(iframe, idToRemoteIdMap);\r\n }\r\n return idToRemoteIdMap;\r\n }\r\n getRemoteIdToIdMap(iframe) {\r\n let remoteIdToIdMap = this.iframeRemoteIdToIdMap.get(iframe);\r\n if (!remoteIdToIdMap) {\r\n remoteIdToIdMap = new Map();\r\n this.iframeRemoteIdToIdMap.set(iframe, remoteIdToIdMap);\r\n }\r\n return remoteIdToIdMap;\r\n }\r\n}\n\nexport { CrossOriginIframeMirror as default };\n","import { genId } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\nimport CrossOriginIframeMirror from './cross-origin-iframe-mirror.js';\nimport { EventType, IncrementalSource } from '../../../types/dist/types.js';\n\nclass IframeManager {\r\n constructor(options) {\r\n this.iframes = new WeakMap();\r\n this.crossOriginIframeMap = new WeakMap();\r\n this.crossOriginIframeMirror = new CrossOriginIframeMirror(genId);\r\n this.mutationCb = options.mutationCb;\r\n this.wrappedEmit = options.wrappedEmit;\r\n this.stylesheetManager = options.stylesheetManager;\r\n this.recordCrossOriginIframes = options.recordCrossOriginIframes;\r\n this.crossOriginIframeStyleMirror = new CrossOriginIframeMirror(this.stylesheetManager.styleMirror.generateId.bind(this.stylesheetManager.styleMirror));\r\n this.mirror = options.mirror;\r\n if (this.recordCrossOriginIframes) {\r\n window.addEventListener('message', this.handleMessage.bind(this));\r\n }\r\n }\r\n addIframe(iframeEl) {\r\n this.iframes.set(iframeEl, true);\r\n if (iframeEl.contentWindow)\r\n this.crossOriginIframeMap.set(iframeEl.contentWindow, iframeEl);\r\n }\r\n addLoadListener(cb) {\r\n this.loadListener = cb;\r\n }\r\n attachIframe(iframeEl, childSn) {\r\n var _a;\r\n this.mutationCb({\r\n adds: [\r\n {\r\n parentId: this.mirror.getId(iframeEl),\r\n nextId: null,\r\n node: childSn,\r\n },\r\n ],\r\n removes: [],\r\n texts: [],\r\n attributes: [],\r\n isAttachIframe: true,\r\n });\r\n (_a = this.loadListener) === null || _a === void 0 ? void 0 : _a.call(this, iframeEl);\r\n if (iframeEl.contentDocument &&\r\n iframeEl.contentDocument.adoptedStyleSheets &&\r\n iframeEl.contentDocument.adoptedStyleSheets.length > 0)\r\n this.stylesheetManager.adoptStyleSheets(iframeEl.contentDocument.adoptedStyleSheets, this.mirror.getId(iframeEl.contentDocument));\r\n }\r\n handleMessage(message) {\r\n if (message.data.type === 'rrweb') {\r\n const iframeSourceWindow = message.source;\r\n if (!iframeSourceWindow)\r\n return;\r\n const iframeEl = this.crossOriginIframeMap.get(message.source);\r\n if (!iframeEl)\r\n return;\r\n const transformedEvent = this.transformCrossOriginEvent(iframeEl, message.data.event);\r\n if (transformedEvent)\r\n this.wrappedEmit(transformedEvent, message.data.isCheckout);\r\n }\r\n }\r\n transformCrossOriginEvent(iframeEl, e) {\r\n var _a;\r\n switch (e.type) {\r\n case EventType.FullSnapshot: {\r\n this.crossOriginIframeMirror.reset(iframeEl);\r\n this.crossOriginIframeStyleMirror.reset(iframeEl);\r\n this.replaceIdOnNode(e.data.node, iframeEl);\r\n return {\r\n timestamp: e.timestamp,\r\n type: EventType.IncrementalSnapshot,\r\n data: {\r\n source: IncrementalSource.Mutation,\r\n adds: [\r\n {\r\n parentId: this.mirror.getId(iframeEl),\r\n nextId: null,\r\n node: e.data.node,\r\n },\r\n ],\r\n removes: [],\r\n texts: [],\r\n attributes: [],\r\n isAttachIframe: true,\r\n },\r\n };\r\n }\r\n case EventType.Meta:\r\n case EventType.Load:\r\n case EventType.DomContentLoaded: {\r\n return false;\r\n }\r\n case EventType.Plugin: {\r\n return e;\r\n }\r\n case EventType.Custom: {\r\n this.replaceIds(e.data.payload, iframeEl, ['id', 'parentId', 'previousId', 'nextId']);\r\n return e;\r\n }\r\n case EventType.IncrementalSnapshot: {\r\n switch (e.data.source) {\r\n case IncrementalSource.Mutation: {\r\n e.data.adds.forEach((n) => {\r\n this.replaceIds(n, iframeEl, [\r\n 'parentId',\r\n 'nextId',\r\n 'previousId',\r\n ]);\r\n this.replaceIdOnNode(n.node, iframeEl);\r\n });\r\n e.data.removes.forEach((n) => {\r\n this.replaceIds(n, iframeEl, ['parentId', 'id']);\r\n });\r\n e.data.attributes.forEach((n) => {\r\n this.replaceIds(n, iframeEl, ['id']);\r\n });\r\n e.data.texts.forEach((n) => {\r\n this.replaceIds(n, iframeEl, ['id']);\r\n });\r\n return e;\r\n }\r\n case IncrementalSource.Drag:\r\n case IncrementalSource.TouchMove:\r\n case IncrementalSource.MouseMove: {\r\n e.data.positions.forEach((p) => {\r\n this.replaceIds(p, iframeEl, ['id']);\r\n });\r\n return e;\r\n }\r\n case IncrementalSource.ViewportResize: {\r\n return false;\r\n }\r\n case IncrementalSource.MediaInteraction:\r\n case IncrementalSource.MouseInteraction:\r\n case IncrementalSource.Scroll:\r\n case IncrementalSource.CanvasMutation:\r\n case IncrementalSource.Input: {\r\n this.replaceIds(e.data, iframeEl, ['id']);\r\n return e;\r\n }\r\n case IncrementalSource.StyleSheetRule:\r\n case IncrementalSource.StyleDeclaration: {\r\n this.replaceIds(e.data, iframeEl, ['id']);\r\n this.replaceStyleIds(e.data, iframeEl, ['styleId']);\r\n return e;\r\n }\r\n case IncrementalSource.Font: {\r\n return e;\r\n }\r\n case IncrementalSource.Selection: {\r\n e.data.ranges.forEach((range) => {\r\n this.replaceIds(range, iframeEl, ['start', 'end']);\r\n });\r\n return e;\r\n }\r\n case IncrementalSource.AdoptedStyleSheet: {\r\n this.replaceIds(e.data, iframeEl, ['id']);\r\n this.replaceStyleIds(e.data, iframeEl, ['styleIds']);\r\n (_a = e.data.styles) === null || _a === void 0 ? void 0 : _a.forEach((style) => {\r\n this.replaceStyleIds(style, iframeEl, ['styleId']);\r\n });\r\n return e;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n replace(iframeMirror, obj, iframeEl, keys) {\r\n for (const key of keys) {\r\n if (!Array.isArray(obj[key]) && typeof obj[key] !== 'number')\r\n continue;\r\n if (Array.isArray(obj[key])) {\r\n obj[key] = iframeMirror.getIds(iframeEl, obj[key]);\r\n }\r\n else {\r\n obj[key] = iframeMirror.getId(iframeEl, obj[key]);\r\n }\r\n }\r\n return obj;\r\n }\r\n replaceIds(obj, iframeEl, keys) {\r\n return this.replace(this.crossOriginIframeMirror, obj, iframeEl, keys);\r\n }\r\n replaceStyleIds(obj, iframeEl, keys) {\r\n return this.replace(this.crossOriginIframeStyleMirror, obj, iframeEl, keys);\r\n }\r\n replaceIdOnNode(node, iframeEl) {\r\n this.replaceIds(node, iframeEl, ['id']);\r\n if ('childNodes' in node) {\r\n node.childNodes.forEach((child) => {\r\n this.replaceIdOnNode(child, iframeEl);\r\n });\r\n }\r\n }\r\n}\n\nexport { IframeManager };\n","import { initMutationObserver, initScrollObserver, initAdoptedStyleSheetObserver } from './observer.js';\nimport { patch } from '../utils.js';\nimport { isNativeShadowDom } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\n\nclass ShadowDomManager {\r\n constructor(options) {\r\n this.shadowDoms = new WeakSet();\r\n this.restorePatches = [];\r\n this.mutationCb = options.mutationCb;\r\n this.scrollCb = options.scrollCb;\r\n this.bypassOptions = options.bypassOptions;\r\n this.mirror = options.mirror;\r\n const manager = this;\r\n this.restorePatches.push(patch(Element.prototype, 'attachShadow', function (original) {\r\n return function (option) {\r\n const shadowRoot = original.call(this, option);\r\n if (this.shadowRoot)\r\n manager.addShadowRoot(this.shadowRoot, this.ownerDocument);\r\n return shadowRoot;\r\n };\r\n }));\r\n }\r\n addShadowRoot(shadowRoot, doc) {\r\n if (!isNativeShadowDom(shadowRoot))\r\n return;\r\n if (this.shadowDoms.has(shadowRoot))\r\n return;\r\n this.shadowDoms.add(shadowRoot);\r\n initMutationObserver(Object.assign(Object.assign({}, this.bypassOptions), { doc, mutationCb: this.mutationCb, mirror: this.mirror, shadowDomManager: this }), shadowRoot);\r\n initScrollObserver(Object.assign(Object.assign({}, this.bypassOptions), { scrollCb: this.scrollCb, doc: shadowRoot, mirror: this.mirror }));\r\n setTimeout(() => {\r\n if (shadowRoot.adoptedStyleSheets &&\r\n shadowRoot.adoptedStyleSheets.length > 0)\r\n this.bypassOptions.stylesheetManager.adoptStyleSheets(shadowRoot.adoptedStyleSheets, this.mirror.getId(shadowRoot.host));\r\n initAdoptedStyleSheetObserver({\r\n mirror: this.mirror,\r\n stylesheetManager: this.bypassOptions.stylesheetManager,\r\n }, shadowRoot);\r\n }, 0);\r\n }\r\n observeAttachShadow(iframeElement) {\r\n if (iframeElement.contentWindow) {\r\n const manager = this;\r\n this.restorePatches.push(patch(iframeElement.contentWindow.HTMLElement.prototype, 'attachShadow', function (original) {\r\n return function (option) {\r\n const shadowRoot = original.call(this, option);\r\n if (this.shadowRoot)\r\n manager.addShadowRoot(this.shadowRoot, iframeElement.contentDocument);\r\n return shadowRoot;\r\n };\r\n }));\r\n }\r\n }\r\n reset() {\r\n this.restorePatches.forEach((restorePatch) => restorePatch());\r\n this.shadowDoms = new WeakSet();\r\n }\r\n}\n\nexport { ShadowDomManager };\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n\r\nfunction __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nfunction __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\n\nexport { __awaiter, __rest };\n","/*\n * base64-arraybuffer 1.0.1 <https://github.com/niklasvh/base64-arraybuffer>\n * Copyright (c) 2021 Niklas von Hertzen <https://hertzen.com>\n * Released under MIT License\n */\nvar chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n// Use a lookup table to find the index.\nvar lookup = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256);\nfor (var i = 0; i < chars.length; i++) {\n lookup[chars.charCodeAt(i)] = i;\n}\nvar encode = function (arraybuffer) {\n var bytes = new Uint8Array(arraybuffer), i, len = bytes.length, base64 = '';\n for (i = 0; i < len; i += 3) {\n base64 += chars[bytes[i] >> 2];\n base64 += chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];\n base64 += chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];\n base64 += chars[bytes[i + 2] & 63];\n }\n if (len % 3 === 2) {\n base64 = base64.substring(0, base64.length - 1) + '=';\n }\n else if (len % 3 === 1) {\n base64 = base64.substring(0, base64.length - 2) + '==';\n }\n return base64;\n};\nvar decode = function (base64) {\n var bufferLength = base64.length * 0.75, len = base64.length, i, p = 0, encoded1, encoded2, encoded3, encoded4;\n if (base64[base64.length - 1] === '=') {\n bufferLength--;\n if (base64[base64.length - 2] === '=') {\n bufferLength--;\n }\n }\n var arraybuffer = new ArrayBuffer(bufferLength), bytes = new Uint8Array(arraybuffer);\n for (i = 0; i < len; i += 4) {\n encoded1 = lookup[base64.charCodeAt(i)];\n encoded2 = lookup[base64.charCodeAt(i + 1)];\n encoded3 = lookup[base64.charCodeAt(i + 2)];\n encoded4 = lookup[base64.charCodeAt(i + 3)];\n bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n }\n return arraybuffer;\n};\n\nexport { decode, encode };\n","import { encode } from './../../../../../../ext/base64-arraybuffer/dist/base64-arraybuffer.es5.js';\n\nconst canvasVarMap = new Map();\r\nfunction variableListFor(ctx, ctor) {\r\n let contextMap = canvasVarMap.get(ctx);\r\n if (!contextMap) {\r\n contextMap = new Map();\r\n canvasVarMap.set(ctx, contextMap);\r\n }\r\n if (!contextMap.has(ctor)) {\r\n contextMap.set(ctor, []);\r\n }\r\n return contextMap.get(ctor);\r\n}\r\nconst saveWebGLVar = (value, win, ctx) => {\r\n if (!value ||\r\n !(isInstanceOfWebGLObject(value, win) || typeof value === 'object'))\r\n return;\r\n const name = value.constructor.name;\r\n const list = variableListFor(ctx, name);\r\n let index = list.indexOf(value);\r\n if (index === -1) {\r\n index = list.length;\r\n list.push(value);\r\n }\r\n return index;\r\n};\r\nfunction serializeArg(value, win, ctx) {\r\n if (value instanceof Array) {\r\n return value.map((arg) => serializeArg(arg, win, ctx));\r\n }\r\n else if (value === null) {\r\n return value;\r\n }\r\n else if (value instanceof Float32Array ||\r\n value instanceof Float64Array ||\r\n value instanceof Int32Array ||\r\n value instanceof Uint32Array ||\r\n value instanceof Uint8Array ||\r\n value instanceof Uint16Array ||\r\n value instanceof Int16Array ||\r\n value instanceof Int8Array ||\r\n value instanceof Uint8ClampedArray) {\r\n const name = value.constructor.name;\r\n return {\r\n rr_type: name,\r\n args: [Object.values(value)],\r\n };\r\n }\r\n else if (value instanceof ArrayBuffer) {\r\n const name = value.constructor.name;\r\n const base64 = encode(value);\r\n return {\r\n rr_type: name,\r\n base64,\r\n };\r\n }\r\n else if (value instanceof DataView) {\r\n const name = value.constructor.name;\r\n return {\r\n rr_type: name,\r\n args: [\r\n serializeArg(value.buffer, win, ctx),\r\n value.byteOffset,\r\n value.byteLength,\r\n ],\r\n };\r\n }\r\n else if (value instanceof HTMLImageElement) {\r\n const name = value.constructor.name;\r\n const { src } = value;\r\n return {\r\n rr_type: name,\r\n src,\r\n };\r\n }\r\n else if (value instanceof HTMLCanvasElement) {\r\n const name = 'HTMLImageElement';\r\n const src = value.toDataURL();\r\n return {\r\n rr_type: name,\r\n src,\r\n };\r\n }\r\n else if (value instanceof ImageData) {\r\n const name = value.constructor.name;\r\n return {\r\n rr_type: name,\r\n args: [serializeArg(value.data, win, ctx), value.width, value.height],\r\n };\r\n }\r\n else if (isInstanceOfWebGLObject(value, win) || typeof value === 'object') {\r\n const name = value.constructor.name;\r\n const index = saveWebGLVar(value, win, ctx);\r\n return {\r\n rr_type: name,\r\n index: index,\r\n };\r\n }\r\n return value;\r\n}\r\nconst serializeArgs = (args, win, ctx) => {\r\n return [...args].map((arg) => serializeArg(arg, win, ctx));\r\n};\r\nconst isInstanceOfWebGLObject = (value, win) => {\r\n const webGLConstructorNames = [\r\n 'WebGLActiveInfo',\r\n 'WebGLBuffer',\r\n 'WebGLFramebuffer',\r\n 'WebGLProgram',\r\n 'WebGLRenderbuffer',\r\n 'WebGLShader',\r\n 'WebGLShaderPrecisionFormat',\r\n 'WebGLTexture',\r\n 'WebGLUniformLocation',\r\n 'WebGLVertexArrayObject',\r\n 'WebGLVertexArrayObjectOES',\r\n ];\r\n const supportedWebGLConstructorNames = webGLConstructorNames.filter((name) => typeof win[name] === 'function');\r\n return Boolean(supportedWebGLConstructorNames.find((name) => value instanceof win[name]));\r\n};\n\nexport { isInstanceOfWebGLObject, saveWebGLVar, serializeArg, serializeArgs, variableListFor };\n","import { CanvasContext } from '../../../../../types/dist/types.js';\nimport { patch, isBlocked, hookSetter } from '../../../utils.js';\nimport { serializeArgs } from './serialize-args.js';\n\nfunction initCanvas2DMutationObserver(cb, win, blockClass, blockSelector) {\r\n const handlers = [];\r\n const props2D = Object.getOwnPropertyNames(win.CanvasRenderingContext2D.prototype);\r\n for (const prop of props2D) {\r\n try {\r\n if (typeof win.CanvasRenderingContext2D.prototype[prop] !== 'function') {\r\n continue;\r\n }\r\n const restoreHandler = patch(win.CanvasRenderingContext2D.prototype, prop, function (original) {\r\n return function (...args) {\r\n if (!isBlocked(this.canvas, blockClass, blockSelector, true)) {\r\n setTimeout(() => {\r\n const recordArgs = serializeArgs([...args], win, this);\r\n cb(this.canvas, {\r\n type: CanvasContext['2D'],\r\n property: prop,\r\n args: recordArgs,\r\n });\r\n }, 0);\r\n }\r\n return original.apply(this, args);\r\n };\r\n });\r\n handlers.push(restoreHandler);\r\n }\r\n catch (_a) {\r\n const hookHandler = hookSetter(win.CanvasRenderingContext2D.prototype, prop, {\r\n set(v) {\r\n cb(this.canvas, {\r\n type: CanvasContext['2D'],\r\n property: prop,\r\n args: [v],\r\n setter: true,\r\n });\r\n },\r\n });\r\n handlers.push(hookHandler);\r\n }\r\n }\r\n return () => {\r\n handlers.forEach((h) => h());\r\n };\r\n}\n\nexport { initCanvas2DMutationObserver as default };\n","import { patch, isBlocked } from '../../../utils.js';\n\nfunction initCanvasContextObserver(win, blockClass, blockSelector) {\r\n const handlers = [];\r\n try {\r\n const restoreHandler = patch(win.HTMLCanvasElement.prototype, 'getContext', function (original) {\r\n return function (contextType, ...args) {\r\n if (!isBlocked(this, blockClass, blockSelector, true)) {\r\n if (!('__context' in this))\r\n this.__context = contextType;\r\n }\r\n return original.apply(this, [contextType, ...args]);\r\n };\r\n });\r\n handlers.push(restoreHandler);\r\n }\r\n catch (_a) {\r\n console.error('failed to patch HTMLCanvasElement.prototype.getContext');\r\n }\r\n return () => {\r\n handlers.forEach((h) => h());\r\n };\r\n}\n\nexport { initCanvasContextObserver as default };\n","import { CanvasContext } from '../../../../../types/dist/types.js';\nimport { patch, isBlocked, hookSetter } from '../../../utils.js';\nimport { saveWebGLVar, serializeArgs } from './serialize-args.js';\n\nfunction patchGLPrototype(prototype, type, cb, blockClass, blockSelector, mirror, win) {\r\n const handlers = [];\r\n const props = Object.getOwnPropertyNames(prototype);\r\n for (const prop of props) {\r\n if ([\r\n 'isContextLost',\r\n 'canvas',\r\n 'drawingBufferWidth',\r\n 'drawingBufferHeight',\r\n ].includes(prop)) {\r\n continue;\r\n }\r\n try {\r\n if (typeof prototype[prop] !== 'function') {\r\n continue;\r\n }\r\n const restoreHandler = patch(prototype, prop, function (original) {\r\n return function (...args) {\r\n const result = original.apply(this, args);\r\n saveWebGLVar(result, win, this);\r\n if (!isBlocked(this.canvas, blockClass, blockSelector, true)) {\r\n const recordArgs = serializeArgs([...args], win, this);\r\n const mutation = {\r\n type,\r\n property: prop,\r\n args: recordArgs,\r\n };\r\n cb(this.canvas, mutation);\r\n }\r\n return result;\r\n };\r\n });\r\n handlers.push(restoreHandler);\r\n }\r\n catch (_a) {\r\n const hookHandler = hookSetter(prototype, prop, {\r\n set(v) {\r\n cb(this.canvas, {\r\n type,\r\n property: prop,\r\n args: [v],\r\n setter: true,\r\n });\r\n },\r\n });\r\n handlers.push(hookHandler);\r\n }\r\n }\r\n return handlers;\r\n}\r\nfunction initCanvasWebGLMutationObserver(cb, win, blockClass, blockSelector, mirror) {\r\n const handlers = [];\r\n handlers.push(...patchGLPrototype(win.WebGLRenderingContext.prototype, CanvasContext.WebGL, cb, blockClass, blockSelector, mirror, win));\r\n if (typeof win.WebGL2RenderingContext !== 'undefined') {\r\n handlers.push(...patchGLPrototype(win.WebGL2RenderingContext.prototype, CanvasContext.WebGL2, cb, blockClass, blockSelector, mirror, win));\r\n }\r\n return () => {\r\n handlers.forEach((h) => h());\r\n };\r\n}\n\nexport { initCanvasWebGLMutationObserver as default };\n","var WorkerClass = null;\n\ntry {\n var WorkerThreads =\n typeof module !== 'undefined' && typeof module.require === 'function' && module.require('worker_threads') ||\n typeof __non_webpack_require__ === 'function' && __non_webpack_require__('worker_threads') ||\n typeof require === 'function' && require('worker_threads');\n WorkerClass = WorkerThreads.Worker;\n} catch(e) {} // eslint-disable-line\n\nexport { WorkerClass };\n","import { WorkerClass } from './_rollup-plugin-web-worker-loader__helper__node__WorkerClass.js';\n\nfunction decodeBase64(base64, enableUnicode) {\n return Buffer.from(base64, 'base64').toString(enableUnicode ? 'utf16' : 'utf8');\n}\n\nfunction createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {\n var sourcemap = sourcemapArg === undefined ? null : sourcemapArg;\n var enableUnicode = enableUnicodeArg === undefined ? false : enableUnicodeArg;\n var source = decodeBase64(base64, enableUnicode);\n var start = source.indexOf('\\n', 10) + 1;\n var body = source.substring(start) + (sourcemap ? '\\/\\/# sourceMappingURL=' + sourcemap : '');\n return function WorkerFactory(options) {\n return new WorkerClass(body, Object.assign({}, options, { eval: true }));\n };\n}\n\nexport { createBase64WorkerFactory };\n","function decodeBase64(base64, enableUnicode) {\n var binaryString = atob(base64);\n if (enableUnicode) {\n var binaryView = new Uint8Array(binaryString.length);\n for (var i = 0, n = binaryString.length; i < n; ++i) {\n binaryView[i] = binaryString.charCodeAt(i);\n }\n return String.fromCharCode.apply(null, new Uint16Array(binaryView.buffer));\n }\n return binaryString;\n}\n\nfunction createURL(base64, sourcemapArg, enableUnicodeArg) {\n var sourcemap = sourcemapArg === undefined ? null : sourcemapArg;\n var enableUnicode = enableUnicodeArg === undefined ? false : enableUnicodeArg;\n var source = decodeBase64(base64, enableUnicode);\n var start = source.indexOf('\\n', 10) + 1;\n var body = source.substring(start) + (sourcemap ? '\\/\\/# sourceMappingURL=' + sourcemap : '');\n var blob = new Blob([body], { type: 'application/javascript' });\n return URL.createObjectURL(blob);\n}\n\nfunction createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {\n var url;\n return function WorkerFactory(options) {\n url = url || createURL(base64, sourcemapArg, enableUnicodeArg);\n return new Worker(url, options);\n };\n}\n\nexport { createBase64WorkerFactory };\n","var kIsNodeJS = Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]';\n\nfunction isNodeJS() {\n return kIsNodeJS;\n}\n\nexport { isNodeJS };\n","import { createBase64WorkerFactory as createBase64WorkerFactory$1 } from './_rollup-plugin-web-worker-loader__helper__node__createBase64WorkerFactory.js';\nimport { createBase64WorkerFactory as createBase64WorkerFactory$2 } from './_rollup-plugin-web-worker-loader__helper__browser__createBase64WorkerFactory.js';\nimport { isNodeJS } from './_rollup-plugin-web-worker-loader__helper__auto__isNodeJS.js';\n\nfunction createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {\n if (isNodeJS()) {\n return createBase64WorkerFactory$1(base64, sourcemapArg, enableUnicodeArg);\n }\n return createBase64WorkerFactory$2(base64, sourcemapArg, enableUnicodeArg);\n}\n\nexport { createBase64WorkerFactory };\n","import { createBase64WorkerFactory } from './_rollup-plugin-web-worker-loader__helper__auto__createBase64WorkerFactory.js';\n\nvar WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLg0KDQogICAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55DQogICAgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLg0KDQogICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEgNCiAgICBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkNCiAgICBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsDQogICAgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NDQogICAgTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1INCiAgICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SDQogICAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4NCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQogICAgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikgew0KICAgICAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH0NCiAgICAgICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7DQogICAgICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9DQogICAgICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvclsidGhyb3ciXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9DQogICAgICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfQ0KICAgICAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpOw0KICAgICAgICB9KTsNCiAgICB9CgogICAgLyoKICAgICAqIGJhc2U2NC1hcnJheWJ1ZmZlciAxLjAuMSA8aHR0cHM6Ly9naXRodWIuY29tL25pa2xhc3ZoL2Jhc2U2NC1hcnJheWJ1ZmZlcj4KICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBOaWtsYXMgdm9uIEhlcnR6ZW4gPGh0dHBzOi8vaGVydHplbi5jb20+CiAgICAgKiBSZWxlYXNlZCB1bmRlciBNSVQgTGljZW5zZQogICAgICovCiAgICB2YXIgY2hhcnMgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyc7CiAgICAvLyBVc2UgYSBsb29rdXAgdGFibGUgdG8gZmluZCB0aGUgaW5kZXguCiAgICB2YXIgbG9va3VwID0gdHlwZW9mIFVpbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gW10gOiBuZXcgVWludDhBcnJheSgyNTYpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykgewogICAgICAgIGxvb2t1cFtjaGFycy5jaGFyQ29kZUF0KGkpXSA9IGk7CiAgICB9CiAgICB2YXIgZW5jb2RlID0gZnVuY3Rpb24gKGFycmF5YnVmZmVyKSB7CiAgICAgICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlidWZmZXIpLCBpLCBsZW4gPSBieXRlcy5sZW5ndGgsIGJhc2U2NCA9ICcnOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMykgewogICAgICAgICAgICBiYXNlNjQgKz0gY2hhcnNbYnl0ZXNbaV0gPj4gMl07CiAgICAgICAgICAgIGJhc2U2NCArPSBjaGFyc1soKGJ5dGVzW2ldICYgMykgPDwgNCkgfCAoYnl0ZXNbaSArIDFdID4+IDQpXTsKICAgICAgICAgICAgYmFzZTY0ICs9IGNoYXJzWygoYnl0ZXNbaSArIDFdICYgMTUpIDw8IDIpIHwgKGJ5dGVzW2kgKyAyXSA+PiA2KV07CiAgICAgICAgICAgIGJhc2U2NCArPSBjaGFyc1tieXRlc1tpICsgMl0gJiA2M107CiAgICAgICAgfQogICAgICAgIGlmIChsZW4gJSAzID09PSAyKSB7CiAgICAgICAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDEpICsgJz0nOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChsZW4gJSAzID09PSAxKSB7CiAgICAgICAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDIpICsgJz09JzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJhc2U2NDsKICAgIH07CgogICAgY29uc3QgbGFzdEJsb2JNYXAgPSBuZXcgTWFwKCk7DQogICAgY29uc3QgdHJhbnNwYXJlbnRCbG9iTWFwID0gbmV3IE1hcCgpOw0KICAgIGZ1bmN0aW9uIGdldFRyYW5zcGFyZW50QmxvYkZvcih3aWR0aCwgaGVpZ2h0LCBkYXRhVVJMT3B0aW9ucykgew0KICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgew0KICAgICAgICAgICAgY29uc3QgaWQgPSBgJHt3aWR0aH0tJHtoZWlnaHR9YDsNCiAgICAgICAgICAgIGlmICgnT2Zmc2NyZWVuQ2FudmFzJyBpbiBnbG9iYWxUaGlzKSB7DQogICAgICAgICAgICAgICAgaWYgKHRyYW5zcGFyZW50QmxvYk1hcC5oYXMoaWQpKQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNwYXJlbnRCbG9iTWFwLmdldChpZCk7DQogICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2NyZWVuID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh3aWR0aCwgaGVpZ2h0KTsNCiAgICAgICAgICAgICAgICBvZmZzY3JlZW4uZ2V0Q29udGV4dCgnMmQnKTsNCiAgICAgICAgICAgICAgICBjb25zdCBibG9iID0geWllbGQgb2Zmc2NyZWVuLmNvbnZlcnRUb0Jsb2IoZGF0YVVSTE9wdGlvbnMpOw0KICAgICAgICAgICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0geWllbGQgYmxvYi5hcnJheUJ1ZmZlcigpOw0KICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U2NCA9IGVuY29kZShhcnJheUJ1ZmZlcik7DQogICAgICAgICAgICAgICAgdHJhbnNwYXJlbnRCbG9iTWFwLnNldChpZCwgYmFzZTY0KTsNCiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZTY0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICcnOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICB9DQogICAgY29uc3Qgd29ya2VyID0gc2VsZjsNCiAgICB3b3JrZXIub25tZXNzYWdlID0gZnVuY3Rpb24gKGUpIHsNCiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsNCiAgICAgICAgICAgIGlmICgnT2Zmc2NyZWVuQ2FudmFzJyBpbiBnbG9iYWxUaGlzKSB7DQogICAgICAgICAgICAgICAgY29uc3QgeyBpZCwgYml0bWFwLCB3aWR0aCwgaGVpZ2h0LCBkYXRhVVJMT3B0aW9ucyB9ID0gZS5kYXRhOw0KICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zcGFyZW50QmFzZTY0ID0gZ2V0VHJhbnNwYXJlbnRCbG9iRm9yKHdpZHRoLCBoZWlnaHQsIGRhdGFVUkxPcHRpb25zKTsNCiAgICAgICAgICAgICAgICBjb25zdCBvZmZzY3JlZW4gPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKHdpZHRoLCBoZWlnaHQpOw0KICAgICAgICAgICAgICAgIGNvbnN0IGN0eCA9IG9mZnNjcmVlbi5nZXRDb250ZXh0KCcyZCcpOw0KICAgICAgICAgICAgICAgIGN0eC5kcmF3SW1hZ2UoYml0bWFwLCAwLCAwKTsNCiAgICAgICAgICAgICAgICBiaXRtYXAuY2xvc2UoKTsNCiAgICAgICAgICAgICAgICBjb25zdCBibG9iID0geWllbGQgb2Zmc2NyZWVuLmNvbnZlcnRUb0Jsb2IoZGF0YVVSTE9wdGlvbnMpOw0KICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBibG9iLnR5cGU7DQogICAgICAgICAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSB5aWVsZCBibG9iLmFycmF5QnVmZmVyKCk7DQogICAgICAgICAgICAgICAgY29uc3QgYmFzZTY0ID0gZW5jb2RlKGFycmF5QnVmZmVyKTsNCiAgICAgICAgICAgICAgICBpZiAoIWxhc3RCbG9iTWFwLmhhcyhpZCkgJiYgKHlpZWxkIHRyYW5zcGFyZW50QmFzZTY0KSA9PT0gYmFzZTY0KSB7DQogICAgICAgICAgICAgICAgICAgIGxhc3RCbG9iTWFwLnNldChpZCwgYmFzZTY0KTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdvcmtlci5wb3N0TWVzc2FnZSh7IGlkIH0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAobGFzdEJsb2JNYXAuZ2V0KGlkKSA9PT0gYmFzZTY0KQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gd29ya2VyLnBvc3RNZXNzYWdlKHsgaWQgfSk7DQogICAgICAgICAgICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHsNCiAgICAgICAgICAgICAgICAgICAgaWQsDQogICAgICAgICAgICAgICAgICAgIHR5cGUsDQogICAgICAgICAgICAgICAgICAgIGJhc2U2NCwNCiAgICAgICAgICAgICAgICAgICAgd2lkdGgsDQogICAgICAgICAgICAgICAgICAgIGhlaWdodCwNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICBsYXN0QmxvYk1hcC5zZXQoaWQsIGJhc2U2NCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gd29ya2VyLnBvc3RNZXNzYWdlKHsgaWQ6IGUuZGF0YS5pZCB9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgfTsKCn0pKCk7Cgo=', null, false);\n/* eslint-enable */\n\nexport { WorkerFactory as default };\n","import { __rest, __awaiter } from './../../../../../../ext/tslib/tslib.es6.js';\nimport { isBlocked } from '../../../utils.js';\nimport { CanvasContext } from '../../../../../types/dist/types.js';\nimport initCanvas2DMutationObserver from './2d.js';\nimport initCanvasContextObserver from './canvas.js';\nimport initCanvasWebGLMutationObserver from './webgl.js';\nimport WorkerFactory from '../../../../../../_virtual/image-bitmap-data-url-worker.js';\n\nclass CanvasManager {\r\n constructor(options) {\r\n this.pendingCanvasMutations = new Map();\r\n this.rafStamps = { latestId: 0, invokeId: null };\r\n this.frozen = false;\r\n this.locked = false;\r\n this.processMutation = (target, mutation) => {\r\n const newFrame = this.rafStamps.invokeId &&\r\n this.rafStamps.latestId !== this.rafStamps.invokeId;\r\n if (newFrame || !this.rafStamps.invokeId)\r\n this.rafStamps.invokeId = this.rafStamps.latestId;\r\n if (!this.pendingCanvasMutations.has(target)) {\r\n this.pendingCanvasMutations.set(target, []);\r\n }\r\n this.pendingCanvasMutations.get(target).push(mutation);\r\n };\r\n const { sampling = 'all', win, blockClass, blockSelector, recordCanvas, dataURLOptions, } = options;\r\n this.mutationCb = options.mutationCb;\r\n this.mirror = options.mirror;\r\n if (recordCanvas && sampling === 'all')\r\n this.initCanvasMutationObserver(win, blockClass, blockSelector);\r\n if (recordCanvas && typeof sampling === 'number')\r\n this.initCanvasFPSObserver(sampling, win, blockClass, blockSelector, {\r\n dataURLOptions,\r\n });\r\n }\r\n reset() {\r\n this.pendingCanvasMutations.clear();\r\n this.resetObservers && this.resetObservers();\r\n }\r\n freeze() {\r\n this.frozen = true;\r\n }\r\n unfreeze() {\r\n this.frozen = false;\r\n }\r\n lock() {\r\n this.locked = true;\r\n }\r\n unlock() {\r\n this.locked = false;\r\n }\r\n initCanvasFPSObserver(fps, win, blockClass, blockSelector, options) {\r\n const canvasContextReset = initCanvasContextObserver(win, blockClass, blockSelector);\r\n const snapshotInProgressMap = new Map();\r\n const worker = new WorkerFactory();\r\n worker.onmessage = (e) => {\r\n const { id } = e.data;\r\n snapshotInProgressMap.set(id, false);\r\n if (!('base64' in e.data))\r\n return;\r\n const { base64, type, width, height } = e.data;\r\n this.mutationCb({\r\n id,\r\n type: CanvasContext['2D'],\r\n commands: [\r\n {\r\n property: 'clearRect',\r\n args: [0, 0, width, height],\r\n },\r\n {\r\n property: 'drawImage',\r\n args: [\r\n {\r\n rr_type: 'ImageBitmap',\r\n args: [\r\n {\r\n rr_type: 'Blob',\r\n data: [{ rr_type: 'ArrayBuffer', base64 }],\r\n type,\r\n },\r\n ],\r\n },\r\n 0,\r\n 0,\r\n ],\r\n },\r\n ],\r\n });\r\n };\r\n const timeBetweenSnapshots = 1000 / fps;\r\n let lastSnapshotTime = 0;\r\n let rafId;\r\n const getCanvas = () => {\r\n const matchedCanvas = [];\r\n win.document.querySelectorAll('canvas').forEach((canvas) => {\r\n if (!isBlocked(canvas, blockClass, blockSelector, true)) {\r\n matchedCanvas.push(canvas);\r\n }\r\n });\r\n return matchedCanvas;\r\n };\r\n const takeCanvasSnapshots = (timestamp) => {\r\n if (lastSnapshotTime &&\r\n timestamp - lastSnapshotTime < timeBetweenSnapshots) {\r\n rafId = requestAnimationFrame(takeCanvasSnapshots);\r\n return;\r\n }\r\n lastSnapshotTime = timestamp;\r\n getCanvas()\r\n .forEach((canvas) => __awaiter(this, void 0, void 0, function* () {\r\n var _a;\r\n const id = this.mirror.getId(canvas);\r\n if (snapshotInProgressMap.get(id))\r\n return;\r\n snapshotInProgressMap.set(id, true);\r\n if (['webgl', 'webgl2'].includes(canvas.__context)) {\r\n const context = canvas.getContext(canvas.__context);\r\n if (((_a = context === null || context === void 0 ? void 0 : context.getContextAttributes()) === null || _a === void 0 ? void 0 : _a.preserveDrawingBuffer) === false) {\r\n context === null || context === void 0 ? void 0 : context.clear(context.COLOR_BUFFER_BIT);\r\n }\r\n }\r\n const bitmap = yield createImageBitmap(canvas);\r\n worker.postMessage({\r\n id,\r\n bitmap,\r\n width: canvas.width,\r\n height: canvas.height,\r\n dataURLOptions: options.dataURLOptions,\r\n }, [bitmap]);\r\n }));\r\n rafId = requestAnimationFrame(takeCanvasSnapshots);\r\n };\r\n rafId = requestAnimationFrame(takeCanvasSnapshots);\r\n this.resetObservers = () => {\r\n canvasContextReset();\r\n cancelAnimationFrame(rafId);\r\n };\r\n }\r\n initCanvasMutationObserver(win, blockClass, blockSelector) {\r\n this.startRAFTimestamping();\r\n this.startPendingCanvasMutationFlusher();\r\n const canvasContextReset = initCanvasContextObserver(win, blockClass, blockSelector);\r\n const canvas2DReset = initCanvas2DMutationObserver(this.processMutation.bind(this), win, blockClass, blockSelector);\r\n const canvasWebGL1and2Reset = initCanvasWebGLMutationObserver(this.processMutation.bind(this), win, blockClass, blockSelector, this.mirror);\r\n this.resetObservers = () => {\r\n canvasContextReset();\r\n canvas2DReset();\r\n canvasWebGL1and2Reset();\r\n };\r\n }\r\n startPendingCanvasMutationFlusher() {\r\n requestAnimationFrame(() => this.flushPendingCanvasMutations());\r\n }\r\n startRAFTimestamping() {\r\n const setLatestRAFTimestamp = (timestamp) => {\r\n this.rafStamps.latestId = timestamp;\r\n requestAnimationFrame(setLatestRAFTimestamp);\r\n };\r\n requestAnimationFrame(setLatestRAFTimestamp);\r\n }\r\n flushPendingCanvasMutations() {\r\n this.pendingCanvasMutations.forEach((values, canvas) => {\r\n const id = this.mirror.getId(canvas);\r\n this.flushPendingCanvasMutationFor(canvas, id);\r\n });\r\n requestAnimationFrame(() => this.flushPendingCanvasMutations());\r\n }\r\n flushPendingCanvasMutationFor(canvas, id) {\r\n if (this.frozen || this.locked) {\r\n return;\r\n }\r\n const valuesWithType = this.pendingCanvasMutations.get(canvas);\r\n if (!valuesWithType || id === -1)\r\n return;\r\n const values = valuesWithType.map((value) => {\r\n const rest = __rest(value, [\"type\"]);\r\n return rest;\r\n });\r\n const { type } = valuesWithType[0];\r\n this.mutationCb({ id, type, commands: values });\r\n this.pendingCanvasMutations.delete(canvas);\r\n }\r\n}\n\nexport { CanvasManager };\n","import { getCssRuleString } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\nimport { StyleSheetMirror } from '../utils.js';\n\nclass StylesheetManager {\r\n constructor(options) {\r\n this.trackedLinkElements = new WeakSet();\r\n this.styleMirror = new StyleSheetMirror();\r\n this.mutationCb = options.mutationCb;\r\n this.adoptedStyleSheetCb = options.adoptedStyleSheetCb;\r\n }\r\n attachLinkElement(linkEl, childSn) {\r\n if ('_cssText' in childSn.attributes)\r\n this.mutationCb({\r\n adds: [],\r\n removes: [],\r\n texts: [],\r\n attributes: [\r\n {\r\n id: childSn.id,\r\n attributes: childSn\r\n .attributes,\r\n },\r\n ],\r\n });\r\n this.trackLinkElement(linkEl);\r\n }\r\n trackLinkElement(linkEl) {\r\n if (this.trackedLinkElements.has(linkEl))\r\n return;\r\n this.trackedLinkElements.add(linkEl);\r\n this.trackStylesheetInLinkElement(linkEl);\r\n }\r\n adoptStyleSheets(sheets, hostId) {\r\n if (sheets.length === 0)\r\n return;\r\n const adoptedStyleSheetData = {\r\n id: hostId,\r\n styleIds: [],\r\n };\r\n const styles = [];\r\n for (const sheet of sheets) {\r\n let styleId;\r\n if (!this.styleMirror.has(sheet)) {\r\n styleId = this.styleMirror.add(sheet);\r\n const rules = Array.from(sheet.rules || CSSRule);\r\n styles.push({\r\n styleId,\r\n rules: rules.map((r, index) => {\r\n return {\r\n rule: getCssRuleString(r),\r\n index,\r\n };\r\n }),\r\n });\r\n }\r\n else\r\n styleId = this.styleMirror.getId(sheet);\r\n adoptedStyleSheetData.styleIds.push(styleId);\r\n }\r\n if (styles.length > 0)\r\n adoptedStyleSheetData.styles = styles;\r\n this.adoptedStyleSheetCb(adoptedStyleSheetData);\r\n }\r\n reset() {\r\n this.styleMirror.reset();\r\n this.trackedLinkElements = new WeakSet();\r\n }\r\n trackStylesheetInLinkElement(linkEl) {\r\n }\r\n}\n\nexport { StylesheetManager };\n","import { createMirror, snapshot } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\nimport { initObservers, mutationBuffers } from './observer.js';\nimport { polyfill, on, getWindowWidth, getWindowHeight, isSerializedIframe, isSerializedStylesheet, hasShadowRoot } from '../utils.js';\nimport { EventType, IncrementalSource } from '../../../types/dist/types.js';\nimport { IframeManager } from './iframe-manager.js';\nimport { ShadowDomManager } from './shadow-dom-manager.js';\nimport { CanvasManager } from './observers/canvas/canvas-manager.js';\nimport { StylesheetManager } from './stylesheet-manager.js';\n\nfunction wrapEvent(e) {\r\n return Object.assign(Object.assign({}, e), { timestamp: Date.now() });\r\n}\r\nlet wrappedEmit;\r\nlet takeFullSnapshot;\r\nlet canvasManager;\r\nlet recording = false;\r\nconst mirror = createMirror();\r\nfunction record(options = {}) {\r\n const { emit, checkoutEveryNms, checkoutEveryNth, blockClass = 'rr-block', blockSelector = null, ignoreClass = 'rr-ignore', maskTextClass = 'rr-mask', maskTextSelector = null, inlineStylesheet = true, maskAllInputs, maskInputOptions: _maskInputOptions, slimDOMOptions: _slimDOMOptions, maskInputFn, maskTextFn, hooks, packFn, sampling = {}, dataURLOptions = {}, mousemoveWait, recordCanvas = false, recordCrossOriginIframes = false, userTriggeredOnInput = false, collectFonts = false, inlineImages = false, plugins, keepIframeSrcFn = () => false, ignoreCSSAttributes = new Set([]), } = options;\r\n const inEmittingFrame = recordCrossOriginIframes\r\n ? window.parent === window\r\n : true;\r\n let passEmitsToParent = false;\r\n if (!inEmittingFrame) {\r\n try {\r\n window.parent.document;\r\n passEmitsToParent = false;\r\n }\r\n catch (e) {\r\n passEmitsToParent = true;\r\n }\r\n }\r\n if (inEmittingFrame && !emit) {\r\n throw new Error('emit function is required');\r\n }\r\n if (mousemoveWait !== undefined && sampling.mousemove === undefined) {\r\n sampling.mousemove = mousemoveWait;\r\n }\r\n mirror.reset();\r\n const maskInputOptions = maskAllInputs === true\r\n ? {\r\n color: true,\r\n date: true,\r\n 'datetime-local': true,\r\n email: true,\r\n month: true,\r\n number: true,\r\n range: true,\r\n search: true,\r\n tel: true,\r\n text: true,\r\n time: true,\r\n url: true,\r\n week: true,\r\n textarea: true,\r\n select: true,\r\n password: true,\r\n }\r\n : _maskInputOptions !== undefined\r\n ? _maskInputOptions\r\n : { password: true };\r\n const slimDOMOptions = _slimDOMOptions === true || _slimDOMOptions === 'all'\r\n ? {\r\n script: true,\r\n comment: true,\r\n headFavicon: true,\r\n headWhitespace: true,\r\n headMetaSocial: true,\r\n headMetaRobots: true,\r\n headMetaHttpEquiv: true,\r\n headMetaVerification: true,\r\n headMetaAuthorship: _slimDOMOptions === 'all',\r\n headMetaDescKeywords: _slimDOMOptions === 'all',\r\n }\r\n : _slimDOMOptions\r\n ? _slimDOMOptions\r\n : {};\r\n polyfill();\r\n let lastFullSnapshotEvent;\r\n let incrementalSnapshotCount = 0;\r\n const eventProcessor = (e) => {\r\n for (const plugin of plugins || []) {\r\n if (plugin.eventProcessor) {\r\n e = plugin.eventProcessor(e);\r\n }\r\n }\r\n if (packFn) {\r\n e = packFn(e);\r\n }\r\n return e;\r\n };\r\n wrappedEmit = (e, isCheckout) => {\r\n var _a;\r\n if (((_a = mutationBuffers[0]) === null || _a === void 0 ? void 0 : _a.isFrozen()) &&\r\n e.type !== EventType.FullSnapshot &&\r\n !(e.type === EventType.IncrementalSnapshot &&\r\n e.data.source === IncrementalSource.Mutation)) {\r\n mutationBuffers.forEach((buf) => buf.unfreeze());\r\n }\r\n if (inEmittingFrame) {\r\n emit === null || emit === void 0 ? void 0 : emit(eventProcessor(e), isCheckout);\r\n }\r\n else if (passEmitsToParent) {\r\n const message = {\r\n type: 'rrweb',\r\n event: eventProcessor(e),\r\n isCheckout,\r\n };\r\n window.parent.postMessage(message, '*');\r\n }\r\n if (e.type === EventType.FullSnapshot) {\r\n lastFullSnapshotEvent = e;\r\n incrementalSnapshotCount = 0;\r\n }\r\n else if (e.type === EventType.IncrementalSnapshot) {\r\n if (e.data.source === IncrementalSource.Mutation &&\r\n e.data.isAttachIframe) {\r\n return;\r\n }\r\n incrementalSnapshotCount++;\r\n const exceedCount = checkoutEveryNth && incrementalSnapshotCount >= checkoutEveryNth;\r\n const exceedTime = checkoutEveryNms &&\r\n e.timestamp - lastFullSnapshotEvent.timestamp > checkoutEveryNms;\r\n if (exceedCount || exceedTime) {\r\n takeFullSnapshot(true);\r\n }\r\n }\r\n };\r\n const wrappedMutationEmit = (m) => {\r\n wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.Mutation }, m),\r\n }));\r\n };\r\n const wrappedScrollEmit = (p) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.Scroll }, p),\r\n }));\r\n const wrappedCanvasMutationEmit = (p) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.CanvasMutation }, p),\r\n }));\r\n const wrappedAdoptedStyleSheetEmit = (a) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.AdoptedStyleSheet }, a),\r\n }));\r\n const stylesheetManager = new StylesheetManager({\r\n mutationCb: wrappedMutationEmit,\r\n adoptedStyleSheetCb: wrappedAdoptedStyleSheetEmit,\r\n });\r\n const iframeManager = new IframeManager({\r\n mirror,\r\n mutationCb: wrappedMutationEmit,\r\n stylesheetManager: stylesheetManager,\r\n recordCrossOriginIframes,\r\n wrappedEmit,\r\n });\r\n for (const plugin of plugins || []) {\r\n if (plugin.getMirror)\r\n plugin.getMirror({\r\n nodeMirror: mirror,\r\n crossOriginIframeMirror: iframeManager.crossOriginIframeMirror,\r\n crossOriginIframeStyleMirror: iframeManager.crossOriginIframeStyleMirror,\r\n });\r\n }\r\n canvasManager = new CanvasManager({\r\n recordCanvas,\r\n mutationCb: wrappedCanvasMutationEmit,\r\n win: window,\r\n blockClass,\r\n blockSelector,\r\n mirror,\r\n sampling: sampling.canvas,\r\n dataURLOptions,\r\n });\r\n const shadowDomManager = new ShadowDomManager({\r\n mutationCb: wrappedMutationEmit,\r\n scrollCb: wrappedScrollEmit,\r\n bypassOptions: {\r\n blockClass,\r\n blockSelector,\r\n maskTextClass,\r\n maskTextSelector,\r\n inlineStylesheet,\r\n maskInputOptions,\r\n dataURLOptions,\r\n maskTextFn,\r\n maskInputFn,\r\n recordCanvas,\r\n inlineImages,\r\n sampling,\r\n slimDOMOptions,\r\n iframeManager,\r\n stylesheetManager,\r\n canvasManager,\r\n keepIframeSrcFn,\r\n },\r\n mirror,\r\n });\r\n takeFullSnapshot = (isCheckout = false) => {\r\n var _a, _b, _c, _d, _e, _f;\r\n wrappedEmit(wrapEvent({\r\n type: EventType.Meta,\r\n data: {\r\n href: window.location.href,\r\n width: getWindowWidth(),\r\n height: getWindowHeight(),\r\n },\r\n }), isCheckout);\r\n stylesheetManager.reset();\r\n mutationBuffers.forEach((buf) => buf.lock());\r\n const node = snapshot(document, {\r\n mirror,\r\n blockClass,\r\n blockSelector,\r\n maskTextClass,\r\n maskTextSelector,\r\n inlineStylesheet,\r\n maskAllInputs: maskInputOptions,\r\n maskTextFn,\r\n slimDOM: slimDOMOptions,\r\n dataURLOptions,\r\n recordCanvas,\r\n inlineImages,\r\n onSerialize: (n) => {\r\n if (isSerializedIframe(n, mirror)) {\r\n iframeManager.addIframe(n);\r\n }\r\n if (isSerializedStylesheet(n, mirror)) {\r\n stylesheetManager.trackLinkElement(n);\r\n }\r\n if (hasShadowRoot(n)) {\r\n shadowDomManager.addShadowRoot(n.shadowRoot, document);\r\n }\r\n },\r\n onIframeLoad: (iframe, childSn) => {\r\n iframeManager.attachIframe(iframe, childSn);\r\n shadowDomManager.observeAttachShadow(iframe);\r\n },\r\n onStylesheetLoad: (linkEl, childSn) => {\r\n stylesheetManager.attachLinkElement(linkEl, childSn);\r\n },\r\n keepIframeSrcFn,\r\n });\r\n if (!node) {\r\n return console.warn('Failed to snapshot the document');\r\n }\r\n wrappedEmit(wrapEvent({\r\n type: EventType.FullSnapshot,\r\n data: {\r\n node,\r\n initialOffset: {\r\n left: window.pageXOffset !== undefined\r\n ? window.pageXOffset\r\n : (document === null || document === void 0 ? void 0 : document.documentElement.scrollLeft) ||\r\n ((_b = (_a = document === null || document === void 0 ? void 0 : document.body) === null || _a === void 0 ? void 0 : _a.parentElement) === null || _b === void 0 ? void 0 : _b.scrollLeft) ||\r\n ((_c = document === null || document === void 0 ? void 0 : document.body) === null || _c === void 0 ? void 0 : _c.scrollLeft) ||\r\n 0,\r\n top: window.pageYOffset !== undefined\r\n ? window.pageYOffset\r\n : (document === null || document === void 0 ? void 0 : document.documentElement.scrollTop) ||\r\n ((_e = (_d = document === null || document === void 0 ? void 0 : document.body) === null || _d === void 0 ? void 0 : _d.parentElement) === null || _e === void 0 ? void 0 : _e.scrollTop) ||\r\n ((_f = document === null || document === void 0 ? void 0 : document.body) === null || _f === void 0 ? void 0 : _f.scrollTop) ||\r\n 0,\r\n },\r\n },\r\n }));\r\n mutationBuffers.forEach((buf) => buf.unlock());\r\n if (document.adoptedStyleSheets && document.adoptedStyleSheets.length > 0)\r\n stylesheetManager.adoptStyleSheets(document.adoptedStyleSheets, mirror.getId(document));\r\n };\r\n try {\r\n const handlers = [];\r\n handlers.push(on('DOMContentLoaded', () => {\r\n wrappedEmit(wrapEvent({\r\n type: EventType.DomContentLoaded,\r\n data: {},\r\n }));\r\n }));\r\n const observe = (doc) => {\r\n var _a;\r\n return initObservers({\r\n mutationCb: wrappedMutationEmit,\r\n mousemoveCb: (positions, source) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: {\r\n source,\r\n positions,\r\n },\r\n })),\r\n mouseInteractionCb: (d) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.MouseInteraction }, d),\r\n })),\r\n scrollCb: wrappedScrollEmit,\r\n viewportResizeCb: (d) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.ViewportResize }, d),\r\n })),\r\n inputCb: (v) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.Input }, v),\r\n })),\r\n mediaInteractionCb: (p) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.MediaInteraction }, p),\r\n })),\r\n styleSheetRuleCb: (r) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.StyleSheetRule }, r),\r\n })),\r\n styleDeclarationCb: (r) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.StyleDeclaration }, r),\r\n })),\r\n canvasMutationCb: wrappedCanvasMutationEmit,\r\n fontCb: (p) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.Font }, p),\r\n })),\r\n selectionCb: (p) => {\r\n wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.Selection }, p),\r\n }));\r\n },\r\n blockClass,\r\n ignoreClass,\r\n maskTextClass,\r\n maskTextSelector,\r\n maskInputOptions,\r\n inlineStylesheet,\r\n sampling,\r\n recordCanvas,\r\n inlineImages,\r\n userTriggeredOnInput,\r\n collectFonts,\r\n doc,\r\n maskInputFn,\r\n maskTextFn,\r\n keepIframeSrcFn,\r\n blockSelector,\r\n slimDOMOptions,\r\n dataURLOptions,\r\n mirror,\r\n iframeManager,\r\n stylesheetManager,\r\n shadowDomManager,\r\n canvasManager,\r\n ignoreCSSAttributes,\r\n plugins: ((_a = plugins === null || plugins === void 0 ? void 0 : plugins.filter((p) => p.observer)) === null || _a === void 0 ? void 0 : _a.map((p) => ({\r\n observer: p.observer,\r\n options: p.options,\r\n callback: (payload) => wrappedEmit(wrapEvent({\r\n type: EventType.Plugin,\r\n data: {\r\n plugin: p.name,\r\n payload,\r\n },\r\n })),\r\n }))) || [],\r\n }, hooks);\r\n };\r\n iframeManager.addLoadListener((iframeEl) => {\r\n handlers.push(observe(iframeEl.contentDocument));\r\n });\r\n const init = () => {\r\n takeFullSnapshot();\r\n handlers.push(observe(document));\r\n recording = true;\r\n };\r\n if (document.readyState === 'interactive' ||\r\n document.readyState === 'complete') {\r\n init();\r\n }\r\n else {\r\n handlers.push(on('load', () => {\r\n wrappedEmit(wrapEvent({\r\n type: EventType.Load,\r\n data: {},\r\n }));\r\n init();\r\n }, window));\r\n }\r\n return () => {\r\n handlers.forEach((h) => h());\r\n recording = false;\r\n };\r\n }\r\n catch (error) {\r\n console.warn(error);\r\n }\r\n}\r\nrecord.addCustomEvent = (tag, payload) => {\r\n if (!recording) {\r\n throw new Error('please add custom event after start recording');\r\n }\r\n wrappedEmit(wrapEvent({\r\n type: EventType.Custom,\r\n data: {\r\n tag,\r\n payload,\r\n },\r\n }));\r\n};\r\nrecord.freezePage = () => {\r\n mutationBuffers.forEach((buf) => buf.freeze());\r\n};\r\nrecord.takeFullSnapshot = (isCheckout) => {\r\n if (!recording) {\r\n throw new Error('please take full snapshot after start recording');\r\n }\r\n takeFullSnapshot(isCheckout);\r\n};\r\nrecord.mirror = mirror;\n\nexport { record as default };\n","import type { RecordedEvent } from './transport.js';\n\n/**\n * Making a recording carry the files a page loaded from inside an app.\n *\n * A website's replay loads its stylesheets, fonts and images from the site,\n * later, in the reviewer's browser: the snapshot records `https://shop.com/\n * logo.png` and the dashboard asks shop.com for it. That is `'reference'`, and\n * it is right for anything on a public origin.\n *\n * A page inside an app has no such origin. Capacitor serves the app from\n * `capacitor://localhost` (iOS) or `https://localhost` (Android), Cordova from\n * `app://localhost`, `https://localhost` or `file://`, Ionic's older shells\n * from `ionic://localhost`, Tauri from `tauri://localhost`, Electron often from\n * `file://`. Those addresses mean \"inside this phone\" — no reviewer can load\n * them — so the replay came out as bare HTML.\n *\n * `'inline'` makes the recording carry what it needs instead:\n *\n * - **Stylesheets** were already inside it: rrweb copies every readable\n * stylesheet into the snapshot as text (`inlineStylesheet`, on in both\n * modes), and an app's own CSS is always readable.\n * - **Images** (PNG, JPEG, GIF, WebP) are uploaded once per project by\n * content hash through the same routes the native SDKs use (contract §9),\n * at most 3 MB each, and the session says which file stood at which URL.\n * - **Fonts** (WOFF2, WOFF, TTF, OTF) and **SVG images** cannot be uploaded —\n * ingest stores raster images only — so they travel inside the recording as\n * `data:` URLs, each in its own event, under a per-file cap and a per-page\n * budget that keep every chunk inside the transport's 256 KB target.\n *\n * In both cases the recording keeps the original URL wherever the page used\n * it, and an `anyreplay.asset` custom event maps that URL to the uploaded\n * hash or to the inline data. The dashboard's player rewrites those URLs\n * before it builds the replay. Nothing in the DOM snapshot is changed, so a\n * recording made with this on replays exactly as before in a player that does\n * not know about it — unstyled, as it always was.\n *\n * Only the app's own files are read: URLs under the page's own origin (for\n * `file://`, under the page's own folder). Capacitor's and Cordova's bridges\n * to the device's files (`/_capacitor_file_/…`, `/__cdvfile_…`) are excluded\n * by path, because what they serve is the user's photos and downloads, not\n * the app. Anything that fails — a fetch, an upload, a cap — leaves that one\n * file as it was: missing from the replay, and nothing else.\n */\n\nexport type AssetMode = 'reference' | 'inline';\n\n/** The custom event that maps a URL the page used to the file that was there. */\nexport const ASSET_TAG = 'anyreplay.asset';\n\n/** `{ url, sha256 }` for an uploaded image, `{ url, data }` for a file carried inline. */\nexport type AssetPayload = { url: string; sha256: string } | { url: string; data: string };\n\nexport interface AssetLimits {\n /** An image larger than this is not uploaded (ingest's own limit). */\n maxImageBytes: number;\n /** A font larger than this is not carried inline. */\n maxFontBytes: number;\n /** An SVG larger than this is not carried inline. */\n maxSvgBytes: number;\n /** All inline files of one page together, before base64. */\n inlineBudgetBytes: number;\n /** Distinct URLs looked at per page; anything after is left as it is. */\n maxUrls: number;\n}\n\n/**\n * The caps, and why each is what it is.\n *\n * A font of 160 KB is 214 KB as base64: alone in its chunk with the envelope\n * it stays under the transport's 256 KB target, so no chunk is ever built\n * around something ingest could refuse. Almost every WOFF2 an app ships is\n * well under it; an icon font or a CJK font that is not is left out, and the\n * replay falls back to the next font in the stack. One megabyte across a page\n * is about six fonts and a few icons, which is more than an app uses, and\n * small enough that a page with a hundred SVG icons does not turn its first\n * minute into a download.\n */\nexport const ASSET_LIMITS: AssetLimits = {\n maxImageBytes: 3 * 1024 * 1024,\n maxFontBytes: 160 * 1024,\n maxSvgBytes: 48 * 1024,\n inlineBudgetBytes: 1024 * 1024,\n maxUrls: 300,\n};\n\ninterface LocationLike {\n protocol: string;\n host: string;\n hostname: string;\n pathname: string;\n}\n\n/**\n * What `assets` is when the page does not say.\n *\n * `'inline'` for any scheme that is not `http:` or `https:` — `capacitor:`,\n * `ionic:`, `app:`, `tauri:`, `file:` and whatever a shell invents next. No\n * website is served that way, so nobody outside the device could load the\n * page's own files.\n *\n * `'reference'` for every `http(s)` page, `localhost` included. A developer\n * trying their website on `http://localhost:3000` should not upload its\n * images into the project's quota — the replay of a page on their own machine\n * loads fine on that machine. The shells that serve an app from an\n * `http(s)://localhost` address (Capacitor and Cordova on Android, Tauri on\n * Windows) say `'inline'` themselves: `@anyreplay/capacitor`,\n * `@anyreplay/cordova` and `@anyreplay/tauri` pass it, and so does\n * `@anyreplay/electron`.\n */\nexport function defaultAssetMode(loc: LocationLike | undefined = currentLocation()): AssetMode {\n if (!loc) return 'reference';\n const protocol = loc.protocol.toLowerCase();\n return protocol === 'http:' || protocol === 'https:' ? 'reference' : 'inline';\n}\n\n/**\n * The start every URL of the app's own files shares, or null when there is\n * nothing to look for.\n *\n * `scheme://host/` for anything with a host. For `file:` it is the page's own\n * folder: `file://` alone would match every file on the disk, and an Electron\n * app showing a document the user opened must not upload that document.\n */\nexport function localAssetPrefix(loc: LocationLike | undefined = currentLocation()): string | null {\n if (!loc) return null;\n const protocol = loc.protocol.toLowerCase();\n if (protocol === 'file:') {\n const folder = loc.pathname.slice(0, loc.pathname.lastIndexOf('/') + 1);\n return folder ? `file://${folder}` : null;\n }\n if (!loc.host) return null;\n return `${protocol}//${loc.host}/`;\n}\n\nfunction currentLocation(): LocationLike | undefined {\n try {\n return typeof location !== 'undefined' ? location : undefined;\n } catch {\n return undefined;\n }\n}\n\ntype Kind = { kind: 'image' } | { kind: 'inline'; mime: string; cap: keyof AssetLimits };\n\n/** What a URL is, from its extension. Anything not listed is left alone. */\nfunction classify(url: string): Kind | null {\n const path = url.split(/[?#]/, 1)[0]!.toLowerCase();\n const ext = path.slice(path.lastIndexOf('.') + 1);\n switch (ext) {\n case 'png': case 'jpg': case 'jpeg': case 'gif': case 'webp':\n return { kind: 'image' };\n case 'svg':\n return { kind: 'inline', mime: 'image/svg+xml', cap: 'maxSvgBytes' };\n case 'woff2': return { kind: 'inline', mime: 'font/woff2', cap: 'maxFontBytes' };\n case 'woff': return { kind: 'inline', mime: 'font/woff', cap: 'maxFontBytes' };\n case 'ttf': return { kind: 'inline', mime: 'font/ttf', cap: 'maxFontBytes' };\n case 'otf': return { kind: 'inline', mime: 'font/otf', cap: 'maxFontBytes' };\n default:\n return null;\n }\n}\n\n/**\n * The bridges Capacitor and Cordova put in front of the device's own files.\n * `Capacitor.convertFileSrc()` gives `/_capacitor_file_/…` (and\n * `_capacitor_content_` for Android content URIs); cordova-android's asset\n * loader serves `/__cdvfile_files__/…` and its siblings. Those are the user's\n * pictures, never the app's.\n */\nconst DEVICE_FILE_PATH = /^(_capacitor_|__cdvfile_)/;\n\n/** rrweb's event types and incremental sources that can carry a URL of the page's files. */\nconst EVENT_FULL_SNAPSHOT = 2;\nconst EVENT_INCREMENTAL = 3;\nconst SOURCES_WITH_URLS = new Set([\n 0, // Mutation: added nodes, changed attributes (`src`, `style`, `srcset`)\n 8, // StyleSheetRule: a rule inserted with insertRule\n 13, // StyleDeclaration: a property set through CSSOM\n 15, // AdoptedStyleSheet: constructed stylesheets (Ionic's web components)\n]);\n\nconst escapeRegExp = (text: string): string => text.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\nexport interface AssetCollectorDeps {\n /** From `localAssetPrefix`. */\n prefix: string;\n ingestUrl: string;\n projectKey: string;\n appId?: string;\n /** Hands an `anyreplay.asset` payload to the recording. */\n emit: (payload: AssetPayload) => void;\n /**\n * The `fetch` to read files and talk to ingest with. Taken before the\n * network diagnostics wrap the page's own, so reading the app's files does\n * not appear in the replay's network panel as if the app had done it.\n */\n fetch: typeof fetch;\n limits?: Partial<AssetLimits>;\n debug?: boolean;\n}\n\n/**\n * Finds the app's own files in what rrweb emits and makes each one available\n * to the replay, once per page.\n *\n * `scan` runs inside rrweb's emit and never waits: it only notes URLs. The\n * work — reading a file, hashing it, asking ingest, uploading — happens in the\n * background one file at a time, and the mapping is emitted when it is done.\n * The mapping can therefore land seconds after the snapshot that used the URL;\n * the player reads the whole session before it builds the replay, so order\n * does not matter. A recording must never stall on a network call.\n */\nexport class AssetCollector {\n private readonly limits: AssetLimits;\n private readonly pattern: RegExp;\n private readonly seen = new Set<string>();\n private readonly queue: string[] = [];\n /** Hashes ingest confirmed this page, so two URLs with the same bytes ask once. */\n private readonly confirmed = new Set<string>();\n private inlineSpent = 0;\n private running = false;\n private stopped = false;\n\n constructor(private readonly deps: AssetCollectorDeps) {\n this.limits = { ...ASSET_LIMITS, ...deps.limits };\n // Up to the first character that cannot be inside a URL in an attribute,\n // a srcset or a CSS `url(…)`. A URL with a comma or a parenthesis in its\n // path is missed; app bundlers do not produce those.\n this.pattern = new RegExp(`${escapeRegExp(deps.prefix)}[^\\\\s\"'()<>,\\\\\\\\]+`, 'g');\n }\n\n /** Notes every URL of the app's files in one event. Cheap when there are none. */\n scan(event: RecordedEvent): void {\n if (this.stopped) return;\n if (event.type === EVENT_FULL_SNAPSHOT) {\n this.walk(event.data, 0);\n } else if (event.type === EVENT_INCREMENTAL) {\n const source = (event.data as { source?: number } | undefined)?.source;\n if (source !== undefined && SOURCES_WITH_URLS.has(source)) this.walk(event.data, 0);\n }\n }\n\n stop(): void {\n this.stopped = true;\n this.queue.length = 0;\n }\n\n /** Resolves once everything queued so far has been handled. For tests. */\n async idle(): Promise<void> {\n while (this.running || this.queue.length > 0) await new Promise((resolve) => setTimeout(resolve, 1));\n }\n\n private walk(value: unknown, depth: number): void {\n // rrweb's trees are deep but not this deep; a cycle is not possible in\n // JSON-shaped events, the bound is only a guard against a pathological DOM.\n if (depth > 400 || value === null) return;\n if (typeof value === 'string') {\n if (value.length >= this.deps.prefix.length && value.includes(this.deps.prefix)) this.match(value);\n return;\n }\n if (typeof value !== 'object') return;\n if (Array.isArray(value)) {\n for (const item of value) this.walk(item, depth + 1);\n return;\n }\n for (const key in value as Record<string, unknown>) this.walk((value as Record<string, unknown>)[key], depth + 1);\n }\n\n private match(text: string): void {\n this.pattern.lastIndex = 0;\n for (const found of text.match(this.pattern) ?? []) {\n if (this.seen.has(found)) continue;\n if (this.seen.size >= this.limits.maxUrls) return;\n this.seen.add(found);\n if (DEVICE_FILE_PATH.test(found.slice(this.deps.prefix.length))) continue;\n if (!classify(found)) continue;\n this.queue.push(found);\n }\n if (this.queue.length > 0) void this.drain();\n }\n\n private async drain(): Promise<void> {\n if (this.running) return;\n this.running = true;\n try {\n while (this.queue.length > 0 && !this.stopped) {\n const url = this.queue.shift()!;\n try {\n const payload = await this.resolve(url);\n if (payload && !this.stopped) this.deps.emit(payload);\n } catch (error) {\n if (this.deps.debug) console.warn('[anyreplay] could not include', url, error);\n }\n }\n } finally {\n this.running = false;\n }\n }\n\n private async resolve(url: string): Promise<AssetPayload | null> {\n const kind = classify(url);\n if (!kind) return null;\n const response = await this.deps.fetch(url);\n if (!response.ok) return null;\n const bytes = new Uint8Array(await response.arrayBuffer());\n if (bytes.length === 0) return null;\n\n if (kind.kind === 'inline') {\n if (bytes.length > this.limits[kind.cap]) return this.skip(url, 'over its size cap');\n if (this.inlineSpent + bytes.length > this.limits.inlineBudgetBytes) return this.skip(url, 'over the page budget');\n this.inlineSpent += bytes.length;\n return { url, data: `data:${kind.mime};base64,${toBase64(bytes)}` };\n }\n\n if (bytes.length > this.limits.maxImageBytes) return this.skip(url, 'larger than 3 MB');\n const sha256 = await sha256Hex(bytes);\n if (this.confirmed.has(sha256) || await this.upload(sha256, bytes)) {\n this.confirmed.add(sha256);\n return { url, sha256 };\n }\n return null;\n }\n\n /** Contract §9: ask first, upload only what the project does not hold. */\n private async upload(sha256: string, bytes: Uint8Array): Promise<boolean> {\n const { ingestUrl, projectKey, appId } = this.deps;\n const app = appId ? { appId } : {};\n const post = (path: string, body: unknown): Promise<Response> => this.deps.fetch(`${ingestUrl}${path}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'omit',\n body: JSON.stringify(body),\n });\n\n const known = await post('/v1/ingest/assets/known', { projectKey, hashes: [sha256], ...app });\n if (!known.ok) {\n // Asking was refused, so uploading would be too, after sending the whole\n // file (found on a real Electron run with an app the project does not\n // list: every image went up only to come back 403). A 401 or 403 here is\n // about the key, the origin or the app, not this file: no later file\n // would fare better, so the rest are not read either.\n if (known.status === 401 || known.status === 403) this.stop();\n return false;\n }\n const answer = await known.json() as { known?: unknown };\n if (Array.isArray(answer.known) && answer.known.includes(sha256)) return true;\n // A 415 (not really an image), 413, 403 (quota) or 422 is an answer about\n // this file; it stays out of the replay and nothing is retried.\n const upload = await post('/v1/ingest/assets', { projectKey, sha256, data: toBase64(bytes), ...app });\n return upload.ok;\n }\n\n private skip(url: string, why: string): null {\n if (this.deps.debug) console.warn(`[anyreplay] not included in the replay (${why}): ${url}`);\n return null;\n }\n}\n\n/** Standard base64 with padding, in slices so a large file does not overflow the argument list. */\nexport function toBase64(bytes: Uint8Array): string {\n let binary = '';\n for (let i = 0; i < bytes.length; i += 0x8000) {\n binary += String.fromCharCode.apply(null, bytes.subarray(i, i + 0x8000) as unknown as number[]);\n }\n return btoa(binary);\n}\n\n/**\n * SHA-256 as 64 lowercase hex digits: the file's address in the project.\n *\n * WebCrypto where the page has it. Not every app's web view does —\n * `crypto.subtle` exists only in a secure context, and whether a custom\n * scheme such as `capacitor://` counts as one has differed between WebKit\n * releases — so a plain implementation follows, checked against Node's in\n * the tests.\n */\nexport async function sha256Hex(bytes: Uint8Array): Promise<string> {\n try {\n const subtle = typeof crypto !== 'undefined' ? crypto.subtle : undefined;\n if (subtle) {\n const digest = new Uint8Array(await subtle.digest('SHA-256', bytes));\n return Array.from(digest, (b) => b.toString(16).padStart(2, '0')).join('');\n }\n } catch {\n /* fall through to the plain implementation */\n }\n return sha256HexSync(bytes);\n}\n\nconst K = [\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n];\n\n/** The same algorithm as packages/recorder-native/src/assets.ts, which has no WebCrypto at all. */\nexport function sha256HexSync(bytes: Uint8Array): string {\n const length = bytes.length;\n const padded = new Uint8Array(((length + 9 + 63) >>> 6) << 6);\n padded.set(bytes);\n padded[length] = 0x80;\n const view = new DataView(padded.buffer);\n view.setUint32(padded.length - 8, Math.floor(length / 0x20000000));\n view.setUint32(padded.length - 4, (length << 3) >>> 0);\n\n const h = [0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19];\n const w = new Array<number>(64);\n const rotr = (x: number, n: number): number => (x >>> n) | (x << (32 - n));\n\n for (let offset = 0; offset < padded.length; offset += 64) {\n for (let i = 0; i < 16; i += 1) w[i] = view.getUint32(offset + i * 4);\n for (let i = 16; i < 64; i += 1) {\n const a = w[i - 15]!;\n const b = w[i - 2]!;\n w[i] = (w[i - 16]! + (rotr(a, 7) ^ rotr(a, 18) ^ (a >>> 3)) + w[i - 7]! + (rotr(b, 17) ^ rotr(b, 19) ^ (b >>> 10))) | 0;\n }\n let [a, b, c, d, e, f, g, hh] = h as [number, number, number, number, number, number, number, number];\n for (let i = 0; i < 64; i += 1) {\n const t1 = (hh + (rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25)) + ((e & f) ^ (~e & g)) + K[i]! + w[i]!) | 0;\n const t2 = ((rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22)) + ((a & b) ^ (a & c) ^ (b & c))) | 0;\n hh = g; g = f; f = e; e = (d + t1) | 0; d = c; c = b; b = a; a = (t1 + t2) | 0;\n }\n h[0] = (h[0]! + a) | 0; h[1] = (h[1]! + b) | 0; h[2] = (h[2]! + c) | 0; h[3] = (h[3]! + d) | 0;\n h[4] = (h[4]! + e) | 0; h[5] = (h[5]! + f) | 0; h[6] = (h[6]! + g) | 0; h[7] = (h[7]! + hh) | 0;\n }\n return h.map((x) => (x >>> 0).toString(16).padStart(8, '0')).join('');\n}\n","import { defaultAssetMode, type AssetMode } from './assets.js';\n\nexport interface AnyReplayOptions {\n /** Public project key from the dashboard. */\n projectKey: string;\n /** Ingest endpoint. Override only for self-hosted deployments. */\n ingestUrl?: string;\n /** Fraction of visitors recorded, 0–1. Decided once per visitor, not per page. */\n sampleRate?: number;\n /**\n * Mask the value of every form control.\n *\n * On by default: what a visitor types into an input or a textarea reaches a\n * recording as asterisks, so a replay shows a field being filled in without\n * showing what went into it. Set `maskAllInputs: false` to record typed\n * values instead — for a site whose forms are worth reading in a replay —\n * and mark the fields that should stay hidden with the `maskClass`.\n *\n * Some fields are masked whatever this says, in every mode, `false`\n * included: passwords, one-time codes, payment fields (card number, CVV,\n * expiry, IBAN, routing number, sort code), anything inside an element with\n * the mask class, and any value that looks like a card number. Email and\n * telephone fields are not on that list — they are ordinary fields, masked\n * by default and recorded when this is `false`. See `isSensitiveField` in\n * `masking.ts` for the exact list.\n *\n * Left out, the project decides: the page records masked until ingest\n * answers the first chunk with the project's stored choice (the setup\n * page's switch), and records typed values from then on if the project\n * chose to. Set either value here and the project's choice is not asked\n * for. See `applyProjectMasking` in `recorder.ts` and contract §6.2.\n */\n maskAllInputs?: boolean;\n /**\n * Mask everything a person types, wherever they type it.\n *\n * `maskAllInputs` covers form controls. This covers those *and* the other\n * place a person can type — an element with `contenteditable`, which is what\n * a rich-text editor, a comment box or a chat composer is made of. Their text\n * is not an input value but ordinary page text, so input masking does not\n * reach it. With this on, the text of every editable region is replaced with\n * asterisks in the first snapshot and in every change after it.\n *\n * The stricter of the two options, and a superset of it: `maskAllTyping: true`\n * masks form fields too, whatever `maskAllInputs` says. It is separate\n * because masking an editable region masks *all* of its text, including\n * whatever the page put there before anyone typed — a loaded document, a\n * quoted message — which is a bigger thing to ask for than hiding field\n * values.\n */\n maskAllTyping?: boolean;\n /** Elements with this class have their text masked. */\n maskClass?: string;\n /** Elements with this class are not recorded at all. */\n blockClass?: string;\n /** Wait for `anyreplay('consent', true)` before recording anything. */\n requireConsent?: boolean;\n /** Flush when the buffer reaches this many events. */\n maxEventsPerChunk?: number;\n /** Flush at least this often, in milliseconds. */\n flushIntervalMs?: number;\n /**\n * Stop recording after this many failed deliveries in a row (offline, a\n * timeout, `429`, `5xx`). `0`, the default, never stops: failed chunks are\n * kept (up to ten chunks' worth of events, oldest dropped first) and\n * retried with a backoff of 2 s doubling to a minute, and at once when the\n * browser comes back online or the tab becomes visible.\n */\n maxConsecutiveFailures?: number;\n /**\n * Record uncaught exceptions and unhandled rejections, with their stacks.\n *\n * On by default: a replay of a page that broke is worth far more with the\n * error beside it, and an exception is the page's own diagnostic rather than\n * anything a visitor typed. The message, the error name and the stack are\n * recorded; secrets, addresses and card-shaped numbers are taken out of all\n * three first (see `diagnostics.ts`).\n */\n recordErrors?: boolean;\n /**\n * Record `console.error` and `console.warn` calls.\n *\n * On by default, and the one stream here with no predictable contents: a\n * console line is whatever the page chose to print, which on some sites\n * includes data about the person using it. The same redaction runs over\n * every line, but a page that prints something it would not want a\n * teammate to read should turn this off. `log`, `info` and `debug` are\n * never recorded at any setting.\n */\n recordConsole?: boolean;\n /**\n * Record one entry per `fetch`/`XMLHttpRequest`: method, URL, status code\n * and duration.\n *\n * On by default. **No request or response body is ever recorded**, and no\n * headers — not a sampled copy, not a truncated one. The URL is redacted\n * before it is kept. Requests to the ingest endpoint are skipped.\n */\n recordNetwork?: boolean;\n /**\n * The most sessions this project may record per calendar month (UTC).\n *\n * Sent with the first chunk of every new session; ingest refuses a session\n * that would exceed it with 402 `session_cap_reached` and the recorder stops\n * for that visit. A cap set in the dashboard also applies, and the lower one\n * wins. Positive integer, at most 1,000,000.\n */\n maxSessionsPerMonth?: number;\n /**\n * The app this page runs inside, when it runs inside one: the bundle id or\n * package name of a Capacitor, Cordova or Electron app\n * (`com.example.shop`).\n *\n * Leave it out on a website. An app's web view has no real web origin —\n * `capacitor://localhost`, `https://localhost`, `file://` — so a project\n * that lists allowed domains refuses it; listing the same id under the\n * project's allowed apps, and passing it here, lets it record. Sent in\n * every request body, never as a header: a header would cost a CORS\n * preflight per request, and `sendBeacon` cannot send one.\n *\n * A filter, not a secret. Ingest ignores it on a request from a real\n * website, so it cannot open a web project's allow-list, and anyone holding\n * the public key can send any id from outside a browser.\n */\n appId?: string;\n /**\n * Whether the recording refers to the page's images and fonts by URL, or\n * carries them.\n *\n * `'reference'` records URLs, and the replay loads each file from where the\n * page did: right for a website, whose files anyone can load later.\n * `'inline'` is for a page whose files nobody else can load — an app's web\n * view (`capacitor://localhost`, `https://localhost`, `file://`) or a\n * desktop shell. Images the app ships are uploaded once per project by\n * content hash (PNG, JPEG, GIF, WebP, up to 3 MB each), and its fonts and\n * SVGs travel inside the recording (up to 160 KB per font, 48 KB per SVG and\n * 1 MB per page), so the replay looks like the app instead of bare HTML.\n * Stylesheets are copied into the recording in both modes.\n *\n * Leave it out and it is `'inline'` when the page is served from anything\n * other than `http:`/`https:`, or from `localhost`, `127.0.0.1`, `[::1]` or a\n * `*.localhost` host; `'reference'` everywhere else. Only files under the\n * page's own origin (for `file:`, its own folder) are ever read, and never\n * the device-file bridges Capacitor and Cordova serve user files through.\n * See `assets.ts`.\n */\n assets?: AssetMode;\n debug?: boolean;\n}\n\nexport interface ResolvedOptions extends Required<Omit<AnyReplayOptions, 'ingestUrl' | 'maxSessionsPerMonth' | 'appId' | 'assets'>> {\n /** Always decided: the page's choice, or what `defaultAssetMode` reads from its address. */\n assets: AssetMode;\n ingestUrl: string;\n maxSessionsPerMonth?: number;\n appId?: string;\n}\n\nexport const DEFAULTS: Omit<ResolvedOptions, 'projectKey' | 'assets'> = {\n ingestUrl: 'https://in.anyreplay.com',\n sampleRate: 1,\n // Form fields are masked unless the page opts out with `maskAllInputs:\n // false`. Editable regions are opt-in, because masking one hides all of its\n // text, not only what was typed. Neither option reaches the floor in\n // masking.ts — passwords, payment fields and the rest — which no option can\n // switch off.\n maskAllInputs: true,\n maskAllTyping: false,\n maskClass: 'ar-mask',\n blockClass: 'ar-block',\n requireConsent: false,\n maxEventsPerChunk: 200,\n flushIntervalMs: 5000,\n // Never: an outage is what the buffer is for. Set a number to give up instead.\n maxConsecutiveFailures: 0,\n // The three diagnostic streams. On, because \"why did it break\" is the\n // question a replay is opened to answer; each is a documented switch, and\n // what they can and cannot contain is in diagnostics.ts.\n recordErrors: true,\n recordConsole: true,\n recordNetwork: true,\n debug: false,\n};\n\nexport class ConfigError extends Error {}\n\nconst KEY_PATTERN = /^ar_pk_(live|test)_[0-9a-f]{24}$/;\n/** Matches what ingest's schema accepts, so a value that passes here is never a 422 later. */\nconst MAX_SESSION_CAP = 1_000_000;\n/** What ingest reads as an app id (`APP_ID_PATTERN` in the server's shared package). */\nconst APP_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]{1,254}$/;\n\nexport function resolveOptions(input: AnyReplayOptions): ResolvedOptions {\n if (!input || typeof input !== 'object') throw new ConfigError('anyreplay: options object required');\n if (!KEY_PATTERN.test(input.projectKey ?? '')) {\n throw new ConfigError('anyreplay: projectKey looks wrong — copy it from the dashboard');\n }\n\n const sampleRate = input.sampleRate ?? DEFAULTS.sampleRate;\n if (!(sampleRate >= 0 && sampleRate <= 1)) {\n throw new ConfigError('anyreplay: sampleRate must be between 0 and 1');\n }\n\n const cap = input.maxSessionsPerMonth;\n if (cap !== undefined && !(Number.isInteger(cap) && cap >= 1 && cap <= MAX_SESSION_CAP)) {\n throw new ConfigError(`anyreplay: maxSessionsPerMonth must be a whole number between 1 and ${MAX_SESSION_CAP}`);\n }\n\n const appId = input.appId?.trim();\n if (input.appId !== undefined && !(appId && APP_ID_PATTERN.test(appId))) {\n throw new ConfigError('anyreplay: appId should be an app identifier such as com.example.app');\n }\n\n let assets = input.assets;\n if (assets !== undefined && assets !== 'reference' && assets !== 'inline') {\n if (typeof console !== 'undefined') {\n console.warn(`[anyreplay] assets ignored: expected 'reference' or 'inline', got ${JSON.stringify(assets)}.`);\n }\n assets = undefined;\n }\n\n return {\n ...DEFAULTS,\n ...input,\n ...(appId ? { appId } : {}),\n assets: assets ?? defaultAssetMode(),\n projectKey: input.projectKey,\n sampleRate,\n ingestUrl: (input.ingestUrl ?? DEFAULTS.ingestUrl).replace(/\\/+$/, ''),\n maskAllInputs: readSwitch(input, 'maskAllInputs'),\n maskAllTyping: readSwitch(input, 'maskAllTyping'),\n recordErrors: readSwitch(input, 'recordErrors'),\n recordConsole: readSwitch(input, 'recordConsole'),\n recordNetwork: readSwitch(input, 'recordNetwork'),\n };\n}\n\n/**\n * Reads one masking switch, and says so out loud when it cannot.\n *\n * Only a real boolean is read: a string, a number or a typo is ignored rather\n * than guessed at, and the option keeps its default. This is the one place in\n * this file where being quiet would be the wrong thing — a tag manager that\n * hands over the string `\"true\"` for `maskAllTyping` would leave a customer\n * believing their editors were masked, and the string `\"false\"` for\n * `maskAllInputs` would leave one wondering why typed values never appear. So\n * the warning is not behind `debug`: whoever wrote the line needs to see it,\n * and they are not the person who set `debug`.\n */\ntype Switch = 'maskAllInputs' | 'maskAllTyping' | 'recordErrors' | 'recordConsole' | 'recordNetwork';\n\nfunction readSwitch(input: AnyReplayOptions, name: Switch): boolean {\n const value = input[name];\n if (typeof value === 'boolean') return value;\n if (value !== undefined && typeof console !== 'undefined') {\n // Whichever way the default points, a value that was meant to change it\n // and did not has to be said out loud.\n const consequence = name === 'maskAllInputs'\n ? 'Form fields stay masked, as by default.'\n : name === 'maskAllTyping'\n ? 'Nothing more is masked by this option.'\n : `${name.slice('record'.length)} are recorded, as by default.`;\n console.warn(`[anyreplay] ${name} ignored: expected true or false, got ${typeof value}. ${consequence}`);\n }\n return DEFAULTS[name];\n}\n","/**\n * What a recording may contain, and what it may never contain.\n *\n * Out of the box the recorder masks what a visitor types into a form control\n * (`maskAllInputs`, on by default). A page that wants typed values in its\n * replays opts out with `maskAllInputs: false`; `maskAllTyping` goes the other\n * way and masks every `contenteditable` region too. Underneath all of them\n * sits a floor this file defines: fields whose value never leaves the browser\n * in any configuration, because no support ticket is worth a password or a\n * card number sitting in a session replay.\n *\n * Why the floor is applied to the *events* rather than through rrweb's own\n * hooks: rrweb takes a `maskInputFn`, but the version we bundle calls it with\n * the value alone — `maskInputFn(text)` — on every path, snapshot included. A\n * function that cannot see the field cannot tell a card number from a search\n * box, so rrweb's masking can only ever be all-or-nothing by input type. What\n * rrweb does put in every payload is the node's id, and the full snapshot\n * carries each field's attributes. That is enough: `scrubEvent` re-reads every\n * event before the transport sees it and masks what the policy says must be\n * masked. Nothing unmasked is ever queued, let alone sent.\n */\n\n/** Same length, no characters — what rrweb itself writes for a masked value. */\nexport const maskValue = (text: string): string => '*'.repeat(text.length);\n\n/**\n * Every form field, masked — spelled out rather than using rrweb's\n * `maskAllInputs: true` shorthand.\n *\n * The shorthand builds a map keyed by input *type*, and the snapshot reads that\n * type from the `type` attribute rather than the element. An `<input>` written\n * without one — `<input name=\"city\" value=\"…\">`, the shape React apps produce —\n * therefore matched no key, and its **initial** value was serialised in the\n * clear even with masking on. What the visitor then typed into it was masked,\n * because the input observer reads `element.type`, which defaults to `text`;\n * only the value already in the markup leaked. The `input` key closes that: it\n * is matched on the tag name, which every input has. Radio buttons and\n * check boxes are untouched — both paths settle them by `checked` before any\n * value masking is considered.\n */\nexport const MASK_EVERY_FIELD: Record<string, boolean> = {\n color: true, date: true, 'datetime-local': true, email: true, month: true,\n number: true, range: true, search: true, tel: true, text: true, time: true,\n url: true, week: true, textarea: true, select: true, password: true,\n input: true,\n};\n\n/* ------------------------------------------------------------ the floor -- */\n\n/**\n * Autocomplete tokens that name a credential or a payment instrument.\n *\n * `autocomplete` is the one signal a browser itself acts on — it is what makes\n * a browser offer to fill in a card number — so a field carrying one of these\n * is that field, whatever else it is called.\n */\nconst SENSITIVE_AUTOCOMPLETE = new Set([\n 'cc-number', 'cc-csc', 'cc-exp', 'cc-exp-month', 'cc-exp-year', 'cc-name', 'cc-type',\n 'cc-given-name', 'cc-family-name', 'cc-additional-name',\n 'current-password', 'new-password', 'one-time-code',\n]);\n\n/**\n * How a payment field is named when nobody set `autocomplete`.\n *\n * Deliberately narrow: every match here is a field a customer can never see\n * again, so a false positive costs them a replay they wanted. Each alternative\n * needs a payment word — `card`, `cc`, `cvv` and friends, `iban`, a bank\n * routing number — and the boundaries keep `discard`, `scoreboard` and\n * `accounting` out of it.\n */\nconst PAYMENT_FIELD = new RegExp(\n '(?:credit|debit|payment)[\\\\s_-]*card'\n + '|card[\\\\s_-]*(?:number|num|no|nr|code|pin|cvv|cvc|csc)'\n + '|(?:^|[^a-z])cc[\\\\s_-]*(?:number|num|no|nr|csc|cvv|cvc|exp)'\n + '|(?:^|[^a-z])(?:cvv|cvc|cvn|csc)(?:[^a-z]|$)'\n + '|security[\\\\s_-]*code'\n + '|(?:^|[^a-z])iban(?:[^a-z]|$)'\n + '|routing[\\\\s_-]*number'\n + '|sort[\\\\s_-]*code',\n 'i',\n);\n\n/** How a credential field is named. Covers the \"show password\" toggle, which flips `type` to text. */\nconst CREDENTIAL_FIELD = /pass(?:word|wd|phrase)|(?:^|[^a-z])pwd(?:[^a-z]|$)|(?:^|[^a-z])otp(?:[^a-z]|$)|one[\\s_-]*time[\\s_-]*code/i;\n\n/**\n * Input types that are never recorded, whatever the options say.\n *\n * Only `password`. `type=\"email\"` and `type=\"tel\"` were here once, and are not\n * any more: an address and a phone number are ordinary contact details that a\n * sign-up form is mostly made of, and a replay of a sign-up nobody could finish\n * is worth nothing with both of them starred out. They are masked the way every\n * other ordinary field is — `maskAllInputs` (the default), `maskAllTyping`, or\n * the mask class on the field or anything around it — and recorded when a page\n * sets `maskAllInputs: false`.\n *\n * What stays is what a customer can never un-see: a credential, a one-time\n * code, a payment instrument. See the two patterns above and the Luhn check\n * below for the rest of it.\n */\nconst SENSITIVE_TYPES = new Set(['password']);\n\n/**\n * What rrweb itself masks when values are being recorded.\n *\n * Built from `SENSITIVE_TYPES` rather than written out a second time: rrweb's\n * masking is by input type, which is exactly the part of the floor a type can\n * express, and two hand-kept lists would eventually disagree about which one\n * the documentation describes. Everything else in the floor is applied by\n * `scrubEvent`, which can see the whole field.\n */\nexport const MASK_SENSITIVE_FIELDS: Record<string, boolean> = Object.fromEntries(\n [...SENSITIVE_TYPES].map((type) => [type, true]),\n);\n\n/** The attributes a field's purpose is written in, in practice. */\nconst NAMING_ATTRIBUTES = ['name', 'id', 'autocomplete', 'placeholder', 'aria-label', 'data-testid'];\n\n/** Reads one attribute of a field, whether it is a live element or a serialised node. */\ntype Attributes = (name: string) => string | null;\n\n/** The floor, decided from the attributes alone, so both callers get the same answer. */\nfunction isSensitiveByAttributes(read: Attributes, type: string): boolean {\n // rrweb's own marker, set by pages that toggle a password field to text.\n if (read('data-rr-is-password') !== null) return true;\n if (SENSITIVE_TYPES.has(type)) return true;\n\n const autocomplete = (read('autocomplete') ?? '').toLowerCase();\n // \"section-blue shipping cc-number\" — the meaning is in the last token, but\n // checking every token costs nothing and tolerates a hand-written value.\n for (const token of autocomplete.split(/\\s+/)) {\n if (SENSITIVE_AUTOCOMPLETE.has(token)) return true;\n }\n\n for (const attribute of NAMING_ATTRIBUTES) {\n const value = read(attribute);\n if (value && (PAYMENT_FIELD.test(value) || CREDENTIAL_FIELD.test(value))) return true;\n }\n return false;\n}\n\ntype MaybeElement = { getAttribute?: unknown } | null | undefined;\n\nconst asElement = (node: MaybeElement): Element | null =>\n node && typeof (node as Element).getAttribute === 'function' ? (node as Element) : null;\n\n/**\n * Is this live field one whose value never leaves the browser?\n *\n * Reads `element.type` rather than the attribute, so `<input>` with no type —\n * which is a text field — is judged as one.\n */\nexport function isSensitiveField(node: MaybeElement): boolean {\n const element = asElement(node);\n if (!element) return false;\n const type = ((element as HTMLInputElement).type || element.getAttribute('type') || '').toLowerCase();\n return isSensitiveByAttributes((name) => element.getAttribute(name), type);\n}\n\n/** The same question for a field as rrweb serialised it, where only the attributes exist. */\nfunction isSensitiveSerialised(attributes: Record<string, unknown>): boolean {\n const read: Attributes = (name) => (typeof attributes[name] === 'string' ? attributes[name] as string : null);\n return isSensitiveByAttributes(read, (read('type') ?? '').toLowerCase());\n}\n\n/**\n * Does this value look like a card number?\n *\n * The last line of defence, for the checkout that calls its field `field-2`\n * and sets no autocomplete. A card number is 13–19 digits and passes the Luhn\n * check, which one number in ten passes by chance — so an order number can be\n * caught by this, and that is the trade it makes: a masked order number is a\n * smaller loss than a recorded card number.\n */\nexport function looksLikeCardNumber(text: string): boolean {\n if (text.length < 13 || text.length > 24 || !/^[0-9][0-9 -]*[0-9]$/.test(text)) return false;\n const digits = text.replace(/[ -]/g, '');\n if (digits.length < 13 || digits.length > 19) return false;\n\n let sum = 0;\n let double = false;\n for (let i = digits.length - 1; i >= 0; i -= 1) {\n let digit = digits.charCodeAt(i) - 48;\n if (double) {\n digit *= 2;\n if (digit > 9) digit -= 9;\n }\n sum += digit;\n double = !double;\n }\n return sum % 10 === 0;\n}\n\n/**\n * Could this be a card number being typed?\n *\n * `looksLikeCardNumber` judges a whole number, and a person types one digit at\n * a time: every keystroke is an input event of its own, so a field named\n * nothing in particular sent `4`, `42`, … up to twelve or thirteen digits in\n * the clear before the value was long enough to pass the Luhn check (found on\n * a real Electron run). A value is therefore also masked while it could still\n * become one: digits only (spaces and dashes allowed), more than six of them —\n * the first six identify the issuer, not the card, and are what a receipt may\n * print — at most nineteen, and starting 2–6, where every card network's\n * numbers start.\n *\n * Telephone numbers written the way most of the world writes them (a leading\n * `0` or `+`, or in groups shorter than a card's), dates, quantities and\n * postcodes stay recorded; a run of seven or more digits starting 2–6 — an\n * order number, a phone number typed without a break — is masked, the same\n * trade `looksLikeCardNumber` makes.\n */\nexport function mayBecomeCardNumber(text: string): boolean {\n if (!/^[2-6][0-9 -]*$/.test(text)) return false;\n const groups = text.split(/[ -]+/);\n // Cards are grouped 4-4-4-4 or 4-6-5; a date (2026-09-18) or a telephone\n // number written in groups (415-555-0100, 532 123 45 67) has a shorter one.\n if (groups.slice(0, -1).some((group) => group.length < 4)) return false;\n const digits = groups.join('').length;\n return digits > 6 && digits <= 19;\n}\n\n/**\n * Has the customer marked this field, or something around it, with the mask\n * class?\n *\n * rrweb's `maskTextClass` reaches text nodes only — an `<input>` has none, so\n * `class=\"ar-mask\"` on a field did nothing to its value. This closes that: the\n * class means the same thing on a field as it does on a paragraph.\n */\nfunction isMarkedByCustomer(node: MaybeElement, maskClass: string): boolean {\n let element = asElement(node);\n while (element) {\n if (element.classList?.contains(maskClass)) return true;\n element = element.parentElement;\n }\n return false;\n}\n\nconst hasClass = (attributes: Record<string, unknown>, maskClass: string): boolean =>\n typeof attributes.class === 'string' && attributes.class.split(/\\s+/).includes(maskClass);\n\nexport interface MaskingPolicy {\n /** True when every field value is masked: `maskAllInputs` or `maskAllTyping`. */\n maskEveryField: boolean;\n /** The customer's mask class, honoured on fields as well as on the text around them. */\n maskClass: string;\n}\n\n/** The floor, plus whatever the customer asked for on top of it, for a live field. */\nexport function shouldMaskValue(text: string, node: MaybeElement, policy: MaskingPolicy): boolean {\n if (policy.maskEveryField) return true;\n if (isSensitiveField(node)) return true;\n if (isMarkedByCustomer(node, policy.maskClass)) return true;\n return cardShaped(text);\n}\n\n/** A card number, whole or still being typed: what the floor masks in any value a person typed. */\nconst cardShaped = (text: string): boolean => looksLikeCardNumber(text) || mayBecomeCardNumber(text);\n\n/** Digit groups joined by one space, no-break space or dash: where a card number can hide in text. */\nconst DIGIT_RUN = /[0-9]+(?:[ -][0-9]+)*/g;\n\n/**\n * Stars every card number inside longer text, and leaves the rest of it.\n *\n * The rules above judge a whole value, so \"my card is 4242 4242 4242 4242\" in\n * a notes field or a support chat went out in the clear, one keystroke at a\n * time (found on a real iOS run of the Capacitor SDK). Each run of digit\n * groups is searched for the longest stretch of whole groups that is card\n * shaped — complete or still being typed — so the number is masked from its\n * seventh digit wherever it sits: after a word, before another number, at the\n * end of what is being typed. Only its digits are starred; the words around\n * it, and every other number, stay.\n */\nexport function maskCardRuns(text: string): string {\n if (!/[0-9]/.test(text)) return text;\n return text.replace(DIGIT_RUN, (run) => {\n const groups = run.split(/[ -]/);\n // Where each group starts in the run, so a stretch of groups maps back to characters.\n const starts: number[] = [];\n let at = 0;\n for (const group of groups) {\n starts.push(at);\n at += group.length + 1;\n }\n const chars = run.split('');\n let i = 0;\n while (i < groups.length) {\n let matched = -1;\n for (let j = groups.length - 1; j >= i; j -= 1) {\n const end = starts[j]! + groups[j]!.length;\n if (cardShaped(run.slice(starts[i], end).replace(/ /g, ' '))) { matched = j; break; }\n }\n if (matched < 0) { i += 1; continue; }\n const end = starts[matched]! + groups[matched]!.length;\n for (let k = starts[i]!; k < end; k += 1) if (chars[k] !== ' ' && chars[k] !== ' ' && chars[k] !== '-') chars[k] = '*';\n i = matched + 1;\n }\n return chars.join('');\n });\n}\n\n/**\n * Everywhere a person can type that is not a form control — the selector\n * `maskAllTyping` masks. Without that option an editor's text is page text,\n * and only a card number in it is masked.\n */\nconst EDITABLE = '[contenteditable]:not([contenteditable=\"false\"])';\n\n/** Is this live node — a text node or an element — inside an editable region? */\nfunction insideEditable(node: unknown): boolean {\n const live = node as { nodeType?: number; parentElement?: Element | null } | null | undefined;\n const element = live?.nodeType === 3 ? live.parentElement ?? null : asElement(live as MaybeElement);\n return typeof element?.closest === 'function' && element.closest(EDITABLE) !== null;\n}\n\nconst isEditableSerialised = (attributes: Record<string, unknown>): boolean =>\n attributes.contenteditable !== undefined && attributes.contenteditable !== 'false';\n\n/**\n * Text typed into an editor, judged as a field value would be: an editor\n * writes a typed space as a no-break space, and often keeps a trailing one.\n */\nconst typedCardShaped = (text: string): boolean => cardShaped(text.replace(/\\u00a0/g, ' ').trim());\n\n/** What rrweb writes for masked text: every character but whitespace, starred. */\nconst maskText = (text: string): string => text.replace(/\\S/g, '*');\n\n/** Text typed into an editor: all of it starred when it is a card number, else any card number inside it. */\nconst maskTyped = (text: string): string => (typedCardShaped(text) ? maskText(text) : maskCardRuns(text));\n\n/* --------------------------------------------------------- the payloads -- */\n\ninterface SerialisedNode {\n type?: number;\n tagName?: string;\n textContent?: string;\n attributes?: Record<string, unknown>;\n childNodes?: SerialisedNode[];\n}\n\ninterface IncrementalData {\n source?: number;\n id?: unknown;\n text?: unknown;\n texts?: { id?: unknown; value?: unknown }[];\n attributes?: { id?: unknown; attributes?: Record<string, unknown> }[];\n adds?: { parentId?: unknown; node?: SerialisedNode }[];\n}\n\n/** rrweb's IncrementalSource values for the payloads that can carry a field value. */\nconst MUTATION = 0;\nconst INPUT = 5;\n/** rrweb's NodeType values. */\nconst ELEMENT_NODE = 2;\nconst TEXT_NODE = 3;\nconst FIELD_TAGS = new Set(['input', 'textarea', 'select']);\n\n/** Replaces every text node under a node with asterisks. A textarea's initial content is one. */\nfunction maskTextChildren(node: SerialisedNode): void {\n for (const child of node.childNodes ?? []) {\n if (child.type === TEXT_NODE && typeof child.textContent === 'string') {\n child.textContent = child.textContent.replace(/\\S/g, '*');\n }\n maskTextChildren(child);\n }\n}\n\n/** The text of an unmasked textarea, less any card number in it. */\nfunction maskCardRunsInChildren(node: SerialisedNode): void {\n for (const child of node.childNodes ?? []) {\n if (child.type === TEXT_NODE && typeof child.textContent === 'string') child.textContent = maskCardRuns(child.textContent);\n }\n}\n\n/**\n * Walks a serialised tree and masks the value of every field the policy covers.\n *\n * Used for the full snapshot and for nodes added later, which is where a value\n * that was in the markup — or one a framework rendered a second after load —\n * rides out of the browser. `masked` is inherited: a field inside an element\n * the customer marked is masked even though the mark is on the ancestor.\n * `editable` is inherited the same way: text inside a `contenteditable`\n * region was typed, and a card number in it is masked like one in a field.\n */\nfunction scrubTree(node: SerialisedNode | undefined, policy: MaskingPolicy, masked: boolean, editable = false): void {\n if (!node) return;\n const attributes = node.attributes ?? {};\n const inheritedMask = masked || hasClass(attributes, policy.maskClass);\n const inheritedEditable = editable || (node.type === ELEMENT_NODE && isEditableSerialised(attributes));\n\n if (editable && node.type === TEXT_NODE && typeof node.textContent === 'string') {\n node.textContent = maskTyped(node.textContent);\n }\n\n if (node.type === ELEMENT_NODE && node.tagName && FIELD_TAGS.has(node.tagName.toLowerCase())) {\n const value = attributes.value;\n const shouldMask = policy.maskEveryField\n || inheritedMask\n || isSensitiveSerialised(attributes)\n || (typeof value === 'string' && cardShaped(value));\n if (shouldMask) {\n if (typeof value === 'string' && value !== '') attributes.value = maskValue(value);\n // A textarea's initial content is a text node as well as a value, and\n // rrweb serialises both.\n if (node.tagName.toLowerCase() === 'textarea') maskTextChildren(node);\n } else {\n // An ordinary field keeps its value, less any card number written into it.\n if (typeof value === 'string') attributes.value = maskCardRuns(value);\n if (node.tagName.toLowerCase() === 'textarea') maskCardRunsInChildren(node);\n }\n }\n\n for (const child of node.childNodes ?? []) scrubTree(child, policy, inheritedMask, inheritedEditable);\n}\n\n/**\n * Re-applies the floor to an event rrweb has already built.\n *\n * Events are scrubbed in place, before the transport sees them.\n */\nexport function scrubEvent(\n event: { type?: number; data?: unknown },\n getNode: (id: number) => MaybeElement,\n policy: MaskingPolicy,\n): void {\n if (!event.data) return;\n\n // The first full picture of the page: every value that was in the markup.\n if (event.type === 2) {\n scrubTree((event.data as { node?: SerialisedNode }).node, policy, false);\n return;\n }\n if (event.type !== 3) return;\n const data = event.data as IncrementalData;\n\n if (data.source === INPUT) {\n if (typeof data.text !== 'string' || data.text === '') return;\n const node = typeof data.id === 'number' ? getNode(data.id) : null;\n // A check box or radio button reports `checked`; its `value` is markup the\n // page wrote, not anything a person typed, and the replayer needs it to\n // tell one radio button in a group from another.\n const type = ((asElement(node) as HTMLInputElement | null)?.type ?? '').toLowerCase();\n if (type === 'checkbox' || type === 'radio') return;\n data.text = shouldMaskValue(data.text, node, policy) ? maskValue(data.text) : maskCardRuns(data.text);\n return;\n }\n\n if (data.source !== MUTATION) return;\n\n // A value a script assigned, which arrives as an attribute change.\n for (const entry of data.attributes ?? []) {\n const value = entry?.attributes?.value;\n if (typeof value !== 'string' || value === '') continue;\n const node = typeof entry.id === 'number' ? getNode(entry.id) : null;\n entry.attributes!.value = shouldMaskValue(value, node, policy) ? maskValue(value) : maskCardRuns(value);\n }\n // A field the page added after the snapshot, serialised the same way. The\n // mark that covers it may be on an element that was already there, so the\n // parent it is being attached to decides where the walk starts.\n for (const add of data.adds ?? []) {\n const parent = typeof add?.parentId === 'number' ? getNode(add.parentId) : null;\n scrubTree(add?.node, policy, isMarkedByCustomer(parent, policy.maskClass), insideEditable(parent));\n }\n // Typing into a `contenteditable` region changes a text node's content, one\n // keystroke at a time — the same leak as a field's input events.\n for (const change of data.texts ?? []) {\n if (typeof change?.value !== 'string' || !/[0-9]/.test(change.value)) continue;\n if (typeof change.id === 'number' && insideEditable(getNode(change.id))) change.value = maskTyped(change.value);\n }\n}\n","/**\n * What a developer opens a replay to find out: what broke.\n *\n * Three streams, each a reserved custom-event tag inside the rrweb stream so\n * they carry the recording's own clock and replay in order with the clicks\n * that caused them:\n *\n * - `anyreplay.error` — uncaught exceptions and unhandled rejections.\n * - `anyreplay.console` — `console.error` and `console.warn` calls.\n * - `anyreplay.network` — one entry per fetch/XHR, metadata only.\n *\n * `anyreplay.error` and `anyreplay.network` are a contract that already has a\n * reader: `packages/insights/src/rrweb.ts` has been looking for those tags,\n * and the `js_error`, `error_click` and `network_error` detectors have been\n * waiting for them. The payload field names here are the ones that file reads\n * (`message`; `url`, `status`, `method`) — renaming one silently empties three\n * signals, so they are pinned by a test in both packages.\n *\n * ## What never leaves the page\n *\n * No request or response bodies, no request headers, no cookies. A URL is\n * recorded, so a URL is redacted first: a query value whose key names a\n * secret, anything shaped like an email address, a long opaque token and\n * anything that passes the card-number check are replaced before the entry is\n * built. The same redaction runs over console messages, which are arbitrary\n * strings a page chose to print and so the least predictable thing here.\n *\n * ## Why the caps are low\n *\n * A page in a render loop can print thousands of warnings a second, and a\n * dashboard polling four endpoints makes a request a second for an hour. The\n * value of all of it is in the first few of each kind near the moment\n * something went wrong, so each stream has a per-session ceiling and drops\n * quietly once it is reached. Nothing here grows without bound, and nothing\n * here throws: every entry point is wrapped, because this code runs inside\n * the page's own `fetch` and its own `console`.\n */\n\nimport { looksLikeCardNumber } from './masking.js';\n\n/** Contract with `packages/insights/src/rrweb.ts` and `apps/ingest/src/custom-events.ts`. */\nexport const ERROR_TAG = 'anyreplay.error';\nexport const CONSOLE_TAG = 'anyreplay.console';\nexport const NETWORK_TAG = 'anyreplay.network';\n\n/**\n * Per-session ceilings.\n *\n * Errors are the point of the feature and the rarest, so they get the most\n * room relative to how often they happen; network is the chattiest and so is\n * capped hardest per unit of value.\n */\nexport const LIMITS = { error: 100, console: 200, network: 500 } as const;\n\n/** An error message or console line longer than this is a stack trace in disguise. */\nconst MAX_MESSAGE = 1000;\n/** Stacks are what makes an error actionable, but only the top of one is. */\nconst MAX_STACK = 4000;\n/** A URL this long is carrying data, not addressing a resource. */\nconst MAX_URL = 500;\n\n/** Query keys whose value is a secret whatever it looks like. */\nconst SECRET_KEY = /^(?:.*[_-])?(?:token|secret|password|passwd|pwd|key|apikey|api_key|auth|authorization|session|sid|jwt|code|otp|signature|sig|credential|access|refresh)(?:[_-].*)?$/i;\n/** An email address anywhere in a string. */\nconst EMAIL = /[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}/g;\n/**\n * A long opaque run of token-ish characters: a JWT, a signed id, a bearer\n * token pasted into a path. Needs both length and a digit so that ordinary\n * words, slugs and hashes of English text are left alone.\n */\nconst OPAQUE = /\\b(?=[A-Za-z0-9_-]*\\d)[A-Za-z0-9_-]{24,}\\b/g;\n/** Digit runs that pass the card check, wherever they appear. */\nconst DIGITS = /\\b[0-9][0-9 -]{11,22}[0-9]\\b/g;\n\nexport const REDACTED = '[redacted]';\n\n/**\n * Removes from free text the three things that turn up in it by accident:\n * an address, a token, a card number.\n *\n * Deliberately blunt. This is applied to strings a page printed or a URL it\n * requested, where there is no structure to reason about and the cost of a\n * false positive — a redacted order id — is far below the cost of a miss.\n */\nexport function redactText(text: string): string {\n return text\n .replace(EMAIL, REDACTED)\n .replace(DIGITS, (match) => (looksLikeCardNumber(match.trim()) ? REDACTED : match))\n .replace(OPAQUE, REDACTED);\n}\n\n/**\n * A URL with its secrets taken out, kept absolute so the host is still visible.\n *\n * Query values are replaced by key first — `?token=abc` is a secret even when\n * `abc` is three letters — and then the whole thing goes through the free-text\n * redaction, which catches an address or a token sitting in the path. The hash\n * is dropped: it never reaches a server, and on a hash-routed app it is the\n * one part most likely to hold an id.\n */\nexport function redactUrl(raw: string): string {\n const text = raw.length > MAX_URL ? raw.slice(0, MAX_URL) : raw;\n let parsed: URL;\n try {\n parsed = new URL(text, typeof location !== 'undefined' ? location.href : 'http://localhost');\n } catch {\n return redactText(text);\n }\n for (const key of [...parsed.searchParams.keys()]) {\n if (SECRET_KEY.test(key)) parsed.searchParams.set(key, REDACTED);\n }\n parsed.hash = '';\n // `origin + path + search` rather than `href`, so a password in the\n // authority (`https://user:pw@host`) is dropped rather than redacted.\n return redactText(`${parsed.origin}${parsed.pathname}${parsed.search}`);\n}\n\nconst clip = (text: string, max: number): string => (text.length > max ? `${text.slice(0, max)}…` : text);\n\nexport interface ErrorPayload {\n /** Read by the insights timeline. Redacted and clipped. */\n message: string;\n /** `Error`, `TypeError`, … when the thrown value was an Error. */\n name?: string;\n /** Redacted and clipped; absent when the thrown value carried none. */\n stack?: string;\n /** How it reached us, which is how severe it is: a rejection nobody handled is not a thrown error. */\n kind: 'error' | 'rejection';\n /** Where it was thrown, when the browser said. Already a redacted URL. */\n source?: string;\n line?: number;\n column?: number;\n}\n\nexport interface ConsolePayload {\n level: 'error' | 'warn';\n /** The arguments, joined and redacted. */\n message: string;\n}\n\nexport interface NetworkPayload {\n /** Read by the insights timeline. A redacted absolute URL. */\n url: string;\n /** Read by the insights timeline. Upper case. */\n method: string;\n /** Read by the insights timeline. 0 when the request never got a response. */\n status: number;\n /** Wall-clock milliseconds from call to settled, rounded. */\n durationMs: number;\n /** Which API the page used, which is all the panel needs to group them. */\n initiator: 'fetch' | 'xhr';\n /** Present and true when the request failed outright (network error, CORS, abort). */\n failed?: boolean;\n}\n\n/** What the page prints, flattened. Objects are described, never serialised deeply. */\nfunction describe(value: unknown): string {\n if (typeof value === 'string') return value;\n if (value === null) return 'null';\n if (value === undefined) return 'undefined';\n if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'bigint') return String(value);\n if (value instanceof Error) return `${value.name}: ${value.message}`;\n try {\n const json = JSON.stringify(value);\n // `undefined`, a function, a symbol: JSON has nothing to say about them.\n return json === undefined ? Object.prototype.toString.call(value) : json;\n } catch {\n // Circular, or a getter that throws. The shape is still worth knowing.\n return Object.prototype.toString.call(value);\n }\n}\n\n/** The thrown value, described however it arrived — pages throw strings. */\nexport function errorPayload(\n kind: ErrorPayload['kind'],\n value: unknown,\n where?: { source?: unknown; line?: unknown; column?: unknown },\n): ErrorPayload {\n const error = value instanceof Error ? value : null;\n const message = error ? `${error.name}: ${error.message}` : describe(value);\n const payload: ErrorPayload = { message: clip(redactText(message) || 'error', MAX_MESSAGE), kind };\n if (error) {\n payload.name = error.name;\n if (typeof error.stack === 'string' && error.stack.length > 0) {\n payload.stack = clip(redactText(error.stack), MAX_STACK);\n }\n }\n if (typeof where?.source === 'string' && where.source.length > 0) payload.source = redactUrl(where.source);\n if (typeof where?.line === 'number' && Number.isFinite(where.line)) payload.line = where.line;\n if (typeof where?.column === 'number' && Number.isFinite(where.column)) payload.column = where.column;\n return payload;\n}\n\nexport function consolePayload(level: ConsolePayload['level'], args: readonly unknown[]): ConsolePayload {\n const joined = args.map(describe).join(' ');\n return { level, message: clip(redactText(joined), MAX_MESSAGE) };\n}\n\n/** The method, as a short upper-case word; anything stranger is not a method. */\nfunction methodOf(value: unknown): string {\n const text = typeof value === 'string' ? value.toUpperCase() : 'GET';\n return /^[A-Z]{3,10}$/.test(text) ? text : 'GET';\n}\n\nexport interface DiagnosticsOptions {\n /** Emit uncaught errors and unhandled rejections. */\n errors: boolean;\n /** Emit `console.error` and `console.warn`. */\n console: boolean;\n /** Emit one entry per fetch/XHR. */\n network: boolean;\n /** Where entries go. Called with a reserved tag and a payload. */\n emit: (tag: string, payload: unknown) => void;\n /** Called the first time an error or a failed request is seen, so the session is flagged. */\n onError: () => void;\n /** Ingest's own endpoint, so the recorder never records itself. */\n ingestUrl: string;\n}\n\nexport interface DiagnosticsHandle {\n /** Puts back every patched global, in reverse order. Safe to call twice. */\n stop: () => void;\n /**\n * An error the page caught itself (`trackError`): redacted, counted against\n * the same per-session ceiling and flagging the session exactly as an\n * uncaught one would.\n */\n error: (value: unknown) => void;\n}\n\n/**\n * Patches `console`, `window` and the two request APIs, and gives back the\n * single function that undoes all of it.\n *\n * Patching is the only way to see any of this from a library, so the rules\n * are strict: the original is captured once and always called, its return\n * value is always passed through untouched, and everything this adds sits in\n * a `try` so that a bug here cannot break a page's error handling or its\n * network layer. Requests to the ingest endpoint are skipped — recording the\n * recorder is noise that also grows with itself.\n */\nexport function startDiagnostics(options: DiagnosticsOptions): DiagnosticsHandle {\n const undo: (() => void)[] = [];\n const counts = { error: 0, console: 0, network: 0 };\n let flagged = false;\n\n const budget = (stream: keyof typeof counts): boolean => {\n if (counts[stream] >= LIMITS[stream]) return false;\n counts[stream] += 1;\n return true;\n };\n const flag = (): void => {\n if (flagged) return;\n flagged = true;\n try {\n options.onError();\n } catch { /* never the page's problem */ }\n };\n const send = (tag: string, payload: unknown): void => {\n try {\n options.emit(tag, payload);\n } catch { /* as above */ }\n };\n\n let ingestOrigin: string | null = null;\n try {\n ingestOrigin = new URL(options.ingestUrl).origin;\n } catch { /* a malformed endpoint cannot match anything */ }\n\n const ours = (url: string): boolean => ingestOrigin !== null && url.startsWith(ingestOrigin);\n\n if (options.errors && typeof window !== 'undefined') {\n const onError = (event: ErrorEvent): void => {\n flag();\n if (!budget('error')) return;\n send(ERROR_TAG, errorPayload('error', event.error ?? event.message, {\n source: event.filename, line: event.lineno, column: event.colno,\n }));\n };\n const onRejection = (event: PromiseRejectionEvent): void => {\n flag();\n if (!budget('error')) return;\n send(ERROR_TAG, errorPayload('rejection', event.reason));\n };\n // Capture phase, so a page that stops propagation in its own handler does\n // not also stop the recording from seeing the error.\n window.addEventListener('error', onError as EventListener, { capture: true });\n window.addEventListener('unhandledrejection', onRejection as EventListener, { capture: true });\n undo.push(() => {\n window.removeEventListener('error', onError as EventListener, { capture: true });\n window.removeEventListener('unhandledrejection', onRejection as EventListener, { capture: true });\n });\n }\n\n if (options.console && typeof console !== 'undefined') {\n for (const level of ['error', 'warn'] as const) {\n const original = console[level] as ((...args: unknown[]) => void) | undefined;\n if (typeof original !== 'function') continue;\n const patched = function patchedConsole(this: unknown, ...args: unknown[]): void {\n try {\n // A recorder warning is not the page's diagnostics, and recording it\n // would let one bad event print and record forever.\n const first = args[0];\n const own = typeof first === 'string' && first.startsWith('[anyreplay]');\n if (!own && budget('console')) send(CONSOLE_TAG, consolePayload(level, args));\n } catch { /* fall through to the real console */ }\n original.apply(this, args);\n };\n console[level] = patched as typeof console.error;\n undo.push(() => { console[level] = original as typeof console.error; });\n }\n }\n\n if (options.network && typeof window !== 'undefined') {\n const originalFetch = window.fetch;\n if (typeof originalFetch === 'function') {\n const patchedFetch = function patchedFetch(\n this: unknown, input: RequestInfo | URL, init?: RequestInit,\n ): Promise<Response> {\n let url = '';\n let method = 'GET';\n try {\n url = typeof input === 'string' ? input\n : input instanceof URL ? input.href\n : (input as Request).url ?? '';\n method = methodOf(init?.method ?? (input as Request | undefined)?.method);\n } catch { /* an exotic input still gets its request made */ }\n const started = Date.now();\n const result = originalFetch.call(window, input as RequestInfo, init);\n if (!url || ours(url)) return result;\n return result.then(\n (response) => {\n try {\n if (budget('network')) {\n if (response.status >= 400) flag();\n send(NETWORK_TAG, {\n url: redactUrl(url), method, status: response.status,\n durationMs: Date.now() - started, initiator: 'fetch',\n } satisfies NetworkPayload);\n }\n } catch { /* never change what the page receives */ }\n return response;\n },\n (reason: unknown) => {\n try {\n flag();\n if (budget('network')) {\n send(NETWORK_TAG, {\n url: redactUrl(url), method, status: 0,\n durationMs: Date.now() - started, initiator: 'fetch', failed: true,\n } satisfies NetworkPayload);\n }\n } catch { /* as above */ }\n // Rethrow the original reason: the page's catch must see what it\n // would have seen, including the identity of the error object.\n throw reason;\n },\n );\n };\n window.fetch = patchedFetch as typeof window.fetch;\n undo.push(() => { window.fetch = originalFetch; });\n }\n\n const Xhr = window.XMLHttpRequest;\n if (typeof Xhr === 'function') {\n const open = Xhr.prototype.open;\n const sendMethod = Xhr.prototype.send;\n // The request's own facts, kept off the instance's own property names.\n const seen = new WeakMap<XMLHttpRequest, { url: string; method: string; started: number }>();\n Xhr.prototype.open = function patchedOpen(\n this: XMLHttpRequest, method: string, url: string | URL, ...rest: unknown[]\n ) {\n try {\n const href = typeof url === 'string' ? url : url.href;\n if (href && !ours(href)) seen.set(this, { url: href, method: methodOf(method), started: 0 });\n } catch { /* the request still opens */ }\n return (open as (...args: unknown[]) => void).call(this, method, url, ...rest);\n } as typeof Xhr.prototype.open;\n Xhr.prototype.send = function patchedSend(this: XMLHttpRequest, ...args: unknown[]) {\n try {\n const request = seen.get(this);\n if (request) {\n request.started = Date.now();\n const done = (failed: boolean): void => {\n try {\n if (failed || this.status >= 400) flag();\n if (!budget('network')) return;\n send(NETWORK_TAG, {\n url: redactUrl(request.url), method: request.method, status: this.status || 0,\n durationMs: Date.now() - request.started, initiator: 'xhr',\n ...(failed ? { failed: true } : {}),\n } satisfies NetworkPayload);\n } catch { /* never the page's problem */ }\n };\n this.addEventListener('load', () => done(false));\n this.addEventListener('error', () => done(true));\n this.addEventListener('timeout', () => done(true));\n this.addEventListener('abort', () => done(true));\n }\n } catch { /* as above */ }\n return (sendMethod as (...args: unknown[]) => void).call(this, ...args);\n } as typeof Xhr.prototype.send;\n undo.push(() => {\n Xhr.prototype.open = open;\n Xhr.prototype.send = sendMethod;\n });\n }\n }\n\n let stopped = false;\n return {\n error: (value) => {\n if (stopped) return;\n flag();\n if (budget('error')) send(ERROR_TAG, errorPayload('error', value));\n },\n stop: () => {\n if (stopped) return;\n stopped = true;\n for (let i = undo.length - 1; i >= 0; i -= 1) {\n try {\n undo[i]!();\n } catch { /* put back as much as can be put back */ }\n }\n },\n };\n}\n","/**\n * Custom events: the moments a page tags with `track()`.\n *\n * They travel inside the rrweb stream as rrweb's own Custom event type, so\n * they carry the recording's clock and replay in order with everything else.\n * Ingest recognises them by these tags; the names are a contract with\n * apps/ingest/src/custom-events.ts.\n */\nexport const TRACK_TAG = 'anyreplay.track';\nexport const NAVIGATE_TAG = 'anyreplay.navigate';\n\n/** Short and URL-safe: an event name is a label, not a message. Ingest applies the same rule. */\nexport const EVENT_NAME_PATTERN = /^[A-Za-z0-9_.:-]{1,64}$/;\n/** Properties are stored with the event and indexed by nobody; a bag bigger than this is a payload, not context. */\nexport const MAX_PROPERTIES_BYTES = 4 * 1024;\n\nexport interface TrackPayload {\n name: string;\n properties: Record<string, unknown>;\n}\n\n/**\n * Checks what the page passed to `track()`, returning the payload to send or\n * the reason it was refused. Never throws: the page's own code is calling\n * this on a click handler, and a recorder that throws there breaks the click.\n */\nexport function validateTrack(name: unknown, properties: unknown): TrackPayload | string {\n if (typeof name !== 'string' || !EVENT_NAME_PATTERN.test(name)) {\n return `event name must be 1-64 characters of [A-Za-z0-9_.:-], got ${JSON.stringify(name)}`;\n }\n if (properties === undefined || properties === null) return { name, properties: {} };\n if (typeof properties !== 'object' || Array.isArray(properties)) {\n return `properties for \"${name}\" must be a plain object`;\n }\n let serialised: string;\n try {\n serialised = JSON.stringify(properties);\n } catch {\n return `properties for \"${name}\" are not JSON-serialisable`;\n }\n if (serialised === undefined || byteLength(serialised) > MAX_PROPERTIES_BYTES) {\n return `properties for \"${name}\" exceed ${MAX_PROPERTIES_BYTES} bytes once serialised`;\n }\n // The parsed copy, not the original: a getter or a class instance on the\n // caller's object must not reach the wire, and a later mutation must not\n // change what was tracked.\n return { name, properties: JSON.parse(serialised) as Record<string, unknown> };\n}\n\nfunction byteLength(text: string): number {\n return typeof TextEncoder === 'function' ? new TextEncoder().encode(text).length : text.length * 3;\n}\n","/**\n * FNV-1a. Small, fast, and good enough to spread visitor ids uniformly across\n * the unit interval — this is a bucketing decision, not a security one.\n */\nexport function hashToUnitInterval(input: string): number {\n let hash = 0x811c9dc5;\n for (let i = 0; i < input.length; i += 1) {\n hash ^= input.charCodeAt(i);\n hash = Math.imul(hash, 0x01000193) >>> 0;\n }\n return hash / 0xffffffff;\n}\n\n/**\n * Decides sampling from the visitor id rather than a coin flip.\n *\n * The same visitor therefore gets the same answer on every page and every\n * visit: a recorded journey stays whole instead of appearing as disconnected\n * fragments, and changing the rate moves a predictable slice of the population.\n */\nexport function isSampledIn(visitorId: string, sampleRate: number): boolean {\n if (sampleRate >= 1) return true;\n if (sampleRate <= 0) return false;\n return hashToUnitInterval(visitorId) < sampleRate;\n}\n","import type { ResolvedOptions } from './config.js';\n\nexport interface RecordedEvent {\n type: number;\n timestamp: number;\n data?: unknown;\n}\n\nexport interface SessionMeta {\n startedAt: number;\n url?: string;\n lang?: string;\n userAgent?: string;\n screenWidth?: number;\n screenHeight?: number;\n referrer?: string;\n /** `maxSessionsPerMonth`, sent only with chunk 0 of a new session. */\n sessionCap?: number;\n /** What this SDK records on — always `web` for this one. */\n platform?: string;\n /** This SDK, so a session says which release recorded it. */\n sdk?: { name: string; version: string };\n /** Only from a wrapper that knows the app (`ShellInfo` in recorder.ts). */\n appVersion?: string;\n deviceModel?: string;\n}\n\nexport interface ChunkFlags {\n hasError?: boolean;\n hasRageClick?: boolean;\n pageCount?: number;\n}\n\nexport interface TransportContext {\n projectKey: string;\n sessionId: string;\n visitorId: string;\n /** The first chunk number to use. Non-zero when a page resumes a session. */\n initialSeq?: number;\n}\n\n/** How many times one chunk may move to a new chunk number before giving up. */\nconst MAX_STALE_RECOVERIES = 3;\n\n/** rrweb's event types this file has to tell apart. */\nconst EVENT_FULL_SNAPSHOT = 2;\nconst EVENT_INCREMENTAL = 3;\n\n/**\n * Ingest refuses a body over 512 KB with `413` (`MAX_CHUNK_BYTES` in\n * apps/ingest/src/config.ts). Nothing this transport builds may exceed it.\n */\nexport const MAX_BODY_BYTES = 512 * 1024;\n\n/**\n * What one chunk aims for when several events share it: half the hard limit.\n *\n * The margin is for the envelope (meta, flags) and for a self-hosted ingest\n * configured a little lower than ours. A full snapshot bigger than this still\n * goes, alone, as long as it is under the hard limit.\n */\nexport const TARGET_CHUNK_BYTES = 256 * 1024;\n\n/**\n * The smallest body limit a run of `413`s can shrink this transport to. Below\n * it every rrweb snapshot would be \"too large\", and an ingest that refuses\n * 8 KB is misconfigured rather than strict.\n */\nconst MIN_BODY_BYTES = 8 * 1024;\n\n/** Room left for the envelope when deciding which events fit. */\nconst ENVELOPE_SLACK_BYTES = 1024;\n\n/** One flush sends at most this many chunks back to back; the next tick continues. */\nconst MAX_CHUNKS_PER_FLUSH = 20;\n\n/** Backoff after a delivery failure: 2 s, 4 s, 8 s … at most a minute, each with jitter. */\nconst BACKOFF_BASE_MS = 2_000;\nconst BACKOFF_MAX_MS = 60_000;\n\n/**\n * The longest `Retry-After` honoured. A server asking for more is either\n * misconfigured or answering for someone else; an hour of silence would cost\n * the whole visit, and ten minutes inside the in-memory buffer is already\n * most of it.\n */\nconst MAX_RETRY_AFTER_MS = 10 * 60_000;\n\n/**\n * Refusals of a chunk's contents (`400`, `422`) in a row before the transport\n * stops. One is a bad event and costs that chunk; three in a row means every\n * chunk is refused — a visitor id or key ingest will never take — and going\n * on would upload a fresh snapshot every few seconds for nothing.\n */\nconst MAX_CONSECUTIVE_REFUSALS = 3;\n\n/** The body of an accepted chunk's answer, when there is one to read. */\ntype Reply = Record<string, unknown>;\n\n/** Reads an answer's JSON once. Undefined for an empty or unreadable body, never a throw. */\nasync function readReply(response: Response): Promise<Reply | undefined> {\n try {\n if (typeof response.json !== 'function') return undefined;\n const reply = await response.json() as unknown;\n return reply && typeof reply === 'object' ? reply as Reply : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * The first free chunk number, when ingest says the one just sent was taken.\n *\n * Ingest answers a repeated (session, seq) with 202 and `duplicate: true`,\n * because to the server it looks like a retry. When this transport had never\n * sent that number before, it was not a retry: the number was used by an\n * earlier page of the session, or by another tab sharing it, and the events\n * were discarded. Servers that know the answer say where numbering continues.\n */\nfunction staleSeqHint(reply: Reply | undefined, sent: number): number | undefined {\n if (reply?.duplicate !== true) return undefined;\n const next = reply.nextSeq;\n return typeof next === 'number' && Number.isInteger(next) && next > sent ? next : undefined;\n}\n\n/**\n * How long the server asked us to wait, from `Retry-After`: either a number\n * of seconds or an HTTP date. Undefined when there is no usable header —\n * including when the browser hides it, which it does on a cross-origin\n * response unless ingest lists it in `Access-Control-Expose-Headers`.\n */\nexport function retryAfterMs(response: Response, now = Date.now()): number | undefined {\n let raw: string | null | undefined;\n try {\n raw = response.headers?.get?.('Retry-After');\n } catch {\n return undefined;\n }\n if (!raw) return undefined;\n const text = raw.trim();\n if (/^\\d+(\\.\\d+)?$/.test(text)) return Math.min(MAX_RETRY_AFTER_MS, Number(text) * 1000);\n const date = Date.parse(text);\n if (Number.isNaN(date)) return undefined;\n return Math.min(MAX_RETRY_AFTER_MS, Math.max(0, date - now));\n}\n\n/**\n * UTF-8 length of a string, without allocating its encoding.\n *\n * Every event is measured once, on its way into a chunk, and a full snapshot\n * runs to hundreds of kilobytes; `TextEncoder` would copy each of them only to\n * read `.length`. Lone surrogates count as the three bytes their replacement\n * character takes, which is what `JSON.stringify` + UTF-8 produce.\n */\nexport function utf8Length(text: string): number {\n let bytes = 0;\n for (let i = 0; i < text.length; i += 1) {\n const code = text.charCodeAt(i);\n if (code < 0x80) bytes += 1;\n else if (code < 0x800) bytes += 2;\n else if (code >= 0xd800 && code <= 0xdbff && i + 1 < text.length) {\n const next = text.charCodeAt(i + 1);\n if (next >= 0xdc00 && next <= 0xdfff) { bytes += 4; i += 1; } else bytes += 3;\n } else bytes += 3;\n }\n return bytes;\n}\n\nexport type TransportState = 'open' | 'stopped';\n\n/**\n * The Fetch standard caps the total body size of in-flight `keepalive`\n * requests at 64 KiB, and a browser rejects an oversized one outright — the\n * promise rejects with a bare TypeError, indistinguishable from being offline.\n * `sendBeacon` shares the same budget.\n *\n * The margin below is for the request headers, which count towards the same\n * budget, and for a second flush overlapping the first.\n */\nexport const KEEPALIVE_BODY_LIMIT_BYTES = 56 * 1024;\n\n/**\n * Whether a payload may be sent with `keepalive`.\n *\n * Deciding this from the event *count* is the trap: the first chunk of every\n * session is a Meta plus a single full DOM snapshot — two events, and on a real\n * page routinely several hundred kilobytes. Sizing by count marks it as small,\n * the browser refuses it, and the recorder counts a network failure for a\n * request that can never succeed. The symptom is a site that records nothing\n * at all while the snippet looks perfectly installed.\n */\nexport function withinKeepaliveLimit(payload: string): boolean {\n return utf8Length(payload) <= KEEPALIVE_BODY_LIMIT_BYTES;\n}\n\nexport interface TransportHooks {\n onStopped?: (reason: string) => void;\n onSent?: (seq: number, eventCount: number) => void;\n /** Called with the next free chunk number before a request using the current one leaves. */\n onSeqReserved?: (nextSeq: number) => void;\n /**\n * Called when events had to be dropped and the recording needs a fresh\n * full snapshot to make sense again. The recorder answers by taking one\n * (`record.takeFullSnapshot`); until it arrives, DOM changes are not kept,\n * since they would describe nodes the server never saw.\n */\n onResyncNeeded?: () => void;\n /** Debug-only explanations: an event dropped, a body limit lowered. */\n onWarning?: (message: string) => void;\n /**\n * What the project stored for masking typed text, from an accepted chunk's\n * answer (`maskAllInputs` in the 202). Called on every answer that carries\n * it; an ingest from before this field never calls it.\n */\n onProjectMasking?: (maskAllInputs: boolean) => void;\n}\n\n/** A chunk with its number, built once and resent byte-for-byte on every retry. */\ninterface Chunk {\n seq: number;\n events: RecordedEvent[];\n /** The events, already serialised, in order. */\n parts: string[];\n /** Attempts under the current `seq`. A duplicate answer to a retry means it arrived. */\n attempts: number;\n}\n\ntype Outcome = 'sent' | 'again' | 'wait' | 'stopped';\n\n/**\n * Ships buffered events to ingest.\n *\n * Three properties matter more than throughput here, because this code runs\n * inside somebody else's product:\n *\n * - It must never throw into the host page.\n * - It must never keep retrying a request the server has rejected on its\n * merits (a bad key, a disallowed origin) — that is an infinite loop.\n * - It must not lose the session to a network that is merely away: a train\n * tunnel, a laptop lid, a flaky café connection. It backs off and waits\n * instead of giving up, and keeps a bounded buffer meanwhile.\n *\n * And one property of every body it sends: under ingest's size limit. An\n * outage leaves up to 2000 events waiting; they go out as a run of chunks of\n * at most 200 events and about 256 KB each, in order, never as one body ingest\n * would refuse.\n */\nexport class Transport {\n private buffer: RecordedEvent[] = [];\n /** The chunk being delivered: built, numbered, maybe already attempted. */\n private pending: Chunk | undefined;\n /** The next unused chunk number. */\n private seq = 0;\n private consecutiveFailures = 0;\n private consecutiveRefusals = 0;\n private state: TransportState = 'open';\n private timer: ReturnType<typeof setInterval> | undefined;\n private retryTimer: ReturnType<typeof setTimeout> | undefined;\n private pendingMeta: SessionMeta | undefined;\n private flags: ChunkFlags = {};\n private inFlight = false;\n private staleRecoveries = 0;\n /** Our own backoff after a failure. Cleared when the network comes back. */\n private backoffUntil = 0;\n /** What the server asked for in `Retry-After`. Not cleared by anything but time. */\n private serverWaitUntil = 0;\n /** Largest body this transport will build; lowered by a `413`. */\n private bodyLimit = MAX_BODY_BYTES;\n private targetBytes = TARGET_CHUNK_BYTES;\n /**\n * Set when events were dropped and a full snapshot has been asked for:\n * DOM changes are not kept until it arrives.\n */\n private awaitingSnapshot = false;\n /** Serialised events, so a retry or a re-split does not stringify a snapshot twice. */\n private readonly serialised = new WeakMap<RecordedEvent, string>();\n\n constructor(\n private readonly options: ResolvedOptions,\n private readonly context: TransportContext,\n private readonly hooks: TransportHooks = {},\n ) {\n this.seq = context.initialSeq ?? 0;\n }\n\n get isStopped(): boolean {\n return this.state === 'stopped';\n }\n\n /** Events not yet delivered, including a chunk waiting to be retried. */\n get bufferedCount(): number {\n return this.buffer.length + (this.pending?.events.length ?? 0);\n }\n\n /** The number the next undelivered chunk will carry — the count of chunks delivered, for a fresh session. */\n get sentChunks(): number {\n return this.pending?.seq ?? this.seq;\n }\n\n /** The most events kept while deliveries fail. Older ones are dropped first. */\n private get bufferLimit(): number {\n return this.options.maxEventsPerChunk * 10;\n }\n\n /** Attaches metadata to the next chunk. Sent once, with the session's first chunk. */\n setMeta(meta: SessionMeta): void {\n this.pendingMeta = meta;\n }\n\n mergeFlags(flags: ChunkFlags): void {\n this.flags = { ...this.flags, ...flags };\n }\n\n start(): void {\n if (this.timer) return;\n this.timer = setInterval(() => void this.flush(), this.options.flushIntervalMs);\n // Never hold a Node process open; harmless in browsers.\n (this.timer as unknown as { unref?: () => void }).unref?.();\n }\n\n stop(reason: string): void {\n this.state = 'stopped';\n if (this.timer) clearInterval(this.timer);\n if (this.retryTimer) clearTimeout(this.retryTimer);\n this.timer = undefined;\n this.retryTimer = undefined;\n this.buffer = [];\n this.pending = undefined;\n this.hooks.onStopped?.(reason);\n }\n\n push(event: RecordedEvent): void {\n if (this.state === 'stopped') return;\n if (this.awaitingSnapshot) {\n // A DOM change made before the fresh snapshot is already in it.\n if (event.type === EVENT_INCREMENTAL) return;\n if (event.type === EVENT_FULL_SNAPSHOT) this.awaitingSnapshot = false;\n }\n this.buffer.push(event);\n if (this.bufferedCount > this.bufferLimit) this.dropOldest(this.bufferedCount - this.bufferLimit);\n if (this.buffer.length >= this.options.maxEventsPerChunk) void this.flush();\n }\n\n /**\n * The network is back (`online`), or the page is visible again: try now\n * rather than at the end of the backoff. A server's `Retry-After` still\n * holds — it was not about our connection.\n */\n resume(): void {\n if (this.state === 'stopped') return;\n this.backoffUntil = 0;\n void this.flush();\n }\n\n /**\n * Sends whatever is buffered, as as many chunks as it takes. Safe to call\n * when there is nothing to send, and while waiting out a failure, when it\n * does nothing. `force` skips our own backoff (an explicit `flush()` from\n * the page) but never the server's `Retry-After`.\n */\n async flush(force = false): Promise<void> {\n if (this.state === 'stopped' || this.inFlight) return;\n const now = Date.now();\n if (now < this.serverWaitUntil) return;\n if (!force && now < this.backoffUntil) return;\n if (!this.pending && this.buffer.length === 0) return;\n\n this.inFlight = true;\n try {\n // `again` (a re-cut, a dropped chunk, a new number) does not count as a\n // chunk sent, so the attempts are bounded separately.\n for (let sent = 0, tries = 0; sent < MAX_CHUNKS_PER_FLUSH && tries < MAX_CHUNKS_PER_FLUSH * 3 && this.state === 'open'; tries += 1) {\n const chunk = this.pending ?? this.nextChunk(this.bodyLimit, this.targetBytes);\n if (!chunk) break;\n this.pending = chunk;\n const outcome = await this.send(chunk);\n if (outcome === 'sent') sent += 1;\n else if (outcome !== 'again') break;\n }\n } finally {\n this.inFlight = false;\n }\n }\n\n /**\n * Builds the next chunk from the front of the buffer: at most\n * `maxEventsPerChunk` events and `target` bytes, or one event alone up to\n * `limit`. An event too large for any chunk is dropped here — it would be\n * refused, and refused again, and hold up everything behind it. For a\n * beacon (`forBeacon`) it is left where it is instead: an ordinary request\n * can still carry what a beacon cannot.\n */\n private nextChunk(limit: number, target: number, forBeacon = false): Chunk | undefined {\n const envelope = utf8Length(this.envelope(this.seq)) + ENVELOPE_SLACK_BYTES;\n const events: RecordedEvent[] = [];\n const parts: string[] = [];\n let bytes = envelope;\n\n while (this.buffer.length > 0 && events.length < this.options.maxEventsPerChunk) {\n const event = this.buffer[0]!;\n const part = this.serialise(event);\n const size = utf8Length(part) + 1;\n if (events.length === 0 && bytes + size > limit) {\n if (forBeacon) return undefined;\n this.buffer.shift();\n if (!this.dropOversized(event, size)) return undefined;\n continue;\n }\n if (events.length > 0 && bytes + size > target) break;\n events.push(event);\n parts.push(part);\n bytes += size;\n this.buffer.shift();\n }\n if (events.length === 0) return undefined;\n\n const chunk: Chunk = { seq: this.seq, events, parts, attempts: 0 };\n this.seq += 1;\n return chunk;\n }\n\n /**\n * An event that no chunk can carry. A DOM change or a custom event is\n * dropped, and the DOM is re-sent whole if the dropped one described it.\n * A full snapshot that alone exceeds the limit is a page this transport\n * cannot record — re-taking it would only be refused again — so recording\n * stops instead of uploading a snapshot every few seconds forever.\n */\n private dropOversized(event: RecordedEvent, bytes: number): boolean {\n const kb = Math.ceil(bytes / 1024);\n if (event.type === EVENT_FULL_SNAPSHOT) {\n this.hooks.onWarning?.(`page snapshot is ${kb} KB, over the ${Math.floor(this.bodyLimit / 1024)} KB ingest accepts`);\n this.stop('snapshot_too_large');\n return false;\n }\n this.hooks.onWarning?.(`dropped one event of ${kb} KB: larger than ingest accepts`);\n if (event.type === EVENT_INCREMENTAL) this.afterGap();\n return true;\n }\n\n private serialise(event: RecordedEvent): string {\n let part = this.serialised.get(event);\n if (part === undefined) {\n part = JSON.stringify(event);\n this.serialised.set(event, part);\n }\n return part;\n }\n\n /** Everything in a chunk's body except its events, as a JSON object. */\n private envelope(seq: number): string {\n return JSON.stringify({\n projectKey: this.context.projectKey,\n sessionId: this.context.sessionId,\n visitorId: this.context.visitorId,\n seq,\n // The app this page runs inside, on every request: ingest reads it only\n // when the request has no real web origin. See `appId` in config.ts.\n ...(this.options.appId ? { appId: this.options.appId } : {}),\n ...(this.pendingMeta ? { meta: this.pendingMeta } : {}),\n ...(Object.keys(this.flags).length > 0 ? { flags: this.flags } : {}),\n // This device's clock as the request leaves, on the same clock as the\n // event timestamps. Ingest compares it with its own to catch a device\n // that runs ahead — a test phone three weeks fast would otherwise list\n // its sessions as starting \"in 3 weeks\". Stamped here, when the body is\n // built, so a retry or a queue flushed after a spell offline carries\n // the time it was actually sent rather than when it was recorded.\n sentAt: Date.now(),\n });\n }\n\n /**\n * The body, assembled from the events' cached JSON rather than by\n * stringifying them again: a retry resends exactly the bytes the first\n * attempt sent, which is also what lets ingest read it as a retry.\n */\n private body(chunk: Chunk): string {\n return `{\"events\":[${chunk.parts.join(',')}],${this.envelope(chunk.seq).slice(1)}`;\n }\n\n /** One request, and what to do next. */\n private async send(chunk: Chunk): Promise<Outcome> {\n const retry = chunk.attempts > 0;\n chunk.attempts += 1;\n // Reserved before the request leaves: a page that is closed mid-flight\n // must not hand this number to the next page of the same session.\n this.hooks.onSeqReserved?.(chunk.seq + 1);\n const payload = this.body(chunk);\n\n let response: Response;\n try {\n response = await fetch(`${this.options.ingestUrl}/v1/ingest/events`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: payload,\n // Ingest is unauthenticated by design; sending credentials would be a\n // cross-site cookie leak for no benefit.\n credentials: 'omit',\n keepalive: withinKeepaliveLimit(payload),\n });\n } catch {\n // Network error: the visitor may simply be offline. Keep the chunk.\n return this.registerFailure(undefined);\n }\n if (this.state === 'stopped' || this.pending !== chunk) return 'stopped';\n\n if (response.ok) {\n const reply = await readReply(response);\n if (typeof reply?.maskAllInputs === 'boolean') {\n try { this.hooks.onProjectMasking?.(reply.maskAllInputs); } catch { /* never into the page */ }\n }\n const nextSeq = retry ? undefined : staleSeqHint(reply, chunk.seq);\n if (nextSeq !== undefined && this.staleRecoveries < MAX_STALE_RECOVERIES) {\n // These events were new and the server discarded them. Send them\n // again under the first number it has not seen.\n this.staleRecoveries += 1;\n chunk.seq = nextSeq;\n chunk.attempts = 0;\n this.seq = Math.max(this.seq, nextSeq + 1);\n return 'again';\n }\n this.pending = undefined;\n this.staleRecoveries = 0;\n this.pendingMeta = undefined;\n this.consecutiveFailures = 0;\n this.consecutiveRefusals = 0;\n this.backoffUntil = 0;\n this.hooks.onSent?.(chunk.seq, chunk.events.length);\n return 'sent';\n }\n\n const status = response.status;\n if (status === 413) return this.shrink(chunk, utf8Length(payload));\n\n // The chunk's contents were refused. Retrying the same bytes cannot help,\n // and stopping would lose the rest of the visit over one bad event, so\n // that chunk goes and recording continues — unless every chunk is refused.\n if (status === 400 || status === 422) {\n this.pending = undefined;\n this.consecutiveRefusals += 1;\n if (this.consecutiveRefusals >= MAX_CONSECUTIVE_REFUSALS) {\n this.stop(`rejected_${status}`);\n return 'stopped';\n }\n this.hooks.onWarning?.(`ingest refused a chunk (${status}); its ${chunk.events.length} events are dropped`);\n this.afterGap();\n return 'again';\n }\n\n // A timeout, a rate limit or a server error: try again later.\n if (status === 408 || status === 429 || status >= 500) {\n return this.registerFailure(retryAfterMs(response));\n }\n\n // Any other 4xx is a verdict, not a hiccup: the key is wrong, the origin\n // is not allowed (403), the plan is full (402), the URL is not ingest\n // (404). Retrying cannot change the answer, so stop instead of hammering\n // the endpoint from every page load forever.\n this.stop(`rejected_${status}`);\n return 'stopped';\n }\n\n /**\n * `413`: this ingest takes less than we thought. The chunk was not stored,\n * so its events go back to the front of the queue and are re-cut under a\n * lower limit; its number is not reused, so no number ever carries two\n * different sets of events. A chunk of one event that is still too large is\n * dropped by `nextChunk` on the way back out.\n */\n private shrink(chunk: Chunk, bytes: number): Outcome {\n this.pending = undefined;\n if (this.bodyLimit <= MIN_BODY_BYTES) {\n // Refusing even this little is not a size limit any chunk can meet.\n this.stop('rejected_413');\n return 'stopped';\n }\n this.buffer = [...chunk.events, ...this.buffer];\n this.bodyLimit = Math.max(MIN_BODY_BYTES, Math.min(this.bodyLimit, Math.floor(bytes / 2)));\n this.targetBytes = Math.min(this.targetBytes, this.bodyLimit);\n this.hooks.onWarning?.(`ingest refused ${Math.ceil(bytes / 1024)} KB as too large; sending at most ${Math.floor(this.bodyLimit / 1024)} KB per chunk`);\n return 'again';\n }\n\n /**\n * Counts a failed delivery and schedules the next attempt: 2 s, 4 s, 8 s …\n * up to a minute, each with jitter so a thousand tabs that lost the same\n * Wi-Fi do not all come back in the same second. The chunk stays pending,\n * to be resent under the same number.\n *\n * Recording does not stop over this unless the page asked for it with\n * `maxConsecutiveFailures`: the buffer exists for exactly this, and a\n * phone in a tunnel for half a minute must not end the visit's recording.\n */\n private registerFailure(serverWaitMs: number | undefined): Outcome {\n this.consecutiveFailures += 1;\n const limit = this.options.maxConsecutiveFailures;\n if (limit > 0 && this.consecutiveFailures >= limit) {\n this.stop('too_many_failures');\n return 'stopped';\n }\n const now = Date.now();\n const ceiling = Math.min(BACKOFF_MAX_MS, BACKOFF_BASE_MS * 2 ** Math.min(this.consecutiveFailures - 1, 16));\n const delay = ceiling / 2 + Math.random() * (ceiling / 2);\n this.backoffUntil = now + delay;\n if (serverWaitMs !== undefined) this.serverWaitUntil = now + serverWaitMs;\n this.scheduleRetry(Math.max(this.backoffUntil, this.serverWaitUntil) - now);\n return 'wait';\n }\n\n /**\n * The attempt at the end of a backoff. It skips the backoff check itself:\n * a timer may fire a fraction of a millisecond \"early\" against `Date.now`,\n * and refusing then would leave nothing scheduled until the next tick.\n */\n private scheduleRetry(delayMs: number): void {\n if (this.retryTimer) clearTimeout(this.retryTimer);\n this.retryTimer = setTimeout(() => {\n this.retryTimer = undefined;\n void this.flush(true);\n }, Math.max(0, Math.ceil(delayMs)));\n (this.retryTimer as unknown as { unref?: () => void }).unref?.();\n }\n\n /**\n * Keeps the buffer bounded during a long outage. Older events go first — a\n * replay missing a stretch is still useful; a crashed page is not. A chunk\n * waiting to be retried is the oldest of all, and goes whole: sending part\n * of it under its number could clash with an attempt that did arrive.\n */\n private dropOldest(count: number): void {\n let remaining = count;\n if (this.pending && !this.inFlight) {\n remaining -= this.pending.events.length;\n this.pending = undefined;\n }\n if (remaining > 0) this.buffer.splice(0, remaining);\n this.hooks.onWarning?.(`dropped ${count} buffered events while ingest could not be reached`);\n this.afterGap();\n }\n\n /**\n * After events were dropped: DOM changes left before the next full snapshot\n * may describe nodes whose creation was dropped, and a replay applying them\n * breaks. They go, and when the buffer holds no snapshot to start again\n * from, the recorder is asked for one. Custom events, errors and the like\n * do not depend on the DOM and stay.\n */\n private afterGap(): void {\n const snapshot = this.buffer.findIndex((e) => e.type === EVENT_FULL_SNAPSHOT);\n const end = snapshot === -1 ? this.buffer.length : snapshot;\n this.buffer = [\n ...this.buffer.slice(0, end).filter((e) => e.type !== EVENT_INCREMENTAL),\n ...this.buffer.slice(end),\n ];\n if (snapshot === -1 && !this.awaitingSnapshot && this.hooks.onResyncNeeded) {\n this.awaitingSnapshot = true;\n this.hooks.onResyncNeeded();\n }\n }\n\n /**\n * Last-gasp send when the page is going away or hidden.\n *\n * `fetch` is cancelled once the document unloads, so the tail of every\n * session would be lost. `sendBeacon` hands the payload to the browser, which\n * delivers it after the page is gone — but only up to 64 KB in flight, so\n * the tail goes as a run of small chunks, oldest first, until the browser\n * says it has no room. What it refuses stays buffered for the page's next\n * flush, should there be one (a hidden tab that comes back, a page restored\n * from the back/forward cache).\n *\n * For a tab that is only hidden, and so likely to come back, nothing goes\n * while deliveries are failing or the server asked us to wait: a beacon\n * \"queued\" while offline is usually a beacon lost, where the buffer and the\n * backoff would have delivered it. On `pagehide` (`final`), the last\n * chance there is, it goes regardless.\n */\n flushWithBeacon(final = false): boolean {\n if (this.state === 'stopped' || (!this.pending && this.buffer.length === 0)) return false;\n if (!final && (this.consecutiveFailures > 0 || Date.now() < this.serverWaitUntil)) return false;\n if (typeof navigator === 'undefined' || typeof navigator.sendBeacon !== 'function') return false;\n\n const url = `${this.options.ingestUrl}/v1/ingest/events`;\n let queuedAny = false;\n let tooLarge = false;\n try {\n // A chunk that failed earlier goes first, under its own number. If it\n // is still in flight this may deliver it twice, which ingest reads as a\n // retry; the alternative is losing it with the page.\n const pending = this.pending;\n if (pending) {\n const payload = this.body(pending);\n if (!withinKeepaliveLimit(payload)) {\n tooLarge = true;\n } else {\n if (!this.beacon(url, pending, payload)) return queuedAny;\n queuedAny = true;\n if (!this.inFlight) {\n this.pending = undefined;\n this.pendingMeta = undefined;\n }\n }\n }\n\n while (!tooLarge && this.buffer.length > 0) {\n const chunk = this.nextChunk(KEEPALIVE_BODY_LIMIT_BYTES, KEEPALIVE_BODY_LIMIT_BYTES, true);\n if (!chunk) {\n // The next event alone is over what a beacon may carry.\n tooLarge = true;\n break;\n }\n const payload = this.body(chunk);\n if (!this.beacon(url, chunk, payload)) {\n // The browser's queue is full. The events go back, and the number\n // with them: nothing was sent under it.\n this.buffer = [...chunk.events, ...this.buffer];\n this.seq = chunk.seq;\n break;\n }\n queuedAny = true;\n this.pendingMeta = undefined;\n }\n } catch {\n /* never into the page */\n }\n\n // Something too big for any beacon — usually a fresh full snapshot. A\n // hidden page is still alive, and an ordinary request carries it.\n if (tooLarge) void this.flush(true);\n return queuedAny;\n }\n\n /** Hands one chunk to the browser. False when its beacon queue is full. */\n private beacon(url: string, chunk: Chunk, payload: string): boolean {\n this.hooks.onSeqReserved?.(chunk.seq + 1);\n // text/plain avoids a CORS preflight, which cannot complete during unload.\n const blob = new Blob([payload], { type: 'text/plain;charset=UTF-8' });\n return navigator.sendBeacon(url, blob);\n }\n}\n","/**\n * Which SDK recorded a session, as it tells ingest on the session's first chunk.\n *\n * The version is the package's own, written in at build time by tsup (and by\n * Vitest for the tests) from package.json — see `define` in tsup.config.ts.\n * Not imported from package.json at runtime: that would ship the whole\n * manifest inside the CDN bundle, and a bundler that does not resolve JSON\n * would fail on it. Source consumed without that build step (a workspace\n * importing `src/` directly) reports `0.0.0-dev`, which is honest about what\n * it is rather than a version that was never released.\n */\ndeclare const __ANYREPLAY_SDK_VERSION__: string | undefined;\n\nexport const SDK_NAME = '@anyreplay/browser';\n\nexport const SDK_VERSION: string =\n typeof __ANYREPLAY_SDK_VERSION__ === 'string' ? __ANYREPLAY_SDK_VERSION__ : '0.0.0-dev';\n\n/** What a browser page records on. An app shell (Capacitor, Electron) will have its own SDK say otherwise. */\nexport const PLATFORM = 'web';\n","const VISITOR_KEY = 'anyreplay.vid';\nconst SESSION_KEY = 'anyreplay.sid';\nconst SESSION_TS_KEY = 'anyreplay.sts';\n/** The next chunk number the current session may use. */\nconst SEQ_KEY = 'anyreplay.seq';\n/** Page views so far in the current session, so a reload continues the count. */\nconst PAGE_KEY = 'anyreplay.pc';\n/** Until when (epoch ms) this tab should not try to record, after ingest refused a new session. */\nconst COOLDOWN_KEY = 'anyreplay.cd';\n\n/**\n * How long a tab waits after a 402 before trying to record again.\n *\n * A quota or cap is a monthly fact; retrying on every page load would put one\n * refused request per navigation on ingest, from every visitor, for the rest\n * of the month. Two minutes is long enough to make that negligible and short\n * enough that an upgrade takes effect while the customer is still watching.\n */\nconst QUOTA_COOLDOWN_MS = 2 * 60 * 1000;\n\n/** A new session starts after this much inactivity, matching common analytics. */\nconst SESSION_IDLE_MS = 30 * 60 * 1000;\n\nfunction randomId(bytes = 16): string {\n const array = new Uint8Array(bytes);\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n crypto.getRandomValues(array);\n } else {\n for (let i = 0; i < bytes; i += 1) array[i] = Math.floor(Math.random() * 256);\n }\n return Array.from(array, (b) => b.toString(16).padStart(2, '0')).join('');\n}\n\n/** RFC 4122 v4, formatted. Ingest requires a UUID for the session id. */\nexport function uuidv4(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n const hex = randomId(16).split('');\n hex[12] = '4';\n hex[16] = ((parseInt(hex[16]!, 16) & 0x3) | 0x8).toString(16);\n const s = hex.join('');\n return `${s.slice(0, 8)}-${s.slice(8, 12)}-${s.slice(12, 16)}-${s.slice(16, 20)}-${s.slice(20)}`;\n}\n\ninterface Storage {\n get(key: string): string | null;\n set(key: string, value: string): void;\n remove(key: string): void;\n}\n\n/**\n * Storage that degrades instead of throwing.\n *\n * `localStorage` throws on access in some privacy modes, and a recorder that\n * throws inside the customer's page is far worse than one that stops recording.\n */\nexport function safeStorage(source: () => globalThis.Storage | undefined): Storage {\n const read = (): globalThis.Storage | undefined => {\n try { return source(); } catch { return undefined; }\n };\n return {\n get: (key) => { try { return read()?.getItem(key) ?? null; } catch { return null; } },\n set: (key, value) => { try { read()?.setItem(key, value); } catch { /* ignore */ } },\n remove: (key) => { try { read()?.removeItem(key); } catch { /* ignore */ } },\n };\n}\n\nexport interface Identity {\n visitorId: string;\n sessionId: string;\n isNewSession: boolean;\n /** The chunk number to continue from: 0 for a new session, later for a resumed one. */\n nextSeq: number;\n /** Which page view of the session this is: 1 for a new session, previous + 1 for a resumed one. */\n pageCount: number;\n}\n\n/**\n * Resolves who this is and which session they are in.\n *\n * The visitor id persists across visits (it is what sampling is decided on, so\n * a sampled-out visitor stays sampled out rather than flickering). The session\n * id resets after a period of inactivity.\n */\nexport function resolveIdentity(\n local: Storage,\n session: Storage,\n now: number = Date.now(),\n): Identity {\n let visitorId = local.get(VISITOR_KEY);\n if (!visitorId || !/^[A-Za-z0-9_-]{8,64}$/.test(visitorId)) {\n visitorId = `v${randomId(12)}`;\n local.set(VISITOR_KEY, visitorId);\n }\n\n const previousId = session.get(SESSION_KEY);\n const previousTs = Number(session.get(SESSION_TS_KEY) ?? 0);\n const expired = !previousId || !previousTs || now - previousTs > SESSION_IDLE_MS;\n\n const sessionId = expired ? uuidv4() : previousId;\n session.set(SESSION_KEY, sessionId);\n session.set(SESSION_TS_KEY, String(now));\n\n // A resumed session continues its chunk numbering. Starting again at 0 on\n // every page load collides with chunks the server already holds for this\n // session, and ingest drops a repeated (session, seq) as a retry — silently\n // losing everything recorded after the first page.\n const storedSeq = Number(session.get(SEQ_KEY));\n const nextSeq = !expired && Number.isInteger(storedSeq) && storedSeq > 0 ? storedSeq : 0;\n session.set(SEQ_KEY, String(nextSeq));\n\n // A full navigation is a page view of the same session. Starting the count\n // at 1 on every page would report a ten-page visit as one page.\n const storedPages = Number(session.get(PAGE_KEY));\n const pageCount = !expired && Number.isInteger(storedPages) && storedPages > 0 ? storedPages + 1 : 1;\n session.set(PAGE_KEY, String(pageCount));\n\n return { visitorId, sessionId, isNewSession: expired, nextSeq, pageCount };\n}\n\n/** Records the page count so the next page of the session continues from it. */\nexport function notePageCount(session: { set(key: string, value: string): void }, count: number): void {\n session.set(PAGE_KEY, String(count));\n}\n\n/** True while this tab is still inside the cool-down that followed a 402. */\nexport function inCooldown(session: Storage, now: number = Date.now()): boolean {\n const until = Number(session.get(COOLDOWN_KEY));\n return Number.isFinite(until) && until > now;\n}\n\nexport function startCooldown(session: Storage, now: number = Date.now()): void {\n session.set(COOLDOWN_KEY, String(now + QUOTA_COOLDOWN_MS));\n}\n\n/** Records that chunk numbers below `next` are taken, before the request that uses one leaves. */\nexport function reserveSeq(session: { set(key: string, value: string): void }, next: number): void {\n session.set(SEQ_KEY, String(next));\n}\n\nexport function touchSession(session: Storage, now: number = Date.now()): void {\n session.set(SESSION_TS_KEY, String(now));\n}\n\n/**\n * Removes everything the recorder has stored in this browser.\n *\n * Called when consent is refused. A refusal has to undo an earlier acceptance,\n * not merely stop the current page: the visitor id written last week is\n * exactly what the visitor is now saying no to, and leaving it in place would\n * make \"we store nothing without consent\" untrue for as long as it sat there.\n * The cool-down goes too — it is a fact about a session that no longer exists.\n * Removing a key that is not there creates nothing, so this is safe to call\n * before anything was ever written.\n */\nexport function forgetVisitor(local: Storage, session: Storage): void {\n local.remove(VISITOR_KEY);\n for (const key of [SESSION_KEY, SESSION_TS_KEY, SEQ_KEY, PAGE_KEY, COOLDOWN_KEY]) session.remove(key);\n}\n\nexport { VISITOR_KEY, SESSION_KEY, SESSION_TS_KEY, SEQ_KEY, PAGE_KEY, COOLDOWN_KEY, SESSION_IDLE_MS, QUOTA_COOLDOWN_MS };\n","import { record } from 'rrweb';\nimport { ASSET_TAG, AssetCollector, localAssetPrefix } from './assets.js';\nimport type { AnyReplayOptions, ResolvedOptions } from './config.js';\nimport { resolveOptions } from './config.js';\nimport { ERROR_TAG, errorPayload, startDiagnostics, type DiagnosticsHandle } from './diagnostics.js';\nimport { NAVIGATE_TAG, TRACK_TAG, validateTrack } from './events.js';\nimport { MASK_EVERY_FIELD, MASK_SENSITIVE_FIELDS, scrubEvent, type MaskingPolicy } from './masking.js';\nimport { isSampledIn } from './sampling.js';\nimport { Transport, type RecordedEvent, type SessionMeta } from './transport.js';\nimport { PLATFORM, SDK_NAME, SDK_VERSION } from './version.js';\nimport {\n forgetVisitor, inCooldown, notePageCount, resolveIdentity, reserveSeq, safeStorage, startCooldown, touchSession,\n type Identity,\n} from './visitor.js';\n\n/**\n * What an SDK that wraps this one says about the app the page runs in.\n *\n * Not an option: a website never has one. `@anyreplay/capacitor`,\n * `@anyreplay/cordova` and the desktop shells pass it as `createRecorder`'s\n * second argument, so a session names the SDK that was installed and the\n * platform it runs on (contract §2.3–§2.5) while the recording itself — rrweb,\n * masking, transport — stays this package's, unchanged (contract §4).\n */\nexport interface ShellInfo {\n /** One of the web family's platforms: `capacitor`, `cordova`, `electron`, `tauri`. */\n platform: string;\n /** The wrapper's own npm name and version. */\n sdk: { name: string; version: string };\n /** The app's user-visible version (`CFBundleShortVersionString`, `versionName`), ≤ 40. */\n appVersion?: string;\n /** The hardware model (`iPhone15,2`, `Pixel 8`), ≤ 64. */\n deviceModel?: string;\n /**\n * Called the moment a chunk number is reserved, before the request that\n * uses it leaves. A shell that copies the recorder's keys into native\n * storage copies them then: an app killed between a send and the shell's\n * next periodic copy came back with the old number, and sent its first\n * chunk under a number the server already held (seen on an iOS simulator).\n */\n onStateChanged?: () => void;\n}\n\nexport type RecorderStatus = 'idle' | 'awaiting-consent' | 'recording' | 'sampled-out' | 'stopped';\n\nexport interface IdentifyTraits {\n userId?: string;\n email?: string;\n}\n\nexport interface RecorderHandle {\n status: () => RecorderStatus;\n sessionId: () => string | null;\n consent: (granted: boolean) => void;\n identify: (traits: IdentifyTraits) => void;\n /**\n * Tags this moment of the recording so it shows on the player's timeline.\n *\n * `name` is 1–64 characters of `[A-Za-z0-9_.:-]`; `properties` must be a\n * plain JSON object of at most 4 KB. Anything else is dropped with a warning\n * in debug mode — never an exception, since this runs inside the page's\n * own handlers.\n */\n track: (name: string, properties?: Record<string, unknown>) => void;\n /**\n * Records an error the page caught itself — a failed checkout handled with a\n * message, an error another tracker saw first — as the same `anyreplay.error`\n * event an uncaught one becomes: redacted by the same rules, counted against\n * the same ceiling, and setting the session's `hasError`. Accepts anything\n * that can be thrown. Ignored with `recordErrors: false`. Before recording\n * starts it is held like `track` and still flags the session once it does.\n */\n trackError: (error: unknown) => void;\n stop: () => void;\n flush: () => Promise<void>;\n}\n\n/** Rage click: several clicks in nearly the same spot in quick succession. */\n/** rrweb's `EventType.DomContentLoaded` and `EventType.Load`: page milestones with no data. */\nconst RRWEB_DOM_CONTENT_LOADED = 0;\nconst RRWEB_LOAD = 1;\n/** rrweb's `EventType.FullSnapshot`. */\nconst EVENT_FULL_SNAPSHOT = 2;\n\nconst RAGE_CLICK_COUNT = 3;\nconst RAGE_CLICK_WINDOW_MS = 1000;\nconst RAGE_CLICK_RADIUS_PX = 30;\n\n/**\n * Events tracked before rrweb is emitting — while consent is pending, or\n * while the document is still loading — wait here. Enough for an app's boot\n * sequence; a page that tracks more than this before anything is recorded is\n * looping, and keeping the oldest ones tells the story better than the newest.\n */\nconst MAX_PENDING_EVENTS = 32;\n\n/**\n * Everywhere a person can type that is not a form control.\n *\n * A `contenteditable` element's text is page text, not an input value, so\n * input masking never sees it — which is why `maskAllTyping` exists and why it\n * is expressed as a text selector. `contenteditable=\"false\"` is how a page\n * marks a part of an editor that cannot be edited (a mention chip, an embed),\n * so it is not itself a reason to mask; text inside it is still masked when an\n * editable ancestor is, which is the safe way round.\n */\nconst EDITABLE_SELECTOR = '[contenteditable]:not([contenteditable=\"false\"])';\n\nexport function createRecorder(rawOptions: AnyReplayOptions, shell?: ShellInfo): RecorderHandle {\n const options: ResolvedOptions = resolveOptions(rawOptions);\n /**\n * Whether this page leaves `maskAllInputs` to the project.\n *\n * A snippet that sets it — `true` or `false`, a real boolean — has decided,\n * and nothing ingest says changes that. One that does not records masked,\n * the default, until ingest answers the first chunk with what the project\n * stored (`maskAllInputs` in the 202, contract §6.2). A project that chose\n * to record typed text — every site installed before inputs were masked by\n * default, whose snippet never needed to say so — gets it back from then\n * on. No answer (an error, a timeout, an older ingest) leaves it masked.\n * `maskAllTyping` masks fields whatever either says, so with it on there is\n * nothing to wait for.\n */\n let awaitingProjectMasking = typeof rawOptions.maskAllInputs !== 'boolean' && !options.maskAllTyping;\n\n const local = safeStorage(() => globalThis.localStorage);\n const session = safeStorage(() => globalThis.sessionStorage);\n\n let status: RecorderStatus = 'idle';\n /**\n * Who this is, and the channel to ingest. Neither exists until the recorder\n * is allowed to record — see `begin`. With `requireConsent` that is the\n * moment `consent(true)` is called; otherwise it is right now.\n */\n let identity: Identity | undefined;\n let transport: Transport | undefined;\n let stopRecording: (() => void) | undefined;\n /** Patched globals wait here to be put back; see `diagnostics.ts`. */\n let diagnostics: DiagnosticsHandle | undefined;\n /** With `assets: 'inline'`: makes the app's own files part of the recording. */\n let assets: AssetCollector | undefined;\n let pageCount = 0;\n /** Set in `begin` once there is something to apply the project's masking choice to. */\n let applyProjectMasking: (from: Transport, masked: boolean) => void = () => {};\n /**\n * Traits given to `identify` before there was a session to attach them to.\n * Held in memory only, and sent the moment recording starts — so\n * `consent(true)` followed by `identify` on the next line works, and an\n * identity never leaves the page for a visitor who has not agreed.\n */\n let pendingTraits: IdentifyTraits | undefined;\n\n /**\n * Traits for the current session that wait for its first accepted chunk.\n *\n * Ingest attaches traits to a session that exists and answers `202\n * { applied: false }` to one that does not (contract §8.2). `identify` on\n * the line after `init` — the usual place, after a login on page load — went\n * out before the first chunk had made the session, nothing sent it again,\n * and the session was never linked to anyone (found by the Flutter SDK's\n * device test). The traits now wait for the first chunk ingest accepts;\n * after that, `identify` goes straight out.\n */\n let traitsAwaitingSession: IdentifyTraits | undefined;\n /** Traits ingest answered `applied: false` to: tried once more after the next accepted chunk. */\n let traitsToRetry: IdentifyTraits | undefined;\n /** Whether a chunk of the current session has been accepted, so the session exists. */\n let sessionDelivered = false;\n\n const postIdentity = (who: Identity, traits: IdentifyTraits, retryIfUnapplied: boolean): void => {\n void fetch(`${options.ingestUrl}/v1/ingest/identify`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'omit',\n body: JSON.stringify({\n projectKey: options.projectKey, sessionId: who.sessionId, ...traits,\n ...(options.appId ? { appId: options.appId } : {}),\n }),\n }).then(async (response) => {\n if (!retryIfUnapplied || response.status !== 202) return;\n const reply = await response.json() as { applied?: unknown };\n // The row was not there after all (a server that lost a race): one more\n // try after the next accepted chunk — unless newer traits have been\n // given since, or the session has changed.\n if (reply.applied === false && identity === who && !traitsAwaitingSession && !traitsToRetry) {\n traitsToRetry = traits;\n }\n }).catch(() => { /* identity is best-effort; never surface to the page */ });\n };\n\n const sendIdentity = (who: Identity, traits: IdentifyTraits): void => {\n traitsToRetry = undefined;\n if (!sessionDelivered) {\n // Two calls before the session exists send what both said, once.\n traitsAwaitingSession = { ...traitsAwaitingSession, ...traits };\n return;\n }\n postIdentity(who, traits, true);\n };\n\n /** A chunk of `channel` was accepted: the session exists, and what waited for it goes. */\n const noteDelivered = (channel: Transport): void => {\n if (channel !== transport || !identity) return;\n sessionDelivered = true;\n const waiting = traitsAwaitingSession;\n const retry = traitsToRetry;\n traitsAwaitingSession = undefined;\n traitsToRetry = undefined;\n if (waiting) postIdentity(identity, waiting, true);\n else if (retry) postIdentity(identity, retry, false);\n };\n\n const collectMeta = (who: Identity): SessionMeta => ({\n startedAt: Date.now(),\n url: safeLocation(),\n lang: typeof navigator !== 'undefined' ? navigator.language : undefined,\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : undefined,\n screenWidth: typeof window !== 'undefined' ? window.innerWidth : undefined,\n screenHeight: typeof window !== 'undefined' ? window.innerHeight : undefined,\n referrer: typeof document !== 'undefined' ? document.referrer || undefined : undefined,\n platform: shell?.platform ?? PLATFORM,\n sdk: shell?.sdk ?? { name: SDK_NAME, version: SDK_VERSION },\n ...(shell?.appVersion ? { appVersion: shell.appVersion.slice(0, 40) } : {}),\n ...(shell?.deviceModel ? { deviceModel: shell.deviceModel.slice(0, 64) } : {}),\n // The cap is a decision about starting a session, so it goes only where\n // ingest makes that decision: chunk 0. A resumed page starts later.\n ...(options.maxSessionsPerMonth !== undefined && who.nextSeq === 0\n ? { sessionCap: options.maxSessionsPerMonth }\n : {}),\n });\n\n const recentClicks: { x: number; y: number; t: number }[] = [];\n\n const noteInteraction = (event: RecordedEvent, channel: Transport): void => {\n // rrweb IncrementalSnapshot(3) with MouseInteraction(2) source carries clicks,\n // but it also carries the mousedown and mouseup around each of them — one\n // ordinary click is three interactions, which is exactly RAGE_CLICK_COUNT,\n // and every session with a single click was being flagged as rage. Only\n // the Click itself (interaction type 2) is a click. A tap on a phone\n // fires one as well, so touch devices are still counted.\n const data = event.data as { source?: number; type?: number; x?: number; y?: number } | undefined;\n if (event.type !== 3 || data?.source !== 2 || data.type !== 2 || typeof data.x !== 'number') return;\n\n const now = event.timestamp;\n recentClicks.push({ x: data.x, y: data.y ?? 0, t: now });\n while (recentClicks.length > 0 && now - recentClicks[0]!.t > RAGE_CLICK_WINDOW_MS) recentClicks.shift();\n\n // Counted around the click that just landed, not around the oldest one in\n // the window: a single click somewhere else a moment earlier must not hide\n // the burst that follows it on the button that is not answering.\n const near = recentClicks.filter(\n (c) => Math.abs(c.x - data.x!) < RAGE_CLICK_RADIUS_PX && Math.abs(c.y - (data.y ?? 0)) < RAGE_CLICK_RADIUS_PX,\n );\n if (near.length >= RAGE_CLICK_COUNT) channel.mergeFlags({ hasRageClick: true });\n };\n\n /* ----------------------------- custom events ---------------------------- */\n\n const pending: { tag: string; payload: unknown }[] = [];\n let draining = false;\n let drainScheduled = false;\n\n /**\n * Hands the queue of waiting events to rrweb, in order.\n *\n * `addCustomEvent` throws until rrweb has finished its first snapshot,\n * which it takes on `load` when the recorder starts in a still-loading\n * document — and it flips to accepting only after the snapshot's own\n * events have been emitted, so draining from inside `emit` can be refused\n * too. A refusal is retried on the next event and, in case no event comes,\n * on a timer. A queued event is stamped with the time it is handed over,\n * not the time `track` was called: a marker a few hundred milliseconds late\n * is still on the timeline, and one dated before the snapshot is not.\n */\n const drainPending = (): void => {\n if (draining || pending.length === 0) return;\n draining = true;\n try {\n while (pending.length > 0) {\n const next = pending[0]!;\n record.addCustomEvent(next.tag, next.payload);\n pending.shift();\n // An error held from before recording started flags the session as\n // one caught now would (contract §3.5, §8.3).\n if (next.tag === ERROR_TAG) transport?.mergeFlags({ hasError: true });\n }\n } catch {\n if (!drainScheduled && status === 'recording') {\n drainScheduled = true;\n setTimeout(() => { drainScheduled = false; drainPending(); }, 50);\n }\n } finally {\n draining = false;\n }\n };\n\n /**\n * The queue lives in memory only. An event tracked while consent is\n * pending must not leave a trace anywhere a refusal would have to clean up.\n */\n const emitCustom = (tag: string, payload: unknown): void => {\n if (status === 'stopped' || status === 'sampled-out') return;\n if (status === 'recording') {\n try {\n record.addCustomEvent(tag, payload);\n return;\n } catch {\n /* not emitting yet — queue it */\n }\n }\n if (pending.length >= MAX_PENDING_EVENTS) {\n if (options.debug) console.warn(`[anyreplay] dropped ${tag}: too many events before recording started`);\n return;\n }\n pending.push({ tag, payload });\n };\n\n /* ------------------------------ navigation ------------------------------ */\n\n let lastUrl: string | undefined;\n\n /**\n * A route change in a single-page app is a page view.\n *\n * rrweb records the DOM mutations that come with it, but nothing in the\n * stream says \"this is a new page\" — so the marker is emitted here, and\n * ingest indexes it for the player. Same-URL changes are ignored: routers\n * call `replaceState` for scroll positions and query tweaks, and each of\n * those is not a page.\n */\n const noteNavigation = (channel: Transport): void => {\n const url = safeLocation();\n if (!url || url === lastUrl) return;\n lastUrl = url;\n pageCount += 1;\n notePageCount(session, pageCount);\n channel.mergeFlags({ pageCount });\n emitCustom(NAVIGATE_TAG, { url, title: typeof document !== 'undefined' ? document.title : '' });\n };\n\n /**\n * Everything that leaves a trace happens here, and nothing before it.\n *\n * Resolving the identity writes the visitor id to `localStorage` and the\n * session to `sessionStorage`; opening the transport is what makes a request\n * possible; starting rrweb is what observes the page. With `requireConsent`\n * every one of those waits for `consent(true)`, because storing an\n * identifier on the device is the very thing the consent is for. Nor does\n * the recorder peek at an id an earlier page left behind to decide that\n * consent was already given: the id may predate a refusal — the visitor\n * accepted in May and rejected in June — or have been written by a version\n * of this recorder that stored it without asking. Only the page knows the\n * current answer, and it says so by calling `consent`.\n *\n * Sampling is still decided from the visitor id, so it is still the same\n * answer for the same visitor on every page. What moves is *when* it is\n * decided: a visitor is sampled on first consent rather than on first page\n * view, and a visitor who refuses is forgotten, so a later acceptance is a\n * fresh draw.\n */\n const begin = (): void => {\n if (status !== 'idle' && status !== 'awaiting-consent') return;\n\n const who = resolveIdentity(local, session);\n identity = who;\n pageCount = who.pageCount;\n\n if (!isSampledIn(who.visitorId, options.sampleRate)) {\n // Decided from the visitor id, so this answer is stable across pages.\n status = 'sampled-out';\n return;\n }\n\n if (inCooldown(session)) {\n // The previous page was told this session may not be started. That answer\n // will not have changed a page load later.\n status = 'stopped';\n if (options.debug) console.warn('[anyreplay] not recording: ingest refused a new session recently');\n return;\n }\n\n const channel = new Transport(\n options,\n {\n projectKey: options.projectKey,\n sessionId: who.sessionId,\n visitorId: who.visitorId,\n initialSeq: who.nextSeq,\n },\n {\n onSent: () => noteDelivered(channel),\n onSeqReserved: (next) => {\n reserveSeq(session, next);\n try { shell?.onStateChanged?.(); } catch { /* the shell's problem, never the recording's */ }\n },\n onStopped: (reason) => {\n status = 'stopped';\n stopRecording?.();\n stopRecording = undefined;\n diagnostics?.stop();\n diagnostics = undefined;\n assets?.stop();\n assets = undefined;\n // Only the verdict about the session itself is remembered across pages.\n // A transport failure or an origin problem is either transient or one\n // request per page load to notice it is fixed; a full quota is neither.\n if (reason === 'rejected_402') startCooldown(session);\n if (options.debug) console.warn(`[anyreplay] recording stopped: ${reason}`);\n },\n onWarning: (message) => {\n if (options.debug) console.warn(`[anyreplay] ${message}`);\n },\n // Out of the transport's own call stack, like a resync: restarting\n // rrweb emits a snapshot into the channel that is answering.\n onProjectMasking: (masked) => setTimeout(() => applyProjectMasking(channel, masked), 0),\n // Events were dropped (a long outage, or one too large to send), so\n // the DOM changes after the gap describe nodes ingest never got. A\n // fresh full snapshot starts the page over. Taken on the next turn,\n // not here: this can be called from inside rrweb's own emit, in the\n // middle of handing over a batch of mutations.\n onResyncNeeded: () => setTimeout(() => takeSnapshot(2), 0),\n },\n );\n transport = channel;\n status = 'recording';\n\n /** A checkout snapshot (Meta + FullSnapshot), retried briefly if rrweb is not emitting yet. */\n const takeSnapshot = (triesLeft: number): void => {\n if (status !== 'recording' || !stopRecording) return;\n try {\n record.takeFullSnapshot(true);\n } catch {\n if (triesLeft > 0) setTimeout(() => takeSnapshot(triesLeft - 1), 1000);\n }\n };\n // The page the recording starts on is where route changes are counted from.\n lastUrl = safeLocation();\n\n channel.setMeta(collectMeta(who));\n // The page the recorder starts on is a page view. Without this the\n // counter only ever reflects in-app navigations, so a single-page visit\n // reports zero pages — and on a resumed session it is the previous page's\n // count plus one, so the hop is visible.\n channel.mergeFlags({ pageCount });\n channel.start();\n\n /**\n * What this recording may contain.\n *\n * `maskAllTyping` is the stricter of the two options and wins: a page that\n * asked for everything typed to be hidden does not get form fields back\n * because `maskAllInputs: false` is also set. Only with `maskAllInputs:\n * false` and no `maskAllTyping` are values recorded, and then `masking.ts`\n * applies the floor — the fields no option can un-mask.\n */\n const prefix = options.assets === 'inline' ? localAssetPrefix() : null;\n if (prefix && typeof fetch === 'function') {\n assets = new AssetCollector({\n prefix,\n ingestUrl: options.ingestUrl,\n projectKey: options.projectKey,\n appId: options.appId,\n // Bound now, before the network diagnostics wrap `fetch`: reading the\n // app's own files is the recorder's business, not the app's traffic.\n fetch: fetch.bind(globalThis),\n emit: (payload) => emitCustom(ASSET_TAG, payload),\n debug: options.debug,\n });\n }\n\n const policy: MaskingPolicy = {\n maskEveryField: options.maskAllInputs || options.maskAllTyping,\n maskClass: options.maskClass,\n };\n /** Set once the first chunk has been sent early, so the project's answer comes in a round trip. */\n let flushedEarly = false;\n\n /** Starts rrweb under the current `policy`; returns its stop function. */\n const capture = (): (() => void) | undefined => record({\n emit: (event) => {\n const typed = event as unknown as RecordedEvent;\n // Started before the page finished loading, rrweb announces\n // DOMContentLoaded (0) and load (1) as events of their own. They carry\n // nothing a replay uses, and they would open the recording ahead of\n // its Meta (contract §5.1, SEQ-002).\n if (typed.type === RRWEB_DOM_CONTENT_LOADED || typed.type === RRWEB_LOAD) return;\n // Before anything else touches the event: rrweb's own masking is\n // all-or-nothing by input type, so the floor — payment fields, marked\n // fields, anything shaped like a card number — is applied here, to the\n // event, with the node resolved through rrweb's mirror.\n scrubEvent(typed, (id) => record.mirror.getNode(id) as never, policy);\n assets?.scan(typed);\n noteInteraction(typed, channel);\n touchSession(session, typed.timestamp);\n channel.push(typed);\n drainPending();\n // While the project's masking choice is unknown everything typed is\n // masked, so the first chunk goes as soon as the page's snapshot is in\n // it rather than at the end of the first flush interval: the answer\n // comes back with it. Once per page, on the next turn, so the events\n // emitted alongside the snapshot travel with it.\n if (awaitingProjectMasking && !flushedEarly && typed.type === EVENT_FULL_SNAPSHOT) {\n flushedEarly = true;\n setTimeout(() => { void channel.flush(); }, 0);\n }\n },\n maskInputOptions: (policy.maskEveryField\n ? MASK_EVERY_FIELD\n : MASK_SENSITIVE_FIELDS) as NonNullable<Parameters<typeof record>[0]>['maskInputOptions'],\n maskTextClass: options.maskClass,\n maskTextSelector: options.maskAllTyping ? EDITABLE_SELECTOR : undefined,\n blockClass: options.blockClass,\n // Readable stylesheets go into the snapshot as text, in both asset\n // modes. rrweb's default, written out because 'inline' depends on it.\n inlineStylesheet: true,\n // Canvas capture is expensive and off unless a customer opts in later.\n recordCanvas: false,\n collectFonts: false,\n });\n\n /**\n * Ingest's word on what the project stored, for a page that left\n * `maskAllInputs` to it. The first answer decides for the rest of the\n * page. Masked is what is already running. Recorded means rrweb starts\n * again without input masking: its masking is fixed when it starts, and a\n * restart begins with a fresh full snapshot, so the replay picks up from a\n * consistent page. What was typed before stays masked in the recording.\n */\n applyProjectMasking = (from: Transport, masked: boolean): void => {\n if (!awaitingProjectMasking || from !== transport) return;\n awaitingProjectMasking = false;\n if (masked || status !== 'recording' || !stopRecording) return;\n policy.maskEveryField = false;\n try {\n stopRecording();\n stopRecording = capture();\n // rrweb reports a failure to start by returning nothing.\n if (!stopRecording) throw new Error('rrweb did not start');\n } catch {\n // rrweb would not start again: stop for the page rather than record\n // nothing while claiming to record.\n stopRecording = undefined;\n from.stop('restart_failed');\n return;\n }\n if (options.debug) console.warn('[anyreplay] recording typed text: the project chose to (maskAllInputs: false)');\n };\n\n stopRecording = capture();\n // Every page begins with a full snapshot (rrweb takes one on start), so\n // events tracked before this point land right after it.\n drainPending();\n if (pendingTraits) {\n sendIdentity(who, pendingTraits);\n pendingTraits = undefined;\n }\n\n attachLifecycleHooks(channel);\n };\n\n const attachLifecycleHooks = (channel: Transport): void => {\n if (typeof window === 'undefined') return;\n\n // pagehide is the reliable end-of-page signal; unload does not fire on\n // mobile Safari and beforeunload breaks the back/forward cache.\n window.addEventListener('pagehide', () => { channel.flushWithBeacon(true); }, { capture: true });\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'hidden') channel.flushWithBeacon();\n // Back on screen: if deliveries were failing, try now rather than at\n // the end of a backoff that may have been running while it was hidden.\n else channel.resume();\n });\n // The connection is back. `online` can fire for a network that still\n // reaches nothing; then the attempt fails and backs off again.\n window.addEventListener('online', () => channel.resume());\n /*\n * Errors, console lines and request metadata.\n *\n * This replaces two bare listeners that set `hasError` and kept nothing\n * else, which is why a replay could say an error happened and never say\n * which. `hasError` is still set — by the first error or failed request\n * either stream sees, through `onError` — so the session list's filter and\n * its partial index are unchanged.\n *\n * Started here rather than in `begin()` so that nothing is patched before\n * consent: `attachLifecycleHooks` runs once recording has actually\n * started, and `stop()` puts every global back.\n */\n diagnostics = startDiagnostics({\n errors: options.recordErrors,\n console: options.recordConsole,\n network: options.recordNetwork,\n ingestUrl: options.ingestUrl,\n emit: emitCustom,\n onError: () => channel.mergeFlags({ hasError: true }),\n });\n\n // Wrapped after the original runs, so `location` already shows the new URL.\n const patch = (method: 'pushState' | 'replaceState'): void => {\n const original = history[method].bind(history);\n history[method] = function patched(...args: Parameters<History['pushState']>) {\n const result = original(...args);\n noteNavigation(channel);\n return result;\n };\n };\n patch('pushState');\n patch('replaceState');\n window.addEventListener('popstate', () => noteNavigation(channel));\n };\n\n if (options.requireConsent) {\n status = 'awaiting-consent';\n } else {\n begin();\n }\n\n return {\n status: () => status,\n sessionId: () => identity?.sessionId ?? null,\n consent: (granted) => {\n if (granted) {\n begin();\n return;\n }\n // A refusal stops this page's recording and undoes what an earlier\n // acceptance stored — on this page or on one last month. Stopping\n // first, so no flush reserves a chunk number after the keys are gone.\n transport?.stop('consent_withdrawn');\n // Nothing was recording yet (still asking, or asked and sampled out):\n // the refusal is an answer, not a `stop()`. The recorder goes back to\n // waiting, so a visitor who says no and then changes their mind on the\n // same page — the banner's settings link — is recorded from then on, as\n // a new visitor with a fresh sampling draw (contract §3.5). A recording\n // that had started stays stopped for the page (§3.6).\n if (status === 'idle' || status === 'awaiting-consent' || status === 'sampled-out') {\n status = 'awaiting-consent';\n identity = undefined;\n }\n pendingTraits = undefined;\n traitsAwaitingSession = undefined;\n traitsToRetry = undefined;\n // What was tracked while asking belongs to the answer that was refused.\n pending.length = 0;\n forgetVisitor(local, session);\n },\n identify: (traits) => {\n if (!traits.userId && !traits.email) return;\n if (identity && transport) {\n sendIdentity(identity, traits);\n return;\n }\n // No session yet. While consent is pending the traits wait; a visitor\n // who is sampled out or stopped has no session to attach them to.\n if (status === 'idle' || status === 'awaiting-consent') pendingTraits = traits;\n else if (options.debug) console.warn('[anyreplay] identify() ignored: not recording');\n },\n track: (name, properties) => {\n const payload = validateTrack(name, properties);\n if (typeof payload === 'string') {\n if (options.debug) console.warn(`[anyreplay] track() ignored: ${payload}`);\n return;\n }\n emitCustom(TRACK_TAG, payload);\n },\n trackError: (error) => {\n if (!options.recordErrors) return;\n // While recording, through diagnostics: it owns the ceiling and the flag.\n if (diagnostics) {\n diagnostics.error(error);\n return;\n }\n emitCustom(ERROR_TAG, errorPayload('error', error));\n // Recording without diagnostics (no window to patch): flag it here.\n if (status === 'recording') transport?.mergeFlags({ hasError: true });\n },\n stop: () => {\n transport?.stop('stopped_by_page');\n // Stopped before it ever started: a later consent(true) must not start\n // what the page has already said it does not want.\n if (status === 'idle' || status === 'awaiting-consent') status = 'stopped';\n pendingTraits = undefined;\n },\n // Asked for by the page, so it skips our own backoff (never a server's Retry-After).\n flush: () => transport?.flush(true) ?? Promise.resolve(),\n };\n}\n\nfunction safeLocation(): string | undefined {\n try {\n return typeof location !== 'undefined' ? location.href : undefined;\n } catch {\n return undefined;\n }\n}\n"],"mappings":"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","names":["NodeType","Mirror","chars","mirror","mirror","mirror","parentId","mirror","mirror","_a","mirror","WorkerFactory","decodeBase64","createBase64WorkerFactory","WorkerFactory","createBase64WorkerFactory","createBase64WorkerFactory","a","b","chars","end","patchedFetch","EVENT_FULL_SNAPSHOT","EVENT_INCREMENTAL","snapshot","EVENT_FULL_SNAPSHOT","_a","patch"]}
|