mostly because code is being autogenerated by all the AI stuff using this prefix. it's also used in the stack trace.
62 lines
1.5 KiB
JavaScript
62 lines
1.5 KiB
JavaScript
'use strict';
|
|
|
|
const stream = require('node:stream'),
|
|
TransformStream = stream.Transform;
|
|
|
|
class ProgressStream extends TransformStream {
|
|
#options;
|
|
#transferred;
|
|
#delta;
|
|
#started;
|
|
#startTime;
|
|
#interval;
|
|
|
|
constructor(options) {
|
|
super();
|
|
this.#options = Object.assign({ interval: 10 * 1000 }, options);
|
|
this.#transferred = 0;
|
|
this.#delta = 0;
|
|
this.#started = false;
|
|
this.#startTime = null;
|
|
this.#interval = null;
|
|
}
|
|
|
|
stats() {
|
|
const totalMsecs = Date.now() - this.#startTime;
|
|
return { startTime: this.#startTime, totalMsecs, transferred: this.#transferred };
|
|
}
|
|
|
|
_start() {
|
|
this.#startTime = Date.now();
|
|
this.#started = true;
|
|
this.#interval = setInterval(() => {
|
|
const speed = this.#delta * 1000 / this.#options.interval;
|
|
this.#delta = 0;
|
|
this.emit('progress', { speed, transferred: this.#transferred });
|
|
}, this.#options.interval);
|
|
}
|
|
|
|
_stop() {
|
|
clearInterval(this.#interval);
|
|
}
|
|
|
|
_transform(chunk, encoding, callback) {
|
|
if (!this.#started) this._start();
|
|
this.#transferred += chunk.length;
|
|
this.#delta += chunk.length;
|
|
callback(null, chunk);
|
|
}
|
|
|
|
_flush(callback) {
|
|
this._stop();
|
|
callback(null);
|
|
}
|
|
|
|
_destroy(error, callback) {
|
|
this._stop();
|
|
callback(error);
|
|
}
|
|
}
|
|
|
|
exports = module.exports = ProgressStream;
|