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

Commit a195be6

Browse files
authored
Merge pull request #489 from ipfs/feat/swarm-interface
feat(http): make swarm interface-ipfs-core compliant
2 parents 0e99029 + 6effa19 commit a195be6

File tree

9 files changed

+130
-59
lines changed

9 files changed

+130
-59
lines changed

package.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
"gulp": "^3.9.1",
5050
"idb-plus-blob-store": "^1.1.2",
5151
"idb-pull-blob-store": "^0.4.0",
52-
"interface-ipfs-core": "^0.14.6",
52+
"interface-ipfs-core": "^0.15.0",
5353
"left-pad": "^1.1.1",
5454
"lodash": "^4.15.0",
5555
"ncp": "^2.0.0",
@@ -68,7 +68,7 @@
6868
"detect-node": "^2.0.3",
6969
"glob": "^7.0.6",
7070
"hapi": "^15.0.3",
71-
"ipfs-api": "^8.0.4",
71+
"ipfs-api": "^9.0.0",
7272
"ipfs-bitswap": "^0.7.0",
7373
"ipfs-block": "^0.3.0",
7474
"ipfs-block-service": "^0.5.0",
@@ -81,10 +81,12 @@
8181
"joi": "^9.0.4",
8282
"libp2p-ipfs": "^0.14.1",
8383
"libp2p-ipfs-browser": "^0.15.1",
84+
"lodash.flatmap": "^4.5.0",
8485
"lodash.get": "^4.4.2",
8586
"lodash.has": "^4.5.2",
8687
"lodash.set": "^4.3.2",
8788
"lodash.sortby": "^4.7.0",
89+
"lodash.values": "^4.3.0",
8890
"mafmt": "^2.1.2",
8991
"map-limit": "0.0.1",
9092
"multiaddr": "^2.0.3",

src/cli/commands/swarm/addrs.js

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,21 @@ module.exports = {
2020
if (err) {
2121
throw err
2222
}
23-
// TODO
23+
24+
ipfs.swarm.addrs((err, res) => {
25+
if (err) {
26+
throw err
27+
}
28+
29+
res.forEach((peer) => {
30+
const count = peer.multiaddrs.length
31+
console.log(`${peer.id.toB58String()} (${count})`)
32+
peer.multiaddrs.forEach((addr) => {
33+
const res = addr.decapsulate('ipfs').toString()
34+
console.log(`\t${res}`)
35+
})
36+
})
37+
})
2438
})
2539
}
2640
}

src/cli/commands/swarm/addrs/local.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ module.exports = {
2727
throw err
2828
}
2929

30-
res.Strings.forEach((addr) => {
31-
console.log(addr)
30+
res.forEach((addr) => {
31+
console.log(addr.toString())
3232
})
3333
})
3434
})

src/cli/commands/swarm/peers.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ module.exports = {
2727
throw err
2828
}
2929

30-
res.Strings.forEach((addr) => {
31-
console.log(addr)
30+
res.forEach((addr) => {
31+
console.log(addr.toString())
3232
})
3333
})
3434
})

src/core/components/swarm.js

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
const multiaddr = require('multiaddr')
44
const promisify = require('promisify-es6')
5+
const flatMap = require('lodash.flatmap')
6+
const values = require('lodash.values')
57

68
const OFFLINE_ERROR = require('../utils').OFFLINE_ERROR
79

@@ -13,43 +15,31 @@ module.exports = function swarm (self) {
1315
}
1416

1517
const peers = self._libp2pNode.peerBook.getAll()
16-
const mas = []
17-
Object
18-
.keys(peers)
19-
.forEach((b58Id) => {
20-
peers[b58Id].multiaddrs.forEach((ma) => {
21-
// TODO this should only print the addr we are using
22-
mas.push(ma)
23-
})
24-
})
18+
const mas = flatMap(Object.keys(peers), (id) => {
19+
return peers[id].multiaddrs
20+
})
2521

