@atlaskit/react-ufo 3.14.3 → 3.14.4

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 (111) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/cjs/create-payload/critical-metrics-payload/index.js +38 -0
  3. package/dist/cjs/create-payload/critical-metrics-payload/root-metrics.js +180 -0
  4. package/dist/cjs/create-payload/critical-metrics-payload/segment-metrics/create-segment-metrics.js +251 -0
  5. package/dist/cjs/create-payload/critical-metrics-payload/segment-metrics/get-is-root-segment.js +9 -0
  6. package/dist/cjs/create-payload/critical-metrics-payload/segment-metrics/get-segment-id.js +15 -0
  7. package/dist/cjs/create-payload/critical-metrics-payload/segment-metrics/get-segment-status.js +59 -0
  8. package/dist/cjs/create-payload/critical-metrics-payload/segment-metrics/has-segment-failed.js +17 -0
  9. package/dist/cjs/create-payload/critical-metrics-payload/segment-metrics/is-label-stack-under-segment.js +11 -0
  10. package/dist/cjs/create-payload/critical-metrics-payload/types.js +5 -0
  11. package/dist/cjs/create-payload/index.js +122 -214
  12. package/dist/cjs/create-payload/utils/find-matching-legacy-metric.js +15 -0
  13. package/dist/cjs/create-payload/utils/get-browser-metadata.js +87 -0
  14. package/dist/cjs/create-payload/utils/get-fmp.js +52 -0
  15. package/dist/cjs/create-payload/utils/get-navigation-metrics.js +66 -0
  16. package/dist/cjs/create-payload/utils/get-paint-metrics.js +124 -0
  17. package/dist/cjs/create-payload/utils/get-payload-size.js +17 -0
  18. package/dist/cjs/create-payload/utils/get-react-ufo-payload-version.js +3 -1
  19. package/dist/cjs/create-payload/utils/get-ssr-success.js +15 -0
  20. package/dist/cjs/create-payload/utils/get-ttai.js +14 -0
  21. package/dist/cjs/create-payload/utils/get-tti.js +38 -0
  22. package/dist/cjs/interaction-metrics/index.js +25 -0
  23. package/dist/es2019/create-payload/critical-metrics-payload/index.js +6 -0
  24. package/dist/es2019/create-payload/critical-metrics-payload/root-metrics.js +166 -0
  25. package/dist/es2019/create-payload/critical-metrics-payload/segment-metrics/create-segment-metrics.js +155 -0
  26. package/dist/es2019/create-payload/critical-metrics-payload/segment-metrics/get-is-root-segment.js +3 -0
  27. package/dist/es2019/create-payload/critical-metrics-payload/segment-metrics/get-segment-id.js +9 -0
  28. package/dist/es2019/create-payload/critical-metrics-payload/segment-metrics/get-segment-status.js +40 -0
  29. package/dist/es2019/create-payload/critical-metrics-payload/segment-metrics/has-segment-failed.js +10 -0
  30. package/dist/es2019/create-payload/critical-metrics-payload/segment-metrics/is-label-stack-under-segment.js +5 -0
  31. package/dist/es2019/create-payload/critical-metrics-payload/types.js +1 -0
  32. package/dist/es2019/create-payload/index.js +55 -151
  33. package/dist/es2019/create-payload/utils/find-matching-legacy-metric.js +7 -0
  34. package/dist/es2019/create-payload/utils/get-browser-metadata.js +79 -0
  35. package/dist/es2019/create-payload/utils/get-fmp.js +47 -0
  36. package/dist/es2019/create-payload/utils/get-navigation-metrics.js +59 -0
  37. package/dist/es2019/create-payload/utils/get-paint-metrics.js +78 -0
  38. package/dist/es2019/create-payload/utils/get-payload-size.js +11 -0
  39. package/dist/es2019/create-payload/utils/get-react-ufo-payload-version.js +2 -1
  40. package/dist/es2019/create-payload/utils/get-ssr-success.js +7 -0
  41. package/dist/es2019/create-payload/utils/get-ttai.js +9 -0
  42. package/dist/es2019/create-payload/utils/get-tti.js +35 -0
  43. package/dist/es2019/interaction-metrics/index.js +24 -0
  44. package/dist/esm/create-payload/critical-metrics-payload/index.js +31 -0
  45. package/dist/esm/create-payload/critical-metrics-payload/root-metrics.js +174 -0
  46. package/dist/esm/create-payload/critical-metrics-payload/segment-metrics/create-segment-metrics.js +244 -0
  47. package/dist/esm/create-payload/critical-metrics-payload/segment-metrics/get-is-root-segment.js +3 -0
  48. package/dist/esm/create-payload/critical-metrics-payload/segment-metrics/get-segment-id.js +9 -0
  49. package/dist/esm/create-payload/critical-metrics-payload/segment-metrics/get-segment-status.js +52 -0
  50. package/dist/esm/create-payload/critical-metrics-payload/segment-metrics/has-segment-failed.js +10 -0
  51. package/dist/esm/create-payload/critical-metrics-payload/segment-metrics/is-label-stack-under-segment.js +5 -0
  52. package/dist/esm/create-payload/critical-metrics-payload/types.js +1 -0
  53. package/dist/esm/create-payload/index.js +121 -210
  54. package/dist/esm/create-payload/utils/find-matching-legacy-metric.js +9 -0
  55. package/dist/esm/create-payload/utils/get-browser-metadata.js +79 -0
  56. package/dist/esm/create-payload/utils/get-fmp.js +47 -0
  57. package/dist/esm/create-payload/utils/get-navigation-metrics.js +59 -0
  58. package/dist/esm/create-payload/utils/get-paint-metrics.js +119 -0
  59. package/dist/esm/create-payload/utils/get-payload-size.js +11 -0
  60. package/dist/esm/create-payload/utils/get-react-ufo-payload-version.js +2 -1
  61. package/dist/esm/create-payload/utils/get-ssr-success.js +7 -0
  62. package/dist/esm/create-payload/utils/get-ttai.js +7 -0
  63. package/dist/esm/create-payload/utils/get-tti.js +33 -0
  64. package/dist/esm/interaction-metrics/index.js +24 -0
  65. package/dist/types/common/common/types.d.ts +1 -1
  66. package/dist/types/common/react-ufo-payload-schema.d.ts +23 -2
  67. package/dist/types/create-payload/critical-metrics-payload/index.d.ts +6 -0
  68. package/dist/types/create-payload/critical-metrics-payload/root-metrics.d.ts +7 -0
  69. package/dist/types/create-payload/critical-metrics-payload/segment-metrics/create-segment-metrics.d.ts +3 -0
  70. package/dist/types/create-payload/critical-metrics-payload/segment-metrics/get-is-root-segment.d.ts +2 -0
  71. package/dist/types/create-payload/critical-metrics-payload/segment-metrics/get-segment-id.d.ts +2 -0
  72. package/dist/types/create-payload/critical-metrics-payload/segment-metrics/get-segment-status.d.ts +7 -0
  73. package/dist/types/create-payload/critical-metrics-payload/segment-metrics/has-segment-failed.d.ts +2 -0
  74. package/dist/types/create-payload/critical-metrics-payload/segment-metrics/is-label-stack-under-segment.d.ts +2 -0
  75. package/dist/types/create-payload/critical-metrics-payload/types.d.ts +128 -0
  76. package/dist/types/create-payload/index.d.ts +339 -834
  77. package/dist/types/create-payload/utils/find-matching-legacy-metric.d.ts +5 -0
  78. package/dist/types/create-payload/utils/get-browser-metadata.d.ts +21 -0
  79. package/dist/types/create-payload/utils/get-fmp.d.ts +6 -0
  80. package/dist/types/create-payload/utils/get-navigation-metrics.d.ts +29 -0
  81. package/dist/types/create-payload/utils/get-paint-metrics.d.ts +13 -0
  82. package/dist/types/create-payload/utils/get-payload-size.d.ts +1 -0
  83. package/dist/types/create-payload/utils/get-react-ufo-payload-version.d.ts +2 -1
  84. package/dist/types/create-payload/utils/get-ssr-success.d.ts +2 -0
  85. package/dist/types/create-payload/utils/get-ttai.d.ts +2 -0
  86. package/dist/types/create-payload/utils/get-tti.d.ts +7 -0
  87. package/dist/types/interaction-metrics/index.d.ts +1 -0
  88. package/dist/types-ts4.5/common/common/types.d.ts +1 -1
  89. package/dist/types-ts4.5/common/react-ufo-payload-schema.d.ts +23 -2
  90. package/dist/types-ts4.5/create-payload/critical-metrics-payload/index.d.ts +6 -0
  91. package/dist/types-ts4.5/create-payload/critical-metrics-payload/root-metrics.d.ts +7 -0
  92. package/dist/types-ts4.5/create-payload/critical-metrics-payload/segment-metrics/create-segment-metrics.d.ts +3 -0
  93. package/dist/types-ts4.5/create-payload/critical-metrics-payload/segment-metrics/get-is-root-segment.d.ts +2 -0
  94. package/dist/types-ts4.5/create-payload/critical-metrics-payload/segment-metrics/get-segment-id.d.ts +2 -0
  95. package/dist/types-ts4.5/create-payload/critical-metrics-payload/segment-metrics/get-segment-status.d.ts +7 -0
  96. package/dist/types-ts4.5/create-payload/critical-metrics-payload/segment-metrics/has-segment-failed.d.ts +2 -0
  97. package/dist/types-ts4.5/create-payload/critical-metrics-payload/segment-metrics/is-label-stack-under-segment.d.ts +2 -0
  98. package/dist/types-ts4.5/create-payload/critical-metrics-payload/types.d.ts +130 -0
  99. package/dist/types-ts4.5/create-payload/index.d.ts +339 -834
  100. package/dist/types-ts4.5/create-payload/utils/find-matching-legacy-metric.d.ts +5 -0
  101. package/dist/types-ts4.5/create-payload/utils/get-browser-metadata.d.ts +21 -0
  102. package/dist/types-ts4.5/create-payload/utils/get-fmp.d.ts +6 -0
  103. package/dist/types-ts4.5/create-payload/utils/get-navigation-metrics.d.ts +29 -0
  104. package/dist/types-ts4.5/create-payload/utils/get-paint-metrics.d.ts +13 -0
  105. package/dist/types-ts4.5/create-payload/utils/get-payload-size.d.ts +1 -0
  106. package/dist/types-ts4.5/create-payload/utils/get-react-ufo-payload-version.d.ts +2 -1
  107. package/dist/types-ts4.5/create-payload/utils/get-ssr-success.d.ts +2 -0
  108. package/dist/types-ts4.5/create-payload/utils/get-ttai.d.ts +2 -0
  109. package/dist/types-ts4.5/create-payload/utils/get-tti.d.ts +7 -0
  110. package/dist/types-ts4.5/interaction-metrics/index.d.ts +1 -0
  111. package/package.json +5 -1
