@atlaskit/react-ufo 2.4.6 → 2.4.7

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 (66) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/create-experimental-interaction-metrics-payload/package.json +15 -0
  3. package/dist/cjs/config/index.js +40 -18
  4. package/dist/cjs/create-experimental-interaction-metrics-payload/index.js +89 -0
  5. package/dist/cjs/create-payload/common/utils/index.js +85 -1
  6. package/dist/cjs/create-payload/index.js +37 -77
  7. package/dist/cjs/create-post-interaction-log-payload/index.js +1 -4
  8. package/dist/cjs/interaction-metrics/common/constants.js +7 -1
  9. package/dist/cjs/interaction-metrics/common/index.js +151 -0
  10. package/dist/cjs/interaction-metrics/index.js +139 -204
  11. package/dist/cjs/interaction-metrics/post-interaction-log.js +6 -2
  12. package/dist/cjs/interaction-metrics-init/index.js +27 -9
  13. package/dist/cjs/load-hold/UFOLoadHold.js +3 -4
  14. package/dist/cjs/segment/segment.js +7 -9
  15. package/dist/cjs/trace-pageload/index.js +2 -1
  16. package/dist/es2019/config/index.js +22 -0
  17. package/dist/es2019/create-experimental-interaction-metrics-payload/index.js +67 -0
  18. package/dist/es2019/create-payload/common/utils/index.js +86 -1
  19. package/dist/es2019/create-payload/index.js +28 -74
  20. package/dist/es2019/create-post-interaction-log-payload/index.js +1 -4
  21. package/dist/es2019/interaction-metrics/common/constants.js +6 -0
  22. package/dist/es2019/interaction-metrics/common/index.js +103 -0
  23. package/dist/es2019/interaction-metrics/index.js +92 -129
  24. package/dist/es2019/interaction-metrics/post-interaction-log.js +6 -2
  25. package/dist/es2019/interaction-metrics-init/index.js +21 -8
  26. package/dist/es2019/load-hold/UFOLoadHold.js +3 -4
  27. package/dist/es2019/segment/segment.js +6 -12
  28. package/dist/es2019/trace-pageload/index.js +1 -1
  29. package/dist/esm/config/index.js +39 -18
  30. package/dist/esm/create-experimental-interaction-metrics-payload/index.js +81 -0
  31. package/dist/esm/create-payload/common/utils/index.js +80 -1
  32. package/dist/esm/create-payload/index.js +33 -75
  33. package/dist/esm/create-post-interaction-log-payload/index.js +1 -4
  34. package/dist/esm/interaction-metrics/common/constants.js +6 -0
  35. package/dist/esm/interaction-metrics/common/index.js +132 -0
  36. package/dist/esm/interaction-metrics/index.js +87 -156
  37. package/dist/esm/interaction-metrics/post-interaction-log.js +6 -2
  38. package/dist/esm/interaction-metrics-init/index.js +24 -10
  39. package/dist/esm/load-hold/UFOLoadHold.js +3 -4
  40. package/dist/esm/segment/segment.js +7 -9
  41. package/dist/esm/trace-pageload/index.js +1 -1
  42. package/dist/types/common/common/types.d.ts +9 -5
  43. package/dist/types/config/index.d.ts +6 -0
  44. package/dist/types/create-experimental-interaction-metrics-payload/index.d.ts +31 -0
  45. package/dist/types/create-payload/common/utils/index.d.ts +12 -0
  46. package/dist/types/create-payload/index.d.ts +13 -5660
  47. package/dist/types/create-post-interaction-log-payload/index.d.ts +2 -0
  48. package/dist/types/interaction-metrics/common/constants.d.ts +31 -1
  49. package/dist/types/interaction-metrics/common/index.d.ts +16 -0
  50. package/dist/types/interaction-metrics/index.d.ts +4 -15
  51. package/dist/types/interaction-metrics/post-interaction-log.d.ts +1 -1
  52. package/dist/types/load-hold/UFOLoadHold.d.ts +1 -2
  53. package/dist/types/trace-pageload/index.d.ts +1 -0
  54. package/dist/types-ts4.5/common/common/types.d.ts +9 -5
  55. package/dist/types-ts4.5/config/index.d.ts +6 -0
  56. package/dist/types-ts4.5/create-experimental-interaction-metrics-payload/index.d.ts +31 -0
  57. package/dist/types-ts4.5/create-payload/common/utils/index.d.ts +12 -0
  58. package/dist/types-ts4.5/create-payload/index.d.ts +13 -5660
  59. package/dist/types-ts4.5/create-post-interaction-log-payload/index.d.ts +2 -0
  60. package/dist/types-ts4.5/interaction-metrics/common/constants.d.ts +31 -1
  61. package/dist/types-ts4.5/interaction-metrics/common/index.d.ts +16 -0
  62. package/dist/types-ts4.5/interaction-metrics/index.d.ts +4 -15
  63. package/dist/types-ts4.5/interaction-metrics/post-interaction-log.d.ts +1 -1
  64. package/dist/types-ts4.5/load-hold/UFOLoadHold.d.ts +1 -2
  65. package/dist/types-ts4.5/trace-pageload/index.d.ts +1 -0
  66. package/package.json +2 -1
