@coralogix/browser 3.23.5 → 3.24.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/index.esm2.js CHANGED
@@ -268,32 +268,68 @@ function getCxGlobal() {
268
268
  }
269
269
  var CxGlobal = getCxGlobal();
270
270
 
271
+ var SDK_STORE_KEY = '__cx_store__';
272
+ var CACHED_LOGS_KEY = 'cachedLogs';
273
+ var globalWithStore = CxGlobal;
274
+ var sdkStore = globalWithStore[SDK_STORE_KEY] || (globalWithStore[SDK_STORE_KEY] = {});
275
+ var globalMirror = CxGlobal;
276
+ function setSdkState(key, value) {
277
+ sdkStore[key] = value;
278
+ globalMirror[key] = value;
279
+ }
280
+ function deleteSdkState(key) {
281
+ delete sdkStore[key];
282
+ delete globalMirror[key];
283
+ }
284
+
271
285
  var CLICK_SCREENSHOT_MANAGER_KEY = 'rumClickScreenshotManager';
272
286
 
287
+ var DOM_CHANGE_SCREENSHOT_TRIGGER_KEY = 'rumDomChangeScreenshotTrigger';
288
+ var SETTLE_QUIET_MS = 500;
289
+ var CONTENT_ELEMENT_FLOOR = 50;
290
+ var CHANGE_DEBOUNCE_MS = 400;
291
+ var INTERACTION_TIGHT_MS = 150;
292
+ var INTERACTION_TIGHT_MIN_ELEMENTS = 1;
293
+ var INTERACTION_LOOSE_MS = 1500;
294
+ var INTERACTION_LOOSE_MIN_ELEMENTS = 3;
295
+ var OVERLAY_MAX_DEPTH = 3;
296
+ var MAX_DEPTH_WALK = 40;
297
+ var OVERLAY_MAX_REMOVES_ABSOLUTE = 2;
298
+ var OVERLAY_MAX_REMOVES_FRACTION = 0.1;
299
+ var VIEW_CHANGE_FRACTION = 0.02;
300
+ var VIEW_CHANGE_MIN_WEIGHT = 25;
301
+ var NODE_COUNT_REFRESH_MS = 2000;
302
+ var MIN_CAPTURE_INTERVAL_MS = 2000;
303
+ var MAX_CAPTURES_PER_VIEW = 10;
304
+ var MAX_NODES_FOR_CAPTURE = 20000;
305
+
273
306
  function getSnapshotManager() {
274
- return CxGlobal[SNAPSHOT_MANAGER_KEY];
307
+ return sdkStore[SNAPSHOT_MANAGER_KEY];
275
308
  }
276
309
  function getSessionManager() {
277
- return CxGlobal[SESSION_MANAGER_KEY];
310
+ return sdkStore[SESSION_MANAGER_KEY];
278
311
  }
279
312
  function getSessionRecorder() {
280
- return CxGlobal[SESSION_RECORDER_KEY];
313
+ return sdkStore[SESSION_RECORDER_KEY];
281
314
  }
282
315
  function getClickScreenshotManager() {
283
- return CxGlobal[CLICK_SCREENSHOT_MANAGER_KEY];
316
+ return sdkStore[CLICK_SCREENSHOT_MANAGER_KEY];
317
+ }
318
+ function getDomChangeScreenshotTrigger() {
319
+ return sdkStore[DOM_CHANGE_SCREENSHOT_TRIGGER_KEY];
284
320
  }
285
321
  function getSdkConfig() {
286
- return CxGlobal[SDK_CONFIG_KEY];
322
+ return sdkStore[SDK_CONFIG_KEY];
287
323
  }
288
324
  function getUserAgentData() {
289
- return CxGlobal[USER_AGENT_KEY];
325
+ return sdkStore[USER_AGENT_KEY];
290
326
  }
291
327
  var TRACER_PROVIDER_KEY = '__cx_tracer_provider__';
292
328
  function setTracerProvider(provider) {
293
- CxGlobal[TRACER_PROVIDER_KEY] = provider;
329
+ setSdkState(TRACER_PROVIDER_KEY, provider);
294
330
  }
295
331
  function getTracerProvider() {
296
- return CxGlobal[TRACER_PROVIDER_KEY];
332
+ return sdkStore[TRACER_PROVIDER_KEY];
297
333
  }
