@atlaskit/react-ufo 2.4.5 → 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 (71) hide show
  1. package/CHANGELOG.md +25 -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 +49 -85
  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/cjs/vc/vc-observer/observers/index.js +1 -40
  17. package/dist/es2019/config/index.js +22 -0
  18. package/dist/es2019/create-experimental-interaction-metrics-payload/index.js +67 -0
  19. package/dist/es2019/create-payload/common/utils/index.js +86 -1
  20. package/dist/es2019/create-payload/index.js +40 -81
  21. package/dist/es2019/create-post-interaction-log-payload/index.js +1 -4
  22. package/dist/es2019/interaction-metrics/common/constants.js +6 -0
  23. package/dist/es2019/interaction-metrics/common/index.js +103 -0
  24. package/dist/es2019/interaction-metrics/index.js +92 -129
  25. package/dist/es2019/interaction-metrics/post-interaction-log.js +6 -2
  26. package/dist/es2019/interaction-metrics-init/index.js +21 -8
  27. package/dist/es2019/load-hold/UFOLoadHold.js +3 -4
  28. package/dist/es2019/segment/segment.js +6 -12
  29. package/dist/es2019/trace-pageload/index.js +1 -1
  30. package/dist/es2019/vc/vc-observer/observers/index.js +1 -20
  31. package/dist/esm/config/index.js +39 -18
  32. package/dist/esm/create-experimental-interaction-metrics-payload/index.js +81 -0
  33. package/dist/esm/create-payload/common/utils/index.js +80 -1
  34. package/dist/esm/create-payload/index.js +45 -83
  35. package/dist/esm/create-post-interaction-log-payload/index.js +1 -4
  36. package/dist/esm/interaction-metrics/common/constants.js +6 -0
  37. package/dist/esm/interaction-metrics/common/index.js +132 -0
  38. package/dist/esm/interaction-metrics/index.js +87 -156
  39. package/dist/esm/interaction-metrics/post-interaction-log.js +6 -2
  40. package/dist/esm/interaction-metrics-init/index.js +24 -10
  41. package/dist/esm/load-hold/UFOLoadHold.js +3 -4
  42. package/dist/esm/segment/segment.js +7 -9
  43. package/dist/esm/trace-pageload/index.js +1 -1
  44. package/dist/esm/vc/vc-observer/observers/index.js +1 -40
  45. package/dist/types/common/common/types.d.ts +9 -5
  46. package/dist/types/config/index.d.ts +6 -0
  47. package/dist/types/create-experimental-interaction-metrics-payload/index.d.ts +31 -0
  48. package/dist/types/create-payload/common/utils/index.d.ts +12 -0
  49. package/dist/types/create-payload/index.d.ts +13 -5716
  50. package/dist/types/create-post-interaction-log-payload/index.d.ts +2 -0
  51. package/dist/types/interaction-metrics/common/constants.d.ts +31 -1
  52. package/dist/types/interaction-metrics/common/index.d.ts +16 -0
  53. package/dist/types/interaction-metrics/index.d.ts +4 -15
  54. package/dist/types/interaction-metrics/post-interaction-log.d.ts +1 -1
  55. package/dist/types/load-hold/UFOLoadHold.d.ts +1 -2
  56. package/dist/types/trace-pageload/index.d.ts +1 -0
  57. package/dist/types/vc/vc-observer/observers/index.d.ts +0 -1
  58. package/dist/types-ts4.5/common/common/types.d.ts +9 -5
  59. package/dist/types-ts4.5/config/index.d.ts +6 -0
  60. package/dist/types-ts4.5/create-experimental-interaction-metrics-payload/index.d.ts +31 -0
  61. package/dist/types-ts4.5/create-payload/common/utils/index.d.ts +12 -0
  62. package/dist/types-ts4.5/create-payload/index.d.ts +13 -5716
  63. package/dist/types-ts4.5/create-post-interaction-log-payload/index.d.ts +2 -0
  64. package/dist/types-ts4.5/interaction-metrics/common/constants.d.ts +31 -1
  65. package/dist/types-ts4.5/interaction-metrics/common/index.d.ts +16 -0
  66. package/dist/types-ts4.5/interaction-metrics/index.d.ts +4 -15
  67. package/dist/types-ts4.5/interaction-metrics/post-interaction-log.d.ts +1 -1
  68. package/dist/types-ts4.5/load-hold/UFOLoadHold.d.ts +1 -2
  69. package/dist/types-ts4.5/trace-pageload/index.d.ts +1 -0
  70. package/dist/types-ts4.5/vc/vc-observer/observers/index.d.ts +0 -1
  71. package/package.json +2 -1
