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

Commit d3f51c8

Browse files
committed
feat: support for cbor path into file
1 parent 31597dd commit d3f51c8

File tree

3 files changed

+67
-2
lines changed

3 files changed

+67
-2
lines changed

src/exporter/resolve.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ const pull = require('pull-stream')
66
const resolvers = {
77
directory: require('./dir-flat'),
88
'hamt-sharded-directory': require('./dir-hamt-sharded'),
9-
file: require('./file')
9+
file: require('./file'),
10+
unknown: require('./unknown')
1011
}
1112

1213
module.exports = Object.assign({
@@ -15,7 +16,12 @@ module.exports = Object.assign({
1516
}, resolvers)
1617

1718
function resolve (node, hash, pathRest, ipldResolver, parentNode) {
18-
const type = typeOf(node)
19+
let type
20+
try {
21+
type = typeOf(node)
22+
} catch (err) {
23+
type = 'unknown'
24+
}
1925
const resolver = resolvers[type]
2026
if (!resolver) {
2127
return pull.error(new Error('Unkown node type ' + type))

src/exporter/unknown.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
'use strict'
2+
3+
const path = require('path')
4+
const CID = require('cids')
5+
const pull = require('pull-stream')
6+
const pullDefer = require('pull-defer')
7+
8+
// Logic to export a single (possibly chunked) unixfs file.
9+
module.exports = (node, name, pathRest, ipldResolver, resolve) => {
10+
let newNode
11+
if (pathRest.length) {
12+
const pathElem = pathRest.shift()
13+
newNode = node[pathElem]
14+
const newName = path.join(name, pathElem)
15+
if (CID.isCID(newNode)) {
16+
const d = pullDefer.source()
17+
ipldResolver.get(sanitizeCID(newNode), (err, newNode) => {
18+
if (err) {
19+
d.resolve(pull.error(err))
20+
} else {
21+
d.resolve(resolve(newNode.value, newName, pathRest, ipldResolver, node))
22+
}
23+
})
24+
return d
25+
} else if (newNode !== undefined) {
26+
return resolve(newNode, newName, pathRest, ipldResolver, node)
27+
} else {
28+
return pull.error('not found')
29+
}
30+
}
31+
}
32+
33+
function sanitizeCID (cid) {
34+
return new CID(cid.version, cid.codec, cid.multihash)
35+
}

test/test-export-subtree.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ chai.use(require('dirty-chai'))
66
const expect = chai.expect
77
const BlockService = require('ipfs-block-service')
88
const IPLDResolver = require('ipld-resolver')
9+
const CID = require('cids')
910
const loadFixture = require('aegir/fixtures')
11+
1012
const pull = require('pull-stream')
1113
const Buffer = require('safe-buffer').Buffer
1214

@@ -56,6 +58,28 @@ module.exports = (repo) => {
5658
})
5759
)
5860
})
61+
62+
it('exports starting from non-protobuf node', (done) => {
63+
const doc = { a: { file: new CID('QmWChcSFMNcFkfeJtNd8Yru1rE6PhtCRfewi1tMwjkwKjN') } }
64+
ipldResolver.put(doc, { format: 'dag-cbor' }, (err, cid) => {
65+
expect(err).to.not.exist()
66+
const nodeCID = cid.toBaseEncodedString()
67+
68+
pull(
69+
exporter(nodeCID + '/a/file/level-1/200Bytes.txt', ipldResolver),
70+
pull.collect((err, files) => {
71+
expect(err).to.not.exist()
72+
expect(files.length).to.equal(3)
73+
expect(files[0].path).to.equal('zdpuAzp9okHgbLQdmusXn8cRjr9js6nAM4JrvKDeqp2XEkFzD/a/file')
74+
expect(files[0].content).to.not.exist()
75+
expect(files[1].path).to.equal('zdpuAzp9okHgbLQdmusXn8cRjr9js6nAM4JrvKDeqp2XEkFzD/a/file/level-1')
76+
expect(files[1].content).to.not.exist()
77+
expect(files[2].path).to.equal('zdpuAzp9okHgbLQdmusXn8cRjr9js6nAM4JrvKDeqp2XEkFzD/a/file/level-1/200Bytes.txt')
78+
fileEql(files[2], smallFile, done)
79+
})
80+
)
81+
})
82+
})
5983
})
6084
}
6185

0 commit comments

Comments
 (0)