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