From 862964e640805a2e431865a74231363e48b57798 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Wed, 24 Apr 2019 13:47:10 +0800 Subject: [PATCH 1/8] feat: refs --- src/files-regular/index.js | 4 +- src/files-regular/refs-pull-stream.js | 23 ++++++ src/files-regular/refs.js | 58 +++++++++++++++ src/refs.js | 40 ----------- src/utils/load-commands.js | 3 +- test/refs.spec.js | 100 -------------------------- test/sub-modules.spec.js | 10 +-- 7 files changed, 89 insertions(+), 149 deletions(-) create mode 100644 src/files-regular/refs-pull-stream.js create mode 100644 src/files-regular/refs.js delete mode 100644 src/refs.js delete mode 100644 test/refs.spec.js diff --git a/src/files-regular/index.js b/src/files-regular/index.js index a52e7505a..764f75c56 100644 --- a/src/files-regular/index.js +++ b/src/files-regular/index.js @@ -20,6 +20,8 @@ module.exports = (arg) => { getPullStream: require('../files-regular/get-pull-stream')(send), ls: require('../files-regular/ls')(send), lsReadableStream: require('../files-regular/ls-readable-stream')(send), - lsPullStream: require('../files-regular/ls-pull-stream')(send) + lsPullStream: require('../files-regular/ls-pull-stream')(send), + refs: require('../files-regular/refs')(send), + refsPullStream: require('../files-regular/refs-pull-stream')(send) } } diff --git a/src/files-regular/refs-pull-stream.js b/src/files-regular/refs-pull-stream.js new file mode 100644 index 000000000..089ae6dba --- /dev/null +++ b/src/files-regular/refs-pull-stream.js @@ -0,0 +1,23 @@ +'use strict' + +const pullError = require('pull-stream/sources/error') +const pullValues = require('pull-stream/sources/values') +const pullDefer = require('pull-defer') +const refs = require('./refs') + +module.exports = (arg) => { + const refsFn = refs(arg) + + return (args, opts) => { + const p = pullDefer.source() + + refsFn(args, opts, (err, res) => { + if (err) { + return p.resolve(pullError(err)) + } + p.resolve(pullValues(res)) + }) + + return p + } +} diff --git a/src/files-regular/refs.js b/src/files-regular/refs.js new file mode 100644 index 000000000..76e990cc8 --- /dev/null +++ b/src/files-regular/refs.js @@ -0,0 +1,58 @@ +'use strict' + +const IsIpfs = require('is-ipfs') +const promisify = require('promisify-es6') +const streamToValue = require('../utils/stream-to-value') +const moduleConfig = require('../utils/module-config') +const cleanCID = require('../utils/clean-cid') + +function valueOrStreamToValue (response, callback) { + if (typeof response.pipe === 'function') { + streamToValue(response, callback) + } else { + callback(null, response) + } +} + +module.exports = (arg) => { + const send = moduleConfig(arg) + + const refs = promisify((args, opts, callback) => { + if (typeof (opts) === 'function') { + callback = opts + opts = {} + } + + try { + args = cleanCID(args) + } catch (err) { + if (!IsIpfs.ipfsPath(args)) { + return callback(err) + } + } + + const request = { + path: 'refs', + args: args, + qs: opts + } + + send.andTransform(request, valueOrStreamToValue, callback) + }) + + refs.local = promisify((opts, callback) => { + if (typeof (opts) === 'function') { + callback = opts + opts = {} + } + + const request = { + path: 'refs/local', + qs: opts + } + + send.andTransform(request, valueOrStreamToValue, callback) + }) + + return refs +} diff --git a/src/refs.js b/src/refs.js deleted file mode 100644 index 97d204124..000000000 --- a/src/refs.js +++ /dev/null @@ -1,40 +0,0 @@ -'use strict' - -const promisify = require('promisify-es6') -const streamToValue = require('./utils/stream-to-value') -const moduleConfig = require('./utils/module-config') - -module.exports = (arg) => { - const send = moduleConfig(arg) - - const refs = promisify((args, opts, callback) => { - if (typeof (opts) === 'function') { - callback = opts - opts = {} - } - - const request = { - path: 'refs', - args: args, - qs: opts - } - - send.andTransform(request, streamToValue, callback) - }) - - refs.local = promisify((opts, callback) => { - if (typeof (opts) === 'function') { - callback = opts - opts = {} - } - - const request = { - path: 'refs/local', - qs: opts - } - - send.andTransform(request, streamToValue, callback) - }) - - return refs -} diff --git a/src/utils/load-commands.js b/src/utils/load-commands.js index 030aef5ab..f383cf4f9 100644 --- a/src/utils/load-commands.js +++ b/src/utils/load-commands.js @@ -18,6 +18,8 @@ function requireCommands () { ls: require('../files-regular/ls'), lsReadableStream: require('../files-regular/ls-readable-stream'), lsPullStream: require('../files-regular/ls-pull-stream'), + refs: require('../files-regular/refs'), + refsPullStream: require('../files-regular/refs-pull-stream'), // Files MFS (Mutable Filesystem) files: require('../files-mfs'), @@ -50,7 +52,6 @@ function requireCommands () { key: require('../key'), log: require('../log'), mount: require('../mount'), - refs: require('../refs'), repo: require('../repo'), stop: require('../stop'), shutdown: require('../stop'), diff --git a/test/refs.spec.js b/test/refs.spec.js deleted file mode 100644 index 9ffcf4ebe..000000000 --- a/test/refs.spec.js +++ /dev/null @@ -1,100 +0,0 @@ -/* eslint-env mocha */ -'use strict' - -const chai = require('chai') -const dirtyChai = require('dirty-chai') -const expect = chai.expect -chai.use(dirtyChai) -const isNode = require('detect-node') -const waterfall = require('async/waterfall') -const path = require('path') -const fs = require('fs') - -const ipfsClient = require('../src') -const f = require('./utils/factory') - -describe('.refs', function () { - this.timeout(80 * 1000) - - if (!isNode) { return } - - let ipfs - let ipfsd - let folder - - before((done) => { - const filesPath = path.join(__dirname, '/fixtures/test-folder') - - // Symlinks in a repo don't always clone well, especially on Windows. - // So if the 'hello-link' is not a symlink, then make it one. - const symlinkPath = filesPath + '/hello-link' - const symlinkTarget = 'files/hello.txt' - if (!fs.lstatSync(symlinkPath).isSymbolicLink()) { - fs.unlinkSync(symlinkPath) - fs.symlinkSync(symlinkTarget, symlinkPath) - } - - waterfall([ - (cb) => f.spawn({ initOptions: { bits: 1024, profile: 'test' } }, cb), - (_ipfsd, cb) => { - ipfsd = _ipfsd - ipfs = ipfsClient(_ipfsd.apiAddr) - ipfs.addFromFs(filesPath, { recursive: true }, cb) - }, - (hashes, cb) => { - folder = hashes[hashes.length - 1].hash - expect(folder).to.be.eql('QmQao3KNcpCsdXaLGpjieFGMfXzsSXgsf6Rnc5dJJA3QMh') - cb() - } - ], done) - }) - - after((done) => { - if (!ipfsd) return done() - ipfsd.stop(done) - }) - - const result = [ - { - Ref: 'QmQao3KNcpCsdXaLGpjieFGMfXzsSXgsf6Rnc5dJJA3QMh QmcUYKmQxmTcFom4R4UZP7FWeQzgJkwcFn51XrvsMy7PE9 add', - Err: '' - }, { - Ref: 'QmQao3KNcpCsdXaLGpjieFGMfXzsSXgsf6Rnc5dJJA3QMh QmNeHxDfQfjVFyYj2iruvysLH9zpp78v3cu1s3BZq1j5hY cat', - Err: '' - }, { - Ref: 'QmQao3KNcpCsdXaLGpjieFGMfXzsSXgsf6Rnc5dJJA3QMh QmTYFLz5vsdMpq4XXw1a1pSxujJc9Z5V3Aw1Qg64d849Zy files', - Err: '' - }, { - Ref: 'QmQao3KNcpCsdXaLGpjieFGMfXzsSXgsf6Rnc5dJJA3QMh QmY9cxiHqTFoWamkQVkpmmqzBrY3hCBEL2XNu3NtX74Fuu hello-link', - Err: '' - }, { - Ref: 'QmQao3KNcpCsdXaLGpjieFGMfXzsSXgsf6Rnc5dJJA3QMh QmU7wetVaAqc3Meurif9hcYBHGvQmL5QdpPJYBoZizyTNL ipfs-add', - Err: '' - }, { - Ref: 'QmQao3KNcpCsdXaLGpjieFGMfXzsSXgsf6Rnc5dJJA3QMh QmctZfSuegbi2TMFY2y3VQjxsH5JbRBu7XmiLfHNvshhio ls', - Err: '' - }, { - Ref: 'QmQao3KNcpCsdXaLGpjieFGMfXzsSXgsf6Rnc5dJJA3QMh QmbkMNB6rwfYAxRvnG9CWJ6cKKHEdq2ZKTozyF5FQ7H8Rs version', - Err: '' - } - ] - - describe('Callback API', () => { - it('refs', (done) => { - ipfs.refs(folder, { format: ' ' }, (err, objs) => { - expect(err).to.not.exist() - expect(objs).to.eql(result) - done() - }) - }) - }) - - describe('Promise API', () => { - it('refs', () => { - return ipfs.refs(folder, { format: ' ' }) - .then((objs) => { - expect(objs).to.eql(result) - }) - }) - }) -}) diff --git a/test/sub-modules.spec.js b/test/sub-modules.spec.js index 333407ea4..b0e8cb9eb 100644 --- a/test/sub-modules.spec.js +++ b/test/sub-modules.spec.js @@ -183,6 +183,9 @@ describe('submodules', () => { expect(filesRegular.ls).to.be.a('function') expect(filesRegular.lsReadableStream).to.be.a('function') expect(filesRegular.lsPullStream).to.be.a('function') + expect(filesRegular.refs).to.be.a('function') + expect(filesRegular.refs.local).to.be.a('function') + expect(filesRegular.refsPullStream).to.be.a('function') }) it('files MFS API', () => { @@ -209,11 +212,4 @@ describe('submodules', () => { expect(mount).to.be.a('function') }) - - it('refs', () => { - const refs = require('../src/refs')(config) - - expect(refs).to.be.a('function') - expect(refs.local).to.be.a('function') - }) }) From 8617792b43952de4ae6ca3726c0ed6f4f9b89cc3 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Sun, 28 Apr 2019 23:01:22 +0800 Subject: [PATCH 2/8] feat: add refsReadableStream() --- src/files-regular/index.js | 1 + src/files-regular/refs-readable-stream.js | 22 ++++++++++++++++++++++ src/utils/load-commands.js | 1 + 3 files changed, 24 insertions(+) create mode 100644 src/files-regular/refs-readable-stream.js diff --git a/src/files-regular/index.js b/src/files-regular/index.js index 764f75c56..059d7ea1c 100644 --- a/src/files-regular/index.js +++ b/src/files-regular/index.js @@ -22,6 +22,7 @@ module.exports = (arg) => { lsReadableStream: require('../files-regular/ls-readable-stream')(send), lsPullStream: require('../files-regular/ls-pull-stream')(send), refs: require('../files-regular/refs')(send), + refsReadableStream: require('../files-regular/refs-readable-stream')(send), refsPullStream: require('../files-regular/refs-pull-stream')(send) } } diff --git a/src/files-regular/refs-readable-stream.js b/src/files-regular/refs-readable-stream.js new file mode 100644 index 000000000..d65020dd8 --- /dev/null +++ b/src/files-regular/refs-readable-stream.js @@ -0,0 +1,22 @@ +'use strict' + +const Stream = require('readable-stream') +const refs = require('./refs') + +module.exports = (arg) => { + const refsFn = refs(arg) + + return (args, opts) => { + const pt = new Stream.PassThrough({ objectMode: true }) + + refsFn(args, opts, (err, res) => { + if (err) { + return pt.emit('error', err) + } + res.forEach((item) => pt.write(item)) + pt.end() + }) + + return pt + } +} diff --git a/src/utils/load-commands.js b/src/utils/load-commands.js index f383cf4f9..e4a914dd0 100644 --- a/src/utils/load-commands.js +++ b/src/utils/load-commands.js @@ -19,6 +19,7 @@ function requireCommands () { lsReadableStream: require('../files-regular/ls-readable-stream'), lsPullStream: require('../files-regular/ls-pull-stream'), refs: require('../files-regular/refs'), + refsReadableStream: require('../files-regular/refs-readable-stream'), refsPullStream: require('../files-regular/refs-pull-stream'), // Files MFS (Mutable Filesystem) From 0a91725f2b5d586a10e9801ab32e2bcdc65a60fa Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Mon, 29 Apr 2019 23:09:56 +0800 Subject: [PATCH 3/8] fix: add refsReadableStream to sub-modules spec --- test/sub-modules.spec.js | 1 + 1 file changed, 1 insertion(+) diff --git a/test/sub-modules.spec.js b/test/sub-modules.spec.js index b0e8cb9eb..cf9df96b4 100644 --- a/test/sub-modules.spec.js +++ b/test/sub-modules.spec.js @@ -185,6 +185,7 @@ describe('submodules', () => { expect(filesRegular.lsPullStream).to.be.a('function') expect(filesRegular.refs).to.be.a('function') expect(filesRegular.refs.local).to.be.a('function') + expect(filesRegular.refsReadableStream).to.be.a('function') expect(filesRegular.refsPullStream).to.be.a('function') }) From 32204473d2e7c4d3a0693707110858d658181e02 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Wed, 1 May 2019 22:20:41 +0800 Subject: [PATCH 4/8] feat: stream refs endpoints --- src/files-regular/refs-local-pull-stream.js | 26 ++++++++++++++ .../refs-local-readable-stream.js | 22 ++++++++++++ src/files-regular/refs-local.js | 25 +++++++++++++ src/files-regular/refs-pull-stream.js | 35 ++++++++++++------- src/files-regular/refs-readable-stream.js | 26 +++++++++----- src/files-regular/refs.js | 16 ++------- test/sub-modules.spec.js | 4 ++- 7 files changed, 119 insertions(+), 35 deletions(-) create mode 100644 src/files-regular/refs-local-pull-stream.js create mode 100644 src/files-regular/refs-local-readable-stream.js create mode 100644 src/files-regular/refs-local.js diff --git a/src/files-regular/refs-local-pull-stream.js b/src/files-regular/refs-local-pull-stream.js new file mode 100644 index 000000000..95b38cf66 --- /dev/null +++ b/src/files-regular/refs-local-pull-stream.js @@ -0,0 +1,26 @@ +'use strict' + +const cleanCID = require('../utils/clean-cid') +const v = require('is-ipfs') +const pull = require('pull-stream') +const toPull = require('stream-to-pull-stream') +const deferred = require('pull-defer') +const moduleConfig = require('../utils/module-config') + +module.exports = (send) => { + send = moduleConfig(send) + + return (opts) => { + opts = opts || {} + + const p = deferred.source() + + send({ path: 'refs/local', qs: opts }, (err, stream) => { + if (err) { return p.resolve(pull.error(err)) } + + p.resolve(toPull.source(stream)) + }) + + return p + } +} diff --git a/src/files-regular/refs-local-readable-stream.js b/src/files-regular/refs-local-readable-stream.js new file mode 100644 index 000000000..0c967def0 --- /dev/null +++ b/src/files-regular/refs-local-readable-stream.js @@ -0,0 +1,22 @@ +'use strict' + +const cleanCID = require('../utils/clean-cid') +const v = require('is-ipfs') +const Stream = require('readable-stream') +const pump = require('pump') + +module.exports = (send) => { + return (opts) => { + opts = opts || {} + + const pt = new Stream.PassThrough({ objectMode: true }) + + send({ path: 'refs/local', qs: opts }, (err, stream) => { + if (err) { return pt.destroy(err) } + + pump(stream, pt) + }) + + return pt + } +} diff --git a/src/files-regular/refs-local.js b/src/files-regular/refs-local.js new file mode 100644 index 000000000..1b3d8333c --- /dev/null +++ b/src/files-regular/refs-local.js @@ -0,0 +1,25 @@ +'use strict' + +const IsIpfs = require('is-ipfs') +const promisify = require('promisify-es6') +const streamToValue = require('../utils/stream-to-value') +const moduleConfig = require('../utils/module-config') +const cleanCID = require('../utils/clean-cid') + +module.exports = (arg) => { + const send = moduleConfig(arg) + + return promisify((opts, callback) => { + if (typeof (opts) === 'function') { + callback = opts + opts = {} + } + + const request = { + path: 'refs/local', + qs: opts + } + + send.andTransform(request, streamToValue, callback) + }) +} diff --git a/src/files-regular/refs-pull-stream.js b/src/files-regular/refs-pull-stream.js index 089ae6dba..4de21607f 100644 --- a/src/files-regular/refs-pull-stream.js +++ b/src/files-regular/refs-pull-stream.js @@ -1,21 +1,32 @@ 'use strict' -const pullError = require('pull-stream/sources/error') -const pullValues = require('pull-stream/sources/values') -const pullDefer = require('pull-defer') -const refs = require('./refs') +const cleanCID = require('../utils/clean-cid') +const v = require('is-ipfs') +const pull = require('pull-stream') +const toPull = require('stream-to-pull-stream') +const deferred = require('pull-defer') +const moduleConfig = require('../utils/module-config') -module.exports = (arg) => { - const refsFn = refs(arg) +module.exports = (send) => { + send = moduleConfig(send) - return (args, opts) => { - const p = pullDefer.source() + return (hash, opts) => { + opts = opts || {} - refsFn(args, opts, (err, res) => { - if (err) { - return p.resolve(pullError(err)) + const p = deferred.source() + + try { + hash = cleanCID(hash) + } catch (err) { + if (!v.ipfsPath(hash)) { + return p.end(err) } - p.resolve(pullValues(res)) + } + + send({ path: 'refs', args: hash, qs: opts }, (err, stream) => { + if (err) { return p.resolve(pull.error(err)) } + + p.resolve(toPull.source(stream)) }) return p diff --git a/src/files-regular/refs-readable-stream.js b/src/files-regular/refs-readable-stream.js index d65020dd8..1c0634b1d 100644 --- a/src/files-regular/refs-readable-stream.js +++ b/src/files-regular/refs-readable-stream.js @@ -1,20 +1,28 @@ 'use strict' +const cleanCID = require('../utils/clean-cid') +const v = require('is-ipfs') const Stream = require('readable-stream') -const refs = require('./refs') +const pump = require('pump') -module.exports = (arg) => { - const refsFn = refs(arg) +module.exports = (send) => { + return (hash, opts) => { + opts = opts || {} - return (args, opts) => { const pt = new Stream.PassThrough({ objectMode: true }) - refsFn(args, opts, (err, res) => { - if (err) { - return pt.emit('error', err) + try { + hash = cleanCID(hash) + } catch (err) { + if (!v.ipfsPath(hash)) { + return pt.destroy(err) } - res.forEach((item) => pt.write(item)) - pt.end() + } + + send({ path: 'refs', args: hash, qs: opts }, (err, stream) => { + if (err) { return pt.destroy(err) } + + pump(stream, pt) }) return pt diff --git a/src/files-regular/refs.js b/src/files-regular/refs.js index 76e990cc8..463add692 100644 --- a/src/files-regular/refs.js +++ b/src/files-regular/refs.js @@ -40,19 +40,9 @@ module.exports = (arg) => { send.andTransform(request, valueOrStreamToValue, callback) }) - refs.local = promisify((opts, callback) => { - if (typeof (opts) === 'function') { - callback = opts - opts = {} - } - - const request = { - path: 'refs/local', - qs: opts - } - - send.andTransform(request, valueOrStreamToValue, callback) - }) + refs.local = require('./refs-local')(arg) + refs.localReadableStream = require('./refs-local-readable-stream')(arg) + refs.localPullStream = require('./refs-local-pull-stream')(arg) return refs } diff --git a/test/sub-modules.spec.js b/test/sub-modules.spec.js index cf9df96b4..cabd09b55 100644 --- a/test/sub-modules.spec.js +++ b/test/sub-modules.spec.js @@ -184,9 +184,11 @@ describe('submodules', () => { expect(filesRegular.lsReadableStream).to.be.a('function') expect(filesRegular.lsPullStream).to.be.a('function') expect(filesRegular.refs).to.be.a('function') - expect(filesRegular.refs.local).to.be.a('function') expect(filesRegular.refsReadableStream).to.be.a('function') expect(filesRegular.refsPullStream).to.be.a('function') + expect(filesRegular.refs.local).to.be.a('function') + expect(filesRegular.refs.localReadableStream).to.be.a('function') + expect(filesRegular.refs.localPullStream).to.be.a('function') }) it('files MFS API', () => { From 015d9381468a9ac10e69e538dc2f468b9d47968c Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Thu, 2 May 2019 16:18:43 +0800 Subject: [PATCH 5/8] fix: change Ref -> ref --- src/files-regular/refs-local-pull-stream.js | 5 ++++- .../refs-local-readable-stream.js | 5 ++++- src/files-regular/refs-local.js | 13 ++++++++++-- src/files-regular/refs-pull-stream.js | 5 ++++- src/files-regular/refs-readable-stream.js | 5 ++++- src/files-regular/refs.js | 21 ++++++++++--------- 6 files changed, 38 insertions(+), 16 deletions(-) diff --git a/src/files-regular/refs-local-pull-stream.js b/src/files-regular/refs-local-pull-stream.js index 95b38cf66..e9ad42712 100644 --- a/src/files-regular/refs-local-pull-stream.js +++ b/src/files-regular/refs-local-pull-stream.js @@ -18,7 +18,10 @@ module.exports = (send) => { send({ path: 'refs/local', qs: opts }, (err, stream) => { if (err) { return p.resolve(pull.error(err)) } - p.resolve(toPull.source(stream)) + p.resolve(pull( + toPull.source(stream), + pull.map(r => ({ ref: r.Ref, err: r.Err })) + )) }) return p diff --git a/src/files-regular/refs-local-readable-stream.js b/src/files-regular/refs-local-readable-stream.js index 0c967def0..1de6052c4 100644 --- a/src/files-regular/refs-local-readable-stream.js +++ b/src/files-regular/refs-local-readable-stream.js @@ -4,6 +4,7 @@ const cleanCID = require('../utils/clean-cid') const v = require('is-ipfs') const Stream = require('readable-stream') const pump = require('pump') +const through = require('through2') module.exports = (send) => { return (opts) => { @@ -14,7 +15,9 @@ module.exports = (send) => { send({ path: 'refs/local', qs: opts }, (err, stream) => { if (err) { return pt.destroy(err) } - pump(stream, pt) + pump(stream, through.obj(function (r, enc, cb) { + cb(null, { ref: r.Ref, err: r.Err }) + }), pt) }) return pt diff --git a/src/files-regular/refs-local.js b/src/files-regular/refs-local.js index 1b3d8333c..27f2d727f 100644 --- a/src/files-regular/refs-local.js +++ b/src/files-regular/refs-local.js @@ -2,7 +2,7 @@ const IsIpfs = require('is-ipfs') const promisify = require('promisify-es6') -const streamToValue = require('../utils/stream-to-value') +const streamToValueWithTransformer = require('../utils/stream-to-value-with-transformer') const moduleConfig = require('../utils/module-config') const cleanCID = require('../utils/clean-cid') @@ -15,11 +15,20 @@ module.exports = (arg) => { opts = {} } + const transform = (res, cb) => { + cb(null, res.map(r => ({ ref: r.Ref, err: r.Err }))) + } + const request = { path: 'refs/local', qs: opts } + send(request, (err, result) => { + if (err) { + return callback(err) + } - send.andTransform(request, streamToValue, callback) + streamToValueWithTransformer(result, transform, callback) + }) }) } diff --git a/src/files-regular/refs-pull-stream.js b/src/files-regular/refs-pull-stream.js index 4de21607f..8e25e0560 100644 --- a/src/files-regular/refs-pull-stream.js +++ b/src/files-regular/refs-pull-stream.js @@ -26,7 +26,10 @@ module.exports = (send) => { send({ path: 'refs', args: hash, qs: opts }, (err, stream) => { if (err) { return p.resolve(pull.error(err)) } - p.resolve(toPull.source(stream)) + p.resolve(pull( + toPull.source(stream), + pull.map(r => ({ ref: r.Ref, err: r.Err })) + )) }) return p diff --git a/src/files-regular/refs-readable-stream.js b/src/files-regular/refs-readable-stream.js index 1c0634b1d..693b7917d 100644 --- a/src/files-regular/refs-readable-stream.js +++ b/src/files-regular/refs-readable-stream.js @@ -4,6 +4,7 @@ const cleanCID = require('../utils/clean-cid') const v = require('is-ipfs') const Stream = require('readable-stream') const pump = require('pump') +const through = require('through2') module.exports = (send) => { return (hash, opts) => { @@ -22,7 +23,9 @@ module.exports = (send) => { send({ path: 'refs', args: hash, qs: opts }, (err, stream) => { if (err) { return pt.destroy(err) } - pump(stream, pt) + pump(stream, through.obj(function (r, enc, cb) { + cb(null, { ref: r.Ref, err: r.Err }) + }), pt) }) return pt diff --git a/src/files-regular/refs.js b/src/files-regular/refs.js index 463add692..9740ea3ae 100644 --- a/src/files-regular/refs.js +++ b/src/files-regular/refs.js @@ -2,18 +2,10 @@ const IsIpfs = require('is-ipfs') const promisify = require('promisify-es6') -const streamToValue = require('../utils/stream-to-value') +const streamToValueWithTransformer = require('../utils/stream-to-value-with-transformer') const moduleConfig = require('../utils/module-config') const cleanCID = require('../utils/clean-cid') -function valueOrStreamToValue (response, callback) { - if (typeof response.pipe === 'function') { - streamToValue(response, callback) - } else { - callback(null, response) - } -} - module.exports = (arg) => { const send = moduleConfig(arg) @@ -31,13 +23,22 @@ module.exports = (arg) => { } } + const transform = (res, cb) => { + cb(null, res.map(r => ({ ref: r.Ref, err: r.Err }))) + } + const request = { path: 'refs', args: args, qs: opts } + send(request, (err, result) => { + if (err) { + return callback(err) + } - send.andTransform(request, valueOrStreamToValue, callback) + streamToValueWithTransformer(result, transform, callback) + }) }) refs.local = require('./refs-local')(arg) From aadfb383996214d7d4903dcb896e9042991f8bd2 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Thu, 2 May 2019 16:21:19 +0800 Subject: [PATCH 6/8] chore: lint fixes --- src/files-regular/refs-local-pull-stream.js | 2 -- src/files-regular/refs-local-readable-stream.js | 2 -- src/files-regular/refs-local.js | 2 -- 3 files changed, 6 deletions(-) diff --git a/src/files-regular/refs-local-pull-stream.js b/src/files-regular/refs-local-pull-stream.js index e9ad42712..c4452b116 100644 --- a/src/files-regular/refs-local-pull-stream.js +++ b/src/files-regular/refs-local-pull-stream.js @@ -1,7 +1,5 @@ 'use strict' -const cleanCID = require('../utils/clean-cid') -const v = require('is-ipfs') const pull = require('pull-stream') const toPull = require('stream-to-pull-stream') const deferred = require('pull-defer') diff --git a/src/files-regular/refs-local-readable-stream.js b/src/files-regular/refs-local-readable-stream.js index 1de6052c4..0d8bc15bf 100644 --- a/src/files-regular/refs-local-readable-stream.js +++ b/src/files-regular/refs-local-readable-stream.js @@ -1,7 +1,5 @@ 'use strict' -const cleanCID = require('../utils/clean-cid') -const v = require('is-ipfs') const Stream = require('readable-stream') const pump = require('pump') const through = require('through2') diff --git a/src/files-regular/refs-local.js b/src/files-regular/refs-local.js index 27f2d727f..680e51000 100644 --- a/src/files-regular/refs-local.js +++ b/src/files-regular/refs-local.js @@ -1,10 +1,8 @@ 'use strict' -const IsIpfs = require('is-ipfs') const promisify = require('promisify-es6') const streamToValueWithTransformer = require('../utils/stream-to-value-with-transformer') const moduleConfig = require('../utils/module-config') -const cleanCID = require('../utils/clean-cid') module.exports = (arg) => { const send = moduleConfig(arg) From c49143baff0e7499671303189c113b77fcb41f5c Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Fri, 3 May 2019 18:52:22 +0800 Subject: [PATCH 7/8] fix: support multiple refs --- src/files-regular/refs-pull-stream.js | 15 ++++------ src/files-regular/refs-readable-stream.js | 15 ++++------ src/files-regular/refs.js | 36 +++++++++++++++++++---- 3 files changed, 43 insertions(+), 23 deletions(-) diff --git a/src/files-regular/refs-pull-stream.js b/src/files-regular/refs-pull-stream.js index 8e25e0560..e3c1b113a 100644 --- a/src/files-regular/refs-pull-stream.js +++ b/src/files-regular/refs-pull-stream.js @@ -1,29 +1,26 @@ 'use strict' -const cleanCID = require('../utils/clean-cid') -const v = require('is-ipfs') const pull = require('pull-stream') const toPull = require('stream-to-pull-stream') const deferred = require('pull-defer') const moduleConfig = require('../utils/module-config') +const { checkArgs, normalizeOpts } = require('./refs') module.exports = (send) => { send = moduleConfig(send) - return (hash, opts) => { - opts = opts || {} + return (args, opts) => { + opts = normalizeOpts(opts) const p = deferred.source() try { - hash = cleanCID(hash) + args = checkArgs(args) } catch (err) { - if (!v.ipfsPath(hash)) { - return p.end(err) - } + return p.end(err) } - send({ path: 'refs', args: hash, qs: opts }, (err, stream) => { + send({ path: 'refs', args, qs: opts }, (err, stream) => { if (err) { return p.resolve(pull.error(err)) } p.resolve(pull( diff --git a/src/files-regular/refs-readable-stream.js b/src/files-regular/refs-readable-stream.js index 693b7917d..4c9ae2d1f 100644 --- a/src/files-regular/refs-readable-stream.js +++ b/src/files-regular/refs-readable-stream.js @@ -1,26 +1,23 @@ 'use strict' -const cleanCID = require('../utils/clean-cid') -const v = require('is-ipfs') const Stream = require('readable-stream') const pump = require('pump') const through = require('through2') +const { checkArgs, normalizeOpts } = require('./refs') module.exports = (send) => { - return (hash, opts) => { - opts = opts || {} + return (args, opts) => { + opts = normalizeOpts(opts) const pt = new Stream.PassThrough({ objectMode: true }) try { - hash = cleanCID(hash) + args = checkArgs(args) } catch (err) { - if (!v.ipfsPath(hash)) { - return pt.destroy(err) - } + return pt.destroy(err) } - send({ path: 'refs', args: hash, qs: opts }, (err, stream) => { + send({ path: 'refs', args, qs: opts }, (err, stream) => { if (err) { return pt.destroy(err) } pump(stream, through.obj(function (r, enc, cb) { diff --git a/src/files-regular/refs.js b/src/files-regular/refs.js index 9740ea3ae..986a6f6cc 100644 --- a/src/files-regular/refs.js +++ b/src/files-regular/refs.js @@ -14,13 +14,12 @@ module.exports = (arg) => { callback = opts opts = {} } + opts = module.exports.normalizeOpts(opts) try { - args = cleanCID(args) + args = module.exports.checkArgs(args) } catch (err) { - if (!IsIpfs.ipfsPath(args)) { - return callback(err) - } + return callback(err) } const transform = (res, cb) => { @@ -28,8 +27,8 @@ module.exports = (arg) => { } const request = { + args, path: 'refs', - args: args, qs: opts } send(request, (err, result) => { @@ -47,3 +46,30 @@ module.exports = (arg) => { return refs } + +module.exports.checkArgs = (args) => { + const isArray = Array.isArray(args) + args = isArray ? args : [args] + + const res = [] + for (let arg of args) { + try { + arg = cleanCID(arg) + } catch (err) { + if (!IsIpfs.ipfsPath(arg)) { + throw err + } + } + res.push(arg) + } + + return isArray ? res : res[0] +} + +module.exports.normalizeOpts = (opts) => { + opts = opts || {} + if (typeof opts.maxDepth === 'number') { + opts['max-depth'] = opts.maxDepth + } + return opts +} From f396f01c6ad98ab8c5f3b92c61a564fcae7f7389 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Fri, 3 May 2019 23:54:22 +0800 Subject: [PATCH 8/8] chore: add refs to README --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index a1ef73530..c4544e791 100644 --- a/README.md +++ b/README.md @@ -220,6 +220,14 @@ const ipfs = ipfsClient({ - [`ipfs.block.put(block, [options], [callback])`](https://github.com/ipfs/interface-ipfs-core/blob/master/SPEC/BLOCK.md#blockput) - [`ipfs.block.stat(cid, [callback])`](https://github.com/ipfs/interface-ipfs-core/blob/master/SPEC/BLOCK.md#blockstat) +- [refs](https://github.com/ipfs/interface-ipfs-core/blob/master/SPEC/REFS.md) + - [`ipfs.refs(ipfsPath, [options], [callback])`](https://github.com/ipfs/interface-ipfs-core/blob/master/SPEC/REFS.md#refs) + - [`ipfs.refsReadableStream(ipfsPath, [options], [callback])`](https://github.com/ipfs/interface-ipfs-core/blob/master/SPEC/REFS.md#refsreadablestream) + - [`ipfs.refsPullStream(ipfsPath, [options], [callback])`](https://github.com/ipfs/interface-ipfs-core/blob/master/SPEC/REFS.md#refspullstream) + - [`ipfs.refs.local([callback])`](https://github.com/ipfs/interface-ipfs-core/blob/master/SPEC/REFS.md#refslocal) + - [`ipfs.refs.localReadableStream([callback])`](https://github.com/ipfs/interface-ipfs-core/blob/master/SPEC/REFS.md#refslocalreadablestream) + - [`ipfs.refs.localPullStream([callback])`](https://github.com/ipfs/interface-ipfs-core/blob/master/SPEC/REFS.md#refslocalpullstream) + #### Graph - [dag](https://github.com/ipfs/interface-ipfs-core/blob/master/SPEC/DAG.md)