speedometer.js 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. 'use strict';
  2. /**
  3. * Calculate data maxRate
  4. * @param {Number} [samplesCount= 10]
  5. * @param {Number} [min= 1000]
  6. * @returns {Function}
  7. */
  8. function speedometer(samplesCount, min) {
  9. samplesCount = samplesCount || 10;
  10. const bytes = new Array(samplesCount);
  11. const timestamps = new Array(samplesCount);
  12. let head = 0;
  13. let tail = 0;
  14. let firstSampleTS;
  15. min = min !== undefined ? min : 1000;
  16. return function push(chunkLength) {
  17. const now = Date.now();
  18. const startedAt = timestamps[tail];
  19. if (!firstSampleTS) {
  20. firstSampleTS = now;
  21. }
  22. bytes[head] = chunkLength;
  23. timestamps[head] = now;
  24. let i = tail;
  25. let bytesCount = 0;
  26. while (i !== head) {
  27. bytesCount += bytes[i++];
  28. i = i % samplesCount;
  29. }
  30. head = (head + 1) % samplesCount;
  31. if (head === tail) {
  32. tail = (tail + 1) % samplesCount;
  33. }
  34. if (now - firstSampleTS < min) {
  35. return;
  36. }
  37. const passed = startedAt && now - startedAt;
  38. return passed ? Math.round(bytesCount * 1000 / passed) : undefined;
  39. };
  40. }
  41. export default speedometer;