b5f3067a6a
Initial setup of project dependencies including axios, express, dotenv, and other supporting packages. Added configuration files and documentation for project setup and usage.
45 lines
1.2 KiB
JavaScript
45 lines
1.2 KiB
JavaScript
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));
|