Skip to content

Commit c07ca62

Browse files
daviddiasjacobheun
authored andcommitted
feat: (BREAKING CHANGE) overhaul libp2p config and constructor
1 parent b80e892 commit c07ca62

27 files changed

+671
-467
lines changed

.aegir.js

+18-11
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@ const PeerId = require('peer-id')
55
const pull = require('pull-stream')
66
const parallel = require('async/parallel')
77

8-
const rawPeer = require('./test/fixtures/test-peer.json')
9-
const Node = require('./test/utils/bundle.node.js')
10-
const sigServer = require('libp2p-webrtc-star/src/sig-server')
118
const WebSocketStarRendezvous = require('libp2p-websocket-star-rendezvous')
9+
const sigServer = require('libp2p-webrtc-star/src/sig-server')
10+
11+
const rawPeer = require('./test/fixtures/test-peer.json')
12+
const Node = require('./test/utils/bundle-nodejs.js')
1213

1314
let wrtcRendezvous
1415
let wsRendezvous
@@ -21,7 +22,9 @@ const before = (done) => {
2122
port: 15555
2223
// cryptoChallenge: true TODO: needs https://github.com/libp2p/js-libp2p-webrtc-star/issues/128
2324
}, (err, server) => {
24-
if (err) { return cb(err) }
25+
if (err) {
26+
return cb(err)
27+
}
2528
wrtcRendezvous = server
2629
cb()
2730
})
@@ -33,7 +36,9 @@ const before = (done) => {
3336
strictMultiaddr: false,
3437
cryptoChallenge: true
3538
}, (err, _server) => {
36-
if (err) { return cb(err) }
39+
if (err) {
40+
return cb(err)
41+
}
3742
wsRendezvous = _server
3843
cb()
3944
})
@@ -47,7 +52,9 @@ const before = (done) => {
4752

4853
peer.multiaddrs.add('/ip4/127.0.0.1/tcp/9200/ws')
4954

50-
node = new Node(peer)
55+
node = new Node({
56+
peerInfo: peer
57+
})
5158
node.handle('/echo/1.0.0', (protocol, conn) => pull(conn, conn))
5259
node.start(cb)
5360
})
@@ -56,11 +63,11 @@ const before = (done) => {
5663
}
5764

5865
const after = (done) => {
59-
setTimeout(() => parallel(
60-
[node, wrtcRendezvous, wsRendezvous].map((s) => {
61-
return (cb) => s.stop(cb)
62-
})
63-
, done), 2000)
66+
setTimeout(() =>
67+
parallel(
68+
[node, wrtcRendezvous, wsRendezvous].map((s) => (cb) => s.stop(cb)),
69+
done),
70+
2000)
6471
}
6572

