@atlaskit/react-ufo 3.14.2 → 3.14.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/cjs/create-payload/common/utils/index.js +9 -3
  3. package/dist/cjs/create-payload/critical-metrics-payload/index.js +38 -0
  4. package/dist/cjs/create-payload/critical-metrics-payload/root-metrics.js +180 -0
  5. package/dist/cjs/create-payload/critical-metrics-payload/segment-metrics/create-segment-metrics.js +251 -0
  6. package/dist/cjs/create-payload/critical-metrics-payload/segment-metrics/get-is-root-segment.js +9 -0
  7. package/dist/cjs/create-payload/critical-metrics-payload/segment-metrics/get-segment-id.js +15 -0
  8. package/dist/cjs/create-payload/critical-metrics-payload/segment-metrics/get-segment-status.js +59 -0
  9. package/dist/cjs/create-payload/critical-metrics-payload/segment-metrics/has-segment-failed.js +17 -0
  10. package/dist/cjs/create-payload/critical-metrics-payload/segment-metrics/is-label-stack-under-segment.js +11 -0
  11. package/dist/cjs/create-payload/critical-metrics-payload/types.js +5 -0
  12. package/dist/cjs/create-payload/index.js +122 -214
  13. package/dist/cjs/create-payload/utils/find-matching-legacy-metric.js +15 -0
  14. package/dist/cjs/create-payload/utils/get-browser-metadata.js +87 -0
  15. package/dist/cjs/create-payload/utils/get-fmp.js +52 -0
  16. package/dist/cjs/create-payload/utils/get-navigation-metrics.js +66 -0
  17. package/dist/cjs/create-payload/utils/get-paint-metrics.js +124 -0
  18. package/dist/cjs/create-payload/utils/get-payload-size.js +17 -0
  19. package/dist/cjs/create-payload/utils/get-react-ufo-payload-version.js +3 -1
  20. package/dist/cjs/create-payload/utils/get-ssr-success.js +15 -0
  21. package/dist/cjs/create-payload/utils/get-ttai.js +14 -0
  22. package/dist/cjs/create-payload/utils/get-tti.js +38 -0
  23. package/dist/cjs/interaction-metrics/index.js +25 -0
  24. package/dist/cjs/segment/segment.js +10 -4
  25. package/dist/es2019/create-payload/common/utils/index.js +9 -1
  26. package/dist/es2019/create-payload/critical-metrics-payload/index.js +6 -0
  27. package/dist/es2019/create-payload/critical-metrics-payload/root-metrics.js +166 -0
  28. package/dist/es2019/create-payload/critical-metrics-payload/segment-metrics/create-segment-metrics.js +155 -0
  29. package/dist/es2019/create-payload/critical-metrics-payload/segment-metrics/get-is-root-segment.js +3 -0
  30. package/dist/es2019/create-payload/critical-metrics-payload/segment-metrics/get-segment-id.js +9 -0
  31. package/dist/es2019/create-payload/critical-metrics-payload/segment-metrics/get-segment-status.js +40 -0
  32. package/dist/es2019/create-payload/critical-metrics-payload/segment-metrics/has-segment-failed.js +10 -0
  33. package/dist/es2019/create-payload/critical-metrics-payload/segment-metrics/is-label-stack-under-segment.js +5 -0
  34. package/dist/es2019/create-payload/critical-metrics-payload/types.js +1 -0
  35. package/dist/es2019/create-payload/index.js +55 -151
  36. package/dist/es2019/create-payload/utils/find-matching-legacy-metric.js +7 -0
  37. package/dist/es2019/create-payload/utils/get-browser-metadata.js +79 -0
  38. package/dist/es2019/create-payload/utils/get-fmp.js +47 -0
  39. package/dist/es2019/create-payload/utils/get-navigation-metrics.js +59 -0
  40. package/dist/es2019/create-payload/utils/get-paint-metrics.js +78 -0
  41. package/dist/es2019/create-payload/utils/get-payload-size.js +11 -0
  42. package/dist/es2019/create-payload/utils/get-react-ufo-payload-version.js +2 -1
  43. package/dist/es2019/create-payload/utils/get-ssr-success.js +7 -0
  44. package/dist/es2019/create-payload/utils/get-ttai.js +9 -0
  45. package/dist/es2019/create-payload/utils/get-tti.js +35 -0
  46. package/dist/es2019/interaction-metrics/index.js +24 -0
  47. package/dist/es2019/segment/segment.js +12 -4
  48. package/dist/esm/create-payload/common/utils/index.js +9 -3
  49. package/dist/esm/create-payload/critical-metrics-payload/index.js +31 -0
  50. package/dist/esm/create-payload/critical-metrics-payload/root-metrics.js +174 -0
  51. package/dist/esm/create-payload/critical-metrics-payload/segment-metrics/create-segment-metrics.js +244 -0
  52. package/dist/esm/create-payload/critical-metrics-payload/segment-metrics/get-is-root-segment.js +3 -0
  53. package/dist/esm/create-payload/critical-metrics-payload/segment-metrics/get-segment-id.js +9 -0
  54. package/dist/esm/create-payload/critical-metrics-payload/segment-metrics/get-segment-status.js +52 -0
  55. package/dist/esm/create-payload/critical-metrics-payload/segment-metrics/has-segment-failed.js +10 -0
  56. package/dist/esm/create-payload/critical-metrics-payload/segment-metrics/is-label-stack-under-segment.js +5 -0
  57. package/dist/esm/create-payload/critical-metrics-payload/types.js +1 -0
  58. package/dist/esm/create-payload/index.js +121 -210
  59. package/dist/esm/create-payload/utils/find-matching-legacy-metric.js +9 -0
  60. package/dist/esm/create-payload/utils/get-browser-metadata.js +79 -0
  61. package/dist/esm/create-payload/utils/get-fmp.js +47 -0
  62. package/dist/esm/create-payload/utils/get-navigation-metrics.js +59 -0
  63. package/dist/esm/create-payload/utils/get-paint-metrics.js +119 -0
  64. package/dist/esm/create-payload/utils/get-payload-size.js +11 -0
  65. package/dist/esm/create-payload/utils/get-react-ufo-payload-version.js +2 -1
  66. package/dist/esm/create-payload/utils/get-ssr-success.js +7 -0
  67. package/dist/esm/create-payload/utils/get-ttai.js +7 -0
  68. package/dist/esm/create-payload/utils/get-tti.js +33 -0
  69. package/dist/esm/interaction-metrics/index.js +24 -0
  70. package/dist/esm/segment/segment.js +10 -4
  71. package/dist/types/common/common/types.d.ts +1 -1
  72. package/dist/types/common/react-ufo-payload-schema.d.ts +23 -2
  73. package/dist/types/create-payload/common/utils/index.d.ts +3 -0
  74. package/dist/types/create-payload/critical-metrics-payload/index.d.ts +6 -0
  75. package/dist/types/create-payload/critical-metrics-payload/root-metrics.d.ts +7 -0
  76. package/dist/types/create-payload/critical-metrics-payload/segment-metrics/create-segment-metrics.d.ts +3 -0
  77. package/dist/types/create-payload/critical-metrics-payload/segment-metrics/get-is-root-segment.d.ts +2 -0
  78. package/dist/types/create-payload/critical-metrics-payload/segment-metrics/get-segment-id.d.ts +2 -0
  79. package/dist/types/create-payload/critical-metrics-payload/segment-metrics/get-segment-status.d.ts +7 -0
  80. package/dist/types/create-payload/critical-metrics-payload/segment-metrics/has-segment-failed.d.ts +2 -0
  81. package/dist/types/create-payload/critical-metrics-payload/segment-metrics/is-label-stack-under-segment.d.ts +2 -0
  82. package/dist/types/create-payload/critical-metrics-payload/types.d.ts +128 -0
  83. package/dist/types/create-payload/index.d.ts +979 -834
  84. package/dist/types/create-payload/utils/find-matching-legacy-metric.d.ts +5 -0
  85. package/dist/types/create-payload/utils/get-browser-metadata.d.ts +21 -0
  86. package/dist/types/create-payload/utils/get-fmp.d.ts +6 -0
  87. package/dist/types/create-payload/utils/get-navigation-metrics.d.ts +29 -0
  88. package/dist/types/create-payload/utils/get-paint-metrics.d.ts +13 -0
  89. package/dist/types/create-payload/utils/get-payload-size.d.ts +1 -0
  90. package/dist/types/create-payload/utils/get-react-ufo-payload-version.d.ts +2 -1
  91. package/dist/types/create-payload/utils/get-ssr-success.d.ts +2 -0
  92. package/dist/types/create-payload/utils/get-ttai.d.ts +2 -0
  93. package/dist/types/create-payload/utils/get-tti.d.ts +7 -0
  94. package/dist/types/create-post-interaction-log-payload/get-late-mutations.d.ts +1 -1
  95. package/dist/types/create-post-interaction-log-payload/index.d.ts +4 -4
  96. package/dist/types/interaction-context/index.d.ts +2 -0
  97. package/dist/types/interaction-ignore/ufo-interaction-ignore.d.ts +1 -1
  98. package/dist/types/interaction-metrics/index.d.ts +1 -0
  99. package/dist/types/segment/third-party-segment.d.ts +1 -1
  100. package/dist/types/vc/vc-observer-new/viewport-observer/utils/get-component-name-and-child-props.d.ts +2 -2
  101. package/dist/types-ts4.5/common/common/types.d.ts +1 -1
  102. package/dist/types-ts4.5/common/react-ufo-payload-schema.d.ts +23 -2
  103. package/dist/types-ts4.5/create-payload/common/utils/index.d.ts +3 -0
  104. package/dist/types-ts4.5/create-payload/critical-metrics-payload/index.d.ts +6 -0
  105. package/dist/types-ts4.5/create-payload/critical-metrics-payload/root-metrics.d.ts +7 -0
  106. package/dist/types-ts4.5/create-payload/critical-metrics-payload/segment-metrics/create-segment-metrics.d.ts +3 -0
  107. package/dist/types-ts4.5/create-payload/critical-metrics-payload/segment-metrics/get-is-root-segment.d.ts +2 -0
  108. package/dist/types-ts4.5/create-payload/critical-metrics-payload/segment-metrics/get-segment-id.d.ts +2 -0
  109. package/dist/types-ts4.5/create-payload/critical-metrics-payload/segment-metrics/get-segment-status.d.ts +7 -0
  110. package/dist/types-ts4.5/create-payload/critical-metrics-payload/segment-metrics/has-segment-failed.d.ts +2 -0
  111. package/dist/types-ts4.5/create-payload/critical-metrics-payload/segment-metrics/is-label-stack-under-segment.d.ts +2 -0
  112. package/dist/types-ts4.5/create-payload/critical-metrics-payload/types.d.ts +130 -0
  113. package/dist/types-ts4.5/create-payload/index.d.ts +979 -834
  114. package/dist/types-ts4.5/create-payload/utils/find-matching-legacy-metric.d.ts +5 -0
  115. package/dist/types-ts4.5/create-payload/utils/get-browser-metadata.d.ts +21 -0
  116. package/dist/types-ts4.5/create-payload/utils/get-fmp.d.ts +6 -0
  117. package/dist/types-ts4.5/create-payload/utils/get-navigation-metrics.d.ts +29 -0
  118. package/dist/types-ts4.5/create-payload/utils/get-paint-metrics.d.ts +13 -0
  119. package/dist/types-ts4.5/create-payload/utils/get-payload-size.d.ts +1 -0
  120. package/dist/types-ts4.5/create-payload/utils/get-react-ufo-payload-version.d.ts +2 -1
  121. package/dist/types-ts4.5/create-payload/utils/get-ssr-success.d.ts +2 -0
  122. package/dist/types-ts4.5/create-payload/utils/get-ttai.d.ts +2 -0
  123. package/dist/types-ts4.5/create-payload/utils/get-tti.d.ts +7 -0
  124. package/dist/types-ts4.5/create-post-interaction-log-payload/get-late-mutations.d.ts +1 -1
  125. package/dist/types-ts4.5/create-post-interaction-log-payload/index.d.ts +4 -4
  126. package/dist/types-ts4.5/interaction-context/index.d.ts +2 -0
  127. package/dist/types-ts4.5/interaction-ignore/ufo-interaction-ignore.d.ts +1 -1
  128. package/dist/types-ts4.5/interaction-metrics/index.d.ts +1 -0
  129. package/dist/types-ts4.5/segment/third-party-segment.d.ts +1 -1
  130. package/dist/types-ts4.5/vc/vc-observer-new/viewport-observer/utils/get-component-name-and-child-props.d.ts +2 -2
  131. 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 Bowser from 'bowser-ultralight';
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': getSSRSuccess(type),
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
- value = _Object$entries$_i[1];
407
- var label = stringifyLabelStackFully([]);
408
- 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 : {};
409
- result.set(label, {
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, value))
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 stylesheets = Array.from(document.styleSheets);
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(document.styleSheets).reduce(function (acc, item) {
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 = document.querySelectorAll('style').length;
665
- var styleProps = document.querySelectorAll('[style]');
666
- var styleDeclarations = Array.from(document.querySelectorAll('[style]')).reduce(function (acc, item) {
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 _callee2(interaction, interactionId, experimental) {
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, vcMetrics, experimentalMetrics, paintMetrics, payload;
703
- return _regeneratorRuntime.wrap(function _callee2$(_context2) {
704
- while (1) switch (_context2.prev = _context2.next) {
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
- _context2.next = 4;
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
- _context2.next = 24;
788
- return Promise.all([getVCMetrics(interaction), experimental ? getExperimentalVCMetrics(interaction) : Promise.resolve(undefined), getPaintMetrics(type, end)]);
789
- case 24:
790
- _yield$Promise$all = _context2.sent;
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
- vcMetrics = _yield$Promise$all2[0];
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
- } : {}), getBrowserMetadata()), getSSRProperties(type)), getAssetsMetrics(interaction, pageLoadInteractionMetrics === null || pageLoadInteractionMetrics === void 0 ? void 0 : pageLoadInteractionMetrics.SSRDoneTime)), getPPSMetrics(interaction)), paintMetrics), getNavigationMetrics(type)), vcMetrics), experimentalMetrics), (_config$additionalPay = config.additionalPayloadData) === null || _config$additionalPay === void 0 ? void 0 : _config$additionalPay.call(config, interaction)), getTracingContextData(interaction)), getStylesheetMetrics()), getErrorCounts(interaction)), {}, {
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 _context2.abrupt("return", payload);
871
- case 33:
758
+ return _context.abrupt("return", payload);
759
+ case 43:
872
760
  case "end":
873
- return _context2.stop();
761
+ return _context.stop();
874
762
  }
