diff options
author | LinuxWizard42 <computerwizard@linuxmail.org> | 2022-10-12 22:54:37 +0300 |
---|---|---|
committer | LinuxWizard42 <computerwizard@linuxmail.org> | 2022-10-12 22:54:37 +0300 |
commit | 703e03aba33f234712206769f57717ba7d92d23d (patch) | |
tree | 0041f04ccb75bd5379c764e9fe42249fffe75fc3 /node_modules/progress-stream/index.js | |
parent | ab6e257e6e9d9a483d7e86f220d8b209a2cd7753 (diff) | |
download | FlashRunner-703e03aba33f234712206769f57717ba7d92d23d.tar.gz FlashRunner-703e03aba33f234712206769f57717ba7d92d23d.tar.zst |
Added export_allowed file to make repository visible in cgit
Diffstat (limited to 'node_modules/progress-stream/index.js')
-rw-r--r-- | node_modules/progress-stream/index.js | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/node_modules/progress-stream/index.js b/node_modules/progress-stream/index.js new file mode 100644 index 0000000..5036935 --- /dev/null +++ b/node_modules/progress-stream/index.js @@ -0,0 +1,98 @@ +var through = require('through2'); +var speedometer = require('speedometer'); + +module.exports = function(options, onprogress) { + if (typeof options === 'function') return module.exports(null, options); + options = options || {}; + + var length = options.length || 0; + var time = options.time || 0; + var drain = options.drain || false; + var transferred = options.transferred || 0; + var nextUpdate = Date.now()+time; + var delta = 0; + var speed = speedometer(options.speed || 5000); + var startTime = Date.now(); + + var update = { + percentage: 0, + transferred: transferred, + length: length, + remaining: length, + eta: 0, + runtime: 0 + }; + + var emit = function(ended) { + update.delta = delta; + update.percentage = ended ? 100 : (length ? transferred/length*100 : 0); + update.speed = speed(delta); + update.eta = Math.round(update.remaining / update.speed); + update.runtime = parseInt((Date.now() - startTime)/1000); + nextUpdate = Date.now()+time; + + delta = 0; + + tr.emit('progress', update); + }; + var write = function(chunk, enc, callback) { + var len = options.objectMode ? 1 : chunk.length; + transferred += len; + delta += len; + update.transferred = transferred; + update.remaining = length >= transferred ? length - transferred : 0; + + if (Date.now() >= nextUpdate) emit(false); + callback(null, chunk); + }; + var end = function(callback) { + emit(true); + callback(); + }; + + var tr = through(options.objectMode ? {objectMode:true, highWaterMark:16} : {}, write, end); + var onlength = function(newLength) { + length = newLength; + update.length = length; + update.remaining = length - update.transferred; + tr.emit('length', length); + }; + + // Expose `onlength()` handler as `setLength()` to support custom use cases where length + // is not known until after a few chunks have already been pumped, or is + // calculated on the fly. + tr.setLength = onlength; + + tr.on('pipe', function(stream) { + if (typeof length === 'number') return; + // Support http module + if (stream.readable && !stream.writable && stream.headers) { + return onlength(parseInt(stream.headers['content-length'] || 0)); + } + + // Support streams with a length property + if (typeof stream.length === 'number') { + return onlength(stream.length); + } + + // Support request module + stream.on('response', function(res) { + if (!res || !res.headers) return; + if (res.headers['content-encoding'] === 'gzip') return; + if (res.headers['content-length']) { + return onlength(parseInt(res.headers['content-length'])); + } + }); + }); + + if (drain) tr.resume(); + if (onprogress) tr.on('progress', onprogress); + + tr.progress = function() { + update.speed = speed(0); + update.eta = Math.round(update.remaining / update.speed); + + return update; + }; + return tr; +}; |