@atlaskit/react-ufo 2.10.0 → 2.12.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.
Files changed (49) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/create-experimental-interaction-metrics-payload/package.json +15 -0
  3. package/dist/cjs/config/index.js +49 -18
  4. package/dist/cjs/create-experimental-interaction-metrics-payload/index.js +114 -0
  5. package/dist/cjs/create-payload/index.js +51 -10
  6. package/dist/cjs/interaction-metrics/common/constants.js +2 -3
  7. package/dist/cjs/interaction-metrics/index.js +130 -55
  8. package/dist/cjs/interaction-metrics/post-interaction-log.js +20 -10
  9. package/dist/cjs/interaction-metrics-init/index.js +28 -7
  10. package/dist/cjs/load-hold/UFOLoadHold.js +5 -3
  11. package/dist/cjs/segment/segment.js +9 -8
  12. package/dist/cjs/vc/vc-observer/observers/index.js +3 -1
  13. package/dist/es2019/config/index.js +30 -0
  14. package/dist/es2019/create-experimental-interaction-metrics-payload/index.js +85 -0
  15. package/dist/es2019/create-payload/index.js +50 -8
  16. package/dist/es2019/interaction-metrics/common/constants.js +1 -2
  17. package/dist/es2019/interaction-metrics/index.js +109 -28
  18. package/dist/es2019/interaction-metrics/post-interaction-log.js +21 -11
  19. package/dist/es2019/interaction-metrics-init/index.js +26 -7
  20. package/dist/es2019/load-hold/UFOLoadHold.js +5 -3
  21. package/dist/es2019/segment/segment.js +8 -11
  22. package/dist/es2019/vc/vc-observer/observers/index.js +3 -1
  23. package/dist/esm/config/index.js +47 -18
  24. package/dist/esm/create-experimental-interaction-metrics-payload/index.js +104 -0
  25. package/dist/esm/create-payload/index.js +51 -11
  26. package/dist/esm/interaction-metrics/common/constants.js +1 -2
  27. package/dist/esm/interaction-metrics/index.js +102 -27
  28. package/dist/esm/interaction-metrics/post-interaction-log.js +20 -10
  29. package/dist/esm/interaction-metrics-init/index.js +26 -7
  30. package/dist/esm/load-hold/UFOLoadHold.js +5 -3
  31. package/dist/esm/segment/segment.js +9 -8
  32. package/dist/esm/vc/vc-observer/observers/index.js +3 -1
  33. package/dist/types/common/common/types.d.ts +6 -4
  34. package/dist/types/config/index.d.ts +8 -0
  35. package/dist/types/create-experimental-interaction-metrics-payload/index.d.ts +16 -0
  36. package/dist/types/create-payload/index.d.ts +5922 -0
  37. package/dist/types/interaction-context/index.d.ts +1 -0
  38. package/dist/types/interaction-metrics/common/constants.d.ts +1 -2
  39. package/dist/types/interaction-metrics/index.d.ts +1 -1
  40. package/dist/types/load-hold/UFOLoadHold.d.ts +1 -2
  41. package/dist/types-ts4.5/common/common/types.d.ts +6 -4
  42. package/dist/types-ts4.5/config/index.d.ts +8 -0
  43. package/dist/types-ts4.5/create-experimental-interaction-metrics-payload/index.d.ts +16 -0
  44. package/dist/types-ts4.5/create-payload/index.d.ts +5922 -0
  45. package/dist/types-ts4.5/interaction-context/index.d.ts +1 -0
  46. package/dist/types-ts4.5/interaction-metrics/common/constants.d.ts +1 -2
  47. package/dist/types-ts4.5/interaction-metrics/index.d.ts +1 -1
  48. package/dist/types-ts4.5/load-hold/UFOLoadHold.d.ts +1 -2
  49. package/package.json +3 -5
@@ -47,11 +47,12 @@ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers
47
47
  var _uuid = require("uuid");
48
48
  var _coinflip = _interopRequireDefault(require("../coinflip"));
49
49
  var _config = require("../config");
50
+ var _createExperimentalInteractionMetricsPayload = require("../create-experimental-interaction-metrics-payload");
50
51
  var _experienceTraceIdContext = require("../experience-trace-id-context");
51
52
  var _featureFlagsAccessed = require("../feature-flags-accessed");
52
53
  var _interactionIdContext = require("../interaction-id-context");
53
54
  var _vc = require("../vc");
54
- var _constants = _interopRequireDefault(require("./common/constants"));
55
+ var _constants = require("./common/constants");
55
56
  var _postInteractionLog = _interopRequireDefault(require("./post-interaction-log"));
56
57
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
57
58
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
@@ -73,7 +74,7 @@ function getActiveInteraction() {
73
74
  if (!interactionId.current) {
74
75
  return;
75
76
  }
76
- return _constants.default.get(interactionId.current);
77
+ return _constants.interactions.get(interactionId.current);
77
78
  }
78
79
  function isPerformanceTracingEnabled() {
79
80
  var _getConfig;
@@ -121,7 +122,7 @@ function removeSegmentObserver(observer) {
121
122
  }
122
123
  }
123
124
  function remove(interactionId) {
124
- _constants.default.delete(interactionId);
125
+ _constants.interactions.delete(interactionId);
125
126
  }
