@atlaskit/react-ufo 4.7.0 → 4.7.1

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 (60) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/cjs/create-interaction-extra-metrics-payload/index.js +82 -15
  3. package/dist/cjs/create-payload/index.js +26 -218
  4. package/dist/cjs/create-payload/utils/get-more-accurate-page-visibility-up-to-ttai.js +20 -0
  5. package/dist/cjs/create-payload/utils/get-visibility-state-from-performance.js +35 -0
  6. package/dist/cjs/create-payload/utils/optimize-apdex.js +25 -0
  7. package/dist/cjs/create-payload/utils/optimize-custom-timings.js +22 -0
  8. package/dist/cjs/create-payload/utils/optimize-hold-info.js +41 -0
  9. package/dist/cjs/create-payload/utils/optimize-marks.js +24 -0
  10. package/dist/cjs/create-payload/utils/optimize-react-profiler-timings.js +53 -0
  11. package/dist/cjs/create-payload/utils/optimize-request-info.js +32 -0
  12. package/dist/cjs/create-payload/utils/optimize-spans.js +30 -0
  13. package/dist/cjs/interaction-metrics-init/index.js +1 -1
  14. package/dist/es2019/create-interaction-extra-metrics-payload/index.js +62 -9
  15. package/dist/es2019/create-payload/index.js +10 -205
  16. package/dist/es2019/create-payload/utils/get-more-accurate-page-visibility-up-to-ttai.js +13 -0
  17. package/dist/es2019/create-payload/utils/get-visibility-state-from-performance.js +28 -0
  18. package/dist/es2019/create-payload/utils/optimize-apdex.js +14 -0
  19. package/dist/es2019/create-payload/utils/optimize-custom-timings.js +16 -0
  20. package/dist/es2019/create-payload/utils/optimize-hold-info.js +35 -0
  21. package/dist/es2019/create-payload/utils/optimize-marks.js +12 -0
  22. package/dist/es2019/create-payload/utils/optimize-react-profiler-timings.js +46 -0
  23. package/dist/es2019/create-payload/utils/optimize-request-info.js +26 -0
  24. package/dist/es2019/create-payload/utils/optimize-spans.js +24 -0
  25. package/dist/es2019/interaction-metrics-init/index.js +1 -1
  26. package/dist/esm/create-interaction-extra-metrics-payload/index.js +83 -16
  27. package/dist/esm/create-payload/index.js +18 -208
  28. package/dist/esm/create-payload/utils/get-more-accurate-page-visibility-up-to-ttai.js +13 -0
  29. package/dist/esm/create-payload/utils/get-visibility-state-from-performance.js +29 -0
  30. package/dist/esm/create-payload/utils/optimize-apdex.js +18 -0
  31. package/dist/esm/create-payload/utils/optimize-custom-timings.js +16 -0
  32. package/dist/esm/create-payload/utils/optimize-hold-info.js +34 -0
  33. package/dist/esm/create-payload/utils/optimize-marks.js +17 -0
  34. package/dist/esm/create-payload/utils/optimize-react-profiler-timings.js +46 -0
  35. package/dist/esm/create-payload/utils/optimize-request-info.js +25 -0
  36. package/dist/esm/create-payload/utils/optimize-spans.js +23 -0
  37. package/dist/esm/interaction-metrics-init/index.js +1 -1
  38. package/dist/types/create-interaction-extra-metrics-payload/index.d.ts +56 -0
  39. package/dist/types/create-payload/index.d.ts +0 -3
  40. package/dist/types/create-payload/utils/get-more-accurate-page-visibility-up-to-ttai.d.ts +2 -0
  41. package/dist/types/create-payload/utils/get-visibility-state-from-performance.d.ts +1 -0
  42. package/dist/types/create-payload/utils/optimize-apdex.d.ts +12 -0
  43. package/dist/types/create-payload/utils/optimize-custom-timings.d.ts +7 -0
  44. package/dist/types/create-payload/utils/optimize-hold-info.d.ts +3 -0
  45. package/dist/types/create-payload/utils/optimize-marks.d.ts +12 -0
  46. package/dist/types/create-payload/utils/optimize-react-profiler-timings.d.ts +3 -0
  47. package/dist/types/create-payload/utils/optimize-request-info.d.ts +8 -0
  48. package/dist/types/create-payload/utils/optimize-spans.d.ts +9 -0
  49. package/dist/types-ts4.5/create-interaction-extra-metrics-payload/index.d.ts +56 -0
  50. package/dist/types-ts4.5/create-payload/index.d.ts +0 -3
  51. package/dist/types-ts4.5/create-payload/utils/get-more-accurate-page-visibility-up-to-ttai.d.ts +2 -0
  52. package/dist/types-ts4.5/create-payload/utils/get-visibility-state-from-performance.d.ts +1 -0
  53. package/dist/types-ts4.5/create-payload/utils/optimize-apdex.d.ts +12 -0
  54. package/dist/types-ts4.5/create-payload/utils/optimize-custom-timings.d.ts +7 -0
  55. package/dist/types-ts4.5/create-payload/utils/optimize-hold-info.d.ts +3 -0
  56. package/dist/types-ts4.5/create-payload/utils/optimize-marks.d.ts +12 -0
  57. package/dist/types-ts4.5/create-payload/utils/optimize-react-profiler-timings.d.ts +3 -0
  58. package/dist/types-ts4.5/create-payload/utils/optimize-request-info.d.ts +8 -0
  59. package/dist/types-ts4.5/create-payload/utils/optimize-spans.d.ts +9 -0
  60. package/package.json +1 -1
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.optimizeMarks = optimizeMarks;
8
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
10
+ var _utils = require("../common/utils");
11
+ var _excluded = ["labelStack", "time"];
12
+ 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; }
13
+ 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) { (0, _defineProperty2.default)(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; }
14
+ function optimizeMarks(marks, reactUFOVersion) {
15
+ return marks.map(function (_ref) {
16
+ var labelStack = _ref.labelStack,
17
+ time = _ref.time,
18
+ others = (0, _objectWithoutProperties2.default)(_ref, _excluded);
19
+ return _objectSpread(_objectSpread({}, others), {}, {
20
+ labelStack: labelStack && (0, _utils.optimizeLabelStack)(labelStack, reactUFOVersion),
21
+ time: Math.round(time)
22
+ });
23
+ });
24
+ }
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.optimizeReactProfilerTimings = optimizeReactProfilerTimings;
8
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
10
+ var _interactionMetrics = require("../../interaction-metrics");
11
+ var _utils = require("../common/utils");
12
+ function optimizeReactProfilerTimings(reactProfilerTimings, interactionStart, reactUFOVersion) {
13
+ var reactProfilerTimingsMap = reactProfilerTimings.reduce(function (result, _ref) {
14
+ var labelStack = _ref.labelStack,
15
+ startTime = _ref.startTime,
16
+ commitTime = _ref.commitTime,
17
+ actualDuration = _ref.actualDuration,
18
+ type = _ref.type;
19
+ if (labelStack && startTime >= interactionStart) {
20
+ var label = (0, _utils.stringifyLabelStackFully)(labelStack);
21
+ var start = Math.round(startTime);
22
+ var end = Math.round(commitTime);
23
+ var timing = result.get(label) || {
24
+ labelStack: (0, _utils.optimizeLabelStack)(labelStack, reactUFOVersion),
25
+ startTime: start,
26
+ endTime: end,
27
+ mountCount: 0,
28
+ rerenderCount: 0,
29
+ renderDuration: 0
30
+ };
31
+ if (start < timing.startTime) {
32
+ timing.startTime = start;
33
+ }
34
+ if (end > timing.endTime) {
35
+ timing.endTime = end;
36
+ }
37
+ if (type === 'mount') {
38
+ timing.mountCount += 1;
39
+ }
40
+ if (type === 'update') {
41
+ timing.rerenderCount += 1;
42
+ }
43
+ if (_interactionMetrics.segmentUnmountCache.has(label) && (0, _platformFeatureFlags.fg)('platform_ufo_segment_unmount_count')) {
44
+ timing.unmountCount = _interactionMetrics.segmentUnmountCache.get(label) || 0;
45
+ _interactionMetrics.segmentUnmountCache.delete(label);
46
+ }
47
+ timing.renderDuration += Math.round(actualDuration);
48
+ result.set(label, timing);
49
+ }
50
+ return result;
51
+ }, new Map());
52
+ return (0, _toConsumableArray2.default)(reactProfilerTimingsMap.values());
53
+ }
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.optimizeRequestInfo = optimizeRequestInfo;
8
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
+ var _utils = require("../common/utils");
10
+ function optimizeRequestInfo(requestInfo, interactionStart, reactUFOVersion) {
11
+ var updatedRequestInfo = requestInfo.reduce(function (result, reqInfo) {
12
+ var labelStack = reqInfo.labelStack,
13
+ name = reqInfo.name,
14
+ start = reqInfo.start,
15
+ end = reqInfo.end,
16
+ networkStart = reqInfo.networkStart,
17
+ networkComplete = reqInfo.networkComplete;
18
+ var startTime = networkStart !== null && networkStart !== void 0 ? networkStart : start;
19
+ var endTime = networkComplete !== null && networkComplete !== void 0 ? networkComplete : end;
20
+ if (labelStack && start >= interactionStart && endTime) {
21
+ result.push({
22
+ labelStack: (0, _utils.optimizeLabelStack)([].concat((0, _toConsumableArray2.default)(labelStack), [{
23
+ name: name
24
+ }]), reactUFOVersion),
25
+ startTime: Math.round(startTime),
26
+ endTime: Math.round(endTime)
27
+ });
28
+ }
29
+ return result;
30
+ }, []);
31
+ return updatedRequestInfo;
32
+ }
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.optimizeSpans = optimizeSpans;
8
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
+ var _utils = require("../common/utils");
10
+ function optimizeSpans(spans, interactionStart, reactUFOVersion) {
11
+ var updatedSpans = spans.reduce(function (result, span) {
12
+ var labelStack = span.labelStack,
13
+ type = span.type,
14
+ name = span.name,
15
+ start = span.start,
16
+ end = span.end;
17
+ if (labelStack && start >= interactionStart) {
18
+ result.push({
19
+ labelStack: (0, _utils.optimizeLabelStack)([].concat((0, _toConsumableArray2.default)(labelStack), [{
20
+ name: name
21
+ }]), reactUFOVersion),
22
+ startTime: Math.round(start),
23
+ endTime: Math.round(end),
24
+ type: type
25
+ });
26
+ }
27
+ return result;
28
+ }, []);
29
+ return updatedSpans;
30
+ }
@@ -135,7 +135,7 @@ function init(analyticsWebClientAsync, config) {
135
135
  startTime: 0
136
136
  });
