Skip to content
This repository has been archived by the owner on Aug 11, 2021. It is now read-only.

Commit

Permalink
feat: improve put API and expose getStream (#77)
Browse files Browse the repository at this point in the history
* feat: clean up put API

* feat: add getStream api call
  • Loading branch information
daviddias committed Feb 8, 2017
1 parent 3aa67b3 commit 0d67f58
Show file tree
Hide file tree
Showing 6 changed files with 71 additions and 36 deletions.
12 changes: 9 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
- [Usage](#usage)
- [API](#api)
- [IPLD Resolver](#ipldresolver)
- [`.put(node, <<cid> || <format>, <hashAlg>>, 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)`]()
Expand All @@ -48,11 +48,13 @@ const Resolver = new Resolver(blockService)

## API

### `.put(node, <<cid> || <format>, <hashAlg>>, 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)`

Expand All @@ -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`
Expand Down
41 changes: 27 additions & 14 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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')
Expand Down Expand Up @@ -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) => {
Expand Down
2 changes: 1 addition & 1 deletion test/ipld-all.js
Original file line number Diff line number Diff line change
Expand Up @@ -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)
)
}
Expand Down
15 changes: 9 additions & 6 deletions test/ipld-dag-cbor.js
Original file line number Diff line number Diff line change
Expand Up @@ -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)
)
}
Expand All @@ -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
Expand All @@ -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),
Expand All @@ -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) => {
Expand Down Expand Up @@ -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
Expand Down
27 changes: 20 additions & 7 deletions test/ipld-dag-pb.js
Original file line number Diff line number Diff line change
Expand Up @@ -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)
)
}
Expand All @@ -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),
Expand All @@ -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),
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down
10 changes: 5 additions & 5 deletions test/ipld-eth-block.js
Original file line number Diff line number Diff line change
Expand Up @@ -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)
)
}
Expand All @@ -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
Expand All @@ -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),
Expand All @@ -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) => {
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 0d67f58

Please sign in to comment.