298
334
  function flush() {
299
335
  var tracerProvider = getTracerProvider();
@@ -309,40 +345,40 @@ var CUSTOM_TRACER_IGNORED_INSTRUMENTS = '__customTracerIgnoredInstruments__';
309
345
 
310
346
  function addGlobalSpanByTraceId(traceId, globalSpan) {
311
347
  var _a;
312
- CxGlobal[GLOBAL_SPAN_MAP_KEY] = __assign(__assign({}, (CxGlobal[GLOBAL_SPAN_MAP_KEY] || {})), (_a = {}, _a[traceId] = globalSpan, _a));
348
+ setSdkState(GLOBAL_SPAN_MAP_KEY, __assign(__assign({}, (sdkStore[GLOBAL_SPAN_MAP_KEY] || {})), (_a = {}, _a[traceId] = globalSpan, _a)));
313
349
  }
314
350
  function getGlobalSpanByTraceId(traceId) {
315
351
  var _a;
316
- return (_a = CxGlobal[GLOBAL_SPAN_MAP_KEY]) === null || _a === void 0 ? void 0 : _a[traceId];
352
+ return (_a = sdkStore[GLOBAL_SPAN_MAP_KEY]) === null || _a === void 0 ? void 0 : _a[traceId];
317
353
  }
318
354
  function clearGlobalSpanMap() {
319
- var globalSpanMap = CxGlobal[GLOBAL_SPAN_MAP_KEY];
355
+ var globalSpanMap = sdkStore[GLOBAL_SPAN_MAP_KEY];
320
356
  Object.keys(globalSpanMap || {}).forEach(function (traceId) {
321
357
  var globalSpan = globalSpanMap[traceId];
322
358
  globalSpan === null || globalSpan === void 0 ? void 0 : globalSpan.endSpan();
323
359
  });
324
- delete CxGlobal[GLOBAL_SPAN_MAP_KEY];
360
+ deleteSdkState(GLOBAL_SPAN_MAP_KEY);
325
361
  }
326
362
  function setGlobalSpan(globalSpan) {
327
- CxGlobal[GLOBAL_SPAN_KEY] = globalSpan;
363
+ setSdkState(GLOBAL_SPAN_KEY, globalSpan);
328
364
  }
329
365
  function getGlobalSpan() {
330
- return CxGlobal[GLOBAL_SPAN_KEY];
366
+ return sdkStore[GLOBAL_SPAN_KEY];
331
367
  }
332
368
  function clearGlobalSpan() {
333
- delete CxGlobal[GLOBAL_SPAN_KEY];
369
+ deleteSdkState(GLOBAL_SPAN_KEY);
334
370
  }
335
371
  function setCustomTracer(customTracer) {
336
- CxGlobal[CUSTOM_TRACER_KEY] = customTracer;
372
+ setSdkState(CUSTOM_TRACER_KEY, customTracer);
337
373
  }
338
374
  function getActiveCustomTracer() {
339
- return CxGlobal[CUSTOM_TRACER_KEY];
375
+ return sdkStore[CUSTOM_TRACER_KEY];
340
376
  }
341
377
  function setCustomTracerIgnoredInstruments(ignoredInstruments) {
342
- CxGlobal[CUSTOM_TRACER_IGNORED_INSTRUMENTS] = ignoredInstruments;
378
+ setSdkState(CUSTOM_TRACER_IGNORED_INSTRUMENTS, ignoredInstruments);
343
379
  }
344
380
  function getCustomTracerIgnoredInstruments() {
345
- return CxGlobal[CUSTOM_TRACER_IGNORED_INSTRUMENTS];
381
+ return sdkStore[CUSTOM_TRACER_IGNORED_INSTRUMENTS];
346
382
  }
347
383
  function shouldAttachSpanToGlobalSpan(instrumentationType) {
348
384
  return getGlobalSpan() && !isInstrumentationIgnored(instrumentationType);
@@ -373,15 +409,15 @@ function shouldAddOtelAttr(span) {
373
409
  return !!span[IS_OTEL_READY];
374
410
  }
375
411
  function setAttrProcessor(processor) {
376
- CxGlobal[ATTR_PROCESSOR_KEY] = processor;
412
+ setSdkState(ATTR_PROCESSOR_KEY, processor);
377
413
  }
378
414
  function getAttrProcessor() {
379
- return CxGlobal[ATTR_PROCESSOR_KEY];
415
+ return sdkStore[ATTR_PROCESSOR_KEY];
380
416
  }
381
417
 
382
418
  function setCustomLabelsForSpan(span, labels) {
383
419
  if (labels === void 0) { labels = {}; }
384
- span.setAttribute(CoralogixAttributes.CUSTOM_LABELS, JSON.stringify(getCustomMergedLabels(labels)));
420
+ span.setAttribute(CoralogixAttributes.CUSTOM_LABELS, JSON.stringify(getCustomMergedLabels(labels), getCircularReplacer()));
385
421
  }
386
422
  function getCustomMergedLabels(labels) {
387
423
  var _a;
@@ -427,6 +463,12 @@ var STACK_FRAME_LIMIT = 50;
427
463
  var STACK_LINE_LIMIT = 1024;
428
464
  var MESSAGE_LIMIT = 1024;
429
465
  var MFE_PATH_PATTERN = /https?:\/\/.*\//;
466
+ function reportFailed(e) {
467
+ var _a;
468
+ if ((_a = getSdkConfig()) === null || _a === void 0 ? void 0 : _a.debug) {
469
+ console.warn('Coralogix Browser SDK - Error report failed', e);
470
+ }
471
+ }
430
472
  var V8_HEADER_PATTERN = /^Error\b/;
431
473
  function sanitizeConsoleErrorStack(stack) {
432
474
  var _a;
@@ -483,23 +525,29 @@ function parseStackFrames(err) {
483
525
  }
484
526
  function buildStacktrace(span, err) {
485
527
  return __awaiter(this, void 0, void 0, function () {
486
- var stackFrames, supportMfe;
487
- return __generator(this, function (_a) {
488
- switch (_a.label) {
528
+ var stackFrames, e_1;
529
+ var _a;
530
+ return __generator(this, function (_b) {
531
+ switch (_b.label) {
489
532
  case 0:
533
+ _b.trys.push([0, 3, , 4]);
490
534
  stackFrames = parseStackFrames(err);
491
535
  if (stackFrames.length === 0) {
492
536
  return [2];
493
537
  }
494
- supportMfe = getSdkConfig().supportMfe;
495
- if (!supportMfe) return [3, 2];
538
+ if (!((_a = getSdkConfig()) === null || _a === void 0 ? void 0 : _a.supportMfe)) return [3, 2];
496
539
  return [4, handleMFE(stackFrames, span)];
497
540
  case 1:
498
- _a.sent();
499
- _a.label = 2;
541
+ _b.sent();
542
+ _b.label = 2;
500
543
  case 2:
501
544
  span[ErrorAttributes.STACK] = stackFrames;
502
- return [2];
545
+ return [3, 4];
546
+ case 3:
547
+ e_1 = _b.sent();
548
+ reportFailed(e_1);
549
+ return [3, 4];
550
+ case 4: return [2];
503
551
  }
504
552
  });
505
553
  });
@@ -538,7 +586,7 @@ function addLabelForMFE(span, lastFrame) {
538
586
  }
539
587
  function fetchMfeMetadata(mfePath) {
540
588
  return __awaiter(this, void 0, void 0, function () {
541
- var response, _a, e_1;
589
+ var response, _a, e_2;
542
590
  var _b;
543
591
  return __generator(this, function (_c) {
544
592
  switch (_c.label) {
@@ -556,9 +604,9 @@ function fetchMfeMetadata(mfePath) {
556
604
  return [4, response.json()];
557
605
  case 2: return [2, __assign.apply(void 0, [__assign.apply(void 0, _a.concat([(_c.sent())])), { mfePath: mfePath }])];
558
606
  case 3:
559
- e_1 = _c.sent();
607
+ e_2 = _c.sent();
560
608
  if ((_b = getSdkConfig()) === null || _b === void 0 ? void 0 : _b.debug) {
561
- console.warn('Coralogix Browser SDK - Error fetching metadata', e_1);
609
+ console.warn('Coralogix Browser SDK - Error fetching metadata', e_2);
562
610
  }
563
611
  return [2, undefined];
564
612
  case 4: return [2];
@@ -571,7 +619,7 @@ function extractMetadataFromMfeStacktrace() {
571
619
  var cachedMetadata, mfePath, pending;
572
620
  if (fileName === void 0) { fileName = ''; }
573
621
  return __generator(this, function (_a) {
574
- cachedMetadata = CxGlobal[CACHED_METADATA_KEY];
622
+ cachedMetadata = sdkStore[CACHED_METADATA_KEY];
575
623
  mfePath = extractMfePath(fileName);
576
624
  if (mfePath) {
577
625
  pending = cachedMetadata === null || cachedMetadata === void 0 ? void 0 : cachedMetadata.get(mfePath);
@@ -621,6 +669,7 @@ function addErrorDefaultAttributes(span) {
621
669
  var CoralogixErrorInstrumentation = (function (_super) {
622
670
  __extends(CoralogixErrorInstrumentation, _super);
623
671
  function CoralogixErrorInstrumentation(config) {
672
+ var _a;
624
673
  var _this = _super.call(this, ERROR_INSTRUMENTATION_NAME, ERROR_INSTRUMENTATION_VERSION, config) || this;
625
674
  _this.parseErrorObject = function (obj) {
626
675
  var _a;
@@ -631,14 +680,15 @@ var CoralogixErrorInstrumentation = (function (_super) {
631
680
  return obj === null || obj === void 0 ? void 0 : obj.toString();
632
681
  }
633
682
  };
634
- if (getSdkConfig().supportMfe) {
635
- CxGlobal[CACHED_METADATA_KEY] = new Map();
683
+ if ((_a = getSdkConfig()) === null || _a === void 0 ? void 0 : _a.supportMfe) {
684
+ setSdkState(CACHED_METADATA_KEY, new Map());
636
685
  }
637
686
  return _this;
638
687
  }
639
688
  CoralogixErrorInstrumentation.prototype.init = function () { };
640
689
  CoralogixErrorInstrumentation.prototype.enable = function () {
641
- var stackTraceLimit = getSdkConfig().stackTraceLimit;
690
+ var _a;
691
+ var stackTraceLimit = ((_a = getSdkConfig()) !== null && _a !== void 0 ? _a : {}).stackTraceLimit;
642
692
  if (stackTraceLimit) {
643
693
  Error.stackTraceLimit = stackTraceLimit;
644
694
  }
@@ -662,94 +712,115 @@ var CoralogixErrorInstrumentation = (function (_super) {
662
712
  return;
663
713
  }
664
714
  }
665
- switch (true) {
666
- case arg instanceof Error:
667
- this.reportError(source, arg);
668
- break;
669
- case arg instanceof ErrorEvent:
670
- this.reportErrorEvent(source, arg);
671
- break;
672
- case arg instanceof Event:
673
- this.reportEvent(source, arg);
674
- break;
675
- case typeof arg === 'string':
676
- this.reportString(source, arg, stackContextError);
677
- break;
678
- case arg instanceof Array: {
679
- var firstError = arg.find(function (x) { return x instanceof Error; });
680
- var message = arg
681
- .map(function (msg) {
682
- return typeof msg === 'string' ? msg : _this.parseErrorObject(msg);
683
- })
684
- .join(' ');
685
- var stackSourceError = firstError !== null && firstError !== void 0 ? firstError : stackContextError;
686
- this.reportString(source, message, stackSourceError);
687
- break;
715
+ try {
716
+ switch (true) {
717
+ case arg instanceof Error:
718
+ this.reportError(source, arg);
719
+ break;
720
+ case arg instanceof ErrorEvent:
721
+ this.reportErrorEvent(source, arg);
722
+ break;
723
+ case arg instanceof Event:
724
+ this.reportEvent(source, arg);
725
+ break;
726
+ case typeof arg === 'string':
727
+ this.reportString(source, arg, stackContextError);
728
+ break;
729
+ case arg instanceof Array: {
730
+ var firstError = arg.find(function (x) { return x instanceof Error; });
731
+ var message = arg
732
+ .map(function (msg) {
733
+ return typeof msg === 'string' ? msg : _this.parseErrorObject(msg);
734
+ })
735
+ .join(' ');
736
+ var stackSourceError = firstError !== null && firstError !== void 0 ? firstError : stackContextError;
737
+ this.reportString(source, message, stackSourceError);
738
+ break;
739
+ }
740
+ default:
741
+ this.reportString(source, typeof arg === 'string' ? arg : this.getPossibleEventMessage(arg));
688
742
  }
689
- default:
690
- this.reportString(source, typeof arg === 'string' ? arg : this.getPossibleEventMessage(arg));
743
+ }
744
+ catch (e) {
745
+ reportFailed(e);
691
746
  }
692
747
  };
693
748
  CoralogixErrorInstrumentation.prototype.reportError = function (source, err, customData, labels) {
694
749
  return __awaiter(this, void 0, void 0, function () {
695
- var message, name, span, cleanMessage, supportMfe;
696
- return __generator(this, function (_b) {
697
- switch (_b.label) {
750
+ var message, name_1, cleanMessage, data, span, e_3;
751
+ var _b;
752
+ return __generator(this, function (_c) {
753
+ switch (_c.label) {
698
754
  case 0:
699
- message = err.message, name = err.name;
700
- span = this.createSpan('error');
755
+ _c.trys.push([0, 4, , 5]);
756
+ message = err.message, name_1 = err.name;
701
757
  cleanMessage = message.split('\n')[0];
758
+ data = customData
759
+ ? JSON.stringify(customData, getCircularReplacer())
760
+ : undefined;
761
+ span = this.createSpan('error');
702
762
  addErrorDefaultAttributes(span);
703
763
  span.setAttribute(CoralogixAttributes.SOURCE, source);
704
- span.setAttribute(ErrorAttributes.TYPE, name);
764
+ span.setAttribute(ErrorAttributes.TYPE, name_1);
705
765
  span.setAttribute(ErrorAttributes.MESSAGE, cleanMessage);
706
- if (customData) {
707
- span[ErrorAttributes.DATA] = JSON.stringify(customData, getCircularReplacer());
766
+ if (data) {
767
+ span[ErrorAttributes.DATA] = data;
708
768
  }
709
769
  if (labels) {
710
770
  setCustomLabelsForSpan(span, labels);
711
771
  }
712
- supportMfe = getSdkConfig().supportMfe;
713
- if (!supportMfe) return [3, 2];
772
+ if (!((_b = getSdkConfig()) === null || _b === void 0 ? void 0 : _b.supportMfe)) return [3, 2];
714
773
  return [4, buildStacktrace(span, err)];
715
774
  case 1:
716
- _b.sent();
775
+ _c.sent();
717
776
  return [3, 3];
718
777
  case 2:
719
778
  void buildStacktrace(span, err);
720
- _b.label = 3;
779
+ _c.label = 3;
721
780
  case 3:
722
781
  span.end();
723
- return [2];
782
+ return [3, 5];
783
+ case 4:
784
+ e_3 = _c.sent();
785
+ reportFailed(e_3);
786
+ return [3, 5];
787
+ case 5: return [2];
724
788
  }
725
789
  });
726
790
  });
727
791
  };
728
792
  CoralogixErrorInstrumentation.prototype.reportString = function (source, message, stackError) {
729
793
  return __awaiter(this, void 0, void 0, function () {
730
- var span, supportMfe;
731
- return __generator(this, function (_b) {
732
- switch (_b.label) {
794
+ var cleanMessage, span, e_4;
795
+ var _b;
796
+ return __generator(this, function (_c) {
797
+ switch (_c.label) {
733
798
  case 0:
799
+ _c.trys.push([0, 5, , 6]);
800
+ cleanMessage = message === null || message === void 0 ? void 0 : message.substring(0, MESSAGE_LIMIT);
734
801
  span = this.createSpan(source);
735
802
  addErrorDefaultAttributes(span);
736
803
  span.setAttribute(CoralogixAttributes.SOURCE, source);
737
- span.setAttribute(ErrorAttributes.MESSAGE, message === null || message === void 0 ? void 0 : message.substring(0, MESSAGE_LIMIT));
738
- supportMfe = getSdkConfig().supportMfe;
804
+ span.setAttribute(ErrorAttributes.MESSAGE, cleanMessage);
739
805
  if (!stackError) return [3, 4];
740
- if (!supportMfe) return [3, 2];
806
+ if (!((_b = getSdkConfig()) === null || _b === void 0 ? void 0 : _b.supportMfe)) return [3, 2];
741
807
  return [4, buildStacktrace(span, stackError)];
742
808
  case 1:
743
- _b.sent();
809
+ _c.sent();
744
810
  return [3, 3];
745
811
  case 2:
746
812
  void buildStacktrace(span, stackError);
747
- _b.label = 3;
813
+ _c.label = 3;
748
814
  case 3:
749
- _b.label = 4;
815
+ _c.label = 4;
750
816
  case 4:
751
817
  span.end();
752
- return [2];
818
+ return [3, 6];
819
+ case 5:
820
+ e_4 = _c.sent();
821
+ reportFailed(e_4);
822
+ return [3, 6];
823
+ case 6: return [2];
753
824
  }
754
825
  });
755
826
  });
@@ -2264,6 +2335,29 @@ var ANCESTOR_SEARCH_DEPTH = 5;
2264
2335
  var POINTER_CURSOR = 'pointer';
2265
2336
  var TEXT_CURSOR = 'text';
2266
2337
  var BODY_NODE_NAME = 'BODY';
2338
+ var INPUT_BUTTON_TYPES = ['button', 'submit', 'reset'];
2339
+ var LINE_BREAK_NODE_NAMES = ['BR', 'P'];
2340
+ var BLOCK_DISPLAY_VALUES = [
2341
+ 'block',
2342
+ 'flex',
2343
+ 'grid',
2344
+ 'list-item',
2345
+ 'table',
2346
+ 'table-caption',
2347
+ ];
2348
+ var SVG_NAMESPACE = 'http://www.w3.org/2000/svg';
2349
+ var SVG_ROOT_LOCAL_NAME = 'svg';
2350
+ var NON_RENDERED_SVG_LOCAL_NAMES = [
2351
+ 'title',
2352
+ 'desc',
2353
+ 'metadata',
2354
+ 'defs',
2355
+ 'symbol',
2356
+ 'clipPath',
2357
+ 'mask',
2358
+ 'pattern',
2359
+ 'marker',
2360
+ ];
2267
2361
  var CLICKABLE_SELECTOR = 'a, button, input, select, textarea, label, summary, option, li, ' +
2268
2362
  '[role="button"], [role="link"], [role="tab"], ' +
2269
2363
  '[role="menuitem"], [role="menuitemcheckbox"], [role="menuitemradio"], ' +
@@ -2290,39 +2384,125 @@ function extractActionName(el) {
2290
2384
  function extractAriaLabel(el) {
2291
2385
  return getAttributeFromAncestors(el, ARIA_LABEL_ATTRIBUTE);
2292
2386
  }
2387
+ function getOwnAriaLabel(element) {
2388
+ return getOwnAttribute(element, ARIA_LABEL_ATTRIBUTE);
2389
+ }
2293
2390
  function extractTestId(el) {
2294
2391
  return (el === null || el === void 0 ? void 0 : el.getAttribute(DATA_TEST_ATTRIBUTE)) || '';
2295
2392
  }
2296
2393
  function extractResolvedName(_a) {
2297
- var isDeadClick = _a.isDeadClick, element = _a.element, config = _a.config, actionName = _a.actionName, ariaLabel = _a.ariaLabel;
2394
+ var isDeadClick = _a.isDeadClick, element = _a.element, config = _a.config, actionName = _a.actionName;
2298
2395
  if (!element)
2299
2396
  return '';
2300
2397
  if (isDeadClick)
2301
2398
  return '';
2302
2399
  var resolveName = actionName ||
2303
2400
  maskedTextIfMasked(element, config) ||
2304
- resolveFallbackName(element, ariaLabel, ANCESTOR_SEARCH_DEPTH);
2401
+ resolveFallbackName(element, config, ANCESTOR_SEARCH_DEPTH);
2305
2402
  return normalizeInteractionText(resolveName);
2306
2403
  }
2307
2404
  function maskedTextIfMasked(element, config) {
2308
2405
  return isElementMasked(element, config) ? MASKED_TEXT : '';
2309
2406
  }
2310
- function resolveFallbackName(element, ariaLabel, depth) {
2407
+ function resolveFallbackName(element, config, depth) {
2311
2408
  var _a;
2312
2409
  if (!element || element.nodeName === BODY_NODE_NAME)
2313
2410
  return '';
2411
+ var isSvgRoot = isSvgRootElement(element);
2412
+ var readText = !isSvgRoot && !isControlContainer(element);
2314
2413
  var resolvedName = getLabelText(element) ||
2315
- ariaLabel ||
2414
+ getOwnAriaLabel(element) ||
2415
+ getInputButtonValue(element) ||
2416
+ getOwnAttribute(element, ALT_ATTRIBUTE) ||
2316
2417
  getPlaceholder(element) ||
2317
- getInnerText(element);
2418
+ getSelectFirstOptionText(element) ||
2419
+ (readText ? getUnmaskedInnerText(element, config) : '') ||
2420
+ getOwnAttribute(element, TITLE_ATTRIBUTE);
2318
2421
  if (resolvedName)
2319
2422
  return resolvedName;
2320
2423
  if ((_a = element.matches) === null || _a === void 0 ? void 0 : _a.call(element, CLICKABLE_SELECTOR))
2321
2424
  return '';
2425
+ if (isSvgRoot && !hasClickableAncestor(element))
2426
+ return '';
2322
2427
  var parent = element.parentElement;
2323
2428
  if (depth <= 0 || !parent || parent.nodeName === BODY_NODE_NAME)
2324
2429
  return '';
2325
- return resolveFallbackName(parent, ariaLabel, depth - 1);
2430
+ return resolveFallbackName(parent, config, depth - 1);
2431
+ }
2432
+ function isControlContainer(element) {
2433
+ var _a, _b;
2434
+ if ((_a = element.matches) === null || _a === void 0 ? void 0 : _a.call(element, CLICKABLE_SELECTOR))
2435
+ return false;
2436
+ return !!((_b = element.querySelector) === null || _b === void 0 ? void 0 : _b.call(element, CLICKABLE_SELECTOR));
2437
+ }
2438
+ function getOwnAttribute(element, attribute) {
2439
+ return element.getAttribute(attribute) || '';
2440
+ }
2441
+ function isSvgElement(element) {
2442
+ return element.namespaceURI === SVG_NAMESPACE;
2443
+ }
2444
+ function isSvgRootElement(element) {
2445
+ return isSvgElement(element) && element.localName === SVG_ROOT_LOCAL_NAME;
2446
+ }
2447
+ function hasClickableAncestor(element) {
2448
+ var _a, _b;
2449
+ return !!((_b = (_a = element.parentElement) === null || _a === void 0 ? void 0 : _a.closest) === null || _b === void 0 ? void 0 : _b.call(_a, CLICKABLE_SELECTOR));
2450
+ }
2451
+ function getInputButtonValue(element) {
2452
+ if (!(element instanceof HTMLInputElement))
2453
+ return '';
2454
+ return INPUT_BUTTON_TYPES.includes(element.type) ? element.value || '' : '';
2455
+ }
2456
+ function getSelectFirstOptionText(element) {
2457
+ var _a;
2458
+ if (!(element instanceof HTMLSelectElement))
2459
+ return '';
2460
+ return ((_a = element.options[0]) === null || _a === void 0 ? void 0 : _a.text) || '';
2461
+ }
2462
+ function getUnmaskedInnerText(element, config) {
2463
+ var maskClass = config.maskClass;
2464
+ if (isSvgElement(element)) {
2465
+ return normalizeInteractionText(collectUnmaskedText(element, maskClass));
2466
+ }
2467
+ if (!(element instanceof HTMLElement))
2468
+ return '';
2469
+ if (!hasMaskedDescendant(element, maskClass))
2470
+ return getInnerText(element);
2471
+ return normalizeInteractionText(collectUnmaskedText(element, maskClass));
2472
+ }
2473
+ function hasMaskedDescendant(element, maskClass) {
2474
+ var descendants = element.getElementsByTagName('*');
2475
+ for (var i = 0; i < descendants.length; i++) {
2476
+ if (isMaskedByClass(getClassName(descendants[i]), maskClass))
2477
+ return true;
2478
+ }
2479
+ return false;
2480
+ }
2481
+ function collectUnmaskedText(node, maskClass) {
2482
+ if (node.nodeType === Node.TEXT_NODE)
2483
+ return node.textContent || '';
2484
+ if (node.nodeType !== Node.ELEMENT_NODE)
2485
+ return '';
2486
+ var element = node;
2487
+ if (isMaskedByClass(getClassName(element), maskClass))
2488
+ return '';
2489
+ if (isSvgElement(element) &&
2490
+ NON_RENDERED_SVG_LOCAL_NAMES.includes(element.localName)) {
2491
+ return '';
2492
+ }
2493
+ var style = CxGlobal.getComputedStyle(element);
2494
+ if (style.display === 'none' || style.visibility === 'hidden')
2495
+ return '';
2496
+ var text = isBlockBoundary(element, style.display) ? ' ' : '';
2497
+ var children = element.childNodes;
2498
+ for (var i = 0; i < children.length; i++) {
2499
+ text += collectUnmaskedText(children[i], maskClass);
2500
+ }
2501
+ return text;
2502
+ }
2503
+ function isBlockBoundary(element, display) {
2504
+ return (LINE_BREAK_NODE_NAMES.includes(element.nodeName) ||
2505
+ BLOCK_DISPLAY_VALUES.includes(display));
2326
2506
  }
2327
2507
  function getLabelText(element) {
2328
2508
  var _a;
@@ -2349,10 +2529,15 @@ function getInnerText(element) {
2349
2529
  : '';
2350
2530
  }
2351
2531
  function normalizeInteractionText(text) {
2352
- return text
2353
- .slice(0, MAX_INTERACTION_ELEMENT_SIZE)
2532
+ var normalized = text
2533
+ .slice(0, MAX_INTERACTION_ELEMENT_SIZE + 1)
2354
2534
  .replace(/\s+/g, ' ')
2355
2535
  .trim();
2536
+ if (normalized.length <= MAX_INTERACTION_ELEMENT_SIZE)
2537
+ return normalized;
2538
+ var maxTextBeforeMarker = MAX_INTERACTION_ELEMENT_SIZE - INTERACTION_TEXT_TRUNCATION_MARKER.length;
2539
+ return (normalized.slice(0, maxTextBeforeMarker).trim() +
2540
+ INTERACTION_TEXT_TRUNCATION_MARKER);
2356
2541
  }
2357
2542
  function extractMaskedOrTextContent(clickableElement, config) {
2358
2543
  if (!clickableElement)
@@ -2414,6 +2599,7 @@ function wasPasswordInput(element) {
2414
2599
  }
2415
2600
  function isMaskedByClass(className, maskClass) {
2416
2601
  if (maskClass instanceof RegExp) {
2602
+ maskClass.lastIndex = 0;
2417
2603
  return maskClass.test(className);
2418
2604
  }
2419
2605
  return className.includes(maskClass);
@@ -2714,7 +2900,6 @@ var CoralogixUserInteractionInstrumentation = (function (_super) {
2714
2900
  element: eventTarget,
2715
2901
  config: config,
2716
2902
  actionName: cxActionName,
2717
- ariaLabel: ariaLabel,
2718
2903
  });
2719
2904
  span.setAttribute(CoralogixAttributes.IS_DEAD_CLICK, isDeadClick);
2720
2905
  var _b = eventTarget.getBoundingClientRect(), width = _b.width, height = _b.height;
@@ -2911,6 +3096,162 @@ var CoralogixMemoryUsageInstrumentation = (function (_super) {
2911
3096
 
2912
3097
  var SCREENSHOT_INSTRUMENTATION_NAME = 'screenshot';
2913
3098
  var SCREENSHOT_INSTRUMENTATION_VERSION = '1.0.0';
3099
+ var MAX_SCREENSHOT_ACTIONS = 100;
3100
+ var FILL_ATTEMPTS_PER_SLOT = 2;
3101
+ var LABELLED_SELECTOR = '[aria-label], [data-testid], [data-test], [data-test-id], [role]';
3102
+ var NON_INTERACTIVE_TAGS = new Set([
3103
+ 'html', 'body', 'main', 'header', 'footer', 'nav', 'aside', 'section', 'article', 'form',
3104
+ 'table', 'thead', 'tbody', 'tr', 'ul', 'ol', 'dl', 'p', 'hr', 'br',
3105
+ 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'img', 'picture', 'svg', 'video', 'audio', 'iframe',
3106
+ ]);
3107
+ var NON_INTERACTIVE_ROLES = new Set([
3108
+ 'dialog', 'alertdialog', 'navigation', 'region', 'main', 'banner', 'contentinfo',
3109
+ 'complementary', 'search', 'form', 'application', 'document', 'article', 'group', 'toolbar',
3110
+ 'tabpanel', 'tablist', 'list', 'listitem', 'table', 'row', 'rowgroup', 'cell', 'gridcell',
3111
+ 'columnheader', 'rowheader', 'heading', 'img', 'figure', 'presentation', 'none', 'status',
3112
+ 'alert', 'log', 'marquee', 'timer', 'tooltip', 'progressbar', 'separator', 'note', 'definition',
3113
+ 'term', 'directory', 'feed', 'math', 'meter', 'scrollbar',
3114
+ ]);
3115
+ var MAX_CANDIDATE_DESCENDANTS = 50;
3116
+ function collectDomActionNames(limit) {
3117
+ if (limit === void 0) { limit = MAX_SCREENSHOT_ACTIONS; }
3118
+ try {
3119
+ var doc = CxGlobal.document;
3120
+ if (!(doc === null || doc === void 0 ? void 0 : doc.querySelectorAll)) {
3121
+ return [];
3122
+ }
3123
+ var actions = collectExplicitActionNames(doc, limit);
3124
+ if (actions.length >= limit) {
3125
+ return actions;
3126
+ }
3127
+ var config = getSdkConfig();
3128
+ if (!config) {
3129
+ return actions;
3130
+ }
3131
+ fillFromCandidates(doc, LABELLED_SELECTOR, isLabelledCandidate, actions, limit, config);
3132
+ if (actions.length < limit) {
3133
+ fillFromCandidates(doc, CLICKABLE_SELECTOR, isSemanticCandidate, actions, limit, config);
3134
+ }
3135
+ return actions;
3136
+ }
3137
+ catch (_a) {
3138
+ return [];
3139
+ }
3140
+ }
3141
+ function collectExplicitActionNames(doc, limit) {
3142
+ var elements = doc.querySelectorAll("[".concat(CX_ACTION_NAME_ATTRIBUTE, "]"));
3143
+ var seen = new Set();
3144
+ var names = [];
3145
+ for (var i = 0; i < elements.length; i++) {
3146
+ var value = elements[i].getAttribute(CX_ACTION_NAME_ATTRIBUTE);
3147
+ if (value && !seen.has(value)) {
3148
+ seen.add(value);
3149
+ names.push(value);
3150
+ }
3151
+ }
3152
+ return names.length > limit ? takeRun(names, limit) : names;
3153
+ }
3154
+ function fillFromCandidates(doc, selector, isCandidate, actions, limit, config) {
3155
+ var candidates = usableCandidates(doc, selector, isCandidate);
3156
+ var total = candidates.length;
3157
+ if (total === 0) {
3158
+ return;
3159
+ }
3160
+ var attempts = Math.min(total, (limit - actions.length) * FILL_ATTEMPTS_PER_SLOT);
3161
+ var start = randomIndex(total);
3162
+ var seen = new Set(actions);
3163
+ for (var step = 0; step < attempts && actions.length < limit; step++) {
3164
+ var name_1 = resolveClickableName(candidates[(start + step) % total], config);
3165
+ if (name_1 && !seen.has(name_1)) {
3166
+ seen.add(name_1);
3167
+ actions.push(name_1);
3168
+ }
3169
+ }
3170
+ }
3171
+ function usableCandidates(doc, selector, isCandidate) {
3172
+ var matches = doc.querySelectorAll(selector);
3173
+ var usable = [];
3174
+ for (var i = 0; i < matches.length; i++) {
3175
+ var element = matches[i];
3176
+ if (!isUnderExplicitActionName(element) &&
3177
+ (!isCandidate || isCandidate(element)) &&
3178
+ isRendered(element)) {
3179
+ usable.push(element);
3180
+ }
3181
+ }
3182
+ return usable;
3183
+ }
3184
+ function isContentRegion(element) {
3185
+ return element.getElementsByTagName('*').length > MAX_CANDIDATE_DESCENDANTS;
3186
+ }
3187
+ function isUnderExplicitActionName(element) {
3188
+ return typeof element.closest === 'function'
3189
+ ? !!element.closest("[".concat(CX_ACTION_NAME_ATTRIBUTE, "]"))
3190
+ : !!extractActionName(element);
3191
+ }
3192
+ function isSemanticCandidate(element) {
3193
+ switch (element.localName) {
3194
+ case 'label':
3195
+ return hasAssociatedControl(element);
3196
+ case 'li':
3197
+ case 'option': {
3198
+ var role = element.getAttribute('role');
3199
+ return !!role && !NON_INTERACTIVE_ROLES.has(role);
3200
+ }
3201
+ case 'input':
3202
+ return element.type !== 'hidden';
3203
+ default:
3204
+ return true;
3205
+ }
3206
+ }
3207
+ function hasAssociatedControl(label) {
3208
+ if (label.control) {
3209
+ return true;
3210
+ }
3211
+ if (label.htmlFor) {
3212
+ return !!label.ownerDocument.getElementById(label.htmlFor);
3213
+ }
3214
+ return !!label.querySelector('input, select, textarea, button, meter, output, progress');
3215
+ }
3216
+ function isLabelledCandidate(element) {
3217
+ var _a;
3218
+ if (NON_INTERACTIVE_TAGS.has(element.localName)) {
3219
+ return false;
3220
+ }
3221
+ var role = element.getAttribute('role');
3222
+ if (role && NON_INTERACTIVE_ROLES.has(role)) {
3223
+ return false;
3224
+ }
3225
+ return !((_a = element.matches) === null || _a === void 0 ? void 0 : _a.call(element, CLICKABLE_SELECTOR));
3226
+ }
3227
+ function resolveClickableName(element, config) {
3228
+ if (isContentRegion(element)) {
3229
+ return '';
3230
+ }
3231
+ var name = extractResolvedName({
3232
+ isDeadClick: false,
3233
+ element: element,
3234
+ config: config,
3235
+ actionName: '',
3236
+ });
3237
+ return name === MASKED_TEXT ? '' : name;
3238
+ }
3239
+ function isRendered(element) {
3240
+ return typeof element.checkVisibility === 'function'
3241
+ ? element.checkVisibility()
3242
+ : true;
3243
+ }
3244
+ function takeRun(items, count) {
3245
+ var start = randomIndex(items.length);
3246
+ var run = [];
3247
+ for (var step = 0; step < count; step++) {
3248
+ run.push(items[(start + step) % items.length]);
3249
+ }
3250
+ return run;
3251
+ }
3252
+ function randomIndex(length) {
3253
+ return Math.floor(Math.random() * length);
3254
+ }
2914
3255
 
2915
3256
  var CoralogixScreenshotInstrumentation = (function (_super) {
2916
3257
  __extends(CoralogixScreenshotInstrumentation, _super);
@@ -2930,6 +3271,7 @@ var CoralogixScreenshotInstrumentation = (function (_super) {
2930
3271
  span[CoralogixAttributes.SCREENSHOT_CONTEXT] = {
2931
3272
  id: id,
2932
3273
  description: description,
3274
+ actions: collectDomActionNames(),
2933
3275
  };
2934
3276
  span.end();
2935
3277
  };
@@ -3159,7 +3501,8 @@ var CORALOGIX_LOGS_URL_SUFFIX = '/browser/v1beta/logs';
3159
3501
  var CORALOGIX_RECORDING_URL_SUFFIX = '/sessionrecording';
3160
3502
  var MFE_METADATA_FILE = 'cx-metadata.json';
3161
3503
  var MFE_METADATA_URL_PATTERN = /cx-metadata\.json$/;
3162
- var MAX_INTERACTION_ELEMENT_SIZE = 1024;
3504
+ var MAX_INTERACTION_ELEMENT_SIZE = 100;
3505
+ var INTERACTION_TEXT_TRUNCATION_MARKER = ' [...]';
3163
3506
  var MAX_CHARACTERS = 1024;
3164
3507
  var REQUIRED_CONFIG_KEYS = [
3165
3508
  'application',
@@ -3175,6 +3518,8 @@ var MASKED_TEXT = '***';
3175
3518
  var MASK_CLASS_DEFAULT = 'cx-mask';
3176
3519
  var CX_PREFIX = 'cx';
3177
3520
  var ARIA_LABEL_ATTRIBUTE = 'aria-label';
3521
+ var TITLE_ATTRIBUTE = 'title';
3522
+ var ALT_ATTRIBUTE = 'alt';
3178
3523
  var PASSWORD_INPUT_TYPE = 'password';
3179
3524
  var MASK_INPUT_TYPES_DEFAULT = [PASSWORD_INPUT_TYPE];
3180
3525
  var FINGER_PRINT_KEY = 'cx-fingerprint';
@@ -3189,7 +3534,7 @@ var idPatterns = [
3189
3534
  },
3190
3535
  ];
3191
3536
  var PATH_ID_PLACEHOLDER = '/{id}';
3192
- var NUMERIC_PATH_SEGMENT_REGEX = /\/(?![vV]\d{1,2}\/)([^/\d?]*\d+[^/?]*)/g;
3537
+ var NUMERIC_PATH_SEGMENT_REGEX = /\/\d+(?=$|[/?#])/g;
3193
3538
  function replaceNumericPathSegments(url) {
3194
3539
  var replacePath = function (s) {
3195
3540
  return s.replace(NUMERIC_PATH_SEGMENT_REGEX, PATH_ID_PLACEHOLDER);
@@ -3363,14 +3708,14 @@ var PAGE_URL_PARTS_KEY = 'rum_page_url_parts';
3363
3708
  var REFERRER_URL_PARTS_KEY = 'rum_referrer_url_parts';
3364
3709
 
3365
3710
  function saveInternalRumData(key, value) {
3366
- if (!CxGlobal[RUM_INTERNAL_DATA_KEY]) {
3367
- CxGlobal[RUM_INTERNAL_DATA_KEY] = {};
3711
+ if (!sdkStore[RUM_INTERNAL_DATA_KEY]) {
3712
+ setSdkState(RUM_INTERNAL_DATA_KEY, {});
3368
3713
  }
3369
- CxGlobal[RUM_INTERNAL_DATA_KEY][key] = value;
3714
+ sdkStore[RUM_INTERNAL_DATA_KEY][key] = value;
3370
3715
  }
3371
3716
  function getInternalRumData(key) {
3372
3717
  var _a;
3373
- return (_a = CxGlobal[RUM_INTERNAL_DATA_KEY]) === null || _a === void 0 ? void 0 : _a[key];
3718
+ return (_a = sdkStore[RUM_INTERNAL_DATA_KEY]) === null || _a === void 0 ? void 0 : _a[key];
3374
3719
  }
3375
3720
 
3376
3721
  var _a$2;
@@ -3613,14 +3958,14 @@ function applyUrlBluePrinters(_a) {
3613
3958
  return blueprintedUrl;
3614
3959
  }
3615
3960
  function resolvePageContext(url) {
3616
- var _a;
3961
+ var _a, _b, _c, _d;
3617
3962
  var page_url_blueprint = applyUrlBluePrinters({
3618
3963
  url: url,
3619
- blueprinters: (_a = getSdkConfig().urlBlueprinters) === null || _a === void 0 ? void 0 : _a.pageUrlBlueprinters,
3964
+ blueprinters: (_b = (_a = getSdkConfig()) === null || _a === void 0 ? void 0 : _a.urlBlueprinters) === null || _b === void 0 ? void 0 : _b.pageUrlBlueprinters,
3620
3965
  });
3621
3966
  var page_fragments = getUrlFragments(page_url_blueprint);
3622
3967
  var urlParts = getCachedUrlParts(PAGE_URL_PARTS_KEY, url);
3623
- var referrerParts = getCachedUrlParts(REFERRER_URL_PARTS_KEY, document === null || document === void 0 ? void 0 : document.referrer);
3968
+ var referrerParts = getCachedUrlParts(REFERRER_URL_PARTS_KEY, (_c = CxGlobal.document) === null || _c === void 0 ? void 0 : _c.referrer);
3624
3969
  return {
3625
3970
  page_url: url.slice(0, MAX_CHARACTERS),
3626
3971
  page_url_blueprint: page_url_blueprint,
@@ -3629,7 +3974,7 @@ function resolvePageContext(url) {
3629
3974
  subdomain: urlParts === null || urlParts === void 0 ? void 0 : urlParts.subdomain,
3630
3975
  domain: urlParts === null || urlParts === void 0 ? void 0 : urlParts.domain,
3631
3976
  host: urlParts === null || urlParts === void 0 ? void 0 : urlParts.host,
3632
- referrer: document.referrer,
3977
+ referrer: (_d = CxGlobal.document) === null || _d === void 0 ? void 0 : _d.referrer,
3633
3978
  referrer_path: referrerParts === null || referrerParts === void 0 ? void 0 : referrerParts.path,
3634
3979
  referrer_schema: referrerParts === null || referrerParts === void 0 ? void 0 : referrerParts.schema,
3635
3980
  referrer_subdomain: referrerParts === null || referrerParts === void 0 ? void 0 : referrerParts.subdomain,
@@ -4161,9 +4506,9 @@ function resolveSessionConfig(config) {
4161
4506
  return __assign(__assign({}, config), { sessionSampleRate: (_a = config.sessionSampleRate) !== null && _a !== void 0 ? _a : 100, onlyWithErrorConfig: resolveSessionWithErrorsConfig(config.onlyWithErrorConfig) });
4162
4507
  }
4163
4508
  function resolveSessionRecordingConfig(config) {
4164
- var _a;
4509
+ var _a, _b;
4165
4510
  if (config) {
4166
- return __assign(__assign({}, config), { sessionRecordingSampleRate: (_a = config.sessionRecordingSampleRate) !== null && _a !== void 0 ? _a : 100 });
4511
+ return __assign(__assign({}, config), { sessionRecordingSampleRate: (_a = config.sessionRecordingSampleRate) !== null && _a !== void 0 ? _a : 100, captureScreenshotOnDomChange: (_b = config.captureScreenshotOnDomChange) !== null && _b !== void 0 ? _b : true });
4167
4512
  }
4168
4513
  return;
4169
4514
  }
@@ -4449,7 +4794,8 @@ var CoralogixExporter = (function () {
4449
4794
  return cxSpans;
4450
4795
  }, []);
4451
4796
  this.invokeLogRequest(instrumentationLogs);
4452
- var cachedLogs = (CxGlobal.cachedLogs = __spreadArray(__spreadArray([], __read$1((CxGlobal.cachedLogs || [])), false), __read$1(currentSpans), false));
4797
+ var cachedLogs = __spreadArray(__spreadArray([], __read$1((sdkStore[CACHED_LOGS_KEY] || [])), false), __read$1(currentSpans), false);
4798
+ setSdkState(CACHED_LOGS_KEY, cachedLogs);
4453
4799
  var logsCounter = cachedLogs.length;
4454
4800
  if (logsCounter > maxRumEventsForSessionWithError && !sessionHasError) {
4455
4801
  this.clearCachedDataForSessionWithError();
@@ -4481,7 +4827,7 @@ var CoralogixExporter = (function () {
4481
4827
  return strippedLogs;
4482
4828
  };
4483
4829
  CoralogixExporter.prototype.clearCachedDataForSessionWithError = function () {
4484
- CxGlobal.cachedLogs = [];
4830
+ setSdkState(CACHED_LOGS_KEY, []);
4485
4831
  this.batchTimeDelay = BATCH_TIME_DELAY;
4486
4832
  };
4487
4833
  CoralogixExporter.prototype.shutdown = function () {
@@ -4575,7 +4921,7 @@ var SnapshotManager = (function () {
4575
4921
  _this._isSnapshotSentDueToRecording = false;
4576
4922
  clearStoredSnapshotState();
4577
4923
  };
4578
- CxGlobal[SNAPSHOT_MANAGER_KEY] = this;
4924
+ setSdkState(SNAPSHOT_MANAGER_KEY, this);
4579
4925
  if (!this.restoreSnapshot()) {
4580
4926
  this.resetSnapshot();
4581
4927
  }
@@ -4905,7 +5251,7 @@ var SessionManager = (function (_super) {
4905
5251
  return __generator(this, function (_a) {
4906
5252
  switch (_a.label) {
4907
5253
  case 0:
4908
- CxGlobal[SESSION_MANAGER_KEY] = this;
5254
+ setSdkState(SESSION_MANAGER_KEY, this);
4909
5255
  this.sessionRecorderConfig = recordConfig;
4910
5256
  if (!(recordConfig === null || recordConfig === void 0 ? void 0 : recordConfig.enable)) return [3, 3];
4911
5257
  recordingSamplingEnabled = isSamplingOn(recordConfig.sessionRecordingSampleRate);
@@ -4938,7 +5284,7 @@ var SessionManager = (function (_super) {
4938
5284
  (_a = CxGlobal.sessionStorage) === null || _a === void 0 ? void 0 : _a.removeItem(PREV_SESSION_KEY);
4939
5285
  };
4940
5286
  SessionManager.prototype.clearSession = function () {
4941
- var _a, _b, _c, _d, _e, _f, _g;
5287
+ var _a, _b, _c, _d, _e, _f, _g, _h;
4942
5288
  if (this.debugMode) {
4943
5289
  console.debug('Coralogix Browser SDK - Session expired, clearing session');
4944
5290
  }
@@ -4948,10 +5294,11 @@ var SessionManager = (function (_super) {
4948
5294
  (_d = getSnapshotManager()) === null || _d === void 0 ? void 0 : _d.resetSnapshot();
4949
5295
  clearStoredSnapshotState();
4950
5296
  (_e = getClickScreenshotManager()) === null || _e === void 0 ? void 0 : _e.reset();
5297
+ (_f = getDomChangeScreenshotTrigger()) === null || _f === void 0 ? void 0 : _f.reset();
4951
5298
  this.resetCurrentPageFragment();
4952
5299
  this.resetViewNumber();
4953
- (_f = this.sessionRecorder) === null || _f === void 0 ? void 0 : _f.stopRecording();
4954
- (_g = CxGlobal.sessionStorage) === null || _g === void 0 ? void 0 : _g.removeItem(SESSION_KEY);
5300
+ (_g = this.sessionRecorder) === null || _g === void 0 ? void 0 : _g.stopRecording();
5301
+ (_h = CxGlobal.sessionStorage) === null || _h === void 0 ? void 0 : _h.removeItem(SESSION_KEY);
4955
5302
  };
4956
5303
  SessionManager.prototype.clearGlobalSpans = function () {
4957
5304
  var _a;
@@ -5203,28 +5550,14 @@ function resolveUrlBlueprinters(urlBlueprinters) {
5203
5550
  if (!urlBlueprinters) {
5204
5551
  return OPTIONS_DEFAULTS.urlBlueprinters;
5205
5552
  }
5206
- var resolvedUrlBlueprinters = {
5207
- pageUrlBlueprinters: [],
5208
- networkUrlBlueprinters: [],
5209
- };
5210
- var concatBlueprinters = function (urlBlueprinters) {
5211
- var _a, _b;
5212
- var _c = urlBlueprinters || {}, pageUrlBlueprinters = _c.pageUrlBlueprinters, networkUrlBlueprinters = _c.networkUrlBlueprinters;
5213
- if (pageUrlBlueprinters) {
5214
- (_a = resolvedUrlBlueprinters.pageUrlBlueprinters).push.apply(_a, __spreadArray([], __read$1(pageUrlBlueprinters), false));
5215
- }
5216
- if (networkUrlBlueprinters) {
5217
- (_b = resolvedUrlBlueprinters.networkUrlBlueprinters).push.apply(_b, __spreadArray([], __read$1(networkUrlBlueprinters), false));
5218
- }
5553
+ var defaults = OPTIONS_DEFAULTS.urlBlueprinters || {};
5554
+ return {
5555
+ pageUrlBlueprinters: __spreadArray(__spreadArray([], __read$1((defaults.pageUrlBlueprinters || [])), false), __read$1((urlBlueprinters.pageUrlBlueprinters || [])), false),
5556
+ networkUrlBlueprinters: __spreadArray(__spreadArray([], __read$1((defaults.networkUrlBlueprinters || [])), false), __read$1((urlBlueprinters.networkUrlBlueprinters || [])), false),
5219
5557
  };
5220
- concatBlueprinters(urlBlueprinters);
5221
- if (OPTIONS_DEFAULTS.urlBlueprinters) {
5222
- concatBlueprinters(OPTIONS_DEFAULTS.urlBlueprinters);
5223
- }
5224
- return resolvedUrlBlueprinters;
5225
5558
  }
5226
5559
 
5227
- var SDK_VERSION = '3.23.5';
5560
+ var SDK_VERSION = '3.24.0';
5228
5561
 
5229
5562
  function shouldDropEvent(cxRumEvent, options) {
5230
5563
  if (isDocumentErrorWithoutMessage(cxRumEvent)) {
@@ -5747,24 +6080,26 @@ var CoralogixNavigationProcessor = (function () {
5747
6080
  };
5748
6081
  CoralogixNavigationProcessor.prototype.onEnd = function (span) { };
5749
6082
  CoralogixNavigationProcessor.prototype.onStart = function (span) {
5750
- var _a;
6083
+ var _a, _b;
5751
6084
  if (this.isResolving) {
5752
6085
  return;
5753
6086
  }
5754
6087
  this.isResolving = true;
5755
6088
  try {
5756
6089
  var pageContext = resolvePageContext(location.href);
5757
- if (pageContext) {
6090
+ var sessionManager = getSessionManager();
6091
+ if (pageContext && sessionManager) {
5758
6092
  span[CoralogixAttributes.PAGE_CONTEXT] = pageContext;
5759
- var previousPageFragment = getSessionManager().currentPageFragment;
6093
+ var previousPageFragment = sessionManager.currentPageFragment;
5760
6094
  var page_fragments = pageContext.page_fragments;
5761
6095
  if (previousPageFragment !== page_fragments) {
5762
- getSessionManager().updateCurrentPage(page_fragments);
6096
+ sessionManager.updateCurrentPage(page_fragments);
5763
6097
  span[CoralogixAttributes.IS_NAVIGATION_EVENT] = true;
5764
6098
  this.handlePageNavigation(previousPageFragment);
5765
6099
  (_a = getClickScreenshotManager()) === null || _a === void 0 ? void 0 : _a.onNavigation();
6100
+ (_b = getDomChangeScreenshotTrigger()) === null || _b === void 0 ? void 0 : _b.onNavigation();
5766
6101
  }
5767
- span[CoralogixAttributes.VIEW_NUMBER] = getSessionManager().viewNumber;
6102
+ span[CoralogixAttributes.VIEW_NUMBER] = sessionManager.viewNumber;
5768
6103
  }
5769
6104
  }
5770
6105
  finally {
@@ -5772,8 +6107,9 @@ var CoralogixNavigationProcessor = (function () {
5772
6107
  }
5773
6108
  };
5774
6109
  CoralogixNavigationProcessor.prototype.handlePageNavigation = function (previousPageFragment) {
6110
+ var _a;
5775
6111
  if (previousPageFragment) {
5776
- getSessionManager().incrementViewNumber();
6112
+ (_a = getSessionManager()) === null || _a === void 0 ? void 0 : _a.incrementViewNumber();
5777
6113
  }
5778
6114
  };
5779
6115
  CoralogixNavigationProcessor.prototype.shutdown = function () {
@@ -5789,6 +6125,14 @@ function getTiming(duration) {
5789
6125
  return getNowTime() - getSessionManager().currentPageTimestamp;
5790
6126
  }
5791
6127
 
6128
+ function canCaptureAutomaticScreenshot() {
6129
+ var sessionManager = getSessionManager();
6130
+ if (!(sessionManager === null || sessionManager === void 0 ? void 0 : sessionManager.onlySessionWithErrorMode)) {
6131
+ return true;
6132
+ }
6133
+ return sessionManager.sessionHasError;
6134
+ }
6135
+
5792
6136
  var FIRST_CAPTURE_CLICK = 1;
5793
6137
  var MIN_SECOND_CAPTURE_CLICK = 2;
5794
6138
  var TOTAL_CAPTURE_OPTIONS = 9;
@@ -5808,23 +6152,333 @@ var ClickScreenshotManager = (function () {
5808
6152
  _this.clickCount = 0;
5809
6153
  };
5810
6154
  this.handleClick = function () {
5811
- if (!getSessionRecorder()) {
6155
+ var _a;
6156
+ if (!((_a = getSessionRecorder()) === null || _a === void 0 ? void 0 : _a.isRecordingActive())) {
5812
6157
  return;
5813
6158
  }
5814
6159
  _this.clickCount += 1;
5815
6160
  if (_this.clickCount === FIRST_CAPTURE_CLICK ||
5816
6161
  _this.clickCount === _this.secondCaptureClick) {
6162
+ if (!canCaptureAutomaticScreenshot()) {
6163
+ return;
6164
+ }
5817
6165
  CoralogixRum.screenshot(CX_PREFIX);
5818
6166
  }
5819
6167
  };
5820
- CxGlobal[CLICK_SCREENSHOT_MANAGER_KEY] = this;
6168
+ setSdkState(CLICK_SCREENSHOT_MANAGER_KEY, this);
5821
6169
  }
5822
6170
  ClickScreenshotManager.unregister = function () {
5823
- CxGlobal[CLICK_SCREENSHOT_MANAGER_KEY] = undefined;
6171
+ deleteSdkState(CLICK_SCREENSHOT_MANAGER_KEY);
5824
6172
  };
5825
6173
  return ClickScreenshotManager;
5826
6174
  }());
5827
6175
 
6176
+ var EventType;
6177
+ (function (EventType) {
6178
+ EventType[EventType["DomContentLoaded"] = 0] = "DomContentLoaded";
6179
+ EventType[EventType["Load"] = 1] = "Load";
6180
+ EventType[EventType["FullSnapshot"] = 2] = "FullSnapshot";
6181
+ EventType[EventType["IncrementalSnapshot"] = 3] = "IncrementalSnapshot";
6182
+ EventType[EventType["Meta"] = 4] = "Meta";
6183
+ EventType[EventType["Custom"] = 5] = "Custom";
6184
+ EventType[EventType["Plugin"] = 6] = "Plugin";
6185
+ EventType[EventType["Asset"] = 7] = "Asset";
6186
+ })(EventType || (EventType = {}));
6187
+ var IncrementalSource;
6188
+ (function (IncrementalSource) {
6189
+ IncrementalSource[IncrementalSource["Mutation"] = 0] = "Mutation";
6190
+ IncrementalSource[IncrementalSource["MouseMove"] = 1] = "MouseMove";
6191
+ IncrementalSource[IncrementalSource["MouseInteraction"] = 2] = "MouseInteraction";
6192
+ IncrementalSource[IncrementalSource["Scroll"] = 3] = "Scroll";
6193
+ IncrementalSource[IncrementalSource["ViewportResize"] = 4] = "ViewportResize";
6194
+ IncrementalSource[IncrementalSource["Input"] = 5] = "Input";
6195
+ IncrementalSource[IncrementalSource["TouchMove"] = 6] = "TouchMove";
6196
+ IncrementalSource[IncrementalSource["MediaInteraction"] = 7] = "MediaInteraction";
6197
+ IncrementalSource[IncrementalSource["StyleSheetRule"] = 8] = "StyleSheetRule";
6198
+ IncrementalSource[IncrementalSource["CanvasMutation"] = 9] = "CanvasMutation";
6199
+ IncrementalSource[IncrementalSource["Font"] = 10] = "Font";
6200
+ IncrementalSource[IncrementalSource["Log"] = 11] = "Log";
6201
+ IncrementalSource[IncrementalSource["Drag"] = 12] = "Drag";
6202
+ IncrementalSource[IncrementalSource["StyleDeclaration"] = 13] = "StyleDeclaration";
6203
+ IncrementalSource[IncrementalSource["Selection"] = 14] = "Selection";
6204
+ IncrementalSource[IncrementalSource["AdoptedStyleSheet"] = 15] = "AdoptedStyleSheet";
6205
+ IncrementalSource[IncrementalSource["CustomElement"] = 16] = "CustomElement";
6206
+ })(IncrementalSource || (IncrementalSource = {}));
6207
+ var MouseInteractions;
6208
+ (function (MouseInteractions) {
6209
+ MouseInteractions[MouseInteractions["MouseUp"] = 0] = "MouseUp";
6210
+ MouseInteractions[MouseInteractions["MouseDown"] = 1] = "MouseDown";
6211
+ MouseInteractions[MouseInteractions["Click"] = 2] = "Click";
6212
+ MouseInteractions[MouseInteractions["ContextMenu"] = 3] = "ContextMenu";
6213
+ MouseInteractions[MouseInteractions["DblClick"] = 4] = "DblClick";
6214
+ MouseInteractions[MouseInteractions["Focus"] = 5] = "Focus";
6215
+ MouseInteractions[MouseInteractions["Blur"] = 6] = "Blur";
6216
+ MouseInteractions[MouseInteractions["TouchStart"] = 7] = "TouchStart";
6217
+ MouseInteractions[MouseInteractions["TouchMove_Departed"] = 8] = "TouchMove_Departed";
6218
+ MouseInteractions[MouseInteractions["TouchEnd"] = 9] = "TouchEnd";
6219
+ MouseInteractions[MouseInteractions["TouchCancel"] = 10] = "TouchCancel";
6220
+ })(MouseInteractions || (MouseInteractions = {}));
6221
+ var PointerTypes;
6222
+ (function (PointerTypes) {
6223
+ PointerTypes[PointerTypes["Mouse"] = 0] = "Mouse";
6224
+ PointerTypes[PointerTypes["Pen"] = 1] = "Pen";
6225
+ PointerTypes[PointerTypes["Touch"] = 2] = "Touch";
6226
+ })(PointerTypes || (PointerTypes = {}));
6227
+ var CanvasContext;
6228
+ (function (CanvasContext) {
6229
+ CanvasContext[CanvasContext["2D"] = 0] = "2D";
6230
+ CanvasContext[CanvasContext["WebGL"] = 1] = "WebGL";
6231
+ CanvasContext[CanvasContext["WebGL2"] = 2] = "WebGL2";
6232
+ })(CanvasContext || (CanvasContext = {}));
6233
+ var MediaInteractions;
6234
+ (function (MediaInteractions) {
6235
+ MediaInteractions[MediaInteractions["Play"] = 0] = "Play";
6236
+ MediaInteractions[MediaInteractions["Pause"] = 1] = "Pause";
6237
+ MediaInteractions[MediaInteractions["Seeked"] = 2] = "Seeked";
6238
+ MediaInteractions[MediaInteractions["VolumeChange"] = 3] = "VolumeChange";
6239
+ MediaInteractions[MediaInteractions["RateChange"] = 4] = "RateChange";
6240
+ })(MediaInteractions || (MediaInteractions = {}));
6241
+ var NodeType;
6242
+ (function (NodeType) {
6243
+ NodeType[NodeType["Document"] = 0] = "Document";
6244
+ NodeType[NodeType["DocumentType"] = 1] = "DocumentType";
6245
+ NodeType[NodeType["Element"] = 2] = "Element";
6246
+ NodeType[NodeType["Text"] = 3] = "Text";
6247
+ NodeType[NodeType["CDATA"] = 4] = "CDATA";
6248
+ NodeType[NodeType["Comment"] = 5] = "Comment";
6249
+ })(NodeType || (NodeType = {}));
6250
+
6251
+ var NEVER = 0;
6252
+ var UNRESOLVED_DEPTH = MAX_DEPTH_WALK + 1;
6253
+ var DomChangeScreenshotTrigger = (function () {
6254
+ function DomChangeScreenshotTrigger() {
6255
+ var _this = this;
6256
+ this.settled = false;
6257
+ this.lastInteractionAt = NEVER;
6258
+ this.cachedElementCount = 0;
6259
+ this.elementCountRefreshedAt = NEVER;
6260
+ this.lastCaptureAt = NEVER;
6261
+ this.capturesThisView = 0;
6262
+ this.reset = function () {
6263
+ _this.clearTimers();
6264
+ _this.settled = false;
6265
+ _this.lastInteractionAt = NEVER;
6266
+ _this.lastCaptureAt = NEVER;
6267
+ _this.onNavigation();
6268
+ };
6269
+ this.onNavigation = function () {
6270
+ _this.clearTimers();
6271
+ _this.settled = false;
6272
+ _this.pendingReason = undefined;
6273
+ _this.capturesThisView = 0;
6274
+ _this.elementCountRefreshedAt = NEVER;
6275
+ };
6276
+ this.handleRecordEvent = function (event, resolveNode) {
6277
+ var _a;
6278
+ try {
6279
+ if ((event === null || event === void 0 ? void 0 : event.type) === EventType.FullSnapshot) {
6280
+ _this.armSettleTimer();
6281
+ return;
6282
+ }
6283
+ if ((event === null || event === void 0 ? void 0 : event.type) !== EventType.IncrementalSnapshot) {
6284
+ return;
6285
+ }
6286
+ var source = (_a = event.data) === null || _a === void 0 ? void 0 : _a.source;
6287
+ if (_this.isUserInteraction(event)) {
6288
+ _this.lastInteractionAt = event.timestamp;
6289
+ return;
6290
+ }
6291
+ if (source !== IncrementalSource.Mutation) {
6292
+ return;
6293
+ }
6294
+ if (!_this.settled) {
6295
+ _this.armSettleTimer();
6296
+ return;
6297
+ }
6298
+ _this.handleMutation(event.data, event.timestamp, resolveNode);
6299
+ }
6300
+ catch (_b) {
6301
+ }
6302
+ };
6303
+ this.capture = function () {
6304
+ var reason = _this.pendingReason;
6305
+ _this.pendingReason = undefined;
6306
+ if (!reason) {
6307
+ return;
6308
+ }
6309
+ var now = Date.now();
6310
+ if (_this.capturesThisView >= MAX_CAPTURES_PER_VIEW ||
6311
+ now - _this.lastCaptureAt < MIN_CAPTURE_INTERVAL_MS ||
6312
+ _this.cachedElementCount > MAX_NODES_FOR_CAPTURE ||
6313
+ !canCaptureAutomaticScreenshot()) {
6314
+ return;
6315
+ }
6316
+ _this.lastCaptureAt = now;
6317
+ _this.capturesThisView += 1;
6318
+ _this.lastInteractionAt = NEVER;
6319
+ CoralogixRum.screenshot(reason);
6320
+ };
6321
+ this.markSettled = function () {
6322
+ var _a;
6323
+ var elementCount = ((_a = CxGlobal.document) === null || _a === void 0 ? void 0 : _a.getElementsByTagName('*').length) || 0;
6324
+ if (elementCount < CONTENT_ELEMENT_FLOOR) {
6325
+ return;
6326
+ }
6327
+ _this.settled = true;
6328
+ _this.cachedElementCount = elementCount;
6329
+ _this.elementCountRefreshedAt = Date.now();
6330
+ };
6331
+ setSdkState(DOM_CHANGE_SCREENSHOT_TRIGGER_KEY, this);
6332
+ }
6333
+ DomChangeScreenshotTrigger.unregister = function () {
6334
+ var instance = sdkStore[DOM_CHANGE_SCREENSHOT_TRIGGER_KEY];
6335
+ instance === null || instance === void 0 ? void 0 : instance.clearTimers();
6336
+ deleteSdkState(DOM_CHANGE_SCREENSHOT_TRIGGER_KEY);
6337
+ };
6338
+ DomChangeScreenshotTrigger.prototype.isUserInteraction = function (event) {
6339
+ var data = event.data;
6340
+ if ((data === null || data === void 0 ? void 0 : data.source) === IncrementalSource.Input) {
6341
+ return true;
6342
+ }
6343
+ if ((data === null || data === void 0 ? void 0 : data.source) !== IncrementalSource.MouseInteraction) {
6344
+ return false;
6345
+ }
6346
+ return (data.type === MouseInteractions.MouseDown ||
6347
+ data.type === MouseInteractions.Click ||
6348
+ data.type === MouseInteractions.DblClick ||
6349
+ data.type === MouseInteractions.TouchStart);
6350
+ };
6351
+ DomChangeScreenshotTrigger.prototype.handleMutation = function (data, timestamp, resolveNode) {
6352
+ var _a;
6353
+ var adds = data.adds || [];
6354
+ var removes = data.removes || [];
6355
+ var weight = adds.length + removes.length + (((_a = data.texts) === null || _a === void 0 ? void 0 : _a.length) || 0);
6356
+ if (!weight) {
6357
+ return;
6358
+ }
6359
+ var elementCount = this.getElementCount(timestamp);
6360
+ var reason = this.classify(adds, removes, weight, elementCount, timestamp, resolveNode);
6361
+ if (!reason) {
6362
+ return;
6363
+ }
6364
+ this.pendingReason = reason;
6365
+ this.clearDebounceTimer();
6366
+ this.debounceTimer = cxSetTimeout(this.capture, CHANGE_DEBOUNCE_MS);
6367
+ };
6368
+ DomChangeScreenshotTrigger.prototype.classify = function (adds, removes, weight, elementCount, timestamp, resolveNode) {
6369
+ var sinceInteraction = timestamp - this.lastInteractionAt;
6370
+ var withinTightWindow = sinceInteraction <= INTERACTION_TIGHT_MS;
6371
+ var withinLooseWindow = sinceInteraction <= INTERACTION_LOOSE_MS;
6372
+ if (withinLooseWindow && removesTolerable(adds.length, removes.length)) {
6373
+ var addedElements_1 = adds.filter(function (add) { return containsElement(add.node); }).length;
6374
+ var looksLikeOverlay = function () {
6375
+ return addedElements_1 > 0 &&
6376
+ shallowestDepth(adds, resolveNode) <= OVERLAY_MAX_DEPTH;
6377
+ };
6378
+ var bigEnough = withinTightWindow
6379
+ ? addedElements_1 >= INTERACTION_TIGHT_MIN_ELEMENTS
6380
+ : addedElements_1 >= INTERACTION_LOOSE_MIN_ELEMENTS;
6381
+ if (bigEnough && looksLikeOverlay()) {
6382
+ return "dom-overlay";
6383
+ }
6384
+ }
6385
+ if (withinLooseWindow &&
6386
+ weight >= threshold(VIEW_CHANGE_MIN_WEIGHT, VIEW_CHANGE_FRACTION, elementCount)) {
6387
+ return "dom-view-change";
6388
+ }
6389
+ return undefined;
6390
+ };
6391
+ DomChangeScreenshotTrigger.prototype.getElementCount = function (timestamp) {
6392
+ var _a;
6393
+ if (timestamp - this.elementCountRefreshedAt < NODE_COUNT_REFRESH_MS) {
6394
+ return this.cachedElementCount;
6395
+ }
6396
+ this.cachedElementCount =
6397
+ ((_a = CxGlobal.document) === null || _a === void 0 ? void 0 : _a.getElementsByTagName('*').length) || 0;
6398
+ this.elementCountRefreshedAt = timestamp;
6399
+ return this.cachedElementCount;
6400
+ };
6401
+ DomChangeScreenshotTrigger.prototype.armSettleTimer = function () {
6402
+ this.clearSettleTimer();
6403
+ this.quietTimer = cxSetTimeout(this.markSettled, SETTLE_QUIET_MS);
6404
+ };
6405
+ DomChangeScreenshotTrigger.prototype.clearTimers = function () {
6406
+ this.clearSettleTimer();
6407
+ this.clearDebounceTimer();
6408
+ };
6409
+ DomChangeScreenshotTrigger.prototype.clearSettleTimer = function () {
6410
+ if (this.quietTimer) {
6411
+ cxClearTimeout(this.quietTimer);
6412
+ this.quietTimer = undefined;
6413
+ }
6414
+ };
6415
+ DomChangeScreenshotTrigger.prototype.clearDebounceTimer = function () {
6416
+ if (this.debounceTimer) {
6417
+ cxClearTimeout(this.debounceTimer);
6418
+ this.debounceTimer = undefined;
6419
+ }
6420
+ };
6421
+ return DomChangeScreenshotTrigger;
6422
+ }());
6423
+ function shallowestDepth(adds, resolveNode) {
6424
+ var e_1, _a;
6425
+ if (!resolveNode) {
6426
+ return UNRESOLVED_DEPTH;
6427
+ }
6428
+ var shallowest = UNRESOLVED_DEPTH;
6429
+ try {
6430
+ for (var adds_1 = __values$1(adds), adds_1_1 = adds_1.next(); !adds_1_1.done; adds_1_1 = adds_1.next()) {
6431
+ var add = adds_1_1.value;
6432
+ var parent_1 = resolveNode(add.parentId);
6433
+ if (parent_1) {
6434
+ shallowest = Math.min(shallowest, depthFromBody(parent_1));
6435
+ }
6436
+ if (shallowest <= OVERLAY_MAX_DEPTH) {
6437
+ break;
6438
+ }
6439
+ }
6440
+ }
6441
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
6442
+ finally {
6443
+ try {
6444
+ if (adds_1_1 && !adds_1_1.done && (_a = adds_1.return)) _a.call(adds_1);
6445
+ }
6446
+ finally { if (e_1) throw e_1.error; }
6447
+ }
6448
+ return shallowest;
6449
+ }
6450
+ function removesTolerable(added, removed) {
6451
+ return (removed <=
6452
+ Math.max(OVERLAY_MAX_REMOVES_ABSOLUTE, added * OVERLAY_MAX_REMOVES_FRACTION));
6453
+ }
6454
+ function threshold(minimum, fraction, elementCount) {
6455
+ return Math.max(minimum, elementCount * fraction);
6456
+ }
6457
+ function containsElement(node) {
6458
+ if (!node) {
6459
+ return false;
6460
+ }
6461
+ if (node.type === NodeType.Element) {
6462
+ return true;
6463
+ }
6464
+ var children = node.childNodes;
6465
+ return !!(children === null || children === void 0 ? void 0 : children.some(containsElement));
6466
+ }
6467
+ function depthFromBody(node) {
6468
+ var _a;
6469
+ var body = (_a = CxGlobal.document) === null || _a === void 0 ? void 0 : _a.body;
6470
+ var depth = 0;
6471
+ var current = node;
6472
+ while (current && current !== body) {
6473
+ current = current.parentElement;
6474
+ depth += 1;
6475
+ if (depth > MAX_DEPTH_WALK) {
6476
+ return UNRESOLVED_DEPTH;
6477
+ }
6478
+ }
6479
+ return current ? depth : UNRESOLVED_DEPTH;
6480
+ }
6481
+
5828
6482
  if (supportedPerformanceTypes === null || supportedPerformanceTypes === void 0 ? void 0 : supportedPerformanceTypes.has(PerformanceTypes.LongTask)) {
5829
6483
  var ttiHandler_1 = (CxGlobal.__tti = {
5830
6484
  e: [],
@@ -5863,7 +6517,6 @@ function getResolvedName(element, fullData) {
5863
6517
  element: element,
5864
6518
  config: getSdkConfig(),
5865
6519
  actionName: actionName,
5866
- ariaLabel: ariaLabel,
5867
6520
  });
5868
6521
  return fullData
5869
6522
  ? { resolvedName: resolvedName, isDeadClick: isDeadClick, actionName: actionName, ariaLabel: ariaLabel }
@@ -5880,9 +6533,14 @@ var CoralogixRum = {
5880
6533
  init: function (options) {
5881
6534
  var _a, _b;
5882
6535
  var _this = this;
5883
- var _c, _d;
6536
+ var _c;
5884
6537
  try {
5885
- if (isInited || ((_c = CxGlobal === null || CxGlobal === void 0 ? void 0 : CxGlobal.CoralogixRum) === null || _c === void 0 ? void 0 : _c.isInited)) {
6538
+ var owner = CxGlobal === null || CxGlobal === void 0 ? void 0 : CxGlobal.CoralogixRum;
6539
+ if (owner && owner !== CoralogixRum) {
6540
+ console.debug('CoralogixRum: another SDK copy on this page owns the global, ignoring init');
6541
+ return;
6542
+ }
6543
+ if (isInited) {
5886
6544
  if (options === null || options === void 0 ? void 0 : options.debug) {
5887
6545
  console.debug('CoralogixRum already initialized, skipping init');
5888
6546
  }
@@ -5900,8 +6558,8 @@ var CoralogixRum = {
5900
6558
  if (!resolvedOptions_1) {
5901
6559
  return;
5902
6560
  }
5903
- CxGlobal[USER_AGENT_KEY] = parseUserAgent(navigator.userAgent);
5904
- CxGlobal[SDK_CONFIG_KEY] = resolvedOptions_1;
6561
+ setSdkState(USER_AGENT_KEY, parseUserAgent(navigator.userAgent));
6562
+ setSdkState(SDK_CONFIG_KEY, resolvedOptions_1);
5905
6563
  var sampler = getResolvedSampler();
5906
6564
  if (!resolvedOptions_1.debug && !resolvedOptions_1.public_key) {
5907
6565
  console.warn('rumAuth will be required in the future');
@@ -5998,8 +6656,11 @@ var CoralogixRum = {
5998
6656
  spanMapProcessor = new CoralogixSpanMapProcessor();
5999
6657
  tracerProvider.addSpanProcessor(spanMapProcessor);
6000
6658
  new SnapshotManager();
6001
- if ((_d = resolvedOptions_1.sessionRecordingConfig) === null || _d === void 0 ? void 0 : _d.enable) {
6659
+ if ((_c = resolvedOptions_1.sessionRecordingConfig) === null || _c === void 0 ? void 0 : _c.enable) {
6002
6660
  new ClickScreenshotManager();
6661
+ if (resolvedOptions_1.sessionRecordingConfig.captureScreenshotOnDomChange) {
6662
+ new DomChangeScreenshotTrigger();
6663
+ }
6003
6664
  }
6004
6665
  snapshotProcessor = new CoralogixSnapshotSpanProcessor();
6005
6666
  tracerProvider.addSpanProcessor(snapshotProcessor);
@@ -6009,10 +6670,10 @@ var CoralogixRum = {
6009
6670
  tracerProvider: tracerProvider,
6010
6671
  instrumentations: instrumentations,
6011
6672
  });
6012
- var _e = __read$1(partition(resolvedOptions_1.labelProviders || [], function (_a) {
6673
+ var _d = __read$1(partition(resolvedOptions_1.labelProviders || [], function (_a) {
6013
6674
  var urlType = _a.urlType;
6014
6675
  return urlType === UrlType.PAGE || !urlType;
6015
- }), 2), pageUrlLabelProviders = _e[0], networkUrlLabelProviders = _e[1];
6676
+ }), 2), pageUrlLabelProviders = _d[0], networkUrlLabelProviders = _d[1];
6016
6677
  saveInternalRumData(PAGE_URL_LABEL_PROVIDERS_KEY, pageUrlLabelProviders);
6017
6678
  saveInternalRumData(NETWORK_URL_LABEL_PROVIDERS_KEY, networkUrlLabelProviders);
6018
6679
  isInited = true;
@@ -6099,6 +6760,7 @@ var CoralogixRum = {
6099
6760
  this.stopSessionRecording();
6100
6761
  (_a = getSessionManager()) === null || _a === void 0 ? void 0 : _a.stop();
6101
6762
  ClickScreenshotManager.unregister();
6763
+ DomChangeScreenshotTrigger.unregister();
6102
6764
  attributesProcessor === null || attributesProcessor === void 0 ? void 0 : attributesProcessor.shutdown();
6103
6765
  navigationProcessor === null || navigationProcessor === void 0 ? void 0 : navigationProcessor.shutdown();
6104
6766
  spanMapProcessor === null || spanMapProcessor === void 0 ? void 0 : spanMapProcessor.shutdown();
@@ -6275,7 +6937,9 @@ var CoralogixRum = {
6275
6937
  }
6276
6938
  },
6277
6939
  };
6278
- CxGlobal.CoralogixRum = CoralogixRum;
6940
+ if (!CxGlobal.CoralogixRum) {
6941
+ CxGlobal.CoralogixRum = CoralogixRum;
6942
+ }
6279
6943
 
6280
6944
  var UrlBasedLabelProvider = (function () {
6281
6945
  function UrlBasedLabelProvider(config) {
@@ -6326,4 +6990,4 @@ var SessionRecordingEventType;
6326
6990
  SessionRecordingEventType[SessionRecordingEventType["Plugin"] = 6] = "Plugin";
6327
6991
  })(SessionRecordingEventType || (SessionRecordingEventType = {}));
6328
6992
 
6329
- export { BATCH_TIME_DELAY as B, CxGlobal as C, MAX_BATCH_TIME_MS as M, OtelNetworkAttrs as O, PerformanceTypes as P, Request as R, SESSION_RECORDER_SEGMENTS_MAP as S, UrlBasedLabelProvider as U, cxClearTimeout as a, createCxMutationObserver as b, cxSetTimeout as c, cxRequestAnimationFrame as d, cxCancelAnimationFrame as e, getSdkConfig as f, getZoneJsOriginalDom as g, cxClearInterval as h, getNowTime as i, SESSION_RECORDING_NETWORK_ERR0R_MESSAGE as j, cxSetInterval as k, SESSION_RECORDING_DEFAULT_HEADERS as l, SESSION_RECORDING_POSTFIX_URL as m, SESSION_RECORDER_KEY as n, SESSION_RECORDING_DEFAULT_ERROR_MESSAGE as o, CoralogixRum as p, CoralogixLogSeverity as q, SessionRecordingEventType as r, CoralogixEventType as s, UrlType as t };
6993
+ export { BATCH_TIME_DELAY as B, CanvasContext as C, EventType as E, IncrementalSource as I, MouseInteractions as M, NodeType as N, OtelNetworkAttrs as O, PointerTypes as P, Request as R, SESSION_RECORDER_SEGMENTS_MAP as S, UrlBasedLabelProvider as U, cxClearTimeout as a, createCxMutationObserver as b, cxSetTimeout as c, MediaInteractions as d, cxRequestAnimationFrame as e, cxCancelAnimationFrame as f, getZoneJsOriginalDom as g, CxGlobal as h, getSdkConfig as i, cxClearInterval as j, getNowTime as k, SESSION_RECORDING_NETWORK_ERR0R_MESSAGE as l, cxSetInterval as m, SESSION_RECORDING_DEFAULT_HEADERS as n, SESSION_RECORDING_POSTFIX_URL as o, getDomChangeScreenshotTrigger as p, SESSION_RECORDER_KEY as q, SESSION_RECORDING_DEFAULT_ERROR_MESSAGE as r, setSdkState as s, MAX_BATCH_TIME_MS as t, CoralogixRum as u, CoralogixLogSeverity as v, SessionRecordingEventType as w, CoralogixEventType as x, PerformanceTypes as y, UrlType as z };