diff --git a/package.json b/package.json index f9590cb61..a8b375ab4 100644 --- a/package.json +++ b/package.json @@ -85,7 +85,7 @@ "eslint-plugin-react": "^7.11.1", "go-ipfs-dep": "~0.4.18", "gulp": "^3.9.1", - "interface-ipfs-core": "~0.88.0", + "interface-ipfs-core": "~0.90.0", "ipfsd-ctl": "~0.40.0", "nock": "^10.0.2", "pull-stream": "^3.6.9", diff --git a/src/files-mfs/index.js b/src/files-mfs/index.js index d4c6a8e7f..d35e82ea7 100644 --- a/src/files-mfs/index.js +++ b/src/files-mfs/index.js @@ -12,6 +12,8 @@ module.exports = (arg) => { stat: require('./stat')(send), rm: require('./rm')(send), ls: require('./ls')(send), + lsReadableStream: require('./ls-readable-stream')(send), + lsPullStream: require('./ls-pull-stream')(send), read: require('./read')(send), readReadableStream: require('./read-readable-stream')(send), readPullStream: require('./read-pull-stream')(send), diff --git a/src/files-mfs/ls-pull-stream.js b/src/files-mfs/ls-pull-stream.js new file mode 100644 index 000000000..111eba7ed --- /dev/null +++ b/src/files-mfs/ls-pull-stream.js @@ -0,0 +1,12 @@ +'use strict' + +const toPull = require('stream-to-pull-stream') +const lsReadableStream = require('./ls-readable-stream') + +module.exports = (send) => { + return (args, opts) => { + opts = opts || {} + + return toPull.source(lsReadableStream(send)(args, opts)) + } +} diff --git a/src/files-mfs/ls-readable-stream.js b/src/files-mfs/ls-readable-stream.js new file mode 100644 index 000000000..b2107034d --- /dev/null +++ b/src/files-mfs/ls-readable-stream.js @@ -0,0 +1,65 @@ +'use strict' + +const { + Transform, + PassThrough +} = require('stream') +const pump = require('pump') +const ndjson = require('ndjson') +const isStream = require('is-stream') + +const toEntry = (entry) => { + return { + name: entry.Name, + type: entry.Type, + size: entry.Size, + hash: entry.Hash + } +} + +module.exports = (send) => { + return (args, opts) => { + opts = opts || {} + + const transform = new Transform({ + objectMode: true, + + transform (entry, encoding, callback) { + callback(null, toEntry(entry)) + } + }) + + const output = new PassThrough({ + objectMode: true + }) + + send({ + path: 'files/ls', + args: args, + qs: { + ...opts, + stream: true + } + }, (err, res) => { + if (err) { + return output.destroy(err) + } + + if (isStream(res)) { + const parse = ndjson.parse() + + pump(res, parse, transform, output) + } else { + const entries = res.Entries || [] + + entries.forEach((entry) => { + output.write(toEntry(entry)) + }) + + output.end() + } + }) + + return output + } +} diff --git a/test/interface.spec.js b/test/interface.spec.js index b726f8cb0..7a5413e14 100644 --- a/test/interface.spec.js +++ b/test/interface.spec.js @@ -163,7 +163,14 @@ describe('interface-ipfs-core tests', () => { ] }) - tests.filesMFS(defaultCommonFactory) + tests.filesMFS(defaultCommonFactory, { + only: [ + { + name: 'should ls directory', + reason: 'TODO not impemented in go-ipfs yet' + } + ] + }) tests.key(defaultCommonFactory, { skip: [