clarity-js 0.8.20 → 0.8.22

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.
@@ -1,8 +1,8 @@
1
1
  var dom = /*#__PURE__*/Object.freeze({
2
2
  __proto__: null,
3
- get add () { return add; },
3
+ get add () { return add$1; },
4
4
  get get () { return get; },
5
- get getId () { return getId; },
5
+ get getId () { return getId$1; },
6
6
  get getNode () { return getNode; },
7
7
  get getValue () { return getValue; },
8
8
  get has () { return has$1; },
@@ -187,7 +187,7 @@ function stop$F() {
187
187
  startTime = 0;
188
188
  }
189
189
 
190
- var version$1 = "0.8.20";
190
+ var version$1 = "0.8.22";
191
191
 
192
192
  // tslint:disable: no-bitwise
193
193
  function hash (input, precision) {
@@ -1257,7 +1257,7 @@ function recompute$8(evt) {
1257
1257
  var value = element.value;
1258
1258
  var checksum = value && value.length >= 5 /* Setting.WordLength */ && config$2.fraud && "password,secret,pass,social,ssn,code,hidden" /* Mask.Exclude */.indexOf(element.type) === -1 ? hash(value, 28 /* Setting.ChecksumPrecision */) : "" /* Constant.Empty */;
1259
1259
  state$a.push({ time: time(evt), event: 42 /* Event.Change */, data: { target: target(evt), type: element.type, value: value, checksum: checksum } });
1260
- schedule(encode$3.bind(this, 42 /* Event.Change */));
1260
+ schedule(encode$4.bind(this, 42 /* Event.Change */));
1261
1261
  }
1262
1262
  }
1263
1263
  function reset$m() {
@@ -1295,7 +1295,7 @@ function observe$b(root) {
1295
1295
  function handler$3(event, root, evt) {
1296
1296
  handler$3.dn = 6 /* FunctionNames.ClickHandler */;
1297
1297
  var frame = iframe(root);
1298
- var d = frame ? frame.contentDocument.documentElement : document.documentElement;
1298
+ var d = frame && frame.contentDocument ? frame.contentDocument.documentElement : document.documentElement;
1299
1299
  var x = "pageX" in evt ? Math.round(evt.pageX) : ("clientX" in evt ? Math.round(evt["clientX"] + d.scrollLeft) : null);
1300
1300
  var y = "pageY" in evt ? Math.round(evt.pageY) : ("clientY" in evt ? Math.round(evt["clientY"] + d.scrollTop) : null);
1301
1301
  // In case of iframe, we adjust (x,y) to be relative to top parent's origin
@@ -1341,7 +1341,7 @@ function handler$3(event, root, evt) {
1341
1341
  isFullText: textInfo.isFullText,
1342
1342
  }
1343
1343
  });
1344
- schedule(encode$3.bind(this, event));
1344
+ schedule(encode$4.bind(this, event));
1345
1345
  }
1346
1346
  }
1347
1347
  function link(node) {
@@ -1432,7 +1432,7 @@ function observe$a(root) {
1432
1432
  function recompute$7(action, evt) {
1433
1433
  recompute$7.dn = 7 /* FunctionNames.ClipboardRecompute */;
1434
1434
  state$8.push({ time: time(evt), event: 38 /* Event.Clipboard */, data: { target: target(evt), action: action } });
1435
- schedule(encode$3.bind(this, 38 /* Event.Clipboard */));
1435
+ schedule(encode$4.bind(this, 38 /* Event.Clipboard */));
1436
1436
  }
1437
1437
  function reset$k() {
1438
1438
  state$8 = [];
@@ -1473,7 +1473,7 @@ function recompute$6(evt) {
1473
1473
  }
1474
1474
  }
1475
1475
  function process$7(event) {
1476
- schedule(encode$3.bind(this, event));
1476
+ schedule(encode$4.bind(this, event));
1477
1477
  }
1478
1478
  function reset$j() {
1479
1479
  state$7 = [];
@@ -1505,7 +1505,7 @@ function observe$8(root) {
1505
1505
  function mouse(event, root, evt) {
1506
1506
  mouse.dn = 10 /* FunctionNames.PointerMouse */;
1507
1507
  var frame = iframe(root);
1508
- var d = frame ? frame.contentDocument.documentElement : document.documentElement;
1508
+ var d = frame && frame.contentDocument ? frame.contentDocument.documentElement : document.documentElement;
1509
1509
  var x = "pageX" in evt ? Math.round(evt.pageX) : ("clientX" in evt ? Math.round(evt["clientX"] + d.scrollLeft) : null);
1510
1510
  var y = "pageY" in evt ? Math.round(evt.pageY) : ("clientY" in evt ? Math.round(evt["clientY"] + d.scrollTop) : null);
1511
1511
  // In case of iframe, we adjust (x,y) to be relative to top parent's origin
@@ -1522,7 +1522,7 @@ function mouse(event, root, evt) {
1522
1522
  function touch(event, root, evt) {
1523
1523
  touch.dn = 11 /* FunctionNames.PointerTouch */;
1524
1524
  var frame = iframe(root);
1525
- var d = frame ? frame.contentDocument.documentElement : document.documentElement;
1525
+ var d = frame && frame.contentDocument ? frame.contentDocument.documentElement : document.documentElement;
1526
1526
  var touches = evt.changedTouches;
1527
1527
  var t = time(evt);
1528
1528
  if (touches) {
@@ -1584,7 +1584,7 @@ function handler$2(current) {
1584
1584
  }
1585
1585
  }
1586
1586
  function process$6(event) {
1587
- schedule(encode$3.bind(this, event));
1587
+ schedule(encode$4.bind(this, event));
1588
1588
  }
1589
1589
  function reset$i() {
1590
1590
  state$6 = [];
@@ -1606,43 +1606,6 @@ function stop$t() {
1606
1606
  }
1607
1607
  }
1608
1608
 
1609
- var data$c;
1610
- var timeout$4 = null;
1611
- var initialStateLogged = false;
1612
- function start$u() {
1613
- initialStateLogged = false;
1614
- bind(window, "resize", recompute$5);
1615
- recompute$5();
1616
- }
1617
- function recompute$5() {
1618
- recompute$5.dn = 12 /* FunctionNames.ResizeRecompute */;
1619
- var de = document.documentElement;
1620
- // window.innerWidth includes width of the scrollbar and is not a true representation of the viewport width.
1621
- // Therefore, when possible, use documentElement's clientWidth property.
1622
- data$c = {
1623
- width: de && "clientWidth" in de ? Math.min(de.clientWidth, window.innerWidth) : window.innerWidth,
1624
- height: de && "clientHeight" in de ? Math.min(de.clientHeight, window.innerHeight) : window.innerHeight,
1625
- };
1626
- if (initialStateLogged) {
1627
- clearTimeout$1(timeout$4);
1628
- timeout$4 = setTimeout$1(process$5, 500 /* Setting.LookAhead */, 11 /* Event.Resize */);
1629
- }
1630
- else {
1631
- encode$3(11 /* Event.Resize */);
1632
- initialStateLogged = true;
1633
- }
1634
- }
1635
- function process$5(event) {
1636
- schedule(encode$3.bind(this, event));
1637
- }
1638
- function reset$h() {
1639
- data$c = null;
1640
- clearTimeout$1(timeout$4);
1641
- }
1642
- function stop$s() {
1643
- reset$h();
1644
- }
1645
-
1646
1609
  /**
1647
1610
  * Creates a throttled version of the provided function that only executes at most once
1648
1611
  * every specified duration in milliseconds, ensuring the last event is not lost.
@@ -1691,6 +1654,45 @@ function throttle(func, duration) {
1691
1654
  return throttledFunction;
1692
1655
  }
1693
1656
 
1657
+ var data$c;
1658
+ var timeout$4 = null;
1659
+ var initialStateLogged = false;
1660
+ var throttledRecompute$1 = throttle(recompute$5, 500 /* Setting.LookAhead */);
1661
+ function start$u() {
1662
+ initialStateLogged = false;
1663
+ bind(window, "resize", throttledRecompute$1);
1664
+ recompute$5();
1665
+ }
1666
+ function recompute$5() {
1667
+ recompute$5.dn = 12 /* FunctionNames.ResizeRecompute */;
1668
+ var de = document.documentElement;
1669
+ // window.innerWidth includes width of the scrollbar and is not a true representation of the viewport width.
1670
+ // Therefore, when possible, use documentElement's clientWidth property.
1671
+ data$c = {
1672
+ width: de && "clientWidth" in de ? Math.min(de.clientWidth, window.innerWidth) : window.innerWidth,
1673
+ height: de && "clientHeight" in de ? Math.min(de.clientHeight, window.innerHeight) : window.innerHeight,
1674
+ };
1675
+ if (initialStateLogged) {
1676
+ clearTimeout$1(timeout$4);
1677
+ timeout$4 = setTimeout$1(process$5, 500 /* Setting.LookAhead */, 11 /* Event.Resize */);
1678
+ }
1679
+ else {
1680
+ encode$4(11 /* Event.Resize */);
1681
+ initialStateLogged = true;
1682
+ }
1683
+ }
1684
+ function process$5(event) {
1685
+ schedule(encode$4.bind(this, event));
1686
+ }
1687
+ function reset$h() {
1688
+ data$c = null;
1689
+ clearTimeout$1(timeout$4);
1690
+ throttledRecompute$1.cleanup();
1691
+ }
1692
+ function stop$s() {
1693
+ reset$h();
1694
+ }
1695
+
1694
1696
  var state$5 = [];
1695
1697
  var initialTop = null;
1696
1698
  var initialBottom = null;
@@ -1774,7 +1776,7 @@ function reset$g() {
1774
1776
  initialBottom = null;
1775
1777
  }
1776
1778
  function process$4(event) {
1777
- schedule(encode$3.bind(this, event));
1779
+ schedule(encode$4.bind(this, event));
1778
1780
  }
1779
1781
  function similar(last, current) {
1780
1782
  var dx = last.data.x - current.data.x;
@@ -1843,7 +1845,7 @@ function recompute$3(root) {
1843
1845
  timeout$2 = setTimeout$1(process$3, 500 /* Setting.LookAhead */, 21 /* Event.Selection */);
1844
1846
  }
1845
1847
  function process$3(event) {
1846
- schedule(encode$3.bind(this, event));
1848
+ schedule(encode$4.bind(this, event));
1847
1849
  }
1848
1850
  function reset$f() {
1849
1851
  previous = null;
@@ -1864,7 +1866,7 @@ function observe$5(root) {
1864
1866
  function recompute$2(evt) {
1865
1867
  recompute$2.dn = 16 /* FunctionNames.SubmitRecompute */;
1866
1868
  state$4.push({ time: time(evt), event: 39 /* Event.Submit */, data: { target: target(evt) } });
1867
- schedule(encode$3.bind(this, 39 /* Event.Submit */));
1869
+ schedule(encode$4.bind(this, 39 /* Event.Submit */));
1868
1870
  }
1869
1871
  function reset$e() {
1870
1872
  state$4 = [];
@@ -1880,7 +1882,7 @@ function start$q() {
1880
1882
  function recompute$1(evt) {
1881
1883
  recompute$1.dn = 17 /* FunctionNames.UnloadRecompute */;
1882
1884
  data$a = { name: evt.type, persisted: evt.persisted ? 1 /* BooleanFlag.True */ : 0 /* BooleanFlag.False */ };
1883
- encode$3(26 /* Event.Unload */, time(evt));
1885
+ encode$4(26 /* Event.Unload */, time(evt));
1884
1886
  stop();
1885
1887
  }
1886
1888
  function reset$d() {
@@ -1899,7 +1901,7 @@ function recompute(evt) {
1899
1901
  if (evt === void 0) { evt = null; }
1900
1902
  recompute.dn = 18 /* FunctionNames.VisibilityRecompute */;
1901
1903
  data$9 = { visible: "visibilityState" in document ? document.visibilityState : "default" };
1902
- encode$3(28 /* Event.Visibility */, time(evt));
1904
+ encode$4(28 /* Event.Visibility */, time(evt));
1903
1905
  }
1904
1906
  function reset$c() {
1905
1907
  data$9 = null;
@@ -2078,13 +2080,13 @@ function checkDocumentStyles(documentNode, timestamp) {
2078
2080
  }
2079
2081
  currentStyleSheets.push(styleSheet[styleSheetId]);
2080
2082
  }
2081
- var documentId = getId(documentNode, true);
2083
+ var documentId = getId$1(documentNode, true);
2082
2084
  if (!styleSheetMap[documentId]) {
2083
2085
  styleSheetMap[documentId] = [];
2084
2086
  }
2085
2087
  if (!arraysEqual(currentStyleSheets, styleSheetMap[documentId])) {
2086
2088
  // Using -1 to signify the root document node as we don't track that as part of our nodeMap
2087
- trackStyleAdoption(timestamp, documentNode == document ? -1 : getId(documentNode), 3 /* StyleSheetOperation.SetAdoptedStyles */, currentStyleSheets);
2089
+ trackStyleAdoption(timestamp, documentNode == document ? -1 : getId$1(documentNode), 3 /* StyleSheetOperation.SetAdoptedStyles */, currentStyleSheets);
2088
2090
  styleSheetMap[documentId] = currentStyleSheets;
2089
2091
  styleTimeMap[documentId] = timestamp;
2090
2092
  }
@@ -2092,7 +2094,7 @@ function checkDocumentStyles(documentNode, timestamp) {
2092
2094
  function compute$7() {
2093
2095
  for (var _i = 0, documentNodes_1 = documentNodes; _i < documentNodes_1.length; _i++) {
2094
2096
  var documentNode = documentNodes_1[_i];
2095
- var docId = documentNode == document ? -1 : getId(documentNode);
2097
+ var docId = documentNode == document ? -1 : getId$1(documentNode);
2096
2098
  var ts = docId in styleTimeMap ? styleTimeMap[docId] : null;
2097
2099
  checkDocumentStyles(documentNode, ts);
2098
2100
  }
@@ -2118,7 +2120,7 @@ function trackStyleChange(time, id, operation, cssRules) {
2118
2120
  cssRules: cssRules
2119
2121
  }
2120
2122
  });
2121
- encode$4(46 /* Event.StyleSheetUpdate */);
2123
+ encode$5(46 /* Event.StyleSheetUpdate */);
2122
2124
  }
2123
2125
  function trackStyleAdoption(time, id, operation, newIds) {
2124
2126
  sheetAdoptionState.push({
@@ -2130,7 +2132,7 @@ function trackStyleAdoption(time, id, operation, newIds) {
2130
2132
  newIds: newIds
2131
2133
  }
2132
2134
  });
2133
- encode$4(45 /* Event.StyleSheetAdoption */);
2135
+ encode$5(45 /* Event.StyleSheetAdoption */);
2134
2136
  }
2135
2137
  function arraysEqual(a, b) {
2136
2138
  if (a.length !== b.length) {
@@ -2202,7 +2204,7 @@ function track$6(time, id, operation, keyFrames, timing, targetId, timeline) {
2202
2204
  timeline: timeline
2203
2205
  }
2204
2206
  });
2205
- encode$4(44 /* Event.Animation */);
2207
+ encode$5(44 /* Event.Animation */);
2206
2208
  }
2207
2209
  function stop$k() {
2208
2210
  reset$a();
@@ -2219,7 +2221,7 @@ function overrideAnimationHelper(functionToOverride, name) {
2219
2221
  function trackAnimationOperation(animation, name) {
2220
2222
  if (active()) {
2221
2223
  var effect = animation.effect;
2222
- var target = (effect === null || effect === void 0 ? void 0 : effect.target) ? getId(effect.target) : null;
2224
+ var target = (effect === null || effect === void 0 ? void 0 : effect.target) ? getId$1(effect.target) : null;
2223
2225
  if (target !== null && effect.getKeyframes && effect.getTiming) {
2224
2226
  if (!animation[animationId]) {
2225
2227
  animation[animationId] = shortid();
@@ -2255,7 +2257,7 @@ function trackAnimationOperation(animation, name) {
2255
2257
  }
2256
2258
  }
2257
2259
 
2258
- function encode$4 (type, timer, ts) {
2260
+ function encode$5 (type, timer, ts) {
2259
2261
  if (timer === void 0) { timer = null; }
2260
2262
  if (ts === void 0) { ts = null; }
2261
2263
  return __awaiter(this, void 0, void 0, function () {
@@ -2380,7 +2382,7 @@ function encode$4 (type, timer, ts) {
2380
2382
  case "attributes":
2381
2383
  for (attr in data[key]) {
2382
2384
  if (data[key][attr] !== undefined) {
2383
- tokens.push(attribute(attr, data[key][attr], privacy));
2385
+ tokens.push(attribute$1(attr, data[key][attr], privacy));
2384
2386
  }
2385
2387
  }
2386
2388
  break;
@@ -2423,7 +2425,7 @@ function size(value) {
2423
2425
  function str(input) {
2424
2426
  return input.toString(36);
2425
2427
  }
2426
- function attribute(key, value, privacy) {
2428
+ function attribute$1(key, value, privacy) {
2427
2429
  return "".concat(key, "=").concat(text$1(value, key.indexOf("data-" /* Constant.DataAttribute */) === 0 ? "data-" /* Constant.DataAttribute */ : key, privacy));
2428
2430
  }
2429
2431
 
@@ -2456,14 +2458,14 @@ function compute$6() {
2456
2458
  // Check that width or height has changed from before, and also that width & height are not null values
2457
2459
  if ((data$8 === null || width !== data$8.width || height !== data$8.height) && width !== null && height !== null) {
2458
2460
  data$8 = { width: width, height: height };
2459
- encode$4(8 /* Event.Document */);
2461
+ encode$5(8 /* Event.Document */);
2460
2462
  }
2461
2463
  }
2462
2464
  function stop$j() {
2463
2465
  reset$9();
2464
2466
  }
2465
2467
 
2466
- function traverse (root, timer, source, timestamp) {
2468
+ function traverse$1 (root, timer, source, timestamp) {
2467
2469
  return __awaiter(this, void 0, void 0, function () {
2468
2470
  var queue, entry, next, state$1, subnode;
2469
2471
  return __generator(this, function (_a) {
@@ -2656,7 +2658,7 @@ function process$2() {
2656
2658
  case 4:
2657
2659
  _i++;
2658
2660
  return [3 /*break*/, 2];
2659
- case 5: return [4 /*yield*/, encode$4(6 /* Event.Mutation */, timer, record.time)];
2661
+ case 5: return [4 /*yield*/, encode$5(6 /* Event.Mutation */, timer, record.time)];
2660
2662
  case 6:
2661
2663
  _d.sent();
2662
2664
  return [3 /*break*/, 1];
@@ -2682,7 +2684,7 @@ function process$2() {
2682
2684
  processThrottledMutations();
2683
2685
  }
2684
2686
  if (!(Object.keys(throttledMutations).length === 0 && processedMutations)) return [3 /*break*/, 13];
2685
- return [4 /*yield*/, encode$4(6 /* Event.Mutation */, timer, time())];
2687
+ return [4 /*yield*/, encode$5(6 /* Event.Mutation */, timer, time())];
2686
2688
  case 12:
2687
2689
  _d.sent();
2688
2690
  _d.label = 13;
@@ -2769,7 +2771,7 @@ function processNodeList(list, source, timer, timestamp) {
2769
2771
  if (!(i < length)) return [3 /*break*/, 6];
2770
2772
  node = list[i];
2771
2773
  if (!(source === 1 /* Source.ChildListAdd */)) return [3 /*break*/, 2];
2772
- traverse(node, timer, source, timestamp);
2774
+ traverse$1(node, timer, source, timestamp);
2773
2775
  return [3 /*break*/, 5];
2774
2776
  case 2:
2775
2777
  state$1 = state(timer);
@@ -3055,7 +3057,7 @@ function processNode (node, source, timestamp) {
3055
3057
  case Node.ELEMENT_NODE:
3056
3058
  var element = node;
3057
3059
  var tag = element.tagName;
3058
- var attributes = getAttributes(element);
3060
+ var attributes = getAttributes$1(element);
3059
3061
  // In some cases, external libraries like vue-fragment, can modify parentNode property to not be in sync with the DOM
3060
3062
  // For correctness, we first look at parentElement and if it not present then fall back to using parentNode
3061
3063
  parent = node.parentElement ? node.parentElement : (node.parentNode ? node.parentNode : null);
@@ -3235,7 +3237,7 @@ function getCssRules(sheet) {
3235
3237
  }
3236
3238
  return value;
3237
3239
  }
3238
- function getAttributes(element) {
3240
+ function getAttributes$1(element) {
3239
3241
  var output = {};
3240
3242
  var attributes = element.attributes;
3241
3243
  if (attributes && attributes.length > 0) {
@@ -3347,9 +3349,9 @@ var selector = /*#__PURE__*/Object.freeze({
3347
3349
  reset: reset$8
3348
3350
  });
3349
3351
 
3350
- var index = 1;
3352
+ var index$1 = 1;
3351
3353
  var nodesMap = null; // Maps id => node to retrieve further node details using id.
3352
- var values = [];
3354
+ var values$1 = [];
3353
3355
  var updateMap = [];
3354
3356
  var hashMap = {};
3355
3357
  var override = [];
@@ -3359,7 +3361,7 @@ var maskExclude = [];
3359
3361
  var maskDisable = [];
3360
3362
  var maskTags = [];
3361
3363
  // The WeakMap object is a collection of key/value pairs in which the keys are weakly referenced
3362
- var idMap = null; // Maps node => id.
3364
+ var idMap$1 = null; // Maps node => id.
3363
3365
  var iframeMap = null; // Maps iframe's contentDocument => parent iframe element
3364
3366
  var iframeContentMap = null; // Maps parent iframe element => iframe's contentDocument & contentWindow
3365
3367
  var privacyMap = null; // Maps node => Privacy (enum)
@@ -3372,8 +3374,8 @@ function stop$h() {
3372
3374
  reset$7();
3373
3375
  }
3374
3376
  function reset$7() {
3375
- index = 1;
3376
- values = [];
3377
+ index$1 = 1;
3378
+ values$1 = [];
3377
3379
  updateMap = [];
3378
3380
  hashMap = {};
3379
3381
  override = [];
@@ -3383,7 +3385,7 @@ function reset$7() {
3383
3385
  maskDisable = "radio,checkbox,range,button,reset,submit" /* Mask.Disable */.split("," /* Constant.Comma */);
3384
3386
  maskTags = "INPUT,SELECT,TEXTAREA" /* Mask.Tags */.split("," /* Constant.Comma */);
3385
3387
  nodesMap = new Map();
3386
- idMap = new WeakMap();
3388
+ idMap$1 = new WeakMap();
3387
3389
  iframeMap = new WeakMap();
3388
3390
  iframeContentMap = new WeakMap();
3389
3391
  privacyMap = new WeakMap();
@@ -3414,32 +3416,32 @@ function parse(root, init) {
3414
3416
  log$1(5 /* Code.Selector */, 1 /* Severity.Warning */, e ? e.name : null);
3415
3417
  }
3416
3418
  }
3417
- function getId(node, autogen) {
3419
+ function getId$1(node, autogen) {
3418
3420
  if (autogen === void 0) { autogen = false; }
3419
3421
  if (node === null) {
3420
3422
  return null;
3421
3423
  }
3422
- var id = idMap.get(node);
3424
+ var id = idMap$1.get(node);
3423
3425
  if (!id && autogen) {
3424
- id = index++;
3425
- idMap.set(node, id);
3426
+ id = index$1++;
3427
+ idMap$1.set(node, id);
3426
3428
  }
3427
3429
  return id ? id : null;
3428
3430
  }
3429
- function add(node, parent, data, source) {
3430
- var parentId = parent ? getId(parent) : null;
3431
+ function add$1(node, parent, data, source) {
3432
+ var parentId = parent ? getId$1(parent) : null;
3431
3433
  // Do not add detached nodes
3432
3434
  if ((!parent || !parentId) && node.host == null && node.nodeType !== Node.DOCUMENT_TYPE_NODE) {
3433
3435
  return;
3434
3436
  }
3435
- var id = getId(node, true);
3437
+ var id = getId$1(node, true);
3436
3438
  var previousId = getPreviousId(node);
3437
3439
  var parentValue = null;
3438
3440
  var regionId = exists(node) ? id : null;
3439
3441
  var fraudId = fraudMap.has(node) ? fraudMap.get(node) : null;
3440
3442
  var privacyId = config$2.content ? 1 /* Privacy.Sensitive */ : 3 /* Privacy.TextImage */;
3441
- if (parentId >= 0 && values[parentId]) {
3442
- parentValue = values[parentId];
3443
+ if (parentId >= 0 && values$1[parentId]) {
3444
+ parentValue = values$1[parentId];
3443
3445
  parentValue.children.push(id);
3444
3446
  regionId = regionId === null ? parentValue.region : regionId;
3445
3447
  fraudId = fraudId === null ? parentValue.metadata.fraud : fraudId;
@@ -3451,7 +3453,7 @@ function add(node, parent, data, source) {
3451
3453
  regionId = id;
3452
3454
  }
3453
3455
  nodesMap.set(id, node);
3454
- values[id] = {
3456
+ values$1[id] = {
3455
3457
  id: id,
3456
3458
  parent: parentId,
3457
3459
  previous: previousId,
@@ -3462,19 +3464,19 @@ function add(node, parent, data, source) {
3462
3464
  region: regionId,
3463
3465
  metadata: { active: true, suspend: false, privacy: privacyId, position: null, fraud: fraudId, size: null },
3464
3466
  };
3465
- privacy(node, values[id], parentValue);
3466
- updateSelector(values[id]);
3467
- updateImageSize(values[id]);
3467
+ privacy(node, values$1[id], parentValue);
3468
+ updateSelector(values$1[id]);
3469
+ updateImageSize(values$1[id]);
3468
3470
  track$4(id, source);
3469
3471
  }
3470
3472
  function update(node, parent, data, source) {
3471
- var id = getId(node);
3472
- var parentId = parent ? getId(parent) : null;
3473
+ var id = getId$1(node);
3474
+ var parentId = parent ? getId$1(parent) : null;
3473
3475
  var previousId = getPreviousId(node);
3474
3476
  var changed = false;
3475
3477
  var parentChanged = false;
3476
- if (id in values) {
3477
- var value = values[id];
3478
+ if (id in values$1) {
3479
+ var value = values$1[id];
3478
3480
  value.metadata.active = true;
3479
3481
  // Handle case where internal ordering may have changed
3480
3482
  if (value.previous !== previousId) {
@@ -3488,10 +3490,10 @@ function update(node, parent, data, source) {
3488
3490
  value.parent = parentId;
3489
3491
  // Move this node to the right location under new parent
3490
3492
  if (parentId !== null && parentId >= 0) {
3491
- var childIndex = previousId === null ? 0 : values[parentId].children.indexOf(previousId) + 1;
3492
- values[parentId].children.splice(childIndex, 0, id);
3493
+ var childIndex = previousId === null ? 0 : values$1[parentId].children.indexOf(previousId) + 1;
3494
+ values$1[parentId].children.splice(childIndex, 0, id);
3493
3495
  // Update region after the move
3494
- value.region = exists(node) ? id : values[parentId].region;
3496
+ value.region = exists(node) ? id : values$1[parentId].region;
3495
3497
  }
3496
3498
  else {
3497
3499
  // Mark this element as deleted if the parent has been updated to null
@@ -3499,9 +3501,9 @@ function update(node, parent, data, source) {
3499
3501
  }
3500
3502
  // Remove reference to this node from the old parent
3501
3503
  if (oldParentId !== null && oldParentId >= 0) {
3502
- var nodeIndex = values[oldParentId].children.indexOf(id);
3504
+ var nodeIndex = values$1[oldParentId].children.indexOf(id);
3503
3505
  if (nodeIndex >= 0) {
3504
- values[oldParentId].children.splice(nodeIndex, 1);
3506
+ values$1[oldParentId].children.splice(nodeIndex, 1);
3505
3507
  }
3506
3508
  }
3507
3509
  parentChanged = true;
@@ -3631,7 +3633,7 @@ function position(parent, child) {
3631
3633
  child.metadata.position = 1;
3632
3634
  var idx = parent ? parent.children.indexOf(child.id) : -1;
3633
3635
  while (idx-- > 0) {
3634
- var sibling = values[parent.children[idx]];
3636
+ var sibling = values$1[parent.children[idx]];
3635
3637
  if (child.data.tag === sibling.data.tag) {
3636
3638
  child.metadata.position = sibling.metadata.position + 1;
3637
3639
  break;
@@ -3640,7 +3642,7 @@ function position(parent, child) {
3640
3642
  return child.metadata.position;
3641
3643
  }
3642
3644
  function updateSelector(value) {
3643
- var parent = value.parent && value.parent in values ? values[value.parent] : null;
3645
+ var parent = value.parent && value.parent in values$1 ? values$1[value.parent] : null;
3644
3646
  var prefix = parent ? parent.selector : null;
3645
3647
  var d = value.data;
3646
3648
  var p = position(parent, value);
@@ -3658,35 +3660,35 @@ function getNode(id) {
3658
3660
  return nodesMap.has(id) ? nodesMap.get(id) : null;
3659
3661
  }
3660
3662
  function getValue(id) {
3661
- if (id in values) {
3662
- return values[id];
3663
+ if (id in values$1) {
3664
+ return values$1[id];
3663
3665
  }
3664
3666
  return null;
3665
3667
  }
3666
3668
  function get(node) {
3667
- var id = getId(node);
3668
- return id in values ? values[id] : null;
3669
+ var id = getId$1(node);
3670
+ return id in values$1 ? values$1[id] : null;
3669
3671
  }
3670
3672
  function lookup(hash) {
3671
3673
  return hash in hashMap ? hashMap[hash] : null;
3672
3674
  }
3673
3675
  function has$1(node) {
3674
- return nodesMap.has(getId(node));
3676
+ return nodesMap.has(getId$1(node));
3675
3677
  }
3676
3678
  function updates$2() {
3677
3679
  var output = [];
3678
3680
  for (var _i = 0, updateMap_1 = updateMap; _i < updateMap_1.length; _i++) {
3679
3681
  var id = updateMap_1[_i];
3680
- if (id in values) {
3681
- output.push(values[id]);
3682
+ if (id in values$1) {
3683
+ output.push(values$1[id]);
3682
3684
  }
3683
3685
  }
3684
3686
  updateMap = [];
3685
3687
  return output;
3686
3688
  }
3687
3689
  function remove(id, source) {
3688
- if (id in values) {
3689
- var value = values[id];
3690
+ if (id in values$1) {
3691
+ var value = values$1[id];
3690
3692
  value.metadata.active = false;
3691
3693
  value.parent = null;
3692
3694
  track$4(id, source);
@@ -3706,7 +3708,7 @@ function removeNodeFromNodesMap(id) {
3706
3708
  removeObserver(iframe_1);
3707
3709
  }
3708
3710
  nodesMap.delete(id);
3709
- var value = id in values ? values[id] : null;
3711
+ var value = id in values$1 ? values$1[id] : null;
3710
3712
  if (value && value.children) {
3711
3713
  for (var _i = 0, _a = value.children; _i < _a.length; _i++) {
3712
3714
  var childId = _a[_i];
@@ -3733,7 +3735,7 @@ function getPreviousId(node) {
3733
3735
  // Some nodes may not have an ID by design since Clarity skips over tags like SCRIPT, NOSCRIPT, META, COMMENTS, etc..
3734
3736
  // In that case, we keep going back and check for their sibling until we find a sibling with ID or no more sibling nodes are left.
3735
3737
  while (id === null && node.previousSibling) {
3736
- id = getId(node.previousSibling);
3738
+ id = getId$1(node.previousSibling);
3737
3739
  node = node.previousSibling;
3738
3740
  }
3739
3741
  return id;
@@ -3816,7 +3818,7 @@ function compute$5() {
3816
3818
  var q = [];
3817
3819
  for (var _i = 0, queue_1 = queue$1; _i < queue_1.length; _i++) {
3818
3820
  var r = queue_1[_i];
3819
- var id = getId(r.node);
3821
+ var id = getId$1(r.node);
3820
3822
  if (id) {
3821
3823
  r.state.data.id = id;
3822
3824
  regions[id] = r.state.data;
@@ -3829,7 +3831,7 @@ function compute$5() {
3829
3831
  queue$1 = q;
3830
3832
  // Schedule encode only when we have at least one valid data entry
3831
3833
  if (state$2.length > 0) {
3832
- encode$4(7 /* Event.Region */);
3834
+ encode$5(7 /* Event.Region */);
3833
3835
  }
3834
3836
  }
3835
3837
  function handler$1(entries) {
@@ -3844,7 +3846,7 @@ function handler$1(entries) {
3844
3846
  // like search box - one for desktop, and another for mobile. In those cases, CSS media queries determine which one should be visible.
3845
3847
  // Also, if these regions ever become non-zero width or height (through AJAX, user action or orientation change) - we will automatically start monitoring them from that point onwards
3846
3848
  if (regionMap.has(target) && rect.width + rect.height > 0 && viewport && viewport.width > 0 && viewport.height > 0) {
3847
- var id = target ? getId(target) : null;
3849
+ var id = target ? getId$1(target) : null;
3848
3850
  var data = id in regions ? regions[id] : { id: id, name: regionMap.get(target), interaction: 16 /* InteractionState.None */, visibility: 0 /* RegionVisibility.Rendered */ };
3849
3851
  // For regions that have relatively smaller area, we look at intersection ratio and see the overlap relative to element's area
3850
3852
  // However, for larger regions, area of regions could be bigger than viewport and therefore comparison is relative to visible area
@@ -3865,7 +3867,7 @@ function handler$1(entries) {
3865
3867
  }
3866
3868
  }
3867
3869
  if (state$2.length > 0) {
3868
- encode$4(7 /* Event.Region */);
3870
+ encode$5(7 /* Event.Region */);
3869
3871
  }
3870
3872
  }
3871
3873
  function process$1(n, d, s, v) {
@@ -3932,7 +3934,7 @@ function metadata$2(node, event, text) {
3932
3934
  return output;
3933
3935
  }
3934
3936
 
3935
- function encode$3 (type, ts) {
3937
+ function encode$4 (type, ts) {
3936
3938
  if (ts === void 0) { ts = null; }
3937
3939
  return __awaiter(this, void 0, void 0, function () {
3938
3940
  var t, tokens, _i, _a, entry, pTarget, _b, _c, entry, cTarget, cHash, _d, _e, entry, target, r, u, _f, _g, entry, iTarget, s, startTarget, endTarget, _h, _j, entry, sTarget, top_1, bottom, sTopHash, sBottomHash, _k, _l, entry, target, _m, _o, entry, target, _p, _q, entry, v;
@@ -4171,13 +4173,146 @@ function compute$4() {
4171
4173
  }
4172
4174
  }
4173
4175
  state$1 = temp; // Drop events less than the min time
4174
- encode$3(22 /* Event.Timeline */);
4176
+ encode$4(22 /* Event.Timeline */);
4175
4177
  }
4176
4178
  function stop$f() {
4177
4179
  state$1 = [];
4178
4180
  reset$5();
4179
4181
  }
4180
4182
 
4183
+ function encode$3 (type) {
4184
+ return __awaiter(this, void 0, void 0, function () {
4185
+ var eventTime, tokens, d, values$1, _i, values_1, value, privacy, data, _a, _b, key, attr;
4186
+ return __generator(this, function (_c) {
4187
+ eventTime = time();
4188
+ tokens = [eventTime, type];
4189
+ switch (type) {
4190
+ case 8 /* Event.Document */:
4191
+ d = data$8;
4192
+ tokens.push(d.width);
4193
+ tokens.push(d.height);
4194
+ track$8(type, d.width, d.height);
4195
+ queue(tokens);
4196
+ break;
4197
+ case 43 /* Event.Snapshot */:
4198
+ values$1 = values;
4199
+ // Only encode and queue DOM updates if we have valid updates to report back
4200
+ if (values$1.length > 0) {
4201
+ for (_i = 0, values_1 = values$1; _i < values_1.length; _i++) {
4202
+ value = values_1[_i];
4203
+ privacy = value.metadata.privacy;
4204
+ data = value.data;
4205
+ for (_a = 0, _b = ["tag", "attributes", "value"]; _a < _b.length; _a++) {
4206
+ key = _b[_a];
4207
+ if (data[key]) {
4208
+ switch (key) {
4209
+ case "tag":
4210
+ tokens.push(value.id);
4211
+ if (value.parent) {
4212
+ tokens.push(value.parent);
4213
+ }
4214
+ if (value.previous) {
4215
+ tokens.push(value.previous);
4216
+ }
4217
+ tokens.push(data[key]);
4218
+ break;
4219
+ case "attributes":
4220
+ for (attr in data[key]) {
4221
+ if (data[key][attr] !== undefined) {
4222
+ tokens.push(attribute(attr, data[key][attr], privacy));
4223
+ }
4224
+ }
4225
+ break;
4226
+ case "value":
4227
+ tokens.push(text$1(data[key], data.tag, privacy));
4228
+ break;
4229
+ }
4230
+ }
4231
+ }
4232
+ }
4233
+ queue(tokenize(tokens), true);
4234
+ }
4235
+ break;
4236
+ }
4237
+ return [2 /*return*/];
4238
+ });
4239
+ });
4240
+ }
4241
+ function attribute(key, value, privacy) {
4242
+ return "".concat(key, "=").concat(text$1(value, key.indexOf("data-" /* Constant.DataAttribute */) === 0 ? "data-" /* Constant.DataAttribute */ : key, privacy));
4243
+ }
4244
+
4245
+ var values = [];
4246
+ var index = 1;
4247
+ var idMap = null; // Maps node => id.
4248
+ function snapshot() {
4249
+ values = [];
4250
+ traverse(document);
4251
+ encode$3(43 /* Event.Snapshot */);
4252
+ }
4253
+ function traverse(root) {
4254
+ var queue = [root];
4255
+ while (queue.length > 0) {
4256
+ var attributes = null, tag = null, value = null;
4257
+ var node = queue.shift();
4258
+ var next = node.firstChild;
4259
+ var parent_1 = node.parentElement ? node.parentElement : (node.parentNode ? node.parentNode : null);
4260
+ while (next) {
4261
+ queue.push(next);
4262
+ next = next.nextSibling;
4263
+ }
4264
+ // Process the node
4265
+ var type = node.nodeType;
4266
+ switch (type) {
4267
+ case Node.DOCUMENT_TYPE_NODE:
4268
+ var doctype = node;
4269
+ tag = "*D" /* Constant.DocumentTag */;
4270
+ attributes = { name: doctype.name, publicId: doctype.publicId, systemId: doctype.systemId };
4271
+ break;
4272
+ case Node.TEXT_NODE:
4273
+ value = node.nodeValue;
4274
+ tag = idMap.get(parent_1) ? "*T" /* Constant.TextTag */ : tag;
4275
+ break;
4276
+ case Node.ELEMENT_NODE:
4277
+ var element = node;
4278
+ attributes = getAttributes(element);
4279
+ tag = ["NOSCRIPT", "SCRIPT", "STYLE"].indexOf(element.tagName) < 0 ? element.tagName : tag;
4280
+ break;
4281
+ }
4282
+ add(node, parent_1, { tag: tag, attributes: attributes, value: value });
4283
+ }
4284
+ }
4285
+ /* Helper Functions - Snapshot Traversal */
4286
+ function getAttributes(element) {
4287
+ var output = {};
4288
+ var attributes = element.attributes;
4289
+ if (attributes && attributes.length > 0) {
4290
+ for (var i = 0; i < attributes.length; i++) {
4291
+ output[attributes[i].name] = attributes[i].value;
4292
+ }
4293
+ }
4294
+ return output;
4295
+ }
4296
+ function getId(node) {
4297
+ if (node === null) {
4298
+ return null;
4299
+ }
4300
+ if (idMap.has(node)) {
4301
+ return idMap.get(node);
4302
+ }
4303
+ idMap.set(node, index);
4304
+ return index++;
4305
+ }
4306
+ function add(node, parent, data) {
4307
+ if (node && data && data.tag) {
4308
+ var id = getId(node);
4309
+ var parentId = parent ? idMap.get(parent) : null;
4310
+ var previous = node.previousSibling ? idMap.get(node.previousSibling) : null;
4311
+ var metadata_1 = { active: true, suspend: false, privacy: 5 /* Privacy.Snapshot */, position: null, fraud: null, size: null };
4312
+ values.push({ id: id, parent: parentId, previous: previous, children: [], data: data, selector: null, hash: null, region: null, metadata: metadata_1 });
4313
+ }
4314
+ }
4315
+
4181
4316
  var discoverBytes = 0;
4182
4317
  var playbackBytes = 0;
4183
4318
  var playback;
@@ -4328,6 +4463,7 @@ function stringify(encoded) {
4328
4463
  return encoded.p.length > 0 ? "{\"e\":".concat(encoded.e, ",\"a\":").concat(encoded.a, ",\"p\":").concat(encoded.p, "}") : "{\"e\":".concat(encoded.e, ",\"a\":").concat(encoded.a, "}");
4329
4464
  }
4330
4465
  function send(payload, zipped, sequence, beacon) {
4466
+ var _a;
4331
4467
  if (beacon === void 0) { beacon = false; }
4332
4468
  // Upload data if a valid URL is defined in the config
4333
4469
  if (typeof config$2.upload === "string" /* Constant.String */) {
@@ -4337,15 +4473,22 @@ function send(payload, zipped, sequence, beacon) {
4337
4473
  // The advantage to using sendBeacon is that browser can decide to upload asynchronously, improving chances of success
4338
4474
  // However, we don't want to rely on it for every payload, since we have no ability to retry if the upload failed.
4339
4475
  // Also, in case of sendBeacon, we do not have a way to alter HTTP headers and therefore can't send compressed payload
4340
- if (beacon && "sendBeacon" in navigator) {
4476
+ if (beacon && navigator && navigator["sendBeacon"]) {
4341
4477
  try {
4342
4478
  // Navigator needs to be bound to sendBeacon before it is used to avoid errors in some browsers
4343
4479
  dispatched = navigator.sendBeacon.bind(navigator)(url_1, payload);
4344
4480
  if (dispatched) {
4345
4481
  done(sequence);
4346
4482
  }
4483
+ else {
4484
+ // If sendBeacon fails, we report the error and continue with XHR upload
4485
+ report(new Error("".concat("BeaconError" /* Constant.BeaconError */, ": ").concat(payload.length)));
4486
+ }
4487
+ }
4488
+ catch (error) {
4489
+ // If sendBeacon fails, we report the error and continue with XHR upload
4490
+ report(new Error("".concat("BeaconError" /* Constant.BeaconError */, ": ").concat((_a = error === null || error === void 0 ? void 0 : error.message) === null || _a === void 0 ? void 0 : _a.substring(0, 50), " : ").concat(payload.length)));
4347
4491
  }
4348
- catch ( /* do nothing - and we will automatically fallback to XHR below */_a) { /* do nothing - and we will automatically fallback to XHR below */ }
4349
4492
  }
4350
4493
  // Before initiating XHR upload, we check if the data has already been uploaded using sendBeacon
4351
4494
  // There are two cases when dispatched could still be false:
@@ -4405,6 +4548,9 @@ function check$3(xhr, sequence) {
4405
4548
  if (xhr.status === 0) {
4406
4549
  config$2.upload = config$2.fallback ? config$2.fallback : config$2.upload;
4407
4550
  }
4551
+ // Capture the status code and number of attempts so we can report it back to the server
4552
+ track$1 = { sequence: sequence, attempts: transitData.attempts, status: xhr.status };
4553
+ encode$1(2 /* Event.Upload */);
4408
4554
  // In all other cases, re-attempt sending the same data
4409
4555
  // For retry we always fallback to string payload, even though we may have attempted
4410
4556
  // sending zipped payload earlier
@@ -4480,6 +4626,10 @@ function response(payload) {
4480
4626
  signalsEvent(parts[1]);
4481
4627
  }
4482
4628
  break;
4629
+ case "SNAPSHOT" /* Constant.Snapshot */:
4630
+ config$2.lean = false; // Disable lean mode to ensure we can send playback information to server.
4631
+ snapshot();
4632
+ break;
4483
4633
  }
4484
4634
  }
4485
4635
  }
@@ -4796,11 +4946,11 @@ function discover() {
4796
4946
  ts = time();
4797
4947
  timer = { id: id(), cost: 3 /* Metric.LayoutCost */ };
4798
4948
  start$d(timer);
4799
- return [4 /*yield*/, traverse(document, timer, 0 /* Source.Discover */, ts)];
4949
+ return [4 /*yield*/, traverse$1(document, timer, 0 /* Source.Discover */, ts)];
4800
4950
  case 1:
4801
4951
  _a.sent();
4802
4952
  checkDocumentStyles(document, ts);
4803
- return [4 /*yield*/, encode$4(5 /* Event.Discover */, timer, ts)];
4953
+ return [4 /*yield*/, encode$5(5 /* Event.Discover */, timer, ts)];
4804
4954
  case 2:
4805
4955
  _a.sent();
4806
4956
  stop$c(timer);
@@ -5078,7 +5228,7 @@ function start$8() {
5078
5228
  var _a, _b, _c;
5079
5229
  rootDomain = null;
5080
5230
  var ua = navigator && "userAgent" in navigator ? navigator.userAgent : "" /* Constant.Empty */;
5081
- var timezone = (_c = (_b = (_a = Intl === null || Intl === void 0 ? void 0 : Intl.DateTimeFormat()) === null || _a === void 0 ? void 0 : _a.resolvedOptions()) === null || _b === void 0 ? void 0 : _b.timeZone) !== null && _c !== void 0 ? _c : '';
5231
+ var timezone = (_c = (typeof Intl !== 'undefined' && ((_b = (_a = Intl === null || Intl === void 0 ? void 0 : Intl.DateTimeFormat()) === null || _a === void 0 ? void 0 : _a.resolvedOptions()) === null || _b === void 0 ? void 0 : _b.timeZone))) !== null && _c !== void 0 ? _c : '';
5082
5232
  var timezoneOffset = new Date().getTimezoneOffset().toString();
5083
5233
  var ancestorOrigins = window.location.ancestorOrigins ? Array.from(window.location.ancestorOrigins).toString() : '';
5084
5234
  var title = document && document.title ? document.title : "" /* Constant.Empty */;
@@ -5920,7 +6070,7 @@ var observer;
5920
6070
  var types = ["navigation" /* Constant.Navigation */, "resource" /* Constant.Resource */, "longtask" /* Constant.LongTask */, "first-input" /* Constant.FID */, "layout-shift" /* Constant.CLS */, "largest-contentful-paint" /* Constant.LCP */, "event" /* Constant.PerformanceEventTiming */];
5921
6071
  function start$2() {
5922
6072
  // Capture connection properties, if available
5923
- if (navigator && "connection" in navigator) {
6073
+ if (navigator && navigator["connection"]) {
5924
6074
  log(27 /* Dimension.ConnectionType */, navigator["connection"]["effectiveType"]);
5925
6075
  }
5926
6076
  // Check the browser support performance observer as a pre-requisite for any performance measurement