@atlaskit/react-ufo 4.14.3 → 4.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 (30) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/cjs/config/index.js +4 -0
  3. package/dist/cjs/create-payload/index.js +22 -2
  4. package/dist/cjs/create-payload/utils/get-vc-metrics.js +10 -6
  5. package/dist/cjs/vc/index.js +4 -3
  6. package/dist/cjs/vc/vc-observer-new/index.js +31 -7
  7. package/dist/cjs/vc/vc-observer-new/raw-data-handler/index.js +237 -0
  8. package/dist/es2019/config/index.js +3 -0
  9. package/dist/es2019/create-payload/index.js +17 -1
  10. package/dist/es2019/create-payload/utils/get-vc-metrics.js +5 -2
  11. package/dist/es2019/vc/index.js +4 -2
  12. package/dist/es2019/vc/vc-observer-new/index.js +20 -1
  13. package/dist/es2019/vc/vc-observer-new/raw-data-handler/index.js +173 -0
  14. package/dist/esm/config/index.js +3 -0
  15. package/dist/esm/create-payload/index.js +22 -2
  16. package/dist/esm/create-payload/utils/get-vc-metrics.js +11 -7
  17. package/dist/esm/vc/index.js +4 -3
  18. package/dist/esm/vc/vc-observer-new/index.js +31 -7
  19. package/dist/esm/vc/vc-observer-new/raw-data-handler/index.js +231 -0
  20. package/dist/types/common/vc/types.d.ts +20 -1
  21. package/dist/types/config/index.d.ts +6 -0
  22. package/dist/types/vc/types.d.ts +1 -0
  23. package/dist/types/vc/vc-observer-new/raw-data-handler/index.d.ts +20 -0
  24. package/dist/types/vc/vc-observer-new/types.d.ts +2 -0
  25. package/dist/types-ts4.5/common/vc/types.d.ts +25 -1
  26. package/dist/types-ts4.5/config/index.d.ts +6 -0
  27. package/dist/types-ts4.5/vc/types.d.ts +1 -0
  28. package/dist/types-ts4.5/vc/vc-observer-new/raw-data-handler/index.d.ts +20 -0
  29. package/dist/types-ts4.5/vc/vc-observer-new/types.d.ts +2 -0
  30. package/package.json +4 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # @atlaskit/ufo-interaction-ignore
2
2
 
3
+ ## 4.14.4
4
+
5
+ ### Patch Changes
6
+
7
+ - [`e52ace29dfa64`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/e52ace29dfa64) -
8
+ Enable raw vc data for React UFO
9
+
3
10
  ## 4.14.3
4
11
 
5
12
  ### Patch Changes
@@ -22,6 +22,7 @@ exports.getPostInteractionRate = getPostInteractionRate;
22
22
  exports.getReactHydrationStats = getReactHydrationStats;
23
23
  exports.getTypingPerformanceTracingMethod = getTypingPerformanceTracingMethod;
24
24
  exports.getUfoNameOverrides = getUfoNameOverrides;
25
+ exports.getVCRawDataInteractionRate = getVCRawDataInteractionRate;
25
26
  exports.isVCRevisionEnabled = isVCRevisionEnabled;
26
27
  exports.setUFOConfig = setUFOConfig;
27
28
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
@@ -193,6 +194,9 @@ function getExperimentalInteractionRate(name, interactionType) {
193
194
  return 0;
194
195
  }
195
196
  }
197
+ function getVCRawDataInteractionRate(name, interactionType) {
198
+ return getConfigRate(name, interactionType, 'enableVCRawDataRates');
199
+ }
196
200
  function getPostInteractionRate(name, interactionType) {
197
201
  return getConfigRate(name, interactionType, 'postInteractionLog');
198
202
  }
@@ -60,6 +60,7 @@ var _excluded = ["labelStack"];
60
60
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
61
61
  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; }
62
62
  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; } // Import common utilities
