mirror of
https://github.com/fluencelabs/js-libp2p
synced 2025-07-09 13:51:34 +00:00
Compare commits
27 Commits
Author | SHA1 | Date | |
---|---|---|---|
e6e5b872dc | |||
550af3cbde | |||
5aa9ebbbe8 | |||
7f68a13433 | |||
2b7cc55c88 | |||
40739e9639 | |||
6106915923 | |||
d9059dbad9 | |||
187d584086 | |||
7502ba86a5 | |||
cc51fa59f9 | |||
1c10842bd3 | |||
c07ffa1317 | |||
b7f67f2764 | |||
8665286764 | |||
a43d73eea7 | |||
4ad70efb00 | |||
1af5ba9093 | |||
be9eafe20f | |||
27c6587747 | |||
9521e79061 | |||
80f0b6077a | |||
ac5cacba33 | |||
e320854db7 | |||
501cc22fb4 | |||
a57f1b22d0 | |||
7baf9f47ac |
34
CHANGELOG.md
34
CHANGELOG.md
@ -1,3 +1,37 @@
|
|||||||
|
<a name="0.23.0"></a>
|
||||||
|
# [0.23.0](https://github.com/libp2p/js-libp2p/compare/v0.22.0...v0.23.0) (2018-07-27)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* start and stop connection manager with libp2p ([6106915](https://github.com/libp2p/js-libp2p/commit/6106915))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* add check for protector and enforced pnet ([2b7cc55](https://github.com/libp2p/js-libp2p/commit/2b7cc55))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a name="0.22.0"></a>
|
||||||
|
# [0.22.0](https://github.com/libp2p/js-libp2p/compare/v0.21.0...v0.22.0) (2018-06-29)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* add null property guards ([80f0b60](https://github.com/libp2p/js-libp2p/commit/80f0b60))
|
||||||
|
* do not mutate the config object ([ac5cacb](https://github.com/libp2p/js-libp2p/commit/ac5cacb))
|
||||||
|
* remove .only ([be9eafe](https://github.com/libp2p/js-libp2p/commit/be9eafe))
|
||||||
|
* remove peer discovery module config checks ([4ad70ef](https://github.com/libp2p/js-libp2p/commit/4ad70ef))
|
||||||
|
* typo in fixture and fail for correct reason ([1af5ba9](https://github.com/libp2p/js-libp2p/commit/1af5ba9))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* enable peer discovery modules by default ([e320854](https://github.com/libp2p/js-libp2p/commit/e320854))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="0.21.0"></a>
|
<a name="0.21.0"></a>
|
||||||
# [0.21.0](https://github.com/libp2p/js-libp2p/compare/v0.20.4...v0.21.0) (2018-06-28)
|
# [0.21.0](https://github.com/libp2p/js-libp2p/compare/v0.20.4...v0.21.0) (2018-06-28)
|
||||||
|
|
||||||
|
11
OKR.md
Normal file
11
OKR.md
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
# Quarterly Objectives and Key Results
|
||||||
|
|
||||||
|
We try to frame our ongoing work using a process based on quarterly Objectives and Key Results (OKRs). Objectives reflect outcomes that are challenging, but realistic. Results are tangible and measurable.
|
||||||
|
|
||||||
|
## 2018 Q3
|
||||||
|
|
||||||
|
Find the js-libp2p OKRs for 2018 Q2 at the [2018 Q3 libp2p OKRs Spreadsheet](https://docs.google.com/spreadsheets/d/1HTXfgR5FyPTFhsTkFPRThkeMvHvCgJOaAs7BSl_vQ_0/edit#gid=1241853194)
|
||||||
|
|
||||||
|
## Previous Quarters
|
||||||
|
|
||||||
|
For the quarters before 2018 Q3, js-libp2p shared their KRs with the [IPFS OKRs](https://github.com/ipfs/js-ipfs/blob/master/OKR.md).
|
129
README.md
129
README.md
@ -1,5 +1,5 @@
|
|||||||
<h1 align="center">
|
<h1 align="center">
|
||||||
<a href="libp2p.io"><img width="250" src="https://github.com/libp2p/libp2p/blob/master/logo/alternates/libp2p-logo-alt-2.png?raw=true" alt="libp2p hex logo" /></a>
|
<a href="libp2p.io"><img width="250" src="https://github.com/libp2p/libp2p/blob/master/logo/black-bg-2.png?raw=true" alt="libp2p hex logo" /></a>
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<h3 align="center">The JavaScript implementation of the libp2p Networking Stack.</h3>
|
<h3 align="center">The JavaScript implementation of the libp2p Networking Stack.</h3>
|
||||||
@ -12,9 +12,8 @@
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://travis-ci.org/libp2p/js-libp2p"><img src="https://travis-ci.org/libp2p/js-libp2p.svg?branch=master" /></a>
|
<a href="https://ci.ipfs.team/job/libp2p/job/js-libp2p/job/master/"><img src="https://ci.ipfs.team/buildStatus/icon?job=libp2p/js-libp2p/master" /></a>
|
||||||
<a href="https://circleci.com/gh/libp2p/js-libp2p"><img src="https://circleci.com/gh/libp2p/js-libp2p.svg?style=svg" /></a>
|
<a href="https://codecov.io/gh/libp2p/js-libp2p"><img src="https://codecov.io/gh/libp2p/js-libp2p/branch/master/graph/badge.svg"></a>
|
||||||
<a href="https://coveralls.io/github/libp2p/js-libp2p?branch=master"><img src="https://coveralls.io/repos/github/libp2p/js-libp2p/badge.svg?branch=master"></a>
|
|
||||||
<br>
|
<br>
|
||||||
<a href="https://david-dm.org/libp2p/js-libp2p"><img src="https://david-dm.org/libp2p/js-libp2p.svg?style=flat-square" /></a>
|
<a href="https://david-dm.org/libp2p/js-libp2p"><img src="https://david-dm.org/libp2p/js-libp2p.svg?style=flat-square" /></a>
|
||||||
<a href="https://github.com/feross/standard"><img src="https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat-square"></a>
|
<a href="https://github.com/feross/standard"><img src="https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat-square"></a>
|
||||||
@ -116,11 +115,12 @@ const SECIO = require('libp2p-secio')
|
|||||||
const MulticastDNS = require('libp2p-mdns')
|
const MulticastDNS = require('libp2p-mdns')
|
||||||
const DHT = require('libp2p-kad-dht')
|
const DHT = require('libp2p-kad-dht')
|
||||||
const defaultsDeep = require('@nodeutils/defaults-deep')
|
const defaultsDeep = require('@nodeutils/defaults-deep')
|
||||||
|
const Protector = require('libp2p-pnet')
|
||||||
|
|
||||||
class Node extends libp2p {
|
class Node extends libp2p {
|
||||||
constructor (_peerInfo, _peerBook, _options) {
|
constructor (_peerInfo, _peerBook, _options) {
|
||||||
const defaults = {
|
const defaults = {
|
||||||
peerInfo: _peerInfo // The Identity of your Peer
|
peerInfo: _peerInfo, // The Identity of your Peer
|
||||||
peerBook: _peerBook, // Where peers get tracked, if undefined libp2p will create one instance
|
peerBook: _peerBook, // Where peers get tracked, if undefined libp2p will create one instance
|
||||||
|
|
||||||
// The libp2p modules for this libp2p bundle
|
// The libp2p modules for this libp2p bundle
|
||||||
@ -135,12 +135,13 @@ class Node extends libp2p {
|
|||||||
],
|
],
|
||||||
connEncryption: [
|
connEncryption: [
|
||||||
SECIO
|
SECIO
|
||||||
]
|
],
|
||||||
|
connProtector: new Protector(/*protector specific opts*/),
|
||||||
peerDiscovery: [
|
peerDiscovery: [
|
||||||
MulticastDNS
|
MulticastDNS
|
||||||
],
|
],
|
||||||
peerRouting: {}, // Currently both peerRouting and contentRouting are patched through the DHT,
|
peerRouting: {}, // Currently both peerRouting and contentRouting are patched through the DHT,
|
||||||
contentRouting: {} // this will change once we factor that into two modules, for now do the following line:
|
contentRouting: {}, // this will change once we factor that into two modules, for now do the following line:
|
||||||
dht: DHT // DHT enables PeerRouting, ContentRouting and DHT itself components
|
dht: DHT // DHT enables PeerRouting, ContentRouting and DHT itself components
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -165,13 +166,16 @@ class Node extends libp2p {
|
|||||||
enabled: false,
|
enabled: false,
|
||||||
active: false
|
active: false
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
dht: {
|
||||||
|
kBucketSize: 20
|
||||||
|
},
|
||||||
// Enable/Disable Experimental features
|
// Enable/Disable Experimental features
|
||||||
EXPERIMENTAL: { // Experimental features ("behind a flag")
|
EXPERIMENTAL: { // Experimental features ("behind a flag")
|
||||||
pubsub: false,
|
pubsub: false,
|
||||||
dht: false
|
dht: false
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// overload any defaults of your bundle using https://github.com/nodeutils/defaults-deep
|
// overload any defaults of your bundle using https://github.com/nodeutils/defaults-deep
|
||||||
@ -429,6 +433,16 @@ Each one of these values is [an exponential moving-average instance](https://git
|
|||||||
|
|
||||||
Stats are not updated in real-time. Instead, measurements are buffered and stats are updated at an interval. The maximum interval can be defined through the `Switch` constructor option `stats.computeThrottleTimeout`, defined in miliseconds.
|
Stats are not updated in real-time. Instead, measurements are buffered and stats are updated at an interval. The maximum interval can be defined through the `Switch` constructor option `stats.computeThrottleTimeout`, defined in miliseconds.
|
||||||
|
|
||||||
|
### Private Networks
|
||||||
|
|
||||||
|
#### Enforcement
|
||||||
|
|
||||||
|
Libp2p provides support for connection protection, such as for private networks. You can enforce network protection by setting the environment variable `LIBP2P_FORCE_PNET=1`. When this variable is on, if no protector is set via `options.connProtector`, Libp2p will throw an error upon creation.
|
||||||
|
|
||||||
|
#### Protectors
|
||||||
|
|
||||||
|
Some available network protectors:
|
||||||
|
* [libp2p-pnet](https://github.com/libp2p/js-libp2p-pnet)
|
||||||
|
|
||||||
## Development
|
## Development
|
||||||
|
|
||||||
@ -471,39 +485,70 @@ N/A
|
|||||||
|
|
||||||
List of packages currently in existence for libp2p
|
List of packages currently in existence for libp2p
|
||||||
|
|
||||||
| Package | Version | Dependencies | DevDependencies |
|
| Package | Version | Deps | CI | Coverage |
|
||||||
|---------|---------|--------------|-----------------|
|
| ---------|---------|---------|---------|--------- |
|
||||||
| **Transports** |
|
| **Libp2p** |
|
||||||
| [`libp2p-utp`](//github.com/libp2p/js-libp2p-utp) | [](//github.com/libp2p/js-libp2p-utp/releases) | [](https://david-dm.org/libp2p/js-libp2p-utp) | [](https://david-dm.org/libp2p/js-libp2p-utp?type=dev) |
|
| [`interface-libp2p`](//github.com/libp2p/interface-libp2p) | [](//github.com/libp2p/interface-libp2p/releases) | [](https://david-dm.org/libp2p/interface-libp2p) | [](https://ci.ipfs.team/job/libp2p/job/interface-libp2p/job/master/) | [](https://codecov.io/gh/libp2p/interface-libp2p) |
|
||||||
| [`libp2p-websockets`](//github.com/libp2p/js-libp2p-websockets) | [](//github.com/libp2p/js-libp2p-websockets/releases) | [](https://david-dm.org/libp2p/js-libp2p-websockets) | [](https://david-dm.org/libp2p/js-libp2p-websockets?type=dev) |
|
| [`libp2p`](//github.com/libp2p/js-libp2p) | [](//github.com/libp2p/js-libp2p/releases) | [](https://david-dm.org/libp2p/js-libp2p) | [](https://ci.ipfs.team/job/libp2p/job/js-libp2p/job/master/) | [](https://codecov.io/gh/libp2p/js-libp2p) |
|
||||||
| [`libp2p-webrtc-star`](//github.com/libp2p/js-libp2p-webrtc-star) | [](//github.com/libp2p/js-libp2p-webrtc-star/releases) | [](https://david-dm.org/libp2p/js-libp2p-webrtc-star) | [](https://david-dm.org/libp2p/js-libp2p-webrtc-star?type=dev) |
|
| **Connection** |
|
||||||
| [`libp2p-websocket-star`](//github.com/libp2p/js-libp2p-websocket-star) | [](//github.com/libp2p/js-libp2p-websocket-star/releases) | [](https://david-dm.org/libp2p/js-libp2p-websocket-star) | [](https://david-dm.org/libp2p/js-libp2p-websocket-star?type=dev) |
|
| [`interface-connection`](//github.com/libp2p/interface-connection) | [](//github.com/libp2p/interface-connection/releases) | [](https://david-dm.org/libp2p/interface-connection) | [](https://ci.ipfs.team/job/libp2p/job/interface-connection/job/master/) | [](https://codecov.io/gh/libp2p/interface-connection) |
|
||||||
| [`libp2p-websocket-star-rendezvous`](//github.com/libp2p/js-libp2p-websocket-star-rendezvous) | [](//github.com/libp2p/js-libp2p-websocket-star-rendezvous/releases) | [](https://david-dm.org/libp2p/js-libp2p-websocket-star-rendezvous) | [](https://david-dm.org/libp2p/js-libp2p-websocket-star-rendezvous?type=dev) |
|
| **Transport** |
|
||||||
| **Connection Upgrades** |
|
| [`interface-transport`](//github.com/libp2p/interface-transport) | [](//github.com/libp2p/interface-transport/releases) | [](https://david-dm.org/libp2p/interface-transport) | [](https://ci.ipfs.team/job/libp2p/job/interface-transport/job/master/) | [](https://codecov.io/gh/libp2p/interface-transport) |
|
||||||
| [`interface-connection`](//github.com/libp2p/interface-connection) | [](//github.com/libp2p/interface-connection/releases) | [](https://david-dm.org/libp2p/interface-connection) | [](https://david-dm.org/libp2p/interface-connection?type=dev) |
|
| [`libp2p-circuit`](//github.com/libp2p/js-libp2p-circuit) | [](//github.com/libp2p/js-libp2p-circuit/releases) | [](https://david-dm.org/libp2p/js-libp2p-circuit) | [](https://ci.ipfs.team/job/libp2p/job/js-libp2p-circuit/job/master/) | [](https://codecov.io/gh/libp2p/js-libp2p-circuit) |
|
||||||
| **Stream Muxers** |
|
| [`libp2p-tcp`](//github.com/libp2p/js-libp2p-tcp) | [](//github.com/libp2p/js-libp2p-tcp/releases) | [](https://david-dm.org/libp2p/js-libp2p-tcp) | [](https://ci.ipfs.team/job/libp2p/job/js-libp2p-tcp/job/master/) | [](https://codecov.io/gh/libp2p/js-libp2p-tcp) |
|
||||||
| [`interface-stream-muxer`](//github.com/libp2p/interface-stream-muxer) | [](//github.com/libp2p/interface-stream-muxer/releases) | [](https://david-dm.org/libp2p/interface-stream-muxer) | [](https://david-dm.org/libp2p/interface-stream-muxer?type=dev) |
|
| [`libp2p-udp`](//github.com/libp2p/js-libp2p-udp) | [](//github.com/libp2p/js-libp2p-udp/releases) | [](https://david-dm.org/libp2p/js-libp2p-udp) | [](https://ci.ipfs.team/job/libp2p/job/js-libp2p-udp/job/master/) | [](https://codecov.io/gh/libp2p/js-libp2p-udp) |
|
||||||
| [`libp2p-spdy`](//github.com/libp2p/js-libp2p-spdy) | [](//github.com/libp2p/js-libp2p-spdy/releases) | [](https://david-dm.org/libp2p/js-libp2p-spdy) | [](https://david-dm.org/libp2p/js-libp2p-spdy?type=dev) |
|
| [`libp2p-udt`](//github.com/libp2p/js-libp2p-udt) | [](//github.com/libp2p/js-libp2p-udt/releases) | [](https://david-dm.org/libp2p/js-libp2p-udt) | [](https://ci.ipfs.team/job/libp2p/job/js-libp2p-udt/job/master/) | [](https://codecov.io/gh/libp2p/js-libp2p-udt) |
|
||||||
| [`libp2p-multiplex`](https://github.com/libp2p/js-libp2p-multiplex)
|
| [`libp2p-utp`](//github.com/libp2p/js-libp2p-utp) | [](//github.com/libp2p/js-libp2p-utp/releases) | [](https://david-dm.org/libp2p/js-libp2p-utp) | [](https://ci.ipfs.team/job/libp2p/job/js-libp2p-utp/job/master/) | [](https://codecov.io/gh/libp2p/js-libp2p-utp) |
|
||||||
| **Discovery** |
|
| [`libp2p-webrtc-direct`](//github.com/libp2p/js-libp2p-webrtc-direct) | [](//github.com/libp2p/js-libp2p-webrtc-direct/releases) | [](https://david-dm.org/libp2p/js-libp2p-webrtc-direct) | [](https://ci.ipfs.team/job/libp2p/job/js-libp2p-webrtc-direct/job/master/) | [](https://codecov.io/gh/libp2p/js-libp2p-webrtc-direct) |
|
||||||
| [`libp2p-mdns-discovery`](//github.com/libp2p/js-libp2p-mdns-discovery) | [](//github.com/libp2p/js-libp2p-mdns-discovery/releases) | [](https://david-dm.org/libp2p/js-libp2p-mdns-discovery) | [](https://david-dm.org/libp2p/js-libp2p-mdns-discovery?type=dev) |
|
| [`libp2p-webrtc-star`](//github.com/libp2p/js-libp2p-webrtc-star) | [](//github.com/libp2p/js-libp2p-webrtc-star/releases) | [](https://david-dm.org/libp2p/js-libp2p-webrtc-star) | [](https://ci.ipfs.team/job/libp2p/job/js-libp2p-webrtc-star/job/master/) | [](https://codecov.io/gh/libp2p/js-libp2p-webrtc-star) |
|
||||||
| [`libp2p-railing`](//github.com/libp2p/js-libp2p-railing) | [](//github.com/libp2p/js-libp2p-railing/releases) | [](https://david-dm.org/libp2p/js-libp2p-railing) | [](https://david-dm.org/libp2p/js-libp2p-railing?type=dev) |
|
| [`libp2p-websockets`](//github.com/libp2p/js-libp2p-websockets) | [](//github.com/libp2p/js-libp2p-websockets/releases) | [](https://david-dm.org/libp2p/js-libp2p-websockets) | [](https://ci.ipfs.team/job/libp2p/job/js-libp2p-websockets/job/master/) | [](https://codecov.io/gh/libp2p/js-libp2p-websockets) |
|
||||||
| **Crypto Channels** |
|
| [`libp2p-websocket-star`](//github.com/libp2p/js-libp2p-websocket-star) | [](//github.com/libp2p/js-libp2p-websocket-star/releases) | [](https://david-dm.org/libp2p/js-libp2p-websocket-star) | [](https://ci.ipfs.team/job/libp2p/job/js-libp2p-websocket-star/job/master/) | [](https://codecov.io/gh/libp2p/js-libp2p-websocket-star) |
|
||||||
| [`libp2p-secio`](//github.com/libp2p/js-libp2p-secio) | [](//github.com/libp2p/js-libp2p-secio/releases) | [](https://david-dm.org/libp2p/js-libp2p-secio) | [](https://david-dm.org/libp2p/js-libp2p-secio?type=dev) |
|
| [`libp2p-websocket-star-rendezvous`](//github.com/libp2p/js-libp2p-websocket-star-rendezvous) | [](//github.com/libp2p/js-libp2p-websocket-star-rendezvous/releases) | [](https://david-dm.org/libp2p/js-libp2p-websocket-star-rendezvous) | [](https://ci.ipfs.team/job/libp2p/job/js-libp2p-websocket-star-rendezvous/job/master/) | [](https://codecov.io/gh/libp2p/js-libp2p-websocket-star-rendezvous) |
|
||||||
| **Peer Routing** |
|
| **Crypto Channels** |
|
||||||
| [`libp2p-kad-routing`](//github.com/libp2p/js-libp2p-kad-routing) | [](//github.com/libp2p/js-libp2p-kad-routing/releases) | [](https://david-dm.org/libp2p/js-libp2p-kad-routing) | [](https://david-dm.org/libp2p/js-libp2p-kad-routing?type=dev) |
|
| [`libp2p-secio`](//github.com/libp2p/js-libp2p-secio) | [](//github.com/libp2p/js-libp2p-secio/releases) | [](https://david-dm.org/libp2p/js-libp2p-secio) | [](https://ci.ipfs.team/job/libp2p/job/js-libp2p-secio/job/master/) | [](https://codecov.io/gh/libp2p/js-libp2p-secio) |
|
||||||
| **Content Routing** |
|
| **Stream Muxers** |
|
||||||
| [`interface-record-store`](//github.com/libp2p/interface-record-store) | [](//github.com/libp2p/interface-record-store/releases) | [](https://david-dm.org/libp2p/interface-record-store) | [](https://david-dm.org/libp2p/interface-record-store?type=dev) |
|
| [`interface-stream-muxer`](//github.com/libp2p/interface-stream-muxer) | [](//github.com/libp2p/interface-stream-muxer/releases) | [](https://david-dm.org/libp2p/interface-stream-muxer) | [](https://ci.ipfs.team/job/libp2p/job/interface-stream-muxer/job/master/) | [](https://codecov.io/gh/libp2p/interface-stream-muxer) |
|
||||||
| [`libp2p-record`](//github.com/libp2p/js-libp2p-record) | [](//github.com/libp2p/js-libp2p-record/releases) | [](https://david-dm.org/libp2p/js-libp2p-record) | [](https://david-dm.org/libp2p/js-libp2p-record?type=dev) |
|
| [`libp2p-mplex`](//github.com/libp2p/js-libp2p-mplex) | [](//github.com/libp2p/js-libp2p-mplex/releases) | [](https://david-dm.org/libp2p/js-libp2p-mplex) | [](https://ci.ipfs.team/job/libp2p/job/js-libp2p-mplex/job/master/) | [](https://codecov.io/gh/libp2p/js-libp2p-mplex) |
|
||||||
| [`libp2p-distributed-record-store`](//github.com/libp2p/js-libp2p-distributed-record-store) | [](//github.com/libp2p/js-libp2p-distributed-record-store/releases) | [](https://david-dm.org/libp2p/js-libp2p-distributed-record-store) | [](https://david-dm.org/libp2p/js-libp2p-distributed-record-store?type=dev) |
|
| [`libp2p-spdy`](//github.com/libp2p/js-libp2p-spdy) | [](//github.com/libp2p/js-libp2p-spdy/releases) | [](https://david-dm.org/libp2p/js-libp2p-spdy) | [](https://ci.ipfs.team/job/libp2p/job/js-libp2p-spdy/job/master/) | [](https://codecov.io/gh/libp2p/js-libp2p-spdy) |
|
||||||
| [`libp2p-kad-record-store`](//github.com/libp2p/js-libp2p-kad-record-store) | [](//github.com/libp2p/js-libp2p-kad-record-store/releases) | [](https://david-dm.org/libp2p/js-libp2p-kad-record-store) | [](https://david-dm.org/libp2p/js-libp2p-kad-record-store?type=dev) |
|
| **Discovery** |
|
||||||
| **Generics** |
|
| [`interface-peer-discovery`](//github.com/libp2p/interface-peer-discovery) | [](//github.com/libp2p/interface-peer-discovery/releases) | [](https://david-dm.org/libp2p/interface-peer-discovery) | [](https://ci.ipfs.team/job/libp2p/job/interface-peer-discovery/job/master/) | [](https://codecov.io/gh/libp2p/interface-peer-discovery) |
|
||||||
| [`libp2p-switch`](//github.com/libp2p/js-libp2p-switch) | [](//github.com/libp2p/js-libp2p-switch/releases) | [](https://david-dm.org/libp2p/js-libp2p-switch) | [](https://david-dm.org/libp2p/js-libp2p-switch?type=dev) |
|
| [`libp2p-bootstrap`](//github.com/libp2p/js-libp2p-bootstrap) | [](//github.com/libp2p/js-libp2p-bootstrap/releases) | [](https://david-dm.org/libp2p/js-libp2p-bootstrap) | [](https://ci.ipfs.team/job/libp2p/job/js-libp2p-bootstrap/job/master/) | [](https://codecov.io/gh/libp2p/js-libp2p-bootstrap) |
|
||||||
| [`libp2p-ping`](//github.com/libp2p/js-libp2p-ping) | [](//github.com/libp2p/js-libp2p-ping/releases) | [](https://david-dm.org/libp2p/js-libp2p-ping) | [](https://david-dm.org/libp2p/js-libp2p-ping?type=dev) |
|
| [`libp2p-kad-dht`](//github.com/libp2p/js-libp2p-kad-dht) | [](//github.com/libp2p/js-libp2p-kad-dht/releases) | [](https://david-dm.org/libp2p/js-libp2p-kad-dht) | [](https://ci.ipfs.team/job/libp2p/job/js-libp2p-kad-dht/job/master/) | [](https://codecov.io/gh/libp2p/js-libp2p-kad-dht) |
|
||||||
| [`multistream-select`](//github.com/libp2p/js-multistream) | [](//github.com/libp2p/js-multistream/releases) | [](https://david-dm.org/libp2p/js-multistream) | [](https://david-dm.org/libp2p/js-multistream?type=dev) |
|
| [`libp2p-mdns`](//github.com/libp2p/js-libp2p-mdns) | [](//github.com/libp2p/js-libp2p-mdns/releases) | [](https://david-dm.org/libp2p/js-libp2p-mdns) | [](https://ci.ipfs.team/job/libp2p/job/js-libp2p-mdns/job/master/) | [](https://codecov.io/gh/libp2p/js-libp2p-mdns) |
|
||||||
| **Data Types** |
|
| [`libp2p-rendezvous`](//github.com/libp2p/js-libp2p-rendezvous) | [](//github.com/libp2p/js-libp2p-rendezvous/releases) | [](https://david-dm.org/libp2p/js-libp2p-rendezvous) | [](https://ci.ipfs.team/job/libp2p/job/js-libp2p-rendezvous/job/master/) | [](https://codecov.io/gh/libp2p/js-libp2p-rendezvous) |
|
||||||
| [`peer-book`](//github.com/libp2p/js-peer-book) | [](//github.com/libp2p/js-peer-book/releases) | [](https://david-dm.org/libp2p/js-peer-book) | [](https://david-dm.org/libp2p/js-peer-book?type=dev) |
|
| [`libp2p-webrtc-star`](//github.com/libp2p/js-libp2p-webrtc-star) | [](//github.com/libp2p/js-libp2p-webrtc-star/releases) | [](https://david-dm.org/libp2p/js-libp2p-webrtc-star) | [](https://ci.ipfs.team/job/libp2p/job/js-libp2p-webrtc-star/job/master/) | [](https://codecov.io/gh/libp2p/js-libp2p-webrtc-star) |
|
||||||
| [`peer-id`](https://github.com/libp2p/js-peer-id)
|
| [`libp2p-websocket-star`](//github.com/libp2p/js-libp2p-websocket-star) | [](//github.com/libp2p/js-libp2p-websocket-star/releases) | [](https://david-dm.org/libp2p/js-libp2p-websocket-star) | [](https://ci.ipfs.team/job/libp2p/job/js-libp2p-websocket-star/job/master/) | [](https://codecov.io/gh/libp2p/js-libp2p-websocket-star) |
|
||||||
|
| **NAT Traversal** |
|
||||||
|
| [`libp2p-circuit`](//github.com/libp2p/js-libp2p-circuit) | [](//github.com/libp2p/js-libp2p-circuit/releases) | [](https://david-dm.org/libp2p/js-libp2p-circuit) | [](https://ci.ipfs.team/job/libp2p/job/js-libp2p-circuit/job/master/) | [](https://codecov.io/gh/libp2p/js-libp2p-circuit) |
|
||||||
|
| [`libp2p-nat-mngr`](//github.com/libp2p/js-libp2p-nat-mngr) | [](//github.com/libp2p/js-libp2p-nat-mngr/releases) | [](https://david-dm.org/libp2p/js-libp2p-nat-mngr) | [](https://ci.ipfs.team/job/libp2p/job/js-libp2p-nat-mngr/job/master/) | [](https://codecov.io/gh/libp2p/js-libp2p-nat-mngr) |
|
||||||
|
| **Data Types** |
|
||||||
|
| [`peer-book`](//github.com/libp2p/js-peer-book) | [](//github.com/libp2p/js-peer-book/releases) | [](https://david-dm.org/libp2p/js-peer-book) | [](https://ci.ipfs.team/job/libp2p/job/js-peer-book/job/master/) | [](https://codecov.io/gh/libp2p/js-peer-book) |
|
||||||
|
| [`peer-id`](//github.com/libp2p/js-peer-id) | [](//github.com/libp2p/js-peer-id/releases) | [](https://david-dm.org/libp2p/js-peer-id) | [](https://ci.ipfs.team/job/libp2p/job/js-peer-id/job/master/) | [](https://codecov.io/gh/libp2p/js-peer-id) |
|
||||||
|
| [`peer-info`](//github.com/libp2p/js-peer-info) | [](//github.com/libp2p/js-peer-info/releases) | [](https://david-dm.org/libp2p/js-peer-info) | [](https://ci.ipfs.team/job/libp2p/job/js-peer-info/job/master/) | [](https://codecov.io/gh/libp2p/js-peer-info) |
|
||||||
|
| **Content Routing** |
|
||||||
|
| [`interface-content-routing`](//github.com/libp2p/interface-content-routing) | [](//github.com/libp2p/interface-content-routing/releases) | [](https://david-dm.org/libp2p/interface-content-routing) | [](https://ci.ipfs.team/job/libp2p/job/interface-content-routing/job/master/) | [](https://codecov.io/gh/libp2p/interface-content-routing) |
|
||||||
|
| [`libp2p-delegated-content-routing`](//github.com/libp2p/js-libp2p-delegated-content-routing) | [](//github.com/libp2p/js-libp2p-delegated-content-routing/releases) | [](https://david-dm.org/libp2p/js-libp2p-delegated-content-routing) | [](https://ci.ipfs.team/job/libp2p/job/js-libp2p-delegated-content-routing/job/master/) | [](https://codecov.io/gh/libp2p/js-libp2p-delegated-content-routing) |
|
||||||
|
| [`libp2p-kad-dht`](//github.com/libp2p/js-libp2p-kad-dht) | [](//github.com/libp2p/js-libp2p-kad-dht/releases) | [](https://david-dm.org/libp2p/js-libp2p-kad-dht) | [](https://ci.ipfs.team/job/libp2p/job/js-libp2p-kad-dht/job/master/) | [](https://codecov.io/gh/libp2p/js-libp2p-kad-dht) |
|
||||||
|
| **Peer Routing** |
|
||||||
|
| [`interface-peer-routing`](//github.com/libp2p/interface-peer-routing) | [](//github.com/libp2p/interface-peer-routing/releases) | [](https://david-dm.org/libp2p/interface-peer-routing) | [](https://ci.ipfs.team/job/libp2p/job/interface-peer-routing/job/master/) | [](https://codecov.io/gh/libp2p/interface-peer-routing) |
|
||||||
|
| [`libp2p-delegated-peer-routing`](//github.com/libp2p/js-libp2p-delegated-peer-routing) | [](//github.com/libp2p/js-libp2p-delegated-peer-routing/releases) | [](https://david-dm.org/libp2p/js-libp2p-delegated-peer-routing) | [](https://ci.ipfs.team/job/libp2p/job/js-libp2p-delegated-peer-routing/job/master/) | [](https://codecov.io/gh/libp2p/js-libp2p-delegated-peer-routing) |
|
||||||
|
| [`libp2p-kad-dht`](//github.com/libp2p/js-libp2p-kad-dht) | [](//github.com/libp2p/js-libp2p-kad-dht/releases) | [](https://david-dm.org/libp2p/js-libp2p-kad-dht) | [](https://ci.ipfs.team/job/libp2p/job/js-libp2p-kad-dht/job/master/) | [](https://codecov.io/gh/libp2p/js-libp2p-kad-dht) |
|
||||||
|
| **Record Store** |
|
||||||
|
| [`interface-record-store`](//github.com/libp2p/interface-record-store) | [](//github.com/libp2p/interface-record-store/releases) | [](https://david-dm.org/libp2p/interface-record-store) | [](https://ci.ipfs.team/job/libp2p/job/interface-record-store/job/master/) | [](https://codecov.io/gh/libp2p/interface-record-store) |
|
||||||
|
| [`libp2p-record`](//github.com/libp2p/js-libp2p-record) | [](//github.com/libp2p/js-libp2p-record/releases) | [](https://david-dm.org/libp2p/js-libp2p-record) | [](https://ci.ipfs.team/job/libp2p/job/js-libp2p-record/job/master/) | [](https://codecov.io/gh/libp2p/js-libp2p-record) |
|
||||||
|
| **Generics** |
|
||||||
|
| [`libp2p-connection-manager`](//github.com/libp2p/js-libp2p-connection-manager) | [](//github.com/libp2p/js-libp2p-connection-manager/releases) | [](https://david-dm.org/libp2p/js-libp2p-connection-manager) | [](https://ci.ipfs.team/job/libp2p/job/js-libp2p-connection-manager/job/master/) | [](https://codecov.io/gh/libp2p/js-libp2p-connection-manager) |
|
||||||
|
| [`libp2p-crypto`](//github.com/libp2p/js-libp2p-crypto) | [](//github.com/libp2p/js-libp2p-crypto/releases) | [](https://david-dm.org/libp2p/js-libp2p-crypto) | [](https://ci.ipfs.team/job/libp2p/job/js-libp2p-crypto/job/master/) | [](https://codecov.io/gh/libp2p/js-libp2p-crypto) |
|
||||||
|
| [`libp2p-crypto-secp256k1`](//github.com/libp2p/js-libp2p-crypto-secp256k1) | [](//github.com/libp2p/js-libp2p-crypto-secp256k1/releases) | [](https://david-dm.org/libp2p/js-libp2p-crypto-secp256k1) | [](https://ci.ipfs.team/job/libp2p/job/js-libp2p-crypto-secp256k1/job/master/) | [](https://codecov.io/gh/libp2p/js-libp2p-crypto-secp256k1) |
|
||||||
|
| [`libp2p-switch`](//github.com/libp2p/js-libp2p-switch) | [](//github.com/libp2p/js-libp2p-switch/releases) | [](https://david-dm.org/libp2p/js-libp2p-switch) | [](https://ci.ipfs.team/job/libp2p/job/js-libp2p-switch/job/master/) | [](https://codecov.io/gh/libp2p/js-libp2p-switch) |
|
||||||
|
| **Extensions** |
|
||||||
|
| [`libp2p-floodsub`](//github.com/libp2p/js-libp2p-floodsub) | [](//github.com/libp2p/js-libp2p-floodsub/releases) | [](https://david-dm.org/libp2p/js-libp2p-floodsub) | [](https://ci.ipfs.team/job/libp2p/job/js-libp2p-floodsub/job/master/) | [](https://codecov.io/gh/libp2p/js-libp2p-floodsub) |
|
||||||
|
| [`libp2p-identify`](//github.com/libp2p/js-libp2p-identify) | [](//github.com/libp2p/js-libp2p-identify/releases) | [](https://david-dm.org/libp2p/js-libp2p-identify) | [](https://ci.ipfs.team/job/libp2p/job/js-libp2p-identify/job/master/) | [](https://codecov.io/gh/libp2p/js-libp2p-identify) |
|
||||||
|
| [`libp2p-keychain`](//github.com/libp2p/js-libp2p-keychain) | [](//github.com/libp2p/js-libp2p-keychain/releases) | [](https://david-dm.org/libp2p/js-libp2p-keychain) | [](https://ci.ipfs.team/job/libp2p/job/js-libp2p-keychain/job/master/) | [](https://codecov.io/gh/libp2p/js-libp2p-keychain) |
|
||||||
|
| [`libp2p-ping`](//github.com/libp2p/js-libp2p-ping) | [](//github.com/libp2p/js-libp2p-ping/releases) | [](https://david-dm.org/libp2p/js-libp2p-ping) | [](https://ci.ipfs.team/job/libp2p/job/js-libp2p-ping/job/master/) | [](https://codecov.io/gh/libp2p/js-libp2p-ping) |
|
||||||
|
| [`libp2p-pnet`](//github.com/libp2p/js-libp2p-pnet) | [](//github.com/libp2p/js-libp2p-pnet/releases) | [](https://david-dm.org/libp2p/js-libp2p-pnet) | [](https://ci.ipfs.team/job/libp2p/job/js-libp2p-pnet/job/master/) | [](https://codecov.io/gh/libp2p/js-libp2p-pnet) |
|
||||||
|
| **Utilities** |
|
||||||
|
| [`p2pcat`](//github.com/libp2p/js-p2pcat) | [](//github.com/libp2p/js-p2pcat/releases) | [](https://david-dm.org/libp2p/js-p2pcat) | [](https://ci.ipfs.team/job/libp2p/job/js-p2pcat/job/master/) | [](https://codecov.io/gh/libp2p/js-p2pcat) |
|
||||||
|
|
||||||
## Contribute
|
## Contribute
|
||||||
|
|
||||||
|
41
RELEASE.md
Normal file
41
RELEASE.md
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
# Release Template
|
||||||
|
|
||||||
|
> short tl;dr; of the release
|
||||||
|
|
||||||
|
# 🗺 What's left for release
|
||||||
|
|
||||||
|
# 🔦 Highlights
|
||||||
|
|
||||||
|
# 🏗 API Changes
|
||||||
|
|
||||||
|
# ✅ Release Checklist
|
||||||
|
|
||||||
|
- Robustness and quality
|
||||||
|
- [ ] Ensure that all tests are passing, this includes:
|
||||||
|
- [ ] unit
|
||||||
|
- [ ] Run tests of the following projects with the new release:
|
||||||
|
- [ ] [js-ipfs](https://github.com/ipfs/js-ipfs)
|
||||||
|
- Documentation
|
||||||
|
- [ ] Ensure that README.md is up to date
|
||||||
|
- [ ] Ensure that all the examples run
|
||||||
|
- Communication
|
||||||
|
- [ ] Create the release issue
|
||||||
|
- [ ] Announcements (both pre-release and post-release)
|
||||||
|
- [ ] Twitter
|
||||||
|
- [ ] IRC
|
||||||
|
- [ ] Reddit
|
||||||
|
- [ ] Blog post
|
||||||
|
|
||||||
|
# 🙌🏽 Want to contribute?
|
||||||
|
|
||||||
|
Would you like to contribute to the libp2p project and don't know how? Well, there are a few places you can get started:
|
||||||
|
|
||||||
|
- Check the issues with the `help wanted` label at the Ready column in our waffle board - https://waffle.io/libp2p/js-libp2p?label=help%20wanted
|
||||||
|
- Join an IPFS All Hands, introduce yourself and let us know where you would like to contribute - https://github.com/ipfs/pm/#all-hands-call
|
||||||
|
- Hack with IPFS and show us what you made! The All Hands call is also the perfect venue for demos, join in and show us what you built
|
||||||
|
- Join the discussion at http://discuss.ipfs.io/ and help users finding their answers.
|
||||||
|
- Join the [⚡️ⒿⓈ Core Dev Team Weekly Sync 🙌🏽 ](https://github.com/ipfs/pm/issues/650) and be part of the Sprint action!
|
||||||
|
|
||||||
|
# ⁉️ Do you have questions?
|
||||||
|
|
||||||
|
The best place to ask your questions about libp2p, how it works and what you can do with it is at [discuss.ipfs.io](http://discuss.ipfs.io). We are also available at the #libp2p channel on Freenode.
|
2
ci/Jenkinsfile
vendored
2
ci/Jenkinsfile
vendored
@ -1,2 +1,2 @@
|
|||||||
// Warning: This file is automatically synced from https://github.com/ipfs/ci-sync so if you want to change it, please change it there and ask someone to sync all repositories.
|
// Warning: This file is automatically synced from https://github.com/ipfs/ci-sync so if you want to change it, please change it there and ask someone to sync all repositories.
|
||||||
javascript(['nodejs_versions': ['8.11.3']])
|
javascript()
|
||||||
|
24
package.json
24
package.json
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "libp2p",
|
"name": "libp2p",
|
||||||
"version": "0.21.0",
|
"version": "0.23.0",
|
||||||
"description": "JavaScript base class for libp2p bundles",
|
"description": "JavaScript base class for libp2p bundles",
|
||||||
"leadMaintainer": "David Dias <daviddias@ipfs.io>",
|
"leadMaintainer": "David Dias <daviddias@ipfs.io>",
|
||||||
"main": "src/index.js",
|
"main": "src/index.js",
|
||||||
@ -33,35 +33,36 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/libp2p/js-libp2p",
|
"homepage": "https://github.com/libp2p/js-libp2p",
|
||||||
"browser": {
|
"browser": {
|
||||||
"joi": "joi-browser"
|
"joi": "joi-browser",
|
||||||
|
"./test/utils/bundle-nodejs": "./test/utils/bundle-browser"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"async": "^2.6.0",
|
"async": "^2.6.1",
|
||||||
"joi": "^13.4.0",
|
"joi": "^13.4.0",
|
||||||
"joi-browser": "^13.4.0",
|
"joi-browser": "^13.4.0",
|
||||||
"libp2p-connection-manager": "~0.0.2",
|
"libp2p-connection-manager": "~0.0.2",
|
||||||
"libp2p-floodsub": "~0.15.0",
|
"libp2p-floodsub": "~0.15.0",
|
||||||
"libp2p-ping": "~0.8.0",
|
"libp2p-ping": "~0.8.0",
|
||||||
"libp2p-switch": "~0.40.4",
|
"libp2p-switch": "~0.40.7",
|
||||||
"libp2p-websockets": "~0.12.0",
|
"libp2p-websockets": "~0.12.0",
|
||||||
"mafmt": "^6.0.0",
|
"mafmt": "^6.0.0",
|
||||||
"multiaddr": "^5.0.0",
|
"multiaddr": "^5.0.0",
|
||||||
"peer-book": "~0.8.0",
|
"peer-book": "~0.8.0",
|
||||||
"peer-id": "~0.10.7",
|
"peer-id": "~0.11.0",
|
||||||
"peer-info": "~0.14.1"
|
"peer-info": "~0.14.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@nodeutils/defaults-deep": "^1.1.0",
|
"@nodeutils/defaults-deep": "^1.1.0",
|
||||||
"aegir": "^14.0.0",
|
"aegir": "^15.1.0",
|
||||||
"chai": "^4.1.2",
|
"chai": "^4.1.2",
|
||||||
"cids": "~0.5.3",
|
"cids": "~0.5.3",
|
||||||
"dirty-chai": "^2.0.1",
|
"dirty-chai": "^2.0.1",
|
||||||
"electron-webrtc": "~0.3.0",
|
"electron-webrtc": "~0.3.0",
|
||||||
"libp2p-circuit": "~0.2.0",
|
"libp2p-circuit": "~0.2.0",
|
||||||
"libp2p-kad-dht": "~0.10.0",
|
"libp2p-kad-dht": "~0.10.1",
|
||||||
"libp2p-mdns": "~0.12.0",
|
"libp2p-mdns": "~0.12.0",
|
||||||
"libp2p-mplex": "~0.8.0",
|
"libp2p-mplex": "~0.8.0",
|
||||||
"libp2p-railing": "~0.9.1",
|
"libp2p-railing": "~0.9.2",
|
||||||
"libp2p-secio": "~0.10.0",
|
"libp2p-secio": "~0.10.0",
|
||||||
"libp2p-spdy": "~0.12.1",
|
"libp2p-spdy": "~0.12.1",
|
||||||
"libp2p-tcp": "~0.12.0",
|
"libp2p-tcp": "~0.12.0",
|
||||||
@ -72,10 +73,12 @@
|
|||||||
"pull-goodbye": "0.0.2",
|
"pull-goodbye": "0.0.2",
|
||||||
"pull-serializer": "~0.3.2",
|
"pull-serializer": "~0.3.2",
|
||||||
"pull-stream": "^3.6.8",
|
"pull-stream": "^3.6.8",
|
||||||
"sinon": "^5.0.7",
|
"sinon": "^6.1.4",
|
||||||
"wrtc": "0.1.1"
|
"webrtcsupport": "^2.2.0",
|
||||||
|
"wrtc": "~0.1.6"
|
||||||
},
|
},
|
||||||
"contributors": [
|
"contributors": [
|
||||||
|
"Alan Shaw <alan@tableflip.io>",
|
||||||
"Chris Bratlien <chrisbratlien@gmail.com>",
|
"Chris Bratlien <chrisbratlien@gmail.com>",
|
||||||
"Chris Dostert <chrisdostert@users.noreply.github.com>",
|
"Chris Dostert <chrisdostert@users.noreply.github.com>",
|
||||||
"Daijiro Wachi <daijiro.wachi@gmail.com>",
|
"Daijiro Wachi <daijiro.wachi@gmail.com>",
|
||||||
@ -88,6 +91,7 @@
|
|||||||
"Giovanni T. Parra <fiatjaf@gmail.com>",
|
"Giovanni T. Parra <fiatjaf@gmail.com>",
|
||||||
"Hugo Dias <hugomrdias@gmail.com>",
|
"Hugo Dias <hugomrdias@gmail.com>",
|
||||||
"Irakli Gozalishvili <rfobic@gmail.com>",
|
"Irakli Gozalishvili <rfobic@gmail.com>",
|
||||||
|
"Jacob Heun <jacobheun@gmail.com>",
|
||||||
"Joel Gustafson <joelg@mit.edu>",
|
"Joel Gustafson <joelg@mit.edu>",
|
||||||
"John Rees <johnrees@users.noreply.github.com>",
|
"John Rees <johnrees@users.noreply.github.com>",
|
||||||
"João Santos <joaosantos15@users.noreply.github.com>",
|
"João Santos <joaosantos15@users.noreply.github.com>",
|
||||||
|
146
scripts/generate-package-table-for-readme.js
Normal file
146
scripts/generate-package-table-for-readme.js
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
#! /usr/bin/env node
|
||||||
|
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
// This script generates the table of packages you can see in the readme
|
||||||
|
|
||||||
|
// Columns to show at the header of the table
|
||||||
|
const columns = [
|
||||||
|
'Package',
|
||||||
|
'Version',
|
||||||
|
'Deps',
|
||||||
|
'CI',
|
||||||
|
'Coverage'
|
||||||
|
]
|
||||||
|
|
||||||
|
// Headings are a string
|
||||||
|
// Arrays are packages. Index 0 is the GitHub repo and index 1 is the npm package
|
||||||
|
const rows = [
|
||||||
|
'Libp2p',
|
||||||
|
['libp2p/interface-libp2p', 'interface-libp2p'],
|
||||||
|
['libp2p/js-libp2p', 'libp2p'],
|
||||||
|
|
||||||
|
'Connection',
|
||||||
|
['libp2p/interface-connection', 'interface-connection'],
|
||||||
|
|
||||||
|
'Transport',
|
||||||
|
['libp2p/interface-transport', 'interface-transport'],
|
||||||
|
['libp2p/js-libp2p-circuit', 'libp2p-circuit'], // should this be NAT Traversal only?
|
||||||
|
['libp2p/js-libp2p-tcp', 'libp2p-tcp'],
|
||||||
|
['libp2p/js-libp2p-udp', 'libp2p-udp'],
|
||||||
|
['libp2p/js-libp2p-udt', 'libp2p-udt'],
|
||||||
|
['libp2p/js-libp2p-utp', 'libp2p-utp'],
|
||||||
|
['libp2p/js-libp2p-webrtc-direct', 'libp2p-webrtc-direct'],
|
||||||
|
['libp2p/js-libp2p-webrtc-star', 'libp2p-webrtc-star'],
|
||||||
|
['libp2p/js-libp2p-websockets', 'libp2p-websockets'],
|
||||||
|
['libp2p/js-libp2p-websocket-star', 'libp2p-websocket-star'],
|
||||||
|
['libp2p/js-libp2p-websocket-star-rendezvous', 'libp2p-websocket-star-rendezvous'],
|
||||||
|
|
||||||
|
'Crypto Channels',
|
||||||
|
['libp2p/js-libp2p-secio', 'libp2p-secio'],
|
||||||
|
|
||||||
|
'Stream Muxers',
|
||||||
|
['libp2p/interface-stream-muxer', 'interface-stream-muxer'],
|
||||||
|
['libp2p/js-libp2p-mplex', 'libp2p-mplex'],
|
||||||
|
['libp2p/js-libp2p-spdy', 'libp2p-spdy'],
|
||||||
|
|
||||||
|
'Discovery',
|
||||||
|
['libp2p/interface-peer-discovery', 'interface-peer-discovery'],
|
||||||
|
['libp2p/js-libp2p-bootstrap', 'libp2p-bootstrap'],
|
||||||
|
['libp2p/js-libp2p-kad-dht', 'libp2p-kad-dht'], // should this be here?
|
||||||
|
['libp2p/js-libp2p-mdns', 'libp2p-mdns'],
|
||||||
|
['libp2p/js-libp2p-rendezvous', 'libp2p-rendezvous'],
|
||||||
|
['libp2p/js-libp2p-webrtc-star', 'libp2p-webrtc-star'],
|
||||||
|
['libp2p/js-libp2p-websocket-star', 'libp2p-websocket-star'],
|
||||||
|
|
||||||
|
'NAT Traversal',
|
||||||
|
['libp2p/js-libp2p-circuit', 'libp2p-circuit'],
|
||||||
|
['libp2p/js-libp2p-nat-mngr', 'libp2p-nat-mngr'],
|
||||||
|
|
||||||
|
'Data Types',
|
||||||
|
['libp2p/js-peer-book', 'peer-book'],
|
||||||
|
['libp2p/js-peer-id', 'peer-id'],
|
||||||
|
['libp2p/js-peer-info', 'peer-info'],
|
||||||
|
|
||||||
|
'Content Routing',
|
||||||
|
['libp2p/interface-content-routing', 'interface-content-routing'],
|
||||||
|
['libp2p/js-libp2p-delegated-content-routing', 'libp2p-delegated-content-routing'],
|
||||||
|
['libp2p/js-libp2p-kad-dht', 'libp2p-kad-dht'],
|
||||||
|
|
||||||
|
'Peer Routing',
|
||||||
|
['libp2p/interface-peer-routing', 'interface-peer-routing'],
|
||||||
|
['libp2p/js-libp2p-delegated-peer-routing', 'libp2p-delegated-peer-routing'],
|
||||||
|
['libp2p/js-libp2p-kad-dht', 'libp2p-kad-dht'],
|
||||||
|
|
||||||
|
'Record Store',
|
||||||
|
['libp2p/interface-record-store', 'interface-record-store'],
|
||||||
|
['libp2p/js-libp2p-record', 'libp2p-record'],
|
||||||
|
|
||||||
|
'Generics',
|
||||||
|
['libp2p/js-libp2p-connection-manager', 'libp2p-connection-manager'],
|
||||||
|
['libp2p/js-libp2p-crypto', 'libp2p-crypto'],
|
||||||
|
['libp2p/js-libp2p-crypto-secp256k1', 'libp2p-crypto-secp256k1'],
|
||||||
|
['libp2p/js-libp2p-switch', 'libp2p-switch'],
|
||||||
|
|
||||||
|
'Extensions',
|
||||||
|
['libp2p/js-libp2p-floodsub', 'libp2p-floodsub'],
|
||||||
|
['libp2p/js-libp2p-identify', 'libp2p-identify'],
|
||||||
|
['libp2p/js-libp2p-keychain', 'libp2p-keychain'],
|
||||||
|
['libp2p/js-libp2p-ping', 'libp2p-ping'],
|
||||||
|
['libp2p/js-libp2p-pnet', 'libp2p-pnet'],
|
||||||
|
|
||||||
|
'Utilities',
|
||||||
|
['libp2p/js-p2pcat', 'p2pcat']
|
||||||
|
]
|
||||||
|
|
||||||
|
const isItemPackage = (item) => {
|
||||||
|
return Array.isArray(item)
|
||||||
|
}
|
||||||
|
|
||||||
|
const packageBadges = [
|
||||||
|
// Package
|
||||||
|
(gh, npm) => `[\`${npm}\`](//github.com/${gh})`,
|
||||||
|
// Version
|
||||||
|
(gh, npm) => `[](//github.com/${gh}/releases)`,
|
||||||
|
// Deps
|
||||||
|
(gh, npm) => `[](https://david-dm.org/${gh})`,
|
||||||
|
// CI
|
||||||
|
(gh, npm) => {
|
||||||
|
// Need to fix the path for jenkins links, as jenkins adds `/job/` between everything
|
||||||
|
const jenkinsPath = gh.split('/').join('/job/')
|
||||||
|
return `[](https://ci.ipfs.team/job/${jenkinsPath}/job/master/)`
|
||||||
|
},
|
||||||
|
// Coverage
|
||||||
|
(gh, npm) => `[](https://codecov.io/gh/${gh})`
|
||||||
|
]
|
||||||
|
|
||||||
|
// Creates the table row for a package
|
||||||
|
const generatePackageRow = (item) => {
|
||||||
|
const row = packageBadges.map((func) => {
|
||||||
|
// First string is GitHub path, second is npm package name
|
||||||
|
return func(item[0], item[1])
|
||||||
|
}).join(' | ')
|
||||||
|
const fullRow = `| ${row} |`
|
||||||
|
return fullRow
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generates a row for the table, depending if it's a package or a heading
|
||||||
|
const generateRow = (item) => {
|
||||||
|
if (isItemPackage(item)) {
|
||||||
|
return generatePackageRow(item)
|
||||||
|
} else {
|
||||||
|
return `| **${item}** |`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const header = `| ${columns.join(' | ')} |`
|
||||||
|
const hr = `| ${columns.map(() => '---------').join('|')} |`
|
||||||
|
|
||||||
|
const toPrint = [
|
||||||
|
header,
|
||||||
|
hr,
|
||||||
|
rows.map((row) => generateRow(row)).join('\n')
|
||||||
|
]
|
||||||
|
|
||||||
|
toPrint.forEach((t) => console.log(t))
|
||||||
|
|
@ -2,40 +2,22 @@
|
|||||||
|
|
||||||
const Joi = require('joi')
|
const Joi = require('joi')
|
||||||
|
|
||||||
const schema = Joi.object({
|
const ModuleSchema = Joi.alternatives().try(Joi.func(), Joi.object())
|
||||||
|
|
||||||
|
const OptionsSchema = Joi.object({
|
||||||
// TODO: create proper validators for the generics
|
// TODO: create proper validators for the generics
|
||||||
connectionManager: Joi.object(),
|
connectionManager: Joi.object(),
|
||||||
peerInfo: Joi.object().required(),
|
peerInfo: Joi.object().required(),
|
||||||
peerBook: Joi.object(),
|
peerBook: Joi.object(),
|
||||||
modules: Joi.object().keys({
|
modules: Joi.object().keys({
|
||||||
transport: Joi.array().items(
|
transport: Joi.array().items(ModuleSchema).min(1).required(),
|
||||||
Joi.alternatives().try(
|
streamMuxer: Joi.array().items(ModuleSchema).allow(null),
|
||||||
Joi.func(),
|
connEncryption: Joi.array().items(ModuleSchema).allow(null),
|
||||||
Joi.object()
|
connProtector: Joi.object().keys({
|
||||||
)
|
protect: Joi.func().required()
|
||||||
).min(1).required(),
|
}).unknown(),
|
||||||
streamMuxer: Joi.array().items(
|
peerDiscovery: Joi.array().items(ModuleSchema).allow(null),
|
||||||
Joi.alternatives().try(
|
dht: ModuleSchema.allow(null)
|
||||||
Joi.func(),
|
|
||||||
Joi.object()
|
|
||||||
)
|
|
||||||
).allow(null),
|
|
||||||
connEncryption: Joi.array().items(
|
|
||||||
Joi.alternatives().try(
|
|
||||||
Joi.func(),
|
|
||||||
Joi.object()
|
|
||||||
)
|
|
||||||
).allow(null),
|
|
||||||
peerDiscovery: Joi.array().items(
|
|
||||||
Joi.alternatives().try(
|
|
||||||
Joi.func(),
|
|
||||||
Joi.object()
|
|
||||||
)
|
|
||||||
).allow(null),
|
|
||||||
dht: Joi.alternatives().try(
|
|
||||||
Joi.func(),
|
|
||||||
Joi.object()
|
|
||||||
).allow(null)
|
|
||||||
}).required(),
|
}).required(),
|
||||||
config: Joi.object().keys({
|
config: Joi.object().keys({
|
||||||
peerDiscovery: Joi.object().allow(null),
|
peerDiscovery: Joi.object().allow(null),
|
||||||
@ -57,27 +39,12 @@ const schema = Joi.object({
|
|||||||
})
|
})
|
||||||
|
|
||||||
module.exports.validate = (options) => {
|
module.exports.validate = (options) => {
|
||||||
let newSchema = schema
|
options = Joi.attempt(options, OptionsSchema)
|
||||||
// Throw an intial error early for required props
|
|
||||||
let config = Joi.attempt(options, newSchema)
|
|
||||||
|
|
||||||
// Ensure discoveries are properly configured
|
|
||||||
if (config.modules.peerDiscovery) {
|
|
||||||
config.modules.peerDiscovery.forEach((discovery) => {
|
|
||||||
// If it's a function, validate we have configs for it
|
|
||||||
if (typeof discovery === 'function') {
|
|
||||||
Joi.reach(schema, 'config.peerDiscovery').keys({
|
|
||||||
[discovery.tag]: Joi.object().required()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ensure dht is correct
|
// Ensure dht is correct
|
||||||
if (config.config.EXPERIMENTAL && config.config.EXPERIMENTAL.dht) {
|
if (options.config.EXPERIMENTAL.dht) {
|
||||||
newSchema = newSchema.requiredKeys('modules.dht')
|
Joi.assert(options.modules.dht, ModuleSchema.required())
|
||||||
}
|
}
|
||||||
|
|
||||||
// Finish validation and return the updated config
|
return options
|
||||||
return Joi.attempt(config, newSchema)
|
|
||||||
}
|
}
|
||||||
|
37
src/index.js
37
src/index.js
@ -75,6 +75,13 @@ class Node extends EventEmitter {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Attach private network protector
|
||||||
|
if (this._modules.connProtector) {
|
||||||
|
this._switch.protector = this._modules.connProtector
|
||||||
|
} else if (process.env.LIBP2P_FORCE_PNET) {
|
||||||
|
throw new Error('Private network is enforced, but no protector was provided')
|
||||||
|
}
|
||||||
|
|
||||||
// dht provided components (peerRouting, contentRouting, dht)
|
// dht provided components (peerRouting, contentRouting, dht)
|
||||||
if (this._config.EXPERIMENTAL.dht) {
|
if (this._config.EXPERIMENTAL.dht) {
|
||||||
const DHT = this._modules.dht
|
const DHT = this._modules.dht
|
||||||
@ -87,7 +94,7 @@ class Node extends EventEmitter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// enable/disable pubsub
|
// enable/disable pubsub
|
||||||
if (this._config.EXPERIMENTAL && this._config.EXPERIMENTAL.pubsub) {
|
if (this._config.EXPERIMENTAL.pubsub) {
|
||||||
this.pubsub = pubsub(this)
|
this.pubsub = pubsub(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -146,7 +153,10 @@ class Node extends EventEmitter {
|
|||||||
})
|
})
|
||||||
|
|
||||||
series([
|
series([
|
||||||
(cb) => this._switch.start(cb),
|
(cb) => {
|
||||||
|
this.connectionManager.start()
|
||||||
|
this._switch.start(cb)
|
||||||
|
},
|
||||||
(cb) => {
|
(cb) => {
|
||||||
if (ws) {
|
if (ws) {
|
||||||
// always add dialing on websockets
|
// always add dialing on websockets
|
||||||
@ -154,15 +164,25 @@ class Node extends EventEmitter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// all transports need to be setup before discover starts
|
// all transports need to be setup before discover starts
|
||||||
if (this._modules.peerDiscovery && this._config.peerDiscovery) {
|
if (this._modules.peerDiscovery) {
|
||||||
each(this._modules.peerDiscovery, (D, _cb) => {
|
each(this._modules.peerDiscovery, (D, _cb) => {
|
||||||
|
let config = {}
|
||||||
|
|
||||||
|
if (D.tag &&
|
||||||
|
this._config.peerDiscovery &&
|
||||||
|
this._config.peerDiscovery[D.tag]) {
|
||||||
|
config = this._config.peerDiscovery[D.tag]
|
||||||
|
}
|
||||||
|
|
||||||
|
// If not configured to be enabled/disabled then enable by default
|
||||||
|
const enabled = config.enabled == null ? true : config.enabled
|
||||||
|
|
||||||
// If enabled then start it
|
// If enabled then start it
|
||||||
if (this._config.peerDiscovery[D.tag].enabled) {
|
if (enabled) {
|
||||||
let d
|
let d
|
||||||
|
|
||||||
if (typeof D === 'function') {
|
if (typeof D === 'function') {
|
||||||
this._config.peerDiscovery[D.tag].peerInfo = this.peerInfo
|
d = new D(Object.assign({}, config, { peerInfo: this.peerInfo }))
|
||||||
d = new D(this._config.peerDiscovery[D.tag])
|
|
||||||
} else {
|
} else {
|
||||||
d = D
|
d = D
|
||||||
}
|
}
|
||||||
@ -246,7 +266,10 @@ class Node extends EventEmitter {
|
|||||||
}
|
}
|
||||||
cb()
|
cb()
|
||||||
},
|
},
|
||||||
(cb) => this._switch.stop(cb),
|
(cb) => {
|
||||||
|
this.connectionManager.stop()
|
||||||
|
this._switch.stop(cb)
|
||||||
|
},
|
||||||
(cb) => {
|
(cb) => {
|
||||||
this.emit('stop')
|
this.emit('stop')
|
||||||
cb()
|
cb()
|
||||||
|
@ -113,21 +113,4 @@ describe('configuration', () => {
|
|||||||
|
|
||||||
expect(() => validateConfig(options)).to.throw()
|
expect(() => validateConfig(options)).to.throw()
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should require a non instanced peerDiscovery module to have associated options', () => {
|
|
||||||
const options = {
|
|
||||||
peerInfo,
|
|
||||||
modules: {
|
|
||||||
transport: [ WS ],
|
|
||||||
peerDiscover: [ Bootstrap ]
|
|
||||||
},
|
|
||||||
config: {
|
|
||||||
EXPERIMENTAL: {
|
|
||||||
dht: true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
expect(() => validateConfig(options)).to.throw()
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
|
79
test/create.spec.js
Normal file
79
test/create.spec.js
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
/* eslint-env mocha */
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
const chai = require('chai')
|
||||||
|
chai.use(require('dirty-chai'))
|
||||||
|
const expect = chai.expect
|
||||||
|
const series = require('async/series')
|
||||||
|
const createNode = require('./utils/create-node')
|
||||||
|
const sinon = require('sinon')
|
||||||
|
|
||||||
|
describe('libp2p creation', () => {
|
||||||
|
it('should be able to start and stop successfully', (done) => {
|
||||||
|
createNode([], {
|
||||||
|
config: {
|
||||||
|
EXPERIMENTAL: {
|
||||||
|
dht: true,
|
||||||
|
pubsub: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, (err, node) => {
|
||||||
|
expect(err).to.not.exist()
|
||||||
|
|
||||||
|
let sw = node._switch
|
||||||
|
let cm = node.connectionManager
|
||||||
|
let dht = node._dht
|
||||||
|
let pub = node._floodSub
|
||||||
|
|
||||||
|
sinon.spy(sw, 'start')
|
||||||
|
sinon.spy(cm, 'start')
|
||||||
|
sinon.spy(dht, 'start')
|
||||||
|
sinon.spy(pub, 'start')
|
||||||
|
sinon.spy(sw, 'stop')
|
||||||
|
sinon.spy(cm, 'stop')
|
||||||
|
sinon.spy(dht, 'stop')
|
||||||
|
sinon.spy(pub, 'stop')
|
||||||
|
sinon.spy(node, 'emit')
|
||||||
|
|
||||||
|
series([
|
||||||
|
(cb) => node.start(cb),
|
||||||
|
(cb) => {
|
||||||
|
expect(sw.start.calledOnce).to.equal(true)
|
||||||
|
expect(cm.start.calledOnce).to.equal(true)
|
||||||
|
expect(dht.start.calledOnce).to.equal(true)
|
||||||
|
expect(pub.start.calledOnce).to.equal(true)
|
||||||
|
expect(node.emit.calledWith('start')).to.equal(true)
|
||||||
|
|
||||||
|
cb()
|
||||||
|
},
|
||||||
|
(cb) => node.stop(cb)
|
||||||
|
], (err) => {
|
||||||
|
expect(err).to.not.exist()
|
||||||
|
|
||||||
|
expect(sw.stop.calledOnce).to.equal(true)
|
||||||
|
expect(cm.stop.calledOnce).to.equal(true)
|
||||||
|
expect(dht.stop.calledOnce).to.equal(true)
|
||||||
|
expect(pub.stop.calledOnce).to.equal(true)
|
||||||
|
expect(node.emit.calledWith('stop')).to.equal(true)
|
||||||
|
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should not create disabled modules', (done) => {
|
||||||
|
createNode([], {
|
||||||
|
config: {
|
||||||
|
EXPERIMENTAL: {
|
||||||
|
dht: false,
|
||||||
|
pubsub: false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, (err, node) => {
|
||||||
|
expect(err).to.not.exist()
|
||||||
|
expect(node._dht).to.not.exist()
|
||||||
|
expect(node._floodSub).to.not.exist()
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
@ -1,5 +1,6 @@
|
|||||||
'use strict'
|
'use strict'
|
||||||
|
|
||||||
|
require('./pnet.node')
|
||||||
require('./transports.node')
|
require('./transports.node')
|
||||||
require('./stream-muxing.node')
|
require('./stream-muxing.node')
|
||||||
require('./peer-discovery.node')
|
require('./peer-discovery.node')
|
||||||
|
@ -4,8 +4,10 @@
|
|||||||
const chai = require('chai')
|
const chai = require('chai')
|
||||||
chai.use(require('dirty-chai'))
|
chai.use(require('dirty-chai'))
|
||||||
const expect = chai.expect
|
const expect = chai.expect
|
||||||
|
const sinon = require('sinon')
|
||||||
const signalling = require('libp2p-webrtc-star/src/sig-server')
|
const signalling = require('libp2p-webrtc-star/src/sig-server')
|
||||||
const parallel = require('async/parallel')
|
const parallel = require('async/parallel')
|
||||||
|
const crypto = require('crypto')
|
||||||
|
|
||||||
const createNode = require('./utils/create-node')
|
const createNode = require('./utils/create-node')
|
||||||
const echo = require('./utils/echo')
|
const echo = require('./utils/echo')
|
||||||
@ -57,12 +59,193 @@ describe('peer discovery', () => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
describe('module registration', () => {
|
||||||
|
it('should enable by default a module passed as an object', (done) => {
|
||||||
|
const mockDiscovery = {
|
||||||
|
on: sinon.stub(),
|
||||||
|
start: sinon.stub().callsArg(0),
|
||||||
|
stop: sinon.stub().callsArg(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
const options = { modules: { peerDiscovery: [ mockDiscovery ] } }
|
||||||
|
|
||||||
|
createNode(['/ip4/0.0.0.0/tcp/0'], options, (err, node) => {
|
||||||
|
expect(err).to.not.exist()
|
||||||
|
|
||||||
|
node.start((err) => {
|
||||||
|
expect(err).to.not.exist()
|
||||||
|
expect(mockDiscovery.start.called).to.be.true()
|
||||||
|
node.stop(done)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should enable by default a module passed as a function', (done) => {
|
||||||
|
const mockDiscovery = {
|
||||||
|
on: sinon.stub(),
|
||||||
|
start: sinon.stub().callsArg(0),
|
||||||
|
stop: sinon.stub().callsArg(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
const MockDiscovery = sinon.stub().returns(mockDiscovery)
|
||||||
|
|
||||||
|
const options = { modules: { peerDiscovery: [ MockDiscovery ] } }
|
||||||
|
|
||||||
|
createNode(['/ip4/0.0.0.0/tcp/0'], options, (err, node) => {
|
||||||
|
expect(err).to.not.exist()
|
||||||
|
|
||||||
|
node.start((err) => {
|
||||||
|
expect(err).to.not.exist()
|
||||||
|
expect(mockDiscovery.start.called).to.be.true()
|
||||||
|
node.stop(done)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should enable module by configutation', (done) => {
|
||||||
|
const mockDiscovery = {
|
||||||
|
on: sinon.stub(),
|
||||||
|
start: sinon.stub().callsArg(0),
|
||||||
|
stop: sinon.stub().callsArg(0),
|
||||||
|
tag: 'mockDiscovery'
|
||||||
|
}
|
||||||
|
|
||||||
|
const enabled = sinon.stub().returns(true)
|
||||||
|
|
||||||
|
const options = {
|
||||||
|
modules: { peerDiscovery: [ mockDiscovery ] },
|
||||||
|
config: {
|
||||||
|
peerDiscovery: {
|
||||||
|
mockDiscovery: {
|
||||||
|
get enabled () {
|
||||||
|
return enabled()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
createNode(['/ip4/0.0.0.0/tcp/0'], options, (err, node) => {
|
||||||
|
expect(err).to.not.exist()
|
||||||
|
|
||||||
|
node.start((err) => {
|
||||||
|
expect(err).to.not.exist()
|
||||||
|
expect(mockDiscovery.start.called).to.be.true()
|
||||||
|
expect(enabled.called).to.be.true()
|
||||||
|
node.stop(done)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should disable module by configutation', (done) => {
|
||||||
|
const mockDiscovery = {
|
||||||
|
on: sinon.stub(),
|
||||||
|
start: sinon.stub().callsArg(0),
|
||||||
|
stop: sinon.stub().callsArg(0),
|
||||||
|
tag: 'mockDiscovery'
|
||||||
|
}
|
||||||
|
|
||||||
|
const disabled = sinon.stub().returns(false)
|
||||||
|
|
||||||
|
const options = {
|
||||||
|
modules: { peerDiscovery: [ mockDiscovery ] },
|
||||||
|
config: {
|
||||||
|
peerDiscovery: {
|
||||||
|
mockDiscovery: {
|
||||||
|
get enabled () {
|
||||||
|
return disabled()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
createNode(['/ip4/0.0.0.0/tcp/0'], options, (err, node) => {
|
||||||
|
expect(err).to.not.exist()
|
||||||
|
|
||||||
|
node.start((err) => {
|
||||||
|
expect(err).to.not.exist()
|
||||||
|
expect(mockDiscovery.start.called).to.be.false()
|
||||||
|
expect(disabled.called).to.be.true()
|
||||||
|
node.stop(done)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should register module passed as function', (done) => {
|
||||||
|
const mockDiscovery = {
|
||||||
|
on: sinon.stub(),
|
||||||
|
start: sinon.stub().callsArg(0),
|
||||||
|
stop: sinon.stub().callsArg(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
const MockDiscovery = sinon.stub().returns(mockDiscovery)
|
||||||
|
MockDiscovery.tag = 'mockDiscovery'
|
||||||
|
|
||||||
|
const options = {
|
||||||
|
modules: { peerDiscovery: [ MockDiscovery ] },
|
||||||
|
config: {
|
||||||
|
peerDiscovery: {
|
||||||
|
mockDiscovery: {
|
||||||
|
enabled: true,
|
||||||
|
time: Date.now()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
createNode(['/ip4/0.0.0.0/tcp/0'], options, (err, node) => {
|
||||||
|
expect(err).to.not.exist()
|
||||||
|
|
||||||
|
node.start((err) => {
|
||||||
|
expect(err).to.not.exist()
|
||||||
|
expect(mockDiscovery.start.called).to.be.true()
|
||||||
|
expect(MockDiscovery.called).to.be.true()
|
||||||
|
// Ensure configuration was passed
|
||||||
|
expect(MockDiscovery.firstCall.args[0])
|
||||||
|
.to.deep.include(options.config.peerDiscovery.mockDiscovery)
|
||||||
|
node.stop(done)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should register module passed as object', (done) => {
|
||||||
|
const mockDiscovery = {
|
||||||
|
on: sinon.stub(),
|
||||||
|
start: sinon.stub().callsArg(0),
|
||||||
|
stop: sinon.stub().callsArg(0),
|
||||||
|
tag: 'mockDiscovery'
|
||||||
|
}
|
||||||
|
|
||||||
|
const options = {
|
||||||
|
modules: { peerDiscovery: [ mockDiscovery ] },
|
||||||
|
config: {
|
||||||
|
peerDiscovery: {
|
||||||
|
mockDiscovery: { enabled: true }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
createNode(['/ip4/0.0.0.0/tcp/0'], options, (err, node) => {
|
||||||
|
expect(err).to.not.exist()
|
||||||
|
|
||||||
|
node.start((err) => {
|
||||||
|
expect(err).to.not.exist()
|
||||||
|
expect(mockDiscovery.start.called).to.be.true()
|
||||||
|
node.stop(done)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
describe('MulticastDNS', () => {
|
describe('MulticastDNS', () => {
|
||||||
setup({
|
setup({
|
||||||
config: {
|
config: {
|
||||||
peerDiscovery: {
|
peerDiscovery: {
|
||||||
mdns: {
|
mdns: {
|
||||||
enabled: true
|
enabled: true,
|
||||||
|
// use a random tag to prevent CI collision
|
||||||
|
serviceTag: crypto.randomBytes(10).toString('hex')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -81,7 +264,15 @@ describe('peer discovery', () => {
|
|||||||
|
|
||||||
// TODO needs a delay (this test is already long)
|
// TODO needs a delay (this test is already long)
|
||||||
describe.skip('WebRTCStar', () => {
|
describe.skip('WebRTCStar', () => {
|
||||||
setup({ webRTCStar: true })
|
setup({
|
||||||
|
config: {
|
||||||
|
peerDiscovery: {
|
||||||
|
webRTCStar: {
|
||||||
|
enabled: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
it('find a peer', function (done) {
|
it('find a peer', function (done) {
|
||||||
this.timeout(15 * 1000)
|
this.timeout(15 * 1000)
|
||||||
@ -98,7 +289,9 @@ describe('peer discovery', () => {
|
|||||||
config: {
|
config: {
|
||||||
peerDiscovery: {
|
peerDiscovery: {
|
||||||
mdns: {
|
mdns: {
|
||||||
enabled: true
|
enabled: true,
|
||||||
|
// use a random tag to prevent CI collision
|
||||||
|
serviceTag: crypto.randomBytes(10).toString('hex')
|
||||||
},
|
},
|
||||||
webRTCStar: {
|
webRTCStar: {
|
||||||
enabled: true
|
enabled: true
|
||||||
|
90
test/pnet.node.js
Normal file
90
test/pnet.node.js
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
/* eslint-env mocha */
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
const chai = require('chai')
|
||||||
|
chai.use(require('dirty-chai'))
|
||||||
|
const expect = chai.expect
|
||||||
|
const PeerInfo = require('peer-info')
|
||||||
|
const PeerId = require('peer-id')
|
||||||
|
const waterfall = require('async/waterfall')
|
||||||
|
const WS = require('libp2p-websockets')
|
||||||
|
const defaultsDeep = require('@nodeutils/defaults-deep')
|
||||||
|
|
||||||
|
const Libp2p = require('../src')
|
||||||
|
|
||||||
|
describe('private network', () => {
|
||||||
|
let config
|
||||||
|
|
||||||
|
before((done) => {
|
||||||
|
waterfall([
|
||||||
|
(cb) => PeerId.create({ bits: 512 }, cb),
|
||||||
|
(peerId, cb) => PeerInfo.create(peerId, cb),
|
||||||
|
(peerInfo, cb) => {
|
||||||
|
config = {
|
||||||
|
peerInfo,
|
||||||
|
modules: {
|
||||||
|
transport: [ WS ]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cb()
|
||||||
|
}
|
||||||
|
], () => done())
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('enforced network protection', () => {
|
||||||
|
before(() => {
|
||||||
|
process.env.LIBP2P_FORCE_PNET = 1
|
||||||
|
})
|
||||||
|
|
||||||
|
after(() => {
|
||||||
|
delete process.env.LIBP2P_FORCE_PNET
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should throw an error without a provided protector', () => {
|
||||||
|
expect(() => {
|
||||||
|
return new Libp2p(config)
|
||||||
|
}).to.throw('Private network is enforced, but no protector was provided')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should create a libp2p node with a provided protector', () => {
|
||||||
|
let node
|
||||||
|
let protector = {
|
||||||
|
psk: '123',
|
||||||
|
tag: '/psk/1.0.0',
|
||||||
|
protect: () => { }
|
||||||
|
}
|
||||||
|
|
||||||
|
expect(() => {
|
||||||
|
let options = defaultsDeep(config, {
|
||||||
|
modules: {
|
||||||
|
connProtector: protector
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
node = new Libp2p(options)
|
||||||
|
return node
|
||||||
|
}).to.not.throw()
|
||||||
|
expect(node._switch.protector).to.deep.equal(protector)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should throw an error if the protector does not have a protect method', () => {
|
||||||
|
expect(() => {
|
||||||
|
let options = defaultsDeep(config, {
|
||||||
|
modules: {
|
||||||
|
connProtector: { }
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return new Libp2p(options)
|
||||||
|
}).to.throw()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('network protection not enforced', () => {
|
||||||
|
it('should not throw an error with no provided protector', () => {
|
||||||
|
expect(() => {
|
||||||
|
return new Libp2p(config)
|
||||||
|
}).to.not.throw()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
@ -78,6 +78,9 @@ class Node extends libp2p {
|
|||||||
active: false
|
active: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
dht: {
|
||||||
|
kBucketSize: 20
|
||||||
|
},
|
||||||
EXPERIMENTAL: {
|
EXPERIMENTAL: {
|
||||||
dht: false,
|
dht: false,
|
||||||
pubsub: false
|
pubsub: false
|
||||||
|
Reference in New Issue
Block a user