/** * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * @flow */ import ProfilerStore from './ProfilerStore'; import { getCommitTree, invalidateCommitTrees, } from 'react-devtools-shared/src/devtools/views/Profiler/CommitTreeBuilder'; import { getChartData as getFlamegraphChartData, invalidateChartData as invalidateFlamegraphChartData, } from 'react-devtools-shared/src/devtools/views/Profiler/FlamegraphChartBuilder'; import { getChartData as getRankedChartData, invalidateChartData as invalidateRankedChartData, } from 'react-devtools-shared/src/devtools/views/Profiler/RankedChartBuilder'; import type {CommitTree} from 'react-devtools-shared/src/devtools/views/Profiler/types'; import type {ChartData as FlamegraphChartData} from 'react-devtools-shared/src/devtools/views/Profiler/FlamegraphChartBuilder'; import type {ChartData as RankedChartData} from 'react-devtools-shared/src/devtools/views/Profiler/RankedChartBuilder'; export default class ProfilingCache { _fiberCommits: Map> = new Map(); _profilerStore: ProfilerStore; constructor(profilerStore: ProfilerStore) { this._profilerStore = profilerStore; } getCommitTree: ({commitIndex: number, rootID: number}) => CommitTree = ({ commitIndex, rootID, }) => getCommitTree({ commitIndex, profilerStore: this._profilerStore, rootID, }); getFiberCommits: ({fiberID: number, rootID: number}) => Array = ({ fiberID, rootID, }) => { const cachedFiberCommits = this._fiberCommits.get(fiberID); if (cachedFiberCommits != null) { return cachedFiberCommits; } const fiberCommits = []; const dataForRoot = this._profilerStore.getDataForRoot(rootID); dataForRoot.commitData.forEach((commitDatum, commitIndex) => { if (commitDatum.fiberActualDurations.has(fiberID)) { fiberCommits.push(commitIndex); } }); this._fiberCommits.set(fiberID, fiberCommits); return fiberCommits; }; getFlamegraphChartData: ({ commitIndex: number, commitTree: CommitTree, rootID: number, }) => FlamegraphChartData = ({commitIndex, commitTree, rootID}) => getFlamegraphChartData({ commitIndex, commitTree, profilerStore: this._profilerStore, rootID, }); getRankedChartData: ({ commitIndex: number, commitTree: CommitTree, rootID: number, }) => RankedChartData = ({commitIndex, commitTree, rootID}) => getRankedChartData({ commitIndex, commitTree, profilerStore: this._profilerStore, rootID, }); invalidate() { this._fiberCommits.clear(); invalidateCommitTrees(); invalidateFlamegraphChartData(); invalidateRankedChartData(); } }