UNPKG

@atlaskit/editor-plugin-breakout

Version:

Breakout plugin for @atlaskit/editor-core

122 lines (117 loc) 4.02 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.reduceResizeFrameRateSamples = exports.measureFramerate = void 0; /** * Measure the FPS of a resizing component. * * This is a simplified version of the `useMeasureFramerate` hook from `editor-plugin-table`. * (packages/editor/editor-plugin-table/src/pm-plugins/utils/analytics.ts) */ var reduceResizeFrameRateSamples = exports.reduceResizeFrameRateSamples = function reduceResizeFrameRateSamples(frameRateSamples) { if (frameRateSamples.length > 1) { var frameRateSum = frameRateSamples.reduce(function (sum, frameRate, index) { if (index === 0) { return sum; } else { return sum + frameRate; } }, 0); var averageFrameRate = Math.round(frameRateSum / (frameRateSamples.length - 1)); return [frameRateSamples[0], averageFrameRate]; } else { return frameRateSamples; } }; /** * Measures the framerate of a component over a given time period. * @param {object} [config] - Configuration options for framerate measurement. * @returns {object} An object containing startMeasure, endMeasure, and countFrames methods. * @example * const { startMeasure, endMeasure, countFrames } = measureFramerate(); * startMeasure(); * // ... animation loop with countFrames() calls * const samples = endMeasure(); // [60, 58, 62] */ var measureFramerate = exports.measureFramerate = function measureFramerate(config) { var _ref = config || {}, _ref$maxSamples = _ref.maxSamples, maxSamples = _ref$maxSamples === void 0 ? 10 : _ref$maxSamples, _ref$minFrames = _ref.minFrames, minFrames = _ref$minFrames === void 0 ? 5 : _ref$minFrames, _ref$minTimeMs = _ref.minTimeMs, minTimeMs = _ref$minTimeMs === void 0 ? 500 : _ref$minTimeMs, _ref$sampleRateMs = _ref.sampleRateMs, sampleRateMs = _ref$sampleRateMs === void 0 ? 1000 : _ref$sampleRateMs, _ref$timeoutMs = _ref.timeoutMs, timeoutMs = _ref$timeoutMs === void 0 ? 200 : _ref$timeoutMs; var frameCount = 0; var lastTime = 0; var timeoutId; var frameRateSamples = []; var startMeasure = function startMeasure() { frameCount = 0; lastTime = performance.now(); }; /** * Returns an array of frame rate samples as integers. * @returns {number[]} An array of frame rate samples as integers. * @example * const samples = endMeasure(); // [60, 58, 62] */ var endMeasure = function endMeasure() { var samples = frameRateSamples; frameRateSamples = []; return samples; }; var sampleFrameRate = function sampleFrameRate() { var delay = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; var currentTime = performance.now(); var deltaTime = currentTime - lastTime - delay; var isValidSample = deltaTime > minTimeMs && frameCount >= minFrames; if (isValidSample) { var frameRate = Math.round(frameCount / (deltaTime / 1000)); frameRateSamples.push(frameRate); } frameCount = 0; lastTime = 0; }; /** * Counts the number of frames that occur within a given time period. Intended to be called * inside a `requestAnimationFrame` callback. * @example * const animate = () => { * countFrames(); * requestAnimationFrame(animate); * }; */ var countFrames = function countFrames() { if (frameRateSamples.length >= maxSamples && timeoutId) { clearTimeout(timeoutId); return; } /** * Allows us to keep counting frames even if `startMeasure` is not called */ if (lastTime === 0) { lastTime = performance.now(); } frameCount++; if (timeoutId) { clearTimeout(timeoutId); } if (performance.now() - lastTime > sampleRateMs) { sampleFrameRate(); } else { timeoutId = setTimeout(function () { return sampleFrameRate(timeoutMs); }, timeoutMs); } }; return { startMeasure: startMeasure, endMeasure: endMeasure, countFrames: countFrames }; };