export default function interpolate()

in tools/CCPLogParser/src/utils/interpolator.js [31:85]


export default function interpolate(
    timeData,
    timeRange = [null, null],
    timeKey = TIMESTAMP_KEY,
    valueKeys = WEBRTC_METRICS_KEYS,
    maxCount = DEFAULT_MAX_DATA_COUNT,
    minStep = DEFAULT_MIN_DATA_STEP,
) {
    // output array
    const data = [];

    // calculate time range if null is passed
    const [startTime, endTime] = [
        timeRange[0] || Math.min(...timeData.map((d) => d[timeKey])),
        timeRange[1] || Math.max(...timeData.map((d) => d[timeKey])),
    ];

    // deterimine step
    const step = Math.max(minStep, (endTime - startTime) / maxCount);

    // seek until the first datapoint appears
    let ptr = 0;
    while (timeData[ptr][timeKey] < startTime) ptr += 1;

    // interpolate every {step} interval
    let t = startTime;
    while (t < endTime || (startTime === endTime && t === startTime)) {
        t += step;

        // iterate data to find data points between (t - step) and t
        const start = ptr;
        while (ptr < timeData.length && timeData[ptr][timeKey] <= t) ptr += 1;
        const end = ptr;

        // get datapoints from the original data
        const datapoints = timeData.slice(start, end);

        // if no datapoint exists, make an empty one
        if (datapoints.length === 0) {
            const datapoint = {
                [timeKey]: t - (step / 2),
                ...valueKeys.reduce((acc, valueKey) => {
                    acc[valueKey] = null;
                    return acc;
                }, {}),
            };
            datapoints.push(datapoint);
        }

        // push datapoint to output data
        data.push(...datapoints);
    }

    return data;
}