progressEventReducer.js 892 B

1234567891011121314151617181920212223242526272829303132
  1. import speedometer from "./speedometer.js";
  2. import throttle from "./throttle.js";
  3. export default (listener, isDownloadStream, freq = 3) => {
  4. let bytesNotified = 0;
  5. const _speedometer = speedometer(50, 250);
  6. return throttle(e => {
  7. const loaded = e.loaded;
  8. const total = e.lengthComputable ? e.total : undefined;
  9. const progressBytes = loaded - bytesNotified;
  10. const rate = _speedometer(progressBytes);
  11. const inRange = loaded <= total;
  12. bytesNotified = loaded;
  13. const data = {
  14. loaded,
  15. total,
  16. progress: total ? (loaded / total) : undefined,
  17. bytes: progressBytes,
  18. rate: rate ? rate : undefined,
  19. estimated: rate && total && inRange ? (total - loaded) / rate : undefined,
  20. event: e,
  21. lengthComputable: total != null
  22. };
  23. data[isDownloadStream ? 'download' : 'upload'] = true;
  24. listener(data);
  25. }, freq);
  26. }