137
137
  }
138
- if (config !== null && config !== void 0 && (_config$extraInteract = config.extraInteractionMetrics) !== null && _config$extraInteract !== void 0 && _config$extraInteract.enabled && (0, _platformFeatureFlags.fg)('platform_ufo_enable_ttai_with_3p')) {
138
+ if (config !== null && config !== void 0 && (_config$extraInteract = config.extraInteractionMetrics) !== null && _config$extraInteract !== void 0 && _config$extraInteract.enabled) {
139
139
  _interactionMetrics.interactionExtraMetrics.initializeVCObserver(vcOptions);
140
140
  }
141
141
  }
@@ -1,15 +1,23 @@
1
1
  import { fg } from '@atlaskit/platform-feature-flags';
2
2
  import coinflip from '../coinflip';
3
- import { getConfig, getExtraInteractionRate } from '../config';
4
- import { getMoreAccuratePageVisibilityUpToTTAI, optimizeHoldInfo } from '../create-payload';
5
- import { buildSegmentTree, getOldSegmentsLabelStack, sanitizeUfoName } from '../create-payload/common/utils';
3
+ import { DEFAULT_TTVC_REVISION, getConfig, getExtraInteractionRate, getMostRecentVCRevision } from '../config';
4
+ import { buildSegmentTree, getOldSegmentsLabelStack, optimizeLabelStack, sanitizeUfoName } from '../create-payload/common/utils';
5
+ import { getMoreAccuratePageVisibilityUpToTTAI } from '../create-payload/utils/get-more-accurate-page-visibility-up-to-ttai';
6
6
  import getPageVisibilityUpToTTAI from '../create-payload/utils/get-page-visibility-up-to-ttai';
