UNPKG

@atlaskit/editor-common

Version:

A package that contains common classes and components for editor and renderer

102 lines (100 loc) 4.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.TTI_SEVERITY_THRESHOLD_DEFAULTS = exports.TTI_FROM_INVOCATION_SEVERITY_THRESHOLD_DEFAULTS = void 0; exports.getTTISeverity = getTTISeverity; exports.measureTTI = measureTTI; var _analytics = require("../analytics"); var _isPerformanceApiAvailable = require("./is-performance-api-available"); var _measureRender = require("./measure-render"); function measureTTI(onMeasureComplete) { var idleThreshold = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1000; var cancelAfter = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 60; var // Dependency Injection for easier testing PerfObserver = arguments.length > 3 ? arguments[3] : undefined; if (!(0, _isPerformanceApiAvailable.isPerformanceObserverLongTaskAvailable)()) { return; } var start = performance.now(); // Keeping track of users moving away from the tab, which distorts the TTI measurement var distortedDurationMonitor = (0, _measureRender.getDistortedDurationMonitor)(); var prevLongTask; var lastLongTask = { startTime: start, duration: 0 }; var cancelAfterMs = cancelAfter * 1000; var observer = new (PerfObserver || PerformanceObserver)(function (list) { var entries = list.getEntries(); if (entries.length) { prevLongTask = lastLongTask; lastLongTask = entries[entries.length - 1]; } }); observer.observe({ entryTypes: ['longtask'] }); var checkIdle = function checkIdle() { // 1. There hasn't been any long task in `idleThreshold` time: Interactive from the start. // 2. Only 1 long task: Interactive from the end of the only long task. // 3. Several long tasks: // 3.1 Interactive from the end of prevLongTask if `lastLongTask.start - prevLongTask.end >= idleThreshold` // 3.2 Interactive from the end of lastLongTask if `lastLongTask.start - prevLongTask.end < idleThreshold` var now = performance.now(); var lastEnd = lastLongTask.startTime + lastLongTask.duration; var prevEnd = prevLongTask ? prevLongTask.startTime + prevLongTask.duration : lastEnd; var elapsedTimeMs = now - start; var canceled = elapsedTimeMs > cancelAfterMs; if (!prevLongTask) { observer.disconnect(); distortedDurationMonitor.cleanup(); return onMeasureComplete(prevEnd, 0, false, distortedDurationMonitor.distortedDuration); } else if (lastLongTask.startTime - prevEnd >= idleThreshold) { observer.disconnect(); distortedDurationMonitor.cleanup(); return onMeasureComplete(prevEnd, prevEnd - start, canceled, distortedDurationMonitor.distortedDuration); } else if (now - lastEnd >= idleThreshold || canceled) { observer.disconnect(); distortedDurationMonitor.cleanup(); return onMeasureComplete(lastEnd, lastEnd - start, canceled, distortedDurationMonitor.distortedDuration); } return setTimeout(checkIdle, idleThreshold); }; setTimeout(checkIdle, idleThreshold); } var TTI_SEVERITY_THRESHOLD_DEFAULTS = exports.TTI_SEVERITY_THRESHOLD_DEFAULTS = { NORMAL: 40000, DEGRADED: 60000 }; var TTI_FROM_INVOCATION_SEVERITY_THRESHOLD_DEFAULTS = exports.TTI_FROM_INVOCATION_SEVERITY_THRESHOLD_DEFAULTS = { NORMAL: 5000, DEGRADED: 8000 }; function getTTISeverity(tti, ttiFromInvocation, ttiSeverityNormalThreshold, ttiSeverityDegradedThreshold, ttiFromInvocationSeverityNormalThreshold, ttiFromInvocationSeverityDegradedThreshold) { var ttiNormalThreshold = ttiSeverityNormalThreshold || TTI_SEVERITY_THRESHOLD_DEFAULTS.NORMAL; var ttiDegradedThreshold = ttiSeverityDegradedThreshold || TTI_SEVERITY_THRESHOLD_DEFAULTS.DEGRADED; var ttiSeverity; if (tti >= ttiNormalThreshold && tti < ttiDegradedThreshold) { ttiSeverity = _analytics.SEVERITY.DEGRADED; } else if (tti >= ttiDegradedThreshold) { ttiSeverity = _analytics.SEVERITY.BLOCKING; } else { ttiSeverity = _analytics.SEVERITY.NORMAL; } var ttiFromInvocationNormalThreshold = ttiFromInvocationSeverityNormalThreshold || TTI_FROM_INVOCATION_SEVERITY_THRESHOLD_DEFAULTS.NORMAL; var ttiFromInvocationDegradedThreshold = ttiFromInvocationSeverityDegradedThreshold || TTI_FROM_INVOCATION_SEVERITY_THRESHOLD_DEFAULTS.DEGRADED; var ttiFromInvocationSeverity; if (ttiFromInvocation >= ttiFromInvocationNormalThreshold && ttiFromInvocation < ttiFromInvocationDegradedThreshold) { ttiFromInvocationSeverity = _analytics.SEVERITY.DEGRADED; } else if (ttiFromInvocation >= ttiFromInvocationDegradedThreshold) { ttiFromInvocationSeverity = _analytics.SEVERITY.BLOCKING; } else { ttiFromInvocationSeverity = _analytics.SEVERITY.NORMAL; } return { ttiSeverity: ttiSeverity, ttiFromInvocationSeverity: ttiFromInvocationSeverity }; }