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

Commit ef729bb

Browse files
feat(swarm): make interface-ipfs-core compliant
Fixes #439
1 parent d3f98fe commit ef729bb

File tree

5 files changed

+89
-37
lines changed

5 files changed

+89
-37
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@
8686
"lodash.has": "^4.5.2",
8787
"lodash.set": "^4.3.2",
8888
"lodash.sortby": "^4.7.0",
89+
"lodash.values": "^4.3.0",
8990
"mafmt": "^2.1.2",
9091
"map-limit": "0.0.1",
9192
"multiaddr": "^2.0.3",

src/core/components/swarm.js

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
const multiaddr = require('multiaddr')
44
const promisify = require('promisify-es6')
55
const flatMap = require('lodash.flatmap')
6+
const values = require('lodash.values')
67

78
const OFFLINE_ERROR = require('../utils').OFFLINE_ERROR
89

@@ -13,25 +14,32 @@ module.exports = function swarm (self) {
1314
return callback(OFFLINE_ERROR)
1415
}
1516

16-
const mas = collectAddrs(self._libp2pNode.peerBook)
17+
const peers = self._libp2pNode.peerBook.getAll()
18+
const mas = flatMap(Object.keys(peers), (id) => {
19+
return peers[id].multiaddrs
20+
})
21+
1722
callback(null, mas)
1823
}),
24+
1925
// all the addrs we know
2026
addrs: promisify((callback) => {
2127
if (!self.isOnline()) {
2228
return callback(OFFLINE_ERROR)
2329
}
2430

25-
const mas = collectAddrs(self._libp2pNode.peerBook)
26-
callback(null, mas)
31+
const peers = values(self._libp2pNode.peerBook.getAll())
32+
callback(null, peers)
2733
}),
34+
2835
localAddrs: promisify((callback) => {
2936
if (!self.isOnline()) {
3037
return callback(OFFLINE_ERROR)
3138
}
3239

3340
callback(null, self._libp2pNode.peerInfo.multiaddrs)
3441
}),
42+
3543
connect: promisify((maddr, callback) => {
3644
if (!self.isOnline()) {
3745
return callback(OFFLINE_ERROR)
@@ -43,6 +51,7 @@ module.exports = function swarm (self) {
4351

4452
self._libp2pNode.dialByMultiaddr(maddr, callback)
4553
}),
54+
4655
disconnect: promisify((maddr, callback) => {
4756
if (!self.isOnline()) {
4857
return callback(OFFLINE_ERROR)
@@ -54,16 +63,10 @@ module.exports = function swarm (self) {
5463

5564
self._libp2pNode.hangUpByMultiaddr(maddr, callback)
5665
}),
66+
5767
filters: promisify((callback) => {
5868
// TODO
5969
throw new Error('Not implemented')
6070
})
6171
}
6272
}
63-
64-
function collectAddrs (book) {
65-
const peers = book.getAll()
66-
return flatMap(Object.keys(peers), (id) => {
67-
return peers[id].multiaddrs
68-
})
69-
}

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/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)