UNPKG

koalaware-js

Version:

SDK for Koalaware session and event recording

1,279 lines (1,265 loc) 193 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); /****************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ /* global Reflect, Promise, SuppressedError, Symbol, Iterator */ var __assign = function() { __assign = Object.assign || function __assign(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; function __awaiter$1(thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); } function __generator(thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype); return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (g && (g = 0, op[0] && (_ = 0)), _) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } } function __spreadArray(to, from, pack) { if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { if (ar || !(i in from)) { if (!ar) ar = Array.prototype.slice.call(from, 0, i); ar[i] = from[i]; } } return to.concat(ar || Array.prototype.slice.call(from)); } typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { var e = new Error(message); return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; }; var NodeType; (function (NodeType) { NodeType[NodeType["Document"] = 0] = "Document"; NodeType[NodeType["DocumentType"] = 1] = "DocumentType"; NodeType[NodeType["Element"] = 2] = "Element"; NodeType[NodeType["Text"] = 3] = "Text"; NodeType[NodeType["CDATA"] = 4] = "CDATA"; NodeType[NodeType["Comment"] = 5] = "Comment"; })(NodeType || (NodeType = {})); function isElement(n) { return n.nodeType === n.ELEMENT_NODE; } function isShadowRoot(n) { var host = n === null || n === void 0 ? void 0 : n.host; return Boolean((host === null || host === void 0 ? void 0 : host.shadowRoot) === n); } function isNativeShadowDom(shadowRoot) { return Object.prototype.toString.call(shadowRoot) === '[object ShadowRoot]'; } function fixBrowserCompatibilityIssuesInCSS(cssText) { if (cssText.includes(' background-clip: text;') && !cssText.includes(' -webkit-background-clip: text;')) { cssText = cssText.replace(' background-clip: text;', ' -webkit-background-clip: text; background-clip: text;'); } return cssText; } function getCssRulesString(s) { try { var rules = s.rules || s.cssRules; return rules ? fixBrowserCompatibilityIssuesInCSS(Array.from(rules).map(getCssRuleString).join('')) : null; } catch (error) { return null; } } function getCssRuleString(rule) { var cssStringified = rule.cssText; if (isCSSImportRule(rule)) { try { cssStringified = getCssRulesString(rule.styleSheet) || cssStringified; } catch (_a) { } } return cssStringified; } function isCSSImportRule(rule) { return 'styleSheet' in rule; } var Mirror = (function () { function Mirror() { this.idNodeMap = new Map(); this.nodeMetaMap = new WeakMap(); } Mirror.prototype.getId = function (n) { var _a; if (!n) return -1; var id = (_a = this.getMeta(n)) === null || _a === void 0 ? void 0 : _a.id; return id !== null && id !== void 0 ? id : -1; }; Mirror.prototype.getNode = function (id) { return this.idNodeMap.get(id) || null; }; Mirror.prototype.getIds = function () { return Array.from(this.idNodeMap.keys()); }; Mirror.prototype.getMeta = function (n) { return this.nodeMetaMap.get(n) || null; }; Mirror.prototype.removeNodeFromMap = function (n) { var _this = this; var id = this.getId(n); this.idNodeMap["delete"](id); if (n.childNodes) { n.childNodes.forEach(function (childNode) { return _this.removeNodeFromMap(childNode); }); } }; Mirror.prototype.has = function (id) { return this.idNodeMap.has(id); }; Mirror.prototype.hasNode = function (node) { return this.nodeMetaMap.has(node); }; Mirror.prototype.add = function (n, meta) { var id = meta.id; this.idNodeMap.set(id, n); this.nodeMetaMap.set(n, meta); }; Mirror.prototype.replace = function (id, n) { var oldNode = this.getNode(id); if (oldNode) { var meta = this.nodeMetaMap.get(oldNode); if (meta) this.nodeMetaMap.set(n, meta); } this.idNodeMap.set(id, n); }; Mirror.prototype.reset = function () { this.idNodeMap = new Map(); this.nodeMetaMap = new WeakMap(); }; return Mirror; }()); function createMirror() { return new Mirror(); } function maskInputValue(_a) { var maskInputOptions = _a.maskInputOptions, tagName = _a.tagName, type = _a.type, value = _a.value, maskInputFn = _a.maskInputFn; var text = value || ''; if (maskInputOptions[tagName.toLowerCase()] || maskInputOptions[type]) { if (maskInputFn) { text = maskInputFn(text); } else { text = '*'.repeat(text.length); } } return text; } var ORIGINAL_ATTRIBUTE_NAME = '__rrweb_original__'; function is2DCanvasBlank(canvas) { var ctx = canvas.getContext('2d'); if (!ctx) return true; var chunkSize = 50; for (var x = 0; x < canvas.width; x += chunkSize) { for (var y = 0; y < canvas.height; y += chunkSize) { var getImageData = ctx.getImageData; var originalGetImageData = ORIGINAL_ATTRIBUTE_NAME in getImageData ? getImageData[ORIGINAL_ATTRIBUTE_NAME] : getImageData; var pixelBuffer = new Uint32Array(originalGetImageData.call(ctx, x, y, Math.min(chunkSize, canvas.width - x), Math.min(chunkSize, canvas.height - y)).data.buffer); if (pixelBuffer.some(function (pixel) { return pixel !== 0; })) return false; } } return true; } var _id = 1; var tagNameRegex = new RegExp('[^a-z0-9-_:]'); var IGNORED_NODE = -2; function genId() { return _id++; } function getValidTagName(element) { if (element instanceof HTMLFormElement) { return 'form'; } var processedTagName = element.tagName.toLowerCase().trim(); if (tagNameRegex.test(processedTagName)) { return 'div'; } return processedTagName; } function stringifyStyleSheet(sheet) { return sheet.cssRules ? Array.from(sheet.cssRules) .map(function (rule) { return rule.cssText || ''; }) .join('') : ''; } function extractOrigin(url) { var origin = ''; if (url.indexOf('//') > -1) { origin = url.split('/').slice(0, 3).join('/'); } else { origin = url.split('/')[0]; } origin = origin.split('?')[0]; return origin; } var canvasService; var canvasCtx; var URL_IN_CSS_REF = /url\((?:(')([^']*)'|(")(.*?)"|([^)]*))\)/gm; var RELATIVE_PATH = /^(?!www\.|(?:http|ftp)s?:\/\/|[A-Za-z]:\\|\/\/|#).*/; var DATA_URI = /^(data:)([^,]*),(.*)/i; function absoluteToStylesheet(cssText, href) { return (cssText || '').replace(URL_IN_CSS_REF, function (origin, quote1, path1, quote2, path2, path3) { var filePath = path1 || path2 || path3; var maybeQuote = quote1 || quote2 || ''; if (!filePath) { return origin; } if (!RELATIVE_PATH.test(filePath)) { return "url(".concat(maybeQuote).concat(filePath).concat(maybeQuote, ")"); } if (DATA_URI.test(filePath)) { return "url(".concat(maybeQuote).concat(filePath).concat(maybeQuote, ")"); } if (filePath[0] === '/') { return "url(".concat(maybeQuote).concat(extractOrigin(href) + filePath).concat(maybeQuote, ")"); } var stack = href.split('/'); var parts = filePath.split('/'); stack.pop(); for (var _i = 0, parts_1 = parts; _i < parts_1.length; _i++) { var part = parts_1[_i]; if (part === '.') { continue; } else if (part === '..') { stack.pop(); } else { stack.push(part); } } return "url(".concat(maybeQuote).concat(stack.join('/')).concat(maybeQuote, ")"); }); } var SRCSET_NOT_SPACES = /^[^ \t\n\r\u000c]+/; var SRCSET_COMMAS_OR_SPACES = /^[, \t\n\r\u000c]+/; function getAbsoluteSrcsetString(doc, attributeValue) { if (attributeValue.trim() === '') { return attributeValue; } var pos = 0; function collectCharacters(regEx) { var chars; var match = regEx.exec(attributeValue.substring(pos)); if (match) { chars = match[0]; pos += chars.length; return chars; } return ''; } var output = []; while (true) { collectCharacters(SRCSET_COMMAS_OR_SPACES); if (pos >= attributeValue.length) { break; } var url = collectCharacters(SRCSET_NOT_SPACES); if (url.slice(-1) === ',') { url = absoluteToDoc(doc, url.substring(0, url.length - 1)); output.push(url); } else { var descriptorsStr = ''; url = absoluteToDoc(doc, url); var inParens = false; while (true) { var c = attributeValue.charAt(pos); if (c === '') { output.push((url + descriptorsStr).trim()); break; } else if (!inParens) { if (c === ',') { pos += 1; output.push((url + descriptorsStr).trim()); break; } else if (c === '(') { inParens = true; } } else { if (c === ')') { inParens = false; } } descriptorsStr += c; pos += 1; } } } return output.join(', '); } function absoluteToDoc(doc, attributeValue) { if (!attributeValue || attributeValue.trim() === '') { return attributeValue; } var a = doc.createElement('a'); a.href = attributeValue; return a.href; } function isSVGElement(el) { return Boolean(el.tagName === 'svg' || el.ownerSVGElement); } function getHref() { var a = document.createElement('a'); a.href = ''; return a.href; } function transformAttribute(doc, tagName, name, value) { if (name === 'src' || (name === 'href' && value && !(tagName === 'use' && value[0] === '#'))) { return absoluteToDoc(doc, value); } else if (name === 'xlink:href' && value && value[0] !== '#') { return absoluteToDoc(doc, value); } else if (name === 'background' && value && (tagName === 'table' || tagName === 'td' || tagName === 'th')) { return absoluteToDoc(doc, value); } else if (name === 'srcset' && value) { return getAbsoluteSrcsetString(doc, value); } else if (name === 'style' && value) { return absoluteToStylesheet(value, getHref()); } else if (tagName === 'object' && name === 'data' && value) { return absoluteToDoc(doc, value); } else { return value; } } function _isBlockedElement(element, blockClass, blockSelector) { if (typeof blockClass === 'string') { if (element.classList.contains(blockClass)) { return true; } } else { for (var eIndex = element.classList.length; eIndex--;) { var className = element.classList[eIndex]; if (blockClass.test(className)) { return true; } } } if (blockSelector) { return element.matches(blockSelector); } return false; } function classMatchesRegex(node, regex, checkAncestors) { if (!node) return false; if (node.nodeType !== node.ELEMENT_NODE) { if (!checkAncestors) return false; return classMatchesRegex(node.parentNode, regex, checkAncestors); } for (var eIndex = node.classList.length; eIndex--;) { var className = node.classList[eIndex]; if (regex.test(className)) { return true; } } if (!checkAncestors) return false; return classMatchesRegex(node.parentNode, regex, checkAncestors); } function needMaskingText(node, maskTextClass, maskTextSelector) { var el = node.nodeType === node.ELEMENT_NODE ? node : node.parentElement; if (el === null) return false; if (typeof maskTextClass === 'string') { if (el.classList.contains(maskTextClass)) return true; if (el.closest(".".concat(maskTextClass))) return true; } else { if (classMatchesRegex(el, maskTextClass, true)) return true; } if (maskTextSelector) { if (el.matches(maskTextSelector)) return true; if (el.closest(maskTextSelector)) return true; } return false; } function onceIframeLoaded(iframeEl, listener, iframeLoadTimeout) { var win = iframeEl.contentWindow; if (!win) { return; } var fired = false; var readyState; try { readyState = win.document.readyState; } catch (error) { return; } if (readyState !== 'complete') { var timer_1 = setTimeout(function () { if (!fired) { listener(); fired = true; } }, iframeLoadTimeout); iframeEl.addEventListener('load', function () { clearTimeout(timer_1); fired = true; listener(); }); return; } var blankUrl = 'about:blank'; if (win.location.href !== blankUrl || iframeEl.src === blankUrl || iframeEl.src === '') { setTimeout(listener, 0); return iframeEl.addEventListener('load', listener); } iframeEl.addEventListener('load', listener); } function onceStylesheetLoaded(link, listener, styleSheetLoadTimeout) { var fired = false; var styleSheetLoaded; try { styleSheetLoaded = link.sheet; } catch (error) { return; } if (styleSheetLoaded) return; var timer = setTimeout(function () { if (!fired) { listener(); fired = true; } }, styleSheetLoadTimeout); link.addEventListener('load', function () { clearTimeout(timer); fired = true; listener(); }); } function serializeNode(n, options) { 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; var rootId = getRootId(doc, mirror); switch (n.nodeType) { case n.DOCUMENT_NODE: if (n.compatMode !== 'CSS1Compat') { return { type: NodeType.Document, childNodes: [], compatMode: n.compatMode }; } else { return { type: NodeType.Document, childNodes: [] }; } case n.DOCUMENT_TYPE_NODE: return { type: NodeType.DocumentType, name: n.name, publicId: n.publicId, systemId: n.systemId, rootId: rootId }; case n.ELEMENT_NODE: return serializeElementNode(n, { doc: doc, blockClass: blockClass, blockSelector: blockSelector, inlineStylesheet: inlineStylesheet, maskInputOptions: maskInputOptions, maskInputFn: maskInputFn, dataURLOptions: dataURLOptions, inlineImages: inlineImages, recordCanvas: recordCanvas, keepIframeSrcFn: keepIframeSrcFn, newlyAddedElement: newlyAddedElement, rootId: rootId }); case n.TEXT_NODE: return serializeTextNode(n, { maskTextClass: maskTextClass, maskTextSelector: maskTextSelector, maskTextFn: maskTextFn, rootId: rootId }); case n.CDATA_SECTION_NODE: return { type: NodeType.CDATA, textContent: '', rootId: rootId }; case n.COMMENT_NODE: return { type: NodeType.Comment, textContent: n.textContent || '', rootId: rootId }; default: return false; } } function getRootId(doc, mirror) { if (!mirror.hasNode(doc)) return undefined; var docId = mirror.getId(doc); return docId === 1 ? undefined : docId; } function serializeTextNode(n, options) { var _a; var maskTextClass = options.maskTextClass, maskTextSelector = options.maskTextSelector, maskTextFn = options.maskTextFn, rootId = options.rootId; var parentTagName = n.parentNode && n.parentNode.tagName; var textContent = n.textContent; var isStyle = parentTagName === 'STYLE' ? true : undefined; var isScript = parentTagName === 'SCRIPT' ? true : undefined; if (isStyle && textContent) { try { if (n.nextSibling || n.previousSibling) { } else if ((_a = n.parentNode.sheet) === null || _a === void 0 ? void 0 : _a.cssRules) { textContent = stringifyStyleSheet(n.parentNode.sheet); } } catch (err) { console.warn("Cannot get CSS styles from text's parentNode. Error: ".concat(err), n); } textContent = absoluteToStylesheet(textContent, getHref()); } if (isScript) { textContent = 'SCRIPT_PLACEHOLDER'; } if (!isStyle && !isScript && textContent && needMaskingText(n, maskTextClass, maskTextSelector)) { textContent = maskTextFn ? maskTextFn(textContent) : textContent.replace(/[\S]/g, '*'); } return { type: NodeType.Text, textContent: textContent || '', isStyle: isStyle, rootId: rootId }; } function serializeElementNode(n, options) { 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; var needBlock = _isBlockedElement(n, blockClass, blockSelector); var tagName = getValidTagName(n); var attributes = {}; var len = n.attributes.length; for (var i = 0; i < len; i++) { var attr = n.attributes[i]; attributes[attr.name] = transformAttribute(doc, tagName, attr.name, attr.value); } if (tagName === 'link' && inlineStylesheet) { var stylesheet = Array.from(doc.styleSheets).find(function (s) { return s.href === n.href; }); var cssText = null; if (stylesheet) { cssText = getCssRulesString(stylesheet); } if (cssText) { delete attributes.rel; delete attributes.href; attributes._cssText = absoluteToStylesheet(cssText, stylesheet.href); } } if (tagName === 'style' && n.sheet && !(n.innerText || n.textContent || '').trim().length) { var cssText = getCssRulesString(n.sheet); if (cssText) { attributes._cssText = absoluteToStylesheet(cssText, getHref()); } } if (tagName === 'input' || tagName === 'textarea' || tagName === 'select') { var value = n.value; var checked = n.checked; if (attributes.type !== 'radio' && attributes.type !== 'checkbox' && attributes.type !== 'submit' && attributes.type !== 'button' && value) { attributes.value = maskInputValue({ type: attributes.type, tagName: tagName, value: value, maskInputOptions: maskInputOptions, maskInputFn: maskInputFn }); } else if (checked) { attributes.checked = checked; } } if (tagName === 'option') { if (n.selected && !maskInputOptions['select']) { attributes.selected = true; } else { delete attributes.selected; } } if (tagName === 'canvas' && recordCanvas) { if (n.__context === '2d') { if (!is2DCanvasBlank(n)) { attributes.rr_dataURL = n.toDataURL(dataURLOptions.type, dataURLOptions.quality); } } else if (!('__context' in n)) { var canvasDataURL = n.toDataURL(dataURLOptions.type, dataURLOptions.quality); var blankCanvas = document.createElement('canvas'); blankCanvas.width = n.width; blankCanvas.height = n.height; var blankCanvasDataURL = blankCanvas.toDataURL(dataURLOptions.type, dataURLOptions.quality); if (canvasDataURL !== blankCanvasDataURL) { attributes.rr_dataURL = canvasDataURL; } } } if (tagName === 'img' && inlineImages) { if (!canvasService) { canvasService = doc.createElement('canvas'); canvasCtx = canvasService.getContext('2d'); } var image_1 = n; var oldValue_1 = image_1.crossOrigin; image_1.crossOrigin = 'anonymous'; var recordInlineImage = function () { try { canvasService.width = image_1.naturalWidth; canvasService.height = image_1.naturalHeight; canvasCtx.drawImage(image_1, 0, 0); attributes.rr_dataURL = canvasService.toDataURL(dataURLOptions.type, dataURLOptions.quality); } catch (err) { console.warn("Cannot inline img src=".concat(image_1.currentSrc, "! Error: ").concat(err)); } oldValue_1 ? (attributes.crossOrigin = oldValue_1) : image_1.removeAttribute('crossorigin'); }; if (image_1.complete && image_1.naturalWidth !== 0) recordInlineImage(); else image_1.onload = recordInlineImage; } if (tagName === 'audio' || tagName === 'video') { attributes.rr_mediaState = n.paused ? 'paused' : 'played'; attributes.rr_mediaCurrentTime = n.currentTime; } if (!newlyAddedElement) { if (n.scrollLeft) { attributes.rr_scrollLeft = n.scrollLeft; } if (n.scrollTop) { attributes.rr_scrollTop = n.scrollTop; } } if (needBlock) { var _d = n.getBoundingClientRect(), width = _d.width, height = _d.height; attributes = { "class": attributes["class"], rr_width: "".concat(width, "px"), rr_height: "".concat(height, "px") }; } if (tagName === 'iframe' && !keepIframeSrcFn(attributes.src)) { if (!n.contentDocument) { attributes.rr_src = attributes.src; } delete attributes.src; } return { type: NodeType.Element, tagName: tagName, attributes: attributes, childNodes: [], isSVG: isSVGElement(n) || undefined, needBlock: needBlock, rootId: rootId }; } function lowerIfExists(maybeAttr) { if (maybeAttr === undefined) { return ''; } else { return maybeAttr.toLowerCase(); } } function slimDOMExcluded(sn, slimDOMOptions) { if (slimDOMOptions.comment && sn.type === NodeType.Comment) { return true; } else if (sn.type === NodeType.Element) { if (slimDOMOptions.script && (sn.tagName === 'script' || (sn.tagName === 'link' && sn.attributes.rel === 'preload' && sn.attributes.as === 'script') || (sn.tagName === 'link' && sn.attributes.rel === 'prefetch' && typeof sn.attributes.href === 'string' && sn.attributes.href.endsWith('.js')))) { return true; } else if (slimDOMOptions.headFavicon && ((sn.tagName === 'link' && sn.attributes.rel === 'shortcut icon') || (sn.tagName === 'meta' && (lowerIfExists(sn.attributes.name).match(/^msapplication-tile(image|color)$/) || lowerIfExists(sn.attributes.name) === 'application-name' || lowerIfExists(sn.attributes.rel) === 'icon' || lowerIfExists(sn.attributes.rel) === 'apple-touch-icon' || lowerIfExists(sn.attributes.rel) === 'shortcut icon')))) { return true; } else if (sn.tagName === 'meta') { if (slimDOMOptions.headMetaDescKeywords && lowerIfExists(sn.attributes.name).match(/^description|keywords$/)) { return true; } else if (slimDOMOptions.headMetaSocial && (lowerIfExists(sn.attributes.property).match(/^(og|twitter|fb):/) || lowerIfExists(sn.attributes.name).match(/^(og|twitter):/) || lowerIfExists(sn.attributes.name) === 'pinterest')) { return true; } else if (slimDOMOptions.headMetaRobots && (lowerIfExists(sn.attributes.name) === 'robots' || lowerIfExists(sn.attributes.name) === 'googlebot' || lowerIfExists(sn.attributes.name) === 'bingbot')) { return true; } else if (slimDOMOptions.headMetaHttpEquiv && sn.attributes['http-equiv'] !== undefined) { return true; } else if (slimDOMOptions.headMetaAuthorship && (lowerIfExists(sn.attributes.name) === 'author' || lowerIfExists(sn.attributes.name) === 'generator' || lowerIfExists(sn.attributes.name) === 'framework' || lowerIfExists(sn.attributes.name) === 'publisher' || lowerIfExists(sn.attributes.name) === 'progid' || lowerIfExists(sn.attributes.property).match(/^article:/) || lowerIfExists(sn.attributes.property).match(/^product:/))) { return true; } else if (slimDOMOptions.headMetaVerification && (lowerIfExists(sn.attributes.name) === 'google-site-verification' || lowerIfExists(sn.attributes.name) === 'yandex-verification' || lowerIfExists(sn.attributes.name) === 'csrf-token' || lowerIfExists(sn.attributes.name) === 'p:domain_verify' || lowerIfExists(sn.attributes.name) === 'verify-v1' || lowerIfExists(sn.attributes.name) === 'verification' || lowerIfExists(sn.attributes.name) === 'shopify-checkout-api-token')) { return true; } } } return false; } function serializeNodeWithId(n, options) { 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; var _l = options.preserveWhiteSpace, preserveWhiteSpace = _l === void 0 ? true : _l; var _serializedNode = serializeNode(n, { doc: doc, mirror: mirror, blockClass: blockClass, blockSelector: blockSelector, maskTextClass: maskTextClass, maskTextSelector: maskTextSelector, inlineStylesheet: inlineStylesheet, maskInputOptions: maskInputOptions, maskTextFn: maskTextFn, maskInputFn: maskInputFn, dataURLOptions: dataURLOptions, inlineImages: inlineImages, recordCanvas: recordCanvas, keepIframeSrcFn: keepIframeSrcFn, newlyAddedElement: newlyAddedElement }); if (!_serializedNode) { console.warn(n, 'not serialized'); return null; } var id; if (mirror.hasNode(n)) { id = mirror.getId(n); } else if (slimDOMExcluded(_serializedNode, slimDOMOptions) || (!preserveWhiteSpace && _serializedNode.type === NodeType.Text && !_serializedNode.isStyle && !_serializedNode.textContent.replace(/^\s+|\s+$/gm, '').length)) { id = IGNORED_NODE; } else { id = genId(); } var serializedNode = Object.assign(_serializedNode, { id: id }); mirror.add(n, serializedNode); if (id === IGNORED_NODE) { return null; } if (onSerialize) { onSerialize(n); } var recordChild = !skipChild; if (serializedNode.type === NodeType.Element) { recordChild = recordChild && !serializedNode.needBlock; delete serializedNode.needBlock; var shadowRoot = n.shadowRoot; if (shadowRoot && isNativeShadowDom(shadowRoot)) serializedNode.isShadowHost = true; } if ((serializedNode.type === NodeType.Document || serializedNode.type === NodeType.Element) && recordChild) { if (slimDOMOptions.headWhitespace && serializedNode.type === NodeType.Element && serializedNode.tagName === 'head') { preserveWhiteSpace = false; } var bypassOptions = { doc: doc, mirror: mirror, blockClass: blockClass, blockSelector: blockSelector, maskTextClass: maskTextClass, maskTextSelector: maskTextSelector, skipChild: skipChild, inlineStylesheet: inlineStylesheet, maskInputOptions: maskInputOptions, maskTextFn: maskTextFn, maskInputFn: maskInputFn, slimDOMOptions: slimDOMOptions, dataURLOptions: dataURLOptions, inlineImages: inlineImages, recordCanvas: recordCanvas, preserveWhiteSpace: preserveWhiteSpace, onSerialize: onSerialize, onIframeLoad: onIframeLoad, iframeLoadTimeout: iframeLoadTimeout, onStylesheetLoad: onStylesheetLoad, stylesheetLoadTimeout: stylesheetLoadTimeout, keepIframeSrcFn: keepIframeSrcFn }; for (var _i = 0, _m = Array.from(n.childNodes); _i < _m.length; _i++) { var childN = _m[_i]; var serializedChildNode = serializeNodeWithId(childN, bypassOptions); if (serializedChildNode) { serializedNode.childNodes.push(serializedChildNode); } } if (isElement(n) && n.shadowRoot) { for (var _o = 0, _p = Array.from(n.shadowRoot.childNodes); _o < _p.length; _o++) { var childN = _p[_o]; var serializedChildNode = serializeNodeWithId(childN, bypassOptions); if (serializedChildNode) { isNativeShadowDom(n.shadowRoot) && (serializedChildNode.isShadow = true); serializedNode.childNodes.push(serializedChildNode); } } } } if (n.parentNode && isShadowRoot(n.parentNode) && isNativeShadowDom(n.parentNode)) { serializedNode.isShadow = true; } if (serializedNode.type === NodeType.Element && serializedNode.tagName === 'iframe') { onceIframeLoaded(n, function () { var iframeDoc = n.contentDocument; if (iframeDoc && onIframeLoad) { var serializedIframeNode = serializeNodeWithId(iframeDoc, { doc: iframeDoc, mirror: mirror, blockClass: blockClass, blockSelector: blockSelector, maskTextClass: maskTextClass, maskTextSelector: maskTextSelector, skipChild: false, inlineStylesheet: inlineStylesheet, maskInputOptions: maskInputOptions, maskTextFn: maskTextFn, maskInputFn: maskInputFn, slimDOMOptions: slimDOMOptions, dataURLOptions: dataURLOptions, inlineImages: inlineImages, recordCanvas: recordCanvas, preserveWhiteSpace: preserveWhiteSpace, onSerialize: onSerialize, onIframeLoad: onIframeLoad, iframeLoadTimeout: iframeLoadTimeout, onStylesheetLoad: onStylesheetLoad, stylesheetLoadTimeout: stylesheetLoadTimeout, keepIframeSrcFn: keepIframeSrcFn }); if (serializedIframeNode) { onIframeLoad(n, serializedIframeNode); } } }, iframeLoadTimeout); } if (serializedNode.type === NodeType.Element && serializedNode.tagName === 'link' && serializedNode.attributes.rel === 'stylesheet') { onceStylesheetLoaded(n, function () { if (onStylesheetLoad) { var serializedLinkNode = serializeNodeWithId(n, { doc: doc, mirror: mirror, blockClass: blockClass, blockSelector: blockSelector, maskTextClass: maskTextClass, maskTextSelector: maskTextSelector, skipChild: false, inlineStylesheet: inlineStylesheet, maskInputOptions: maskInputOptions, maskTextFn: maskTextFn, maskInputFn: maskInputFn, slimDOMOptions: slimDOMOptions, dataURLOptions: dataURLOptions, inlineImages: inlineImages, recordCanvas: recordCanvas, preserveWhiteSpace: preserveWhiteSpace, onSerialize: onSerialize, onIframeLoad: onIframeLoad, iframeLoadTimeout: iframeLoadTimeout, onStylesheetLoad: onStylesheetLoad, stylesheetLoadTimeout: stylesheetLoadTimeout, keepIframeSrcFn: keepIframeSrcFn }); if (serializedLinkNode) { onStylesheetLoad(n, serializedLinkNode); } } }, stylesheetLoadTimeout); } return serializedNode; } function snapshot(n, options) { 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; var maskInputOptions = maskAllInputs === true ? { color: true, date: true, 'datetime-local': true, email: true, month: true, number: true, range: true, search: true, tel: true, text: true, time: true, url: true, week: true, textarea: true, select: true, password: true } : maskAllInputs === false ? { password: true } : maskAllInputs; var slimDOMOptions = slimDOM === true || slimDOM === 'all' ? { script: true, comment: true, headFavicon: true, headWhitespace: true, headMetaDescKeywords: slimDOM === 'all', headMetaSocial: true, headMetaRobots: true, headMetaHttpEquiv: true, headMetaAuthorship: true, headMetaVerification: true } : slimDOM === false ? {} : slimDOM; return serializeNodeWithId(n, { doc: n, mirror: mirror, blockClass: blockClass, blockSelector: blockSelector, maskTextClass: maskTextClass, maskTextSelector: maskTextSelector, skipChild: false, inlineStylesheet: inlineStylesheet, maskInputOptions: maskInputOptions, maskTextFn: maskTextFn, maskInputFn: maskInputFn, slimDOMOptions: slimDOMOptions, dataURLOptions: dataURLOptions, inlineImages: inlineImages, recordCanvas: recordCanvas, preserveWhiteSpace: preserveWhiteSpace, onSerialize: onSerialize, onIframeLoad: onIframeLoad, iframeLoadTimeout: iframeLoadTimeout, onStylesheetLoad: onStylesheetLoad, stylesheetLoadTimeout: stylesheetLoadTimeout, keepIframeSrcFn: keepIframeSrcFn, newlyAddedElement: false }); } function on(type, fn, target = document) { const options = { capture: true, passive: true }; target.addEventListener(type, fn, options); return () => target.removeEventListener(type, fn, options); } const DEPARTED_MIRROR_ACCESS_WARNING = 'Please stop import mirror directly. Instead of that,' + '\r\n' + 'now you can use replayer.getMirror() to access the mirror instance of a replayer,' + '\r\n' + 'or you can use record.mirror to access the mirror instance during recording.'; let _mirror = { map: {}, getId() { console.error(DEPARTED_MIRROR_ACCESS_WARNING); return -1; }, getNode() { console.error(DEPARTED_MIRROR_ACCESS_WARNING); return null; }, removeNodeFromMap() { console.error(DEPARTED_MIRROR_ACCESS_WARNING); }, has() { console.error(DEPARTED_MIRROR_ACCESS_WARNING); return false; }, reset() { console.error(DEPARTED_MIRROR_ACCESS_WARNING); }, }; if (typeof window !== 'undefined' && window.Proxy && window.Reflect) { _mirror = new Proxy(_mirror, { get(target, prop, receiver) { if (prop === 'map') { console.error(DEPARTED_MIRROR_ACCESS_WARNING); } return Reflect.get(target, prop, receiver); }, }); } function throttle(func, wait, options = {}) { let timeout = null; let previous = 0; return function (...args) { const now = Date.now(); if (!previous && options.leading === false) { previous = now; } const remaining = wait - (now - previous); const context = this; if (remaining <= 0 || remaining > wait) { if (timeout) { clearTimeout(timeout); timeout = null; } previous = now; func.apply(context, args); } else if (!timeout && options.trailing !== false) { timeout = setTimeout(() => { previous = options.leading === false ? 0 : Date.now(); timeout = null; func.apply(context, args); }, remaining); } }; } function hookSetter(target, key, d, isRevoked, win = window) { const original = win.Object.getOwnPropertyDescriptor(target, key); win.Object.defineProperty(target, key, isRevoked ? d : { set(value) { setTimeout(() => { d.set.call(this, value); }, 0); if (original && original.set) { original.set.call(this, value); } }, }); return () => hookSetter(target, key, original || {}, true); } function patch(source, name, replacement) { try { if (!(name in source)) { return () => { }; } const original = source[name]; const wrapped = replacement(original); if (typeof wrapped === 'function') { wrapped.prototype = wrapped.prototype || {}; Object.defineProperties(wrapped, { __rrweb_original__: { enumerable: false, value: original, }, }); } source[name] = wrapped; return () => { source[name] = original; }; } catch (_a) { return () => { }; } } function getWindowHeight() { return (window.innerHeight || (document.documentElement && document.documentElement.clientHeight) || (document.body && document.body.clientHeight)); } function getWindowWidth() { return (window.innerWidth || (document.documentElement && document.documentElement.clientWidth) || (document.body && document.body.clientWidth)); } function isBlocked(node, blockClass, blockSelector, checkAncestors) { if (!node) { return false; } const el = node.nodeType === node.ELEMENT_NODE ? node : node.parentElement; if (!el) return false; if (typeof blockClass === 'string') { if (el.classList.contains(blockClass)) return true; if (checkAncestors && el.closest('.' + blockClass) !== null) return true; } else { if (classMatchesRegex(el, blockClass, checkAncestors)) return true; } if (blockSelector) { if (node.matches(blockSelector)) return true; if (checkAncestors && el.closest(blockSelector) !== null) return true; } return false; } function isSerialized(n, mirror) { return mirror.getId(n) !== -1; } function isIgnored(n, mirror) { return mirror.getId(n) === IGNORED_NODE; } function isAncestorRemoved(target, mirror) { if (isShadowRoot(target)) { return false; } const id = mirror.getId(target); if (!mirror.has(id)) { return true; } if (target.parentNode && target.parentNode.nodeType === target.DOCUMENT_NODE) { return false; } if (!target.parentNode) { return true; } return isAncestorRemoved(target.parentNode, mirror); } function isTouchEvent