@atlaskit/react-ufo 4.15.2 → 4.15.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.
- package/CHANGELOG.md +14 -0
- package/dist/cjs/create-payload/index.js +1 -1
- package/dist/cjs/segment/segment.js +10 -1
- package/dist/cjs/segment/ssr-render-profiler.js +79 -0
- package/dist/cjs/ssr/index.js +103 -8
- package/dist/es2019/create-payload/index.js +1 -1
- package/dist/es2019/segment/segment.js +10 -1
- package/dist/es2019/segment/ssr-render-profiler.js +68 -0
- package/dist/es2019/ssr/index.js +103 -8
- package/dist/esm/create-payload/index.js +1 -1
- package/dist/esm/segment/segment.js +10 -1
- package/dist/esm/segment/ssr-render-profiler.js +72 -0
- package/dist/esm/ssr/index.js +102 -8
- package/dist/types/segment/ssr-render-profiler.d.ts +9 -0
- package/dist/types/ssr/index.d.ts +1 -0
- package/dist/types-ts4.5/segment/ssr-render-profiler.d.ts +9 -0
- package/dist/types-ts4.5/ssr/index.d.ts +1 -0
- package/package.json +7 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# @atlaskit/ufo-interaction-ignore
|
|
2
2
|
|
|
3
|
+
## 4.15.4
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [`81a0f341fac4f`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/81a0f341fac4f) -
|
|
8
|
+
Platformise Jira's SSR Render Profiler timings
|
|
9
|
+
|
|
10
|
+
## 4.15.3
|
|
11
|
+
|
|
12
|
+
### Patch Changes
|
|
13
|
+
|
|
14
|
+
- [`bf14a236a3255`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/bf14a236a3255) -
|
|
15
|
+
Platformise SSR edge timings within UFO
|
|
16
|
+
|
|
3
17
|
## 4.15.2
|
|
4
18
|
|
|
5
19
|
### Patch Changes
|
|
@@ -8,7 +8,7 @@ if(cohortingCustomData&&cohortingCustomData.size>0){var _interaction$labelSta,_c
|
|
|
8
8
|
try{return acc+item.cssRules.length;}catch(e){return acc;}},0);var styleElements=doc.querySelectorAll('style').length;var styleProps=doc.querySelectorAll('[style]');var styleDeclarations=Array.from(doc.querySelectorAll('[style]')).reduce(function(acc,item){try{if('style'in item){return acc+item.style.length;}else{return acc;}}catch(e){return acc;}},0);return{'ufo:stylesheets':stylesheetCount,'ufo:styleElements':styleElements,'ufo:styleProps':styleProps.length,'ufo:styleDeclarations':styleDeclarations,'ufo:cssrules':cssrules};}catch(e){return{};}}var regularTTAI;var expTTAI;function getErrorCounts(interaction){return{'ufo:errors:globalCount':(0,_globalErrorHandler.getGlobalErrorCount)(),'ufo:errors:count':interaction.errors.length};}function createInteractionMetricsPayload(_x,_x2,_x3,_x4,_x5){return _createInteractionMetricsPayload.apply(this,arguments);}function _createInteractionMetricsPayload(){_createInteractionMetricsPayload=(0,_asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee(interaction,interactionId,experimental,criticalPayloadCount,vcMetrics){var _window$location,_config$additionalPay;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;return _regenerator.default.wrap(function _callee$(_context){while(1)switch(_context.prev=_context.next){case 0:interactionPayloadStart=performance.now();config=(0,_config.getConfig)();if(config){_context.next=4;break;}throw Error('UFO Configuration not provided');case 4:end=interaction.end,start=interaction.start,ufoName=interaction.ufoName,knownSegments=interaction.knownSegments,rate=interaction.rate,type=interaction.type,abortReason=interaction.abortReason,routeName=interaction.routeName,featureFlags=interaction.featureFlags,previousInteractionName=interaction.previousInteractionName,isPreviousInteractionAborted=interaction.isPreviousInteractionAborted,abortedByInteractionName=interaction.abortedByInteractionName,responsiveness=interaction.responsiveness,unknownElementName=interaction.unknownElementName,unknownElementHierarchy=interaction.unknownElementHierarchy,hydration=interaction.hydration;pageVisibilityAtTTI=getPageVisibilityUpToTTI(interaction);pageVisibilityAtTTAI=(0,_getPageVisibilityUpToTtai.default)(interaction);segments=!(0,_platformFeatureFlags.fg)('platform_ufo_remove_deprecated_config_fields')&&config.killswitchNestedSegments?[]:knownSegments;segmentTree=(0,_getReactUfoPayloadVersion.getReactUFOPayloadVersion)(interaction.type)==='2.0.0'?(0,_utils.buildSegmentTree)(segments.map(function(segment){return segment.labelStack;})):{};isDetailedPayload=pageVisibilityAtTTAI==='visible';isPageLoad=type==='page_load';calculatePageVisibilityFromTheStartOfPageLoad=config.enableBetterPageVisibilityApi&&isPageLoad;moreAccuratePageVisibilityAtTTI=calculatePageVisibilityFromTheStartOfPageLoad?getMoreAccuratePageVisibilityUpToTTI(interaction):null;moreAccuratePageVisibilityAtTTAI=calculatePageVisibilityFromTheStartOfPageLoad?(0,_getMoreAccuratePageVisibilityUpToTtai.getMoreAccuratePageVisibilityUpToTTAI)(interaction):null;labelStack=interaction.labelStack?{labelStack:(0,_utils.optimizeLabelStack)(interaction.labelStack,(0,_getReactUfoPayloadVersion.getReactUFOPayloadVersion)(interaction.type))}:{};// Page Load
|
|
9
9
|
getInitialPageLoadSSRMetrics=function getInitialPageLoadSSRMetrics(){var _config$ssr;if(!isPageLoad){return{};}var config=(0,_config.getConfig)();var SSRDoneTimeValue=(0,_getSsrDoneTimeValue.default)(config);var SSRDoneTime=SSRDoneTimeValue!==undefined?{SSRDoneTime:Math.round(SSRDoneTimeValue)}:{};var isBM3ConfigSSRDoneAsFmp=interaction.metaData.__legacy__bm3ConfigSSRDoneAsFmp;var isUFOConfigSSRDoneAsFmp=interaction.metaData.__legacy__bm3ConfigSSRDoneAsFmp||!!(config!==null&&config!==void 0&&(_config$ssr=config.ssr)!==null&&_config$ssr!==void 0&&_config$ssr.getSSRDoneTime);if(!experimental&&(isBM3ConfigSSRDoneAsFmp||isUFOConfigSSRDoneAsFmp)&&SSRDoneTimeValue!==undefined){try{performance.mark("FMP",{startTime:SSRDoneTimeValue,detail:{devtools:{dataType:'marker'}}});}catch(e){}}return _objectSpread(_objectSpread({},SSRDoneTime),{},{isBM3ConfigSSRDoneAsFmp:isBM3ConfigSSRDoneAsFmp,isUFOConfigSSRDoneAsFmp:isUFOConfigSSRDoneAsFmp});};pageLoadInteractionMetrics=getInitialPageLoadSSRMetrics();// Detailed payload. Page visibility = visible
|
|
10
10
|
getDetailedInteractionMetrics=function getDetailedInteractionMetrics(resourceTimings){if(experimental||window.__UFO_COMPACT_PAYLOAD__||!isDetailedPayload){return{};}var spans=[].concat((0,_toConsumableArray2.default)(interaction.spans),(0,_toConsumableArray2.default)(_interactionMetrics.interactionSpans));_interactionMetrics.interactionSpans.length=0;return{errors:interaction.errors.map(function(_ref2){var labelStack=_ref2.labelStack,others=(0,_objectWithoutProperties2.default)(_ref2,_excluded);return _objectSpread(_objectSpread({},others),{},{labelStack:labelStack&&(0,_utils.optimizeLabelStack)(labelStack,(0,_getReactUfoPayloadVersion.getReactUFOPayloadVersion)(interaction.type))});}),holdActive:(0,_toConsumableArray2.default)(interaction.holdActive.values()),redirects:optimizeRedirects(interaction.redirects,start),holdInfo:(0,_optimizeHoldInfo.optimizeHoldInfo)(experimental?interaction.holdExpInfo:interaction.holdInfo,start,(0,_getReactUfoPayloadVersion.getReactUFOPayloadVersion)(interaction.type)),spans:(0,_optimizeSpans.optimizeSpans)(spans,start,(0,_getReactUfoPayloadVersion.getReactUFOPayloadVersion)(interaction.type)),requestInfo:(0,_optimizeRequestInfo.optimizeRequestInfo)(interaction.requestInfo,start,(0,_getReactUfoPayloadVersion.getReactUFOPayloadVersion)(interaction.type)),customTimings:(0,_optimizeCustomTimings.optimizeCustomTimings)(interaction.customTimings,start),bundleEvalTimings:objectToArray(getBundleEvalTimings(start)),resourceTimings:objectToArray(resourceTimings)};};// Page load & detailed payload
|
|
11
|
-
getPageLoadDetailedInteractionMetrics=function getPageLoadDetailedInteractionMetrics(){var _config$
|
|
11
|
+
getPageLoadDetailedInteractionMetrics=function getPageLoadDetailedInteractionMetrics(){var _config$ssr3;if(!isPageLoad||!isDetailedPayload){return{};}var initialPageLoadExtraTimings=objectToArray(initialPageLoadExtraTiming.getTimings());var config=(0,_config.getConfig)();if((0,_platformFeatureFlags.fg)('platform_ufo_default_ssr_edge_timings')){var _config$ssr2;return{initialPageLoadExtraTimings:initialPageLoadExtraTimings,SSRTimings:config!==null&&config!==void 0&&(_config$ssr2=config.ssr)!==null&&_config$ssr2!==void 0&&_config$ssr2.getSSRTimings?[].concat((0,_toConsumableArray2.default)(config.ssr.getSSRTimings()),(0,_toConsumableArray2.default)(objectToArray(ssr.getSSRTimings()))):objectToArray(ssr.getSSRTimings())};}return{initialPageLoadExtraTimings:initialPageLoadExtraTimings,SSRTimings:config!==null&&config!==void 0&&(_config$ssr3=config.ssr)!==null&&_config$ssr3!==void 0&&_config$ssr3.getSSRTimings?config.ssr.getSSRTimings():objectToArray(ssr.getSSRTimings())};};if(experimental){expTTAI=(0,_getTtai.default)(interaction);}else{regularTTAI=(0,_getTtai.default)(interaction);}newUFOName=(0,_utils.sanitizeUfoName)(ufoName);resourceTimings=getResourceTimings(start,end);_context.t0=Promise;_context.t1=vcMetrics;if(_context.t1){_context.next=28;break;}_context.next=27;return(0,_getVcMetrics.default)(interaction);case 27:_context.t1=_context.sent;case 28:_context.t2=_context.t1;_context.t3=experimental?(0,_createExperimentalInteractionMetricsPayload.getExperimentalVCMetrics)(interaction):Promise.resolve(undefined);_context.t4=(0,_getPaintMetrics.getPaintMetricsToLegacyFormat)(type,end);_context.t5=(0,_getBatteryInfo.getBatteryInfoToLegacyFormat)();_context.t6=[_context.t2,_context.t3,_context.t4,_context.t5];_context.next=35;return _context.t0.all.call(_context.t0,_context.t6);case 35:_yield$Promise$all=_context.sent;_yield$Promise$all2=(0,_slicedToArray2.default)(_yield$Promise$all,4);finalVCMetrics=_yield$Promise$all2[0];experimentalMetrics=_yield$Promise$all2[1];paintMetrics=_yield$Promise$all2[2];batteryInfo=_yield$Promise$all2[3];if(!experimental){(0,_addPerformanceMeasures.addPerformanceMeasures)(interaction.start,(0,_toConsumableArray2.default)((finalVCMetrics===null||finalVCMetrics===void 0?void 0:finalVCMetrics['ufo:vc:rev'])||[]));}getReactHydrationStats=function getReactHydrationStats(){if(!hydration){return{};}return{hydration:hydration};};payload={actionSubject:'experience',action:'measured',eventType:'operational',source:'measured',tags:['observability'],attributes:{properties:_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({// basic
|
|
12
12
|
'event:hostname':((_window$location=window.location)===null||_window$location===void 0?void 0:_window$location.hostname)||'unknown','event:product':config.product,'event:schema':'1.0.0','event:sizeInKb':0,'event:source':{name:'react-ufo/web',version:(0,_getReactUfoPayloadVersion.getReactUFOPayloadVersion)(interaction.type)},'event:region':config.region||'unknown','experience:key':experimental?'custom.experimental-interaction-metrics':'custom.interaction-metrics','experience:name':newUFOName,// Include CPU usage monitoring data
|
|
13
13
|
'event:cpu:usage':(0,_machineUtilisation.createPressureStateReport)(interaction.start,interaction.end),'event:memory:usage':(0,_machineUtilisation.createMemoryStateReport)(interaction.start,interaction.end)},criticalPayloadCount!==undefined?{'ufo:multipayload':true,'ufo:criticalPayloadCount':criticalPayloadCount}:{}),(0,_getBrowserMetadata.getBrowserMetadataToLegacyFormat)()),batteryInfo),getSSRProperties(type)),getAssetsMetrics(interaction,pageLoadInteractionMetrics===null||pageLoadInteractionMetrics===void 0?void 0:pageLoadInteractionMetrics.SSRDoneTime)),getPPSMetrics(interaction)),paintMetrics),(0,_getNavigationMetrics.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)),getReactHydrationStats()),{},{interactionMetrics:_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({namePrefix:config.namePrefix||'',segmentPrefix:config.segmentPrefix||'',interactionId:interactionId,pageVisibilityAtTTI:pageVisibilityAtTTI,pageVisibilityAtTTAI:pageVisibilityAtTTAI,experimental__pageVisibilityAtTTI:moreAccuratePageVisibilityAtTTI,experimental__pageVisibilityAtTTAI:moreAccuratePageVisibilityAtTTAI,// raw interaction metrics
|
|
14
14
|
rate:rate,routeName:routeName,type:type,abortReason:abortReason,featureFlags:featureFlags,previousInteractionName:previousInteractionName,isPreviousInteractionAborted:isPreviousInteractionAborted,abortedByInteractionName:abortedByInteractionName,// performance
|
|
@@ -11,6 +11,7 @@ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers
|
|
|
11
11
|
var _react = _interopRequireWildcard(require("react"));
|
|
12
12
|
var _scheduler = require("scheduler");
|
|
13
13
|
var _uuid = require("uuid");
|
|
14
|
+
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
|
|
14
15
|
var _coinflip = _interopRequireDefault(require("../coinflip"));
|
|
15
16
|
var _config = require("../config");
|
|
16
17
|
var _experienceTraceIdContext = require("../experience-trace-id-context");
|
|
@@ -20,6 +21,7 @@ var _interactionMetrics = require("../interaction-metrics");
|
|
|
20
21
|
var _routeNameContext = _interopRequireDefault(require("../route-name-context"));
|
|
21
22
|
var _shortId = _interopRequireDefault(require("../short-id"));
|
|
22
23
|
var _scheduleOnPaint = _interopRequireDefault(require("./schedule-on-paint"));
|
|
24
|
+
var _ssrRenderProfiler = _interopRequireDefault(require("./ssr-render-profiler"));
|
|
23
25
|
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); }
|
|
24
26
|
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; }
|
|
25
27
|
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; } // eslint-disable-next-line @atlaskit/platform/prefer-crypto-random-uuid -- Use crypto.randomUUID instead
|
|
@@ -277,11 +279,18 @@ function UFOSegment(_ref) {
|
|
|
277
279
|
return l.name;
|
|
278
280
|
}).join('/');
|
|
279
281
|
}, [labelStack]);
|
|
280
|
-
|
|
282
|
+
var ufoSegment = /*#__PURE__*/_react.default.createElement(_interactionContext.default.Provider, {
|
|
281
283
|
value: interactionContext
|
|
282
284
|
}, /*#__PURE__*/_react.default.createElement(_react.Profiler, {
|
|
283
285
|
id: reactProfilerId,
|
|
284
286
|
onRender: onRender
|
|
285
287
|
}, children));
|
|
288
|
+
if ((0, _platformFeatureFlags.fg)('platform_ufo_ssr_render_profiler')) {
|
|
289
|
+
return /*#__PURE__*/_react.default.createElement(_ssrRenderProfiler.default, {
|
|
290
|
+
labelStack: labelStack,
|
|
291
|
+
onRender: interactionContext.onRender
|
|
292
|
+
}, ufoSegment);
|
|
293
|
+
}
|
|
294
|
+
return ufoSegment;
|
|
286
295
|
}
|
|
287
296
|
UFOSegment.displayName = 'UFOSegment';
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = exports.SsrRenderProfilerInner = void 0;
|
|
8
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
9
|
+
var _interactionMetrics = require("../interaction-metrics");
|
|
10
|
+
var _process;
|
|
11
|
+
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); }
|
|
12
|
+
// These are stored outside react context to be resilient to concurrent mode
|
|
13
|
+
// restarting the start marker from a suspense and losing the initial render
|
|
14
|
+
var startTimes = new Map();
|
|
15
|
+
// Keep track of the last interaction id and reset the start timers if it ever changes.
|
|
16
|
+
// This is to allow multi-step ssr to track the render timers from different "interaction"s seperately
|
|
17
|
+
var lastActiveInteraction;
|
|
18
|
+
function checkActiveInteractionAndResetStartMarksIfSet() {
|
|
19
|
+
var _getActiveInteraction;
|
|
20
|
+
var activeInteractionId = (_getActiveInteraction = (0, _interactionMetrics.getActiveInteraction)()) === null || _getActiveInteraction === void 0 ? void 0 : _getActiveInteraction.id;
|
|
21
|
+
if (!!lastActiveInteraction && lastActiveInteraction !== activeInteractionId) {
|
|
22
|
+
startTimes.clear();
|
|
23
|
+
}
|
|
24
|
+
lastActiveInteraction = activeInteractionId;
|
|
25
|
+
}
|
|
26
|
+
var onStartRender = function onStartRender(id) {
|
|
27
|
+
var _startTimes$get;
|
|
28
|
+
if (!startTimes.has(id)) {
|
|
29
|
+
startTimes.set(id, []);
|
|
30
|
+
}
|
|
31
|
+
(_startTimes$get = startTimes.get(id)) === null || _startTimes$get === void 0 || _startTimes$get.push(performance.now());
|
|
32
|
+
};
|
|
33
|
+
var isInSSR = Boolean(globalThis === null || globalThis === void 0 ? void 0 : globalThis.__SERVER__) || typeof process !== 'undefined' && Boolean(((_process = process) === null || _process === void 0 || (_process = _process.env) === null || _process === void 0 ? void 0 : _process.REACT_SSR) || false);
|
|
34
|
+
var ProfilerMarker = function ProfilerMarker(_ref) {
|
|
35
|
+
var onRender = _ref.onRender;
|
|
36
|
+
if (isInSSR) {
|
|
37
|
+
onRender === null || onRender === void 0 || onRender();
|
|
38
|
+
}
|
|
39
|
+
return null;
|
|
40
|
+
};
|
|
41
|
+
var SsrRenderProfilerInner = exports.SsrRenderProfilerInner = function SsrRenderProfilerInner(_ref2) {
|
|
42
|
+
var children = _ref2.children,
|
|
43
|
+
labelStack = _ref2.labelStack,
|
|
44
|
+
_onRender = _ref2.onRender;
|
|
45
|
+
var reactProfilerId = (0, _react.useMemo)(function () {
|
|
46
|
+
return labelStack.map(function (l) {
|
|
47
|
+
return l.name;
|
|
48
|
+
}).join('/');
|
|
49
|
+
}, [labelStack]);
|
|
50
|
+
checkActiveInteractionAndResetStartMarksIfSet();
|
|
51
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(ProfilerMarker, {
|
|
52
|
+
onRender: function onRender() {
|
|
53
|
+
return onStartRender(reactProfilerId);
|
|
54
|
+
}
|
|
55
|
+
}), children, /*#__PURE__*/_react.default.createElement(ProfilerMarker, {
|
|
56
|
+
onRender: function onRender() {
|
|
57
|
+
var startTimesForId = startTimes.get(reactProfilerId);
|
|
58
|
+
if (startTimesForId !== null && startTimesForId !== void 0 && startTimesForId.length) {
|
|
59
|
+
var endTime = performance.now();
|
|
60
|
+
var firstStartTime = startTimesForId[0];
|
|
61
|
+
var lastStartTime = startTimesForId[startTimesForId.length - 1];
|
|
62
|
+
var baseDuration = endTime - lastStartTime;
|
|
63
|
+
var actualDuration = endTime - firstStartTime;
|
|
64
|
+
_onRender('mount',
|
|
65
|
+
// this is incorrect, but on the server there is no mount phase
|
|
66
|
+
actualDuration, baseDuration, firstStartTime, endTime);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}));
|
|
70
|
+
};
|
|
71
|
+
var SsrRenderProfiler = function SsrRenderProfiler(props) {
|
|
72
|
+
if (isInSSR) {
|
|
73
|
+
return /*#__PURE__*/_react.default.createElement(SsrRenderProfilerInner, props);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// ensure structure similar to SSR implementation
|
|
77
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(ProfilerMarker, null), props.children);
|
|
78
|
+
};
|
|
79
|
+
var _default = exports.default = SsrRenderProfiler;
|
package/dist/cjs/ssr/index.js
CHANGED
|
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
7
|
exports.configure = configure;
|
|
8
|
+
exports.getEdgeTimingsIncludingCloudfront = getEdgeTimingsIncludingCloudfront;
|
|
8
9
|
exports.getSSRDoneTime = getSSRDoneTime;
|
|
9
10
|
exports.getSSRFeatureFlags = getSSRFeatureFlags;
|
|
10
11
|
exports.getSSRPhaseSuccess = getSSRPhaseSuccess;
|
|
@@ -12,10 +13,9 @@ exports.getSSRSuccess = getSSRSuccess;
|
|
|
12
13
|
exports.getSSRTimings = getSSRTimings;
|
|
13
14
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
14
15
|
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
|
16
|
+
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
|
|
15
17
|
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; }
|
|
16
18
|
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; }
|
|
17
|
-
//
|
|
18
|
-
|
|
19
19
|
var NESTED_METRIC_SEPARATOR = '/';
|
|
20
20
|
function filterEntry(entry) {
|
|
21
21
|
return !(!entry || (0, _typeof2.default)(entry) !== 'object' || entry.startTime < 0 || entry.duration < 0);
|
|
@@ -39,16 +39,111 @@ var config;
|
|
|
39
39
|
function configure(ssrConfig) {
|
|
40
40
|
config = ssrConfig;
|
|
41
41
|
}
|
|
42
|
+
function getPerformanceNavigationTiming() {
|
|
43
|
+
var _performance$getEntri;
|
|
44
|
+
// getEntriesByType doesn't change the returned type based on the given type key
|
|
45
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
46
|
+
return (_performance$getEntri = performance.getEntriesByType('navigation')) === null || _performance$getEntri === void 0 ? void 0 : _performance$getEntri[0];
|
|
47
|
+
}
|
|
48
|
+
function getServerTimingsByName() {
|
|
49
|
+
var _getPerformanceNaviga, _getPerformanceNaviga2;
|
|
50
|
+
var serverTimingsByName = Object.fromEntries((_getPerformanceNaviga = (_getPerformanceNaviga2 = getPerformanceNavigationTiming()) === null || _getPerformanceNaviga2 === void 0 || (_getPerformanceNaviga2 = _getPerformanceNaviga2.serverTiming) === null || _getPerformanceNaviga2 === void 0 ? void 0 : _getPerformanceNaviga2.map(function (timing) {
|
|
51
|
+
return [timing.name, timing];
|
|
52
|
+
})) !== null && _getPerformanceNaviga !== void 0 ? _getPerformanceNaviga : []);
|
|
53
|
+
return serverTimingsByName;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* If we have the edge's view of ttfb and the clients view as well, then we should take the gap between them as
|
|
58
|
+
* the offset to use foe edge start time.
|
|
59
|
+
* This will simulate the network delays between the client and the edge as an edge startTime increase
|
|
60
|
+
*/
|
|
61
|
+
function getEdgeOffset(edgeTtfb) {
|
|
62
|
+
var _getPerformanceNaviga3;
|
|
63
|
+
var clientTtfb = (_getPerformanceNaviga3 = getPerformanceNavigationTiming()) === null || _getPerformanceNaviga3 === void 0 ? void 0 : _getPerformanceNaviga3.responseStart;
|
|
64
|
+
if (edgeTtfb == null || clientTtfb == null) {
|
|
65
|
+
return 0;
|
|
66
|
+
}
|
|
67
|
+
return clientTtfb - edgeTtfb;
|
|
68
|
+
}
|
|
69
|
+
function getEdgeTimingsIncludingCloudfront() {
|
|
70
|
+
var _serverTimingsByName$, _serverTimingsByName$2, _serverTimingsByName$3, _serverTimingsByName$4, _serverTimingsByName$5, _serverTimingsByName$6, _serverTimingsByName$7, _serverTimingsByName$8, _serverTimingsByName$9;
|
|
71
|
+
var serverTimingsByName = getServerTimingsByName();
|
|
72
|
+
var edgeTotalDuration = (_serverTimingsByName$ = (_serverTimingsByName$2 = serverTimingsByName['cdn-downstream-fbl']) === null || _serverTimingsByName$2 === void 0 ? void 0 : _serverTimingsByName$2.duration) !== null && _serverTimingsByName$ !== void 0 ? _serverTimingsByName$ : (_serverTimingsByName$3 = serverTimingsByName['atl-edge']) === null || _serverTimingsByName$3 === void 0 ? void 0 : _serverTimingsByName$3.duration;
|
|
73
|
+
if (!edgeTotalDuration) {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
var edgeOffset = getEdgeOffset(edgeTotalDuration);
|
|
77
|
+
var cfInternalDuration = (((_serverTimingsByName$4 = serverTimingsByName['cdn-upstream-dns']) === null || _serverTimingsByName$4 === void 0 ? void 0 : _serverTimingsByName$4.duration) || 0) + (((_serverTimingsByName$5 = serverTimingsByName['cdn-upstream-connect']) === null || _serverTimingsByName$5 === void 0 ? void 0 : _serverTimingsByName$5.duration) || 0);
|
|
78
|
+
var cfUpstreamDuration = (((_serverTimingsByName$6 = serverTimingsByName['cdn-upstream-fbl']) === null || _serverTimingsByName$6 === void 0 ? void 0 : _serverTimingsByName$6.duration) || 0) - cfInternalDuration;
|
|
79
|
+
var cfDownstreamDuration = (((_serverTimingsByName$7 = serverTimingsByName['cdn-downstream-fbl']) === null || _serverTimingsByName$7 === void 0 ? void 0 : _serverTimingsByName$7.duration) || 0) - (((_serverTimingsByName$8 = serverTimingsByName['cdn-upstream-fbl']) === null || _serverTimingsByName$8 === void 0 ? void 0 : _serverTimingsByName$8.duration) || 0);
|
|
80
|
+
var atlEdgeDuration = (_serverTimingsByName$9 = serverTimingsByName['atl-edge']) === null || _serverTimingsByName$9 === void 0 ? void 0 : _serverTimingsByName$9.duration;
|
|
81
|
+
var cfToAtlEdgeNetworkDuration = cfUpstreamDuration - atlEdgeDuration;
|
|
82
|
+
var edgeTimings = {
|
|
83
|
+
edge: {
|
|
84
|
+
startTime: edgeOffset,
|
|
85
|
+
duration: edgeTotalDuration
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
if (typeof serverTimingsByName['cdn-downstream-fbl'] !== 'undefined') {
|
|
89
|
+
var _serverTimingsByName$0;
|
|
90
|
+
edgeTimings['edge/cf'] = {
|
|
91
|
+
startTime: edgeOffset,
|
|
92
|
+
duration: (_serverTimingsByName$0 = serverTimingsByName['cdn-downstream-fbl']) === null || _serverTimingsByName$0 === void 0 ? void 0 : _serverTimingsByName$0.duration
|
|
93
|
+
};
|
|
94
|
+
edgeTimings['edge/cf/internal'] = {
|
|
95
|
+
startTime: edgeOffset,
|
|
96
|
+
duration: cfInternalDuration
|
|
97
|
+
};
|
|
98
|
+
edgeTimings['edge/cf/upstream'] = {
|
|
99
|
+
startTime: edgeOffset + cfInternalDuration,
|
|
100
|
+
duration: cfUpstreamDuration
|
|
101
|
+
};
|
|
102
|
+
edgeTimings['edge/cf/downstream'] = {
|
|
103
|
+
startTime: edgeOffset + cfInternalDuration + cfUpstreamDuration,
|
|
104
|
+
duration: cfDownstreamDuration
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
if (typeof serverTimingsByName['atl-edge'] !== 'undefined') {
|
|
108
|
+
var _serverTimingsByName$1;
|
|
109
|
+
edgeTimings['edge/atl-edge'] = {
|
|
110
|
+
startTime: edgeOffset + cfInternalDuration + cfToAtlEdgeNetworkDuration,
|
|
111
|
+
duration: atlEdgeDuration
|
|
112
|
+
};
|
|
113
|
+
edgeTimings['edge/atl-edge/internal'] = {
|
|
114
|
+
startTime: edgeOffset + cfInternalDuration + cfToAtlEdgeNetworkDuration,
|
|
115
|
+
duration: (_serverTimingsByName$1 = serverTimingsByName['atl-edge-internal']) === null || _serverTimingsByName$1 === void 0 ? void 0 : _serverTimingsByName$1.duration
|
|
116
|
+
};
|
|
117
|
+
edgeTimings['edge/atl-edge/ttfb'] = {
|
|
118
|
+
startTime: edgeOffset + cfInternalDuration + cfToAtlEdgeNetworkDuration,
|
|
119
|
+
duration: atlEdgeDuration
|
|
120
|
+
};
|
|
121
|
+
edgeTimings['edge/cf/upstream/network'] = {
|
|
122
|
+
startTime: edgeOffset + cfInternalDuration,
|
|
123
|
+
duration: cfToAtlEdgeNetworkDuration
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// we need a timer here to prevent UFO pipeline from shifting SSR timers to start at 0
|
|
128
|
+
(edgeTimings === null || edgeTimings === void 0 ? void 0 : edgeTimings.edge) && edgeOffset && Object.assign(edgeTimings, {
|
|
129
|
+
'client-network': {
|
|
130
|
+
startTime: 0,
|
|
131
|
+
duration: edgeOffset
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
return edgeTimings;
|
|
135
|
+
}
|
|
42
136
|
function getSSRTimings() {
|
|
43
137
|
var _config;
|
|
44
|
-
|
|
45
|
-
|
|
138
|
+
var defaultSSRTimings = {};
|
|
139
|
+
if ((0, _platformFeatureFlags.fg)('platform_ufo_default_ssr_edge_timings')) {
|
|
140
|
+
defaultSSRTimings = getEdgeTimingsIncludingCloudfront();
|
|
46
141
|
}
|
|
47
|
-
var
|
|
48
|
-
if (
|
|
49
|
-
|
|
142
|
+
var configTimings = {};
|
|
143
|
+
if (typeof ((_config = config) === null || _config === void 0 ? void 0 : _config.getTimings) === 'function') {
|
|
144
|
+
configTimings = config.getTimings();
|
|
50
145
|
}
|
|
51
|
-
var ssrTimings = Object.entries(
|
|
146
|
+
var ssrTimings = Object.entries(_objectSpread(_objectSpread({}, configTimings), defaultSSRTimings)).reduce(function (acc, entry) {
|
|
52
147
|
if (filterEntry(entry[1])) {
|
|
53
148
|
acc[mapKey(entry[0])] = mapEntry(entry[1]);
|
|
54
149
|
}
|
|
@@ -8,7 +8,7 @@ if(cohortingCustomData&&cohortingCustomData.size>0){var _interaction$labelSta,_c
|
|
|
8
8
|
try{return acc+item.cssRules.length;}catch(e){return acc;}},0);const styleElements=doc.querySelectorAll('style').length;const styleProps=doc.querySelectorAll('[style]');const styleDeclarations=Array.from(doc.querySelectorAll('[style]')).reduce((acc,item)=>{try{if('style'in item){return acc+item.style.length;}else{return acc;}}catch(e){return acc;}},0);return{'ufo:stylesheets':stylesheetCount,'ufo:styleElements':styleElements,'ufo:styleProps':styleProps.length,'ufo:styleDeclarations':styleDeclarations,'ufo:cssrules':cssrules};}catch(e){return{};}}let regularTTAI;let expTTAI;function getErrorCounts(interaction){return{'ufo:errors:globalCount':getGlobalErrorCount(),'ufo:errors:count':interaction.errors.length};}async function createInteractionMetricsPayload(interaction,interactionId,experimental,criticalPayloadCount,vcMetrics){var _window$location,_config$additionalPay;const interactionPayloadStart=performance.now();const config=getConfig();if(!config){throw Error('UFO Configuration not provided');}const{end,start,ufoName,knownSegments,rate,type,abortReason,routeName,featureFlags,previousInteractionName,isPreviousInteractionAborted,abortedByInteractionName,responsiveness,unknownElementName,unknownElementHierarchy,hydration}=interaction;const pageVisibilityAtTTI=getPageVisibilityUpToTTI(interaction);const pageVisibilityAtTTAI=getPageVisibilityUpToTTAI(interaction);const segments=!fg('platform_ufo_remove_deprecated_config_fields')&&config.killswitchNestedSegments?[]:knownSegments;const segmentTree=getReactUFOPayloadVersion(interaction.type)==='2.0.0'?buildSegmentTree(segments.map(segment=>segment.labelStack)):{};const isDetailedPayload=pageVisibilityAtTTAI==='visible';const isPageLoad=type==='page_load';const calculatePageVisibilityFromTheStartOfPageLoad=config.enableBetterPageVisibilityApi&&isPageLoad;const moreAccuratePageVisibilityAtTTI=calculatePageVisibilityFromTheStartOfPageLoad?getMoreAccuratePageVisibilityUpToTTI(interaction):null;const moreAccuratePageVisibilityAtTTAI=calculatePageVisibilityFromTheStartOfPageLoad?getMoreAccuratePageVisibilityUpToTTAI(interaction):null;const labelStack=interaction.labelStack?{labelStack:optimizeLabelStack(interaction.labelStack,getReactUFOPayloadVersion(interaction.type))}:{};// Page Load
|
|
9
9
|
const getInitialPageLoadSSRMetrics=()=>{var _config$ssr;if(!isPageLoad){return{};}const config=getConfig();const SSRDoneTimeValue=getSSRDoneTimeValue(config);const SSRDoneTime=SSRDoneTimeValue!==undefined?{SSRDoneTime:Math.round(SSRDoneTimeValue)}:{};const isBM3ConfigSSRDoneAsFmp=interaction.metaData.__legacy__bm3ConfigSSRDoneAsFmp;const isUFOConfigSSRDoneAsFmp=interaction.metaData.__legacy__bm3ConfigSSRDoneAsFmp||!!(config!==null&&config!==void 0&&(_config$ssr=config.ssr)!==null&&_config$ssr!==void 0&&_config$ssr.getSSRDoneTime);if(!experimental&&(isBM3ConfigSSRDoneAsFmp||isUFOConfigSSRDoneAsFmp)&&SSRDoneTimeValue!==undefined){try{performance.mark(`FMP`,{startTime:SSRDoneTimeValue,detail:{devtools:{dataType:'marker'}}});}catch(e){}}return{...SSRDoneTime,isBM3ConfigSSRDoneAsFmp,isUFOConfigSSRDoneAsFmp};};const pageLoadInteractionMetrics=getInitialPageLoadSSRMetrics();// Detailed payload. Page visibility = visible
|
|
10
10
|
const getDetailedInteractionMetrics=resourceTimings=>{if(experimental||window.__UFO_COMPACT_PAYLOAD__||!isDetailedPayload){return{};}const spans=[...interaction.spans,...atlaskitInteractionSpans];atlaskitInteractionSpans.length=0;return{errors:interaction.errors.map(({labelStack,...others})=>({...others,labelStack:labelStack&&optimizeLabelStack(labelStack,getReactUFOPayloadVersion(interaction.type))})),holdActive:[...interaction.holdActive.values()],redirects:optimizeRedirects(interaction.redirects,start),holdInfo:optimizeHoldInfo(experimental?interaction.holdExpInfo:interaction.holdInfo,start,getReactUFOPayloadVersion(interaction.type)),spans:optimizeSpans(spans,start,getReactUFOPayloadVersion(interaction.type)),requestInfo:optimizeRequestInfo(interaction.requestInfo,start,getReactUFOPayloadVersion(interaction.type)),customTimings:optimizeCustomTimings(interaction.customTimings,start),bundleEvalTimings:objectToArray(getBundleEvalTimings(start)),resourceTimings:objectToArray(resourceTimings)};};// Page load & detailed payload
|
|
11
|
-
const getPageLoadDetailedInteractionMetrics=()=>{var _config$
|
|
11
|
+
const getPageLoadDetailedInteractionMetrics=()=>{var _config$ssr3;if(!isPageLoad||!isDetailedPayload){return{};}const initialPageLoadExtraTimings=objectToArray(initialPageLoadExtraTiming.getTimings());const config=getConfig();if(fg('platform_ufo_default_ssr_edge_timings')){var _config$ssr2;return{initialPageLoadExtraTimings,SSRTimings:config!==null&&config!==void 0&&(_config$ssr2=config.ssr)!==null&&_config$ssr2!==void 0&&_config$ssr2.getSSRTimings?[...config.ssr.getSSRTimings(),...objectToArray(ssr.getSSRTimings())]:objectToArray(ssr.getSSRTimings())};}return{initialPageLoadExtraTimings,SSRTimings:config!==null&&config!==void 0&&(_config$ssr3=config.ssr)!==null&&_config$ssr3!==void 0&&_config$ssr3.getSSRTimings?config.ssr.getSSRTimings():objectToArray(ssr.getSSRTimings())};};if(experimental){expTTAI=getTTAI(interaction);}else{regularTTAI=getTTAI(interaction);}const newUFOName=sanitizeUfoName(ufoName);const resourceTimings=getResourceTimings(start,end);const[finalVCMetrics,experimentalMetrics,paintMetrics,batteryInfo]=await Promise.all([vcMetrics||(await getVCMetrics(interaction)),experimental?getExperimentalVCMetrics(interaction):Promise.resolve(undefined),getPaintMetricsToLegacyFormat(type,end),getBatteryInfoToLegacyFormat()]);if(!experimental){addPerformanceMeasures(interaction.start,[...((finalVCMetrics===null||finalVCMetrics===void 0?void 0:finalVCMetrics['ufo:vc:rev'])||[])]);}const getReactHydrationStats=()=>{if(!hydration){return{};}return{hydration};};const payload={actionSubject:'experience',action:'measured',eventType:'operational',source:'measured',tags:['observability'],attributes:{properties:{// basic
|
|
12
12
|
'event:hostname':((_window$location=window.location)===null||_window$location===void 0?void 0:_window$location.hostname)||'unknown','event:product':config.product,'event:schema':'1.0.0','event:sizeInKb':0,'event:source':{name:'react-ufo/web',version:getReactUFOPayloadVersion(interaction.type)},'event:region':config.region||'unknown','experience:key':experimental?'custom.experimental-interaction-metrics':'custom.interaction-metrics','experience:name':newUFOName,// Include CPU usage monitoring data
|
|
13
13
|
'event:cpu:usage':createPressureStateReport(interaction.start,interaction.end),'event:memory:usage':createMemoryStateReport(interaction.start,interaction.end),...(criticalPayloadCount!==undefined?{'ufo:multipayload':true,'ufo:criticalPayloadCount':criticalPayloadCount}:{}),// root
|
|
14
14
|
...getBrowserMetadataToLegacyFormat(),...batteryInfo,...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),...getReactHydrationStats(),interactionMetrics:{namePrefix:config.namePrefix||'',segmentPrefix:config.segmentPrefix||'',interactionId,pageVisibilityAtTTI,pageVisibilityAtTTAI,experimental__pageVisibilityAtTTI:moreAccuratePageVisibilityAtTTI,experimental__pageVisibilityAtTTAI:moreAccuratePageVisibilityAtTTAI,// raw interaction metrics
|
|
@@ -2,6 +2,7 @@ import React, { Profiler, useCallback, useContext, useEffect, useMemo, useRef }
|
|
|
2
2
|
import { unstable_NormalPriority as NormalPriority, unstable_scheduleCallback as scheduleCallback } from 'scheduler';
|
|
3
3
|
// eslint-disable-next-line @atlaskit/platform/prefer-crypto-random-uuid -- Use crypto.randomUUID instead
|
|
4
4
|
import { v4 as createUUID } from 'uuid';
|
|
5
|
+
import { fg } from '@atlaskit/platform-feature-flags';
|
|
5
6
|
import coinflip from '../coinflip';
|
|
6
7
|
import { getConfig, getDoNotAbortActivePressInteraction, getInteractionRate, getMinorInteractions } from '../config';
|
|
7
8
|
import { getActiveTrace, setInteractionActiveTrace } from '../experience-trace-id-context';
|
|
@@ -11,6 +12,7 @@ import { abortByNewInteraction, addApdex, addCustomData, addCustomTiming, addHol
|
|
|
11
12
|
import UFORouteName from '../route-name-context';
|
|
12
13
|
import generateId from '../short-id';
|
|
13
14
|
import scheduleOnPaint from './schedule-on-paint';
|
|
15
|
+
import SsrRenderProfiler from './ssr-render-profiler';
|
|
14
16
|
let tryCompleteHandle;
|
|
15
17
|
let hasMarkedFirstSegmentLoad = false;
|
|
16
18
|
|
|
@@ -255,11 +257,18 @@ export default function UFOSegment({
|
|
|
255
257
|
};
|
|
256
258
|
}, [interactionId, parentContext, interactionContext, labelStack]);
|
|
257
259
|
const reactProfilerId = useMemo(() => labelStack.map(l => l.name).join('/'), [labelStack]);
|
|
258
|
-
|
|
260
|
+
const ufoSegment = /*#__PURE__*/React.createElement(UFOInteractionContext.Provider, {
|
|
259
261
|
value: interactionContext
|
|
260
262
|
}, /*#__PURE__*/React.createElement(Profiler, {
|
|
261
263
|
id: reactProfilerId,
|
|
262
264
|
onRender: onRender
|
|
263
265
|
}, children));
|
|
266
|
+
if (fg('platform_ufo_ssr_render_profiler')) {
|
|
267
|
+
return /*#__PURE__*/React.createElement(SsrRenderProfiler, {
|
|
268
|
+
labelStack: labelStack,
|
|
269
|
+
onRender: interactionContext.onRender
|
|
270
|
+
}, ufoSegment);
|
|
271
|
+
}
|
|
272
|
+
return ufoSegment;
|
|
264
273
|
}
|
|
265
274
|
UFOSegment.displayName = 'UFOSegment';
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
var _process, _process$env;
|
|
2
|
+
import React, { useMemo } from 'react';
|
|
3
|
+
import { getActiveInteraction } from '../interaction-metrics';
|
|
4
|
+
|
|
5
|
+
// These are stored outside react context to be resilient to concurrent mode
|
|
6
|
+
// restarting the start marker from a suspense and losing the initial render
|
|
7
|
+
const startTimes = new Map();
|
|
8
|
+
// Keep track of the last interaction id and reset the start timers if it ever changes.
|
|
9
|
+
// This is to allow multi-step ssr to track the render timers from different "interaction"s seperately
|
|
10
|
+
let lastActiveInteraction;
|
|
11
|
+
function checkActiveInteractionAndResetStartMarksIfSet() {
|
|
12
|
+
var _getActiveInteraction;
|
|
13
|
+
const activeInteractionId = (_getActiveInteraction = getActiveInteraction()) === null || _getActiveInteraction === void 0 ? void 0 : _getActiveInteraction.id;
|
|
14
|
+
if (!!lastActiveInteraction && lastActiveInteraction !== activeInteractionId) {
|
|
15
|
+
startTimes.clear();
|
|
16
|
+
}
|
|
17
|
+
lastActiveInteraction = activeInteractionId;
|
|
18
|
+
}
|
|
19
|
+
const onStartRender = id => {
|
|
20
|
+
var _startTimes$get;
|
|
21
|
+
if (!startTimes.has(id)) {
|
|
22
|
+
startTimes.set(id, []);
|
|
23
|
+
}
|
|
24
|
+
(_startTimes$get = startTimes.get(id)) === null || _startTimes$get === void 0 ? void 0 : _startTimes$get.push(performance.now());
|
|
25
|
+
};
|
|
26
|
+
const isInSSR = Boolean(globalThis === null || globalThis === void 0 ? void 0 : globalThis.__SERVER__) || typeof process !== 'undefined' && Boolean(((_process = process) === null || _process === void 0 ? void 0 : (_process$env = _process.env) === null || _process$env === void 0 ? void 0 : _process$env.REACT_SSR) || false);
|
|
27
|
+
const ProfilerMarker = ({
|
|
28
|
+
onRender
|
|
29
|
+
}) => {
|
|
30
|
+
if (isInSSR) {
|
|
31
|
+
onRender === null || onRender === void 0 ? void 0 : onRender();
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
};
|
|
35
|
+
export const SsrRenderProfilerInner = ({
|
|
36
|
+
children,
|
|
37
|
+
labelStack,
|
|
38
|
+
onRender
|
|
39
|
+
}) => {
|
|
40
|
+
const reactProfilerId = useMemo(() => labelStack.map(l => l.name).join('/'), [labelStack]);
|
|
41
|
+
checkActiveInteractionAndResetStartMarksIfSet();
|
|
42
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ProfilerMarker, {
|
|
43
|
+
onRender: () => onStartRender(reactProfilerId)
|
|
44
|
+
}), children, /*#__PURE__*/React.createElement(ProfilerMarker, {
|
|
45
|
+
onRender: () => {
|
|
46
|
+
const startTimesForId = startTimes.get(reactProfilerId);
|
|
47
|
+
if (startTimesForId !== null && startTimesForId !== void 0 && startTimesForId.length) {
|
|
48
|
+
const endTime = performance.now();
|
|
49
|
+
const firstStartTime = startTimesForId[0];
|
|
50
|
+
const lastStartTime = startTimesForId[startTimesForId.length - 1];
|
|
51
|
+
const baseDuration = endTime - lastStartTime;
|
|
52
|
+
const actualDuration = endTime - firstStartTime;
|
|
53
|
+
onRender('mount',
|
|
54
|
+
// this is incorrect, but on the server there is no mount phase
|
|
55
|
+
actualDuration, baseDuration, firstStartTime, endTime);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}));
|
|
59
|
+
};
|
|
60
|
+
const SsrRenderProfiler = props => {
|
|
61
|
+
if (isInSSR) {
|
|
62
|
+
return /*#__PURE__*/React.createElement(SsrRenderProfilerInner, props);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// ensure structure similar to SSR implementation
|
|
66
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ProfilerMarker, null), props.children);
|
|
67
|
+
};
|
|
68
|
+
export default SsrRenderProfiler;
|
package/dist/es2019/ssr/index.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { fg } from '@atlaskit/platform-feature-flags';
|
|
3
2
|
const NESTED_METRIC_SEPARATOR = '/';
|
|
4
3
|
function filterEntry(entry) {
|
|
5
4
|
return !(!entry || typeof entry !== 'object' || entry.startTime < 0 || entry.duration < 0);
|
|
@@ -24,16 +23,112 @@ let config;
|
|
|
24
23
|
export function configure(ssrConfig) {
|
|
25
24
|
config = ssrConfig;
|
|
26
25
|
}
|
|
26
|
+
function getPerformanceNavigationTiming() {
|
|
27
|
+
var _performance$getEntri;
|
|
28
|
+
// getEntriesByType doesn't change the returned type based on the given type key
|
|
29
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
30
|
+
return (_performance$getEntri = performance.getEntriesByType('navigation')) === null || _performance$getEntri === void 0 ? void 0 : _performance$getEntri[0];
|
|
31
|
+
}
|
|
32
|
+
function getServerTimingsByName() {
|
|
33
|
+
var _getPerformanceNaviga, _getPerformanceNaviga2, _getPerformanceNaviga3;
|
|
34
|
+
const serverTimingsByName = Object.fromEntries((_getPerformanceNaviga = (_getPerformanceNaviga2 = getPerformanceNavigationTiming()) === null || _getPerformanceNaviga2 === void 0 ? void 0 : (_getPerformanceNaviga3 = _getPerformanceNaviga2.serverTiming) === null || _getPerformanceNaviga3 === void 0 ? void 0 : _getPerformanceNaviga3.map(timing => [timing.name, timing])) !== null && _getPerformanceNaviga !== void 0 ? _getPerformanceNaviga : []);
|
|
35
|
+
return serverTimingsByName;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* If we have the edge's view of ttfb and the clients view as well, then we should take the gap between them as
|
|
40
|
+
* the offset to use foe edge start time.
|
|
41
|
+
* This will simulate the network delays between the client and the edge as an edge startTime increase
|
|
42
|
+
*/
|
|
43
|
+
function getEdgeOffset(edgeTtfb) {
|
|
44
|
+
var _getPerformanceNaviga4;
|
|
45
|
+
const clientTtfb = (_getPerformanceNaviga4 = getPerformanceNavigationTiming()) === null || _getPerformanceNaviga4 === void 0 ? void 0 : _getPerformanceNaviga4.responseStart;
|
|
46
|
+
if (edgeTtfb == null || clientTtfb == null) {
|
|
47
|
+
return 0;
|
|
48
|
+
}
|
|
49
|
+
return clientTtfb - edgeTtfb;
|
|
50
|
+
}
|
|
51
|
+
export function getEdgeTimingsIncludingCloudfront() {
|
|
52
|
+
var _serverTimingsByName$, _serverTimingsByName$2, _serverTimingsByName$3, _serverTimingsByName$4, _serverTimingsByName$5, _serverTimingsByName$6, _serverTimingsByName$7, _serverTimingsByName$8, _serverTimingsByName$9;
|
|
53
|
+
const serverTimingsByName = getServerTimingsByName();
|
|
54
|
+
const edgeTotalDuration = (_serverTimingsByName$ = (_serverTimingsByName$2 = serverTimingsByName['cdn-downstream-fbl']) === null || _serverTimingsByName$2 === void 0 ? void 0 : _serverTimingsByName$2.duration) !== null && _serverTimingsByName$ !== void 0 ? _serverTimingsByName$ : (_serverTimingsByName$3 = serverTimingsByName['atl-edge']) === null || _serverTimingsByName$3 === void 0 ? void 0 : _serverTimingsByName$3.duration;
|
|
55
|
+
if (!edgeTotalDuration) {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
const edgeOffset = getEdgeOffset(edgeTotalDuration);
|
|
59
|
+
const cfInternalDuration = (((_serverTimingsByName$4 = serverTimingsByName['cdn-upstream-dns']) === null || _serverTimingsByName$4 === void 0 ? void 0 : _serverTimingsByName$4.duration) || 0) + (((_serverTimingsByName$5 = serverTimingsByName['cdn-upstream-connect']) === null || _serverTimingsByName$5 === void 0 ? void 0 : _serverTimingsByName$5.duration) || 0);
|
|
60
|
+
const cfUpstreamDuration = (((_serverTimingsByName$6 = serverTimingsByName['cdn-upstream-fbl']) === null || _serverTimingsByName$6 === void 0 ? void 0 : _serverTimingsByName$6.duration) || 0) - cfInternalDuration;
|
|
61
|
+
const cfDownstreamDuration = (((_serverTimingsByName$7 = serverTimingsByName['cdn-downstream-fbl']) === null || _serverTimingsByName$7 === void 0 ? void 0 : _serverTimingsByName$7.duration) || 0) - (((_serverTimingsByName$8 = serverTimingsByName['cdn-upstream-fbl']) === null || _serverTimingsByName$8 === void 0 ? void 0 : _serverTimingsByName$8.duration) || 0);
|
|
62
|
+
const atlEdgeDuration = (_serverTimingsByName$9 = serverTimingsByName['atl-edge']) === null || _serverTimingsByName$9 === void 0 ? void 0 : _serverTimingsByName$9.duration;
|
|
63
|
+
const cfToAtlEdgeNetworkDuration = cfUpstreamDuration - atlEdgeDuration;
|
|
64
|
+
const edgeTimings = {
|
|
65
|
+
edge: {
|
|
66
|
+
startTime: edgeOffset,
|
|
67
|
+
duration: edgeTotalDuration
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
if (typeof serverTimingsByName['cdn-downstream-fbl'] !== 'undefined') {
|
|
71
|
+
var _serverTimingsByName$0;
|
|
72
|
+
edgeTimings['edge/cf'] = {
|
|
73
|
+
startTime: edgeOffset,
|
|
74
|
+
duration: (_serverTimingsByName$0 = serverTimingsByName['cdn-downstream-fbl']) === null || _serverTimingsByName$0 === void 0 ? void 0 : _serverTimingsByName$0.duration
|
|
75
|
+
};
|
|
76
|
+
edgeTimings['edge/cf/internal'] = {
|
|
77
|
+
startTime: edgeOffset,
|
|
78
|
+
duration: cfInternalDuration
|
|
79
|
+
};
|
|
80
|
+
edgeTimings['edge/cf/upstream'] = {
|
|
81
|
+
startTime: edgeOffset + cfInternalDuration,
|
|
82
|
+
duration: cfUpstreamDuration
|
|
83
|
+
};
|
|
84
|
+
edgeTimings['edge/cf/downstream'] = {
|
|
85
|
+
startTime: edgeOffset + cfInternalDuration + cfUpstreamDuration,
|
|
86
|
+
duration: cfDownstreamDuration
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
if (typeof serverTimingsByName['atl-edge'] !== 'undefined') {
|
|
90
|
+
var _serverTimingsByName$1;
|
|
91
|
+
edgeTimings['edge/atl-edge'] = {
|
|
92
|
+
startTime: edgeOffset + cfInternalDuration + cfToAtlEdgeNetworkDuration,
|
|
93
|
+
duration: atlEdgeDuration
|
|
94
|
+
};
|
|
95
|
+
edgeTimings['edge/atl-edge/internal'] = {
|
|
96
|
+
startTime: edgeOffset + cfInternalDuration + cfToAtlEdgeNetworkDuration,
|
|
97
|
+
duration: (_serverTimingsByName$1 = serverTimingsByName['atl-edge-internal']) === null || _serverTimingsByName$1 === void 0 ? void 0 : _serverTimingsByName$1.duration
|
|
98
|
+
};
|
|
99
|
+
edgeTimings['edge/atl-edge/ttfb'] = {
|
|
100
|
+
startTime: edgeOffset + cfInternalDuration + cfToAtlEdgeNetworkDuration,
|
|
101
|
+
duration: atlEdgeDuration
|
|
102
|
+
};
|
|
103
|
+
edgeTimings['edge/cf/upstream/network'] = {
|
|
104
|
+
startTime: edgeOffset + cfInternalDuration,
|
|
105
|
+
duration: cfToAtlEdgeNetworkDuration
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// we need a timer here to prevent UFO pipeline from shifting SSR timers to start at 0
|
|
110
|
+
(edgeTimings === null || edgeTimings === void 0 ? void 0 : edgeTimings.edge) && edgeOffset && Object.assign(edgeTimings, {
|
|
111
|
+
'client-network': {
|
|
112
|
+
startTime: 0,
|
|
113
|
+
duration: edgeOffset
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
return edgeTimings;
|
|
117
|
+
}
|
|
27
118
|
export function getSSRTimings() {
|
|
28
119
|
var _config;
|
|
29
|
-
|
|
30
|
-
|
|
120
|
+
let defaultSSRTimings = {};
|
|
121
|
+
if (fg('platform_ufo_default_ssr_edge_timings')) {
|
|
122
|
+
defaultSSRTimings = getEdgeTimingsIncludingCloudfront();
|
|
31
123
|
}
|
|
32
|
-
|
|
33
|
-
if (
|
|
34
|
-
|
|
124
|
+
let configTimings = {};
|
|
125
|
+
if (typeof ((_config = config) === null || _config === void 0 ? void 0 : _config.getTimings) === 'function') {
|
|
126
|
+
configTimings = config.getTimings();
|
|
35
127
|
}
|
|
36
|
-
const ssrTimings = Object.entries(
|
|
128
|
+
const ssrTimings = Object.entries({
|
|
129
|
+
...configTimings,
|
|
130
|
+
...defaultSSRTimings
|
|
131
|
+
}).reduce((acc, entry) => {
|
|
37
132
|
if (filterEntry(entry[1])) {
|
|
38
133
|
acc[mapKey(entry[0])] = mapEntry(entry[1]);
|
|
39
134
|
}
|
|
@@ -8,7 +8,7 @@ if(cohortingCustomData&&cohortingCustomData.size>0){var _interaction$labelSta,_c
|
|
|
8
8
|
try{return acc+item.cssRules.length;}catch(e){return acc;}},0);var styleElements=doc.querySelectorAll('style').length;var styleProps=doc.querySelectorAll('[style]');var styleDeclarations=Array.from(doc.querySelectorAll('[style]')).reduce(function(acc,item){try{if('style'in item){return acc+item.style.length;}else{return acc;}}catch(e){return acc;}},0);return{'ufo:stylesheets':stylesheetCount,'ufo:styleElements':styleElements,'ufo:styleProps':styleProps.length,'ufo:styleDeclarations':styleDeclarations,'ufo:cssrules':cssrules};}catch(e){return{};}}var regularTTAI;var expTTAI;function getErrorCounts(interaction){return{'ufo:errors:globalCount':getGlobalErrorCount(),'ufo:errors:count':interaction.errors.length};}function createInteractionMetricsPayload(_x,_x2,_x3,_x4,_x5){return _createInteractionMetricsPayload.apply(this,arguments);}function _createInteractionMetricsPayload(){_createInteractionMetricsPayload=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(interaction,interactionId,experimental,criticalPayloadCount,vcMetrics){var _window$location,_config$additionalPay;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;return _regeneratorRuntime.wrap(function _callee$(_context){while(1)switch(_context.prev=_context.next){case 0:interactionPayloadStart=performance.now();config=getConfig();if(config){_context.next=4;break;}throw Error('UFO Configuration not provided');case 4:end=interaction.end,start=interaction.start,ufoName=interaction.ufoName,knownSegments=interaction.knownSegments,rate=interaction.rate,type=interaction.type,abortReason=interaction.abortReason,routeName=interaction.routeName,featureFlags=interaction.featureFlags,previousInteractionName=interaction.previousInteractionName,isPreviousInteractionAborted=interaction.isPreviousInteractionAborted,abortedByInteractionName=interaction.abortedByInteractionName,responsiveness=interaction.responsiveness,unknownElementName=interaction.unknownElementName,unknownElementHierarchy=interaction.unknownElementHierarchy,hydration=interaction.hydration;pageVisibilityAtTTI=getPageVisibilityUpToTTI(interaction);pageVisibilityAtTTAI=getPageVisibilityUpToTTAI(interaction);segments=!fg('platform_ufo_remove_deprecated_config_fields')&&config.killswitchNestedSegments?[]:knownSegments;segmentTree=getReactUFOPayloadVersion(interaction.type)==='2.0.0'?buildSegmentTree(segments.map(function(segment){return segment.labelStack;})):{};isDetailedPayload=pageVisibilityAtTTAI==='visible';isPageLoad=type==='page_load';calculatePageVisibilityFromTheStartOfPageLoad=config.enableBetterPageVisibilityApi&&isPageLoad;moreAccuratePageVisibilityAtTTI=calculatePageVisibilityFromTheStartOfPageLoad?getMoreAccuratePageVisibilityUpToTTI(interaction):null;moreAccuratePageVisibilityAtTTAI=calculatePageVisibilityFromTheStartOfPageLoad?getMoreAccuratePageVisibilityUpToTTAI(interaction):null;labelStack=interaction.labelStack?{labelStack:optimizeLabelStack(interaction.labelStack,getReactUFOPayloadVersion(interaction.type))}:{};// Page Load
|
|
9
9
|
getInitialPageLoadSSRMetrics=function getInitialPageLoadSSRMetrics(){var _config$ssr;if(!isPageLoad){return{};}var config=getConfig();var SSRDoneTimeValue=getSSRDoneTimeValue(config);var SSRDoneTime=SSRDoneTimeValue!==undefined?{SSRDoneTime:Math.round(SSRDoneTimeValue)}:{};var isBM3ConfigSSRDoneAsFmp=interaction.metaData.__legacy__bm3ConfigSSRDoneAsFmp;var isUFOConfigSSRDoneAsFmp=interaction.metaData.__legacy__bm3ConfigSSRDoneAsFmp||!!(config!==null&&config!==void 0&&(_config$ssr=config.ssr)!==null&&_config$ssr!==void 0&&_config$ssr.getSSRDoneTime);if(!experimental&&(isBM3ConfigSSRDoneAsFmp||isUFOConfigSSRDoneAsFmp)&&SSRDoneTimeValue!==undefined){try{performance.mark("FMP",{startTime:SSRDoneTimeValue,detail:{devtools:{dataType:'marker'}}});}catch(e){}}return _objectSpread(_objectSpread({},SSRDoneTime),{},{isBM3ConfigSSRDoneAsFmp:isBM3ConfigSSRDoneAsFmp,isUFOConfigSSRDoneAsFmp:isUFOConfigSSRDoneAsFmp});};pageLoadInteractionMetrics=getInitialPageLoadSSRMetrics();// Detailed payload. Page visibility = visible
|
|
10
10
|
getDetailedInteractionMetrics=function getDetailedInteractionMetrics(resourceTimings){if(experimental||window.__UFO_COMPACT_PAYLOAD__||!isDetailedPayload){return{};}var spans=[].concat(_toConsumableArray(interaction.spans),_toConsumableArray(atlaskitInteractionSpans));atlaskitInteractionSpans.length=0;return{errors:interaction.errors.map(function(_ref2){var labelStack=_ref2.labelStack,others=_objectWithoutProperties(_ref2,_excluded);return _objectSpread(_objectSpread({},others),{},{labelStack:labelStack&&optimizeLabelStack(labelStack,getReactUFOPayloadVersion(interaction.type))});}),holdActive:_toConsumableArray(interaction.holdActive.values()),redirects:optimizeRedirects(interaction.redirects,start),holdInfo:optimizeHoldInfo(experimental?interaction.holdExpInfo:interaction.holdInfo,start,getReactUFOPayloadVersion(interaction.type)),spans:optimizeSpans(spans,start,getReactUFOPayloadVersion(interaction.type)),requestInfo:optimizeRequestInfo(interaction.requestInfo,start,getReactUFOPayloadVersion(interaction.type)),customTimings:optimizeCustomTimings(interaction.customTimings,start),bundleEvalTimings:objectToArray(getBundleEvalTimings(start)),resourceTimings:objectToArray(resourceTimings)};};// Page load & detailed payload
|
|
11
|
-
getPageLoadDetailedInteractionMetrics=function getPageLoadDetailedInteractionMetrics(){var _config$
|
|
11
|
+
getPageLoadDetailedInteractionMetrics=function getPageLoadDetailedInteractionMetrics(){var _config$ssr3;if(!isPageLoad||!isDetailedPayload){return{};}var initialPageLoadExtraTimings=objectToArray(initialPageLoadExtraTiming.getTimings());var config=getConfig();if(fg('platform_ufo_default_ssr_edge_timings')){var _config$ssr2;return{initialPageLoadExtraTimings:initialPageLoadExtraTimings,SSRTimings:config!==null&&config!==void 0&&(_config$ssr2=config.ssr)!==null&&_config$ssr2!==void 0&&_config$ssr2.getSSRTimings?[].concat(_toConsumableArray(config.ssr.getSSRTimings()),_toConsumableArray(objectToArray(ssr.getSSRTimings()))):objectToArray(ssr.getSSRTimings())};}return{initialPageLoadExtraTimings:initialPageLoadExtraTimings,SSRTimings:config!==null&&config!==void 0&&(_config$ssr3=config.ssr)!==null&&_config$ssr3!==void 0&&_config$ssr3.getSSRTimings?config.ssr.getSSRTimings():objectToArray(ssr.getSSRTimings())};};if(experimental){expTTAI=getTTAI(interaction);}else{regularTTAI=getTTAI(interaction);}newUFOName=sanitizeUfoName(ufoName);resourceTimings=getResourceTimings(start,end);_context.t0=Promise;_context.t1=vcMetrics;if(_context.t1){_context.next=28;break;}_context.next=27;return getVCMetrics(interaction);case 27:_context.t1=_context.sent;case 28:_context.t2=_context.t1;_context.t3=experimental?getExperimentalVCMetrics(interaction):Promise.resolve(undefined);_context.t4=getPaintMetricsToLegacyFormat(type,end);_context.t5=getBatteryInfoToLegacyFormat();_context.t6=[_context.t2,_context.t3,_context.t4,_context.t5];_context.next=35;return _context.t0.all.call(_context.t0,_context.t6);case 35:_yield$Promise$all=_context.sent;_yield$Promise$all2=_slicedToArray(_yield$Promise$all,4);finalVCMetrics=_yield$Promise$all2[0];experimentalMetrics=_yield$Promise$all2[1];paintMetrics=_yield$Promise$all2[2];batteryInfo=_yield$Promise$all2[3];if(!experimental){addPerformanceMeasures(interaction.start,_toConsumableArray((finalVCMetrics===null||finalVCMetrics===void 0?void 0:finalVCMetrics['ufo:vc:rev'])||[]));}getReactHydrationStats=function getReactHydrationStats(){if(!hydration){return{};}return{hydration:hydration};};payload={actionSubject:'experience',action:'measured',eventType:'operational',source:'measured',tags:['observability'],attributes:{properties:_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({// basic
|
|
12
12
|
'event:hostname':((_window$location=window.location)===null||_window$location===void 0?void 0:_window$location.hostname)||'unknown','event:product':config.product,'event:schema':'1.0.0','event:sizeInKb':0,'event:source':{name:'react-ufo/web',version:getReactUFOPayloadVersion(interaction.type)},'event:region':config.region||'unknown','experience:key':experimental?'custom.experimental-interaction-metrics':'custom.interaction-metrics','experience:name':newUFOName,// Include CPU usage monitoring data
|
|
13
13
|
'event:cpu:usage':createPressureStateReport(interaction.start,interaction.end),'event:memory:usage':createMemoryStateReport(interaction.start,interaction.end)},criticalPayloadCount!==undefined?{'ufo:multipayload':true,'ufo:criticalPayloadCount':criticalPayloadCount}:{}),getBrowserMetadataToLegacyFormat()),batteryInfo),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)),getReactHydrationStats()),{},{interactionMetrics:_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({namePrefix:config.namePrefix||'',segmentPrefix:config.segmentPrefix||'',interactionId:interactionId,pageVisibilityAtTTI:pageVisibilityAtTTI,pageVisibilityAtTTAI:pageVisibilityAtTTAI,experimental__pageVisibilityAtTTI:moreAccuratePageVisibilityAtTTI,experimental__pageVisibilityAtTTAI:moreAccuratePageVisibilityAtTTAI,// raw interaction metrics
|
|
14
14
|
rate:rate,routeName:routeName,type:type,abortReason:abortReason,featureFlags:featureFlags,previousInteractionName:previousInteractionName,isPreviousInteractionAborted:isPreviousInteractionAborted,abortedByInteractionName:abortedByInteractionName,// performance
|
|
@@ -6,6 +6,7 @@ import React, { Profiler, useCallback, useContext, useEffect, useMemo, useRef }
|
|
|
6
6
|
import { unstable_NormalPriority as NormalPriority, unstable_scheduleCallback as scheduleCallback } from 'scheduler';
|
|
7
7
|
// eslint-disable-next-line @atlaskit/platform/prefer-crypto-random-uuid -- Use crypto.randomUUID instead
|
|
8
8
|
import { v4 as createUUID } from 'uuid';
|
|
9
|
+
import { fg } from '@atlaskit/platform-feature-flags';
|
|
9
10
|
import coinflip from '../coinflip';
|
|
10
11
|
import { getConfig, getDoNotAbortActivePressInteraction, getInteractionRate, getMinorInteractions } from '../config';
|
|
11
12
|
import { getActiveTrace, setInteractionActiveTrace } from '../experience-trace-id-context';
|
|
@@ -15,6 +16,7 @@ import { abortByNewInteraction, addApdex as _addApdex, addCustomData as _addCust
|
|
|
15
16
|
import UFORouteName from '../route-name-context';
|
|
16
17
|
import generateId from '../short-id';
|
|
17
18
|
import scheduleOnPaint from './schedule-on-paint';
|
|
19
|
+
import SsrRenderProfiler from './ssr-render-profiler';
|
|
18
20
|
var tryCompleteHandle;
|
|
19
21
|
var hasMarkedFirstSegmentLoad = false;
|
|
20
22
|
|
|
@@ -269,11 +271,18 @@ export default function UFOSegment(_ref) {
|
|
|
269
271
|
return l.name;
|
|
270
272
|
}).join('/');
|
|
271
273
|
}, [labelStack]);
|
|
272
|
-
|
|
274
|
+
var ufoSegment = /*#__PURE__*/React.createElement(UFOInteractionContext.Provider, {
|
|
273
275
|
value: interactionContext
|
|
274
276
|
}, /*#__PURE__*/React.createElement(Profiler, {
|
|
275
277
|
id: reactProfilerId,
|
|
276
278
|
onRender: onRender
|
|
277
279
|
}, children));
|
|
280
|
+
if (fg('platform_ufo_ssr_render_profiler')) {
|
|
281
|
+
return /*#__PURE__*/React.createElement(SsrRenderProfiler, {
|
|
282
|
+
labelStack: labelStack,
|
|
283
|
+
onRender: interactionContext.onRender
|
|
284
|
+
}, ufoSegment);
|
|
285
|
+
}
|
|
286
|
+
return ufoSegment;
|
|
278
287
|
}
|
|
279
288
|
UFOSegment.displayName = 'UFOSegment';
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
var _process;
|
|
2
|
+
import React, { useMemo } from 'react';
|
|
3
|
+
import { getActiveInteraction } from '../interaction-metrics';
|
|
4
|
+
|
|
5
|
+
// These are stored outside react context to be resilient to concurrent mode
|
|
6
|
+
// restarting the start marker from a suspense and losing the initial render
|
|
7
|
+
var startTimes = new Map();
|
|
8
|
+
// Keep track of the last interaction id and reset the start timers if it ever changes.
|
|
9
|
+
// This is to allow multi-step ssr to track the render timers from different "interaction"s seperately
|
|
10
|
+
var lastActiveInteraction;
|
|
11
|
+
function checkActiveInteractionAndResetStartMarksIfSet() {
|
|
12
|
+
var _getActiveInteraction;
|
|
13
|
+
var activeInteractionId = (_getActiveInteraction = getActiveInteraction()) === null || _getActiveInteraction === void 0 ? void 0 : _getActiveInteraction.id;
|
|
14
|
+
if (!!lastActiveInteraction && lastActiveInteraction !== activeInteractionId) {
|
|
15
|
+
startTimes.clear();
|
|
16
|
+
}
|
|
17
|
+
lastActiveInteraction = activeInteractionId;
|
|
18
|
+
}
|
|
19
|
+
var onStartRender = function onStartRender(id) {
|
|
20
|
+
var _startTimes$get;
|
|
21
|
+
if (!startTimes.has(id)) {
|
|
22
|
+
startTimes.set(id, []);
|
|
23
|
+
}
|
|
24
|
+
(_startTimes$get = startTimes.get(id)) === null || _startTimes$get === void 0 || _startTimes$get.push(performance.now());
|
|
25
|
+
};
|
|
26
|
+
var isInSSR = Boolean(globalThis === null || globalThis === void 0 ? void 0 : globalThis.__SERVER__) || typeof process !== 'undefined' && Boolean(((_process = process) === null || _process === void 0 || (_process = _process.env) === null || _process === void 0 ? void 0 : _process.REACT_SSR) || false);
|
|
27
|
+
var ProfilerMarker = function ProfilerMarker(_ref) {
|
|
28
|
+
var onRender = _ref.onRender;
|
|
29
|
+
if (isInSSR) {
|
|
30
|
+
onRender === null || onRender === void 0 || onRender();
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
};
|
|
34
|
+
export var SsrRenderProfilerInner = function SsrRenderProfilerInner(_ref2) {
|
|
35
|
+
var children = _ref2.children,
|
|
36
|
+
labelStack = _ref2.labelStack,
|
|
37
|
+
_onRender = _ref2.onRender;
|
|
38
|
+
var reactProfilerId = useMemo(function () {
|
|
39
|
+
return labelStack.map(function (l) {
|
|
40
|
+
return l.name;
|
|
41
|
+
}).join('/');
|
|
42
|
+
}, [labelStack]);
|
|
43
|
+
checkActiveInteractionAndResetStartMarksIfSet();
|
|
44
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ProfilerMarker, {
|
|
45
|
+
onRender: function onRender() {
|
|
46
|
+
return onStartRender(reactProfilerId);
|
|
47
|
+
}
|
|
48
|
+
}), children, /*#__PURE__*/React.createElement(ProfilerMarker, {
|
|
49
|
+
onRender: function onRender() {
|
|
50
|
+
var startTimesForId = startTimes.get(reactProfilerId);
|
|
51
|
+
if (startTimesForId !== null && startTimesForId !== void 0 && startTimesForId.length) {
|
|
52
|
+
var endTime = performance.now();
|
|
53
|
+
var firstStartTime = startTimesForId[0];
|
|
54
|
+
var lastStartTime = startTimesForId[startTimesForId.length - 1];
|
|
55
|
+
var baseDuration = endTime - lastStartTime;
|
|
56
|
+
var actualDuration = endTime - firstStartTime;
|
|
57
|
+
_onRender('mount',
|
|
58
|
+
// this is incorrect, but on the server there is no mount phase
|
|
59
|
+
actualDuration, baseDuration, firstStartTime, endTime);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}));
|
|
63
|
+
};
|
|
64
|
+
var SsrRenderProfiler = function SsrRenderProfiler(props) {
|
|
65
|
+
if (isInSSR) {
|
|
66
|
+
return /*#__PURE__*/React.createElement(SsrRenderProfilerInner, props);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// ensure structure similar to SSR implementation
|
|
70
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ProfilerMarker, null), props.children);
|
|
71
|
+
};
|
|
72
|
+
export default SsrRenderProfiler;
|
package/dist/esm/ssr/index.js
CHANGED
|
@@ -2,8 +2,7 @@ import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
|
2
2
|
import _typeof from "@babel/runtime/helpers/typeof";
|
|
3
3
|
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; }
|
|
4
4
|
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; }
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
import { fg } from '@atlaskit/platform-feature-flags';
|
|
7
6
|
var NESTED_METRIC_SEPARATOR = '/';
|
|
8
7
|
function filterEntry(entry) {
|
|
9
8
|
return !(!entry || _typeof(entry) !== 'object' || entry.startTime < 0 || entry.duration < 0);
|
|
@@ -27,16 +26,111 @@ var config;
|
|
|
27
26
|
export function configure(ssrConfig) {
|
|
28
27
|
config = ssrConfig;
|
|
29
28
|
}
|
|
29
|
+
function getPerformanceNavigationTiming() {
|
|
30
|
+
var _performance$getEntri;
|
|
31
|
+
// getEntriesByType doesn't change the returned type based on the given type key
|
|
32
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
33
|
+
return (_performance$getEntri = performance.getEntriesByType('navigation')) === null || _performance$getEntri === void 0 ? void 0 : _performance$getEntri[0];
|
|
34
|
+
}
|
|
35
|
+
function getServerTimingsByName() {
|
|
36
|
+
var _getPerformanceNaviga, _getPerformanceNaviga2;
|
|
37
|
+
var serverTimingsByName = Object.fromEntries((_getPerformanceNaviga = (_getPerformanceNaviga2 = getPerformanceNavigationTiming()) === null || _getPerformanceNaviga2 === void 0 || (_getPerformanceNaviga2 = _getPerformanceNaviga2.serverTiming) === null || _getPerformanceNaviga2 === void 0 ? void 0 : _getPerformanceNaviga2.map(function (timing) {
|
|
38
|
+
return [timing.name, timing];
|
|
39
|
+
})) !== null && _getPerformanceNaviga !== void 0 ? _getPerformanceNaviga : []);
|
|
40
|
+
return serverTimingsByName;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* If we have the edge's view of ttfb and the clients view as well, then we should take the gap between them as
|
|
45
|
+
* the offset to use foe edge start time.
|
|
46
|
+
* This will simulate the network delays between the client and the edge as an edge startTime increase
|
|
47
|
+
*/
|
|
48
|
+
function getEdgeOffset(edgeTtfb) {
|
|
49
|
+
var _getPerformanceNaviga3;
|
|
50
|
+
var clientTtfb = (_getPerformanceNaviga3 = getPerformanceNavigationTiming()) === null || _getPerformanceNaviga3 === void 0 ? void 0 : _getPerformanceNaviga3.responseStart;
|
|
51
|
+
if (edgeTtfb == null || clientTtfb == null) {
|
|
52
|
+
return 0;
|
|
53
|
+
}
|
|
54
|
+
return clientTtfb - edgeTtfb;
|
|
55
|
+
}
|
|
56
|
+
export function getEdgeTimingsIncludingCloudfront() {
|
|
57
|
+
var _serverTimingsByName$, _serverTimingsByName$2, _serverTimingsByName$3, _serverTimingsByName$4, _serverTimingsByName$5, _serverTimingsByName$6, _serverTimingsByName$7, _serverTimingsByName$8, _serverTimingsByName$9;
|
|
58
|
+
var serverTimingsByName = getServerTimingsByName();
|
|
59
|
+
var edgeTotalDuration = (_serverTimingsByName$ = (_serverTimingsByName$2 = serverTimingsByName['cdn-downstream-fbl']) === null || _serverTimingsByName$2 === void 0 ? void 0 : _serverTimingsByName$2.duration) !== null && _serverTimingsByName$ !== void 0 ? _serverTimingsByName$ : (_serverTimingsByName$3 = serverTimingsByName['atl-edge']) === null || _serverTimingsByName$3 === void 0 ? void 0 : _serverTimingsByName$3.duration;
|
|
60
|
+
if (!edgeTotalDuration) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
var edgeOffset = getEdgeOffset(edgeTotalDuration);
|
|
64
|
+
var cfInternalDuration = (((_serverTimingsByName$4 = serverTimingsByName['cdn-upstream-dns']) === null || _serverTimingsByName$4 === void 0 ? void 0 : _serverTimingsByName$4.duration) || 0) + (((_serverTimingsByName$5 = serverTimingsByName['cdn-upstream-connect']) === null || _serverTimingsByName$5 === void 0 ? void 0 : _serverTimingsByName$5.duration) || 0);
|
|
65
|
+
var cfUpstreamDuration = (((_serverTimingsByName$6 = serverTimingsByName['cdn-upstream-fbl']) === null || _serverTimingsByName$6 === void 0 ? void 0 : _serverTimingsByName$6.duration) || 0) - cfInternalDuration;
|
|
66
|
+
var cfDownstreamDuration = (((_serverTimingsByName$7 = serverTimingsByName['cdn-downstream-fbl']) === null || _serverTimingsByName$7 === void 0 ? void 0 : _serverTimingsByName$7.duration) || 0) - (((_serverTimingsByName$8 = serverTimingsByName['cdn-upstream-fbl']) === null || _serverTimingsByName$8 === void 0 ? void 0 : _serverTimingsByName$8.duration) || 0);
|
|
67
|
+
var atlEdgeDuration = (_serverTimingsByName$9 = serverTimingsByName['atl-edge']) === null || _serverTimingsByName$9 === void 0 ? void 0 : _serverTimingsByName$9.duration;
|
|
68
|
+
var cfToAtlEdgeNetworkDuration = cfUpstreamDuration - atlEdgeDuration;
|
|
69
|
+
var edgeTimings = {
|
|
70
|
+
edge: {
|
|
71
|
+
startTime: edgeOffset,
|
|
72
|
+
duration: edgeTotalDuration
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
if (typeof serverTimingsByName['cdn-downstream-fbl'] !== 'undefined') {
|
|
76
|
+
var _serverTimingsByName$0;
|
|
77
|
+
edgeTimings['edge/cf'] = {
|
|
78
|
+
startTime: edgeOffset,
|
|
79
|
+
duration: (_serverTimingsByName$0 = serverTimingsByName['cdn-downstream-fbl']) === null || _serverTimingsByName$0 === void 0 ? void 0 : _serverTimingsByName$0.duration
|
|
80
|
+
};
|
|
81
|
+
edgeTimings['edge/cf/internal'] = {
|
|
82
|
+
startTime: edgeOffset,
|
|
83
|
+
duration: cfInternalDuration
|
|
84
|
+
};
|
|
85
|
+
edgeTimings['edge/cf/upstream'] = {
|
|
86
|
+
startTime: edgeOffset + cfInternalDuration,
|
|
87
|
+
duration: cfUpstreamDuration
|
|
88
|
+
};
|
|
89
|
+
edgeTimings['edge/cf/downstream'] = {
|
|
90
|
+
startTime: edgeOffset + cfInternalDuration + cfUpstreamDuration,
|
|
91
|
+
duration: cfDownstreamDuration
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
if (typeof serverTimingsByName['atl-edge'] !== 'undefined') {
|
|
95
|
+
var _serverTimingsByName$1;
|
|
96
|
+
edgeTimings['edge/atl-edge'] = {
|
|
97
|
+
startTime: edgeOffset + cfInternalDuration + cfToAtlEdgeNetworkDuration,
|
|
98
|
+
duration: atlEdgeDuration
|
|
99
|
+
};
|
|
100
|
+
edgeTimings['edge/atl-edge/internal'] = {
|
|
101
|
+
startTime: edgeOffset + cfInternalDuration + cfToAtlEdgeNetworkDuration,
|
|
102
|
+
duration: (_serverTimingsByName$1 = serverTimingsByName['atl-edge-internal']) === null || _serverTimingsByName$1 === void 0 ? void 0 : _serverTimingsByName$1.duration
|
|
103
|
+
};
|
|
104
|
+
edgeTimings['edge/atl-edge/ttfb'] = {
|
|
105
|
+
startTime: edgeOffset + cfInternalDuration + cfToAtlEdgeNetworkDuration,
|
|
106
|
+
duration: atlEdgeDuration
|
|
107
|
+
};
|
|
108
|
+
edgeTimings['edge/cf/upstream/network'] = {
|
|
109
|
+
startTime: edgeOffset + cfInternalDuration,
|
|
110
|
+
duration: cfToAtlEdgeNetworkDuration
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// we need a timer here to prevent UFO pipeline from shifting SSR timers to start at 0
|
|
115
|
+
(edgeTimings === null || edgeTimings === void 0 ? void 0 : edgeTimings.edge) && edgeOffset && Object.assign(edgeTimings, {
|
|
116
|
+
'client-network': {
|
|
117
|
+
startTime: 0,
|
|
118
|
+
duration: edgeOffset
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
return edgeTimings;
|
|
122
|
+
}
|
|
30
123
|
export function getSSRTimings() {
|
|
31
124
|
var _config;
|
|
32
|
-
|
|
33
|
-
|
|
125
|
+
var defaultSSRTimings = {};
|
|
126
|
+
if (fg('platform_ufo_default_ssr_edge_timings')) {
|
|
127
|
+
defaultSSRTimings = getEdgeTimingsIncludingCloudfront();
|
|
34
128
|
}
|
|
35
|
-
var
|
|
36
|
-
if (
|
|
37
|
-
|
|
129
|
+
var configTimings = {};
|
|
130
|
+
if (typeof ((_config = config) === null || _config === void 0 ? void 0 : _config.getTimings) === 'function') {
|
|
131
|
+
configTimings = config.getTimings();
|
|
38
132
|
}
|
|
39
|
-
var ssrTimings = Object.entries(
|
|
133
|
+
var ssrTimings = Object.entries(_objectSpread(_objectSpread({}, configTimings), defaultSSRTimings)).reduce(function (acc, entry) {
|
|
40
134
|
if (filterEntry(entry[1])) {
|
|
41
135
|
acc[mapKey(entry[0])] = mapEntry(entry[1]);
|
|
42
136
|
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React, { type ReactNode } from 'react';
|
|
2
|
+
import type { EnhancedUFOInteractionContextType, ReactProfilerTiming } from '../common';
|
|
3
|
+
export declare const SsrRenderProfilerInner: ({ children, labelStack, onRender, }: {
|
|
4
|
+
children?: ReactNode | undefined;
|
|
5
|
+
labelStack: ReactProfilerTiming["labelStack"];
|
|
6
|
+
onRender: EnhancedUFOInteractionContextType["onRender"];
|
|
7
|
+
}) => React.JSX.Element;
|
|
8
|
+
declare const SsrRenderProfiler: (props: Parameters<typeof SsrRenderProfilerInner>[0]) => React.JSX.Element;
|
|
9
|
+
export default SsrRenderProfiler;
|
|
@@ -41,6 +41,7 @@ export type SSRConfig = {
|
|
|
41
41
|
getTimings?: () => ReportedTimings | null;
|
|
42
42
|
};
|
|
43
43
|
export declare function configure(ssrConfig: SSRConfig): void;
|
|
44
|
+
export declare function getEdgeTimingsIncludingCloudfront(): ReportedTimings | null;
|
|
44
45
|
export declare function getSSRTimings(): ReportedTimings;
|
|
45
46
|
export declare function getSSRSuccess(): boolean;
|
|
46
47
|
export declare function getSSRPhaseSuccess(): {
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React, { type ReactNode } from 'react';
|
|
2
|
+
import type { EnhancedUFOInteractionContextType, ReactProfilerTiming } from '../common';
|
|
3
|
+
export declare const SsrRenderProfilerInner: ({ children, labelStack, onRender, }: {
|
|
4
|
+
children?: ReactNode | undefined;
|
|
5
|
+
labelStack: ReactProfilerTiming["labelStack"];
|
|
6
|
+
onRender: EnhancedUFOInteractionContextType["onRender"];
|
|
7
|
+
}) => React.JSX.Element;
|
|
8
|
+
declare const SsrRenderProfiler: (props: Parameters<typeof SsrRenderProfilerInner>[0]) => React.JSX.Element;
|
|
9
|
+
export default SsrRenderProfiler;
|
|
@@ -41,6 +41,7 @@ export type SSRConfig = {
|
|
|
41
41
|
getTimings?: () => ReportedTimings | null;
|
|
42
42
|
};
|
|
43
43
|
export declare function configure(ssrConfig: SSRConfig): void;
|
|
44
|
+
export declare function getEdgeTimingsIncludingCloudfront(): ReportedTimings | null;
|
|
44
45
|
export declare function getSSRTimings(): ReportedTimings;
|
|
45
46
|
export declare function getSSRSuccess(): boolean;
|
|
46
47
|
export declare function getSSRPhaseSuccess(): {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atlaskit/react-ufo",
|
|
3
|
-
"version": "4.15.
|
|
3
|
+
"version": "4.15.4",
|
|
4
4
|
"description": "Parts of React UFO that are publicly available",
|
|
5
5
|
"author": "Atlassian Pty Ltd",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -110,6 +110,9 @@
|
|
|
110
110
|
"platform_ufo_disable_vcnext_observations": {
|
|
111
111
|
"type": "boolean"
|
|
112
112
|
},
|
|
113
|
+
"platform_ufo_default_ssr_edge_timings": {
|
|
114
|
+
"type": "boolean"
|
|
115
|
+
},
|
|
113
116
|
"platform_ufo_remove_ssr_placeholder_in_ttvc_v4": {
|
|
114
117
|
"type": "boolean"
|
|
115
118
|
},
|
|
@@ -146,6 +149,9 @@
|
|
|
146
149
|
"platform_editor_exclude_dnd_anchor_name_from_ttvc": {
|
|
147
150
|
"type": "boolean"
|
|
148
151
|
},
|
|
152
|
+
"platform_ufo_ssr_render_profiler": {
|
|
153
|
+
"type": "boolean"
|
|
154
|
+
},
|
|
149
155
|
"platform_ufo_enable_finish_interaction_transition": {
|
|
150
156
|
"type": "boolean"
|
|
151
157
|
},
|