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  }