@@ -0,0 +1,132 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
+ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
3
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
4
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
5
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
6
+ import { getConfig } from '../../config';
7
+ import { interactionQueue, segmentCache, segmentObservers } from './constants';
8
+ export function isPerformanceTracingEnabled() {
9
+ var _getConfig;
10
+ return ((_getConfig = getConfig()) === null || _getConfig === void 0 ? void 0 : _getConfig.enableAdditionalPerformanceMarks) || window.__REACT_UFO_ENABLE_PERF_TRACING || process.env.NODE_ENV !== 'production';
11
+ }
12
+ export function labelStackToString(labelStack, name) {
13
+ var _stack$map;
14
+ var stack = _toConsumableArray(labelStack !== null && labelStack !== void 0 ? labelStack : []);
15
+ if (name) {
16
+ stack.push({
17
+ name: name
18
+ });
19
+ }
20
+ return (_stack$map = stack.map(function (l) {
21
+ return l.name;
22
+ })) === null || _stack$map === void 0 ? void 0 : _stack$map.join('/');
23
+ }
24
+ export function labelStackToIdString(labelStack) {
25
+ var _labelStack$map;
26
+ return labelStack === null || labelStack === void 0 || (_labelStack$map = labelStack.map(function (l) {
27
+ return 'segmentId' in l ? "".concat(l.name, ":").concat(l.segmentId) : "".concat(l.name);
28
+ })) === null || _labelStack$map === void 0 ? void 0 : _labelStack$map.join('/');
29
+ }
30
+ export function addSegmentObserver(observer) {
31
+ segmentObservers.push(observer);
32
+ var _iterator = _createForOfIteratorHelper(segmentCache.values()),
33
+ _step;
34
+ try {
35
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
36
+ var segmentInfo = _step.value;
37
+ observer.onAdd(segmentInfo);
38
+ }
39
+ } catch (err) {
40
+ _iterator.e(err);
41
+ } finally {
42
+ _iterator.f();
43
+ }
44
+ }
45
+ export function removeSegmentObserver(observer) {
46
+ var index = segmentObservers.findIndex(function (obs) {
47
+ return obs === observer;
48
+ });
49
+ if (index !== -1) {
50
+ segmentObservers.splice(index, 1);
51
+ }
52
+ }
53
+ export function addHoldCriterion(id, labelStack, name, startTime) {
54
+ var _window$__CRITERION__;
55
+ if (!((_window$__CRITERION__ = window.__CRITERION__) !== null && _window$__CRITERION__ !== void 0 && _window$__CRITERION__.addUFOHold)) {
56
+ return;
57
+ }
58
+ window.__CRITERION__.addUFOHold(id, labelStackToString(labelStack), name, startTime);
59
+ }
60
+ export function removeHoldCriterion(id) {
61
+ var _window$__CRITERION__2;
62
+ if (!((_window$__CRITERION__2 = window.__CRITERION__) !== null && _window$__CRITERION__2 !== void 0 && _window$__CRITERION__2.removeUFOHold)) {
63
+ return;
64
+ }
65
+ window.__CRITERION__.removeUFOHold(id);
66
+ }
67
+ export var pushToQueue = function pushToQueue(id, data) {
68
+ interactionQueue.push({
69
+ id: id,
70
+ data: data
71
+ });
72
+ };
73
+ export function callCleanUpCallbacks(interaction) {
74
+ interaction.cleanupCallbacks.reverse().forEach(function (cleanUpCallback) {
75
+ cleanUpCallback();
76
+ });
77
+ }
78
+ export function reactProfilerTimingMap(data) {
79
+ var profilerTimingMap = new Map();
80
+ data.reactProfilerTimings.forEach(function (profilerTiming) {
81
+ var labelStackId = labelStackToIdString(profilerTiming.labelStack);
82
+ if (labelStackId) {
83
+ var _profilerTimingMap$ge, _timing$start, _timing$end;
84
+ var timing = (_profilerTimingMap$ge = profilerTimingMap.get(labelStackId)) !== null && _profilerTimingMap$ge !== void 0 ? _profilerTimingMap$ge : {
85
+ labelStack: profilerTiming.labelStack
86
+ };
87
+ timing.start = profilerTiming.startTime < ((_timing$start = timing.start) !== null && _timing$start !== void 0 ? _timing$start : Number.MAX_SAFE_INTEGER) ? profilerTiming.startTime : timing.start;
88
+ timing.end = profilerTiming.commitTime > ((_timing$end = timing.end) !== null && _timing$end !== void 0 ? _timing$end : Number.MIN_SAFE_INTEGER) ? profilerTiming.commitTime : timing.end;
89
+ profilerTimingMap.set(labelStackId, timing);
90
+ }
91
+ });
92
+ try {
93
+ // for Firefox 102 and older
94
+ var _iterator2 = _createForOfIteratorHelper(profilerTimingMap.entries()),
95
+ _step2;
96
+ try {
97
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
98
+ var _step2$value = _slicedToArray(_step2.value, 2),
99
+ _step2$value$ = _step2$value[1],
100
+ labelStack = _step2$value$.labelStack,
101
+ start = _step2$value$.start,
102
+ end = _step2$value$.end;
103
+ performance.measure("\uD83D\uDEF8 ".concat(labelStackToString(labelStack), " [segment_ttai]"), {
104
+ start: start,
105
+ end: end
106
+ });
107
+ }
108
+ } catch (err) {
109
+ _iterator2.e(err);
110
+ } finally {
111
+ _iterator2.f();
112
+ }
113
+ } catch (e) {
114
+ // do nothing
115
+ }
116
+ }
117
+ export function callCancelCallbacks(interaction) {
118
+ interaction.cancelCallbacks.reverse().forEach(function (cancelCallback) {
119
+ cancelCallback();
120
+ });
121
+ }
122
+ export function isSegmentLabel(obj) {
123
+ return obj && typeof obj.name === 'string' && typeof obj.segmentId === 'string';
124
+ }
125
+ export function getSegmentCacheKey(labelStack) {
126
+ return labelStack.map(function (l) {
127
+ if (isSegmentLabel(l)) {
128
+ return "".concat(l.name, "_").concat(l.segmentId);
129
+ }
130
+ return l.name;
131
+ }).join('|');
132
+ }
@@ -1,30 +1,25 @@
1
1
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
2
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
- import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
4
3
  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; }
