'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;