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;
}