diff --git a/README.md b/README.md index 75ec894..b55b813 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ - [Usage](#usage) - [API](#api) - [IPLD Resolver](#ipldresolver) - - [`.put(node, < || , >, callback)`](#putnode-cb) + - [`.put(node, options, callback)`](#putnode-cb) - [`.get(cid [, path] [, options], callback)`](#getcid-cb) - [`.remove(cid, callback)`](#removecid-cb) - [`.support.add(multicodec, formatResolver, formatUtil)`]() @@ -48,11 +48,13 @@ const Resolver = new Resolver(blockService) ## API -### `.put(node, < || , >, callback)` +### `.put(node, options, callback)` > Store the given node of a recognized IPLD Format. -A `CID` or a format + hashAlg tuple needs to be passed in so that the resolver understand how to serialize the object. +Options is an object that must contain one of the following combinations: +- `cid` - the CID of the node +- `hashAlg` and `format` - the hashAlg and the format that should be used to create the CID of the node ### `.get(cid [, path] [, options], callback)` @@ -67,6 +69,10 @@ A `CID` or a format + hashAlg tuple needs to be passed in so that the resolver u - `value` - the value that resulted from the get - `remainderPath` - If it didn't manage to successfully resolve the whole path through or if simply the `localResolve` option was passed. +### `.getStream(cid [, path] [, options])` + +> Same as get, but returns a source pull-stream that is used to pass the fetched node. + ### `.remove(cid, callback)` > Remove a node by the given `cid` diff --git a/src/index.js b/src/index.js index 2658508..3994362 100644 --- a/src/index.js +++ b/src/index.js @@ -8,6 +8,7 @@ const IPFSRepo = require('ipfs-repo') const MemoryStore = require('interface-pull-blob-store') const BlockService = require('ipfs-block-service') const joinPath = require('path').join +const pullDeferSource = require('pull-defer').source const dagPB = require('ipld-dag-pb') const dagCBOR = require('ipld-dag-cbor') @@ -135,29 +136,41 @@ module.exports = class IPLDResolver { ) } - put (node, cidOrFormat, hashAlg, callback) { + getStream (cid, path, options) { + const deferred = pullDeferSource() + + this.get(cid, path, options, (err, result) => { + if (err) { + return deferred.resolve( + pull.error(err) + ) + } + deferred.resolve( + pull.values([result]) + ) + }) + + return deferred + } + + put (node, options, callback) { + if (typeof options === 'function') { + return setImmediate(() => callback(new Error('no options were passed'))) + } + let nodeAndCID - if (CID.isCID(cidOrFormat)) { + if (options.cid && CID.isCID(options.cid)) { nodeAndCID = { node: node, - cid: cidOrFormat + cid: options.cid } - callback = hashAlg - hashAlg = undefined - store.apply(this) } else { - if (typeof hashAlg === 'function') { - callback = hashAlg - hashAlg = undefined - } - - const format = cidOrFormat - hashAlg = hashAlg || 'sha2-256' + options.hashAlg = options.hashAlg || 'sha2-256' - const r = this.resolvers[format] + const r = this.resolvers[options.format] // TODO add support for different hash funcs in the utils of // each format (just really needed for CBOR for now, really // r.util.cid(node1, hashAlg, (err, cid) => { diff --git a/test/ipld-all.js b/test/ipld-all.js index 3a5e59b..56d7985 100644 --- a/test/ipld-all.js +++ b/test/ipld-all.js @@ -61,7 +61,7 @@ describe('IPLD Resolver for dag-cbor + dag-pb', () => { { node: nodePb, cid: cidPb }, { node: nodeCbor, cid: cidCbor } ]), - pull.asyncMap((nac, cb) => resolver.put(nac.node, nac.cid, cb)), + pull.asyncMap((nac, cb) => resolver.put(nac.node, { cid: nac.cid }, cb)), pull.onEnd(done) ) } diff --git a/test/ipld-dag-cbor.js b/test/ipld-dag-cbor.js index 3302a20..ea4cbde 100644 --- a/test/ipld-dag-cbor.js +++ b/test/ipld-dag-cbor.js @@ -69,7 +69,7 @@ module.exports = (repo) => { { node: node2, cid: cid2 }, { node: node3, cid: cid3 } ]), - pull.asyncMap((nac, cb) => resolver.put(nac.node, nac.cid, cb)), + pull.asyncMap((nac, cb) => resolver.put(nac.node, { cid: nac.cid }, cb)), pull.onEnd(done) ) } @@ -88,7 +88,7 @@ module.exports = (repo) => { }) it('resolver._get', (done) => { - resolver.put(node1, cid1, (err) => { + resolver.put(node1, { cid: cid1 }, (err) => { expect(err).to.not.exist resolver._get(cid1, (err, node) => { expect(err).to.not.exist @@ -99,7 +99,7 @@ module.exports = (repo) => { }) it('resolver._getStream', (done) => { - resolver.put(node1, cid1, (err) => { + resolver.put(node1, { cid: cid1 }, (err) => { expect(err).to.not.exist pull( resolver._getStream(cid1), @@ -115,11 +115,14 @@ module.exports = (repo) => { describe('public api', () => { it('resolver.put with CID', (done) => { - resolver.put(node1, cid1, done) + resolver.put(node1, { cid: cid1 }, done) }) it('resolver.put with hashAlg + format', (done) => { - resolver.put(node1, 'dag-cbor', 'sha2-256', done) + resolver.put(node1, { + format: 'dag-cbor', + hashAlg: 'sha2-256' + }, done) }) it('resolver.get just CID', (done) => { @@ -237,7 +240,7 @@ module.exports = (repo) => { }) it('resolver.remove', (done) => { - resolver.put(node1, cid1, (err) => { + resolver.put(node1, { cid: cid1 }, (err) => { expect(err).to.not.exist resolver.get(cid1, (err, result) => { expect(err).to.not.exist diff --git a/test/ipld-dag-pb.js b/test/ipld-dag-pb.js index a27b290..4cf7198 100644 --- a/test/ipld-dag-pb.js +++ b/test/ipld-dag-pb.js @@ -114,7 +114,7 @@ module.exports = (repo) => { { node: node2, cid: cid2 }, { node: node3, cid: cid3 } ]), - pull.asyncMap((nac, cb) => resolver.put(nac.node, nac.cid, cb)), + pull.asyncMap((nac, cb) => resolver.put(nac.node, { cid: nac.cid }, cb)), pull.onEnd(done) ) } @@ -133,7 +133,7 @@ module.exports = (repo) => { }) it('resolver._getStream', (done) => { - resolver.put(node1, cid1, (err) => { + resolver.put(node1, { cid: cid1 }, (err) => { expect(err).to.not.exist pull( resolver._getStream(cid1), @@ -146,7 +146,7 @@ module.exports = (repo) => { }) it('resolver._get', (done) => { - resolver.put(node1, cid1, (err) => { + resolver.put(node1, { cid: cid1 }, (err) => { expect(err).to.not.exist pull( resolver._getStream(cid1), @@ -161,20 +161,33 @@ module.exports = (repo) => { describe('public api', () => { it('resolver.put with CID', (done) => { - resolver.put(node1, cid1, done) + resolver.put(node1, { cid: cid1 }, done) }) it('resolver.put with hashAlg + format', (done) => { - resolver.put(node1, 'dag-pb', 'sha2-256', done) + resolver.put(node1, { + format: 'dag-pb', + hashAlg: 'sha2-256' + }, done) }) it('resolver.get just CID', (done) => { - resolver.put(node1, cid1, (err) => { + resolver.put(node1, { cid: cid1 }, (err) => { expect(err).to.not.exist resolver.get(cid1, (done)) }) }) + it('resolver.getStream', (done) => { + resolver.put(node1, { cid: cid1 }, (err) => { + expect(err).to.not.exist + pull( + resolver.getStream(cid1), + pull.collect(done) + ) + }) + }) + it('resolver.get root path', (done) => { resolver.get(cid1, '/', (err, result) => { expect(err).to.not.exist @@ -223,7 +236,7 @@ module.exports = (repo) => { }) it('resolver.remove', (done) => { - resolver.put(node1, cid1, (err) => { + resolver.put(node1, { cid: cid1 }, (err) => { expect(err).to.not.exist resolver.get(cid1, (err, node) => { expect(err).to.not.exist diff --git a/test/ipld-eth-block.js b/test/ipld-eth-block.js index a8e5a61..dbdaad0 100644 --- a/test/ipld-eth-block.js +++ b/test/ipld-eth-block.js @@ -70,7 +70,7 @@ module.exports = (repo) => { { node: node2, cid: cid2 }, { node: node3, cid: cid3 } ]), - pull.asyncMap((nac, cb) => resolver.put(nac.node, nac.cid, cb)), + pull.asyncMap((nac, cb) => resolver.put(nac.node, { cid: nac.cid }, cb)), pull.onEnd(done) ) } @@ -89,7 +89,7 @@ module.exports = (repo) => { }) it('resolver._get', (done) => { - resolver.put(node1, cid1, (err) => { + resolver.put(node1, { cid: cid1 }, (err) => { expect(err).to.not.exist resolver.get(cid1, (err, result) => { expect(err).to.not.exist @@ -102,7 +102,7 @@ module.exports = (repo) => { }) it('resolver._getStream', (done) => { - resolver.put(node1, cid1, (err) => { + resolver.put(node1, { cid: cid1 }, (err) => { expect(err).to.not.exist pull( resolver._getStream(cid1), @@ -120,7 +120,7 @@ module.exports = (repo) => { describe('public api', () => { it('resolver.put', (done) => { - resolver.put(node1, cid1, done) + resolver.put(node1, { cid: cid1 }, done) }) it('root path (same as get)', (done) => { @@ -160,7 +160,7 @@ module.exports = (repo) => { }) it('resolver.remove', (done) => { - resolver.put(node1, cid1, (err) => { + resolver.put(node1, { cid: cid1 }, (err) => { expect(err).to.not.exist resolver.get(cid1, (err, result) => { expect(err).to.not.exist