@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
@@ -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)();
@@ -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
+ };
@@ -8,13 +8,12 @@ import { getBm3Timings } from '../custom-timings';
8
8
  import { getGlobalErrorCount } from '../global-error-handler';
9
9
  import { getPageVisibilityState } from '../hidden-timing';
10
10
  import * as initialPageLoadExtraTiming from '../initial-page-load-extra-timing';
11
- import { interactionSpans as atlaskitInteractionSpans, postInteractionLog } from '../interaction-metrics';
11
+ import { interactionSpans as atlaskitInteractionSpans } from '../interaction-metrics';
12
12
  import * as resourceTiming from '../resource-timing';
13
13
  import { roundEpsilon } from '../round-number';
14
14
  import * as ssr from '../ssr';
15
- import { getVCObserver } from '../vc';
16
- import { buildSegmentTree, labelStackStartWith, optimizeLabelStack, sanitizeUfoName, stringifyLabelStackFully } from './common/utils';
17
- function getUfoNameOverride(interaction) {
15
+ import { buildSegmentTree, getExperimentalVCMetrics, getInteractionStatus, getPageVisibilityUpToTTAI, getSSRDoneTimeValue, getTTAI, getVCMetrics, labelStackStartWith, optimizeLabelStack, sanitizeUfoName, stringifyLabelStackFully } from './common/utils';
16
+ export function getUfoNameOverride(interaction) {
18
17
  const {
19
18
  ufoName,
20
19
  apdex
@@ -28,7 +27,6 @@ function getUfoNameOverride(interaction) {
28
27
  }
29
28
  }
30
29
  return ufoName;
31
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
32
30
  } catch (e) {
33
31
  return ufoName;
34
32
  }
@@ -63,13 +61,6 @@ const getPageVisibilityUpToTTI = interaction => {
63
61
  const bm3EndTimeOrInteractionEndTime = getBm3EndTimeOrFallbackValue(interaction);
64
62
  return getPageVisibilityState(start, bm3EndTimeOrInteractionEndTime);
65
63
  };
66
- const getPageVisibilityUpToTTAI = interaction => {
67
- const {
68
- start,
69
- end
70
- } = interaction;
71
- return getPageVisibilityState(start, end);
72
- };
73
64
  const getVisibilityStateFromPerformance = stop => {
74
65
  try {
75
66
  const results = performance.getEntriesByType('visibility-state');
@@ -124,15 +115,6 @@ const getMoreAccuratePageVisibilityUpToTTAI = interaction => {
124
115
  }
125
116
  return old;
126
117
  };
127
- const getInteractionStatus = interaction => {
128
- const originalInteractionStatus = interaction.abortReason ? 'ABORTED' : 'SUCCEEDED';
129
- const hasBm3TTI = interaction.apdex.length > 0;
130
- const overrideStatus = hasBm3TTI ? 'SUCCEEDED' : originalInteractionStatus;
131
- return {
132
- originalInteractionStatus,
133
- overrideStatus
134
- };
135
- };
136
118
  const getResourceTimings = (start, end) => {
137
119
  var _resourceTiming$getRe;
138
120
  return (_resourceTiming$getRe = resourceTiming.getResourceTimings(start, end)) !== null && _resourceTiming$getRe !== void 0 ? _resourceTiming$getRe : undefined;
@@ -155,44 +137,6 @@ const getPaintMetrics = type => {
155
137
  });
156
138
  return metrics;
157
139
  };
158
- const getVCMetrics = interaction => {
159
- var _config$vc, _interaction$apdex, _interaction$apdex$;
160
- const config = getConfig();
161
- if (!(config !== null && config !== void 0 && (_config$vc = config.vc) !== null && _config$vc !== void 0 && _config$vc.enabled)) {
162
- return {};
163
- }
164
- if (interaction.type !== 'page_load' && interaction.type !== 'transition') {
165
- return {};
166
- }
167
- const ssr = interaction.type === 'page_load' && config !== null && config !== void 0 && config.ssr ? {
168
- ssr: getSSRDoneTimeValue(config)
169
- } : null;
170
- postInteractionLog.setVCObserverSSRConfig(ssr);
171
- const 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;
172
- const prefix = 'ufo';
173
- const result = getVCObserver().getVCResult({
174
- start: interaction.start,
175
- stop: interaction.end,
176
- tti,
177
- prefix,
178
- vc: interaction.vc,
179
- ...ssr
180
- });
181
- postInteractionLog.setLastInteractionFinishVCResult(result);
182
- const VC = result === null || result === void 0 ? void 0 : result['metrics:vc'];
183
- if (!VC || !(result !== null && result !== void 0 && result[`${prefix}:vc:clean`])) {
184
- return result;
185
- }
186
- const interactionStatus = getInteractionStatus(interaction);
187
- const pageVisibilityUpToTTAI = getPageVisibilityUpToTTAI(interaction);
188
- if (interactionStatus.originalInteractionStatus !== 'SUCCEEDED' || pageVisibilityUpToTTAI !== 'visible') {
189
- return result;
190
- }
191
- return {
192
- ...result,
193
- 'metric:vc90': VC['90']
194
- };
195
- };
196
140
  const getNavigationMetrics = type => {
197
141
  if (type !== 'page_load') {
198
142
  return {};
@@ -240,7 +184,7 @@ const getNavigationMetrics = type => {
240
184
  };
241
185
  };
242
186
  const getPPSMetrics = interaction => {
243
- var _interaction$apdex2, _interaction$apdex2$;
187
+ var _interaction$apdex, _interaction$apdex$;
244
188
  const {
245
189
  start,
246
190
  end
@@ -248,7 +192,7 @@ const getPPSMetrics = interaction => {
248
192
  const config = getConfig();
249
193
  const interactionStatus = getInteractionStatus(interaction);
250
194
  const pageVisibilityUpToTTAI = getPageVisibilityUpToTTAI(interaction);
251
- const tti = (_interaction$apdex2 = interaction.apdex) === null || _interaction$apdex2 === void 0 ? void 0 : (_interaction$apdex2$ = _interaction$apdex2[0]) === null || _interaction$apdex2$ === void 0 ? void 0 : _interaction$apdex2$.stopTime;
195
+ const 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;
252
196
  const ttai = interactionStatus.originalInteractionStatus === 'SUCCEEDED' && pageVisibilityUpToTTAI === 'visible' ? Math.round(end - start) : undefined;
253
197
  const PPSMetricsAtTTI = tti !== undefined ? getLighthouseMetrics({
254
198
  start,
@@ -594,10 +538,6 @@ function getBm3TrackerTimings(interaction) {
594
538
  legacyMetrics
595
539
  };
596
540
  }
597
- function getSSRDoneTimeValue(config) {
598
- var _config$ssr, _config$ssr2;
599
- 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();
600
- }
601
541
  function getPayloadSize(payload) {
602
542
  return Math.round(new TextEncoder().encode(JSON.stringify(payload)).length / 1024);
603
543
  }
@@ -640,13 +580,15 @@ function getStylesheetMetrics() {
640
580
  return {};
641
581
  }
642
582
  }
583
+ let regularTTAI;
584
+ let expTTAI;
643
585
  function getErrorCounts(interaction) {
644
586
  return {
645
587
  'ufo:errors:globalCount': getGlobalErrorCount(),
646
588
  'ufo:errors:count': interaction.errors.length
647
589
  };
648
590
  }
649
- function createInteractionMetricsPayload(interaction, interactionId) {
591
+ export function createInteractionMetricsPayload(interaction, interactionId, experimental) {
650
592
  var _window$location, _config$additionalPay;
651
593
  const interactionPayloadStart = performance.now();
652
594
  const config = getConfig();
@@ -681,7 +623,7 @@ function createInteractionMetricsPayload(interaction, interactionId) {
681
623
  } : {};
682
624
  // Page Load
683
625
  const getPageLoadInteractionMetrics = () => {
684
- var _config$ssr3;
626
+ var _config$ssr;
685
627
  if (!isPageLoad) {
686
628
  return {};
687
629
  }
@@ -693,12 +635,12 @@ function createInteractionMetricsPayload(interaction, interactionId) {
693
635
  return {
694
636
  ...SSRDoneTime,
695
637
  isBM3ConfigSSRDoneAsFmp: interaction.metaData.__legacy__bm3ConfigSSRDoneAsFmp,
696
- isUFOConfigSSRDoneAsFmp: interaction.metaData.__legacy__bm3ConfigSSRDoneAsFmp || !!(config !== null && config !== void 0 && (_config$ssr3 = config.ssr) !== null && _config$ssr3 !== void 0 && _config$ssr3.getSSRDoneTime)
638
+ isUFOConfigSSRDoneAsFmp: interaction.metaData.__legacy__bm3ConfigSSRDoneAsFmp || !!(config !== null && config !== void 0 && (_config$ssr = config.ssr) !== null && _config$ssr !== void 0 && _config$ssr.getSSRDoneTime)
697
639
  };
698
640
  };
699
641
  // Detailed payload. Page visibility = visible
700
642
  const getDetailedInteractionMetrics = () => {
701
- if (window.__UFO_COMPACT_PAYLOAD__ || !isDetailedPayload) {
643
+ if (experimental || window.__UFO_COMPACT_PAYLOAD__ || !isDetailedPayload) {
702
644
  return {};
703
645
  }
704
646
  const spans = [...interaction.spans, ...atlaskitInteractionSpans];
@@ -713,7 +655,7 @@ function createInteractionMetricsPayload(interaction, interactionId) {
713
655
  })),
714
656
  holdActive: [...interaction.holdActive.values()],
715
657
  redirects: optimizeRedirects(interaction.redirects, start),
716
- holdInfo: optimizeHoldInfo(interaction.holdInfo, start),
658
+ holdInfo: optimizeHoldInfo(experimental ? interaction.holdExpInfo : interaction.holdInfo, start),
717
659
  spans: optimizeSpans(spans, start),
718
660
  requestInfo: optimizeRequestInfo(interaction.requestInfo, start),
719
661
  customTimings: optimizeCustomTimings(interaction.customTimings, start),
@@ -723,16 +665,21 @@ function createInteractionMetricsPayload(interaction, interactionId) {
723
665
  };
724
666
  // Page load & detailed payload
725
667
  const getPageLoadDetailedInteractionMetrics = () => {
726
- var _config$ssr4;
668
+ var _config$ssr2;
727
669
  if (!isPageLoad || !isDetailedPayload) {
728
670
  return {};
729
671
  }
730
672
  const config = getConfig();
731
673
  return {
732
674
  initialPageLoadExtraTimings: objectToArray(initialPageLoadExtraTiming.getTimings()),
733
- SSRTimings: config !== null && config !== void 0 && (_config$ssr4 = config.ssr) !== null && _config$ssr4 !== void 0 && _config$ssr4.getSSRTimings ? config.ssr.getSSRTimings() : objectToArray(ssr.getSSRTimings())
675
+ SSRTimings: config !== null && config !== void 0 && (_config$ssr2 = config.ssr) !== null && _config$ssr2 !== void 0 && _config$ssr2.getSSRTimings ? config.ssr.getSSRTimings() : objectToArray(ssr.getSSRTimings())
734
676
  };
735
677
  };
678
+ if (experimental) {
679
+ expTTAI = getTTAI(interaction);
680
+ } else {
681
+ regularTTAI = getTTAI(interaction);
682
+ }
736
683
  const newUFOName = sanitizeUfoName(ufoName);
737
684
  const payload = {
738
685
  actionSubject: 'experience',
@@ -753,7 +700,7 @@ function createInteractionMetricsPayload(interaction, interactionId) {
753
700
  payloadSource: 'platform'
754
701
  },
755
702
  'event:region': config.region || 'unknown',
756
- 'experience:key': 'custom.interaction-metrics',
703
+ 'experience:key': experimental ? 'custom.experimental-interaction-metrics' : 'custom.interaction-metrics',
757
704
  'experience:name': newUFOName,
758
705
  // root
759
706
  ...getBrowserMetadata(),
@@ -762,6 +709,7 @@ function createInteractionMetricsPayload(interaction, interactionId) {
762
709
  ...getPaintMetrics(type),
763
710
  ...getNavigationMetrics(type),
764
711
  ...getVCMetrics(interaction),
712
+ ...(experimental ? getExperimentalVCMetrics(interaction) : undefined),
765
713
  ...((_config$additionalPay = config.additionalPayloadData) === null || _config$additionalPay === void 0 ? void 0 : _config$additionalPay.call(config, interaction)),
766
714
  ...getTracingContextData(interaction),
767
715
  ...getStylesheetMetrics(),
@@ -801,12 +749,18 @@ function createInteractionMetricsPayload(interaction, interactionId) {
801
749
  ...getPageLoadInteractionMetrics(),
802
750
  ...getDetailedInteractionMetrics(),
803
751
  ...getPageLoadDetailedInteractionMetrics(),
804
- ...getBm3TrackerTimings(interaction)
752
+ ...getBm3TrackerTimings(interaction),
753
+ 'metric:ttai': experimental ? regularTTAI || expTTAI : undefined,
754
+ 'metric:experimental:ttai': experimental ? expTTAI : undefined
805
755
  },
806
756
  'ufo:payloadTime': roundEpsilon(performance.now() - interactionPayloadStart)
807
757
  }
808
758
  }
809
759
  };
760
+ if (experimental) {
761
+ regularTTAI = undefined;
762
+ expTTAI = undefined;
763
+ }
810
764
  payload.attributes.properties['event:sizeInKb'] = getPayloadSize(payload.attributes.properties);
811
765
  return payload;
812
766
  }
@@ -47,10 +47,7 @@ function removeCascadingParentTimingReport(reactProfilerTimings) {
47
47
  if (parentSegmentId) {
48
48
  const parentTimings = timingIndex.get(parentSegmentId);
49
49
  const filteredParentTimings = parentTimings === null || parentTimings === void 0 ? void 0 : parentTimings.filter(parentTiming => {
50
- if (parentTiming.startTime === timing.startTime && parentTiming.actualDuration === timing.actualDuration) {
51
- return false;
52
- }
53
- return true;
50
+ return !(parentTiming.startTime === timing.startTime && parentTiming.actualDuration === timing.actualDuration);
54
51
  });
55
52
  if (filteredParentTimings) {
56
53
  timingIndex.set(parentSegmentId, filteredParentTimings);
@@ -1,2 +1,8 @@
1
1
  const interactions = new Map();
2
+ export const CLEANUP_TIMEOUT = 60 * 1000;
3
+ export const CLEANUP_TIMEOUT_AFTER_APDEX = 15 * 1000;
4
+ export const interactionQueue = [];
5
+ export const segmentCache = new Map();
6
+ export const segmentObservers = [];
7
+ export const moduleLoadingRequests = {};
2
8
  export default interactions;