2622
callback(null, mas)
2723
}),
24+
2825
// all the addrs we know
2926
addrs: promisify((callback) => {
3027
if (!self.isOnline()) {
3128
return callback(OFFLINE_ERROR)
3229
}
33-
const peers = self._libp2pNode.peerBook.getAll()
34-
const mas = []
35-
Object
36-
.keys(peers)
37-
.forEach((b58Id) => {
38-
peers[b58Id].multiaddrs.forEach((ma) => {
39-
// TODO this should only print the addr we are using
40-
mas.push(ma)
41-
})
42-
})
4330

44-
callback(null, mas)
31+
const peers = values(self._libp2pNode.peerBook.getAll())
32+
callback(null, peers)
4533
}),
34+
4635
localAddrs: promisify((callback) => {
4736
if (!self.isOnline()) {
4837
return callback(OFFLINE_ERROR)
4938
}
5039

5140
callback(null, self._libp2pNode.peerInfo.multiaddrs)
5241
}),
42+
5343
connect: promisify((maddr, callback) => {
5444
if (!self.isOnline()) {
5545
return callback(OFFLINE_ERROR)
@@ -61,6 +51,7 @@ module.exports = function swarm (self) {
6151

6252
self._libp2pNode.dialByMultiaddr(maddr, callback)
6353
}),
54+
6455
disconnect: promisify((maddr, callback) => {
6556
if (!self.isOnline()) {
6657
return callback(OFFLINE_ERROR)
@@ -72,6 +63,7 @@ module.exports = function swarm (self) {
7263

7364
self._libp2pNode.hangUpByMultiaddr(maddr, callback)
7465
}),
66+
7567
filters: promisify((callback) => {
7668
// TODO
7769
throw new Error('Not implemented')

src/http-api/resources/swarm.js

Lines changed: 56 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,28 @@ exports.parseAddrs = (request, reply) => {
2525
}
2626

2727
exports.peers = {
28-
// main route handler which is called after the above `parseArgs`, but only if the args were valid
2928
handler: (request, reply) => {
30-
request.server.app.ipfs.swarm.peers((err, peers) => {
29+
const ipfs = request.server.app.ipfs
30+
ipfs.swarm.peers((err, peers) => {
31+
if (err) {
32+
log.error(err)
33+
return reply({
34+
Message: err.toString(),
35+
Code: 0
36+
}).code(500)
37+
}
38+
39+
return reply({
40+
Strings: peers.map((addr) => addr.toString())
41+
})
42+
})
43+
}
44+
}
45+
46+
exports.addrs = {
47+
handler: (request, reply) => {
48+
const ipfs = request.server.app.ipfs
49+
ipfs.swarm.addrs((err, peers) => {
3150
if (err) {
3251
log.error(err)
3352
return reply({
@@ -36,19 +55,22 @@ exports.peers = {
3655
}).code(500)
3756
}
3857

58+
const addrs = {}
59+
peers.forEach((peer) => {
60+
addrs[peer.id.toB58String()] = peer.multiaddrs.map((addr) => addr.toString())
61+
})
62+
3963
return reply({
40-
Strings: Object.keys(peers)
41-
.map((key) =>
42-
`${peers[key].multiaddrs[0].toString()}/ipfs/${peers[key].id.toB58String()}`)
64+
Addrs: addrs
4365
})
4466
})
4567
}
4668
}
4769

4870
exports.localAddrs = {
49-
// main route handler which is called after the above `parseArgs`, but only if the args were valid
5071
handler: (request, reply) => {
51-
request.server.app.ipfs.swarm.localAddrs((err, addrs) => {
72+
const ipfs = request.server.app.ipfs
73+
ipfs.swarm.localAddrs((err, addrs) => {
5274
if (err) {
5375
log.error(err)
5476
return reply({
@@ -71,8 +93,9 @@ exports.connect = {
7193
// main route handler which is called after the above `parseArgs`, but only if the args were valid
7294
handler: (request, reply) => {
7395
const addr = request.pre.args.addr
96+
const ipfs = request.server.app.ipfs
7497

75-
request.server.app.ipfs.swarm.connect(addr, (err) => {
98+
ipfs.swarm.connect(addr, (err) => {
7699
if (err) {
77100
log.error(err)
78101
return reply({
@@ -87,3 +110,28 @@ exports.connect = {
87110
})
88111
}
89112
}
113+
114+
exports.disconnect = {
115+
// uses common parseAddr method that returns a `addr`
116+
parseArgs: exports.parseAddrs,
117+
118+
// main route handler which is called after the above `parseArgs`, but only if the args were valid
119+
handler: (request, reply) => {
120+
const addr = request.pre.args.addr
121+
const ipfs = request.server.app.ipfs
122+
123+
ipfs.swarm.disconnect(addr, (err) => {
124+
if (err) {
125+
log.error(err)
126+
return reply({
127+
Message: err.toString(),
128+
Code: 0
129+
}).code(500)
130+
}
131+
132+
return reply({
133+
Strings: [`disconnect ${addr} success`]
134+
})
135+
})
136+
}
137+
}

src/http-api/routes/swarm.js

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,13 @@ module.exports = (server) => {
1313
}
1414
})
1515

16-
// api.route({
17-
// method: '*',
18-
// path: '/api/v0/swarm/addrs',
19-
// config: {
20-
// handler: resources.swarm.addrs.handler
21-
// }
22-
// })
16+
api.route({
17+
method: '*',
18+
path: '/api/v0/swarm/addrs',
19+
config: {
20+
handler: resources.swarm.addrs.handler
21+
}
22+
})
2323

2424
api.route({
2525
method: '*',
@@ -40,13 +40,16 @@ module.exports = (server) => {
4040
}
4141
})
4242

43-
// api.route({
44-
// method: '*',
45-
// path: '/api/v0/swarm/disconnect',
46-
// config: {
47-
// handler: resources.swarm.disconnect
48-
// }
49-
// })
43+
api.route({
44+
method: '*',
45+
path: '/api/v0/swarm/disconnect',
46+
config: {
47+
pre: [
48+
{ method: resources.swarm.disconnect.parseArgs, assign: 'args' }
49+
],
50+
handler: resources.swarm.disconnect.handler
51+
}
52+
})
5053

5154
// TODO
5255
// api.route({

test/cli/test-swarm.js

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ describe('swarm', function () {
2626
expect(err).to.not.exist
2727
ipfs.id((err, identity) => {
2828
expect(err).to.not.exist
29-
ipfsAddr = `${identity.addresses[0]}/ipfs/${identity.id}`
29+
ipfsAddr = identity.addresses[0]
30+
console.log('addr', ipfsAddr)
3031
done()
3132
})
3233
})
@@ -51,18 +52,32 @@ describe('swarm', function () {
5152
})
5253
})
5354

54-
// TODO revisit these once interface-ipfs-core over http-api are done
55-
it.skip('connect', (done) => {
55+
it('connect', (done) => {
5656
nexpect.spawn('node', [process.cwd() + '/src/cli/bin.js', 'swarm', 'connect', ipfsAddr], {env})
5757
.run((err, stdout, exitcode) => {
5858
expect(err).to.not.exist
5959
expect(exitcode).to.equal(0)
60+
expect(stdout).to.be.eql([
61+
`connect ${ipfsAddr} success`
62+
])
6063
done()
6164
})
6265
})
6366

64-
it.skip('peers', (done) => {
67+
it('peers', (done) => {
6568
nexpect.spawn('node', [process.cwd() + '/src/cli/bin.js', 'swarm', 'peers'], {env})
69+
.run((err, stdout, exitcode) => {
70+
expect(err).to.not.exist
71+
expect(exitcode).to.equal(0)
72+
expect(stdout).to.be.eql([
73+
ipfsAddr
74+
])
75+
done()
76+
})
77+
})
78+
79+
it('addrs', (done) => {
80+
nexpect.spawn('node', [process.cwd() + '/src/cli/bin.js', 'swarm', 'addrs'], {env})
6681
.run((err, stdout, exitcode) => {
6782
expect(err).to.not.exist
6883
expect(exitcode).to.equal(0)
@@ -71,7 +86,7 @@ describe('swarm', function () {
7186
})
7287
})
7388

74-
it.skip('addrs local', (done) => {
89+
it('addrs local', (done) => {
7590
nexpect.spawn('node', [process.cwd() + '/src/cli/bin.js', 'swarm', 'addrs', 'local'], {env})
7691
.run((err, stdout, exitcode) => {
7792
expect(err).to.not.exist

test/http-api/interface-ipfs-core-over-ipfs-api/test-swarm.js

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
'use strict'
44

5-
/*
65
const test = require('interface-ipfs-core')
76
const FactoryClient = require('./../../utils/factory-http')
87

@@ -17,7 +16,5 @@ const common = {
1716
fc.dismantle(callback)
1817
}
1918
}
20-
*/
21-
// TODO
22-
// Needs: https://github.com/ipfs/js-libp2p-ipfs/pull/16
23-
// test.swarm(common)
19+
20+
test.swarm(common)

0 commit comments

Comments
 (0)