63
+ var MAX_PAYLOAD_SIZE = 250;
63
64
  function getUfoNameOverride(interaction) {
64
65
  var ufoName = interaction.ufoName,
65
66
  apdex = interaction.apdex;
@@ -398,7 +399,7 @@ function createInteractionMetricsPayload(_x, _x2, _x3, _x4, _x5) {
398
399
  function _createInteractionMetricsPayload() {
399
400
  _createInteractionMetricsPayload = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(interaction, interactionId, experimental, criticalPayloadCount, vcMetrics) {
400
401
  var _window$location, _config$additionalPay;
401
- var interactionPayloadStart, config, end, start, ufoName, knownSegments, rate, type, abortReason, routeName, featureFlags, previousInteractionName, isPreviousInteractionAborted, abortedByInteractionName, responsiveness, unknownElementName, unknownElementHierarchy, hydration, 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, batteryInfo, getReactHydrationStats, payload;
402
+ var interactionPayloadStart, config, end, start, ufoName, knownSegments, rate, type, abortReason, routeName, featureFlags, previousInteractionName, isPreviousInteractionAborted, abortedByInteractionName, responsiveness, unknownElementName, unknownElementHierarchy, hydration, 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, batteryInfo, getReactHydrationStats, payload, size, vcRev, rawData, rawDataSize;
402
403
  return _regenerator.default.wrap(function _callee$(_context) {
403
404
  while (1) switch (_context.prev = _context.next) {
404
405
  case 0:
@@ -604,7 +605,26 @@ function _createInteractionMetricsPayload() {
604
605
  regularTTAI = undefined;
605
606
  expTTAI = undefined;
606
607
  }
607
- payload.attributes.properties['event:sizeInKb'] = (0, _getPayloadSize.default)(payload.attributes.properties);
608
+ if ((0, _platformFeatureFlags.fg)('platform_ufo_enable_vc_raw_data')) {
609
+ size = (0, _getPayloadSize.default)(payload.attributes.properties);
610
+ vcRev = payload.attributes.properties['ufo:vc:rev'];
611
+ rawData = vcRev.find(function (item) {
612
+ return item.revision === 'raw-handler';
613
+ });
614
+ if (rawData) {
615
+ rawDataSize = (0, _getPayloadSize.default)(rawData);
616
+ payload.attributes.properties['ufo:vc:raw:size'] = rawDataSize;
617
+ if (size > MAX_PAYLOAD_SIZE && Array.isArray(vcRev) && vcRev.length > 0) {
618
+ payload.attributes.properties['ufo:vc:rev'] = vcRev.filter(function (item) {
619
+ return item.revision !== 'raw-handler';
620
+ });
621
+ payload.attributes.properties['ufo:vc:raw:removed'] = true;
622
+ }
623
+ }
624
+ payload.attributes.properties['event:sizeInKb'] = (0, _getPayloadSize.default)(payload.attributes.properties);
625
+ } else {
626
+ payload.attributes.properties['event:sizeInKb'] = (0, _getPayloadSize.default)(payload.attributes.properties);
627
+ }
608
628
  return _context.abrupt("return", payload);
609
629
  case 47:
610
630
  case "end":
@@ -8,6 +8,7 @@ exports.default = void 0;
8
8
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9
9
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
10
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
11
+ var _coinflip = _interopRequireDefault(require("../../coinflip"));
11
12
  var _config = require("../../config");
12
13
  var _interactionMetrics = require("../../interaction-metrics");
13
14
  var _getInteractionStatus = _interopRequireDefault(require("./get-interaction-status"));
@@ -29,6 +30,7 @@ function _getVCMetrics() {
29
30
  isPageVisible,
30
31
  shouldReportVCMetrics,
31
32
  observer,
33
+ includeRawData,
32
34
  isSSREnabled,
33
35
  ssr,
34
36
  tti,
@@ -66,6 +68,7 @@ function _getVCMetrics() {
66
68
  }
67
69
  return _context.abrupt("return", {});
68
70
  case 14:
71
+ includeRawData = (0, _coinflip.default)((0, _config.getVCRawDataInteractionRate)(interaction.ufoName, interaction.type));
69
72
  isSSREnabled = interaction.type === 'page_load' && ((config === null || config === void 0 ? void 0 : config.ssr) || (config === null || config === void 0 || (_config$vc$ssrWhiteli = config.vc.ssrWhitelist) === null || _config$vc$ssrWhiteli === void 0 ? void 0 : _config$vc$ssrWhiteli.includes(interaction.ufoName)));
70
73
  ssr = interaction.type === 'page_load' && isSSREnabled ? {
71
74
  ssr: (0, _getSsrDoneTimeValue.default)(config)
@@ -73,7 +76,7 @@ function _getVCMetrics() {
73
76
  _interactionMetrics.postInteractionLog.setVCObserverSSRConfig(ssr);
74
77
  tti = (_interaction$apdex = interaction.apdex) === null || _interaction$apdex === void 0 || (_interaction$apdex = _interaction$apdex[0]) === null || _interaction$apdex === void 0 ? void 0 : _interaction$apdex.stopTime;
75
78
  prefix = 'ufo';
76
- _context.next = 21;
79
+ _context.next = 22;
77
80
  return observer.getVCResult(_objectSpread(_objectSpread({
78
81
  start: interaction.start,
79
82
  stop: interaction.end,
@@ -89,9 +92,10 @@ function _getVCMetrics() {
89
92
  include3p: include3p,
90
93
  excludeSmartAnswersInSearch: excludeSmartAnswersInSearch,
91
94
  interactionType: interaction.type,
92
- isPageVisible: isPageVisible
95
+ isPageVisible: isPageVisible,
96
+ includeRawData: includeRawData
93
97
  }));
94
- case 21:
98
+ case 22:
95
99
  result = _context.sent;
96
100
  observer.stop(interaction.ufoName);
97
101
  if (!include3p) {
@@ -105,15 +109,15 @@ function _getVCMetrics() {
105
109
  return revision === mostRecentVCRevision;
106
110
  });
107
111
  if (!(!shouldReportVCMetrics || !(mostRecentVCRevisionPayload !== null && mostRecentVCRevisionPayload !== void 0 && mostRecentVCRevisionPayload.clean))) {
108
- _context.next = 28;
112
+ _context.next = 29;
109
113
  break;
110
114
  }
111
115
  return _context.abrupt("return", result);
112
- case 28:
116
+ case 29:
113
117
  return _context.abrupt("return", _objectSpread(_objectSpread({}, result), {}, {
114
118
  'metric:vc90': mostRecentVCRevisionPayload['metric:vc90']
115
119
  }));
116
- case 29:
120
+ case 30:
117
121
  case "end":
118
122
  return _context.stop();
119
123
  }
@@ -122,11 +122,11 @@ var VCObserverWrapper = exports.VCObserverWrapper = /*#__PURE__*/function () {
122
122
  value: function () {
123
123
  var _getVCResult = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(param) {
124
124
  var _this$oldVCObserver4, _this$newVCObserver3, _ref2;
125
- var experienceKey, include3p, excludeSmartAnswersInSearch, includeSSRRatio, v1v2Result, v3Result, ssrRatio;
125
+ var experienceKey, include3p, excludeSmartAnswersInSearch, includeSSRRatio, includeRawData, v1v2Result, v3Result, ssrRatio;
126
126
  return _regenerator.default.wrap(function _callee$(_context) {
127
127
  while (1) switch (_context.prev = _context.next) {
128
128
  case 0:
129
- experienceKey = param.experienceKey, include3p = param.include3p, excludeSmartAnswersInSearch = param.excludeSmartAnswersInSearch, includeSSRRatio = param.includeSSRRatio;
129
+ experienceKey = param.experienceKey, include3p = param.include3p, excludeSmartAnswersInSearch = param.excludeSmartAnswersInSearch, includeSSRRatio = param.includeSSRRatio, includeRawData = param.includeRawData;
130
130
  if (!((0, _config.isVCRevisionEnabled)('fy25.01', experienceKey) || (0, _config.isVCRevisionEnabled)('fy25.02', experienceKey))) {
131
131
  _context.next = 7;
132
132
  break;
@@ -156,7 +156,8 @@ var VCObserverWrapper = exports.VCObserverWrapper = /*#__PURE__*/function () {
156
156
  includeSSRRatio: includeSSRRatio,
157
157
  interactionType: param.interactionType,
158
158
  isPageVisible: param.isPageVisible,
159
- interactionAbortReason: param.interactionAbortReason
159
+ interactionAbortReason: param.interactionAbortReason,
160
+ includeRawData: includeRawData
160
161
  });
161
162
  case 12:
162
163
  _context.t1 = _context.sent;
@@ -20,6 +20,7 @@ var _fy25_ = _interopRequireDefault(require("./metric-calculator/fy25_03"));
20
20
  var _getViewportHeight = _interopRequireDefault(require("./metric-calculator/utils/get-viewport-height"));
21
21
  var _getViewportWidth = _interopRequireDefault(require("./metric-calculator/utils/get-viewport-width"));
22
22
  var _vcnext = _interopRequireDefault(require("./metric-calculator/vcnext"));
23
+ var _rawDataHandler = _interopRequireDefault(require("./raw-data-handler"));
23
24
  var _viewportObserver = _interopRequireDefault(require("./viewport-observer"));
24
25
  var _windowEventObserver = _interopRequireDefault(require("./window-event-observer"));
25
26
  var SSRState = {
@@ -238,13 +239,14 @@ var VCObserverNew = exports.default = /*#__PURE__*/function () {
238
239
  key: "getVCResult",
239
240
  value: function () {
240
241
  var _getVCResult = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(param) {
241
- var start, stop, interactionId, interactionType, interactionAbortReason, isPageVisible, include3p, includeSSRRatio, excludeSmartAnswersInSearch, results, calculator_fy25_03, orderedEntries, fy25_03, calculator_next, vcNext;
242
+ var start, stop, interactionId, interactionType, interactionAbortReason, isPageVisible, include3p, includeSSRRatio, excludeSmartAnswersInSearch, includeRawData, results, feVCCalculationStartTime, calculator_fy25_03, orderedEntries, fy25_03, calculator_next, vcNext, feVCCalculationEndTime, rawVCCalculationStartTime, rawHandler, raw;
242
243
  return _regenerator.default.wrap(function _callee$(_context) {
243
244
  while (1) switch (_context.prev = _context.next) {
244
245
  case 0:
245
- start = param.start, stop = param.stop, interactionId = param.interactionId, interactionType = param.interactionType, interactionAbortReason = param.interactionAbortReason, isPageVisible = param.isPageVisible, include3p = param.include3p, includeSSRRatio = param.includeSSRRatio, excludeSmartAnswersInSearch = param.excludeSmartAnswersInSearch;
246
+ start = param.start, stop = param.stop, interactionId = param.interactionId, interactionType = param.interactionType, interactionAbortReason = param.interactionAbortReason, isPageVisible = param.isPageVisible, include3p = param.include3p, includeSSRRatio = param.includeSSRRatio, excludeSmartAnswersInSearch = param.excludeSmartAnswersInSearch, includeRawData = param.includeRawData;
246
247
  results = [];
247
248
  this.addStartEntry(start);
249
+ feVCCalculationStartTime = performance.now();
248
250
  calculator_fy25_03 = new _fy25_.default();
249
251
  if (param.ssr) {
250
252
  this.addSSR(param.ssr);
@@ -253,7 +255,7 @@ var VCObserverNew = exports.default = /*#__PURE__*/function () {
253
255
  start: start,
254
256
  stop: stop
255
257
  });
256
- _context.next = 8;
258
+ _context.next = 9;
257
259
  return calculator_fy25_03.calculate({
258
260
  orderedEntries: orderedEntries,
259
261
  startTime: start,
@@ -267,7 +269,7 @@ var VCObserverNew = exports.default = /*#__PURE__*/function () {
267
269
  isPageVisible: isPageVisible,
268
270
  interactionAbortReason: interactionAbortReason
269
271
  });
270
- case 8:
272
+ case 9:
271
273
  fy25_03 = _context.sent;
272
274
  if (fy25_03) {
273
275
  results.push(fy25_03);
@@ -275,7 +277,7 @@ var VCObserverNew = exports.default = /*#__PURE__*/function () {
275
277
 
276
278
  // TODO on cleanup: put behind `enabledVCRevisions` config
277
279
  calculator_next = new _vcnext.default();
278
- _context.next = 13;
280
+ _context.next = 14;
279
281
  return calculator_next.calculate({
280
282
  orderedEntries: orderedEntries,
281
283
  startTime: start,
@@ -288,13 +290,35 @@ var VCObserverNew = exports.default = /*#__PURE__*/function () {
288
290
  isPageVisible: isPageVisible,
289
291
  interactionAbortReason: interactionAbortReason
290
292
  });
291
- case 13:
293
+ case 14:
292
294
  vcNext = _context.sent;
293
295
  if (vcNext) {
294
296
  results.push(vcNext);
295
297
  }
298
+ feVCCalculationEndTime = performance.now();
299
+ if (!(includeRawData && (0, _platformFeatureFlags.fg)('platform_ufo_enable_vc_raw_data'))) {
300
+ _context.next = 24;
301
+ break;
302
+ }
303
+ rawVCCalculationStartTime = performance.now();
304
+ rawHandler = new _rawDataHandler.default();
305
+ _context.next = 22;
306
+ return rawHandler.getRawData({
307
+ entries: orderedEntries,
308
+ startTime: start,
309
+ stopTime: stop,
310
+ isPageVisible: isPageVisible
311
+ });
312
+ case 22:
313
+ raw = _context.sent;
314
+ if (raw) {
315
+ raw.rawVCTime = Number((performance.now() - rawVCCalculationStartTime).toFixed(2));
316
+ raw.feVCTime = Number((feVCCalculationEndTime - feVCCalculationStartTime).toFixed(2));
317
+ results.push(raw);
318
+ }
319
+ case 24:
296
320
  return _context.abrupt("return", results);
297
- case 16:
321
+ case 25:
298
322
  case "end":
299
323
  return _context.stop();
300
324
  }
@@ -0,0 +1,237 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
10
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
11
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
12
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
13
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
14
+ var _getViewportHeight = _interopRequireDefault(require("../metric-calculator/utils/get-viewport-height"));
15
+ var _getViewportWidth = _interopRequireDefault(require("../metric-calculator/utils/get-viewport-width"));
16
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
17
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
18
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
19
+ 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; }
20
+ 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; }
21
+ var ABORTING_WINDOW_EVENT = ['wheel', 'scroll', 'keydown', 'resize'];
22
+ var MAX_OBSERVATIONS = 100;
23
+ var RawDataHandler = exports.default = /*#__PURE__*/function () {
24
+ function RawDataHandler() {
25
+ (0, _classCallCheck2.default)(this, RawDataHandler);
26
+ (0, _defineProperty2.default)(this, "revisionNo", 'raw-handler');
27
+ }
28
+ return (0, _createClass2.default)(RawDataHandler, [{
29
+ key: "getVCCleanStatus",
30
+ value: function getVCCleanStatus(filteredEntries) {
31
+ var dirtyReason = '';
32
+ var abortTimestamp = -1;
33
+ var hasAbortEvent = filteredEntries.some(function (entry) {
34
+ if (entry.data.type === 'window:event') {
35
+ var data = entry.data;
36
+ if (ABORTING_WINDOW_EVENT.includes(data.eventType)) {
37
+ dirtyReason = data.eventType === 'keydown' ? 'keypress' : data.eventType;
38
+ abortTimestamp = Math.round(entry.time);
39
+ return true;
40
+ }
41
+ }
42
+ return false;
43
+ });
44
+ if (hasAbortEvent && dirtyReason) {
45
+ return {
46
+ isVCClean: false,
47
+ dirtyReason: dirtyReason,
48
+ abortTimestamp: abortTimestamp
49
+ };
50
+ }
51
+ return {
52
+ isVCClean: true
53
+ };
54
+ }
55
+ }, {
56
+ key: "getRawData",
57
+ value: function () {
58
+ var _getRawData = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(_ref) {
59
+ var entries, startTime, stopTime, isPageVisible, isVCClean, dirtyReason, getVCCleanStatusResult, viewportEntries, targetNameToIdMap, elementMapEntriesMap, nextElementId, typeMap, typeMapEntriesMap, nextTypeId, attributeMap, attributeEntriesMap, nextAttributeId, rawObservations, firstObservation, lastObservations, referencedEids, referencedChgs, referencedAtts, _iterator, _step, observation, _iterator2, _step2, eid, _iterator3, _step3, chg, _iterator4, _step4, att, result;
60
+ return _regenerator.default.wrap(function _callee$(_context) {
61
+ while (1) switch (_context.prev = _context.next) {
62
+ case 0:
63
+ entries = _ref.entries, startTime = _ref.startTime, stopTime = _ref.stopTime, isPageVisible = _ref.isPageVisible;
64
+ getVCCleanStatusResult = this.getVCCleanStatus(entries);
65
+ isVCClean = getVCCleanStatusResult.isVCClean;
66
+ dirtyReason = getVCCleanStatusResult.dirtyReason;
67
+ if (isPageVisible) {
68
+ _context.next = 6;
69
+ break;
70
+ }
71
+ return _context.abrupt("return", {
72
+ revision: this.revisionNo,
73
+ clean: false,
74
+ 'metric:vc90': null,
75
+ abortReason: 'browser_backgrounded',
76
+ abortTimestamp: -1,
77
+ viewport: {
78
+ w: (0, _getViewportWidth.default)(),
79
+ h: (0, _getViewportHeight.default)()
80
+ }
81
+ });
82
+ case 6:
83
+ viewportEntries = entries.filter(function (entry) {
84
+ return entry.time >= startTime && entry.time <= stopTime && entry.data && entry.data.visible;
85
+ });
86
+ targetNameToIdMap = new Map();
87
+ elementMapEntriesMap = {};
88
+ nextElementId = 1;
89
+ typeMap = new Map();
90
+ typeMapEntriesMap = {};
91
+ nextTypeId = 1;
92
+ attributeMap = new Map();
93
+ attributeEntriesMap = {};
94
+ nextAttributeId = 1;
95
+ rawObservations = viewportEntries.map(function (entry) {
96
+ var viewportEntry = entry.data;
97
+ var targetName = viewportEntry.elementName || '';
98
+ var type = viewportEntry.type || '';
99
+ var rect = viewportEntry.rect;
100
+ var attributeName = viewportEntry.attributeName || '';
101
+ var eid = targetNameToIdMap.get(viewportEntry.elementName || '') || 0;
102
+ if (eid === 0) {
103
+ eid = nextElementId;
104
+ nextElementId += 1;
105
+ targetNameToIdMap.set(targetName, eid);
106
+ elementMapEntriesMap[eid] = targetName;
107
+ }
108
+ var chg = typeMap.get(type || '') || 0;
109
+ if (chg === 0) {
110
+ chg = nextTypeId;
111
+ nextTypeId += 1;
112
+ typeMap.set(type, chg);
113
+ typeMapEntriesMap[chg] = type;
114
+ }
115
+ var att = 0;
116
+ if (attributeName) {
117
+ att = attributeMap.get(attributeName) || 0;
118
+ if (att === 0) {
119
+ att = nextAttributeId;
120
+ nextAttributeId += 1;
121
+ attributeMap.set(attributeName, att);
122
+ attributeEntriesMap[att] = attributeName;
123
+ }
124
+ }
125
+ var observation = _objectSpread({
126
+ t: Math.round(entry.time),
127
+ r: [Math.round(rect.left * 10) / 10, Math.round(rect.top * 10) / 10, Math.round(rect.right * 10) / 10, Math.round(rect.bottom * 10) / 10],
128
+ chg: chg,
129
+ eid: eid || 0
130
+ }, att > 0 ? {
131
+ att: att
132
+ } : {});
133
+ return observation;
134
+ }); // If the number of observations is greater than the maximum allowed, we need to trim the observations to the maximum allowed.
135
+ // We do this by keeping the first observation and the last MAX_OBSERVATIONS observations.
136
+ // We then collect the referenced IDs from the remaining observations and remove the unreferenced entries from the maps
137
+ if (rawObservations.length > MAX_OBSERVATIONS) {
138
+ firstObservation = rawObservations[0];
139
+ lastObservations = rawObservations.slice(-MAX_OBSERVATIONS);
140
+ rawObservations = [firstObservation].concat((0, _toConsumableArray2.default)(lastObservations));
141
+
142
+ // Collect referenced IDs from remaining observations
143
+ referencedEids = new Set();
144
+ referencedChgs = new Set();
145
+ referencedAtts = new Set();
146
+ _iterator = _createForOfIteratorHelper(rawObservations);
147
+ try {
148
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
149
+ observation = _step.value;
150
+ if (observation.eid > 0) {
151
+ referencedEids.add(observation.eid);
152
+ }
153
+ if (typeof observation.chg === 'number' && observation.chg > 0) {
154
+ referencedChgs.add(observation.chg);
155
+ }
156
+ if (observation.att !== undefined && observation.att > 0) {
157
+ referencedAtts.add(observation.att);
158
+ }
159
+ }
160
+
161
+ // Remove unreferenced entries from maps
162
+ } catch (err) {
163
+ _iterator.e(err);
164
+ } finally {
165
+ _iterator.f();
166
+ }
167
+ _iterator2 = _createForOfIteratorHelper(Object.keys(elementMapEntriesMap).map(Number));
168
+ try {
169
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
170
+ eid = _step2.value;
171
+ if (!referencedEids.has(eid)) {
172
+ delete elementMapEntriesMap[eid];
173
+ }
174
+ }
175
+ } catch (err) {
176
+ _iterator2.e(err);
177
+ } finally {
178
+ _iterator2.f();
179
+ }
180
+ _iterator3 = _createForOfIteratorHelper(Object.keys(typeMapEntriesMap).map(Number));
181
+ try {
182
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
183
+ chg = _step3.value;
184
+ if (!referencedChgs.has(chg)) {
185
+ delete typeMapEntriesMap[chg];
186
+ }
187
+ }
188
+ } catch (err) {
189
+ _iterator3.e(err);
190
+ } finally {
191
+ _iterator3.f();
192
+ }
193
+ _iterator4 = _createForOfIteratorHelper(Object.keys(attributeEntriesMap).map(Number));
194
+ try {
195
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
196
+ att = _step4.value;
197
+ if (!referencedAtts.has(att)) {
198
+ delete attributeEntriesMap[att];
199
+ }
200
+ }
201
+ } catch (err) {
202
+ _iterator4.e(err);
203
+ } finally {
204
+ _iterator4.f();
205
+ }
206
+ }
207
+ result = {
208
+ revision: this.revisionNo,
209
+ clean: isVCClean,
210
+ 'metric:vc90': null,
211
+ rawData: {
212
+ obs: rawObservations !== null && rawObservations !== void 0 ? rawObservations : undefined,
213
+ eid: elementMapEntriesMap !== null && elementMapEntriesMap !== void 0 ? elementMapEntriesMap : undefined,
214
+ chg: typeMapEntriesMap !== null && typeMapEntriesMap !== void 0 ? typeMapEntriesMap : undefined,
215
+ att: attributeEntriesMap !== null && attributeEntriesMap !== void 0 ? attributeEntriesMap : undefined
216
+ },
217
+ abortReason: dirtyReason,
218
+ abortTimestamp: getVCCleanStatusResult.abortTimestamp,
219
+ viewport: {
220
+ w: (0, _getViewportWidth.default)(),
221
+ h: (0, _getViewportHeight.default)()
222
+ }
223
+ };
224
+ return _context.abrupt("return", result);
225
+ case 20:
226
+ case "end":
227
+ return _context.stop();
228
+ }
229
+ }, _callee, this);
230
+ }));
231
+ function getRawData(_x) {
232
+ return _getRawData.apply(this, arguments);
233
+ }
234
+ return getRawData;
235
+ }()
236
+ }]);
237
+ }();
@@ -170,6 +170,9 @@ export function getExperimentalInteractionRate(name, interactionType) {
170
170
  return 0;
171
171
  }
172
172
  }
173
+ export function getVCRawDataInteractionRate(name, interactionType) {
174
+ return getConfigRate(name, interactionType, 'enableVCRawDataRates');
175
+ }
173
176
  export function getPostInteractionRate(name, interactionType) {
174
177
  return getConfigRate(name, interactionType, 'postInteractionLog');
175
178
  }
@@ -43,6 +43,7 @@ import { optimizeMarks } from './utils/optimize-marks';
43
43
  import { optimizeReactProfilerTimings } from './utils/optimize-react-profiler-timings';
44
44
  import { optimizeRequestInfo } from './utils/optimize-request-info';
45
45
  import { optimizeSpans } from './utils/optimize-spans';
46
+ const MAX_PAYLOAD_SIZE = 250;
46
47
  function getUfoNameOverride(interaction) {
47
48
  const {
48
49
  ufoName,
@@ -605,7 +606,22 @@ async function createInteractionMetricsPayload(interaction, interactionId, exper
605
606
  regularTTAI = undefined;
606
607
  expTTAI = undefined;
607
608
  }
608
- payload.attributes.properties['event:sizeInKb'] = getPayloadSize(payload.attributes.properties);
609
+ if (fg('platform_ufo_enable_vc_raw_data')) {
610
+ const size = getPayloadSize(payload.attributes.properties);
611
+ const vcRev = payload.attributes.properties['ufo:vc:rev'];
612
+ const rawData = vcRev.find(item => item.revision === 'raw-handler');
613
+ if (rawData) {
614
+ const rawDataSize = getPayloadSize(rawData);
615
+ payload.attributes.properties['ufo:vc:raw:size'] = rawDataSize;
616
+ if (size > MAX_PAYLOAD_SIZE && Array.isArray(vcRev) && vcRev.length > 0) {
617
+ payload.attributes.properties['ufo:vc:rev'] = vcRev.filter(item => item.revision !== 'raw-handler');
618
+ payload.attributes.properties['ufo:vc:raw:removed'] = true;
619
+ }
620
+ }
621
+ payload.attributes.properties['event:sizeInKb'] = getPayloadSize(payload.attributes.properties);
622
+ } else {
623
+ payload.attributes.properties['event:sizeInKb'] = getPayloadSize(payload.attributes.properties);
624
+ }
609
625
  return payload;
610
626
  }
611
627
  export async function createPayloads(interactionId, interaction) {
@@ -1,4 +1,5 @@
1
- import { getConfig, getMostRecentVCRevision } from '../../config';
1
+ import coinflip from '../../coinflip';
2
+ import { getConfig, getMostRecentVCRevision, getVCRawDataInteractionRate } from '../../config';
2
3
  import { interactionExtraMetrics, postInteractionLog } from '../../interaction-metrics';
3
4
  import getInteractionStatus from './get-interaction-status';
4
5
  import getPageVisibilityUpToTTAI from './get-page-visibility-up-to-ttai';
@@ -22,6 +23,7 @@ async function getVCMetrics(interaction, include3p = false, excludeSmartAnswersI
22
23
  if (!observer) {
23
24
  return {};
24
25
  }
26
+ const includeRawData = coinflip(getVCRawDataInteractionRate(interaction.ufoName, interaction.type));
25
27
  const isSSREnabled = interaction.type === 'page_load' && ((config === null || config === void 0 ? void 0 : config.ssr) || (config === null || config === void 0 ? void 0 : (_config$vc$ssrWhiteli = config.vc.ssrWhitelist) === null || _config$vc$ssrWhiteli === void 0 ? void 0 : _config$vc$ssrWhiteli.includes(interaction.ufoName)));
26
28
  const ssr = interaction.type === 'page_load' && isSSREnabled ? {
27
29
  ssr: getSSRDoneTimeValue(config)
@@ -44,7 +46,8 @@ async function getVCMetrics(interaction, include3p = false, excludeSmartAnswersI
44
46
  include3p,
45
47
  excludeSmartAnswersInSearch,
46
48
  interactionType: interaction.type,
47
- isPageVisible
49
+ isPageVisible,
50
+ includeRawData
48
51
  });
49
52
  observer.stop(interaction.ufoName);
50
53
  if (!include3p) {
@@ -97,7 +97,8 @@ export class VCObserverWrapper {
97
97
  experienceKey,
98
98
  include3p,
99
99
  excludeSmartAnswersInSearch,
100
- includeSSRRatio
100
+ includeSSRRatio,
101
+ includeRawData
101
102
  } = param;
102
103
  const v1v2Result = isVCRevisionEnabled('fy25.01', experienceKey) || isVCRevisionEnabled('fy25.02', experienceKey) ? await ((_this$oldVCObserver4 = this.oldVCObserver) === null || _this$oldVCObserver4 === void 0 ? void 0 : _this$oldVCObserver4.getVCResult(param)) : {};
103
104
  const v3Result = isVCRevisionEnabled('fy25.03', experienceKey) ? await ((_this$newVCObserver3 = this.newVCObserver) === null || _this$newVCObserver3 === void 0 ? void 0 : _this$newVCObserver3.getVCResult({
@@ -110,7 +111,8 @@ export class VCObserverWrapper {
110
111
  includeSSRRatio,
111
112
  interactionType: param.interactionType,
112
113
  isPageVisible: param.isPageVisible,
113
- interactionAbortReason: param.interactionAbortReason
114
+ interactionAbortReason: param.interactionAbortReason,
115
+ includeRawData
114
116
  })) : [];
115
117
  if (!v3Result) {
116
118
  return v1v2Result !== null && v1v2Result !== void 0 ? v1v2Result : {};
@@ -7,6 +7,7 @@ import VCCalculator_FY25_03 from './metric-calculator/fy25_03';
7
7
  import getViewportHeight from './metric-calculator/utils/get-viewport-height';
8
8
  import getViewportWidth from './metric-calculator/utils/get-viewport-width';
9
9
  import VCNextCalculator from './metric-calculator/vcnext';
10
+ import RawDataHandler from './raw-data-handler';
10
11
  import ViewportObserver from './viewport-observer';
11
12
  import WindowEventObserver from './window-event-observer';
12
13
  const SSRState = {
@@ -201,10 +202,12 @@ export default class VCObserverNew {
201
202
  isPageVisible,
202
203
  include3p,
203
204
  includeSSRRatio,
204
- excludeSmartAnswersInSearch
205
+ excludeSmartAnswersInSearch,
206
+ includeRawData
205
207
  } = param;
206
208
  const results = [];
207
209
  this.addStartEntry(start);
210
+ const feVCCalculationStartTime = performance.now();
208
211
  const calculator_fy25_03 = new VCCalculator_FY25_03();
209
212
  if (param.ssr) {
210
213
  this.addSSR(param.ssr);
@@ -247,6 +250,22 @@ export default class VCObserverNew {
247
250
  if (vcNext) {
248
251
  results.push(vcNext);
249
252
  }
253
+ const feVCCalculationEndTime = performance.now();
254
+ if (includeRawData && fg('platform_ufo_enable_vc_raw_data')) {
255
+ const rawVCCalculationStartTime = performance.now();
256
+ const rawHandler = new RawDataHandler();
257
+ const raw = await rawHandler.getRawData({
258
+ entries: orderedEntries,
259
+ startTime: start,
260
+ stopTime: stop,
261
+ isPageVisible
262
+ });
263
+ if (raw) {
264
+ raw.rawVCTime = Number((performance.now() - rawVCCalculationStartTime).toFixed(2));
265
+ raw.feVCTime = Number((feVCCalculationEndTime - feVCCalculationStartTime).toFixed(2));
266
+ results.push(raw);
267
+ }
268
+ }
250
269
  return results;
251
270
  }
252
271
  addStartEntry(startTime) {