@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.
- package/CHANGELOG.md +8 -0
- package/dist/cjs/create-payload/critical-metrics-payload/index.js +38 -0
- package/dist/cjs/create-payload/critical-metrics-payload/root-metrics.js +180 -0
- package/dist/cjs/create-payload/critical-metrics-payload/segment-metrics/create-segment-metrics.js +251 -0
- package/dist/cjs/create-payload/critical-metrics-payload/segment-metrics/get-is-root-segment.js +9 -0
- package/dist/cjs/create-payload/critical-metrics-payload/segment-metrics/get-segment-id.js +15 -0
- package/dist/cjs/create-payload/critical-metrics-payload/segment-metrics/get-segment-status.js +59 -0
- package/dist/cjs/create-payload/critical-metrics-payload/segment-metrics/has-segment-failed.js +17 -0
- package/dist/cjs/create-payload/critical-metrics-payload/segment-metrics/is-label-stack-under-segment.js +11 -0
- package/dist/cjs/create-payload/critical-metrics-payload/types.js +5 -0
- package/dist/cjs/create-payload/index.js +122 -214
- package/dist/cjs/create-payload/utils/find-matching-legacy-metric.js +15 -0
- package/dist/cjs/create-payload/utils/get-browser-metadata.js +87 -0
- package/dist/cjs/create-payload/utils/get-fmp.js +52 -0
- package/dist/cjs/create-payload/utils/get-navigation-metrics.js +66 -0
- package/dist/cjs/create-payload/utils/get-paint-metrics.js +124 -0
- package/dist/cjs/create-payload/utils/get-payload-size.js +17 -0
- package/dist/cjs/create-payload/utils/get-react-ufo-payload-version.js +3 -1
- package/dist/cjs/create-payload/utils/get-ssr-success.js +15 -0
- package/dist/cjs/create-payload/utils/get-ttai.js +14 -0
- package/dist/cjs/create-payload/utils/get-tti.js +38 -0
- package/dist/cjs/interaction-metrics/index.js +25 -0
- package/dist/es2019/create-payload/critical-metrics-payload/index.js +6 -0
- package/dist/es2019/create-payload/critical-metrics-payload/root-metrics.js +166 -0
- package/dist/es2019/create-payload/critical-metrics-payload/segment-metrics/create-segment-metrics.js +155 -0
- package/dist/es2019/create-payload/critical-metrics-payload/segment-metrics/get-is-root-segment.js +3 -0
- package/dist/es2019/create-payload/critical-metrics-payload/segment-metrics/get-segment-id.js +9 -0
- package/dist/es2019/create-payload/critical-metrics-payload/segment-metrics/get-segment-status.js +40 -0
- package/dist/es2019/create-payload/critical-metrics-payload/segment-metrics/has-segment-failed.js +10 -0
- package/dist/es2019/create-payload/critical-metrics-payload/segment-metrics/is-label-stack-under-segment.js +5 -0
- package/dist/es2019/create-payload/critical-metrics-payload/types.js +1 -0
- package/dist/es2019/create-payload/index.js +55 -151
- package/dist/es2019/create-payload/utils/find-matching-legacy-metric.js +7 -0
- package/dist/es2019/create-payload/utils/get-browser-metadata.js +79 -0
- package/dist/es2019/create-payload/utils/get-fmp.js +47 -0
- package/dist/es2019/create-payload/utils/get-navigation-metrics.js +59 -0
- package/dist/es2019/create-payload/utils/get-paint-metrics.js +78 -0
- package/dist/es2019/create-payload/utils/get-payload-size.js +11 -0
- package/dist/es2019/create-payload/utils/get-react-ufo-payload-version.js +2 -1
- package/dist/es2019/create-payload/utils/get-ssr-success.js +7 -0
- package/dist/es2019/create-payload/utils/get-ttai.js +9 -0
- package/dist/es2019/create-payload/utils/get-tti.js +35 -0
- package/dist/es2019/interaction-metrics/index.js +24 -0
- package/dist/esm/create-payload/critical-metrics-payload/index.js +31 -0
- package/dist/esm/create-payload/critical-metrics-payload/root-metrics.js +174 -0
- package/dist/esm/create-payload/critical-metrics-payload/segment-metrics/create-segment-metrics.js +244 -0
- package/dist/esm/create-payload/critical-metrics-payload/segment-metrics/get-is-root-segment.js +3 -0
- package/dist/esm/create-payload/critical-metrics-payload/segment-metrics/get-segment-id.js +9 -0
- package/dist/esm/create-payload/critical-metrics-payload/segment-metrics/get-segment-status.js +52 -0
- package/dist/esm/create-payload/critical-metrics-payload/segment-metrics/has-segment-failed.js +10 -0
- package/dist/esm/create-payload/critical-metrics-payload/segment-metrics/is-label-stack-under-segment.js +5 -0
- package/dist/esm/create-payload/critical-metrics-payload/types.js +1 -0
- package/dist/esm/create-payload/index.js +121 -210
- package/dist/esm/create-payload/utils/find-matching-legacy-metric.js +9 -0
- package/dist/esm/create-payload/utils/get-browser-metadata.js +79 -0
- package/dist/esm/create-payload/utils/get-fmp.js +47 -0
- package/dist/esm/create-payload/utils/get-navigation-metrics.js +59 -0
- package/dist/esm/create-payload/utils/get-paint-metrics.js +119 -0
- package/dist/esm/create-payload/utils/get-payload-size.js +11 -0
- package/dist/esm/create-payload/utils/get-react-ufo-payload-version.js +2 -1
- package/dist/esm/create-payload/utils/get-ssr-success.js +7 -0
- package/dist/esm/create-payload/utils/get-ttai.js +7 -0
- package/dist/esm/create-payload/utils/get-tti.js +33 -0
- package/dist/esm/interaction-metrics/index.js +24 -0
- package/dist/types/common/common/types.d.ts +1 -1
- package/dist/types/common/react-ufo-payload-schema.d.ts +23 -2
- package/dist/types/create-payload/critical-metrics-payload/index.d.ts +6 -0
- package/dist/types/create-payload/critical-metrics-payload/root-metrics.d.ts +7 -0
- package/dist/types/create-payload/critical-metrics-payload/segment-metrics/create-segment-metrics.d.ts +3 -0
- package/dist/types/create-payload/critical-metrics-payload/segment-metrics/get-is-root-segment.d.ts +2 -0
- package/dist/types/create-payload/critical-metrics-payload/segment-metrics/get-segment-id.d.ts +2 -0
- package/dist/types/create-payload/critical-metrics-payload/segment-metrics/get-segment-status.d.ts +7 -0
- package/dist/types/create-payload/critical-metrics-payload/segment-metrics/has-segment-failed.d.ts +2 -0
- package/dist/types/create-payload/critical-metrics-payload/segment-metrics/is-label-stack-under-segment.d.ts +2 -0
- package/dist/types/create-payload/critical-metrics-payload/types.d.ts +128 -0
- package/dist/types/create-payload/index.d.ts +339 -834
- package/dist/types/create-payload/utils/find-matching-legacy-metric.d.ts +5 -0
- package/dist/types/create-payload/utils/get-browser-metadata.d.ts +21 -0
- package/dist/types/create-payload/utils/get-fmp.d.ts +6 -0
- package/dist/types/create-payload/utils/get-navigation-metrics.d.ts +29 -0
- package/dist/types/create-payload/utils/get-paint-metrics.d.ts +13 -0
- package/dist/types/create-payload/utils/get-payload-size.d.ts +1 -0
- package/dist/types/create-payload/utils/get-react-ufo-payload-version.d.ts +2 -1
- package/dist/types/create-payload/utils/get-ssr-success.d.ts +2 -0
- package/dist/types/create-payload/utils/get-ttai.d.ts +2 -0
- package/dist/types/create-payload/utils/get-tti.d.ts +7 -0
- package/dist/types/interaction-metrics/index.d.ts +1 -0
- package/dist/types-ts4.5/common/common/types.d.ts +1 -1
- package/dist/types-ts4.5/common/react-ufo-payload-schema.d.ts +23 -2
- package/dist/types-ts4.5/create-payload/critical-metrics-payload/index.d.ts +6 -0
- package/dist/types-ts4.5/create-payload/critical-metrics-payload/root-metrics.d.ts +7 -0
- package/dist/types-ts4.5/create-payload/critical-metrics-payload/segment-metrics/create-segment-metrics.d.ts +3 -0
- package/dist/types-ts4.5/create-payload/critical-metrics-payload/segment-metrics/get-is-root-segment.d.ts +2 -0
- package/dist/types-ts4.5/create-payload/critical-metrics-payload/segment-metrics/get-segment-id.d.ts +2 -0
- package/dist/types-ts4.5/create-payload/critical-metrics-payload/segment-metrics/get-segment-status.d.ts +7 -0
- package/dist/types-ts4.5/create-payload/critical-metrics-payload/segment-metrics/has-segment-failed.d.ts +2 -0
- package/dist/types-ts4.5/create-payload/critical-metrics-payload/segment-metrics/is-label-stack-under-segment.d.ts +2 -0
- package/dist/types-ts4.5/create-payload/critical-metrics-payload/types.d.ts +130 -0
- package/dist/types-ts4.5/create-payload/index.d.ts +339 -834
- package/dist/types-ts4.5/create-payload/utils/find-matching-legacy-metric.d.ts +5 -0
- package/dist/types-ts4.5/create-payload/utils/get-browser-metadata.d.ts +21 -0
- package/dist/types-ts4.5/create-payload/utils/get-fmp.d.ts +6 -0
- package/dist/types-ts4.5/create-payload/utils/get-navigation-metrics.d.ts +29 -0
- package/dist/types-ts4.5/create-payload/utils/get-paint-metrics.d.ts +13 -0
- package/dist/types-ts4.5/create-payload/utils/get-payload-size.d.ts +1 -0
- package/dist/types-ts4.5/create-payload/utils/get-react-ufo-payload-version.d.ts +2 -1
- package/dist/types-ts4.5/create-payload/utils/get-ssr-success.d.ts +2 -0
- package/dist/types-ts4.5/create-payload/utils/get-ttai.d.ts +2 -0
- package/dist/types-ts4.5/create-payload/utils/get-tti.d.ts +7 -0
- package/dist/types-ts4.5/interaction-metrics/index.d.ts +1 -0
- 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
|
|
9
|
+
return LATEST_REACT_UFO_PAYLOAD_VERSION;
|
|
9
10
|
}
|
|
@@ -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
|
+
}
|