7
7
  import getPayloadSize from '../create-payload/utils/get-payload-size';
8
8
  import { getReactUFOPayloadVersion } from '../create-payload/utils/get-react-ufo-payload-version';
9
9
  import getTTAI from '../create-payload/utils/get-ttai';
10
10
  import getVCMetrics from '../create-payload/utils/get-vc-metrics';
11
+ import { optimizeApdex } from '../create-payload/utils/optimize-apdex';
12
+ import { optimizeCustomTimings } from '../create-payload/utils/optimize-custom-timings';
13
+ import { optimizeHoldInfo } from '../create-payload/utils/optimize-hold-info';
14
+ import { optimizeMarks } from '../create-payload/utils/optimize-marks';
15
+ import { optimizeReactProfilerTimings } from '../create-payload/utils/optimize-react-profiler-timings';
16
+ import { optimizeRequestInfo } from '../create-payload/utils/optimize-request-info';
17
+ import { optimizeSpans } from '../create-payload/utils/optimize-spans';
18
+ import { interactionSpans as atlaskitInteractionSpans } from '../interaction-metrics';
11
19
  async function createInteractionExtraLogPayload(interactionId, interaction) {
12
- var _getTTAI, _interaction$hold3pIn, _window$location;
20
+ var _getTTAI, _getMostRecentVCRevis, _window$location;
13
21
  const config = getConfig();
14
22
  if (!config) {
15
23
  throw Error('UFO Configuration not provided');
@@ -42,9 +50,49 @@ async function createInteractionExtraLogPayload(interactionId, interaction) {
42
50
  const moreAccuratePageVisibilityAtTTAI = calculatePageVisibilityFromTheStartOfPageLoad ? getMoreAccuratePageVisibilityUpToTTAI(interaction) : null;
43
51
  const extraTTAI = (_getTTAI = getTTAI(interaction)) !== null && _getTTAI !== void 0 ? _getTTAI : undefined;
44
52
  const newUFOName = sanitizeUfoName(ufoName);
53
+ const mostRecentVCRevision = (_getMostRecentVCRevis = getMostRecentVCRevision(newUFOName)) !== null && _getMostRecentVCRevis !== void 0 ? _getMostRecentVCRevis : DEFAULT_TTVC_REVISION;
45
54
  const finalVCMetrics = await getVCMetrics(interaction, true);
46
- const holdInfo = optimizeHoldInfo((_interaction$hold3pIn = interaction.hold3pInfo) !== null && _interaction$hold3pIn !== void 0 ? _interaction$hold3pIn : [], start, getReactUFOPayloadVersion(interaction.type));
47
- const segments3p = !fg('platform_ufo_remove_deprecated_config_fields') && config.killswitchNestedSegments ? [] : knownSegments.filter(knownSegment => knownSegment.labelStack.some(entry => 'type' in entry && entry.type === 'third-party'));
55
+
56
+ // Helper function to check if labelStack contains third-party type
57
+ const isThirdParty = labelStack => {
58
+ var _labelStack$some;
59
+ return (_labelStack$some = labelStack === null || labelStack === void 0 ? void 0 : labelStack.some(entry => 'type' in entry && entry.type === 'third-party')) !== null && _labelStack$some !== void 0 ? _labelStack$some : false;
60
+ };
61
+
62
+ // Pre-filter 3p data
63
+ const filteredData = {
64
+ errors: interaction.errors.filter(error => isThirdParty(error.labelStack)),
65
+ spans: [...interaction.spans, ...atlaskitInteractionSpans].filter(span => isThirdParty(span.labelStack)),
66
+ requestInfo: interaction.requestInfo.filter(req => isThirdParty(req.labelStack)),
67
+ customTimings: interaction.customTimings.filter(timing => isThirdParty(timing.labelStack)),
68
+ apdex: interaction.apdex.filter(apdex => isThirdParty(apdex.labelStack)),
69
+ reactProfilerTimings: interaction.reactProfilerTimings.filter(timing => isThirdParty(timing.labelStack)),
70
+ customData: interaction.customData.filter(data => isThirdParty(data.labelStack)),
71
+ segments: knownSegments.filter(segment => isThirdParty(segment.labelStack)),
72
+ marks: interaction.marks.filter(mark => isThirdParty(mark.labelStack))
73
+ };
74
+ // Clear atlaskit spans after filtering
75
+ atlaskitInteractionSpans.length = 0;
76
+
77
+ // Detailed payload
78
+ const getDetailedInteractionMetrics = () => {
79
+ var _interaction$hold3pIn;
80
+ return {
81
+ errors: filteredData.errors.map(({
82
+ labelStack,
83
+ ...others
84
+ }) => ({
85
+ ...others,
86
+ labelStack: labelStack && optimizeLabelStack(labelStack, getReactUFOPayloadVersion(interaction.type))
87
+ })),
88
+ holdActive: interaction.hold3pActive ? [...interaction.hold3pActive.values()] : [],
89
+ holdInfo: optimizeHoldInfo((_interaction$hold3pIn = interaction.hold3pInfo) !== null && _interaction$hold3pIn !== void 0 ? _interaction$hold3pIn : [], start, getReactUFOPayloadVersion(interaction.type)),
90
+ spans: optimizeSpans(filteredData.spans, start, getReactUFOPayloadVersion(interaction.type)),
91
+ requestInfo: optimizeRequestInfo(filteredData.requestInfo, start, getReactUFOPayloadVersion(interaction.type)),
92
+ customTimings: optimizeCustomTimings(filteredData.customTimings, start)
93
+ };
94
+ };
95
+ const segments3p = !fg('platform_ufo_remove_deprecated_config_fields') && config.killswitchNestedSegments ? [] : filteredData.segments;
48
96
  const segmentTree = getReactUFOPayloadVersion(interaction.type) === '2.0.0' ? buildSegmentTree(segments3p.map(segment => segment.labelStack)) : {};
49
97
  const payload = {
50
98
  actionSubject: 'experience',
@@ -85,9 +133,14 @@ async function createInteractionExtraLogPayload(interactionId, interaction) {
85
133
  start: Math.round(start),
86
134
  'metric:ttai:3p': extraTTAI,
87
135
  ...finalVCMetrics,
88
- holdInfo,
89
- segments: getReactUFOPayloadVersion(interaction.type) === '2.0.0' ? segmentTree : getOldSegmentsLabelStack(segments3p, interaction.type)
90
- }
136
+ segments: getReactUFOPayloadVersion(interaction.type) === '2.0.0' ? segmentTree : getOldSegmentsLabelStack(segments3p, interaction.type),
137
+ marks: optimizeMarks(filteredData.marks, getReactUFOPayloadVersion(interaction.type)),
138
+ apdex: optimizeApdex(filteredData.apdex, getReactUFOPayloadVersion(interaction.type)),
139
+ reactProfilerTimings: optimizeReactProfilerTimings(filteredData.reactProfilerTimings, start, getReactUFOPayloadVersion(interaction.type)),
140
+ customData: filteredData.customData,
141
+ ...getDetailedInteractionMetrics()
142
+ },
143
+ 'vc:effective:revision': mostRecentVCRevision
91
144
  }
92
145
  }
93
146
  };
