@atlaskit/react-ufo 3.14.3 → 3.14.5
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 +16 -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/cjs/vc/vc-observer-new/metric-calculator/fy25_03/index.js +3 -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/es2019/vc/vc-observer-new/metric-calculator/fy25_03/index.js +3 -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/esm/vc/vc-observer-new/metric-calculator/fy25_03/index.js +3 -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 +8 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
|
+
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
|
|
1
2
|
import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
|
|
2
3
|
import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
|
|
3
4
|
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
4
5
|
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
5
|
-
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
|
|
6
6
|
var _excluded = ["labelStack", "time"],
|
|
7
7
|
_excluded2 = ["stopTime", "labelStack"],
|
|
8
8
|
_excluded3 = ["labelStack"],
|
|
@@ -10,8 +10,11 @@ var _excluded = ["labelStack", "time"],
|
|
|
10
10
|
import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
11
11
|
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; }
|
|
12
12
|
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; }
|
|
13
|
-
import
|
|
13
|
+
import { getDocument } from '@atlaskit/browser-apis';
|
|
14
14
|
import { fg } from '@atlaskit/platform-feature-flags';
|
|
15
|
+
|
|
16
|
+
// Import common utilities
|
|
17
|
+
|
|
15
18
|
import { getLighthouseMetrics } from '../additional-payload';
|
|
16
19
|
import { CHRReporter } from '../assets';
|
|
17
20
|
import * as bundleEvalTiming from '../bundle-eval-timing';
|
|
@@ -29,10 +32,17 @@ import { filterResourceTimings } from '../resource-timing/common/utils/resource-
|
|
|
29
32
|
import { roundEpsilon } from '../round-number';
|
|
30
33
|
import * as ssr from '../ssr';
|
|
31
34
|
import { buildSegmentTree, labelStackStartWith, optimizeLabelStack, sanitizeUfoName, stringifyLabelStackFully } from './common/utils';
|
|
35
|
+
import { createCriticalMetricsPayloads } from './critical-metrics-payload';
|
|
36
|
+
import { getBrowserMetadataToLegacyFormat } from './utils/get-browser-metadata';
|
|
32
37
|
import getInteractionStatus from './utils/get-interaction-status';
|
|
38
|
+
import { getNavigationMetricsToLegacyFormat } from './utils/get-navigation-metrics';
|
|
33
39
|
import getPageVisibilityUpToTTAI from './utils/get-page-visibility-up-to-ttai';
|
|
40
|
+
import { getPaintMetricsToLegacyFormat } from './utils/get-paint-metrics';
|
|
41
|
+
import getPayloadSize from './utils/get-payload-size';
|
|
34
42
|
import { getReactUFOPayloadVersion } from './utils/get-react-ufo-payload-version';
|
|
35
43
|
import getSSRDoneTimeValue from './utils/get-ssr-done-time-value';
|
|
44
|
+
import getSSRSuccessUtil from './utils/get-ssr-success';
|
|
45
|
+
import getTTAI from './utils/get-ttai';
|
|
36
46
|
import getVCMetrics from './utils/get-vc-metrics';
|
|
37
47
|
function getUfoNameOverride(interaction) {
|
|
38
48
|
var ufoName = interaction.ufoName,
|
|
@@ -142,138 +152,12 @@ function getResourceTimings(start, end) {
|
|
|
142
152
|
function getBundleEvalTimings(start) {
|
|
143
153
|
return bundleEvalTiming.getBundleEvalTimings(start);
|
|
144
154
|
}
|
|
145
|
-
function getSSRSuccess(type) {
|
|
146
|
-
return type === 'page_load' ? ssr.getSSRSuccess() : undefined;
|
|
147
|
-
}
|
|
148
155
|
function getSSRPhaseSuccess(type) {
|
|
149
156
|
return type === 'page_load' ? ssr.getSSRPhaseSuccess() : undefined;
|
|
150
157
|
}
|
|
151
158
|
function getSSRFeatureFlags(type) {
|
|
152
159
|
return type === 'page_load' ? ssr.getSSRFeatureFlags() : undefined;
|
|
153
160
|
}
|
|
154
|
-
var getLCP = function getLCP(end) {
|
|
155
|
-
return new Promise(function (resolve) {
|
|
156
|
-
var observer;
|
|
157
|
-
var timeout = setTimeout(function () {
|
|
158
|
-
var _observer;
|
|
159
|
-
(_observer = observer) === null || _observer === void 0 || _observer.disconnect();
|
|
160
|
-
resolve(null);
|
|
161
|
-
}, 200);
|
|
162
|
-
var performanceObserverCallback = function performanceObserverCallback(list) {
|
|
163
|
-
var entries = Array.from(list.getEntries());
|
|
164
|
-
var lastEntry = entries.reduce(function (agg, entry) {
|
|
165
|
-
// Use the latest LCP candidate before TTAI
|
|
166
|
-
if (entry.startTime <= end && (agg === null || agg.startTime < entry.startTime)) {
|
|
167
|
-
return entry;
|
|
168
|
-
}
|
|
169
|
-
return agg;
|
|
170
|
-
}, null);
|
|
171
|
-
clearTimeout(timeout);
|
|
172
|
-
if (!lastEntry || lastEntry === null) {
|
|
173
|
-
resolve(null);
|
|
174
|
-
} else {
|
|
175
|
-
resolve(lastEntry.startTime);
|
|
176
|
-
}
|
|
177
|
-
};
|
|
178
|
-
observer = new PerformanceObserver(performanceObserverCallback);
|
|
179
|
-
observer.observe({
|
|
180
|
-
type: 'largest-contentful-paint',
|
|
181
|
-
buffered: true
|
|
182
|
-
});
|
|
183
|
-
});
|
|
184
|
-
};
|
|
185
|
-
function getPaintMetrics(_x, _x2) {
|
|
186
|
-
return _getPaintMetrics.apply(this, arguments);
|
|
187
|
-
}
|
|
188
|
-
function _getPaintMetrics() {
|
|
189
|
-
_getPaintMetrics = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(type, end) {
|
|
190
|
-
var metrics, lcp;
|
|
191
|
-
return _regeneratorRuntime.wrap(function _callee$(_context) {
|
|
192
|
-
while (1) switch (_context.prev = _context.next) {
|
|
193
|
-
case 0:
|
|
194
|
-
if (!(type !== 'page_load')) {
|
|
195
|
-
_context.next = 2;
|
|
196
|
-
break;
|
|
197
|
-
}
|
|
198
|
-
return _context.abrupt("return", {});
|
|
199
|
-
case 2:
|
|
200
|
-
metrics = {};
|
|
201
|
-
performance.getEntriesByType('paint').forEach(function (entry) {
|
|
202
|
-
if (entry.name === 'first-paint') {
|
|
203
|
-
metrics['metric:fp'] = Math.round(entry.startTime);
|
|
204
|
-
}
|
|
205
|
-
if (entry.name === 'first-contentful-paint') {
|
|
206
|
-
metrics['metric:fcp'] = Math.round(entry.startTime);
|
|
207
|
-
}
|
|
208
|
-
});
|
|
209
|
-
_context.next = 6;
|
|
210
|
-
return getLCP(end);
|
|
211
|
-
case 6:
|
|
212
|
-
lcp = _context.sent;
|
|
213
|
-
if (lcp) {
|
|
214
|
-
metrics['metric:lcp'] = Math.round(lcp);
|
|
215
|
-
}
|
|
216
|
-
return _context.abrupt("return", metrics);
|
|
217
|
-
case 9:
|
|
218
|
-
case "end":
|
|
219
|
-
return _context.stop();
|
|
220
|
-
}
|
|
221
|
-
}, _callee);
|
|
222
|
-
}));
|
|
223
|
-
return _getPaintMetrics.apply(this, arguments);
|
|
224
|
-
}
|
|
225
|
-
function getTTAI(interaction) {
|
|
226
|
-
var start = interaction.start,
|
|
227
|
-
end = interaction.end;
|
|
228
|
-
var pageVisibilityUpToTTAI = getPageVisibilityUpToTTAI(interaction);
|
|
229
|
-
return !interaction.abortReason && pageVisibilityUpToTTAI === 'visible' ? Math.round(end - start) : undefined;
|
|
230
|
-
}
|
|
231
|
-
function getNavigationMetrics(type) {
|
|
232
|
-
if (type !== 'page_load') {
|
|
233
|
-
return {};
|
|
234
|
-
}
|
|
235
|
-
var entries = performance.getEntriesByType('navigation');
|
|
236
|
-
if (entries.length === 0) {
|
|
237
|
-
return {};
|
|
238
|
-
}
|
|
239
|
-
var navigation = entries[0];
|
|
240
|
-
var metrics = {
|
|
241
|
-
// From https://www.w3.org/TR/resource-timing/
|
|
242
|
-
redirectStart: Math.round(navigation.redirectStart),
|
|
243
|
-
redirectEnd: Math.round(navigation.redirectEnd),
|
|
244
|
-
fetchStart: Math.round(navigation.fetchStart),
|
|
245
|
-
domainLookupStart: Math.round(navigation.domainLookupStart),
|
|
246
|
-
domainLookupEnd: Math.round(navigation.domainLookupEnd),
|
|
247
|
-
connectStart: Math.round(navigation.connectStart),
|
|
248
|
-
connectEnd: Math.round(navigation.connectEnd),
|
|
249
|
-
secureConnectionStart: Math.round(navigation.secureConnectionStart),
|
|
250
|
-
requestStart: Math.round(navigation.requestStart),
|
|
251
|
-
responseStart: Math.round(navigation.responseStart),
|
|
252
|
-
responseEnd: Math.round(navigation.responseEnd),
|
|
253
|
-
encodedBodySize: Math.round(navigation.encodedBodySize),
|
|
254
|
-
decodedBodySize: Math.round(navigation.decodedBodySize),
|
|
255
|
-
transferSize: Math.round(navigation.transferSize),
|
|
256
|
-
// From https://www.w3.org/TR/navigation-timing-2/
|
|
257
|
-
redirectCount: navigation.redirectCount,
|
|
258
|
-
type: navigation.type,
|
|
259
|
-
unloadEventEnd: Math.round(navigation.unloadEventEnd),
|
|
260
|
-
unloadEventStart: Math.round(navigation.unloadEventStart),
|
|
261
|
-
workerStart: Math.round(navigation.workerStart),
|
|
262
|
-
nextHopProtocol: navigation.nextHopProtocol
|
|
263
|
-
|
|
264
|
-
// The following properties are ignored because they provided limited value on a modern stack (e.g. the content
|
|
265
|
-
// is usually rendered and interactive before the dom is fully parsed, dont't play well with streamed content...)
|
|
266
|
-
// * domComplete
|
|
267
|
-
// * domContentLoadedEventEnd
|
|
268
|
-
// * domContentLoadedEventStart
|
|
269
|
-
// * domInteractive
|
|
270
|
-
// * loadEventEnd
|
|
271
|
-
// * loadEventStart
|
|
272
|
-
};
|
|
273
|
-
return {
|
|
274
|
-
'metrics:navigation': metrics
|
|
275
|
-
};
|
|
276
|
-
}
|
|
277
161
|
function getPPSMetrics(interaction) {
|
|
278
162
|
var _interaction$apdex;
|
|
279
163
|
var start = interaction.start,
|
|
@@ -304,7 +188,7 @@ function getPPSMetrics(interaction) {
|
|
|
304
188
|
function getSSRProperties(type) {
|
|
305
189
|
var ssrPhases = getSSRPhaseSuccess(type);
|
|
306
190
|
return _objectSpread(_objectSpread({
|
|
307
|
-
'ssr:success':
|
|
191
|
+
'ssr:success': getSSRSuccessUtil(type),
|
|
308
192
|
'ssr:featureFlags': getSSRFeatureFlags(type)
|
|
309
193
|
}, (ssrPhases === null || ssrPhases === void 0 ? void 0 : ssrPhases.earlyFlush) != null ? {
|
|
310
194
|
'ssr:earlyflush:success': ssrPhases.earlyFlush
|
|
@@ -337,33 +221,6 @@ function getAssetsMetrics(interaction, SSRDoneTime) {
|
|
|
337
221
|
return {};
|
|
338
222
|
}
|
|
339
223
|
}
|
|
340
|
-
function getBrowserMetadata() {
|
|
341
|
-
var data = {};
|
|
342
|
-
var now = new Date();
|
|
343
|
-
data['event:localHour'] = now.getHours(); // returns the hours for this date according to local time
|
|
344
|
-
data['event:localDayOfWeek'] = now.getDay(); // Sunday - Saturday : 0 - 6
|
|
345
|
-
data['event:localTimezoneOffset'] = now.getTimezoneOffset(); // A number representing the difference, in minutes, between the date as evaluated in the UTC time zone and as evaluated in the local time zone.
|
|
346
|
-
|
|
347
|
-
if (navigator.userAgent != null) {
|
|
348
|
-
var browser = Bowser.getParser(navigator.userAgent);
|
|
349
|
-
data['event:browser:name'] = browser.getBrowserName();
|
|
350
|
-
data['event:browser:version'] = browser.getBrowserVersion();
|
|
351
|
-
}
|
|
352
|
-
if (navigator.hardwareConcurrency != null) {
|
|
353
|
-
data['event:cpus'] = navigator.hardwareConcurrency;
|
|
354
|
-
}
|
|
355
|
-
if (navigator.deviceMemory != null) {
|
|
356
|
-
data['event:memory'] = navigator.deviceMemory;
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
// eslint-disable-next-line compat/compat
|
|
360
|
-
if (navigator.connection != null) {
|
|
361
|
-
data['event:network:effectiveType'] = navigator.connection.effectiveType;
|
|
362
|
-
data['event:network:rtt'] = navigator.connection.rtt;
|
|
363
|
-
data['event:network:downlink'] = navigator.connection.downlink;
|
|
364
|
-
}
|
|
365
|
-
return data;
|
|
366
|
-
}
|
|
367
224
|
function getTracingContextData(interaction) {
|
|
368
225
|
var trace = interaction.trace,
|
|
369
226
|
start = interaction.start;
|
|
@@ -382,6 +239,7 @@ function getTracingContextData(interaction) {
|
|
|
382
239
|
}
|
|
383
240
|
function optimizeCustomData(interaction) {
|
|
384
241
|
var customData = interaction.customData,
|
|
242
|
+
cohortingCustomData = interaction.cohortingCustomData,
|
|
385
243
|
legacyMetrics = interaction.legacyMetrics;
|
|
386
244
|
var customDataMap = customData.reduce(function (result, _ref2) {
|
|
387
245
|
var _result$get$data, _result$get;
|
|
@@ -395,6 +253,17 @@ function optimizeCustomData(interaction) {
|
|
|
395
253
|
});
|
|
396
254
|
return result;
|
|
397
255
|
}, new Map());
|
|
256
|
+
|
|
257
|
+
// Merge cohorting custom data into the same map
|
|
258
|
+
if (cohortingCustomData && cohortingCustomData.size > 0) {
|
|
259
|
+
var _interaction$labelSta, _customDataMap$get$da, _customDataMap$get, _interaction$labelSta2;
|
|
260
|
+
var label = stringifyLabelStackFully((_interaction$labelSta = interaction.labelStack) !== null && _interaction$labelSta !== void 0 ? _interaction$labelSta : []);
|
|
261
|
+
var value = (_customDataMap$get$da = (_customDataMap$get = customDataMap.get(label)) === null || _customDataMap$get === void 0 ? void 0 : _customDataMap$get.data) !== null && _customDataMap$get$da !== void 0 ? _customDataMap$get$da : {};
|
|
262
|
+
customDataMap.set(label, {
|
|
263
|
+
labelStack: optimizeLabelStack((_interaction$labelSta2 = interaction.labelStack) !== null && _interaction$labelSta2 !== void 0 ? _interaction$labelSta2 : [], getReactUFOPayloadVersion(interaction.type)),
|
|
264
|
+
data: Object.assign(value, Object.fromEntries(cohortingCustomData))
|
|
265
|
+
});
|
|
266
|
+
}
|
|
398
267
|
if (legacyMetrics) {
|
|
399
268
|
var legacyMetricsFiltered = legacyMetrics.filter(function (item) {
|
|
400
269
|
return item.type === 'PAGE_LOAD';
|
|
@@ -403,12 +272,12 @@ function optimizeCustomData(interaction) {
|
|
|
403
272
|
var _result$get$data2, _result$get2;
|
|
404
273
|
var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2),
|
|
405
274
|
key = _Object$entries$_i[0],
|
|
406
|
-
|
|
407
|
-
var
|
|
408
|
-
var labelValue = (_result$get$data2 = (_result$get2 = result.get(
|
|
409
|
-
result.set(
|
|
275
|
+
_value = _Object$entries$_i[1];
|
|
276
|
+
var _label = stringifyLabelStackFully([]);
|
|
277
|
+
var labelValue = (_result$get$data2 = (_result$get2 = result.get(_label)) === null || _result$get2 === void 0 ? void 0 : _result$get2.data) !== null && _result$get$data2 !== void 0 ? _result$get$data2 : {};
|
|
278
|
+
result.set(_label, {
|
|
410
279
|
labelStack: optimizeLabelStack([], getReactUFOPayloadVersion(interaction.type)),
|
|
411
|
-
data: Object.assign(labelValue, _defineProperty({}, key,
|
|
280
|
+
data: Object.assign(labelValue, _defineProperty({}, key, _value))
|
|
412
281
|
});
|
|
413
282
|
}
|
|
414
283
|
return result;
|
|
@@ -646,14 +515,15 @@ function getBm3TrackerTimings(interaction) {
|
|
|
646
515
|
legacyMetrics: legacyMetrics
|
|
647
516
|
};
|
|
648
517
|
}
|
|
649
|
-
function getPayloadSize(payload) {
|
|
650
|
-
return Math.round(new TextEncoder().encode(JSON.stringify(payload)).length / 1024);
|
|
651
|
-
}
|
|
652
518
|
function getStylesheetMetrics() {
|
|
653
519
|
try {
|
|
654
|
-
var
|
|
520
|
+
var doc = getDocument();
|
|
521
|
+
if (!doc) {
|
|
522
|
+
return {};
|
|
523
|
+
}
|
|
524
|
+
var stylesheets = Array.from(doc.styleSheets);
|
|
655
525
|
var stylesheetCount = stylesheets.length;
|
|
656
|
-
var cssrules = Array.from(
|
|
526
|
+
var cssrules = Array.from(doc.styleSheets).reduce(function (acc, item) {
|
|
657
527
|
// Other domain stylesheets throw a SecurityError
|
|
658
528
|
try {
|
|
659
529
|
return acc + item.cssRules.length;
|
|
@@ -661,9 +531,9 @@ function getStylesheetMetrics() {
|
|
|
661
531
|
return acc;
|
|
662
532
|
}
|
|
663
533
|
}, 0);
|
|
664
|
-
var styleElements =
|
|
665
|
-
var styleProps =
|
|
666
|
-
var styleDeclarations = Array.from(
|
|
534
|
+
var styleElements = doc.querySelectorAll('style').length;
|
|
535
|
+
var styleProps = doc.querySelectorAll('[style]');
|
|
536
|
+
var styleDeclarations = Array.from(doc.querySelectorAll('[style]')).reduce(function (acc, item) {
|
|
667
537
|
try {
|
|
668
538
|
if ('style' in item) {
|
|
669
539
|
return acc + item.style.length;
|
|
@@ -693,20 +563,20 @@ function getErrorCounts(interaction) {
|
|
|
693
563
|
'ufo:errors:count': interaction.errors.length
|
|
694
564
|
};
|
|
695
565
|
}
|
|
696
|
-
function createInteractionMetricsPayload(_x3, _x4, _x5) {
|
|
566
|
+
function createInteractionMetricsPayload(_x, _x2, _x3, _x4, _x5) {
|
|
697
567
|
return _createInteractionMetricsPayload.apply(this, arguments);
|
|
698
568
|
}
|
|
699
569
|
function _createInteractionMetricsPayload() {
|
|
700
|
-
_createInteractionMetricsPayload = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function
|
|
570
|
+
_createInteractionMetricsPayload = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(interaction, interactionId, experimental, criticalPayloadCount, vcMetrics) {
|
|
701
571
|
var _window$location, _config$additionalPay;
|
|
702
|
-
var interactionPayloadStart, config, end, start, ufoName, knownSegments, rate, type, abortReason, routeName, featureFlags, previousInteractionName, isPreviousInteractionAborted, abortedByInteractionName, responsiveness, unknownElementName, unknownElementHierarchy, pageVisibilityAtTTI, pageVisibilityAtTTAI, segments, segmentTree, isDetailedPayload, isPageLoad, calculatePageVisibilityFromTheStartOfPageLoad, moreAccuratePageVisibilityAtTTI, moreAccuratePageVisibilityAtTTAI, labelStack, getInitialPageLoadSSRMetrics, pageLoadInteractionMetrics, getDetailedInteractionMetrics, getPageLoadDetailedInteractionMetrics, newUFOName, resourceTimings, _yield$Promise$all, _yield$Promise$all2,
|
|
703
|
-
return _regeneratorRuntime.wrap(function
|
|
704
|
-
while (1) switch (
|
|
572
|
+
var interactionPayloadStart, config, end, start, ufoName, knownSegments, rate, type, abortReason, routeName, featureFlags, previousInteractionName, isPreviousInteractionAborted, abortedByInteractionName, responsiveness, unknownElementName, unknownElementHierarchy, pageVisibilityAtTTI, pageVisibilityAtTTAI, segments, segmentTree, isDetailedPayload, isPageLoad, calculatePageVisibilityFromTheStartOfPageLoad, moreAccuratePageVisibilityAtTTI, moreAccuratePageVisibilityAtTTAI, labelStack, getInitialPageLoadSSRMetrics, pageLoadInteractionMetrics, getDetailedInteractionMetrics, getPageLoadDetailedInteractionMetrics, newUFOName, resourceTimings, _yield$Promise$all, _yield$Promise$all2, finalVCMetrics, experimentalMetrics, paintMetrics, payload;
|
|
573
|
+
return _regeneratorRuntime.wrap(function _callee$(_context) {
|
|
574
|
+
while (1) switch (_context.prev = _context.next) {
|
|
705
575
|
case 0:
|
|
706
576
|
interactionPayloadStart = performance.now();
|
|
707
577
|
config = getConfig();
|
|
708
578
|
if (config) {
|
|
709
|
-
|
|
579
|
+
_context.next = 4;
|
|
710
580
|
break;
|
|
711
581
|
}
|
|
712
582
|
throw Error('UFO Configuration not provided');
|
|
@@ -784,12 +654,27 @@ function _createInteractionMetricsPayload() {
|
|
|
784
654
|
}
|
|
785
655
|
newUFOName = sanitizeUfoName(ufoName);
|
|
786
656
|
resourceTimings = getResourceTimings(start, end);
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
657
|
+
_context.t0 = Promise;
|
|
658
|
+
_context.t1 = vcMetrics;
|
|
659
|
+
if (_context.t1) {
|
|
660
|
+
_context.next = 28;
|
|
661
|
+
break;
|
|
662
|
+
}
|
|
663
|
+
_context.next = 27;
|
|
664
|
+
return getVCMetrics(interaction);
|
|
665
|
+
case 27:
|
|
666
|
+
_context.t1 = _context.sent;
|
|
667
|
+
case 28:
|
|
668
|
+
_context.t2 = _context.t1;
|
|
669
|
+
_context.t3 = experimental ? getExperimentalVCMetrics(interaction) : Promise.resolve(undefined);
|
|
670
|
+
_context.t4 = getPaintMetricsToLegacyFormat(type, end);
|
|
671
|
+
_context.t5 = [_context.t2, _context.t3, _context.t4];
|
|
672
|
+
_context.next = 34;
|
|
673
|
+
return _context.t0.all.call(_context.t0, _context.t5);
|
|
674
|
+
case 34:
|
|
675
|
+
_yield$Promise$all = _context.sent;
|
|
791
676
|
_yield$Promise$all2 = _slicedToArray(_yield$Promise$all, 3);
|
|
792
|
-
|
|
677
|
+
finalVCMetrics = _yield$Promise$all2[0];
|
|
793
678
|
experimentalMetrics = _yield$Promise$all2[1];
|
|
794
679
|
paintMetrics = _yield$Promise$all2[2];
|
|
795
680
|
payload = {
|
|
@@ -799,7 +684,7 @@ function _createInteractionMetricsPayload() {
|
|
|
799
684
|
source: 'measured',
|
|
800
685
|
tags: ['observability'],
|
|
801
686
|
attributes: {
|
|
802
|
-
properties: _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
|
|
687
|
+
properties: _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
|
|
803
688
|
// basic
|
|
804
689
|
'event:hostname': ((_window$location = window.location) === null || _window$location === void 0 ? void 0 : _window$location.hostname) || 'unknown',
|
|
805
690
|
'event:product': config.product,
|
|
@@ -816,7 +701,10 @@ function _createInteractionMetricsPayload() {
|
|
|
816
701
|
'event:cpu:usage': createPressureStateReport(interaction.start, interaction.end)
|
|
817
702
|
} : {}), fg('platform_ufo_report_memory_usage') ? {
|
|
818
703
|
'event:memory:usage': createMemoryStateReport(interaction.start, interaction.end)
|
|
819
|
-
} : {}),
|
|
704
|
+
} : {}), criticalPayloadCount !== undefined ? {
|
|
705
|
+
'ufo:multipayload': true,
|
|
706
|
+
'ufo:criticalPayloadCount': criticalPayloadCount
|
|
707
|
+
} : {}), getBrowserMetadataToLegacyFormat()), getSSRProperties(type)), getAssetsMetrics(interaction, pageLoadInteractionMetrics === null || pageLoadInteractionMetrics === void 0 ? void 0 : pageLoadInteractionMetrics.SSRDoneTime)), getPPSMetrics(interaction)), paintMetrics), getNavigationMetricsToLegacyFormat(type)), finalVCMetrics), experimentalMetrics), (_config$additionalPay = config.additionalPayloadData) === null || _config$additionalPay === void 0 ? void 0 : _config$additionalPay.call(config, interaction)), getTracingContextData(interaction)), getStylesheetMetrics()), getErrorCounts(interaction)), {}, {
|
|
820
708
|
interactionMetrics: _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
|
|
821
709
|
namePrefix: config.namePrefix || '',
|
|
822
710
|
segmentPrefix: config.segmentPrefix || '',
|
|
@@ -867,12 +755,12 @@ function _createInteractionMetricsPayload() {
|
|
|
867
755
|
expTTAI = undefined;
|
|
868
756
|
}
|
|
869
757
|
payload.attributes.properties['event:sizeInKb'] = getPayloadSize(payload.attributes.properties);
|
|
870
|
-
return
|
|
871
|
-
case
|
|
758
|
+
return _context.abrupt("return", payload);
|
|
759
|
+
case 43:
|
|
872
760
|
case "end":
|
|
873
|
-
return
|
|
761
|
+
return _context.stop();
|
|
874
762
|
}
|
|
875
|
-
},
|
|
763
|
+
}, _callee);
|
|
876
764
|
}));
|
|
877
765
|
return _createInteractionMetricsPayload.apply(this, arguments);
|
|
878
766
|
}
|
|
@@ -880,25 +768,48 @@ export function createPayloads(_x6, _x7) {
|
|
|
880
768
|
return _createPayloads.apply(this, arguments);
|
|
881
769
|
}
|
|
882
770
|
function _createPayloads() {
|
|
883
|
-
_createPayloads = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function
|
|
884
|
-
var ufoNameOverride, modifiedInteraction, interactionMetricsPayload;
|
|
885
|
-
return _regeneratorRuntime.wrap(function
|
|
886
|
-
while (1) switch (
|
|
771
|
+
_createPayloads = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(interactionId, interaction) {
|
|
772
|
+
var ufoNameOverride, modifiedInteraction, payloads, isCriticalMetricsEnabled, vcMetrics, criticalMetricsPayloads, criticalPayloadCount, interactionMetricsPayload;
|
|
773
|
+
return _regeneratorRuntime.wrap(function _callee2$(_context2) {
|
|
774
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
887
775
|
case 0:
|
|
888
776
|
ufoNameOverride = getUfoNameOverride(interaction);
|
|
889
777
|
modifiedInteraction = _objectSpread(_objectSpread({}, interaction), {}, {
|
|
890
778
|
ufoName: ufoNameOverride
|
|
891
779
|
});
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
return _context3.abrupt("return", [interactionMetricsPayload]);
|
|
780
|
+
payloads = [];
|
|
781
|
+
isCriticalMetricsEnabled = fg('platform_ufo_critical_metrics_payload'); // Calculate VC metrics once to avoid duplicate expensive calculations
|
|
782
|
+
_context2.next = 6;
|
|
783
|
+
return getVCMetrics(interaction);
|
|
897
784
|
case 6:
|
|
785
|
+
vcMetrics = _context2.sent;
|
|
786
|
+
if (!isCriticalMetricsEnabled) {
|
|
787
|
+
_context2.next = 13;
|
|
788
|
+
break;
|
|
789
|
+
}
|
|
790
|
+
_context2.next = 10;
|
|
791
|
+
return createCriticalMetricsPayloads(interactionId, interaction, vcMetrics);
|
|
792
|
+
case 10:
|
|
793
|
+
_context2.t0 = _context2.sent;
|
|
794
|
+
_context2.next = 14;
|
|
795
|
+
break;
|
|
796
|
+
case 13:
|
|
797
|
+
_context2.t0 = [];
|
|
798
|
+
case 14:
|
|
799
|
+
criticalMetricsPayloads = _context2.t0;
|
|
800
|
+
payloads.push.apply(payloads, _toConsumableArray(criticalMetricsPayloads));
|
|
801
|
+
criticalPayloadCount = isCriticalMetricsEnabled ? criticalMetricsPayloads.length : undefined;
|
|
802
|
+
_context2.next = 19;
|
|
803
|
+
return createInteractionMetricsPayload(modifiedInteraction, interactionId, undefined, criticalPayloadCount, vcMetrics);
|
|
804
|
+
case 19:
|
|
805
|
+
interactionMetricsPayload = _context2.sent;
|
|
806
|
+
payloads.push(interactionMetricsPayload);
|
|
807
|
+
return _context2.abrupt("return", payloads.filter(Boolean));
|
|
808
|
+
case 22:
|
|
898
809
|
case "end":
|
|
899
|
-
return
|
|
810
|
+
return _context2.stop();
|
|
900
811
|
}
|
|
901
|
-
},
|
|
812
|
+
}, _callee2);
|
|
902
813
|
}));
|
|
903
814
|
return _createPayloads.apply(this, arguments);
|
|
904
815
|
}
|
|
@@ -906,14 +817,14 @@ export function createExperimentalMetricsPayload(_x8, _x9) {
|
|
|
906
817
|
return _createExperimentalMetricsPayload.apply(this, arguments);
|
|
907
818
|
}
|
|
908
819
|
function _createExperimentalMetricsPayload() {
|
|
909
|
-
_createExperimentalMetricsPayload = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function
|
|
820
|
+
_createExperimentalMetricsPayload = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(interactionId, interaction) {
|
|
910
821
|
var config, ufoName, rate, pageVisibilityState, result;
|
|
911
|
-
return _regeneratorRuntime.wrap(function
|
|
912
|
-
while (1) switch (
|
|
822
|
+
return _regeneratorRuntime.wrap(function _callee3$(_context3) {
|
|
823
|
+
while (1) switch (_context3.prev = _context3.next) {
|
|
913
824
|
case 0:
|
|
914
825
|
config = getConfig();
|
|
915
826
|
if (config) {
|
|
916
|
-
|
|
827
|
+
_context3.next = 3;
|
|
917
828
|
break;
|
|
918
829
|
}
|
|
919
830
|
throw Error('UFO Configuration not provided');
|
|
@@ -921,28 +832,28 @@ function _createExperimentalMetricsPayload() {
|
|
|
921
832
|
ufoName = sanitizeUfoName(interaction.ufoName);
|
|
922
833
|
rate = getExperimentalInteractionRate(ufoName, interaction.type);
|
|
923
834
|
if (coinflip(rate)) {
|
|
924
|
-
|
|
835
|
+
_context3.next = 7;
|
|
925
836
|
break;
|
|
926
837
|
}
|
|
927
|
-
return
|
|
838
|
+
return _context3.abrupt("return", null);
|
|
928
839
|
case 7:
|
|
929
840
|
pageVisibilityState = getPageVisibilityState(interaction.start, interaction.end);
|
|
930
841
|
if (!(pageVisibilityState !== 'visible')) {
|
|
931
|
-
|
|
842
|
+
_context3.next = 10;
|
|
932
843
|
break;
|
|
933
844
|
}
|
|
934
|
-
return
|
|
845
|
+
return _context3.abrupt("return", null);
|
|
935
846
|
case 10:
|
|
936
|
-
|
|
847
|
+
_context3.next = 12;
|
|
937
848
|
return createInteractionMetricsPayload(interaction, interactionId, true);
|
|
938
849
|
case 12:
|
|
939
|
-
result =
|
|
940
|
-
return
|
|
850
|
+
result = _context3.sent;
|
|
851
|
+
return _context3.abrupt("return", result);
|
|
941
852
|
case 14:
|
|
942
853
|
case "end":
|
|
943
|
-
return
|
|
854
|
+
return _context3.stop();
|
|
944
855
|
}
|
|
945
|
-
},
|
|
856
|
+
}, _callee3);
|
|
946
857
|
}));
|
|
947
858
|
return _createExperimentalMetricsPayload.apply(this, arguments);
|
|
948
859
|
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Find matching legacy metric by experience name and type
|
|
3
|
+
*/
|
|
4
|
+
export function findMatchingLegacyMetric(interaction, experienceName) {
|
|
5
|
+
var _interaction$legacyMe;
|
|
6
|
+
return (_interaction$legacyMe = interaction.legacyMetrics) === null || _interaction$legacyMe === void 0 ? void 0 : _interaction$legacyMe.find(function (metric) {
|
|
7
|
+
return (metric.key === experienceName || metric.config.reactUFOName === experienceName) && metric.type === 'PAGE_LOAD';
|
|
8
|
+
});
|
|
9
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import Bowser from 'bowser-ultralight';
|
|
2
|
+
export default function getBrowserMetadata() {
|
|
3
|
+
var data = {
|
|
4
|
+
time: {
|
|
5
|
+
localHour: 0,
|
|
6
|
+
localDayOfWeek: 0,
|
|
7
|
+
localTimezoneOffset: 0
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
var now = new Date();
|
|
11
|
+
data.time.localHour = now.getHours(); // returns the hours for this date according to local time
|
|
12
|
+
data.time.localDayOfWeek = now.getDay(); // Sunday - Saturday : 0 - 6
|
|
13
|
+
data.time.localTimezoneOffset = now.getTimezoneOffset(); // A number representing the difference, in minutes, between the date as evaluated in the UTC time zone and as evaluated in the local time zone.
|
|
14
|
+
|
|
15
|
+
if (typeof navigator !== 'undefined' && navigator.userAgent != null) {
|
|
16
|
+
var browser = Bowser.getParser(navigator.userAgent);
|
|
17
|
+
data.browser = {
|
|
18
|
+
name: browser.getBrowserName(),
|
|
19
|
+
version: browser.getBrowserVersion()
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
if (typeof navigator !== 'undefined' && navigator.hardwareConcurrency != null) {
|
|
23
|
+
if (!data.device) {
|
|
24
|
+
data.device = {};
|
|
25
|
+
}
|
|
26
|
+
data.device.cpus = navigator.hardwareConcurrency;
|
|
27
|
+
}
|
|
28
|
+
if (typeof navigator !== 'undefined' && navigator.deviceMemory != null) {
|
|
29
|
+
if (!data.device) {
|
|
30
|
+
data.device = {};
|
|
31
|
+
}
|
|
32
|
+
data.device.memory = navigator.deviceMemory;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// eslint-disable-next-line compat/compat
|
|
36
|
+
if (typeof navigator !== 'undefined' && navigator.connection != null) {
|
|
37
|
+
data.network = {
|
|
38
|
+
effectiveType: navigator.connection.effectiveType,
|
|
39
|
+
rtt: navigator.connection.rtt,
|
|
40
|
+
downlink: navigator.connection.downlink
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
return data;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Helper function to get browser metadata in legacy colon format for backward compatibility
|
|
47
|
+
export function getBrowserMetadataToLegacyFormat() {
|
|
48
|
+
var metadata = getBrowserMetadata();
|
|
49
|
+
var legacyFormat = {};
|
|
50
|
+
|
|
51
|
+
// Time data
|
|
52
|
+
legacyFormat['event:localHour'] = metadata.time.localHour;
|
|
53
|
+
legacyFormat['event:localDayOfWeek'] = metadata.time.localDayOfWeek;
|
|
54
|
+
legacyFormat['event:localTimezoneOffset'] = metadata.time.localTimezoneOffset;
|
|
55
|
+
|
|
56
|
+
// Browser data
|
|
57
|
+
if (metadata.browser) {
|
|
58
|
+
legacyFormat['event:browser:name'] = metadata.browser.name;
|
|
59
|
+
legacyFormat['event:browser:version'] = metadata.browser.version;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Device data
|
|
63
|
+
if (metadata.device) {
|
|
64
|
+
if (metadata.device.cpus !== undefined) {
|
|
65
|
+
legacyFormat['event:cpus'] = metadata.device.cpus;
|
|
66
|
+
}
|
|
67
|
+
if (metadata.device.memory !== undefined) {
|
|
68
|
+
legacyFormat['event:memory'] = metadata.device.memory;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Network data
|
|
73
|
+
if (metadata.network) {
|
|
74
|
+
legacyFormat['event:network:effectiveType'] = metadata.network.effectiveType;
|
|
75
|
+
legacyFormat['event:network:rtt'] = metadata.network.rtt;
|
|
76
|
+
legacyFormat['event:network:downlink'] = metadata.network.downlink;
|
|
77
|
+
}
|
|
78
|
+
return legacyFormat;
|
|
79
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { getConfig } from '../../config';
|
|
2
|
+
import { findMatchingLegacyMetric } from './find-matching-legacy-metric';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Calculate FMP (First Meaningful Paint) based on interaction type and configuration
|
|
6
|
+
* FMP is calculated based on legacy metrics or marks depending on interaction type and configuration
|
|
7
|
+
*/
|
|
8
|
+
export function getFMP(interaction, experienceName) {
|
|
9
|
+
var _config$ssr, _config$ssr$getSSRDon, _config$ssr2;
|
|
10
|
+
var start = interaction.start,
|
|
11
|
+
type = interaction.type,
|
|
12
|
+
marks = interaction.marks;
|
|
13
|
+
var config = getConfig();
|
|
14
|
+
var ssrDoneTime = config === null || config === void 0 || (_config$ssr = config.ssr) === null || _config$ssr === void 0 || (_config$ssr$getSSRDon = _config$ssr.getSSRDoneTime) === null || _config$ssr$getSSRDon === void 0 ? void 0 : _config$ssr$getSSRDon.call(_config$ssr);
|
|
15
|
+
var isBM3ConfigSSRDoneAsFmp = interaction.metaData.__legacy__bm3ConfigSSRDoneAsFmp;
|
|
16
|
+
var isUFOConfigSSRDoneAsFmp = interaction.metaData.__legacy__bm3ConfigSSRDoneAsFmp || !!(config !== null && config !== void 0 && (_config$ssr2 = config.ssr) !== null && _config$ssr2 !== void 0 && _config$ssr2.getSSRDoneTime);
|
|
17
|
+
|
|
18
|
+
// Find matching legacy metric
|
|
19
|
+
var matchingLegacyMetric = findMatchingLegacyMetric(interaction, experienceName);
|
|
20
|
+
var fmp;
|
|
21
|
+
if (type === 'page_load' || type === 'transition') {
|
|
22
|
+
if (interaction.legacyMetrics && matchingLegacyMetric) {
|
|
23
|
+
// Check if legacy metric has FMP
|
|
24
|
+
var legacyFmp = matchingLegacyMetric.fmp; // BM3Event doesn't have fmp in types, but it might exist
|
|
25
|
+
if (legacyFmp) {
|
|
26
|
+
fmp = Math.round(legacyFmp - start);
|
|
27
|
+
}
|
|
28
|
+
// If no FMP in legacy metric, return undefined (don't calculate fallback)
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (type === 'page_load' && fmp === undefined) {
|
|
32
|
+
if (isBM3ConfigSSRDoneAsFmp || isUFOConfigSSRDoneAsFmp) {
|
|
33
|
+
var _marks$find;
|
|
34
|
+
var foundMark = marks === null || marks === void 0 || (_marks$find = marks.find(function (mark) {
|
|
35
|
+
return mark.name === 'fmp';
|
|
36
|
+
})) === null || _marks$find === void 0 ? void 0 : _marks$find.time;
|
|
37
|
+
if (foundMark) {
|
|
38
|
+
fmp = Math.round(foundMark - start);
|
|
39
|
+
} else if (ssrDoneTime) {
|
|
40
|
+
fmp = Math.round(ssrDoneTime - start);
|
|
41
|
+
}
|
|
42
|
+
// If no FMP mark and no SSR done time, fmp remains undefined
|
|
43
|
+
}
|
|
44
|
+
// If not using SSR config, fmp remains undefined for page_load without legacy metrics
|
|
45
|
+
}
|
|
46
|
+
return fmp;
|
|
47
|
+
}
|