6673
module.exports = {

README.md

+61-23
Original file line numberDiff line numberDiff line change
@@ -103,47 +103,85 @@ libp2p becomes very simple and basically acts as a glue for every module that co
103103
```JavaScript
104104
// Creating a bundle that adds:
105105
// transport: websockets + tcp
106-
// stream-muxing: SPDY
106+
// stream-muxing: spdy & mplex
107107
// crypto-channel: secio
108108
// discovery: multicast-dns
109109

110110
const libp2p = require('libp2p')
111111
const TCP = require('libp2p-tcp')
112112
const WS = require('libp2p-websockets')
113-
const spdy = require('libp2p-spdy')
114-
const secio = require('libp2p-secio')
113+
const SPDY = require('libp2p-spdy')
114+
const MPLEX = require('libp2p-mplex')
115+
const SECIO = require('libp2p-secio')
115116
const MulticastDNS = require('libp2p-mdns')
116117
const DHT = require('libp2p-kad-dht')
118+
const defaultsDeep = require('lodash.defaultsdeep')
117119

118120
class Node extends libp2p {
119-
constructor (peerInfo, peerBook, options) {
120-
options = options || {}
121-
122-
const modules = {
123-
transport: [
124-
new TCP(),
125-
new WS()
126-
],
127-
connection: {
128-
muxer: [
129-
spdy
121+
constructor (_peerInfo, _peerBook, _options) {
122+
const defaults = {
123+
peerInfo: _peerInfo // The Identity of your Peer
124+
peerBook: _peerBook, // Where peers get tracked, if undefined libp2p will create one instance
125+
126+
// The libp2p modules for this libp2p bundle
127+
modules: {
128+
transport: [
129+
TCP,
130+
new WS() // It can take instances too!
130131
],
131-
crypto: [
132-
secio
132+
streamMuxer: [
133+
SPDY,
134+
MPLEX
135+
],
136+
connEncryption: [
137+
SECIO
133138
]
139+
peerDiscovery: [
140+
MulticastDNS
141+
],
142+
peerRouting: {}, // Currently both peerRouting and contentRouting are patched through the DHT,
143+
contentRouting: {} // this will change once we factor that into two modules, for now do the following line:
144+
dht: DHT // DHT enables PeerRouting, ContentRouting and DHT itself components
145+
},
146+
147+
// libp2p config options (typically found on a config.json)
148+
config: { // The config object is the part of the config that can go into a file, config.json.
149+
peerDiscovery: {
150+
mdns: { // mdns options
151+
interval: 1000 // ms
152+
enabled: true
153+
},
154+
webrtcStar: { // webrtc-star options
155+
interval: 1000 // ms
156+
enabled: false
157+
}
158+
// .. other discovery module options.
159+
},
160+
peerRouting: {},
161+
contentRouting: {},
162+
relay: { // Circuit Relay options
163+
enabled: false,
164+
hop: {
165+
enabled: false,
166+
active: false
167+
}
168+
}
169+
// Enable/Disable Experimental features
170+
EXPERIMENTAL: { // Experimental features ("behind a flag")
171+
pubsub: false,
172+
dht: false
173+
}
134174
},
135-
discovery: [
136-
new MulticastDNS(peerInfo)
137-
],
138-
// DHT is passed as its own enabling PeerRouting, ContentRouting and DHT itself components
139-
dht: DHT
140175
}
141176

142-
super(modules, peerInfo, peerBook, options)
177+
// overload any defaults of your bundle using https://lodash.com/docs/4.17.5#defaultsDeep
178+
defaultsDeep(_options, defaults)
179+
180+
super(options)
143181
}
144182
}
145183

146-
// Now all the nodes you create, will have TCP, WebSockets, SPDY, SECIO and MulticastDNS support.
184+
// Now all the nodes you create, will have TCP, WebSockets, SPDY, MPLEX, SECIO and MulticastDNS support.
147185
```
148186

149187
### API

examples/transports/1.js

+12-5
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,20 @@ const libp2p = require('libp2p')
44
const TCP = require('libp2p-tcp')
55
const PeerInfo = require('peer-info')
66
const waterfall = require('async/waterfall')
7+
const defaultsDeep = require('lodash.defaultsdeep')
78

89
class MyBundle extends libp2p {
9-
constructor (peerInfo) {
10-
const modules = {
11-
transport: [new TCP()]
10+
constructor (_options) {
11+
const defaults = {
12+
modules: {
13+
transport: [
14+
TCP
15+
]
16+
}
1217
}
13-
super(modules, peerInfo)
18+
19+
defaultsDeep(_options, defaults)
20+
super(_options)
1421
}
1522
}
1623

@@ -20,7 +27,7 @@ waterfall([
2027
(cb) => PeerInfo.create(cb),
2128
(peerInfo, cb) => {
2229
peerInfo.multiaddrs.add('/ip4/0.0.0.0/tcp/0')
23-
node = new MyBundle(peerInfo)
30+
node = new MyBundle({ peerInfo: peerInfo })
2431
node.start(cb)
2532
}
2633
], (err) => {

examples/transports/2.js

+12-5
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,22 @@ const libp2p = require('libp2p')
44
const TCP = require('libp2p-tcp')
55
const PeerInfo = require('peer-info')
66
const waterfall = require('async/waterfall')
7+
const defaultsDeep = require('lodash.defaultsdeep')
78
const parallel = require('async/parallel')
89
const pull = require('pull-stream')
910

1011
class MyBundle extends libp2p {
11-
constructor (peerInfo) {
12-
const modules = {
13-
transport: [new TCP()]
12+
constructor (_options) {
13+
const defaults = {
14+
modules: {
15+
transport: [
16+
TCP
17+
]
18+
}
1419
}
15-
super(modules, peerInfo)
20+
21+
defaultsDeep(_options, defaults)
22+
super(_options)
1623
}
1724
}
1825

@@ -23,7 +30,7 @@ function createNode (callback) {
2330
(cb) => PeerInfo.create(cb),
2431
(peerInfo, cb) => {
2532
peerInfo.multiaddrs.add('/ip4/0.0.0.0/tcp/0')
26-
node = new MyBundle(peerInfo)
33+
node = new MyBundle({ peerInfo: peerInfo })
2734
node.start(cb)
2835
}
2936
], (err) => callback(err, node))

examples/transports/3.js

+13-5
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,23 @@ const TCP = require('libp2p-tcp')
55
const WebSockets = require('libp2p-websockets')
66
const PeerInfo = require('peer-info')
77
const waterfall = require('async/waterfall')
8+
const defaultsDeep = require('lodash.defaultsdeep')
89
const parallel = require('async/parallel')
910
const pull = require('pull-stream')
1011

1112
class MyBundle extends libp2p {
12-
constructor (peerInfo) {
13-
const modules = {
14-
transport: [new TCP(), new WebSockets()]
13+
constructor (_options) {
14+
const defaults = {
15+
modules: {
16+
transport: [
17+
TCP,
18+
WebSockets
19+
]
20+
}
1521
}
16-
super(modules, peerInfo)
22+
23+
defaultsDeep(_options, defaults)
24+
super(_options)
1725
}
1826
}
1927

@@ -28,7 +36,7 @@ function createNode (addrs, callback) {
2836
(cb) => PeerInfo.create(cb),
2937
(peerInfo, cb) => {
3038
addrs.forEach((addr) => peerInfo.multiaddrs.add(addr))
31-
node = new MyBundle(peerInfo)
39+
node = new MyBundle({ peerInfo: peerInfo })
3240
node.start(cb)
3341
}
3442
], (err) => callback(err, node))

examples/transports/README.md

+27-13
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,23 @@ const libp2p = require('libp2p')
2727
const TCP = require('libp2p-tcp')
2828
const PeerInfo = require('peer-info')
2929
const waterfall = require('async/waterfall')
30+
const defaultsDeep = require('lodash.defaultsdeep')
3031

3132
// This MyBundle class is your libp2p bundle packed with TCP
3233
class MyBundle extends libp2p {
33-
constructor (peerInfo) {
34-
// modules is a JS object that will describe the components
35-
// we want for our libp2p bundle
36-
const modules = {
37-
transport: [new TCP()]
34+
constructor (_options) {
35+
const defaults = {
36+
// modules is a JS object that will describe the components
37+
// we want for our libp2p bundle
38+
modules: {
39+
transport: [
40+
TCP
41+
]
42+
}
3843
}
39-
super(modules, peerInfo)
44+
45+
defaultsDeep(_options, defaults)
46+
super(_options)
4047
}
4148
}
4249
```
@@ -57,7 +64,7 @@ waterfall([
5764
// the multiaddr format, a self describable address
5865
peerInfo.multiaddrs.add('/ip4/0.0.0.0/tcp/0')
5966
// Now we can create a node with that PeerInfo object
60-
node = new MyBundle(peerInfo)
67+
node = new MyBundle({ peerInfo: peerInfo })
6168
// Last, we start the node!
6269
node.start(cb)
6370
}
@@ -114,7 +121,7 @@ function createNode (callback) {
114121
(cb) => PeerInfo.create(cb),
115122
(peerInfo, cb) => {
116123
peerInfo.multiaddrs.add('/ip4/0.0.0.0/tcp/0')
117-
node = new MyBundle(peerInfo)
124+
node = new MyBundle({ peerInfo: peerInfo })
118125
node.start(cb)
119126
}
120127
], (err) => callback(err, node))
@@ -196,11 +203,18 @@ const WebSockets = require('libp2p-websockets')
196203
// ...
197204

198205
class MyBundle extends libp2p {
199-
constructor (peerInfo) {
200-
const modules = {
201-
transport: [new TCP(), new WebSockets()]
206+
constructor (_options) {
207+
const defaults = {
208+
modules: {
209+
transport: [
210+
TCP,
211+
WebSockets
212+
]
213+
}
202214
}
203-
super(modules, peerInfo)
215+
216+
defaultsDeep(_options, defaults)
217+
super(_options)
204218
}
205219
}
206220
```
@@ -219,7 +233,7 @@ function createNode (addrs, callback) {
219233
(cb) => PeerInfo.create(cb),
220234
(peerInfo, cb) => {
221235
addrs.forEach((addr) => peerInfo.multiaddrs.add(addr))
222-
node = new MyBundle(peerInfo)
236+
node = new MyBundle({ peerInfo: peerInfo })
223237
node.start(cb)
224238
}
225239
], (err) => callback(err, node))

package.json

+6-5
Original file line numberDiff line numberDiff line change
@@ -50,22 +50,23 @@
5050
"peer-info": "~0.14.1"
5151
},
5252
"devDependencies": {
53-
"aegir": "^13.1.0",
53+
"aegir": "^14.0.0",
5454
"chai": "^4.1.2",
5555
"cids": "~0.5.3",
5656
"dirty-chai": "^2.0.1",
5757
"electron-webrtc": "~0.3.0",
5858
"libp2p-circuit": "~0.2.0",
5959
"libp2p-kad-dht": "~0.10.0",
60-
"libp2p-mdns": "~0.11.0",
60+
"libp2p-mdns": "~0.12.0",
6161
"libp2p-mplex": "~0.7.0",
62-
"libp2p-railing": "~0.8.1",
62+
"libp2p-railing": "~0.9.1",
6363
"libp2p-secio": "~0.10.0",
6464
"libp2p-spdy": "~0.12.1",
6565
"libp2p-tcp": "~0.12.0",
66-
"libp2p-webrtc-star": "~0.15.0",
67-
"libp2p-websocket-star": "~0.8.0",
66+
"libp2p-webrtc-star": "~0.15.3",
67+
"libp2p-websocket-star": "~0.8.1",
6868
"libp2p-websocket-star-rendezvous": "~0.2.3",
69+
"lodash.defaultsdeep": "^4.6.0",
6970
"lodash.times": "^4.3.2",
7071
"pull-goodbye": "0.0.2",
7172
"pull-serializer": "~0.3.2",

0 commit comments

Comments
 (0)