diff --git a/package-lock.json b/package-lock.json index 3de1eded3..8dae0b057 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,7 +38,6 @@ "multiparty": "^4.2.3", "mysql": "^2.18.1", "nodemailer": "^6.7.3", - "progress-stream": "^2.0.0", "qrcode": "^1.5.0", "readdirp": "^3.6.0", "safetydance": "^2.2.0", @@ -3720,24 +3719,6 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, - "node_modules/progress-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/progress-stream/-/progress-stream-2.0.0.tgz", - "integrity": "sha1-+sY6Cz0R3qy7CWmrzJOyFLzhntU=", - "dependencies": { - "speedometer": "~1.0.0", - "through2": "~2.0.3" - } - }, - "node_modules/progress-stream/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, "node_modules/prompt": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/prompt/-/prompt-1.1.0.tgz", @@ -4291,11 +4272,6 @@ "node": ">= 0.10.0" } }, - "node_modules/speedometer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-1.0.0.tgz", - "integrity": "sha1-zWccsGdSwivKM3Di8zREC+T8YuI=" - }, "node_modules/split": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", @@ -5213,14 +5189,6 @@ "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==", "dev": true }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -8111,26 +8079,6 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, - "progress-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/progress-stream/-/progress-stream-2.0.0.tgz", - "integrity": "sha1-+sY6Cz0R3qy7CWmrzJOyFLzhntU=", - "requires": { - "speedometer": "~1.0.0", - "through2": "~2.0.3" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, "prompt": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/prompt/-/prompt-1.1.0.tgz", @@ -8576,11 +8524,6 @@ "base32.js": "0.0.1" } }, - "speedometer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-1.0.0.tgz", - "integrity": "sha1-zWccsGdSwivKM3Di8zREC+T8YuI=" - }, "split": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", @@ -9295,11 +9238,6 @@ "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==", "dev": true }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/package.json b/package.json index 5448a0903..d386018a8 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,6 @@ "multiparty": "^4.2.3", "mysql": "^2.18.1", "nodemailer": "^6.7.3", - "progress-stream": "^2.0.0", "qrcode": "^1.5.0", "readdirp": "^3.6.0", "safetydance": "^2.2.0", diff --git a/src/backupformat/tgz.js b/src/backupformat/tgz.js index b7d81cafd..b8a68a29b 100644 --- a/src/backupformat/tgz.js +++ b/src/backupformat/tgz.js @@ -14,7 +14,7 @@ const assert = require('assert'), { DecryptStream, EncryptStream } = require('../hush.js'), once = require('../once.js'), path = require('path'), - progressStream = require('progress-stream'), + ProgressStream = require('../progress-stream.js'), storage = require('../storage.js'), tar = require('tar-fs'), zlib = require('zlib'); @@ -51,7 +51,7 @@ function tarPack(dataLayout, encryption) { }); const gzip = zlib.createGzip({}); - const ps = progressStream({ time: 10000 }); // emit 'progress' every 10 seconds + const ps = new ProgressStream({ interval: 10000 }); // emit 'progress' every 10 seconds pack.on('error', function (error) { debug('tarPack: tar stream error.', error); @@ -84,7 +84,7 @@ function tarExtract(inStream, dataLayout, encryption) { assert.strictEqual(typeof encryption, 'object'); const gunzip = zlib.createGunzip({}); - const ps = progressStream({ time: 10000 }); // display a progress every 10 seconds + const ps = new ProgressStream({ interval: 10000 }); // display a progress every 10 seconds const extract = tar.extract('/', { map: function (header) { header.name = dataLayout.toLocalPath(header.name); diff --git a/src/hush.js b/src/hush.js index b1f3a30fa..79a2fcd81 100644 --- a/src/hush.js +++ b/src/hush.js @@ -5,7 +5,7 @@ const assert = require('assert'), crypto = require('crypto'), debug = require('debug')('box:hush'), fs = require('fs'), - progressStream = require('progress-stream'), + ProgressStream = require('./progress-stream.js'), TransformStream = require('stream').Transform; class EncryptStream extends TransformStream { @@ -157,7 +157,7 @@ function createReadStream(sourceFile, encryption) { assert.strictEqual(typeof encryption, 'object'); const stream = fs.createReadStream(sourceFile); - const ps = progressStream({ time: 10000 }); // display a progress every 10 seconds + const ps = new ProgressStream({ interval: 10000 }); // display a progress every 10 seconds stream.on('error', function (error) { debug(`createReadStream: read stream error at ${sourceFile}`, error); @@ -185,7 +185,7 @@ function createWriteStream(destFile, encryption) { assert.strictEqual(typeof encryption, 'object'); const stream = fs.createWriteStream(destFile); - const ps = progressStream({ time: 10000 }); // display a progress every 10 seconds + const ps = new ProgressStream({ interval: 10000 }); // display a progress every 10 seconds stream.on('error', function (error) { debug(`createWriteStream: write stream error ${destFile}`, error); diff --git a/src/progress-stream.js b/src/progress-stream.js new file mode 100644 index 000000000..d643e68cc --- /dev/null +++ b/src/progress-stream.js @@ -0,0 +1,44 @@ +'use strict'; + +exports = module.exports = ProgressStream; + +const stream = require('stream'), + TransformStream = stream.Transform; + +class ProgressStream extends TransformStream { + 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; + } + + _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); + } +}