@@ -13,7 +13,7 @@ import { getBm3Timings } from '../custom-timings';
13
13
  import { getGlobalErrorCount } from '../global-error-handler';
14
14
  import { getPageVisibilityState } from '../hidden-timing';
15
15
  import * as initialPageLoadExtraTiming from '../initial-page-load-extra-timing';
16
- import { interactionSpans as atlaskitInteractionSpans, segmentUnmountCache } from '../interaction-metrics';
16
+ import { interactionSpans as atlaskitInteractionSpans } from '../interaction-metrics';
17
17
  import { createMemoryStateReport, createPressureStateReport } from '../machine-utilisation';
18
18
  import * as resourceTiming from '../resource-timing';
19
19
  import { filterResourceTimings } from '../resource-timing/common/utils/resource-timing-buffer';
@@ -24,6 +24,7 @@ import { createCriticalMetricsPayloads } from './critical-metrics-payload';
24
24
  import { addPerformanceMeasures } from './utils/add-performance-measures';
25
25
  import { getBrowserMetadataToLegacyFormat } from './utils/get-browser-metadata';
26
26
  import getInteractionStatus from './utils/get-interaction-status';
27
+ import { getMoreAccuratePageVisibilityUpToTTAI } from './utils/get-more-accurate-page-visibility-up-to-ttai';
27
28
  import { getNavigationMetricsToLegacyFormat } from './utils/get-navigation-metrics';
