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

Commit e1b38bf

Browse files
authored
feat: Implementing the new interfaces (#619)
1 parent e389171 commit e1b38bf

21 files changed

+522
-413
lines changed

README.md

-2
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,8 @@
88
<a href="http://ipn.io"><img src="https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square" /></a>
99
<a href="http://ipfs.io/"><img src="https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square" /></a>
1010
<a href="http://webchat.freenode.net/?channels=%23ipfs"><img src="https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square" /></a>
11-
<br>
1211
<a href="https://waffle.io/ipfs/js-ipfs"><img src="https://img.shields.io/badge/pm-waffle-blue.svg?style=flat-square" /></a>
1312
<a href="https://github.com/ipfs/interface-ipfs-core"><img src="https://img.shields.io/badge/interface--ipfs--core-API%20Docs-blue.svg"></a>
14-
<a href="https://github.com/ipfs/interface-ipfs-core/issues/55"><img src="https://img.shields.io/badge/interface--ipfs--core-Updates-blue.svg"></a>
1513
</p>
1614

1715
<p align="center">

package.json

+6-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
"release-minor": "aegir release --type minor ",
2020
"release-major": "aegir release --type major ",
2121
"coverage": "aegir coverage --timeout 100000",
22-
"coverage-publish": "aegir coverage --provider coveralls k--timeout 100000"
22+
"coverage-publish": "aegir coverage --provider coveralls --timeout 100000"
2323
},
2424
"dependencies": {
2525
"async": "^2.6.0",
@@ -45,9 +45,13 @@
4545
"peer-info": "~0.11.1",
4646
"promisify-es6": "^1.0.3",
4747
"pump": "^1.0.3",
48+
"pull": "^2.1.1",
49+
"pull-defer": "^0.2.2",
50+
"pull-pushable": "^2.1.1",
4851
"qs": "^6.5.1",
4952
"readable-stream": "^2.3.3",
5053
"stream-http": "^2.7.2",
54+
"stream-to-pull-stream": "^1.7.2",
5155
"streamifier": "^0.1.1",
5256
"tar-stream": "^1.5.5"
5357
},
@@ -65,7 +69,7 @@
6569
"dirty-chai": "^2.0.1",
6670
"eslint-plugin-react": "^7.4.0",
6771
"gulp": "^3.9.1",
68-
"interface-ipfs-core": "~0.35.0",
72+
"interface-ipfs-core": "~0.36.4",
6973
"hapi": "^16.6.2",
7074
"ipfsd-ctl": "~0.24.1",
7175
"pre-commit": "^1.2.2",

src/files/add-pull-stream.js

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
'use strict'
2+
3+
const addCmd = require('./add.js')
4+
const pull = require('pull-stream')
5+
const pushable = require('pull-pushable')
6+
7+
module.exports = (send) => {
8+
const add = addCmd(send)
9+
10+
return (options) => {
11+
options = options || {}
12+
13+
const source = pushable()
14+
const sink = pull.collect((err, tuples) => {
15+
if (err) { return source.end(err) }
16+
17+
add(tuples, options, (err, filesAdded) => {
18+
if (err) { return source.end(err) }
19+
20+
filesAdded.forEach((file) => source.push(file))
21+
source.end()
22+
})
23+
})
24+
25+
return {
26+
sink: sink,
27+
source: source
28+
}
29+
}
30+
}

src/files/add-readable-stream.js

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
'use strict'
2+
3+
const addCmd = require('./add.js')
4+
const Duplex = require('readable-stream').Duplex
5+
6+
module.exports = (send) => {
7+
const add = addCmd(send)
8+
9+
return (options) => {
10+
options = options || {}
11+
12+
const tuples = []
13+
14+
const ds = new Duplex({ objectMode: true })
15+
ds._read = (n) => {}
16+
17+
ds._write = (file, enc, next) => {
18+
tuples.push(file)
19+
next()
20+
}
21+
22+
ds.end = () => add(tuples, options, (err, res) => {
23+
if (err) { return ds.emit('error', err) }
24+
25+
res.forEach((tuple) => ds.push(tuple))
26+
ds.push(null)
27+
})
28+
29+
return ds
30+
}
31+
}