@@ -26,6 +26,14 @@ function sinkInteraction(instance, payloadPackage) {
26
26
  });
27
27
  });
28
28
  }
29
+ function sinkExperimentalInteractionMetrics(instance, payloadPackage) {
30
+ (0, _interactionMetrics.sinkExperimentalHandler)(function (interactionId, interaction) {
31
+ (0, _scheduler.unstable_scheduleCallback)(_scheduler.unstable_IdlePriority, function () {
32
+ var payload = payloadPackage.createExperimentalInteractionMetricsPayload(interactionId, interaction);
33
+ instance.sendOperationalEvent(payload);
34
+ });
35
+ });
36
+ }
29
37
  function sinkPostInteractionLog(instance, createPostInteractionLogPayload) {
30
38
  (0, _interactionMetrics.sinkPostInteractionLogHandler)(function (logOutput) {
31
39
  (0, _scheduler.unstable_scheduleCallback)(_scheduler.unstable_IdlePriority, function () {
@@ -56,33 +64,43 @@ var init = exports.init = function init(analyticsWebClientAsync, config) {
56
64
  _interactionMetrics.postInteractionLog.startVCObserver({
57
65
  startTime: 0
58
66
  });
67
+ _interactionMetrics.experimentalInteractionLog.initializeVCObserver(vcOptions).startVCObserver({
68
+ startTime: 0
69
+ });
59
70
  }
60
71
  (0, _hiddenTiming.setupHiddenTimingCapture)();
61
72
  (0, _additionalPayload.startLighthouseObserver)();
62
73
  initialized = true;
63
- Promise.all([analyticsWebClientAsync, // eslint-disable-next-line import/dynamic-import-chunkname
64
- Promise.resolve().then(function () {
74
+ Promise.all([analyticsWebClientAsync, Promise.resolve().then(function () {
65
75
  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'));
76
+ }), Promise.resolve().then(function () {
77
+ return _interopRequireWildcard(require( /* webpackChunkName: "create-experimental-interaction-metrics-payload" */'../create-experimental-interaction-metrics-payload'));
78
+ }), Promise.resolve().then(function () {
79
+ return _interopRequireWildcard(require( /* webpackChunkName: "create-post-interaction-log-payload" */'../create-post-interaction-log-payload'));
69
80
  })]).then(function (_ref) {
70
- var _ref2 = (0, _slicedToArray2.default)(_ref, 3),
81
+ var _ref2 = (0, _slicedToArray2.default)(_ref, 4),
71
82
  awc = _ref2[0],
72
83
  payloadPackage = _ref2[1],
73
- createPostInteractionLogPayloadPackage = _ref2[2];
84
+ createExperimentalInteractionMetricsPayload = _ref2[2],
85
+ createPostInteractionLogPayloadPackage = _ref2[3];
74
86
  if (awc.getAnalyticsWebClientPromise) {
75
87
  awc.getAnalyticsWebClientPromise().then(function (client) {
76
- var _config$postInteracti;
88
+ var _config$experimentalI, _config$postInteracti;
77
89
  var instance = client.getInstance();
78
90
  sinkInteraction(instance, payloadPackage);
91
+ if (config !== null && config !== void 0 && (_config$experimentalI = config.experimentalInteractionMetrics) !== null && _config$experimentalI !== void 0 && _config$experimentalI.enabled) {
92
+ sinkExperimentalInteractionMetrics(instance, createExperimentalInteractionMetricsPayload);
93
+ }
79
94
  if ((_config$postInteracti = config.postInteractionLog) !== null && _config$postInteracti !== void 0 && _config$postInteracti.enabled) {
80
95
  sinkPostInteractionLog(instance, createPostInteractionLogPayloadPackage.default);
81
96
  }
82
97
  });
83
98
  } else if (awc.sendOperationalEvent) {
84
- var _config$postInteracti2;
99
+ var _config$experimentalI2, _config$postInteracti2;
85
100
  sinkInteraction(awc, payloadPackage);
101
+ if (config !== null && config !== void 0 && (_config$experimentalI2 = config.experimentalInteractionMetrics) !== null && _config$experimentalI2 !== void 0 && _config$experimentalI2.enabled) {
102
+ sinkExperimentalInteractionMetrics(awc, createExperimentalInteractionMetricsPayload);
103
+ }
86
104
  if ((_config$postInteracti2 = config.postInteractionLog) !== null && _config$postInteracti2 !== void 0 && _config$postInteracti2.enabled) {
87
105
  sinkPostInteractionLog(awc, createPostInteractionLogPayloadPackage.default);
88
106
  }
@@ -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,8 +67,8 @@ 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) {
72
- return context.hold(name);
70
+ if (hold && context != null) {
71
+ return context.hold(name, experimental);
73
72
  }
74
73
  }, [hold, context, name]);
75
74
 
@@ -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);
@@ -133,7 +130,8 @@ function UFOSegment(_ref) {
133
130
  labelStack: labelStack,
134
131
  hold: function hold() {
135
132
  var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'unknown';
136
- return this._internalHold(this.labelStack, name);
133
+ var experimental = arguments.length > 1 ? arguments[1] : undefined;
134
+ return this._internalHold(this.labelStack, name, experimental);
137
135
  },
138
136
  addHoldByID: function addHoldByID(labelStack, id) {
139
137
  var name = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'unknown';
@@ -4,6 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
+ exports.AWAITING_PAGELOAD_NAME = void 0;
7
8
  exports.default = traceUFOPageLoad;
8
9
  exports.updatePageloadName = updatePageloadName;
9
10
  var _uuid = require("uuid");
@@ -13,7 +14,7 @@ var _experienceTraceIdContext = require("../experience-trace-id-context");
13
14
  var _interactionIdContext = require("../interaction-id-context");
14
15
  var _interactionMetrics = require("../interaction-metrics");
15
16
  var _routeNameContext = _interopRequireDefault(require("../route-name-context"));
16
- var AWAITING_PAGELOAD_NAME = 'awaiting_pageload_name';
17
+ var AWAITING_PAGELOAD_NAME = exports.AWAITING_PAGELOAD_NAME = 'awaiting_pageload_name';
17
18
  function traceUFOPageLoad(ufoName) {
18
19
  var routeName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ufoName;
19
20
  var activeInteraction = (0, _interactionMetrics.getActiveInteraction)();
@@ -5,7 +5,6 @@ Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
7
  exports.Observers = void 0;
8
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
9
8
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
10
9
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
11
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
@@ -13,9 +12,6 @@ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
13
12
  var _vcUtils = require("../media-wrapper/vc-utils");
14
13
  var _editorLnv = require("./editor-lnv");
15
14
  var _ssrPlaceholders = require("./ssr-placeholders");
16
- 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; } } }; }
17
- 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; } }
18
- 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; }
19
15
  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; }
20
16
  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; }
21
17
  var state = {
@@ -202,8 +198,7 @@ var Observers = exports.Observers = /*#__PURE__*/function () {
202
198
  });
203
199
  } else if (mutation.type === 'attributes') {
204
200
  if (mutation.target instanceof HTMLElement) {
205
- var isDisplayStyleAttributeMutation = mutation.attributeName === 'style' && _this2.getStyleDisplay(mutation.target.getAttribute('style')) !== _this2.getStyleDisplay(mutation.oldValue);
206
- if ((0, _platformFeatureFlags.fg)('platform-ufo-vc-observe-attributes') || isDisplayStyleAttributeMutation) {
201
+ if ((0, _platformFeatureFlags.fg)('platform-ufo-vc-observe-attributes')) {
207
202
  _this2.observeElement(mutation.target, mutation, 'attr', ignoreReason);
208
203
  }
209
204
  }
@@ -212,40 +207,6 @@ var Observers = exports.Observers = /*#__PURE__*/function () {
212
207
  _this2.measureStop();
213
208
  }) : null;
214
209
  }
215
- }, {
216
- key: "getStyleDisplay",
217
- value: function getStyleDisplay(styleAttributeValue) {
218
- if (!styleAttributeValue) {
219
- return undefined;
220
- }
221
-
222
- // Split the style string into individual declarations
223
- var declarations = styleAttributeValue.split(';');
224
- // Iterate over each declaration
225
- var _iterator = _createForOfIteratorHelper(declarations),
226
- _step;
227
- try {
228
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
229
- var declaration = _step.value;
230
- // Trim whitespace and split into property and value
231
- var _declaration$split$ma = declaration.split(':').map(function (part) {
232
- return part.trim();
233
- }),
234
- _declaration$split$ma2 = (0, _slicedToArray2.default)(_declaration$split$ma, 2),
235
- property = _declaration$split$ma2[0],
236
- value = _declaration$split$ma2[1];
237
- // Check if the property is 'display'
238
- if (property && property.toLowerCase() === 'display') {
239
- return value;
240
- }
241
- }
242
- } catch (err) {
243
- _iterator.e(err);
244
- } finally {
245
- _iterator.f();
246
- }
247
- return undefined;
248
- }
249
210
  }, {
250
211
  key: "getElementName",
251
212
  value: function getElementName(element) {
@@ -67,6 +67,28 @@ export function getInteractionRate(name, interactionKind) {
67
67
  return 0;
68
68
  }
69
69
  }
70
+ export function getExperimentalInteractionRate(name, interactionType) {
71
+ try {
72
+ if (!config) {
73
+ return 0;
74
+ }
75
+ const {
76
+ experimentalInteractionMetrics
77
+ } = config;
78
+ if (!(experimentalInteractionMetrics !== null && experimentalInteractionMetrics !== void 0 && experimentalInteractionMetrics.enabled)) {
79
+ return 0;
80
+ }
81
+ if (experimentalInteractionMetrics.rates && typeof experimentalInteractionMetrics.rates[name] === 'number') {
82
+ return experimentalInteractionMetrics.rates[name];
83
+ }
84
+ if (experimentalInteractionMetrics.kind && typeof experimentalInteractionMetrics.kind[interactionType] === 'number') {
85
+ return experimentalInteractionMetrics.kind[interactionType];
86
+ }
87
+ return 0;
88
+ } catch (e) {
89
+ return 0;
90
+ }
91
+ }
70
92
  export function getPostInteractionRate(name, interactionType) {
71
93
  try {
72
94
  if (!config) {
@@ -0,0 +1,67 @@
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ import coinflip from '../coinflip';
3
+ import { getConfig, getExperimentalInteractionRate } from '../config';
4
+ import { createInteractionMetricsPayload, getUfoNameOverride } from '../create-payload';
5
+ import { getPageVisibilityState } from '../hidden-timing';
6
+ import { VCObserver } from '../vc/vc-observer';
7
+ export class ExperimentalInteractionMetrics {
8
+ constructor() {
9
+ /**
10
+ * Handler function to process / send the observation data
11
+ */
12
+ _defineProperty(this, "sinkHandlerFn", () => {});
13
+ /**
14
+ * independent VC observer that observes until `custom.post-interaction-logs` event is sent
15
+ */
16
+ _defineProperty(this, "vcObserver", null);
17
+ }
18
+ /**
19
+ * Set the fn that would be invoked to process / send the observation data
20
+ */
21
+ sinkHandler(sinkHandlerFn) {
22
+ this.sinkHandlerFn = sinkHandlerFn;
23
+ }
24
+ onInteractionComplete(interactionId, data, endTime = performance.now()) {
25
+ if (data.ufoName) {
26
+ data.end = endTime;
27
+ this.sinkHandlerFn(interactionId, data);
28
+ }
29
+ }
30
+ initializeVCObserver(options) {
31
+ if (this.vcObserver === null) {
32
+ this.vcObserver = new VCObserver({
33
+ ...options,
34
+ isPostInteraction: true
35
+ });
36
+ }
37
+ return this;
38
+ }
39
+ startVCObserver({
40
+ startTime
41
+ }) {
42
+ var _this$vcObserver;
43
+ (_this$vcObserver = this.vcObserver) === null || _this$vcObserver === void 0 ? void 0 : _this$vcObserver.start({
44
+ startTime
45
+ });
46
+ }
47
+ }
48
+ export function createExperimentalInteractionMetricsPayload(interactionId, interaction) {
49
+ const config = getConfig();
50
+ if (!config) {
51
+ throw Error('UFO Configuration not provided');
52
+ }
53
+ const ufoName = getUfoNameOverride(interaction);
54
+ const modifiedInteraction = {
55
+ ...interaction,
56
+ ufoName
57
+ };
58
+ const rate = getExperimentalInteractionRate(ufoName, interaction.type);
59
+ if (!coinflip(rate)) {
60
+ return null;
61
+ }
62
+ const pageVisibilityState = getPageVisibilityState(interaction.start, interaction.end);
63
+ if (pageVisibilityState !== 'visible') {
64
+ return null;
65
+ }
66
+ return createInteractionMetricsPayload(modifiedInteraction, interactionId, true);
67
+ }
@@ -1,5 +1,11 @@
1
1
  /* eslint-disable @typescript-eslint/no-non-null-asserted-optional-chain */
2
+
2
3
  import { REACT_UFO_VERSION } from '../../../common/constants';
4
+ import { getConfig } from '../../../config';
5
+ import { getPageVisibilityState } from '../../../hidden-timing';
6
+ import { experimentalInteractionLog, postInteractionLog } from '../../../interaction-metrics';
7
+ import * as ssr from '../../../ssr';
8
+ import { getVCObserver } from '../../../vc';
3
9
  export const sanitizeUfoName = name => {
4
10
  return name.replace(/_/g, '-');
5
11
  };
@@ -53,4 +59,83 @@ export function optimizeLabelStack(labelStack) {
53
59
  s: ls.segmentId
54
60
  } : {})
55
61
  }));