@@ -0,0 +1,59 @@
1
+ export default function getNavigationMetrics(type) {
2
+ if (type !== 'page_load') {
3
+ return null;
4
+ }
5
+ try {
6
+ const entries = performance.getEntriesByType('navigation');
7
+ if (entries.length === 0) {
8
+ return null;
9
+ }
10
+ const navigation = entries[0];
11
+ return {
12
+ // From https://www.w3.org/TR/resource-timing/
13
+ redirectStart: Math.round(navigation.redirectStart),
14
+ redirectEnd: Math.round(navigation.redirectEnd),
15
+ fetchStart: Math.round(navigation.fetchStart),
16
+ domainLookupStart: Math.round(navigation.domainLookupStart),
17
+ domainLookupEnd: Math.round(navigation.domainLookupEnd),
18
+ connectStart: Math.round(navigation.connectStart),
19
+ connectEnd: Math.round(navigation.connectEnd),
20
+ secureConnectionStart: Math.round(navigation.secureConnectionStart),
21
+ requestStart: Math.round(navigation.requestStart),
22
+ responseStart: Math.round(navigation.responseStart),
23
+ responseEnd: Math.round(navigation.responseEnd),
24
+ encodedBodySize: Math.round(navigation.encodedBodySize),
25
+ decodedBodySize: Math.round(navigation.decodedBodySize),
26
+ transferSize: Math.round(navigation.transferSize),
27
+ // From https://www.w3.org/TR/navigation-timing-2/
28
+ redirectCount: navigation.redirectCount,
29
+ type: navigation.type,
30
+ unloadEventEnd: Math.round(navigation.unloadEventEnd),
31
+ unloadEventStart: Math.round(navigation.unloadEventStart),
32
+ workerStart: Math.round(navigation.workerStart),
33
+ nextHopProtocol: navigation.nextHopProtocol
34
+
35
+ // The following properties are ignored because they provided limited value on a modern stack (e.g. the content
36
+ // is usually rendered and interactive before the dom is fully parsed, don't play well with streamed content...)
37
+ // * domComplete
38
+ // * domContentLoadedEventEnd
39
+ // * domContentLoadedEventStart
40
+ // * domInteractive
41
+ // * loadEventEnd
42
+ // * loadEventStart
43
+ };
44
+ } catch (error) {
45
+ // Return null if there's any error accessing navigation timing
46
+ return null;
47
+ }
48
+ }
49
+
50
+ // Helper function to get navigation metrics in legacy format for backward compatibility
51
+ export function getNavigationMetricsToLegacyFormat(type) {
52
+ const navigationMetrics = getNavigationMetrics(type);
53
+ if (!navigationMetrics) {
54
+ return {};
55
+ }
56
+ return {
57
+ 'metrics:navigation': navigationMetrics
58
+ };
59
+ }
@@ -0,0 +1,78 @@
1
+ // Type definitions for paint metrics
2
+
3
+ // Main function returns compact nested format
4
+ export default async function getPaintMetrics(type, end) {
5
+ if (type !== 'page_load') {
6
+ return {};
7
+ }
8
+ const paint = {};
9
+ const paintEntries = performance.getEntriesByType('paint');
10
+ paintEntries.forEach(entry => {
11
+ if (entry.name === 'first-paint') {
12
+ paint.fp = Math.round(entry.startTime);
13
+ }
14
+ if (entry.name === 'first-contentful-paint') {
15
+ paint.fcp = Math.round(entry.startTime);
16
+ }
17
+ });
18
+
19
+ // Get LCP using PerformanceObserver
20
+ const lcp = await new Promise(resolve => {
21
+ // Check if we already have LCP entries
22
+ const existingEntries = performance.getEntriesByType('largest-contentful-paint');
23
+ const lastEntry = existingEntries.reduce((agg, entry) => {
24
+ if (entry.startTime <= end && (agg === null || agg.startTime < entry.startTime)) {
25
+ return entry;
26
+ }
27
+ return agg;
28
+ }, null);
29
+ if (lastEntry) {
30
+ resolve(lastEntry.startTime);
31
+ return;
32
+ }
33
+ const observer = new PerformanceObserver(list => {
34
+ const entries = Array.from(list.getEntries());
35
+ const lastEntry = entries.reduce((agg, entry) => {
36
+ if (entry.startTime <= end && (agg === null || agg.startTime < entry.startTime)) {
37
+ return entry;
38
+ }
39
+ return agg;
40
+ }, null);
41
+ clearTimeout(timeoutId);
42
+ observer.disconnect();
43
+ if (lastEntry) {
44
+ resolve(lastEntry.startTime);
45
+ } else {
46
+ resolve(null);
47
+ }
48
+ });
49
+ observer.observe({
50
+ type: 'largest-contentful-paint',
51
+ buffered: true
52
+ });
53
+ const timeoutId = setTimeout(() => {
54
+ observer.disconnect();
55
+ resolve(null);
56
+ }, 200);
57
+ });
58
+ if (lcp) {
59
+ paint.lcp = Math.round(lcp);
60
+ }
61
+ return paint;
62
+ }
63
+
64
+ // Helper function to get paint metrics in legacy colon format for backward compatibility
65
+ export async function getPaintMetricsToLegacyFormat(type, end) {
66
+ const paint = await getPaintMetrics(type, end);
67
+ const legacyFormat = {};
68
+ if (paint.fp !== undefined) {
69
+ legacyFormat['metric:fp'] = paint.fp;
70
+ }
71
+ if (paint.fcp !== undefined) {
72
+ legacyFormat['metric:fcp'] = paint.fcp;
73
+ }
74
+ if (paint.lcp !== undefined) {
75
+ legacyFormat['metric:lcp'] = paint.lcp;
76
+ }
77
+ return legacyFormat;
78
+ }
@@ -0,0 +1,11 @@
1
+ // Reusable TextEncoder instance to avoid creating new instances
2
+ const textEncoder = new TextEncoder();
3
+ export default function getPayloadSize(payload) {
4
+ // Early return for null/undefined to avoid unnecessary processing
5
+ if (!payload) {
6
+ return 0;
7
+ }
8
+
9
+ // Use the reusable encoder instance
10
+ return Math.round(textEncoder.encode(JSON.stringify(payload)).length / 1024);
11
+ }
@@ -1,3 +1,4 @@
1
+ export const LATEST_REACT_UFO_PAYLOAD_VERSION = '2.0.0';
1
2
  export function getReactUFOPayloadVersion(interactionType, isPostInteractionLog) {
2
3
  if (isPostInteractionLog) {
3
4
  return '1.0.1';
@@ -5,5 +6,5 @@ export function getReactUFOPayloadVersion(interactionType, isPostInteractionLog)
5
6
  if (interactionType !== 'page_load' && interactionType !== 'transition') {
6
7
  return '1.0.1';
7
8
  }
8
- return '2.0.0';
9
+ return LATEST_REACT_UFO_PAYLOAD_VERSION;
9
10
  }
@@ -0,0 +1,7 @@
1
+ import * as ssr from '../../ssr';
2
+ export default function getSSRSuccess(type) {
3
+ if (type !== 'page_load') {
4
+ return undefined;
5
+ }
6
+ return ssr.getSSRSuccess();
7
+ }
@@ -0,0 +1,9 @@
1
+ import getPageVisibilityUpToTTAI from './get-page-visibility-up-to-ttai';
2
+ export default function getTTAI(interaction) {
3
+ const {
4
+ start,
5
+ end
6
+ } = interaction;
7
+ const pageVisibilityUpToTTAI = getPageVisibilityUpToTTAI(interaction);
8
+ return !interaction.abortReason && pageVisibilityUpToTTAI === 'visible' ? Math.round(end - start) : undefined;
9
+ }
@@ -0,0 +1,35 @@
1
+ import { findMatchingLegacyMetric } from './find-matching-legacy-metric';
2
+
3
+ /**
4
+ * Calculate TTI (Time to Interactive) based on server-side logic
5
+ * TTI is the time from interaction start to the end of the first matching legacy metric,
6
+ * or falls back to apdex/UFO end time if no legacy metrics exist
7
+ */
8
+ export function getTTI(interaction, experienceName) {
9
+ var _apdex$;
10
+ const {
11
+ start,
12
+ end,
13
+ apdex
14
+ } = interaction;
15
+
16
+ // Find matching legacy metric
17
+ const matchingLegacyMetric = findMatchingLegacyMetric(interaction, experienceName);
18
+
19
+ // Get end times in priority order (following server-side logic)
20
+ const apdexEndTime = apdex === null || apdex === void 0 ? void 0 : (_apdex$ = apdex[0]) === null || _apdex$ === void 0 ? void 0 : _apdex$.stopTime;
21
+ const legacyMetricsEndTime = matchingLegacyMetric === null || matchingLegacyMetric === void 0 ? void 0 : matchingLegacyMetric.stop;
22
+ const ufoEndTime = end;
23
+ let ttiEndTime;
24
+ if (matchingLegacyMetric && legacyMetricsEndTime) {
25
+ // Use legacy metrics end time if we have a matching legacy metric
26
+ ttiEndTime = legacyMetricsEndTime;
27
+ } else if (apdexEndTime) {
28
+ // Fall back to apdex end time if no matching legacy metrics
29
+ ttiEndTime = apdexEndTime;
30
+ } else {
31
+ // Final fallback to UFO end time
32
+ ttiEndTime = ufoEndTime;
33
+ }
34
+ return ttiEndTime ? Math.round(ttiEndTime - start) : undefined;
35
+ }
@@ -118,6 +118,29 @@ export function addCustomData(interactionId, labelStack, data) {
118
118
  });
