|
'use strict'; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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; |
|
|