126
127
  function updatePageLoadInteractionName(ufoName) {
127
128
  var routeName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ufoName;
@@ -133,7 +134,7 @@ function updatePageLoadInteractionName(ufoName) {
133
134
  interaction.routeName = routeName;
134
135
  }
135
136
  function addMetadata(interactionId, data) {
136
- var interaction = _constants.default.get(interactionId);
137
+ var interaction = _constants.interactions.get(interactionId);
137
138
  if (interaction != null) {
138
139
  Object.keys(data).forEach(function (key) {
139
140
  interaction.metaData[key] = data[key];
@@ -141,7 +142,7 @@ function addMetadata(interactionId, data) {
141
142
  }
142
143
  }
143
144
  function addCustomData(interactionId, labelStack, data) {
144
- var interaction = _constants.default.get(interactionId);
145
+ var interaction = _constants.interactions.get(interactionId);
145
146
  if (interaction != null) {
146
147
  Object.keys(data).forEach(function (i) {
147
148
  interaction.customData.push({
@@ -152,7 +153,7 @@ function addCustomData(interactionId, labelStack, data) {
152
153
  }
153
154
  }
154
155
  function addCustomTiming(interactionId, labelStack, data) {
155
- var interaction = _constants.default.get(interactionId);
156
+ var interaction = _constants.interactions.get(interactionId);
156
157
  if (interaction != null) {
157
158
  interaction.customTimings.push({
158
159
  labelStack: labelStack,
@@ -180,7 +181,7 @@ function addCustomTiming(interactionId, labelStack, data) {
180
181
  }
181
182
  function addMark(interactionId, type, name, labelStack) {
182
183
  var time = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : performance.now();
183
- var interaction = _constants.default.get(interactionId);
184
+ var interaction = _constants.interactions.get(interactionId);
184
185
  if (interaction != null) {
185
186
  interaction.marks.push({
186
187
  type: type,
@@ -197,7 +198,7 @@ function addMark(interactionId, type, name, labelStack) {
197
198
  }
198
199
  function addMarkToAll(type, name, labelStack) {
199
200
  var time = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : performance.now();
200
- _constants.default.forEach(function (interaction) {
201
+ _constants.interactions.forEach(function (interaction) {
201
202
  interaction.marks.push({
202
203
  type: type,
203
204
  name: name,
@@ -214,7 +215,7 @@ function addMarkToAll(type, name, labelStack) {
214
215
  function addSpan(interactionId, type, name, labelStack, start) {
215
216
  var end = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : performance.now();
216
217
  var size = arguments.length > 6 ? arguments[6] : undefined;
217
- var interaction = _constants.default.get(interactionId);
218
+ var interaction = _constants.interactions.get(interactionId);
218
219
  if (interaction != null) {
219
220
  interaction.spans.push({
220
221
  type: type,
@@ -240,7 +241,7 @@ function addSpan(interactionId, type, name, labelStack, start) {
240
241
  function addSpanToAll(type, name, labelStack, start) {
241
242
  var end = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : performance.now();
242
243
  var size = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;
243
- _constants.default.forEach(function (interaction) {
244
+ _constants.interactions.forEach(function (interaction) {
244
245
  interaction.spans.push({
245
246
  type: type,
246
247
  name: name,
@@ -290,16 +291,27 @@ function removeHoldCriterion(id) {
290
291
  }
291
292
  window.__CRITERION__.removeUFOHold(id);
292
293
  }
293
- function addHold(interactionId, labelStack, name) {
294
- var interaction = _constants.default.get(interactionId);
294
+ function addHold(interactionId, labelStack, name, experimental) {
295
+ var interaction = _constants.interactions.get(interactionId);
295
296
  var id = (0, _uuid.v4)();
296
297
  if (interaction != null) {
298
+ var _getConfig2;
297
299
  var start = performance.now();
298
- interaction.holdActive.set(id, {
300
+ var holdActive = {
299
301
  labelStack: labelStack,
300
302
  name: name,
301
303
  start: start
302
- });
304
+ };
305
+ if ((_getConfig2 = (0, _config.getConfig)()) !== null && _getConfig2 !== void 0 && (_getConfig2 = _getConfig2.experimentalInteractionMetrics) !== null && _getConfig2 !== void 0 && _getConfig2.enabled && experimental) {
306
+ interaction.holdExpActive.set(id, _objectSpread(_objectSpread({}, holdActive), {}, {
307
+ start: start
308
+ }));
309
+ }
310
+ if (!experimental) {
311
+ interaction.holdActive.set(id, _objectSpread(_objectSpread({}, holdActive), {}, {
312
+ start: start
313
+ }));
314
+ }
303
315
  addHoldCriterion(id, labelStack, name, start);
304
316
  return function () {
305
317
  var end = performance.now();
@@ -315,20 +327,29 @@ function addHold(interactionId, labelStack, name) {
315
327
  }
316
328
  }
317
329
  removeHoldCriterion(id);
318
- var currentInteraction = _constants.default.get(interactionId);
330
+ var currentInteraction = _constants.interactions.get(interactionId);
319
331
  var currentHold = interaction.holdActive.get(id);
320
- if (currentInteraction != null && currentHold != null) {
321
- currentInteraction.holdInfo.push(_objectSpread(_objectSpread({}, currentHold), {}, {
322
- end: end
323
- }));
324
- interaction.holdActive.delete(id);
332
+ var expHold = interaction.holdExpActive.get(id);
333
+ if (currentInteraction != null) {
334
+ if (currentHold != null) {
335
+ currentInteraction.holdInfo.push(_objectSpread(_objectSpread({}, currentHold), {}, {
336
+ end: end
337
+ }));
338
+ interaction.holdActive.delete(id);
339
+ }
340
+ if (expHold != null) {
341
+ currentInteraction.holdExpInfo.push(_objectSpread(_objectSpread({}, expHold), {}, {
342
+ end: end
343
+ }));
344
+ interaction.holdExpActive.delete(id);
345
+ }
325
346
  }
326
347
  };
327
348
  }
328
349
  return function () {};
329
350
  }
330
351
  function addHoldByID(interactionId, labelStack, name, id, ignoreOnSubmit) {
331
- var interaction = _constants.default.get(interactionId);
352
+ var interaction = _constants.interactions.get(interactionId);
332
353
  if (interaction != null) {
333
354
  var start = performance.now();
334
355
  interaction.holdActive.set(id, {
@@ -342,10 +363,10 @@ function addHoldByID(interactionId, labelStack, name, id, ignoreOnSubmit) {
342
363
  return function () {};
343
364
  }
344
365
  function removeHoldByID(interactionId, id) {
345
- var interaction = _constants.default.get(interactionId);
366
+ var interaction = _constants.interactions.get(interactionId);
346
367
  if (interaction != null) {
347
368
  var end = performance.now();
348
- var currentInteraction = _constants.default.get(interactionId);
369
+ var currentInteraction = _constants.interactions.get(interactionId);
349
370
  var currentHold = interaction.holdActive.get(id);
350
371
  if (currentInteraction != null && currentHold != null) {
351
372
  currentInteraction.holdInfo.push(_objectSpread(_objectSpread({}, currentHold), {}, {
@@ -357,7 +378,7 @@ function removeHoldByID(interactionId, id) {
357
378
  }
358
379
  }
359
380
  function getCurrentInteractionType(interactionId) {
360
- var interaction = _constants.default.get(interactionId);
381
+ var interaction = _constants.interactions.get(interactionId);
361
382
  if (interaction) {
362
383
  return interaction.type;
363
384
  }
@@ -399,7 +420,7 @@ var ModuleLoadingProfiler = exports.ModuleLoadingProfiler = {
399
420
  }
400
421
  };
401
422
  function addError(interactionId, name, labelStack, errorType, errorMessage, errorStack, forcedError) {
402
- var interaction = _constants.default.get(interactionId);
423
+ var interaction = _constants.interactions.get(interactionId);
403
424
  if (interaction != null) {
404
425
  interaction.errors.push({
405
426
  name: name,
@@ -412,7 +433,7 @@ function addError(interactionId, name, labelStack, errorType, errorMessage, erro
412
433
  }
413
434
  }
414
435
  function addErrorToAll(name, labelStack, errorType, errorMessage, errorStack) {
415
- _constants.default.forEach(function (interaction) {
436
+ _constants.interactions.forEach(function (interaction) {
416
437
  interaction.errors.push({
417
438
  name: name,
418
439
  labelStack: labelStack,
@@ -423,7 +444,7 @@ function addErrorToAll(name, labelStack, errorType, errorMessage, errorStack) {
423
444
  });
424
445
  }
425
446
  var addProfilerTimings = exports.addProfilerTimings = function addProfilerTimings(interactionId, labelStack, type, actualDuration, baseDuration, startTime, commitTime) {
426
- var _getConfig2;
447
+ var _getConfig3;
427
448
  if (isPerformanceTracingEnabled()) {
428
449
  try {
429
450
  // for Firefox 102 and older
@@ -435,7 +456,7 @@ var addProfilerTimings = exports.addProfilerTimings = function addProfilerTiming
435
456
  // do nothing
436
457
  }
437
458
  }
438
- var interaction = _constants.default.get(interactionId);
459
+ var interaction = _constants.interactions.get(interactionId);
439
460
  if (interaction != null) {
440
461
  interaction.reactProfilerTimings.push({
441
462
  labelStack: labelStack,
@@ -445,7 +466,7 @@ var addProfilerTimings = exports.addProfilerTimings = function addProfilerTiming
445
466
  startTime: startTime,
446
467
  commitTime: commitTime
447
468
  });
448
- } else if ((_getConfig2 = (0, _config.getConfig)()) !== null && _getConfig2 !== void 0 && (_getConfig2 = _getConfig2.postInteractionLog) !== null && _getConfig2 !== void 0 && _getConfig2.enabled) {
469
+ } else if ((_getConfig3 = (0, _config.getConfig)()) !== null && _getConfig3 !== void 0 && (_getConfig3 = _getConfig3.postInteractionLog) !== null && _getConfig3 !== void 0 && _getConfig3.enabled) {
449
470
  postInteractionLog.addProfilerTimings(labelStack, type, actualDuration, baseDuration, startTime, commitTime);
450
471
  }
451
472
  };
@@ -462,9 +483,8 @@ function callCleanUpCallbacks(interaction) {
462
483
  });
463
484
  }
464
485
  var finishInteraction = function finishInteraction(id, data) {
465
- var _getConfig3;
486
+ var _getConfig4, _getConfig5;
466
487
  var endTime = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : performance.now();
467
- // eslint-disable-next-line no-param-reassign
468
488
  data.end = endTime;
469
489
  try {
470
490
  // for Firefox 102 and older
@@ -476,15 +496,16 @@ var finishInteraction = function finishInteraction(id, data) {
476
496
  // do nothing
477
497
  }
478
498
  if (data.featureFlags) {
479
- // eslint-disable-next-line no-param-reassign
480
499
  data.featureFlags.during = Object.fromEntries(_featureFlagsAccessed.currentFeatureFlagsAccessed);
481
500
  }
482
501
  (0, _experienceTraceIdContext.clearActiveTrace)();
483
502
  callCleanUpCallbacks(data);
484
- if ((_getConfig3 = (0, _config.getConfig)()) !== null && _getConfig3 !== void 0 && (_getConfig3 = _getConfig3.vc) !== null && _getConfig3 !== void 0 && _getConfig3.stopVCAtInteractionFinish) {
503
+ if ((_getConfig4 = (0, _config.getConfig)()) !== null && _getConfig4 !== void 0 && (_getConfig4 = _getConfig4.vc) !== null && _getConfig4 !== void 0 && _getConfig4.stopVCAtInteractionFinish) {
485
504
  data.vc = (0, _vc.getVCObserver)().getVCRawData();
486
505
  }
487
- remove(id);
506
+ if (!((_getConfig5 = (0, _config.getConfig)()) !== null && _getConfig5 !== void 0 && (_getConfig5 = _getConfig5.experimentalInteractionMetrics) !== null && _getConfig5 !== void 0 && _getConfig5.enabled)) {
507
+ remove(id);
508
+ }
488
509
  PreviousInteractionLog.name = data.ufoName || 'unknown';
489
510
  PreviousInteractionLog.isAborted = data.abortReason != null;
490
511
  if (data.ufoName) {
@@ -550,15 +571,48 @@ var sinkInteractionHandler = exports.sinkInteractionHandler = function sinkInter
550
571
  var sinkPostInteractionLogHandler = exports.sinkPostInteractionLogHandler = function sinkPostInteractionLogHandler(sinkFn) {
551
572
  postInteractionLog.sinkHandler(sinkFn);
552
573
  };
574
+
575
+ // a flag to prevent multiple submitting
576
+ var activeSubmitted = false;
553
577
  function tryComplete(interactionId, endTime) {
554
- var interaction = _constants.default.get(interactionId);
578
+ var interaction = _constants.interactions.get(interactionId);
555
579
  if (interaction != null) {
556
- var noMoreHolds = interaction.holdActive.size === 0;
557
- if (noMoreHolds) {
558
- var _getConfig4;
559
- finishInteraction(interactionId, interaction, endTime);
560
- if ((_getConfig4 = (0, _config.getConfig)()) !== null && _getConfig4 !== void 0 && (_getConfig4 = _getConfig4.postInteractionLog) !== null && _getConfig4 !== void 0 && _getConfig4.enabled) {
561
- postInteractionLog.onInteractionComplete(interaction);
580
+ var noMoreActiveHolds = interaction.holdActive.size === 0;
581
+ var noMoreExpHolds = interaction.holdExpActive.size === 0;
582
+ var postInteraction = function postInteraction() {
583
+ var _getConfig6, _getConfig8;
584
+ if ((_getConfig6 = (0, _config.getConfig)()) !== null && _getConfig6 !== void 0 && (_getConfig6 = _getConfig6.postInteractionLog) !== null && _getConfig6 !== void 0 && _getConfig6.enabled) {
585
+ var _getConfig7;
586
+ var experimentalVC90;
587
+ var experimentalTTAI;
588
+ if ((_getConfig7 = (0, _config.getConfig)()) !== null && _getConfig7 !== void 0 && (_getConfig7 = _getConfig7.experimentalInteractionMetrics) !== null && _getConfig7 !== void 0 && _getConfig7.enabled) {
589
+ var _getExperimentalVCMet;
590
+ experimentalVC90 = (_getExperimentalVCMet = (0, _createExperimentalInteractionMetricsPayload.getExperimentalVCMetrics)(interaction)) === null || _getExperimentalVCMet === void 0 ? void 0 : _getExperimentalVCMet['metric:experimental:vc90'];
591
+ var start = interaction.start,
592
+ end = interaction.end;
593
+ experimentalTTAI = !interaction.abortReason ? Math.round(end - start) : undefined;
594
+ }
595
+ postInteractionLog.onInteractionComplete(_objectSpread(_objectSpread({}, interaction), {}, {
596
+ experimentalTTAI: experimentalTTAI,
597
+ experimentalVC90: experimentalVC90
598
+ }));
599
+ }
600
+ if ((_getConfig8 = (0, _config.getConfig)()) !== null && _getConfig8 !== void 0 && (_getConfig8 = _getConfig8.experimentalInteractionMetrics) !== null && _getConfig8 !== void 0 && _getConfig8.enabled) {
601
+ remove(interactionId);
602
+ }
603
+ activeSubmitted = false;
604
+ };
605
+ if (noMoreActiveHolds) {
606
+ if (!activeSubmitted) {
607
+ finishInteraction(interactionId, interaction, endTime);
608
+ activeSubmitted = true;
609
+ }
610
+ if (noMoreExpHolds) {
611
+ var _getConfig9;
612
+ if ((_getConfig9 = (0, _config.getConfig)()) !== null && _getConfig9 !== void 0 && (_getConfig9 = _getConfig9.experimentalInteractionMetrics) !== null && _getConfig9 !== void 0 && _getConfig9.enabled) {
613
+ (0, _createExperimentalInteractionMetricsPayload.onExperimentalInteractionComplete)(interactionId, interaction, endTime);
614
+ }
615
+ postInteraction();
562
616
  }
563
617
  }
564
618
  }
@@ -569,45 +623,58 @@ function callCancelCallbacks(interaction) {
569
623
  });
570
624
  }
571
625
  function abort(interactionId, abortReason) {
572
- var interaction = _constants.default.get(interactionId);
626
+ var interaction = _constants.interactions.get(interactionId);
573
627
  if (interaction != null) {
628
+ var _getConfig10;
574
629
  callCancelCallbacks(interaction);
575
630
  interaction.abortReason = abortReason;
576
631
  finishInteraction(interactionId, interaction);
632
+ if ((_getConfig10 = (0, _config.getConfig)()) !== null && _getConfig10 !== void 0 && (_getConfig10 = _getConfig10.experimentalInteractionMetrics) !== null && _getConfig10 !== void 0 && _getConfig10.enabled) {
633
+ (0, _createExperimentalInteractionMetricsPayload.onExperimentalInteractionComplete)(interactionId, interaction);
634
+ remove(interactionId);
635
+ }
577
636
  }
578
637
  }
579
638
  function abortByNewInteraction(interactionId, interactionName) {
580
- var interaction = _constants.default.get(interactionId);
639
+ var interaction = _constants.interactions.get(interactionId);
581
640
  if (interaction != null) {
641
+ var _getConfig11;
582
642
  callCancelCallbacks(interaction);
583
643
  interaction.abortReason = 'new_interaction';
584
644
  interaction.abortedByInteractionName = interactionName;
585
645
  finishInteraction(interactionId, interaction);
646
+ if ((_getConfig11 = (0, _config.getConfig)()) !== null && _getConfig11 !== void 0 && (_getConfig11 = _getConfig11.experimentalInteractionMetrics) !== null && _getConfig11 !== void 0 && _getConfig11.enabled) {
647
+ (0, _createExperimentalInteractionMetricsPayload.onExperimentalInteractionComplete)(interactionId, interaction);
648
+ remove(interactionId);
649
+ }
586
650
  }
587
651
  }
588
652
  function abortAll(abortReason, abortedByInteractionName) {
589
- _constants.default.forEach(function (interaction, interactionId) {
653
+ _constants.interactions.forEach(function (interaction, interactionId) {
654
+ var _getConfig12;
590
655
  var noMoreHolds = interaction.holdActive.size === 0;
591
656
  if (!noMoreHolds) {
592
657
  callCancelCallbacks(interaction);
593
- // eslint-disable-next-line no-param-reassign
594
658
  interaction.abortReason = abortReason;
595
659
  if (abortedByInteractionName != null) {
596
- // eslint-disable-next-line no-param-reassign
597
660
  interaction.abortedByInteractionName = abortedByInteractionName;
598
661
  }
599
662
  }
600
663
  finishInteraction(interactionId, interaction);
664
+ if ((_getConfig12 = (0, _config.getConfig)()) !== null && _getConfig12 !== void 0 && (_getConfig12 = _getConfig12.experimentalInteractionMetrics) !== null && _getConfig12 !== void 0 && _getConfig12.enabled) {
665
+ (0, _createExperimentalInteractionMetricsPayload.onExperimentalInteractionComplete)(interactionId, interaction);
666
+ remove(interactionId);
667
+ }
601
668
  });
602
669
  }
603
670
  function addOnCancelCallback(id, cancelCallback) {
604
- var interaction = _constants.default.get(id);
671
+ var interaction = _constants.interactions.get(id);
605
672
  interaction === null || interaction === void 0 || interaction.cancelCallbacks.push(cancelCallback);
606
673
  }
607
674
  function addNewInteraction(interactionId, ufoName, type, startTime, rate, labelStack, routeName) {
608
- var _getConfig5;
675
+ var _getConfig13;
609
676
  var trace = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : null;
610
- if ((_getConfig5 = (0, _config.getConfig)()) !== null && _getConfig5 !== void 0 && (_getConfig5 = _getConfig5.postInteractionLog) !== null && _getConfig5 !== void 0 && _getConfig5.enabled) {
677
+ if ((_getConfig13 = (0, _config.getConfig)()) !== null && _getConfig13 !== void 0 && (_getConfig13 = _getConfig13.postInteractionLog) !== null && _getConfig13 !== void 0 && _getConfig13.enabled) {
611
678
  postInteractionLog.reset();
612
679
  }
613
680
  var previousTime = startTime;
@@ -647,9 +714,11 @@ function addNewInteraction(interactionId, ufoName, type, startTime, rate, labelS
647
714
  requestInfo: [],
648
715
  reactProfilerTimings: [],
649
716
  holdInfo: [],
717
+ holdExpInfo: [],
650
718
  holdActive: new Map(),
719
+ holdExpActive: new Map(),
651
720
  // measure when we execute this code
652
- // from this we can measure the input delay -
721
+ // from this, we can measure the input delay -
653
722
  // how long the browser took to hand execution back to JS)
654
723
  measureStart: performance.now(),
655
724
  rate: rate,
@@ -674,7 +743,7 @@ function addNewInteraction(interactionId, ufoName, type, startTime, rate, labelS
674
743
  if (addFeatureFlagsToInteraction) {
675
744
  _featureFlagsAccessed.currentFeatureFlagsAccessed.clear();
676
745
  }
677
- _constants.default.set(interactionId, metrics);
746
+ _constants.interactions.set(interactionId, metrics);
678
747
  var segmentObserver = {
679
748
  onAdd: function onAdd(segment) {
680
749
  metrics.knownSegments.push(segment);
@@ -693,12 +762,18 @@ function addNewInteraction(interactionId, ufoName, type, startTime, rate, labelS
693
762
  addHoldByID(interactionId, [], ufoName, ufoName, true);
694
763
  }
695
764
  if (type === 'transition') {
765
+ var _getConfig14;
696
766
  (0, _vc.getVCObserver)().start({
697
767
  startTime: startTime
698
768
  });
699
769
  postInteractionLog.startVCObserver({
700
770
  startTime: startTime
701
771
  });
772
+ if ((_getConfig14 = (0, _config.getConfig)()) !== null && _getConfig14 !== void 0 && (_getConfig14 = _getConfig14.experimentalInteractionMetrics) !== null && _getConfig14 !== void 0 && _getConfig14.enabled) {
773
+ _createExperimentalInteractionMetricsPayload.experimentalVC.start({
774
+ startTime: startTime
775
+ });
776
+ }
702
777
  }
703
778
  }
704
779
  function addBrowserMetricEvent(event) {
@@ -714,7 +789,7 @@ function addBrowserMetricEvent(event) {
714
789
  }
715
790
  }
716
791
  function addApdexToAll(apdex) {
717
- _constants.default.forEach(function (interaction, key) {
792
+ _constants.interactions.forEach(function (interaction, key) {
718
793
  interaction.apdex.push(apdex);
719
794
  try {
720
795
  var _apdex$startTime;
@@ -733,7 +808,7 @@ function addApdexToAll(apdex) {
733
808
  });
734
809
  }
735
810
  function addApdex(interactionId, apdexInfo) {
736
- var interaction = _constants.default.get(interactionId);
811
+ var interaction = _constants.interactions.get(interactionId);
737
812
  if (interaction != null) {
738
813
  interaction.apdex.push(apdexInfo);
739
814
  try {
@@ -753,7 +828,7 @@ function addApdex(interactionId, apdexInfo) {
753
828
  }
754
829
  }
755
830
  function addRequestInfo(interactionId, labelStack, requestInfo) {
756
- var interaction = _constants.default.get(interactionId);
831
+ var interaction = _constants.interactions.get(interactionId);
757
832
  if (interaction != null) {
758
833
  interaction.requestInfo.push(_objectSpread({
759
834
  labelStack: labelStack
@@ -795,7 +870,7 @@ function removeSegment(labelStack) {
795
870
  }
796
871
  }
797
872
  function addRedirect(interactionId, fromUfoName, nextUfoName, nextRouteName, time) {
798
- var interaction = _constants.default.get(interactionId);
873
+ var interaction = _constants.interactions.get(interactionId);
799
874
  if (interaction != null) {
800
875
  interaction.ufoName = nextUfoName;
801
876
  interaction.routeName = nextRouteName;
@@ -113,22 +113,32 @@ var PostInteractionLog = exports.default = /*#__PURE__*/function () {
113
113
  }, {
114
114
  key: "sendPostInteractionLog",
115
115
  value: function sendPostInteractionLog() {
116
- var _this$vcObserver2;
116
+ var _this$vcObserver3, _getConfig2;
117
117
  if (!this.hasData() || !this.lastInteractionFinish || !this.sinkHandlerFn) {
118
+ var _getConfig;
118
119
  this.reset();
120
+ if ((_getConfig = (0, _config.getConfig)()) !== null && _getConfig !== void 0 && (_getConfig = _getConfig.experimentalInteractionMetrics) !== null && _getConfig !== void 0 && _getConfig.enabled) {
121
+ var _this$vcObserver2;
122
+ (_this$vcObserver2 = this.vcObserver) === null || _this$vcObserver2 === void 0 || _this$vcObserver2.stop();
123
+ }
119
124
  return;
120
125
  }
126
+ var postInteractionFinishVCResult = (_this$vcObserver3 = this.vcObserver) === null || _this$vcObserver3 === void 0 ? void 0 : _this$vcObserver3.getVCResult(_objectSpread({
127
+ start: this.lastInteractionFinish.start,
128
+ stop: performance.now(),
129
+ tti: -1,
130
+ // no need for TTI value here
131
+ prefix: 'ufo'
132
+ }, this.vcObserverSSRConfig));
133
+ if ((_getConfig2 = (0, _config.getConfig)()) !== null && _getConfig2 !== void 0 && (_getConfig2 = _getConfig2.experimentalInteractionMetrics) !== null && _getConfig2 !== void 0 && _getConfig2.enabled) {
134
+ var _this$vcObserver4;
135
+ (_this$vcObserver4 = this.vcObserver) === null || _this$vcObserver4 === void 0 || _this$vcObserver4.stop();
136
+ }
121
137
  this.sinkHandlerFn({
122
138
  lastInteractionFinish: this.lastInteractionFinish,
123
139
  reactProfilerTimings: this.reactProfilerTimings,
124
140
  // NOTE: invoking `getVCResult` at latest possible point in time here (not earlier) to get the most accurate result (from performance.now())
125
- postInteractionFinishVCResult: (_this$vcObserver2 = this.vcObserver) === null || _this$vcObserver2 === void 0 ? void 0 : _this$vcObserver2.getVCResult(_objectSpread({
126
- start: this.lastInteractionFinish.start,
127
- stop: performance.now(),
128
- tti: -1,
129
- // no need for TTI value here
130
- prefix: 'ufo'
131
- }, this.vcObserverSSRConfig)),
141
+ postInteractionFinishVCResult: postInteractionFinishVCResult,
132
142
  lastInteractionFinishVCResult: this.lastInteractionFinishVCResult
133
143
  });
134
144
  this.reset();
@@ -142,7 +152,7 @@ var PostInteractionLog = exports.default = /*#__PURE__*/function () {
142
152
  }, {
143
153
  key: "onInteractionComplete",
144
154
  value: function onInteractionComplete(_ref2) {
145
- var _getConfig,
155
+ var _getConfig3,
146
156
  _this = this;
147
157
  var ufoName = _ref2.ufoName,
148
158
  start = _ref2.start,
@@ -166,7 +176,7 @@ var PostInteractionLog = exports.default = /*#__PURE__*/function () {
166
176
  experimentalTTAI: experimentalTTAI,
167
177
  experimentalVC90: experimentalVC90
168
178
  };
169
- var timeout = ((_getConfig = (0, _config.getConfig)()) === null || _getConfig === void 0 ? void 0 : _getConfig.timeWindowForLateMutationsInMilliseconds) || POST_INTERACTION_LOG_SEND_DEFAULT_TIMEOUT;
179
+ var timeout = ((_getConfig3 = (0, _config.getConfig)()) === null || _getConfig3 === void 0 ? void 0 : _getConfig3.timeWindowForLateMutationsInMilliseconds) || POST_INTERACTION_LOG_SEND_DEFAULT_TIMEOUT;
170
180
  this.sinkTimeoutId = window.setTimeout(function () {
171
181
  _this.sendPostInteractionLog();
172
182
  }, timeout);
@@ -10,6 +10,7 @@ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/sli
10
10
  var _scheduler = require("scheduler");
11
11
  var _additionalPayload = require("../additional-payload");
12
12
  var _config = require("../config");
13
+ var _createExperimentalInteractionMetricsPayload = require("../create-experimental-interaction-metrics-payload");
13
14
  var _hiddenTiming = require("../hidden-timing");
14
15
  var _interactionMetrics = require("../interaction-metrics");
15
16
  var _vc = require("../vc");
@@ -26,6 +27,16 @@ function sinkInteraction(instance, payloadPackage) {
26
27
  });
27
28
  });
28
29
  }
30
+ function sinkExperimentalInteractionMetrics(instance, payloadPackage) {
31
+ (0, _createExperimentalInteractionMetricsPayload.sinkExperimentalHandler)(function (interactionId, interaction) {
32
+ (0, _scheduler.unstable_scheduleCallback)(_scheduler.unstable_IdlePriority, function () {
33
+ var payload = payloadPackage.createExperimentalMetricsPayload(interactionId, interaction);
34
+ if (payload) {
35
+ instance.sendOperationalEvent(payload);
36
+ }
37
+ });
38
+ });
39
+ }
29
40
  function sinkPostInteractionLog(instance, createPostInteractionLogPayload) {
30
41
  (0, _interactionMetrics.sinkPostInteractionLogHandler)(function (logOutput) {
31
42
  (0, _scheduler.unstable_scheduleCallback)(_scheduler.unstable_IdlePriority, function () {
@@ -43,6 +54,7 @@ var init = exports.init = function init(analyticsWebClientAsync, config) {
43
54
  }
44
55
  (0, _config.setUFOConfig)(config);
45
56
  if ((_config$vc = config.vc) !== null && _config$vc !== void 0 && _config$vc.enabled) {
57
+ var _config$experimentalI;
46
58
  var vcOptions = {
47
59
  heatmapSize: config.vc.heatmapSize,
48
60
  oldDomUpdates: config.vc.oldDomUpdates,
@@ -56,16 +68,19 @@ var init = exports.init = function init(analyticsWebClientAsync, config) {
56
68
  _interactionMetrics.postInteractionLog.startVCObserver({
57
69
  startTime: 0
58
70
  });
71
+ if (config !== null && config !== void 0 && (_config$experimentalI = config.experimentalInteractionMetrics) !== null && _config$experimentalI !== void 0 && _config$experimentalI.enabled) {
72
+ _createExperimentalInteractionMetricsPayload.experimentalVC.initialize(vcOptions).start({
73
+ startTime: 0
74
+ });
75
+ }
59
76
  }
60
77
  (0, _hiddenTiming.setupHiddenTimingCapture)();
61
78
  (0, _additionalPayload.startLighthouseObserver)();
62
79
  initialized = true;
63
- Promise.all([analyticsWebClientAsync, // eslint-disable-next-line import/dynamic-import-chunkname
64
- Promise.resolve().then(function () {
80
+ Promise.all([analyticsWebClientAsync, Promise.resolve().then(function () {
65
81
  return _interopRequireWildcard(require( /* webpackChunkName: "create-payloads" */'../create-payload'));
66
- }), // eslint-disable-next-line import/dynamic-import-chunkname
67
- Promise.resolve().then(function () {
68
- return _interopRequireWildcard(require( /* webpackChunkName: "create-post-intreaction-log-payload" */'../create-post-interaction-log-payload'));
82
+ }), Promise.resolve().then(function () {
83
+ return _interopRequireWildcard(require( /* webpackChunkName: "create-post-interaction-log-payload" */'../create-post-interaction-log-payload'));
69
84
  })]).then(function (_ref) {
70
85
  var _ref2 = (0, _slicedToArray2.default)(_ref, 3),
71
86
  awc = _ref2[0],
@@ -73,16 +88,22 @@ var init = exports.init = function init(analyticsWebClientAsync, config) {
73
88
  createPostInteractionLogPayloadPackage = _ref2[2];
74
89
  if (awc.getAnalyticsWebClientPromise) {
75
90
  awc.getAnalyticsWebClientPromise().then(function (client) {
76
- var _config$postInteracti;
91
+ var _config$experimentalI2, _config$postInteracti;
77
92
  var instance = client.getInstance();
78
93
  sinkInteraction(instance, payloadPackage);
94
+ if (config !== null && config !== void 0 && (_config$experimentalI2 = config.experimentalInteractionMetrics) !== null && _config$experimentalI2 !== void 0 && _config$experimentalI2.enabled) {
95
+ sinkExperimentalInteractionMetrics(instance, payloadPackage);
96
+ }
79
97
  if ((_config$postInteracti = config.postInteractionLog) !== null && _config$postInteracti !== void 0 && _config$postInteracti.enabled) {
80
98
  sinkPostInteractionLog(instance, createPostInteractionLogPayloadPackage.default);
81
99
  }
82
100
  });
83
101
  } else if (awc.sendOperationalEvent) {
84
- var _config$postInteracti2;
102
+ var _config$experimentalI3, _config$postInteracti2;
85
103
  sinkInteraction(awc, payloadPackage);
104
+ if (config !== null && config !== void 0 && (_config$experimentalI3 = config.experimentalInteractionMetrics) !== null && _config$experimentalI3 !== void 0 && _config$experimentalI3.enabled) {
105
+ sinkExperimentalInteractionMetrics(awc, payloadPackage);
106
+ }
86
107
  if ((_config$postInteracti2 = config.postInteractionLog) !== null && _config$postInteracti2 !== void 0 && _config$postInteracti2.enabled) {
87
108
  sinkPostInteractionLog(awc, createPostInteractionLogPayloadPackage.default);
88
109
  }
@@ -32,8 +32,7 @@ var useLayoutEffectSAFE = typeof window === 'undefined' ? _react.useEffect : _re
32
32
  * return (
33
33
  * <>
34
34
  * <Skeleton />
35
- * <UFOLoadHold name="card">
36
- * </UFOLoadHold>
35
+ * <UFOLoadHold name="card" />
37
36
  * )
38
37
  * }
39
38
  * ```
@@ -68,7 +67,10 @@ function UFOLoadHold(_ref) {
68
67
  // react-18: useId instead
69
68
  var context = (0, _react.useContext)(_interactionContext.default);
70
69
  useLayoutEffectSAFE(function () {
71
- if (hold && !experimental && context != null) {
70
+ if (hold && context != null) {
71
+ if (experimental && context.holdExperimental) {
72
+ return context.holdExperimental(name);
73
+ }
72
74
  return context.hold(name);
73
75
  }
74
76
  }, [hold, context, name]);
@@ -91,15 +91,14 @@ function UFOSegment(_ref) {
91
91
  }
92
92
  }
93
93
  }
94
- function _internalHold(labelStack, name
95
- // eslint-disable-next-line @typescript-eslint/no-invalid-void-type
96
- ) {
94
+ function _internalHold(labelStack, name) {
95
+ var experimental = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
97
96
  if (interactionId.current != null) {
98
97
  if (parentContext) {
99
- return parentContext._internalHold(labelStack, name);
98
+ return parentContext._internalHold(labelStack, name, experimental);
100
99
  } else {
101
100
  var capturedInteractionId = interactionId.current;
102
- var disposeHold = (0, _interactionMetrics.addHold)(interactionId.current, labelStack, name);
101
+ var disposeHold = (0, _interactionMetrics.addHold)(interactionId.current, labelStack, name, experimental);
103
102
  return function () {
104
103
  if (capturedInteractionId === interactionId.current) {
105
104
  disposeHold();
@@ -108,9 +107,7 @@ function UFOSegment(_ref) {
108
107
  }
109
108
  }
110
109
  }
111
- function _internalHoldByID(labelStack, id, name, remove
112
- // eslint-disable-next-line @typescript-eslint/no-invalid-void-type
113
- ) {
110
+ function _internalHoldByID(labelStack, id, name, remove) {
114
111
  if (interactionId.current != null) {
115
112
  if (parentContext) {
116
113
  parentContext._internalHoldByID(labelStack, name, id, remove);
@@ -135,6 +132,10 @@ function UFOSegment(_ref) {
135
132
  var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'unknown';
136
133
  return this._internalHold(this.labelStack, name);
137
134
  },
135
+ holdExperimental: function holdExperimental() {
136
+ var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'unknown';
137
+ return this._internalHold(this.labelStack, name, true);
138
+ },
138
139
  addHoldByID: function addHoldByID(labelStack, id) {
139
140
  var name = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'unknown';
140
141
  this._internalHoldByID(labelStack, id, name, false);