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

Commit 03755d2

Browse files
committed
feat: main resolver (understands dag-pb)
1 parent 00d5d46 commit 03755d2

File tree

3 files changed

+99
-8
lines changed

3 files changed

+99
-8
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
"rimraf": "^2.5.4"
4949
},
5050
"dependencies": {
51+
"async": "^2.1.1",
5152
"babel-runtime": "^6.11.6",
5253
"interface-pull-blob-store": "^0.5.0",
5354
"ipfs-block": "^0.3.0",

src/index.js

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ const Block = require('ipfs-block')
44
const pull = require('pull-stream')
55
const traverse = require('pull-traverse')
66
const utils = require('./utils')
7+
const CID = require('cids')
8+
const until = require('async/until')
79
const IPFSRepo = require('ipfs-repo')
810
const MemoryStore = require('../node_modules/interface-pull-blob-store/lib/reference.js')
911
const BlockService = require('ipfs-block-service')
@@ -38,8 +40,46 @@ class IPLDResolver {
3840
}
3941
}
4042

41-
resolve (cid, path) {
42-
// TODO
43+
resolve (cid, path, callback) {
44+
if (path === '/') {
45+
return this.get(cid, callback)
46+
}
47+
48+
let value
49+
50+
until(
51+
() => {
52+
if (!path || path === '' || path === '/') {
53+
return true
54+
} else {
55+
// continue traversing
56+
if (value) {
57+
cid = new CID(value['/'])
58+
}
59+
return false
60+
}
61+
},
62+
(cb) => {
63+
// get block
64+
// use local resolver
65+
// update path value
66+
this.bs.get(cid, (err, block) => {
67+
if (err) {
68+
return cb(err)
69+
}
70+
const result = this.resolvers[cid.codec].resolver.resolve(block, path)
71+
value = result.value
72+
path = result.remainderPath
73+
cb()
74+
})
75+
},
76+
(err, results) => {
77+
if (err) {
78+
return callback(err)
79+
}
80+
return callback(null, value)
81+
}
82+
)
4383
}
4484

4585
// Node operations (get and retrieve nodes, not values)

test/test-ipld-dag-pb.js

Lines changed: 56 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ const pull = require('pull-stream')
1010
const IPLDResolver = require('../src')
1111

1212
module.exports = (repo) => {
13-
const bs = new BlockService(repo)
14-
const resolver = new IPLDResolver(bs)
15-
1613
describe('IPLD Resolver with dag-pb (MerkleDAG Protobuf)', () => {
14+
const bs = new BlockService(repo)
15+
const resolver = new IPLDResolver(bs)
16+
1717
let node1
1818
let node2
1919
let node3
@@ -126,8 +126,58 @@ module.exports = (repo) => {
126126
})
127127

128128
describe('IPLD Path Resolver', () => {
129-
it.skip('resolves path of a non nested value', () => {})
130-
it.skip('resolves path of a level 1 nested value', () => {})
131-
it.skip('resolves path of a level 2 nested value', () => {})
129+
let resolver
130+
131+
let node1
132+
let node2
133+
let node3
134+
135+
before((done) => {
136+
resolver = new IPLDResolver()
137+
138+
node1 = new dagPB.DAGNode(new Buffer('I am 1'))
139+
node2 = new dagPB.DAGNode(new Buffer('I am 2'))
140+
node3 = new dagPB.DAGNode(new Buffer('I am 3'))
141+
142+
node2.addNodeLink('1', node1)
143+
144+
node3.addNodeLink('1', node1)
145+
node3.addNodeLink('2', node2)
146+
147+
pull(
148+
pull.values([
149+
node1,
150+
node2,
151+
node3
152+
]),
153+
resolver.putStream(done)
154+
)
155+
})
156+
157+
it('root path (same as get)', (done) => {
158+
resolver.resolve(node1.cid(), '/', (err, result) => {
159+
expect(err).to.not.exist
160+
expect(result.cid()).to.eql(node1.cid())
161+
done()
162+
})
163+
})
164+
165+
it('value within 1st node scope', (done) => {
166+
resolver.resolve(node1.cid(), 'data', (err, result) => {
167+
expect(err).to.not.exist
168+
expect(result).to.eql(new Buffer('I am 1'))
169+
done()
170+
})
171+
})
172+
173+
it.skip('value within nested scope (1 level)', (done) => {
174+
resolver.resolve(node2.cid(), 'links/0/data', (err, result) => {
175+
expect(err).to.not.exist
176+
expect(result.cid()).to.eql(node1.cid())
177+
done()
178+
})
179+
})
180+
181+
it.skip('value within nested scope (2 levels)', (done) => {})
132182
})
133183
}

0 commit comments

Comments
 (0)