diff --git a/src/files/add.js b/src/files/add.js index d5aac24c5..dda483cf3 100644 --- a/src/files/add.js +++ b/src/files/add.js @@ -21,10 +21,11 @@ module.exports = (send) => { return callback(new Error('"files" must be a buffer, readable stream, or array of objects')) } - const request = { path: 'add', files: files, qs: opts } + const request = { path: 'add', files: files, qs: opts, progress: opts.progress } // Transform the response stream to DAGNode values const transform = (res, callback) => DAGNodeStream.streamToValue(send, res, callback) + send.andTransform(request, transform, callback) }) } diff --git a/src/utils/request-api.js b/src/utils/request-api.js index 5f78b1e07..0bb84fb61 100644 --- a/src/utils/request-api.js +++ b/src/utils/request-api.js @@ -10,6 +10,7 @@ const getFilesStream = require('./get-files-stream') const streamToValue = require('./stream-to-value') const streamToJsonValue = require('./stream-to-json-value') const request = require('./request') +const Transform = require('readable-stream').Transform // -- Internal @@ -160,7 +161,17 @@ function requestAPI (config, options, callback) { }) if (options.files) { - stream.pipe(req) + if (options.progress && typeof options.progress === 'function') { + const progressStream = new Transform({ + transform: (chunk, encoding, cb) => { + options.progress(chunk.byteLength) + cb(null, chunk) + } + }) + stream.pipe(progressStream).pipe(req) + } else { + stream.pipe(req) + } } else { req.end() } diff --git a/test/files.spec.js b/test/files.spec.js index 8ea2f9f58..989860b5f 100644 --- a/test/files.spec.js +++ b/test/files.spec.js @@ -73,6 +73,15 @@ describe('.files (the MFS API part)', function () { }) }) + it.only('files.add with progress options', (done) => { + ipfs.files.add(testfile, {progress: false}, (err, res) => { + expect(err).to.not.exist() + + expect(res).to.have.length(1) + done() + }) + }) + it('files.mkdir', (done) => { ipfs.files.mkdir('/test-folder', done) })