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

feat: improve put API and expose getStream #77

Merged
merged 2 commits into from
Feb 8, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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