| 1234567891011121314151617181920212223242526272829303132333435363738394041424344 | import speedometer from "./speedometer.js";import throttle from "./throttle.js";import utils from "../utils.js";export const progressEventReducer = (listener, isDownloadStream, freq = 3) => {  let bytesNotified = 0;  const _speedometer = speedometer(50, 250);  return throttle(e => {    const loaded = e.loaded;    const total = e.lengthComputable ? e.total : undefined;    const progressBytes = loaded - bytesNotified;    const rate = _speedometer(progressBytes);    const inRange = loaded <= total;    bytesNotified = loaded;    const data = {      loaded,      total,      progress: total ? (loaded / total) : undefined,      bytes: progressBytes,      rate: rate ? rate : undefined,      estimated: rate && total && inRange ? (total - loaded) / rate : undefined,      event: e,      lengthComputable: total != null,      [isDownloadStream ? 'download' : 'upload']: true    };    listener(data);  }, freq);}export const progressEventDecorator = (total, throttled) => {  const lengthComputable = total != null;  return [(loaded) => throttled[0]({    lengthComputable,    total,    loaded  }), throttled[1]];}export const asyncDecorator = (fn) => (...args) => utils.asap(() => fn(...args));
 |