src/files/cat-pull-stream.js

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
'use strict'
2+
3+
const cleanCID = require('../utils/clean-cid')
4+
const v = require('is-ipfs')
5+
const toPull = require('stream-to-pull-stream')
6+
const deferred = require('pull-defer')
7+
8+
module.exports = (send) => {
9+
return (hash, opts) => {
10+
opts = opts || {}
11+
12+
const p = deferred.source()
13+
14+
try {
15+
hash = cleanCID(hash)
16+
} catch (err) {
17+
if (!v.ipfsPath(hash)) {
18+
return p.end(err)
19+
}
20+
}
21+
22+
send({ path: 'cat', args: hash, buffer: opts.buffer }, (err, stream) => {
23+
if (err) { return p.end(err) }
24+
25+
p.resolve(toPull(stream))
26+
})
27+
28+
return p
29+
}
30+
}

src/files/cat-readable-stream.js

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
'use strict'
2+
3+
const cleanCID = require('../utils/clean-cid')
4+
const v = require('is-ipfs')
5+
const Stream = require('readable-stream')
6+
const pump = require('pump')
7+
8+
module.exports = (send) => {
9+
return (hash, opts) => {
10+
opts = opts || {}
11+
12+
const pt = new Stream.PassThrough()
13+
14+
try {
15+
hash = cleanCID(hash)
16+
} catch (err) {
17+
if (!v.ipfsPath(hash)) {
18+
return pt.destroy(err)
19+
}
20+
}
21+
22+
send({ path: 'cat', args: hash, buffer: opts.buffer }, (err, stream) => {
23+
if (err) { return pt.destroy(err) }
24+
25+
pump(stream, pt)
26+
})
27+
28+
return pt
29+
}
30+
}

src/files/cat.js

+10-5
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
const promisify = require('promisify-es6')
44
const cleanCID = require('../utils/clean-cid')
55
const v = require('is-ipfs')
6+
const bl = require('bl')
67

78
module.exports = (send) => {
89
return promisify((hash, opts, callback) => {
@@ -19,10 +20,14 @@ module.exports = (send) => {
1920
}
2021
}
2122

22-
send({
23-
path: 'cat',
24-
args: hash,
25-
buffer: opts.buffer
26-
}, callback)
23+
send({ path: 'cat', args: hash, buffer: opts.buffer }, (err, stream) => {
24+
if (err) { return callback(err) }
25+
26+
stream.pipe(bl((err, data) => {
27+
if (err) { return callback(err) }
28+
29+
callback(null, data)
30+
}))
31+
})
2732
})
2833
}

src/files/create-add-stream.js

-35
This file was deleted.

src/files/get-pull-stream.js

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
'use strict'
2+
3+
const cleanCID = require('../utils/clean-cid')
4+
const TarStreamToObjects = require('../utils/tar-stream-to-objects')
5+
const v = require('is-ipfs')
6+
const through = require('through2')
7+
const pull = require('pull-stream')
8+
const toPull = require('stream-to-pull-stream')
9+
const deferred = require('pull-defer')
10+
11+
module.exports = (send) => {
12+
return (path, opts) => {
13+
opts = opts || {}
14+
15+
const p = deferred.source()
16+
17+
try {
18+
path = cleanCID(path)
19+
} catch (err) {
20+
if (!v.ipfsPath(path)) {
21+
return p.end(err)
22+
}
23+
}
24+
25+
const request = { path: 'get', args: path, qs: opts }
26+
27+
// Convert the response stream to TarStream objects
28+
send.andTransform(request, TarStreamToObjects, (err, stream) => {
29+
if (err) { return p.end(err) }
30+
31+
const files = []
32+
stream.pipe(through.obj((file, enc, next) => {
33+
if (file.content) {
34+
files.push({ path: file.path, content: toPull(file.content) })
35+
} else {
36+
files.push(file)
37+
}
38+
next()
39+
}, () => p.resolve(pull.values(files))))
40+
})
41+
42+
return p
43+
}
44+
}

