github.com/pyroscope-io/pyroscope@v0.37.3-0.20230725203016-5f6947968bd0/packages/pyroscope-models/src/decode.ts (about) 1 import { Profile } from './profile'; 2 3 // TODO: ideally this should be moved into the FlamegraphRenderer component 4 // but since it will require too many changes for now 5 function deltaDiffWrapper( 6 format: Profile['metadata']['format'], 7 levels: Profile['flamebearer']['levels'] 8 ) { 9 const mutableLevels = [...levels]; 10 11 function deltaDiff( 12 lvls: Profile['flamebearer']['levels'], 13 start: number, 14 step: number 15 ) { 16 // eslint-disable-next-line no-restricted-syntax 17 for (const level of lvls) { 18 let prev = 0; 19 for (let i = start; i < level.length; i += step) { 20 level[i] += prev; 21 prev = level[i] + level[i + 1]; 22 } 23 } 24 } 25 26 if (format === 'double') { 27 deltaDiff(mutableLevels, 0, 7); 28 deltaDiff(mutableLevels, 3, 7); 29 } else { 30 deltaDiff(mutableLevels, 0, 4); 31 } 32 33 return mutableLevels; 34 } 35 36 // eslint-disable-next-line import/prefer-default-export 37 export function decodeFlamebearer(fb: Profile): Profile { 38 // TODO: make this immutable 39 // eslint-disable-next-line no-param-reassign 40 fb.flamebearer.levels = deltaDiffWrapper( 41 fb.metadata.format, 42 fb.flamebearer.levels 43 ); 44 return fb; 45 }