875
- }, _callee2);
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 _callee3(interactionId, interaction) {
884
- var ufoNameOverride, modifiedInteraction, interactionMetricsPayload;
885
- return _regeneratorRuntime.wrap(function _callee3$(_context3) {
886
- while (1) switch (_context3.prev = _context3.next) {
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
- _context3.next = 4;
893
- return createInteractionMetricsPayload(modifiedInteraction, interactionId);
894
- case 4:
895
- interactionMetricsPayload = _context3.sent;
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 _context3.stop();
810
+ return _context2.stop();
900
811
  }
901
- }, _callee3);
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 _callee4(interactionId, interaction) {
820
+ _createExperimentalMetricsPayload = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(interactionId, interaction) {
910
821
  var config, ufoName, rate, pageVisibilityState, result;
911
- return _regeneratorRuntime.wrap(function _callee4$(_context4) {
912
- while (1) switch (_context4.prev = _context4.next) {
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
- _context4.next = 3;
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
- _context4.next = 7;
835
+ _context3.next = 7;
925
836
  break;
926
837
  }
927
- return _context4.abrupt("return", null);
838
+ return _context3.abrupt("return", null);
928
839
  case 7:
929
840
  pageVisibilityState = getPageVisibilityState(interaction.start, interaction.end);
930
841
  if (!(pageVisibilityState !== 'visible')) {
931
- _context4.next = 10;
842
+ _context3.next = 10;
932
843
  break;
933
844
  }
934
- return _context4.abrupt("return", null);
845
+ return _context3.abrupt("return", null);
935
846
  case 10:
936
- _context4.next = 12;
847
+ _context3.next = 12;
937
848
  return createInteractionMetricsPayload(interaction, interactionId, true);
938
849
  case 12:
939
- result = _context4.sent;
940
- return _context4.abrupt("return", result);
850
+ result = _context3.sent;
851
+ return _context3.abrupt("return", result);
941
852
  case 14:
942
853
  case "end":
943
- return _context4.stop();
854
+ return _context3.stop();
944
855
  }
945
- }, _callee4);
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
+ }