5
4
  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) { _defineProperty(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; }
6
- function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
7
- function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
8
- function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
9
5
  import { v4 as createUUID } from 'uuid';
10
6
  import coinflip from '../coinflip';
11
7
  import { getAwaitBM3TTIList, getCapabilityRate, getConfig } from '../config';
8
+ import { ExperimentalInteractionMetrics } from '../create-experimental-interaction-metrics-payload';
9
+ import { getExperimentalVCMetrics, getTTAI } from '../create-payload/common/utils';
12
10
  import { clearActiveTrace } from '../experience-trace-id-context';
13
11
  import { allFeatureFlagsAccessed, currentFeatureFlagsAccessed } from '../feature-flags-accessed';
14
12
  import { getInteractionId } from '../interaction-id-context';
15
13
  import { getVCObserver } from '../vc';
16
- import interactions from './common/constants';
14
+ import { addHoldCriterion, addSegmentObserver, callCancelCallbacks, callCleanUpCallbacks, getSegmentCacheKey, isPerformanceTracingEnabled, labelStackToString, pushToQueue, reactProfilerTimingMap, removeHoldCriterion, removeSegmentObserver } from './common';
15
+ import interactions, { CLEANUP_TIMEOUT, CLEANUP_TIMEOUT_AFTER_APDEX, interactionQueue, moduleLoadingRequests, segmentCache, segmentObservers } from './common/constants';
17
16
  import PostInteractionLog from './post-interaction-log';
18
17
  var PreviousInteractionLog = {
19
18
  name: undefined,
20
19
  isAborted: undefined
21
20
  };
22
21
  export var postInteractionLog = new PostInteractionLog();
23
- var interactionQueue = [];
24
- var segmentCache = new Map();
25
- var CLEANUP_TIMEOUT = 60 * 1000;
26
- var CLEANUP_TIMEOUT_AFTER_APDEX = 15 * 1000;
27
- var segmentObservers = [];
22
+ export var experimentalInteractionLog = new ExperimentalInteractionMetrics();
28
23
  export function getActiveInteraction() {
29
24
  var interactionId = getInteractionId();
30
25
  if (!interactionId.current) {
@@ -32,51 +27,6 @@ export function getActiveInteraction() {
32
27
  }
33
28
  return interactions.get(interactionId.current);
34
29
  }
35
- function isPerformanceTracingEnabled() {
36
- var _getConfig;
37
- return ((_getConfig = getConfig()) === null || _getConfig === void 0 ? void 0 : _getConfig.enableAdditionalPerformanceMarks) || window.__REACT_UFO_ENABLE_PERF_TRACING || process.env.NODE_ENV !== 'production';
38
- }
39
- function labelStackToString(labelStack, name) {
40
- var _stack$map;
41
- var stack = _toConsumableArray(labelStack !== null && labelStack !== void 0 ? labelStack : []);
42
- if (name) {
43
- stack.push({
44
- name: name
45
- });
46
- }
47
- return (_stack$map = stack.map(function (l) {
48
- return l.name;
49
- })) === null || _stack$map === void 0 ? void 0 : _stack$map.join('/');
50
- }
51
- function labelStackToIdString(labelStack) {
52
- var _labelStack$map;
53
- return labelStack === null || labelStack === void 0 || (_labelStack$map = labelStack.map(function (l) {
54
- return 'segmentId' in l ? "".concat(l.name, ":").concat(l.segmentId) : "".concat(l.name);
55
- })) === null || _labelStack$map === void 0 ? void 0 : _labelStack$map.join('/');
56
- }
57
- function addSegmentObserver(observer) {
58
- segmentObservers.push(observer);
59
- var _iterator = _createForOfIteratorHelper(segmentCache.values()),
60
- _step;
61
- try {
62
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
63
- var segmentInfo = _step.value;
64
- observer.onAdd(segmentInfo);
65
- }
66
- } catch (err) {
67
- _iterator.e(err);
68
- } finally {
69
- _iterator.f();
70
- }
71
- }
72
- function removeSegmentObserver(observer) {
73
- var index = segmentObservers.findIndex(function (obs) {
74
- return obs === observer;
75
- });
76
- if (index !== -1) {
77
- segmentObservers.splice(index, 1);
78
- }
79
- }
80
30
  export function remove(interactionId) {
81
31
  interactions.delete(interactionId);
82
32
  }
@@ -225,7 +175,6 @@ export function addPreload(moduleId, timestamp) {
225
175
  export function addLoad(identifier, start, end) {
226
176
  addSpanToAll('bundle_load', identifier, null, start, end - start);
227
177
  }
228
- var moduleLoadingRequests = {};
229
178
  export function extractModuleName(input) {
230
179
  var result = input !== null && input !== void 0 ? input : '';
231
180
  result = result.replace(/^\.\/src\/packages\//, '');
@@ -233,30 +182,27 @@ export function extractModuleName(input) {
233
182
  result = result.replace(/(\/src)?\/(index|main)\.(tsx|ts|js|jsx)$/, '');
234
183
  return result;
235
184
  }
236
- function addHoldCriterion(id, labelStack, name, startTime) {
237
- var _window$__CRITERION__;
238
- if (!((_window$__CRITERION__ = window.__CRITERION__) !== null && _window$__CRITERION__ !== void 0 && _window$__CRITERION__.addUFOHold)) {
239
- return;
240
- }
241
- window.__CRITERION__.addUFOHold(id, labelStackToString(labelStack), name, startTime);
242
- }
243
- function removeHoldCriterion(id) {
244
- var _window$__CRITERION__2;
245
- if (!((_window$__CRITERION__2 = window.__CRITERION__) !== null && _window$__CRITERION__2 !== void 0 && _window$__CRITERION__2.removeUFOHold)) {
246
- return;
247
- }
248
- window.__CRITERION__.removeUFOHold(id);
249
- }
250
- export function addHold(interactionId, labelStack, name) {
185
+ export function addHold(interactionId, labelStack, name, experimental) {
251
186
  var interaction = interactions.get(interactionId);
252
187
  var id = createUUID();
253
188
  if (interaction != null) {
254
- var start = performance.now();
255
- interaction.holdActive.set(id, {
189
+ var _getConfig;
190
+ var holdActive = {
256
191
  labelStack: labelStack,
257
192
  name: name,
258
- start: start
259
- });
193
+ start: 0
194
+ };
195
+ var start = performance.now();
196
+ if ((_getConfig = getConfig()) !== null && _getConfig !== void 0 && (_getConfig = _getConfig.experimentalInteractionMetrics) !== null && _getConfig !== void 0 && _getConfig.enabled && experimental) {
197
+ interaction.holdExpActive.set(id, _objectSpread(_objectSpread({}, holdActive), {}, {
198
+ start: start
199
+ }));
200
+ }
201
+ if (!experimental) {
202
+ interaction.holdActive.set(id, _objectSpread(_objectSpread({}, holdActive), {}, {
203
+ start: start
204
+ }));
205
+ }
260
206
  addHoldCriterion(id, labelStack, name, start);
261
207
  return function () {
262
208
  var end = performance.now();
@@ -274,11 +220,20 @@ export function addHold(interactionId, labelStack, name) {
274
220
  removeHoldCriterion(id);
275
221
  var currentInteraction = interactions.get(interactionId);
276
222
  var currentHold = interaction.holdActive.get(id);
277
- if (currentInteraction != null && currentHold != null) {
278
- currentInteraction.holdInfo.push(_objectSpread(_objectSpread({}, currentHold), {}, {
279
- end: end
280
- }));
281
- interaction.holdActive.delete(id);
223
+ var expHold = interaction.holdExpActive.get(id);
224
+ if (currentInteraction != null) {
225
+ if (currentHold != null) {
226
+ currentInteraction.holdInfo.push(_objectSpread(_objectSpread({}, currentHold), {}, {
227
+ end: end
228
+ }));
229
+ interaction.holdActive.delete(id);
230
+ }
231
+ if (expHold != null) {
232
+ currentInteraction.holdExpInfo.push(_objectSpread(_objectSpread({}, expHold), {}, {
233
+ end: end
234
+ }));
235
+ interaction.holdExpActive.delete(id);
236
+ }
282
237
  }
283
238
  };
284
239
  }
@@ -406,22 +361,10 @@ export var addProfilerTimings = function addProfilerTimings(interactionId, label
406
361
  postInteractionLog.addProfilerTimings(labelStack, type, actualDuration, baseDuration, startTime, commitTime);
407
362
  }
408
363
  };
409
- var pushToQueue = function pushToQueue(id, data) {
410
- interactionQueue.push({
411
- id: id,
412
- data: data
413
- });
414
- };
415
364
  var handleInteraction = pushToQueue;
416
- function callCleanUpCallbacks(interaction) {
417
- interaction.cleanupCallbacks.reverse().forEach(function (cleanUpCallback) {
418
- cleanUpCallback();
419
- });
420
- }
421
365
  var finishInteraction = function finishInteraction(id, data) {
422
366
  var _getConfig3;
423
367
  var endTime = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : performance.now();
424
- // eslint-disable-next-line no-param-reassign
425
368
  data.end = endTime;
426
369
  try {
427
370
  // for Firefox 102 and older
@@ -433,7 +376,6 @@ var finishInteraction = function finishInteraction(id, data) {
433
376
  // do nothing
434
377
  }
435
378
  if (data.featureFlags) {
436
- // eslint-disable-next-line no-param-reassign
437
379
  data.featureFlags.during = Object.fromEntries(currentFeatureFlagsAccessed);
438
380
  }
439
381
  clearActiveTrace();
@@ -441,50 +383,13 @@ var finishInteraction = function finishInteraction(id, data) {
441
383
  if ((_getConfig3 = getConfig()) !== null && _getConfig3 !== void 0 && (_getConfig3 = _getConfig3.vc) !== null && _getConfig3 !== void 0 && _getConfig3.stopVCAtInteractionFinish) {
442
384
  data.vc = getVCObserver().getVCRawData();
443
385
  }
444
- remove(id);
445
386
  PreviousInteractionLog.name = data.ufoName || 'unknown';
446
387
  PreviousInteractionLog.isAborted = data.abortReason != null;
447
388
  if (data.ufoName) {
448
389
  handleInteraction(id, data);
449
390
  }
450
391
  if (isPerformanceTracingEnabled()) {
451
- var profilerTimingMap = new Map();
452
- data.reactProfilerTimings.forEach(function (profilerTiming) {
453
- var labelStackId = labelStackToIdString(profilerTiming.labelStack);
454
- if (labelStackId) {
455
- var _profilerTimingMap$ge, _timing$start, _timing$end;
456
- var timing = (_profilerTimingMap$ge = profilerTimingMap.get(labelStackId)) !== null && _profilerTimingMap$ge !== void 0 ? _profilerTimingMap$ge : {
457
- labelStack: profilerTiming.labelStack
458
- };
459
- timing.start = profilerTiming.startTime < ((_timing$start = timing.start) !== null && _timing$start !== void 0 ? _timing$start : Number.MAX_SAFE_INTEGER) ? profilerTiming.startTime : timing.start;
460
- timing.end = profilerTiming.commitTime > ((_timing$end = timing.end) !== null && _timing$end !== void 0 ? _timing$end : Number.MIN_SAFE_INTEGER) ? profilerTiming.commitTime : timing.end;
461
- profilerTimingMap.set(labelStackId, timing);
462
- }
463
- });
464
- try {
465
- // for Firefox 102 and older
466
- var _iterator2 = _createForOfIteratorHelper(profilerTimingMap.entries()),
467
- _step2;
468
- try {
469
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
470
- var _step2$value = _slicedToArray(_step2.value, 2),
471
- _step2$value$ = _step2$value[1],
472
- labelStack = _step2$value$.labelStack,
473
- start = _step2$value$.start,
474
- end = _step2$value$.end;
475
- performance.measure("\uD83D\uDEF8 ".concat(labelStackToString(labelStack), " [segment_ttai]"), {
476
- start: start,
477
- end: end
478
- });
479
- }
480
- } catch (err) {
481
- _iterator2.e(err);
482
- } finally {
483
- _iterator2.f();
484
- }
485
- } catch (e) {
486
- // do nothing
487
- }
392
+ reactProfilerTimingMap(data);
488
393
  }
489
394
  try {
490
395
  // dispatch a global window event to notify the measure is completed
@@ -504,57 +409,92 @@ export var sinkInteractionHandler = function sinkInteractionHandler(sinkFn) {
504
409
  interactionQueue.length = 0;
505
410
  }
506
411
  };
412
+ export var sinkExperimentalHandler = function sinkExperimentalHandler(sinkFn) {
413
+ experimentalInteractionLog.sinkHandler(sinkFn);
414
+ };
507
415
  export var sinkPostInteractionLogHandler = function sinkPostInteractionLogHandler(sinkFn) {
508
416
  postInteractionLog.sinkHandler(sinkFn);
509
417
  };
418
+
419
+ // a flag to prevent mutliple submittions
420
+ var activeSubmitted = false;
510
421
  export function tryComplete(interactionId, endTime) {
511
422
  var interaction = interactions.get(interactionId);
512
423
  if (interaction != null) {
513
- var noMoreHolds = interaction.holdActive.size === 0;
514
- if (noMoreHolds) {
424
+ var noMoreActiveHolds = interaction.holdActive.size === 0;
425
+ var noMoreExpHolds = interaction.holdExpActive.size === 0;
426
+ var postInteraction = function postInteraction() {
515
427
  var _getConfig4;
516
- finishInteraction(interactionId, interaction, endTime);
517
428
  if ((_getConfig4 = getConfig()) !== null && _getConfig4 !== void 0 && (_getConfig4 = _getConfig4.postInteractionLog) !== null && _getConfig4 !== void 0 && _getConfig4.enabled) {
518
- postInteractionLog.onInteractionComplete(interaction);
429
+ var _getExperimentalVCMet;
430
+ var experimentalVC90 = (_getExperimentalVCMet = getExperimentalVCMetrics(interaction)) === null || _getExperimentalVCMet === void 0 ? void 0 : _getExperimentalVCMet['metric:experimental:vc90'];
431
+ var experimentalTTAI = getTTAI(interaction);
432
+ postInteractionLog.onInteractionComplete(_objectSpread(_objectSpread({}, interaction), {}, {
433
+ experimentalTTAI: experimentalTTAI,
434
+ experimentalVC90: experimentalVC90
435
+ }));
436
+ }
437
+ remove(interactionId);
438
+ activeSubmitted = false;
439
+ };
440
+ if (noMoreActiveHolds) {
441
+ if (!activeSubmitted) {
442
+ finishInteraction(interactionId, interaction, endTime);
443
+ activeSubmitted = true;
444
+ }
445
+ if (noMoreExpHolds) {
446
+ var _getConfig5;
447
+ if ((_getConfig5 = getConfig()) !== null && _getConfig5 !== void 0 && (_getConfig5 = _getConfig5.experimentalInteractionMetrics) !== null && _getConfig5 !== void 0 && _getConfig5.enabled) {
448
+ experimentalInteractionLog.onInteractionComplete(interactionId, interaction, endTime);
449
+ }
450
+ postInteraction();
519
451
  }
520
452
  }
521
453
  }
522
454
  }
523
- function callCancelCallbacks(interaction) {
524
- interaction.cancelCallbacks.reverse().forEach(function (cancelCallback) {
525
- cancelCallback();
526
- });
527
- }
528
455
  export function abort(interactionId, abortReason) {
529
456
  var interaction = interactions.get(interactionId);
530
457
  if (interaction != null) {
458
+ var _getConfig6;
531
459
  callCancelCallbacks(interaction);
532
460
  interaction.abortReason = abortReason;
533
461
  finishInteraction(interactionId, interaction);
462
+ if ((_getConfig6 = getConfig()) !== null && _getConfig6 !== void 0 && (_getConfig6 = _getConfig6.experimentalInteractionMetrics) !== null && _getConfig6 !== void 0 && _getConfig6.enabled) {
463
+ experimentalInteractionLog.onInteractionComplete(interactionId, interaction);
464
+ }
465
+ remove(interactionId);
534
466
  }
535
467
  }
536
468
  export function abortByNewInteraction(interactionId, interactionName) {
537
469
  var interaction = interactions.get(interactionId);
538
470
  if (interaction != null) {
471
+ var _getConfig7;
539
472
  callCancelCallbacks(interaction);
540
473
  interaction.abortReason = 'new_interaction';
541
474
  interaction.abortedByInteractionName = interactionName;
542
475
  finishInteraction(interactionId, interaction);
476
+ if ((_getConfig7 = getConfig()) !== null && _getConfig7 !== void 0 && (_getConfig7 = _getConfig7.experimentalInteractionMetrics) !== null && _getConfig7 !== void 0 && _getConfig7.enabled) {
477
+ experimentalInteractionLog.onInteractionComplete(interactionId, interaction);
478
+ }
479
+ remove(interactionId);
543
480
  }
544
481
  }
545
482
  export function abortAll(abortReason, abortedByInteractionName) {
546
483
  interactions.forEach(function (interaction, interactionId) {
484
+ var _getConfig8;
547
485
  var noMoreHolds = interaction.holdActive.size === 0;
548
486
  if (!noMoreHolds) {
549
487
  callCancelCallbacks(interaction);
550
- // eslint-disable-next-line no-param-reassign
551
488
  interaction.abortReason = abortReason;
552
489
  if (abortedByInteractionName != null) {
553
- // eslint-disable-next-line no-param-reassign
554
490
  interaction.abortedByInteractionName = abortedByInteractionName;
555
491
  }
556
492
  }
557
493
  finishInteraction(interactionId, interaction);
494
+ if ((_getConfig8 = getConfig()) !== null && _getConfig8 !== void 0 && (_getConfig8 = _getConfig8.experimentalInteractionMetrics) !== null && _getConfig8 !== void 0 && _getConfig8.enabled) {
495
+ experimentalInteractionLog.onInteractionComplete(interactionId, interaction);
496
+ }
497
+ remove(interactionId);
558
498
  });
559
499
  }
560
500
  export function addOnCancelCallback(id, cancelCallback) {
@@ -562,9 +502,9 @@ export function addOnCancelCallback(id, cancelCallback) {
562
502
  interaction === null || interaction === void 0 || interaction.cancelCallbacks.push(cancelCallback);
563
503
  }
564
504
  export function addNewInteraction(interactionId, ufoName, type, startTime, rate, labelStack, routeName) {
565
- var _getConfig5;
505
+ var _getConfig9;
566
506
  var trace = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : null;
567
- if ((_getConfig5 = getConfig()) !== null && _getConfig5 !== void 0 && (_getConfig5 = _getConfig5.postInteractionLog) !== null && _getConfig5 !== void 0 && _getConfig5.enabled) {
507
+ if ((_getConfig9 = getConfig()) !== null && _getConfig9 !== void 0 && (_getConfig9 = _getConfig9.postInteractionLog) !== null && _getConfig9 !== void 0 && _getConfig9.enabled) {
568
508
  postInteractionLog.reset();
569
509
  }
570
510
  var previousTime = startTime;
@@ -604,9 +544,11 @@ export function addNewInteraction(interactionId, ufoName, type, startTime, rate,
604
544
  requestInfo: [],
605
545
  reactProfilerTimings: [],
606
546
  holdInfo: [],
547
+ holdExpInfo: [],
607
548
  holdActive: new Map(),
549
+ holdExpActive: new Map(),
608
550
  // measure when we execute this code
609
- // from this we can measure the input delay -
551
+ // from this, we can measure the input delay -
610
552
  // how long the browser took to hand execution back to JS)
611
553
  measureStart: performance.now(),
612
554
  rate: rate,
@@ -717,17 +659,6 @@ export function addRequestInfo(interactionId, labelStack, requestInfo) {
717
659
  }, requestInfo));
718
660
  }
719
661
  }
720
- function isSegmentLabel(obj) {
721
- return obj && typeof obj.name === 'string' && typeof obj.segmentId === 'string';
722
- }
723
- function getSegmentCacheKey(labelStack) {
724
- return labelStack.map(function (l) {
725
- if (isSegmentLabel(l)) {
726
- return "".concat(l.name, "_").concat(l.segmentId);
727
- }
728
- return l.name;
729
- }).join('|');
730
- }
731
662
  export function addSegment(labelStack) {
732
663
  var key = getSegmentCacheKey(labelStack);
733
664
  var existingSegment = segmentCache.get(key);
@@ -144,7 +144,9 @@ var PostInteractionLog = /*#__PURE__*/function () {
144
144
  abortReason = _ref2.abortReason,
145
145
  abortedByInteractionName = _ref2.abortedByInteractionName,
146
146
  routeName = _ref2.routeName,
147
- type = _ref2.type;
147
+ type = _ref2.type,
148
+ experimentalTTAI = _ref2.experimentalTTAI,
149
+ experimentalVC90 = _ref2.experimentalVC90;
148
150
  this.lastInteractionFinish = {
149
151
  ufoName: ufoName,
150
152
  start: start,
@@ -153,7 +155,9 @@ var PostInteractionLog = /*#__PURE__*/function () {
153
155
  abortReason: abortReason,
154
156
  abortedByInteractionName: abortedByInteractionName,
155
157
  routeName: routeName,
156
- type: type
158
+ type: type,
159
+ experimentalTTAI: experimentalTTAI,
160
+ experimentalVC90: experimentalVC90
157
161
  };
158
162
  var timeout = ((_getConfig = getConfig()) === null || _getConfig === void 0 ? void 0 : _getConfig.timeWindowForLateMutationsInMilliseconds) || POST_INTERACTION_LOG_SEND_DEFAULT_TIMEOUT;
159
163
  this.sinkTimeoutId = window.setTimeout(function () {
@@ -3,7 +3,7 @@ import { unstable_IdlePriority as idlePriority, unstable_scheduleCallback as sch
3
3
  import { startLighthouseObserver } from '../additional-payload';
4
4
  import { setUFOConfig } from '../config';
5
5
  import { setupHiddenTimingCapture } from '../hidden-timing';
6
- import { postInteractionLog, sinkInteractionHandler, sinkPostInteractionLogHandler } from '../interaction-metrics';
6
+ import { experimentalInteractionLog, postInteractionLog, sinkExperimentalHandler, sinkInteractionHandler, sinkPostInteractionLogHandler } from '../interaction-metrics';
7
7
  import { getVCObserver } from '../vc';
8
8
  var initialized = false;
9
9
  function sinkInteraction(instance, payloadPackage) {
@@ -16,6 +16,14 @@ function sinkInteraction(instance, payloadPackage) {
16
16
  });
17
17
  });
18
18
  }
19
+ function sinkExperimentalInteractionMetrics(instance, payloadPackage) {
20
+ sinkExperimentalHandler(function (interactionId, interaction) {
21
+ scheduleCallback(idlePriority, function () {
22
+ var payload = payloadPackage.createExperimentalInteractionMetricsPayload(interactionId, interaction);
23
+ instance.sendOperationalEvent(payload);
24
+ });
25
+ });
26
+ }
19
27
  function sinkPostInteractionLog(instance, createPostInteractionLogPayload) {
20
28
  sinkPostInteractionLogHandler(function (logOutput) {
21
29
  scheduleCallback(idlePriority, function () {
@@ -46,31 +54,37 @@ export var init = function init(analyticsWebClientAsync, config) {
46
54
  postInteractionLog.startVCObserver({
47
55
  startTime: 0
48
56
  });
57
+ experimentalInteractionLog.initializeVCObserver(vcOptions).startVCObserver({
58
+ startTime: 0
59
+ });
49
60
  }
50
61
  setupHiddenTimingCapture();
51
62
  startLighthouseObserver();
52
63
  initialized = true;
53
- Promise.all([analyticsWebClientAsync,
54
- // eslint-disable-next-line import/dynamic-import-chunkname
55
- import( /* webpackChunkName: "create-payloads" */'../create-payload'),
56
- // eslint-disable-next-line import/dynamic-import-chunkname
57
- import( /* webpackChunkName: "create-post-intreaction-log-payload" */'../create-post-interaction-log-payload')]).then(function (_ref) {
58
- var _ref2 = _slicedToArray(_ref, 3),
64
+ Promise.all([analyticsWebClientAsync, import( /* webpackChunkName: "create-payloads" */'../create-payload'), import( /* webpackChunkName: "create-experimental-interaction-metrics-payload" */'../create-experimental-interaction-metrics-payload'), import( /* webpackChunkName: "create-post-interaction-log-payload" */'../create-post-interaction-log-payload')]).then(function (_ref) {
65
+ var _ref2 = _slicedToArray(_ref, 4),
59
66
  awc = _ref2[0],
60
67
  payloadPackage = _ref2[1],
61
- createPostInteractionLogPayloadPackage = _ref2[2];
68
+ createExperimentalInteractionMetricsPayload = _ref2[2],
69
+ createPostInteractionLogPayloadPackage = _ref2[3];
62
70
  if (awc.getAnalyticsWebClientPromise) {
63
71
  awc.getAnalyticsWebClientPromise().then(function (client) {
64
- var _config$postInteracti;
72
+ var _config$experimentalI, _config$postInteracti;
65
73
  var instance = client.getInstance();
66
74
  sinkInteraction(instance, payloadPackage);
75
+ if (config !== null && config !== void 0 && (_config$experimentalI = config.experimentalInteractionMetrics) !== null && _config$experimentalI !== void 0 && _config$experimentalI.enabled) {
76
+ sinkExperimentalInteractionMetrics(instance, createExperimentalInteractionMetricsPayload);
77
+ }
67
78
  if ((_config$postInteracti = config.postInteractionLog) !== null && _config$postInteracti !== void 0 && _config$postInteracti.enabled) {
68
79
  sinkPostInteractionLog(instance, createPostInteractionLogPayloadPackage.default);
69
80
  }
70
81
  });
71
82
  } else if (awc.sendOperationalEvent) {
72
- var _config$postInteracti2;
83
+ var _config$experimentalI2, _config$postInteracti2;
73
84
  sinkInteraction(awc, payloadPackage);
85
+ if (config !== null && config !== void 0 && (_config$experimentalI2 = config.experimentalInteractionMetrics) !== null && _config$experimentalI2 !== void 0 && _config$experimentalI2.enabled) {
86
+ sinkExperimentalInteractionMetrics(awc, createExperimentalInteractionMetricsPayload);
87
+ }
74
88
  if ((_config$postInteracti2 = config.postInteractionLog) !== null && _config$postInteracti2 !== void 0 && _config$postInteracti2.enabled) {
75
89
  sinkPostInteractionLog(awc, createPostInteractionLogPayloadPackage.default);
76
90
  }
@@ -22,8 +22,7 @@ var useLayoutEffectSAFE = typeof window === 'undefined' ? useEffect : useLayoutE
22
22
  * return (
23
23
  * <>
24
24
  * <Skeleton />
25
- * <UFOLoadHold name="card">
26
- * </UFOLoadHold>
25
+ * <UFOLoadHold name="card" />
27
26
  * )
28
27
  * }
29
28
  * ```
@@ -58,8 +57,8 @@ export default function UFOLoadHold(_ref) {
58
57
  // react-18: useId instead
59
58
  var context = useContext(UFOInteractionContext);
60
59
  useLayoutEffectSAFE(function () {
61
- if (hold && !experimental && context != null) {
62
- return context.hold(name);
60
+ if (hold && context != null) {
61
+ return context.hold(name, experimental);
63
62
  }
64
63
  }, [hold, context, name]);
65
64