56
- }
62
+ }
63
+ export const getInteractionStatus = interaction => {
64
+ const originalInteractionStatus = interaction.abortReason ? 'ABORTED' : 'SUCCEEDED';
65
+ const hasBm3TTI = interaction.apdex.length > 0;
66
+ const overrideStatus = hasBm3TTI ? 'SUCCEEDED' : originalInteractionStatus;
67
+ return {
68
+ originalInteractionStatus,
69
+ overrideStatus
70
+ };
71
+ };
72
+ export const getPageVisibilityUpToTTAI = interaction => {
73
+ const {
74
+ start,
75
+ end
76
+ } = interaction;
77
+ return getPageVisibilityState(start, end);
78
+ };
79
+ export const calculateVCMetrics = (interaction, prefix, getVCResultFn) => {
80
+ var _interaction$apdex, _interaction$apdex$;
81
+ const result = getVCResultFn({
82
+ start: interaction.start,
83
+ stop: interaction.end,
84
+ tti: (_interaction$apdex = interaction.apdex) === null || _interaction$apdex === void 0 ? void 0 : (_interaction$apdex$ = _interaction$apdex[0]) === null || _interaction$apdex$ === void 0 ? void 0 : _interaction$apdex$.stopTime,
85
+ prefix,
86
+ vc: interaction.vc
87
+ });
88
+ const VC = result === null || result === void 0 ? void 0 : result['metrics:vc'];
89
+ if (!VC || !(result !== null && result !== void 0 && result[`${prefix}:vc:clean`])) {
90
+ return result;
91
+ }
92
+ const interactionStatus = getInteractionStatus(interaction);
93
+ const pageVisibilityUpToTTAI = getPageVisibilityUpToTTAI(interaction);
94
+ if (interactionStatus.originalInteractionStatus !== 'SUCCEEDED' || pageVisibilityUpToTTAI !== 'visible') {
95
+ return result;
96
+ }
97
+ return result;
98
+ };
99
+ export function getSSRDoneTimeValue(config) {
100
+ var _config$ssr, _config$ssr2;
101
+ return config !== null && config !== void 0 && (_config$ssr = config.ssr) !== null && _config$ssr !== void 0 && _config$ssr.getSSRDoneTime ? config === null || config === void 0 ? void 0 : (_config$ssr2 = config.ssr) === null || _config$ssr2 === void 0 ? void 0 : _config$ssr2.getSSRDoneTime() : ssr.getSSRDoneTime();
102
+ }
103
+ export const getVCMetrics = interaction => {
104
+ var _config$vc, _result$metricsVc;
105
+ const config = getConfig();
106
+ if (!(config !== null && config !== void 0 && (_config$vc = config.vc) !== null && _config$vc !== void 0 && _config$vc.enabled)) {
107
+ return {};
108
+ }
109
+ if (interaction.type !== 'page_load' && interaction.type !== 'transition') {
110
+ return {};
111
+ }
112
+ const ssr = interaction.type === 'page_load' && config !== null && config !== void 0 && config.ssr ? {
113
+ ssr: getSSRDoneTimeValue(config)
114
+ } : null;
115
+ postInteractionLog.setVCObserverSSRConfig(ssr);
116
+ const result = calculateVCMetrics(interaction, 'ufo', getVCObserver().getVCResult);
117
+ return {
118
+ ...result,
119
+ 'metric:vc90': result === null || result === void 0 ? void 0 : (_result$metricsVc = result['metrics:vc']) === null || _result$metricsVc === void 0 ? void 0 : _result$metricsVc['90']
120
+ };
121
+ };
122
+ export const getExperimentalVCMetrics = interaction => {
123
+ if (experimentalInteractionLog.vcObserver) {
124
+ var _result$metricsVc2;
125
+ const result = calculateVCMetrics(interaction, 'ufo-experimental', experimentalInteractionLog.vcObserver.getVCResult);
126
+ return {
127
+ ...result,
128
+ 'metric:experimental:vc90': result === null || result === void 0 ? void 0 : (_result$metricsVc2 = result['metrics:vc']) === null || _result$metricsVc2 === void 0 ? void 0 : _result$metricsVc2['90']
129
+ };
130
+ }
131
+ return null;
132
+ };
133
+ export const getTTAI = interaction => {
134
+ const {
135
+ start,
136
+ end
137
+ } = interaction;
138
+ const interactionStatus = getInteractionStatus(interaction);
139
+ const pageVisibilityUpToTTAI = getPageVisibilityUpToTTAI(interaction);
140
+ return interactionStatus.originalInteractionStatus === 'SUCCEEDED' && pageVisibilityUpToTTAI === 'visible' ? Math.round(end - start) : undefined;
141
+ };