src/files/get-readable-stream.js

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
'use strict'
2+
3+
const cleanCID = require('../utils/clean-cid')
4+
const TarStreamToObjects = require('../utils/tar-stream-to-objects')
5+
const v = require('is-ipfs')
6+
const Stream = require('readable-stream')
7+
const pump = require('pump')
8+
9+
module.exports = (send) => {
10+
return (path, opts) => {
11+
opts = opts || {}
12+
13+
const pt = new Stream.PassThrough({objectMode: true})
14+
15+
try {
16+
path = cleanCID(path)
17+
} catch (err) {
18+
if (!v.ipfsPath(path)) {
19+
return pt.destroy(err)
20+
}
21+
}
22+
23+
const request = { path: 'get', args: path, qs: opts }
24+
25+
// Convert the response stream to TarStream objects
26+
send.andTransform(request, TarStreamToObjects, (err, stream) => {
27+
if (err) { return pt.destroy(err) }
28+
29+
pump(stream, pt)
30+
})
31+
32+
return pt
33+
}
34+
}

src/files/get.js

+19-8
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
const promisify = require('promisify-es6')
44
const cleanCID = require('../utils/clean-cid')
55
const TarStreamToObjects = require('../utils/tar-stream-to-objects')
6+
const concat = require('concat-stream')
7+
const through = require('through2')
68
const v = require('is-ipfs')
79

810
module.exports = (send) => {
@@ -14,8 +16,7 @@ module.exports = (send) => {
1416

1517
// opts is the real callback --
1618
// 'callback' is being injected by promisify
17-
if (typeof opts === 'function' &&
18-
typeof callback === 'function') {
19+
if (typeof opts === 'function' && typeof callback === 'function') {
1920
callback = opts
2021
opts = {}
2122
}
@@ -28,13 +29,23 @@ module.exports = (send) => {
2829
}
2930
}
3031

31-
const request = {
32-
path: 'get',
33-
args: path,
34-
qs: opts
35-
}
32+
const request = { path: 'get', args: path, qs: opts }
3633

3734
// Convert the response stream to TarStream objects
38-
send.andTransform(request, TarStreamToObjects, callback)
35+
send.andTransform(request, TarStreamToObjects, (err, stream) => {
36+
if (err) { return callback(err) }
37+
38+
const files = []
39+
stream.pipe(through.obj((file, enc, next) => {
40+
if (file.content) {
41+
file.content.pipe(concat((content) => {
42+
files.push({ path: file.path, content: content })
43+
}))
44+
} else {
45+
files.push(file)
46+
}
47+
next()
48+
}, () => callback(null, files)))
49+
})
3950
})
4051
}

src/files/index.js

+10-3
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,21 @@ module.exports = (arg) => {
77

88
return {
99
add: require('./add')(send),
10-
createAddStream: require('./create-add-stream')(send),
11-
get: require('./get')(send),
10+
addReadableStream: require('./add-readable-stream')(send),
11+
addPullStream: require('./add-pull-stream')(send),
1212
cat: require('./cat')(send),
13+
catReadableStream: require('./cat-readable-stream')(send),
14+
catPullStream: require('./cat-pull-stream')(send),
15+
get: require('./get')(send),
16+
getReadableStream: require('./get-readable-stream')(send),
17+
getPullStream: require('./get-pull-stream')(send),
18+
19+
// Specific to MFS (for now)
1320
cp: require('./cp')(send),
14-
ls: require('./ls')(send),
1521
mkdir: require('./mkdir')(send),
1622
stat: require('./stat')(send),
1723
rm: require('./rm')(send),
24+
ls: require('./ls')(send),
1825
read: require('./read')(send),
1926
write: require('./write')(send),
2027
mv: require('./mv')(send)

0 commit comments

Comments
 (0)