From c1af3156a6e0e2c32eba6dec08f9a0c358693c8b Mon Sep 17 00:00:00 2001 From: David Dias Date: Wed, 8 Feb 2017 08:35:26 -0800 Subject: [PATCH 1/2] feat: clean up put API --- README.md | 8 +++++--- src/index.js | 23 +++++++++-------------- test/ipld-all.js | 2 +- test/ipld-dag-cbor.js | 15 +++++++++------ test/ipld-dag-pb.js | 17 ++++++++++------- test/ipld-eth-block.js | 10 +++++----- 6 files changed, 39 insertions(+), 36 deletions(-) diff --git a/README.md b/README.md index 75ec894..910fb9a 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)` diff --git a/src/index.js b/src/index.js index 2658508..72f6206 100644 --- a/src/index.js +++ b/src/index.js @@ -135,29 +135,24 @@ module.exports = class IPLDResolver { ) } - put (node, cidOrFormat, hashAlg, callback) { + 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..2e63c55 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,15 +161,18 @@ 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)) }) @@ -223,7 +226,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 From 981fcb00a95f5a2aeaaf8073b7847e97afa15911 Mon Sep 17 00:00:00 2001 From: David Dias Date: Wed, 8 Feb 2017 09:01:47 -0800 Subject: [PATCH 2/2] feat: add getStream api call --- README.md | 4 ++++ src/index.js | 18 ++++++++++++++++++ test/ipld-dag-pb.js | 10 ++++++++++ 3 files changed, 32 insertions(+) diff --git a/README.md b/README.md index 910fb9a..b55b813 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,10 @@ Options is an object that must contain one of the following combinations: - `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 72f6206..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,6 +136,23 @@ module.exports = class IPLDResolver { ) } + 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'))) diff --git a/test/ipld-dag-pb.js b/test/ipld-dag-pb.js index 2e63c55..4cf7198 100644 --- a/test/ipld-dag-pb.js +++ b/test/ipld-dag-pb.js @@ -178,6 +178,16 @@ module.exports = (repo) => { }) }) + 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