28
29
  import getPageVisibilityUpToTTAI from './utils/get-page-visibility-up-to-ttai';
29
30
  import { getPaintMetricsToLegacyFormat } from './utils/get-paint-metrics';
@@ -33,6 +34,14 @@ import getSSRDoneTimeValue from './utils/get-ssr-done-time-value';
33
34
  import getSSRSuccessUtil from './utils/get-ssr-success';
34
35
  import getTTAI from './utils/get-ttai';
35
36
  import getVCMetrics from './utils/get-vc-metrics';
37
+ import { getVisibilityStateFromPerformance } from './utils/get-visibility-state-from-performance';
38
+ import { optimizeApdex } from './utils/optimize-apdex';
39
+ import { optimizeCustomTimings } from './utils/optimize-custom-timings';
40
+ import { optimizeHoldInfo } from './utils/optimize-hold-info';
41
+ import { optimizeMarks } from './utils/optimize-marks';
42
+ import { optimizeReactProfilerTimings } from './utils/optimize-react-profiler-timings';
43
+ import { optimizeRequestInfo } from './utils/optimize-request-info';
44
+ import { optimizeSpans } from './utils/optimize-spans';
36
45
  function getUfoNameOverride(interaction) {
37
46
  const {
38
47
  ufoName,
@@ -81,34 +90,6 @@ function getPageVisibilityUpToTTI(interaction) {
81
90
  const bm3EndTimeOrInteractionEndTime = getBm3EndTimeOrFallbackValue(interaction);
82
91
  return getPageVisibilityState(start, bm3EndTimeOrInteractionEndTime);
83
92
  }
84
- function getVisibilityStateFromPerformance(stop) {
85
- try {
86
- const results = performance.getEntriesByType('visibility-state');
87
- if (!results || results.length === 0) {
88
- return null;
89
- }
90
- return results.reduce((acc = null, {
91
- name,
92
- startTime
93
- }) => {
94
- if (startTime > stop) {
95
- return acc;
96
- }
97
- if (acc === null && name === null) {
98
- return null;
99
- }
100
- if (acc === null) {
101
- return name;
102
- }
103
- if (acc !== name) {
104
- return 'mixed';
105
- }
106
- return acc;
107
- }, null);
108
- } catch (e) {
109
- return null;
110
- }
111
- }
112
93
  function getMoreAccuratePageVisibilityUpToTTI(interaction) {
113
94
  const old = getPageVisibilityUpToTTI(interaction);
114
95
  const tti = getEarliestLegacyStopTime(interaction, []);
@@ -124,17 +105,6 @@ function getMoreAccuratePageVisibilityUpToTTI(interaction) {
124
105
  }
125
106
  return old;
126
107
  }
127
- export function getMoreAccuratePageVisibilityUpToTTAI(interaction) {
128
- const old = getPageVisibilityUpToTTAI(interaction);
129
- const buffered = getVisibilityStateFromPerformance(interaction.end);
130
- if (!buffered) {
131
- return old;
132
- }
133
- if (buffered !== old) {
134
- return 'mixed';
135
- }
136
- return old;
137
- }
138
108
  function getResourceTimings(start, end) {
139
109
  var _resourceTiming$getRe;
140
110
  return (_resourceTiming$getRe = resourceTiming.getResourceTimings(start, end)) !== null && _resourceTiming$getRe !== void 0 ? _resourceTiming$getRe : undefined;
@@ -291,49 +261,6 @@ function optimizeCustomData(interaction) {
291
261
  }
292
262
  return [...customDataMap.values()];
293
263
  }
294
- function optimizeReactProfilerTimings(reactProfilerTimings, interactionStart, reactUFOVersion) {
295
- const reactProfilerTimingsMap = reactProfilerTimings.reduce((result, {
296
- labelStack,
297
- startTime,
298
- commitTime,
299
- actualDuration,
300
- type
301
- }) => {
302
- if (labelStack && startTime >= interactionStart) {
303
- const label = stringifyLabelStackFully(labelStack);
304
- const start = Math.round(startTime);
305
- const end = Math.round(commitTime);
306
- const timing = result.get(label) || {
307
- labelStack: optimizeLabelStack(labelStack, reactUFOVersion),
308
- startTime: start,
309
- endTime: end,
310
- mountCount: 0,
311
- rerenderCount: 0,
312
- renderDuration: 0
313
- };
314
- if (start < timing.startTime) {
315
- timing.startTime = start;
316
- }
317
- if (end > timing.endTime) {
318
- timing.endTime = end;
319
- }
320
- if (type === 'mount') {
321
- timing.mountCount += 1;
322
- }
323
- if (type === 'update') {
324
- timing.rerenderCount += 1;
325
- }
326
- if (segmentUnmountCache.has(label) && fg('platform_ufo_segment_unmount_count')) {
327
- timing.unmountCount = segmentUnmountCache.get(label) || 0;
328
- segmentUnmountCache.delete(label);
329
- }
330
- timing.renderDuration += Math.round(actualDuration);
331
- result.set(label, timing);
332
- }
333
- return result;
334
- }, new Map());
335
- return [...reactProfilerTimingsMap.values()];
336
- }
337
264
  function optimizeRedirects(redirects, interactionStart) {
338
265
  let lastRedirectTime = interactionStart;
339
266
  const updatedRedirects = redirects.sort((a, b) => a.time - b.time).reduce((result, redirect) => {
@@ -355,128 +282,6 @@ function optimizeRedirects(redirects, interactionStart) {
355
282
  }, []);
356
283
  return updatedRedirects;
357
284
  }
358
- export function optimizeHoldInfo(holdInfo, interactionStart, reactUFOVersion) {
359
- const holdInfoMap = holdInfo.reduce((result, hold) => {
360
- const {
361
- labelStack,
362
- name,
363
- start,
364
- end,
365
- ignoreOnSubmit
366
- } = hold;
367
- if (labelStack && !ignoreOnSubmit && start >= interactionStart) {
368
- const label = stringifyLabelStackFully([...labelStack, {
369
- name
370
- }]);
371
- const startTime = Math.round(start);
372
- const endTime = Math.round(end);
373
- const timing = result.get(label) || {
374
- labelStack: optimizeLabelStack([...labelStack, {
375
- name
376
- }], reactUFOVersion),
377
- startTime,
378
- endTime
379
- };
380
- if (startTime < timing.startTime) {
381
- timing.startTime = startTime;
382
- }
383
- if (endTime > timing.endTime) {
384
- timing.endTime = endTime;
385
- }
386
- result.set(label, timing);
387
- }
388
- return result;
389
- }, new Map());
390
- return [...holdInfoMap.values()];
391
- }
392
- function optimizeSpans(spans, interactionStart, reactUFOVersion) {
393
- const updatedSpans = spans.reduce((result, span) => {
394
- const {
395
- labelStack,
396
- type,
397
- name,
398
- start,
399
- end
400
- } = span;
401
- if (labelStack && start >= interactionStart) {
402
- result.push({
403
- labelStack: optimizeLabelStack([...labelStack, {
404
- name
405
- }], reactUFOVersion),
406
- startTime: Math.round(start),
407
- endTime: Math.round(end),
408
- type
409
- });
410
- }
411
- return result;
412
- }, []);
413
- return updatedSpans;
414
- }
415
- function optimizeRequestInfo(requestInfo, interactionStart, reactUFOVersion) {
416
- const updatedRequestInfo = requestInfo.reduce((result, reqInfo) => {
417
- const {
418
- labelStack,
419
- name,
420
- start,
421
- end,
422
- networkStart,
423
- networkComplete
424
- } = reqInfo;
425
- const startTime = networkStart !== null && networkStart !== void 0 ? networkStart : start;
426
- const endTime = networkComplete !== null && networkComplete !== void 0 ? networkComplete : end;
427
- if (labelStack && start >= interactionStart && endTime) {
428
- result.push({
429
- labelStack: optimizeLabelStack([...labelStack, {
430
- name
431
- }], reactUFOVersion),
432
- startTime: Math.round(startTime),
433
- endTime: Math.round(endTime)
434
- });
435
- }
436
- return result;
437
- }, []);
438
- return updatedRequestInfo;
439
- }
440
- function optimizeCustomTimings(customTimings, interactionStart) {
441
- return customTimings.reduce((result, item) => {
442
- Object.keys(item.data).forEach(key => {
443
- if (item.data[key].startTime >= interactionStart) {
444
- result.push({
445
- labelStack: [{
446
- n: key
447
- }],
448
- startTime: Math.round(item.data[key].startTime),
449
- endTime: Math.round(item.data[key].endTime)
450
- });
451
- }
452
- });
453
- return result;
454
- }, []);
455
- }
456
- function optimizeMarks(marks, reactUFOVersion) {
457
- return marks.map(({
458
- labelStack,
459
- time,
460
- ...others
461
- }) => ({
462
- ...others,
463
- labelStack: labelStack && optimizeLabelStack(labelStack, reactUFOVersion),
464
- time: Math.round(time)
465
- }));
466
- }
467
- function optimizeApdex(apdex, reactUFOVersion) {
468
- return apdex.map(({
469
- stopTime,
470
- labelStack,
471
- ...others
472
- }) => ({
473
- ...others,
474
- stopTime: Math.round(stopTime),
475
- ...(labelStack ? {
476
- labelStack: optimizeLabelStack(labelStack, reactUFOVersion)
477
- } : {})
478
- }));
479
- }
480
285
  function objectToArray(obj = {}) {
481
286
  return Object.keys(obj).reduce((result, key) => {
482
287
  result.push({
@@ -0,0 +1,13 @@
1
+ import getPageVisibilityUpToTTAI from './get-page-visibility-up-to-ttai';
2
+ import { getVisibilityStateFromPerformance } from './get-visibility-state-from-performance';
3
+ export function getMoreAccuratePageVisibilityUpToTTAI(interaction) {
4
+ const old = getPageVisibilityUpToTTAI(interaction);
5
+ const buffered = getVisibilityStateFromPerformance(interaction.end);
6
+ if (!buffered) {
7
+ return old;
8
+ }
9
+ if (buffered !== old) {
10
+ return 'mixed';
11
+ }
12
+ return old;
13
+ }
@@ -0,0 +1,28 @@
1
+ export function getVisibilityStateFromPerformance(stop) {
2
+ try {
3
+ const results = performance.getEntriesByType('visibility-state');
4
+ if (!results || results.length === 0) {
5
+ return null;
6
+ }
7
+ return results.reduce((acc = null, {
8
+ name,
9
+ startTime
10
+ }) => {
11
+ if (startTime > stop) {
12
+ return acc;
13
+ }
14
+ if (acc === null && name === null) {
15
+ return null;
16
+ }
17
+ if (acc === null) {
18
+ return name;
19
+ }
20
+ if (acc !== name) {
21
+ return 'mixed';
22
+ }
23
+ return acc;
24
+ }, null);
25
+ } catch (e) {
26
+ return null;
27
+ }
28
+ }
@@ -0,0 +1,14 @@
1
+ import { optimizeLabelStack } from '../common/utils';
2
+ export function optimizeApdex(apdex, reactUFOVersion) {
3
+ return apdex.map(({
4
+ stopTime,
5
+ labelStack,
6
+ ...others
7
+ }) => ({
8
+ ...others,
9
+ stopTime: Math.round(stopTime),
10
+ ...(labelStack ? {
11
+ labelStack: optimizeLabelStack(labelStack, reactUFOVersion)
12
+ } : {})
13
+ }));
14
+ }
@@ -0,0 +1,16 @@
1
+ export function optimizeCustomTimings(customTimings, interactionStart) {
2
+ return customTimings.reduce((result, item) => {
3
+ Object.keys(item.data).forEach(key => {
4
+ if (item.data[key].startTime >= interactionStart) {
5
+ result.push({
6
+ labelStack: [{
7
+ n: key
8
+ }],
9
+ startTime: Math.round(item.data[key].startTime),
10
+ endTime: Math.round(item.data[key].endTime)
11
+ });
12
+ }
13
+ });
14
+ return result;
15
+ }, []);
16
+ }
@@ -0,0 +1,35 @@
1
+ import { optimizeLabelStack, stringifyLabelStackFully } from '../common/utils';
2
+ export function optimizeHoldInfo(holdInfo, interactionStart, reactUFOVersion) {
3
+ const holdInfoMap = holdInfo.reduce((result, hold) => {
4
+ const {
5
+ labelStack,
6
+ name,
7
+ start,
8
+ end,
9
+ ignoreOnSubmit
10
+ } = hold;
11
+ if (labelStack && !ignoreOnSubmit && start >= interactionStart) {
12
+ const label = stringifyLabelStackFully([...labelStack, {
13
+ name
14
+ }]);
15
+ const startTime = Math.round(start);
16
+ const endTime = Math.round(end);
17
+ const timing = result.get(label) || {
18
+ labelStack: optimizeLabelStack([...labelStack, {
19
+ name
20
+ }], reactUFOVersion),
21
+ startTime,
22
+ endTime
23
+ };
24
+ if (startTime < timing.startTime) {
25
+ timing.startTime = startTime;
26
+ }
27
+ if (endTime > timing.endTime) {
28
+ timing.endTime = endTime;
29
+ }
30
+ result.set(label, timing);
31
+ }
32
+ return result;
33
+ }, new Map());
34
+ return [...holdInfoMap.values()];
35
+ }
@@ -0,0 +1,12 @@
1
+ import { optimizeLabelStack } from '../common/utils';
2
+ export function optimizeMarks(marks, reactUFOVersion) {
3
+ return marks.map(({
4
+ labelStack,
5
+ time,
6
+ ...others
7
+ }) => ({
8
+ ...others,
9
+ labelStack: labelStack && optimizeLabelStack(labelStack, reactUFOVersion),
10
+ time: Math.round(time)
11
+ }));
12
+ }