| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 | 'use strict';/** * Calculate data maxRate * @param {Number} [samplesCount= 10] * @param {Number} [min= 1000] * @returns {Function} */function speedometer(samplesCount, min) {  samplesCount = samplesCount || 10;  const bytes = new Array(samplesCount);  const timestamps = new Array(samplesCount);  let head = 0;  let tail = 0;  let firstSampleTS;  min = min !== undefined ? min : 1000;  return function push(chunkLength) {    const now = Date.now();    const startedAt = timestamps[tail];    if (!firstSampleTS) {      firstSampleTS = now;    }    bytes[head] = chunkLength;    timestamps[head] = now;    let i = tail;    let bytesCount = 0;    while (i !== head) {      bytesCount += bytes[i++];      i = i % samplesCount;    }    head = (head + 1) % samplesCount;    if (head === tail) {      tail = (tail + 1) % samplesCount;    }    if (now - firstSampleTS < min) {      return;    }    const passed = startedAt && now - startedAt;    return passed ? Math.round(bytesCount * 1000 / passed) : undefined;  };}export default speedometer;
 |