119
119
  }
120
120
  }
121
+ export function addCohortingCustomData(interactionId, key, value) {
122
+ const interaction = interactions.get(interactionId);
123
+ if (interaction == null) {
124
+ return;
125
+ }
126
+
127
+ // Allow null and undefined values
128
+ if (value === null || value === undefined) {
129
+ interaction.cohortingCustomData.set(key, value);
130
+ return;
131
+ }
132
+
133
+ // Validate that the value is a primitive (number, boolean, or string)
134
+ if (typeof value !== 'number' && typeof value !== 'boolean' && typeof value !== 'string') {
135
+ return;
136
+ }
137
+
138
+ // Validate string length (max 50 characters)
139
+ if (typeof value === 'string' && value.length > 50) {
140
+ return;
141
+ }
142
+ interaction.cohortingCustomData.set(key, value);
143
+ }
121
144
  export function addCustomTiming(interactionId, labelStack, data) {
122
145
  const interaction = interactions.get(interactionId);
123
146
  if (interaction != null) {
@@ -665,6 +688,7 @@ export function addNewInteraction(interactionId, ufoName, type, startTime, rate,
665
688
  isPreviousInteractionAborted: PreviousInteractionLog.isAborted === true,
666
689
  marks: [],
667
690
  customData: [],
691
+ cohortingCustomData: new Map(),
668
692
  customTimings: [],
669
693
  spans: [],
670
694
  requestInfo: [],
@@ -0,0 +1,31 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
3
+ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
4
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
5
+ import { createRootCriticalMetricsPayload } from './root-metrics';
6
+ import { createSegmentMetricsPayloads } from './segment-metrics/create-segment-metrics';
7
+ export function createCriticalMetricsPayloads(_x, _x2, _x3) {
8
+ return _createCriticalMetricsPayloads.apply(this, arguments);
9
+ }
10
+ function _createCriticalMetricsPayloads() {
11
+ _createCriticalMetricsPayloads = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(interactionId, interaction, vcMetrics) {
12
+ var _yield$Promise$all, _yield$Promise$all2, rootPayload, segmentPayloads;
13
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
14
+ while (1) switch (_context.prev = _context.next) {
15
+ case 0:
16
+ _context.next = 2;
17
+ return Promise.all([createRootCriticalMetricsPayload(interactionId, interaction, vcMetrics), createSegmentMetricsPayloads(interactionId, interaction)]);
18
+ case 2:
19
+ _yield$Promise$all = _context.sent;
20
+ _yield$Promise$all2 = _slicedToArray(_yield$Promise$all, 2);
21
+ rootPayload = _yield$Promise$all2[0];
22
+ segmentPayloads = _yield$Promise$all2[1];
23
+ return _context.abrupt("return", [rootPayload].concat(_toConsumableArray(segmentPayloads)));
24
+ case 7:
25
+ case "end":
26
+ return _context.stop();
27
+ }
28
+ }, _callee);
29
+ }));
30
+ return _createCriticalMetricsPayloads.apply(this, arguments);
31
+ }
@@ -0,0 +1,174 @@
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
3
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
4
+ 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
+ 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
+ import { getLighthouseMetrics } from '../../additional-payload';
7
+ import { getConfig } from '../../config';
8
+ import { getPageVisibilityState } from '../../hidden-timing';
9
+ import { sanitizeUfoName } from '../common/utils';
10
+ import getBrowserMetadata from '../utils/get-browser-metadata';
11
+ import { getFMP } from '../utils/get-fmp';
12
+ import getInteractionStatus from '../utils/get-interaction-status';
13
+ import getNavigationMetrics from '../utils/get-navigation-metrics';
14
+ import getPageVisibilityUpToTTAI from '../utils/get-page-visibility-up-to-ttai';
15
+ import getPaintMetrics from '../utils/get-paint-metrics';
16
+ import { LATEST_REACT_UFO_PAYLOAD_VERSION } from '../utils/get-react-ufo-payload-version';
17
+ import getSSRSuccess from '../utils/get-ssr-success';
18
+ import getTTAI from '../utils/get-ttai';
19
+ import { getTTI } from '../utils/get-tti';
20
+ import getVCMetrics from '../utils/get-vc-metrics';
21
+
22
+ // Re-export types for convenience
23
+
24
+ // Local utility functions
25
+ function getPageVisibilityUpToTTI(interaction) {
26
+ var _interaction$apdex$0$, _interaction$apdex;
27
+ var start = interaction.start;
28
+ var bm3EndTimeOrInteractionEndTime = (_interaction$apdex$0$ = (_interaction$apdex = interaction.apdex) === null || _interaction$apdex === void 0 || (_interaction$apdex = _interaction$apdex[0]) === null || _interaction$apdex === void 0 ? void 0 : _interaction$apdex.stopTime) !== null && _interaction$apdex$0$ !== void 0 ? _interaction$apdex$0$ : interaction.end;
29
+ return getPageVisibilityState(start, bm3EndTimeOrInteractionEndTime);
30
+ }
31
+
32
+ // TODO Write tests for this function
33
+ export function createRootCriticalMetricsPayload(_x, _x2, _x3) {
34
+ return _createRootCriticalMetricsPayload.apply(this, arguments);
35
+ }
36
+ function _createRootCriticalMetricsPayload() {
37
+ _createRootCriticalMetricsPayload = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(interactionId, interaction, vcMetrics) {
38
+ var _finalVCMetrics$ufoV, _interaction$cohortin, _window$location;
39
+ var config, end, start, ufoName, rate, type, abortReason, routeName, previousInteractionName, isPreviousInteractionAborted, abortedByInteractionName, holdInfo, responsiveness, pageVisibilityAtTTI, pageVisibilityAtTTAI, interactionStatus, newUFOName, ttai, paintMetrics, navigationMetrics, ssrSuccess, tti, fmp, browserMetadata, lighthouseMetrics, finalVCMetrics, ttvc, earliestHold, cohortingCustomData, properties, payload;
40
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
41
+ while (1) switch (_context.prev = _context.next) {
42
+ case 0:
43
+ config = getConfig();
44
+ if (config) {
45
+ _context.next = 3;
46
+ break;
47
+ }
48
+ throw Error('UFO Configuration not provided');
49
+ case 3:
50
+ end = interaction.end, start = interaction.start, ufoName = interaction.ufoName, rate = interaction.rate, type = interaction.type, abortReason = interaction.abortReason, routeName = interaction.routeName, previousInteractionName = interaction.previousInteractionName, isPreviousInteractionAborted = interaction.isPreviousInteractionAborted, abortedByInteractionName = interaction.abortedByInteractionName, holdInfo = interaction.holdInfo, responsiveness = interaction.responsiveness;
51
+ pageVisibilityAtTTI = getPageVisibilityUpToTTI(interaction);
52
+ pageVisibilityAtTTAI = getPageVisibilityUpToTTAI(interaction);
53
+ interactionStatus = getInteractionStatus(interaction);
54
+ newUFOName = sanitizeUfoName(ufoName); // Get performance metrics
55
+ ttai = getTTAI(interaction);
56
+ _context.next = 11;
57
+ return getPaintMetrics(type, end);
58
+ case 11:
59
+ paintMetrics = _context.sent;
60
+ navigationMetrics = getNavigationMetrics(type);
61
+ ssrSuccess = getSSRSuccess(type); // Calculate BM3 metrics (TTI and FMP) directly
62
+ tti = getTTI(interaction, newUFOName);
63
+ fmp = getFMP(interaction, newUFOName); // Get browser metadata (using compact nested format)
64
+ browserMetadata = getBrowserMetadata();
65
+ lighthouseMetrics = getLighthouseMetrics({
66
+ start: start,
67
+ stop: end
68
+ }); // Use provided vcMetrics or calculate if not provided
69
+ _context.t0 = vcMetrics;
70
+ if (_context.t0) {
71
+ _context.next = 23;
72
+ break;
73
+ }
74
+ _context.next = 22;
75
+ return getVCMetrics(interaction);
76
+ case 22:
77
+ _context.t0 = _context.sent;
78
+ case 23:
79
+ finalVCMetrics = _context.t0;
80
+ ttvc = (_finalVCMetrics$ufoV = finalVCMetrics['ufo:vc:rev']) === null || _finalVCMetrics$ufoV === void 0 ? void 0 : _finalVCMetrics$ufoV.map(function (revision) {
81
+ if (revision['metric:vc90'] === null || revision.clean !== true) {
82
+ return null;
83
+ }
84
+ return {
85
+ revision: revision.revision,
86
+ vc90: revision['metric:vc90']
87
+ };
88
+ }).filter(function (revision) {
89
+ return revision != null;
90
+ }); // find earliest hold
91
+ earliestHold = holdInfo === null || holdInfo === void 0 ? void 0 : holdInfo.reduce(function (a, b) {
92
+ if (a && a.start < b.start) {
93
+ return a;
94
+ }
95
+ return b;
96
+ }, null); // Process cohorting custom data
97
+ cohortingCustomData = (_interaction$cohortin = interaction.cohortingCustomData) !== null && _interaction$cohortin !== void 0 && _interaction$cohortin.size ? Object.fromEntries(interaction.cohortingCustomData) : undefined;
98
+ properties = _objectSpread(_objectSpread({
99
+ // Basic metadata
100
+ 'event:hostname': ((_window$location = window.location) === null || _window$location === void 0 ? void 0 : _window$location.hostname) || 'unknown',
101
+ 'event:product': config.product,
102
+ 'event:schema': '1.0.0',
103
+ 'event:region': config.region || 'unknown',
104
+ 'event:source': {
105
+ name: 'react-ufo/web',
106
+ version: LATEST_REACT_UFO_PAYLOAD_VERSION
107
+ },
108
+ 'experience:key': 'custom.ufo.critical-metrics',
109
+ 'experience:name': newUFOName,
110
+ // Browser metadata (compact nested format)
111
+ browser: browserMetadata.browser,
112
+ device: browserMetadata.device,
113
+ network: browserMetadata.network,
114
+ time: browserMetadata.time,
115
+ metrics: _objectSpread({
116
+ fp: paintMetrics.fp,
117
+ fcp: paintMetrics.fcp,
118
+ lcp: paintMetrics.lcp,
119
+ ttai: ttai,
120
+ tti: tti,
121
+ fmp: fmp,
122
+ tbt: lighthouseMetrics['metric:tbt'],
123
+ tbtObserved: lighthouseMetrics['metric:tbt:observed'],
124
+ cls: lighthouseMetrics['metric:cls'],
125
+ ttvc: ttvc !== null && ttvc !== void 0 ? ttvc : undefined,
126
+ earliestHoldStart: earliestHold !== null && earliestHold !== void 0 && earliestHold.start ? Math.round(earliestHold.start - start) : undefined,
127
+ // for interaction response
128
+ inputDelay: responsiveness !== null && responsiveness !== void 0 && responsiveness.inputDelay ? Math.round(responsiveness.inputDelay) : undefined,
129
+ inp: responsiveness !== null && responsiveness !== void 0 && responsiveness.experimentalInputToNextPaint ? Math.round(responsiveness.experimentalInputToNextPaint) : undefined
130
+ }, navigationMetrics && {
131
+ navigation: navigationMetrics
132
+ })
133
+ }, ssrSuccess !== undefined && {
134
+ ssrSuccess: ssrSuccess
135
+ }), {}, {
136
+ interactionId: interactionId,
137
+ type: type,
138
+ rate: rate,
139
+ routeName: routeName !== null && routeName !== void 0 ? routeName : undefined,
140
+ // Performance timings
141
+ start: Math.round(start),
142
+ end: Math.round(end),
143
+ // Status and outcome
144
+ status: interactionStatus.originalInteractionStatus,
145
+ abortReason: abortReason,
146
+ previousInteractionName: previousInteractionName,
147
+ isPreviousInteractionAborted: isPreviousInteractionAborted,
148
+ abortedByInteractionName: abortedByInteractionName,
149
+ pageVisibilityAtTTI: pageVisibilityAtTTI !== null && pageVisibilityAtTTI !== void 0 ? pageVisibilityAtTTI : undefined,
150
+ pageVisibilityAtTTAI: pageVisibilityAtTTAI,
151
+ // Basic error count (not detailed error count)
152
+ errorCount: interaction.errors.length
153
+ }, Object.keys(cohortingCustomData || {}).length > 0 && {
154
+ cohortingCustomData: cohortingCustomData
155
+ });
156
+ payload = {
157
+ actionSubject: 'experience',
158
+ action: 'measured',
159
+ eventType: 'operational',
160
+ source: 'measured',
161
+ tags: ['observability'],
162
+ attributes: {
163
+ properties: properties
164
+ }
165
+ };
166
+ return _context.abrupt("return", payload);
167
+ case 30:
168
+ case "end":
169
+ return _context.stop();
170
+ }
171
+ }, _callee);
172
+ }));
173
+ return _createRootCriticalMetricsPayload.apply(this, arguments);
174
+ }