@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.
- package/CHANGELOG.md +14 -0
- package/create-experimental-interaction-metrics-payload/package.json +15 -0
- package/dist/cjs/config/index.js +40 -18
- package/dist/cjs/create-experimental-interaction-metrics-payload/index.js +89 -0
- package/dist/cjs/create-payload/common/utils/index.js +85 -1
- package/dist/cjs/create-payload/index.js +37 -77
- package/dist/cjs/create-post-interaction-log-payload/index.js +1 -4
- package/dist/cjs/interaction-metrics/common/constants.js +7 -1
- package/dist/cjs/interaction-metrics/common/index.js +151 -0
- package/dist/cjs/interaction-metrics/index.js +139 -204
- package/dist/cjs/interaction-metrics/post-interaction-log.js +6 -2
- package/dist/cjs/interaction-metrics-init/index.js +27 -9
- package/dist/cjs/load-hold/UFOLoadHold.js +3 -4
- package/dist/cjs/segment/segment.js +7 -9
- package/dist/cjs/trace-pageload/index.js +2 -1
- package/dist/es2019/config/index.js +22 -0
- package/dist/es2019/create-experimental-interaction-metrics-payload/index.js +67 -0
- package/dist/es2019/create-payload/common/utils/index.js +86 -1
- package/dist/es2019/create-payload/index.js +28 -74
- package/dist/es2019/create-post-interaction-log-payload/index.js +1 -4
- package/dist/es2019/interaction-metrics/common/constants.js +6 -0
- package/dist/es2019/interaction-metrics/common/index.js +103 -0
- package/dist/es2019/interaction-metrics/index.js +92 -129
- package/dist/es2019/interaction-metrics/post-interaction-log.js +6 -2
- package/dist/es2019/interaction-metrics-init/index.js +21 -8
- package/dist/es2019/load-hold/UFOLoadHold.js +3 -4
- package/dist/es2019/segment/segment.js +6 -12
- package/dist/es2019/trace-pageload/index.js +1 -1
- package/dist/esm/config/index.js +39 -18
- package/dist/esm/create-experimental-interaction-metrics-payload/index.js +81 -0
- package/dist/esm/create-payload/common/utils/index.js +80 -1
- package/dist/esm/create-payload/index.js +33 -75
- package/dist/esm/create-post-interaction-log-payload/index.js +1 -4
- package/dist/esm/interaction-metrics/common/constants.js +6 -0
- package/dist/esm/interaction-metrics/common/index.js +132 -0
- package/dist/esm/interaction-metrics/index.js +87 -156
- package/dist/esm/interaction-metrics/post-interaction-log.js +6 -2
- package/dist/esm/interaction-metrics-init/index.js +24 -10
- package/dist/esm/load-hold/UFOLoadHold.js +3 -4
- package/dist/esm/segment/segment.js +7 -9
- package/dist/esm/trace-pageload/index.js +1 -1
- package/dist/types/common/common/types.d.ts +9 -5
- package/dist/types/config/index.d.ts +6 -0
- package/dist/types/create-experimental-interaction-metrics-payload/index.d.ts +31 -0
- package/dist/types/create-payload/common/utils/index.d.ts +12 -0
- package/dist/types/create-payload/index.d.ts +13 -5660
- package/dist/types/create-post-interaction-log-payload/index.d.ts +2 -0
- package/dist/types/interaction-metrics/common/constants.d.ts +31 -1
- package/dist/types/interaction-metrics/common/index.d.ts +16 -0
- package/dist/types/interaction-metrics/index.d.ts +4 -15
- package/dist/types/interaction-metrics/post-interaction-log.d.ts +1 -1
- package/dist/types/load-hold/UFOLoadHold.d.ts +1 -2
- package/dist/types/trace-pageload/index.d.ts +1 -0
- package/dist/types-ts4.5/common/common/types.d.ts +9 -5
- package/dist/types-ts4.5/config/index.d.ts +6 -0
- package/dist/types-ts4.5/create-experimental-interaction-metrics-payload/index.d.ts +31 -0
- package/dist/types-ts4.5/create-payload/common/utils/index.d.ts +12 -0
- package/dist/types-ts4.5/create-payload/index.d.ts +13 -5660
- package/dist/types-ts4.5/create-post-interaction-log-payload/index.d.ts +2 -0
- package/dist/types-ts4.5/interaction-metrics/common/constants.d.ts +31 -1
- package/dist/types-ts4.5/interaction-metrics/common/index.d.ts +16 -0
- package/dist/types-ts4.5/interaction-metrics/index.d.ts +4 -15
- package/dist/types-ts4.5/interaction-metrics/post-interaction-log.d.ts +1 -1
- package/dist/types-ts4.5/load-hold/UFOLoadHold.d.ts +1 -2
- package/dist/types-ts4.5/trace-pageload/index.d.ts +1 -0
- 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,
|
|
64
|
-
Promise.resolve().then(function () {
|
|
74
|
+
Promise.all([analyticsWebClientAsync, Promise.resolve().then(function () {
|
|
65
75
|
return _interopRequireWildcard(require( /* webpackChunkName: "create-payloads" */'../create-payload'));
|
|
66
|
-
}),
|
|
67
|
-
|
|
68
|
-
|
|
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,
|
|
81
|
+
var _ref2 = (0, _slicedToArray2.default)(_ref, 4),
|
|
71
82
|
awc = _ref2[0],
|
|
72
83
|
payloadPackage = _ref2[1],
|
|
73
|
-
|
|
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 &&
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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 {
|
|
16
|
-
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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
|
-
|
|
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;
|