From 3c2a45a9d2062a38dee543b11ad72675c1dc79fd Mon Sep 17 00:00:00 2001
From: Jacob Heun
Date: Thu, 27 Aug 2020 18:13:38 +0200
Subject: [PATCH 001/447] docs: update examples for 0.29 (#742)
* docs: update examples for 0.29
* fix: update examples/libp2p-in-the-browser/package.json
Co-authored-by: Vasco Santos
Co-authored-by: Vasco Santos
---
examples/chat/src/stream.js | 2 +-
examples/libp2p-in-the-browser/package.json | 12 ++++++------
examples/pnet/README.md | 6 +-----
examples/pnet/package.json | 20 --------------------
4 files changed, 8 insertions(+), 32 deletions(-)
delete mode 100644 examples/pnet/package.json
diff --git a/examples/chat/src/stream.js b/examples/chat/src/stream.js
index de888dc74a..6c44abcbf4 100644
--- a/examples/chat/src/stream.js
+++ b/examples/chat/src/stream.js
@@ -29,7 +29,7 @@ function streamToConsole(stream) {
// For each chunk of data
for await (const msg of source) {
// Output the data as a utf8 string
- console.log('> ' + uint8ArrayToString(msg).replace('\n', ''))
+ console.log('> ' + msg.toString().replace('\n', ''))
}
}
)
diff --git a/examples/libp2p-in-the-browser/package.json b/examples/libp2p-in-the-browser/package.json
index 91f58823b5..6c8b212361 100644
--- a/examples/libp2p-in-the-browser/package.json
+++ b/examples/libp2p-in-the-browser/package.json
@@ -16,12 +16,12 @@
"dependencies": {
"@babel/preset-env": "^7.8.3",
"libp2p": "../../",
- "libp2p-bootstrap": "^0.11",
- "libp2p-mplex": "^0.9.3",
- "libp2p-noise": "^1.1.0",
- "libp2p-secio": "^0.12.2",
- "libp2p-webrtc-star": "^0.18.0",
- "libp2p-websockets": "^0.13.2"
+ "libp2p-bootstrap": "^0.12.1",
+ "libp2p-mplex": "^0.10.0",
+ "libp2p-noise": "^2.0.0",
+ "libp2p-secio": "^0.13.1",
+ "libp2p-webrtc-star": "^0.20.0",
+ "libp2p-websockets": "^0.14.0"
},
"devDependencies": {
"@babel/cli": "^7.8.3",
diff --git a/examples/pnet/README.md b/examples/pnet/README.md
index b7515e9619..b14f8f4ab6 100644
--- a/examples/pnet/README.md
+++ b/examples/pnet/README.md
@@ -2,11 +2,7 @@
This example shows how to set up a private network of libp2p nodes.
## Setup
-Install dependencies:
-
-```
-npm install
-```
+1. Install the modules in the libp2p root directory, `npm install`.
## Run
Running the example will cause two nodes with the same swarm key to be started and exchange basic information.
diff --git a/examples/pnet/package.json b/examples/pnet/package.json
deleted file mode 100644
index 4736ac77b6..0000000000
--- a/examples/pnet/package.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "name": "pnet-ipfs-example",
- "version": "1.0.0",
- "description": "An example of private networking with IPFS",
- "main": "index.js",
- "scripts": {
- "test": "echo \"Error: no test specified\" && exit 1",
- "start": "node index.js"
- },
- "keywords": [],
- "author": "",
- "license": "ISC",
- "dependencies": {
- "libp2p": "../..",
- "libp2p-mplex": "^0.9.3",
- "libp2p-noise": "^1.1.0",
- "libp2p-secio": "^0.12.1",
- "libp2p-tcp": "^0.14.2"
- }
-}
From bd26bde876bf8ec76d08ad199fd42e089a1e82ab Mon Sep 17 00:00:00 2001
From: Vasco Santos
Date: Mon, 31 Aug 2020 15:19:43 +0200
Subject: [PATCH 002/447] chore: remove libp2p-pubsub from package table (#743)
---
README.md | 1 -
package-list.json | 1 -
2 files changed, 2 deletions(-)
diff --git a/README.md b/README.md
index 9f94bc17ba..34bd8267cc 100644
--- a/README.md
+++ b/README.md
@@ -168,7 +168,6 @@ List of packages currently in existence for libp2p
| **data types** |
| [`peer-id`](//github.com/libp2p/js-peer-id) | [](//github.com/libp2p/js-peer-id/releases) | [](https://david-dm.org/libp2p/js-peer-id) | [](https://travis-ci.com/libp2p/js-peer-id) | [](https://codecov.io/gh/libp2p/js-peer-id) | [Vasco Santos](mailto:santos.vasco10@gmail.com) |
| **pubsub** |
-| [`libp2p-pubsub`](//github.com/libp2p/js-libp2p-pubsub) | [](//github.com/libp2p/js-libp2p-pubsub/releases) | [](https://david-dm.org/libp2p/js-libp2p-pubsub) | [](https://travis-ci.com/libp2p/js-libp2p-pubsub) | [](https://codecov.io/gh/libp2p/js-libp2p-pubsub) | [Vasco Santos](mailto:santos.vasco10@gmail.com) |
| [`libp2p-floodsub`](//github.com/libp2p/js-libp2p-floodsub) | [](//github.com/libp2p/js-libp2p-floodsub/releases) | [](https://david-dm.org/libp2p/js-libp2p-floodsub) | [](https://travis-ci.com/libp2p/js-libp2p-floodsub) | [](https://codecov.io/gh/libp2p/js-libp2p-floodsub) | [Vasco Santos](mailto:vasco.santos@moxy.studio) |
| [`libp2p-gossipsub`](//github.com/ChainSafe/js-libp2p-gossipsub) | [](//github.com/ChainSafe/js-libp2p-gossipsub/releases) | [](https://david-dm.org/ChainSafe/js-libp2p-gossipsub) | [](https://travis-ci.com/ChainSafe/js-libp2p-gossipsub) | [](https://codecov.io/gh/ChainSafe/js-libp2p-gossipsub) | [Cayman Nava](mailto:caymannava@gmail.com) |
| **extensions** |
diff --git a/package-list.json b/package-list.json
index e9b9409ec8..84c648a971 100644
--- a/package-list.json
+++ b/package-list.json
@@ -51,7 +51,6 @@
["libp2p/js-peer-id", "peer-id"],
"pubsub",
- ["libp2p/js-libp2p-pubsub", "libp2p-pubsub"],
["libp2p/js-libp2p-floodsub", "libp2p-floodsub"],
["ChainSafe/js-libp2p-gossipsub", "libp2p-gossipsub"],
From 63ba2f8fa355566c3a5e14661ffa30df4a3aad69 Mon Sep 17 00:00:00 2001
From: Vasco Santos
Date: Tue, 8 Sep 2020 14:07:06 +0200
Subject: [PATCH 003/447] chore: update docs after secio deprecation
announcement (#745)
---
doc/API.md | 2 +-
doc/CONFIGURATION.md | 58 +++++++++++++++++++++---------------------
doc/GETTING_STARTED.md | 12 ++++-----
3 files changed, 36 insertions(+), 36 deletions(-)
diff --git a/doc/API.md b/doc/API.md
index a72a2fa1da..4b412dd97b 100644
--- a/doc/API.md
+++ b/doc/API.md
@@ -2,7 +2,7 @@
* [Static Functions](#static-functions)
* [`create`](#create)
-* [Instance Methods](#instance-methods)
+* [Instance Methods](#libp2p-instance-methods)
* [`start`](#start)
* [`stop`](#stop)
* [`dial`](#dial)
diff --git a/doc/CONFIGURATION.md b/doc/CONFIGURATION.md
index 1ea9d7cb43..4c219481ee 100644
--- a/doc/CONFIGURATION.md
+++ b/doc/CONFIGURATION.md
@@ -98,7 +98,7 @@ If you want to know more about libp2p stream multiplexing, you should read the f
Some available connection encryption protocols:
- [NodeFactoryIo/js-libp2p-noise](https://github.com/NodeFactoryIo/js-libp2p-noise)
-- [libp2p/js-libp2p-secio](https://github.com/libp2p/js-libp2p-secio)
+- [libp2p/js-libp2p-secio](https://github.com/libp2p/js-libp2p-secio) ⚠️ [DEPRECATED](https://blog.ipfs.io/2020-08-07-deprecating-secio)
If none of the available connection encryption mechanisms fulfills your needs, you can create a libp2p compatible one. A libp2p connection encryption protocol just needs to be compliant with the [Crypto Interface](https://github.com/libp2p/js-interfaces/tree/master/src/crypto).
@@ -232,7 +232,7 @@ const Libp2p = require('libp2p')
const TCP = require('libp2p-tcp')
const WS = require('libp2p-websockets')
const MPLEX = require('libp2p-mplex')
-const SECIO = require('libp2p-secio')
+const { NOISE } = require('libp2p-noise')
const MulticastDNS = require('libp2p-mdns')
const DHT = require('libp2p-kad-dht')
const GossipSub = require('libp2p-gossipsub')
@@ -244,7 +244,7 @@ const node = await Libp2p.create({
new WS() // It can take instances too!
],
streamMuxer: [MPLEX],
- connEncryption: [SECIO],
+ connEncryption: [NOISE],
peerDiscovery: [MulticastDNS],
dht: DHT,
pubsub: GossipSub
@@ -258,14 +258,14 @@ const node = await Libp2p.create({
const Libp2p = require('libp2p')
const TCP = require('libp2p-tcp')
const MPLEX = require('libp2p-mplex')
-const SECIO = require('libp2p-secio')
+const { NOISE } = require('libp2p-noise')
const MulticastDNS = require('libp2p-mdns')
const node = await Libp2p.create({
modules: {
transport: [TCP],
streamMuxer: [MPLEX],
- connEncryption: [SECIO],
+ connEncryption: [NOISE],
peerDiscovery: [MulticastDNS]
},
config: {
@@ -291,7 +291,7 @@ const Libp2p = require('libp2p')
const WS = require('libp2p-websockets')
const WebRTCStar = require('libp2p-webrtc-star')
const MPLEX = require('libp2p-mplex')
-const SECIO = require('libp2p-secio')
+const { NOISE } = require('libp2p-noise')
const node = await Libp2p.create({
modules: {
@@ -300,7 +300,7 @@ const node = await Libp2p.create({
WebRTCStar
],
streamMuxer: [MPLEX],
- connEncryption: [SECIO],
+ connEncryption: [NOISE],
},
config: {
peerDiscovery: {
@@ -318,14 +318,14 @@ const node = await Libp2p.create({
const Libp2p = require('libp2p')
const TCP = require('libp2p-tcp')
const MPLEX = require('libp2p-mplex')
-const SECIO = require('libp2p-secio')
+const { NOISE } = require('libp2p-noise')
const GossipSub = require('libp2p-gossipsub')
const node = await Libp2p.create({
modules: {
transport: [TCP],
streamMuxer: [MPLEX],
- connEncryption: [SECIO],
+ connEncryption: [NOISE],
pubsub: GossipSub
},
config: {
@@ -345,14 +345,14 @@ const node = await Libp2p.create({
const Libp2p = require('libp2p')
const TCP = require('libp2p-tcp')
const MPLEX = require('libp2p-mplex')
-const SECIO = require('libp2p-secio')
+const { NOISE } = require('libp2p-noise')
const DHT = require('libp2p-kad-dht')
const node = await Libp2p.create({
modules: {
transport: [TCP],
streamMuxer: [MPLEX],
- connEncryption: [SECIO],
+ connEncryption: [NOISE],
dht: DHT
},
config: {
@@ -375,7 +375,7 @@ const node = await Libp2p.create({
const Libp2p = require('libp2p')
const TCP = require('libp2p-tcp')
const MPLEX = require('libp2p-mplex')
-const SECIO = require('libp2p-secio')
+const { NOISE } = require('libp2p-noise')
const DelegatedPeerRouter = require('libp2p-delegated-peer-routing')
const DelegatedContentRouter = require('libp2p-delegated-content-routing')
const PeerId = require('peer-id')
@@ -387,7 +387,7 @@ const node = await Libp2p.create({
modules: {
transport: [TCP],
streamMuxer: [MPLEX],
- connEncryption: [SECIO],
+ connEncryption: [NOISE],
contentRouting: [
new DelegatedContentRouter(peerId)
],
@@ -405,13 +405,13 @@ const node = await Libp2p.create({
const Libp2p = require('libp2p')
const TCP = require('libp2p-tcp')
const MPLEX = require('libp2p-mplex')
-const SECIO = require('libp2p-secio')
+const { NOISE } = require('libp2p-noise')
const node = await Libp2p.create({
modules: {
transport: [TCP],
streamMuxer: [MPLEX],
- connEncryption: [SECIO]
+ connEncryption: [NOISE]
},
config: {
relay: { // Circuit Relay options (this config is part of libp2p core configurations)
@@ -438,14 +438,14 @@ Libp2p allows you to setup a secure keychain to manage your keys. The keychain c
const Libp2p = require('libp2p')
const TCP = require('libp2p-tcp')
const MPLEX = require('libp2p-mplex')
-const SECIO = require('libp2p-secio')
+const { NOISE } = require('libp2p-noise')
const LevelStore = require('datastore-level')
const node = await Libp2p.create({
modules: {
transport: [TCP],
streamMuxer: [MPLEX],
- connEncryption: [SECIO]
+ connEncryption: [NOISE]
},
keychain: {
pass: 'notsafepassword123456789',
@@ -472,13 +472,13 @@ The below configuration example shows how the dialer should be configured, with
const Libp2p = require('libp2p')
const TCP = require('libp2p-tcp')
const MPLEX = require('libp2p-mplex')
-const SECIO = require('libp2p-secio')
+const { NOISE } = require('libp2p-noise')
const node = await Libp2p.create({
modules: {
transport: [TCP],
streamMuxer: [MPLEX],
- connEncryption: [SECIO]
+ connEncryption: [NOISE]
},
dialer: {
maxParallelDials: 100,
@@ -495,13 +495,13 @@ The Connection Manager prunes Connections in libp2p whenever certain limits are
const Libp2p = require('libp2p')
const TCP = require('libp2p-tcp')
const MPLEX = require('libp2p-mplex')
-const SECIO = require('libp2p-secio')
+const { NOISE } = require('libp2p-noise')
const node = await Libp2p.create({
modules: {
transport: [TCP],
streamMuxer: [MPLEX],
- connEncryption: [SECIO]
+ connEncryption: [NOISE]
},
connectionManager: {
maxConnections: Infinity,
@@ -526,7 +526,7 @@ The Transport Manager is responsible for managing the libp2p transports life cyc
const Libp2p = require('libp2p')
const TCP = require('libp2p-tcp')
const MPLEX = require('libp2p-mplex')
-const SECIO = require('libp2p-secio')
+const { NOISE } = require('libp2p-noise')
const { FaultTolerance } = require('libp2p/src/transport-manager')}
@@ -534,7 +534,7 @@ const node = await Libp2p.create({
modules: {
transport: [TCP],
streamMuxer: [MPLEX],
- connEncryption: [SECIO]
+ connEncryption: [NOISE]
},
transportManager: {
faultTolerance: FaultTolerance.NO_FATAL
@@ -560,13 +560,13 @@ The below configuration example shows how the metrics should be configured. Asid
const Libp2p = require('libp2p')
const TCP = require('libp2p-tcp')
const MPLEX = require('libp2p-mplex')
-const SECIO = require('libp2p-secio')
+const { NOISE } = require('libp2p-noise')
const node = await Libp2p.create({
modules: {
transport: [TCP],
streamMuxer: [MPLEX],
- connEncryption: [SECIO]
+ connEncryption: [NOISE]
},
metrics: {
enabled: true,
@@ -599,7 +599,7 @@ The below configuration example shows how the PeerStore should be configured. As
const Libp2p = require('libp2p')
const TCP = require('libp2p-tcp')
const MPLEX = require('libp2p-mplex')
-const SECIO = require('libp2p-secio')
+const { NOISE } = require('libp2p-noise')
const LevelStore = require('datastore-level')
@@ -607,7 +607,7 @@ const node = await Libp2p.create({
modules: {
transport: [TCP],
streamMuxer: [MPLEX],
- connEncryption: [SECIO]
+ connEncryption: [NOISE]
},
datastore: new LevelStore('path/to/store'),
peerStore: {
@@ -625,7 +625,7 @@ Some Transports can be passed additional options when they are created. For exam
const Libp2p = require('libp2p')
const WebRTCStar = require('libp2p-webrtc-star')
const MPLEX = require('libp2p-mplex')
-const SECIO = require('libp2p-secio')
+const { NOISE } = require('libp2p-noise')
const wrtc = require('wrtc')
const transportKey = WebRTCStar.prototype[Symbol.toStringTag]
@@ -633,7 +633,7 @@ const node = await Libp2p.create({
modules: {
transport: [WebRTCStar],
streamMuxer: [MPLEX],
- connEncryption: [SECIO]
+ connEncryption: [NOISE]
},
config: {
transport: {
diff --git a/doc/GETTING_STARTED.md b/doc/GETTING_STARTED.md
index 8b50efd7e0..0e280b2236 100644
--- a/doc/GETTING_STARTED.md
+++ b/doc/GETTING_STARTED.md
@@ -112,13 +112,13 @@ npm install libp2p-mplex
```js
const Libp2p = require('libp2p')
const WebSockets = require('libp2p-websockets')
-const SECIO = require('libp2p-secio')
+const { NOISE } = require('libp2p-noise')
const MPLEX = require('libp2p-mplex')
const node = await Libp2p.create({
modules: {
transport: [WebSockets],
- connEncryption: [SECIO],
+ connEncryption: [NOISE],
streamMuxer: [MPLEX]
}
})
@@ -139,7 +139,7 @@ Now that you have configured a [**Transport**][transport], [**Crypto**][crypto]
```js
const Libp2p = require('libp2p')
const WebSockets = require('libp2p-websockets')
-const SECIO = require('libp2p-secio')
+const { NOISE } = require('libp2p-noise')
const MPLEX = require('libp2p-mplex')
const node = await Libp2p.create({
@@ -148,7 +148,7 @@ const node = await Libp2p.create({
},
modules: {
transport: [WebSockets],
- connEncryption: [SECIO],
+ connEncryption: [NOISE],
streamMuxer: [MPLEX]
}
})
@@ -197,7 +197,7 @@ We can provide specific configurations for each protocol within a `config.peerDi
```js
const Libp2p = require('libp2p')
const WebSockets = require('libp2p-websockets')
-const SECIO = require('libp2p-secio')
+const { NOISE } = require('libp2p-noise')
const MPLEX = require('libp2p-mplex')
const Bootstrap = require('libp2p-bootstrap')
@@ -211,7 +211,7 @@ const bootstrapMultiaddrs = [
const node = await Libp2p.create({
modules: {
transport: [WebSockets],
- connEncryption: [SECIO],
+ connEncryption: [NOISE],
streamMuxer: [MPLEX],
peerDiscovery: [Bootstrap]
},
From 58b793d700a86e273e7cc8e58f9fd9eb7dc2723c Mon Sep 17 00:00:00 2001
From: Vasco Santos
Date: Tue, 8 Sep 2020 14:47:25 +0200
Subject: [PATCH 004/447] chore: add libp2p examples repo to release checklist
(#746)
---
RELEASE.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/RELEASE.md b/RELEASE.md
index c121b91aa6..6ad0393da2 100644
--- a/RELEASE.md
+++ b/RELEASE.md
@@ -26,6 +26,7 @@
- Documentation
- [ ] Ensure that README.md is up to date
- [ ] Ensure that all the examples run
+ - [ ] Ensure [libp2p/js-libp2p-examples](https://github.com/libp2p/js-libp2p-examples) is updated
- [ ] Ensure that [libp2p/docs](https://github.com/libp2p/docs) is updated
- Communication
- [ ] Create the release issue
From 0087218194579433bdf1a3409d46c2a2e9aa55c3 Mon Sep 17 00:00:00 2001
From: Vasco Santos
Date: Mon, 14 Sep 2020 13:23:28 +0200
Subject: [PATCH 005/447] chore: update getting started connect event (#752)
---
doc/GETTING_STARTED.md | 6 +++---
examples/libp2p-in-the-browser/index.js | 8 +++++---
2 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/doc/GETTING_STARTED.md b/doc/GETTING_STARTED.md
index 0e280b2236..e7398cc1d7 100644
--- a/doc/GETTING_STARTED.md
+++ b/doc/GETTING_STARTED.md
@@ -232,9 +232,9 @@ node.on('peer:discovery', (peer) => {
console.log('Discovered %s', peer.id.toB58String()) // Log discovered peer
})
-node.on('peer:connect', (peer) => {
- console.log('Connected to %s', peer.id.toB58String()) // Log connected peer
- })
+node.connectionManager.on('peer:connect', (connection) => {
+ console.log('Connected to %s', connection.remotePeer.toB58String()) // Log connected peer
+})
// start libp2p
await node.start()
diff --git a/examples/libp2p-in-the-browser/index.js b/examples/libp2p-in-the-browser/index.js
index 7403224907..dcd8b8da37 100644
--- a/examples/libp2p-in-the-browser/index.js
+++ b/examples/libp2p-in-the-browser/index.js
@@ -5,7 +5,7 @@ import WebRTCStar from 'libp2p-webrtc-star'
import { NOISE } from 'libp2p-noise'
import Secio from 'libp2p-secio'
import Mplex from 'libp2p-mplex'
-import Boostrap from 'libp2p-bootstrap'
+import Bootstrap from 'libp2p-bootstrap'
document.addEventListener('DOMContentLoaded', async () => {
// Create our libp2p node
@@ -23,11 +23,13 @@ document.addEventListener('DOMContentLoaded', async () => {
transport: [Websockets, WebRTCStar],
connEncryption: [NOISE, Secio],
streamMuxer: [Mplex],
- peerDiscovery: [Boostrap]
+ peerDiscovery: [Bootstrap]
},
config: {
peerDiscovery: {
- bootstrap: {
+ // The `tag` property will be searched when creating the instance of your Peer Discovery service.
+ // The associated object, will be passed to the service when it is instantiated.
+ [Bootstrap.tag]: {
enabled: true,
list: [
'/dns4/ams-1.bootstrap.libp2p.io/tcp/443/wss/p2p/QmSoLer265NRgSp2LA3dPaeykiS1J6DifTC88f5uVQKNAd',
From fb4b2734d3ce15572170fa01171a6b0516831908 Mon Sep 17 00:00:00 2001
From: Vasco Santos
Date: Tue, 15 Sep 2020 12:47:16 +0200
Subject: [PATCH 006/447] chore: update delegate deps (#753)
---
package.json | 6 +++---
test/content-routing/content-routing.node.js | 9 +++++----
test/peer-routing/peer-routing.node.js | 9 +++++----
3 files changed, 13 insertions(+), 11 deletions(-)
diff --git a/package.json b/package.json
index f19b862285..86becc1c52 100644
--- a/package.json
+++ b/package.json
@@ -93,14 +93,14 @@
"delay": "^4.3.0",
"dirty-chai": "^2.0.1",
"interop-libp2p": "^0.3.0",
- "ipfs-http-client": "^46.0.0",
+ "ipfs-http-client": "^47.0.1",
"it-concat": "^1.0.0",
"it-pair": "^1.0.0",
"it-pushable": "^1.4.0",
"libp2p": ".",
"libp2p-bootstrap": "^0.12.0",
- "libp2p-delegated-content-routing": "^0.6.0",
- "libp2p-delegated-peer-routing": "^0.6.0",
+ "libp2p-delegated-content-routing": "^0.7.0",
+ "libp2p-delegated-peer-routing": "^0.7.0",
"libp2p-floodsub": "^0.23.0",
"libp2p-gossipsub": "^0.6.0",
"libp2p-kad-dht": "^0.20.0",
diff --git a/test/content-routing/content-routing.node.js b/test/content-routing/content-routing.node.js
index adda6c1370..17850e9924 100644
--- a/test/content-routing/content-routing.node.js
+++ b/test/content-routing/content-routing.node.js
@@ -12,6 +12,7 @@ const pDefer = require('p-defer')
const mergeOptions = require('merge-options')
const CID = require('cids')
+const ipfsHttpClient = require('ipfs-http-client')
const DelegatedContentRouter = require('libp2p-delegated-content-routing')
const multiaddr = require('multiaddr')
@@ -99,11 +100,11 @@ describe('content-routing', () => {
beforeEach(async () => {
const [peerId] = await peerUtils.createPeerId({ fixture: true })
- delegate = new DelegatedContentRouter(peerId, {
+ delegate = new DelegatedContentRouter(peerId, ipfsHttpClient({
host: '0.0.0.0',
protocol: 'http',
port: 60197
- }, [
+ }), [
multiaddr('/ip4/0.0.0.0/tcp/60197')
])
@@ -230,11 +231,11 @@ describe('content-routing', () => {
beforeEach(async () => {
const [peerId] = await peerUtils.createPeerId({ fixture: true })
- delegate = new DelegatedContentRouter(peerId, {
+ delegate = new DelegatedContentRouter(peerId, ipfsHttpClient({
host: '0.0.0.0',
protocol: 'http',
port: 60197
- }, [
+ }), [
multiaddr('/ip4/0.0.0.0/tcp/60197')
])
diff --git a/test/peer-routing/peer-routing.node.js b/test/peer-routing/peer-routing.node.js
index f29ff3f7c6..105ef6148f 100644
--- a/test/peer-routing/peer-routing.node.js
+++ b/test/peer-routing/peer-routing.node.js
@@ -10,6 +10,7 @@ const sinon = require('sinon')
const pDefer = require('p-defer')
const mergeOptions = require('merge-options')
+const ipfsHttpClient = require('ipfs-http-client')
const DelegatedPeerRouter = require('libp2p-delegated-peer-routing')
const peerUtils = require('../utils/creators/peer')
@@ -72,11 +73,11 @@ describe('peer-routing', () => {
let delegate
beforeEach(async () => {
- delegate = new DelegatedPeerRouter({
+ delegate = new DelegatedPeerRouter(ipfsHttpClient({
host: '0.0.0.0',
protocol: 'http',
port: 60197
- })
+ }))
;[node] = await peerUtils.createPeer({
config: mergeOptions(baseOptions, {
@@ -162,11 +163,11 @@ describe('peer-routing', () => {
let delegate
beforeEach(async () => {
- delegate = new DelegatedPeerRouter({
+ delegate = new DelegatedPeerRouter(ipfsHttpClient({
host: '0.0.0.0',
protocol: 'http',
port: 60197
- })
+ }))
;[node] = await peerUtils.createPeer({
config: mergeOptions(routingOptions, {
From bb59b518f142065d9f40852aa9089d73ac7a7cdc Mon Sep 17 00:00:00 2001
From: Vasco Santos
Date: Wed, 16 Sep 2020 15:46:05 +0200
Subject: [PATCH 007/447] chore: complement 0.29 migration for pubsub subscribe
(#755)
* chore: complement 0.29 migration for pubsub subscribe
* chore: update doc/migrations/v0.28-v0.29.md
Co-authored-by: Jacob Heun
---
doc/migrations/v0.28-v0.29.md | 30 ++++++++++++++++++++++++++++++
1 file changed, 30 insertions(+)
diff --git a/doc/migrations/v0.28-v0.29.md b/doc/migrations/v0.28-v0.29.md
index 9eb2d6d71d..131b97ae8a 100644
--- a/doc/migrations/v0.28-v0.29.md
+++ b/doc/migrations/v0.28-v0.29.md
@@ -90,6 +90,36 @@ libp2p.pubsub.on(topic, handler)
libp2p.pubsub.subscribe(topic)
```
+In the latest release, despite not being documented in `libp2p` the underlying pubsub routers supported subscribing to multiple topics at the same time. We removed that code complexity, since this is easily achieved in the application layer if needed.
+
+**Before**
+
+```js
+const topics = ['a', 'b']
+const handler = (msg) => {
+ // msg.data - pubsub data received
+ const data = msg.data.toString()
+}
+libp2p.pubsub.subscribe(topics, handler)
+```
+
+**After**
+
+```js
+const uint8ArrayToString = require('uint8arrays/to-string')
+
+const topics = ['a', 'b']
+const handler = (msg) => {
+ // msg.data - pubsub data received
+ const data = uint8ArrayToString(msg.data)
+}
+
+topics.forEach((topic) => {
+ libp2p.pubsub.on(topic, handler)
+ libp2p.pubsub.subscribe(topic)
+})
+```
+
#### Unsubscribe
Handlers should not be directly bound to the subscription anymore.
From 96df4b7dc466084d7d7a320f81122fecef232eb1 Mon Sep 17 00:00:00 2001
From: Vasco Santos
Date: Tue, 6 Oct 2020 14:59:43 +0200
Subject: [PATCH 008/447] chore: update aegir and jsdocs for eslint changes
(#773)
---
package.json | 2 +-
src/address-manager/index.js | 17 +++---
src/circuit/circuit/hop.js | 8 ++-
src/circuit/circuit/stop.js | 5 +-
src/circuit/circuit/stream-handler.js | 7 ++-
src/circuit/circuit/utils.js | 2 +-
src/circuit/index.js | 4 +-
src/circuit/listener.js | 18 +++---
src/connection-manager/index.js | 47 +++++++++-----
src/connection-manager/latency-monitor.js | 61 ++++++++++---------
.../visibility-change-emitter.js | 49 ++++++++-------
src/content-routing.js | 9 ++-
src/dialer/dial-request.js | 3 +-
src/dialer/index.js | 19 +++---
src/get-peer.js | 2 +-
src/identify/index.js | 17 ++++--
src/index.js | 27 ++++++--
src/keychain/index.js | 16 ++---
src/keychain/util.js | 2 +-
src/metrics/index.js | 24 +++++---
src/metrics/old-peers.js | 2 +-
src/metrics/stats.js | 4 +-
src/peer-routing.js | 4 +-
src/peer-store/address-book.js | 44 ++++++++-----
src/peer-store/book.js | 26 +++++---
src/peer-store/index.js | 9 ++-
src/peer-store/key-book.js | 15 +++--
src/peer-store/metadata-book.js | 18 ++++--
src/peer-store/persistent/index.js | 32 +++++++---
src/peer-store/proto-book.js | 10 ++-
src/ping/index.js | 5 +-
src/pnet/crypto.js | 12 ++--
src/pnet/index.js | 6 +-
src/pnet/key-generator.js | 3 +-
src/pubsub-adapter.js | 2 +
src/record/envelope/index.js | 39 +++++++-----
src/record/peer-record/index.js | 17 +++---
src/registrar.js | 14 +++--
src/transport-manager.js | 20 ++++--
src/upgrader.js | 38 +++++++-----
test/utils/creators/peer.js | 18 +++---
test/utils/mockConnection.js | 6 +-
test/utils/mockMultiaddrConn.js | 5 +-
43 files changed, 425 insertions(+), 263 deletions(-)
diff --git a/package.json b/package.json
index 86becc1c52..c4a7f7dd7b 100644
--- a/package.json
+++ b/package.json
@@ -84,7 +84,7 @@
"devDependencies": {
"@nodeutils/defaults-deep": "^1.1.0",
"abortable-iterator": "^3.0.0",
- "aegir": "^26.0.0",
+ "aegir": "^27.0.0",
"chai": "^4.2.0",
"chai-as-promised": "^7.1.1",
"chai-bytes": "^0.1.2",
diff --git a/src/address-manager/index.js b/src/address-manager/index.js
index e15279367b..0ba0df03c3 100644
--- a/src/address-manager/index.js
+++ b/src/address-manager/index.js
@@ -15,11 +15,11 @@ const multiaddr = require('multiaddr')
*/
class AddressManager {
/**
- * @constructor
+ * @class
* @param {object} [options]
- * @param {Array} [options.listen = []] list of multiaddrs string representation to listen.
- * @param {Array} [options.announce = []] list of multiaddrs string representation to announce.
- * @param {Array} [options.noAnnounce = []] list of multiaddrs string representation to not announce.
+ * @param {Array} [options.listen = []] - list of multiaddrs string representation to listen.
+ * @param {Array} [options.announce = []] - list of multiaddrs string representation to announce.
+ * @param {Array} [options.noAnnounce = []] - list of multiaddrs string representation to not announce.
*/
constructor ({ listen = [], announce = [], noAnnounce = [] } = {}) {
this.listen = new Set(listen)
@@ -29,7 +29,8 @@ class AddressManager {
/**
* Get peer listen multiaddrs.
- * @return {Array}
+ *
+ * @returns {Array}
*/
getListenAddrs () {
return Array.from(this.listen).map((a) => multiaddr(a))
@@ -37,7 +38,8 @@ class AddressManager {
/**
* Get peer announcing multiaddrs.
- * @return {Array}
+ *
+ * @returns {Array}
*/
getAnnounceAddrs () {
return Array.from(this.announce).map((a) => multiaddr(a))
@@ -45,7 +47,8 @@ class AddressManager {
/**
* Get peer noAnnouncing multiaddrs.
- * @return {Array}
+ *
+ * @returns {Array}
*/
getNoAnnounceAddrs () {
return Array.from(this.noAnnounce).map((a) => multiaddr(a))
diff --git a/src/circuit/circuit/hop.js b/src/circuit/circuit/hop.js
index c8ac0fddb0..f497f33a32 100644
--- a/src/circuit/circuit/hop.js
+++ b/src/circuit/circuit/hop.js
@@ -90,9 +90,8 @@ module.exports.handleHop = async function handleHop ({
* peer. A new, virtual, connection will be created between the two via the relay.
*
* @param {object} options
- * @param {Connection} options.connection Connection to the relay
+ * @param {Connection} options.connection - Connection to the relay
* @param {*} options.request
- * @param {Circuit} options.circuit
* @returns {Promise}
*/
module.exports.hop = async function hop ({
@@ -119,6 +118,11 @@ module.exports.hop = async function hop ({
/**
* Creates an unencoded CAN_HOP response based on the Circuits configuration
+ *
+ * @param {Object} options
+ * @param {Connection} options.connection
+ * @param {StreamHandler} options.streamHandler
+ * @param {Circuit} options.circuit
* @private
*/
module.exports.handleCanHop = function handleCanHop ({
diff --git a/src/circuit/circuit/stop.js b/src/circuit/circuit/stop.js
index ef4ca3d1dd..77eaa1fcc2 100644
--- a/src/circuit/circuit/stop.js
+++ b/src/circuit/circuit/stop.js
@@ -15,7 +15,7 @@ log.error = debug('libp2p:circuit:stop:error')
* @private
* @param {*} options
* @param {Connection} options.connection
- * @param {*} options.request The CircuitRelay protobuf request (unencoded)
+ * @param {*} options.request - The CircuitRelay protobuf request (unencoded)
* @param {StreamHandler} options.streamHandler
* @returns {Promise<*>} Resolves a duplex iterable
*/
@@ -42,10 +42,11 @@ module.exports.handleStop = function handleStop ({
/**
* Creates a STOP request
+ *
* @private
* @param {*} options
* @param {Connection} options.connection
- * @param {*} options.request The CircuitRelay protobuf request (unencoded)
+ * @param {*} options.request - The CircuitRelay protobuf request (unencoded)
* @returns {Promise<*>} Resolves a duplex iterable
*/
module.exports.stop = async function stop ({
diff --git a/src/circuit/circuit/stream-handler.js b/src/circuit/circuit/stream-handler.js
index 5fd8b6389a..8b8ecf89bc 100644
--- a/src/circuit/circuit/stream-handler.js
+++ b/src/circuit/circuit/stream-handler.js
@@ -14,7 +14,7 @@ class StreamHandler {
*
* @param {object} options
* @param {*} options.stream - A duplex iterable
- * @param {Number} options.maxLength - max bytes length of message
+ * @param {number} options.maxLength - max bytes length of message
*/
constructor ({ stream, maxLength = 4096 }) {
this.stream = stream
@@ -25,6 +25,7 @@ class StreamHandler {
/**
* Read and decode message
+ *
* @async
* @returns {void}
*/
@@ -44,7 +45,7 @@ class StreamHandler {
/**
* Encode and write array of buffers
*
- * @param {*} msg An unencoded CircuitRelay protobuf message
+ * @param {*} msg - An unencoded CircuitRelay protobuf message
*/
write (msg) {
log('write message type %s', msg.type)
@@ -54,7 +55,7 @@ class StreamHandler {
/**
* Return the handshake rest stream and invalidate handler
*
- * @return {*} A duplex iterable
+ * @returns {*} A duplex iterable
*/
rest () {
this.shake.rest()
diff --git a/src/circuit/circuit/utils.js b/src/circuit/circuit/utils.js
index 8e87851d21..be7ab35a73 100644
--- a/src/circuit/circuit/utils.js
+++ b/src/circuit/circuit/utils.js
@@ -19,7 +19,7 @@ function writeResponse (streamHandler, status) {
/**
* Validate incomming HOP/STOP message
*
- * @param {*} msg A CircuitRelay unencoded protobuf message
+ * @param {*} msg - A CircuitRelay unencoded protobuf message
* @param {StreamHandler} streamHandler
*/
function validateAddrs (msg, streamHandler) {
diff --git a/src/circuit/index.js b/src/circuit/index.js
index baf10e370e..15746c907c 100644
--- a/src/circuit/index.js
+++ b/src/circuit/index.js
@@ -21,7 +21,7 @@ class Circuit {
/**
* Creates an instance of Circuit.
*
- * @constructor
+ * @class
* @param {object} options
* @param {Libp2p} options.libp2p
* @param {Upgrader} options.upgrader
@@ -152,7 +152,7 @@ class Circuit {
*
* @param {any} options
* @param {Function} handler
- * @return {listener}
+ * @returns {listener}
*/
createListener (options, handler) {
if (typeof options === 'function') {
diff --git a/src/circuit/listener.js b/src/circuit/listener.js
index 055b4ef3d4..76870501dc 100644
--- a/src/circuit/listener.js
+++ b/src/circuit/listener.js
@@ -19,7 +19,7 @@ module.exports = (circuit) => {
* Add swarm handler and listen for incoming connections
*
* @param {Multiaddr} addr
- * @return {void}
+ * @returns {void}
*/
listener.listen = async (addr) => {
const addrString = String(addr).split('/p2p-circuit').find(a => a !== '')
@@ -34,7 +34,7 @@ module.exports = (circuit) => {
/**
* TODO: Remove the peers from our topology
*
- * @return {void}
+ * @returns {void}
*/
listener.close = () => {}
@@ -44,15 +44,15 @@ module.exports = (circuit) => {
* NOTE: This method will grab the peers multiaddrs and expand them such that:
*
* a) If it's an existing /p2p-circuit address for a specific relay i.e.
- * `/ip4/0.0.0.0/tcp/0/ipfs/QmRelay/p2p-circuit` this method will expand the
- * address to `/ip4/0.0.0.0/tcp/0/ipfs/QmRelay/p2p-circuit/ipfs/QmPeer` where
- * `QmPeer` is this peers id
+ * `/ip4/0.0.0.0/tcp/0/ipfs/QmRelay/p2p-circuit` this method will expand the
+ * address to `/ip4/0.0.0.0/tcp/0/ipfs/QmRelay/p2p-circuit/ipfs/QmPeer` where
+ * `QmPeer` is this peers id
* b) If it's not a /p2p-circuit address, it will encapsulate the address as a /p2p-circuit
- * addr, such when dialing over a relay with this address, it will create the circuit using
- * the encapsulated transport address. This is useful when for example, a peer should only
- * be dialed over TCP rather than any other transport
+ * addr, such when dialing over a relay with this address, it will create the circuit using
+ * the encapsulated transport address. This is useful when for example, a peer should only
+ * be dialed over TCP rather than any other transport
*
- * @return {Multiaddr[]}
+ * @returns {Multiaddr[]}
*/
listener.getAddrs = () => {
const addrs = []
diff --git a/src/connection-manager/index.js b/src/connection-manager/index.js
index d16878cb0b..1b1d807cb5 100644
--- a/src/connection-manager/index.js
+++ b/src/connection-manager/index.js
@@ -32,25 +32,26 @@ const defaultOptions = {
/**
* Responsible for managing known connections.
+ *
* @fires ConnectionManager#peer:connect Emitted when a new peer is connected.
* @fires ConnectionManager#peer:disconnect Emitted when a peer is disconnected.
*/
class ConnectionManager extends EventEmitter {
/**
- * @constructor
+ * @class
* @param {Libp2p} libp2p
* @param {object} options
- * @param {Number} options.maxConnections The maximum number of connections allowed. Default=Infinity
- * @param {Number} options.minConnections The minimum number of connections to avoid pruning. Default=0
- * @param {Number} options.maxData The max data (in and out), per average interval to allow. Default=Infinity
- * @param {Number} options.maxSentData The max outgoing data, per average interval to allow. Default=Infinity
- * @param {Number} options.maxReceivedData The max incoming data, per average interval to allow.. Default=Infinity
- * @param {Number} options.maxEventLoopDelay The upper limit the event loop can take to run. Default=Infinity
- * @param {Number} options.pollInterval How often, in milliseconds, metrics and latency should be checked. Default=2000
- * @param {Number} options.movingAverageInterval How often, in milliseconds, to compute averages. Default=60000
- * @param {Number} options.defaultPeerValue The value of the peer. Default=1
- * @param {boolean} options.autoDial Should preemptively guarantee connections are above the low watermark. Default=true
- * @param {Number} options.autoDialInterval How often, in milliseconds, it should preemptively guarantee connections are above the low watermark. Default=10000
+ * @param {number} options.maxConnections - The maximum number of connections allowed. Default=Infinity
+ * @param {number} options.minConnections - The minimum number of connections to avoid pruning. Default=0
+ * @param {number} options.maxData - The max data (in and out), per average interval to allow. Default=Infinity
+ * @param {number} options.maxSentData - The max outgoing data, per average interval to allow. Default=Infinity
+ * @param {number} options.maxReceivedData - The max incoming data, per average interval to allow.. Default=Infinity
+ * @param {number} options.maxEventLoopDelay - The upper limit the event loop can take to run. Default=Infinity
+ * @param {number} options.pollInterval - How often, in milliseconds, metrics and latency should be checked. Default=2000
+ * @param {number} options.movingAverageInterval - How often, in milliseconds, to compute averages. Default=60000
+ * @param {number} options.defaultPeerValue - The value of the peer. Default=1
+ * @param {boolean} options.autoDial - Should preemptively guarantee connections are above the low watermark. Default=true
+ * @param {number} options.autoDialInterval - How often, in milliseconds, it should preemptively guarantee connections are above the low watermark. Default=10000
*/
constructor (libp2p, options) {
super()
@@ -69,12 +70,14 @@ class ConnectionManager extends EventEmitter {
/**
* Map of peer identifiers to their peer value for pruning connections.
+ *
* @type {Map}
*/
this._peerValues = new Map()
/**
* Map of connections per peer
+ *
* @type {Map>}
*/
this.connections = new Map()
@@ -119,6 +122,7 @@ class ConnectionManager extends EventEmitter {
/**
* Stops the Connection Manager
+ *
* @async
*/
async stop () {
@@ -133,6 +137,7 @@ class ConnectionManager extends EventEmitter {
/**
* Cleans up the connections
+ *
* @async
*/
async _close () {
@@ -151,8 +156,9 @@ class ConnectionManager extends EventEmitter {
/**
* Sets the value of the given peer. Peers with lower values
* will be disconnected first.
+ *
* @param {PeerId} peerId
- * @param {number} value A number between 0 and 1
+ * @param {number} value - A number between 0 and 1
*/
setPeerValue (peerId, value) {
if (value < 0 || value > 1) {
@@ -167,6 +173,7 @@ class ConnectionManager extends EventEmitter {
/**
* Checks the libp2p metrics to determine if any values have exceeded
* the configured maximums.
+ *
* @private
*/
_checkMetrics () {
@@ -183,6 +190,7 @@ class ConnectionManager extends EventEmitter {
/**
* Tracks the incoming connection and check the connection limit
+ *
* @param {Connection} connection
*/
onConnect (connection) {
@@ -208,6 +216,7 @@ class ConnectionManager extends EventEmitter {
/**
* Removes the connection from tracking
+ *
* @param {Connection} connection
*/
onDisconnect (connection) {
@@ -226,6 +235,7 @@ class ConnectionManager extends EventEmitter {
/**
* Get a connection with a peer.
+ *
* @param {PeerId} peerId
* @returns {Connection}
*/
@@ -239,6 +249,7 @@ class ConnectionManager extends EventEmitter {
/**
* Get all open connections with a peer.
+ *
* @param {PeerId} peerId
* @returns {Array}
*/
@@ -259,8 +270,9 @@ class ConnectionManager extends EventEmitter {
/**
* If the event loop is slow, maybe close a connection
+ *
* @private
- * @param {*} summary The LatencyMonitor summary
+ * @param {*} summary - The LatencyMonitor summary
*/
_onLatencyMeasure (summary) {
this._checkMaxLimit('maxEventLoopDelay', summary.avgMs)
@@ -268,9 +280,10 @@ class ConnectionManager extends EventEmitter {
/**
* If the `value` of `name` has exceeded its limit, maybe close a connection
+ *
* @private
- * @param {string} name The name of the field to check limits for
- * @param {number} value The current value of the field
+ * @param {string} name - The name of the field to check limits for
+ * @param {number} value - The current value of the field
*/
_checkMaxLimit (name, value) {
const limit = this._options[name]
@@ -285,6 +298,7 @@ class ConnectionManager extends EventEmitter {
* Proactively tries to connect to known peers stored in the PeerStore.
* It will keep the number of connections below the upper limit and sort
* the peers to connect based on wether we know their keys and protocols.
+ *
* @async
* @private
*/
@@ -330,6 +344,7 @@ class ConnectionManager extends EventEmitter {
/**
* If we have more connections than our maximum, close a connection
* to the lowest valued peer.
+ *
* @private
*/
_maybeDisconnectOne () {
diff --git a/src/connection-manager/latency-monitor.js b/src/connection-manager/latency-monitor.js
index 8af45edc91..db299890b4 100644
--- a/src/connection-manager/latency-monitor.js
+++ b/src/connection-manager/latency-monitor.js
@@ -12,11 +12,11 @@ const debug = require('debug')('latency-monitor:LatencyMonitor')
/**
* @typedef {Object} SummaryObject
- * @property {Number} events How many events were called
- * @property {Number} minMS What was the min time for a cb to be called
- * @property {Number} maxMS What was the max time for a cb to be called
- * @property {Number} avgMs What was the average time for a cb to be called
- * @property {Number} lengthMs How long this interval was in ms
+ * @property {number} events How many events were called
+ * @property {number} minMS What was the min time for a cb to be called
+ * @property {number} maxMS What was the max time for a cb to be called
+ * @property {number} avgMs What was the average time for a cb to be called
+ * @property {number} lengthMs How long this interval was in ms
*/
/**
@@ -37,11 +37,12 @@ const debug = require('debug')('latency-monitor:LatencyMonitor')
*/
class LatencyMonitor extends EventEmitter {
/**
- * @param {Number} [latencyCheckIntervalMs=500] How often to add a latency check event (ms)
- * @param {Number} [dataEmitIntervalMs=5000] How often to summarize latency check events. null or 0 disables event firing
- * @param {function} [asyncTestFn] What cb-style async function to use
- * @param {Number} [latencyRandomPercentage=5] What percent (+/-) of latencyCheckIntervalMs should we randomly use? This helps avoid alignment to other events.
- */
+ * @param {object} [options]
+ * @param {number} [options.latencyCheckIntervalMs=500] - How often to add a latency check event (ms)
+ * @param {number} [options.dataEmitIntervalMs=5000] - How often to summarize latency check events. null or 0 disables event firing
+ * @param {Function} [options.asyncTestFn] - What cb-style async function to use
+ * @param {number} [options.latencyRandomPercentage=5] - What percent (+/-) of latencyCheckIntervalMs should we randomly use? This helps avoid alignment to other events.
+ */
constructor ({ latencyCheckIntervalMs, dataEmitIntervalMs, asyncTestFn, latencyRandomPercentage } = {}) {
super()
const that = this
@@ -106,9 +107,10 @@ class LatencyMonitor extends EventEmitter {
}
/**
- * Start internal timers
- * @private
- */
+ * Start internal timers
+ *
+ * @private
+ */
_startTimers () {
// Timer already started, ignore this
if (this._checkLatencyID) {
@@ -124,9 +126,10 @@ class LatencyMonitor extends EventEmitter {
}
/**
- * Stop internal timers
- * @private
- */
+ * Stop internal timers
+ *
+ * @private
+ */
_stopTimers () {
if (this._checkLatencyID) {
clearTimeout(this._checkLatencyID)
@@ -139,9 +142,10 @@ class LatencyMonitor extends EventEmitter {
}
/**
- * Emit summary only if there were events. It might not have any events if it was forced via a page hidden/show
- * @private
- */
+ * Emit summary only if there were events. It might not have any events if it was forced via a page hidden/show
+ *
+ * @private
+ */
_emitSummary () {
const summary = this.getSummary()
if (summary.events > 0) {
@@ -150,10 +154,11 @@ class LatencyMonitor extends EventEmitter {
}
/**
- * Calling this function will end the collection period. If a timing event was already fired and somewhere in the queue,
- * it will not count for this time period
- * @returns {SummaryObject}
- */
+ * Calling this function will end the collection period. If a timing event was already fired and somewhere in the queue,
+ * it will not count for this time period
+ *
+ * @returns {SummaryObject}
+ */
getSummary () {
// We might want to adjust for the number of expected events
// Example: first 1 event it comes back, then such a long blocker that the next emit check comes
@@ -173,11 +178,11 @@ class LatencyMonitor extends EventEmitter {
}
/**
- * Randomly calls an async fn every roughly latencyCheckIntervalMs (plus some randomness). If no async fn is found,
- * it will simply report on event loop latency.
- *
- * @private
- */
+ * Randomly calls an async fn every roughly latencyCheckIntervalMs (plus some randomness). If no async fn is found,
+ * it will simply report on event loop latency.
+ *
+ * @private
+ */
_checkLatency () {
const that = this
// Randomness is needed to avoid alignment by accident to regular things in the event loop
diff --git a/src/connection-manager/visibility-change-emitter.js b/src/connection-manager/visibility-change-emitter.js
index 152945e8cc..baece0ec17 100644
--- a/src/connection-manager/visibility-change-emitter.js
+++ b/src/connection-manager/visibility-change-emitter.js
@@ -34,8 +34,8 @@ const debug = require('debug')('latency-monitor:VisibilityChangeEmitter')
*/
module.exports = class VisibilityChangeEmitter extends EventEmitter {
/**
- * Creates a VisibilityChangeEmitter
- */
+ * Creates a VisibilityChangeEmitter
+ */
constructor () {
super()
if (typeof document === 'undefined') {
@@ -47,13 +47,14 @@ module.exports = class VisibilityChangeEmitter extends EventEmitter {
}
/**
- * document.hidden and document.visibilityChange are the two variables we need to check for;
- * Since these variables are named differently in different browsers, this function sets
- * the appropriate name based on the browser being used. Once executed, tha actual names of
- * document.hidden and document.visibilityChange are found in this._hidden and this._visibilityChange
- * respectively
- * @private
- */
+ * document.hidden and document.visibilityChange are the two variables we need to check for;
+ * Since these variables are named differently in different browsers, this function sets
+ * the appropriate name based on the browser being used. Once executed, tha actual names of
+ * document.hidden and document.visibilityChange are found in this._hidden and this._visibilityChange
+ * respectively
+ *
+ * @private
+ */
_initializeVisibilityVarNames () {
let hidden
let visibilityChange
@@ -75,10 +76,11 @@ module.exports = class VisibilityChangeEmitter extends EventEmitter {
}
/**
- * Adds an event listener on the document that listens to changes in document.visibilityChange
- * (or whatever name by which the visibilityChange variable is known in the browser)
- * @private
- */
+ * Adds an event listener on the document that listens to changes in document.visibilityChange
+ * (or whatever name by which the visibilityChange variable is known in the browser)
+ *
+ * @private
+ */
_addVisibilityChangeListener () {
if (typeof document.addEventListener === 'undefined' ||
typeof document[this._hidden] === 'undefined') {
@@ -90,10 +92,11 @@ module.exports = class VisibilityChangeEmitter extends EventEmitter {
}
/**
- * The function returns ```true``` if the page is visible or ```false``` if the page is not visible and
- * ```undefined``` if the page visibility API is not supported by the browser.
- * @returns {Boolean|void} whether the page is now visible or not (undefined is unknown)
- */
+ * The function returns ```true``` if the page is visible or ```false``` if the page is not visible and
+ * ```undefined``` if the page visibility API is not supported by the browser.
+ *
+ * @returns {boolean | void} whether the page is now visible or not (undefined is unknown)
+ */
isVisible () {
if (this._hidden === undefined || document[this._hidden] === undefined) {
return undefined
@@ -103,12 +106,12 @@ module.exports = class VisibilityChangeEmitter extends EventEmitter {
}
/**
- * The function that is called when document.visibilityChange has changed
- * It emits an event called visibilityChange and sends the value of document.hidden as a
- * parameter
- *
- * @private
- */
+ * The function that is called when document.visibilityChange has changed
+ * It emits an event called visibilityChange and sends the value of document.hidden as a
+ * parameter
+ *
+ * @private
+ */
_handleVisibilityChange () {
const visible = !document[this._hidden]
debug(visible ? 'Page Visible' : 'Page Hidden')
diff --git a/src/content-routing.js b/src/content-routing.js
index dcf549e7b0..d7e160e79e 100644
--- a/src/content-routing.js
+++ b/src/content-routing.js
@@ -20,9 +20,9 @@ module.exports = (node) => {
* Iterates over all content routers in series to find providers of the given key.
* Once a content router succeeds, iteration will stop.
*
- * @param {CID} key The CID key of the content to find
+ * @param {CID} key - The CID key of the content to find
* @param {object} [options]
- * @param {number} [options.timeout] How long the query should run
+ * @param {number} [options.timeout] - How long the query should run
* @param {number} [options.maxNumProviders] - maximum number of providers to find
* @returns {AsyncIterable<{ id: PeerId, multiaddrs: Multiaddr[] }>}
*/
@@ -51,7 +51,7 @@ module.exports = (node) => {
* Iterates over all content routers in parallel to notify it is
* a provider of the given key.
*
- * @param {CID} key The CID key of the content to find
+ * @param {CID} key - The CID key of the content to find
* @returns {Promise}
*/
async provide (key) { // eslint-disable-line require-await
@@ -64,6 +64,7 @@ module.exports = (node) => {
/**
* Store the given key/value pair in the DHT.
+ *
* @param {Uint8Array} key
* @param {Uint8Array} value
* @param {Object} [options] - put options
@@ -81,6 +82,7 @@ module.exports = (node) => {
/**
* Get the value to the given key.
* Times out after 1 minute by default.
+ *
* @param {Uint8Array} key
* @param {Object} [options] - get options
* @param {number} [options.timeout] - optional timeout (default: 60000)
@@ -96,6 +98,7 @@ module.exports = (node) => {
/**
* Get the `n` values to the given key without sorting.
+ *
* @param {Uint8Array} key
* @param {number} nVals
* @param {Object} [options] - get options
diff --git a/src/dialer/dial-request.js b/src/dialer/dial-request.js
index 2f97f997ac..dc427e1bbf 100644
--- a/src/dialer/dial-request.js
+++ b/src/dialer/dial-request.js
@@ -16,6 +16,7 @@ class DialRequest {
* from `dialer.getTokens`. Once a DialRequest is created, it can be
* started using `DialRequest.run(options)`. Once a single dial has succeeded,
* all other dials in the request will be cancelled.
+ *
* @param {object} options
* @param {Multiaddr[]} options.addrs
* @param {function(Multiaddr):Promise} options.dialAction
@@ -34,7 +35,7 @@ class DialRequest {
/**
* @async
* @param {object} options
- * @param {AbortSignal} options.signal An AbortController signal
+ * @param {AbortSignal} options.signal - An AbortController signal
* @returns {Connection}
*/
async run (options) {
diff --git a/src/dialer/index.js b/src/dialer/index.js
index bd43bd7183..fc02b357a1 100644
--- a/src/dialer/index.js
+++ b/src/dialer/index.js
@@ -20,12 +20,13 @@ const {
class Dialer {
/**
- * @constructor
+ * @class
* @param {object} options
* @param {TransportManager} options.transportManager
- * @param {Peerstore} peerStore
- * @param {number} options.concurrency Number of max concurrent dials. Defaults to `MAX_PARALLEL_DIALS`
- * @param {number} options.timeout How long a dial attempt is allowed to take. Defaults to `DIAL_TIMEOUT`
+ * @param {Peerstore} options.peerStore
+ * @param {number} [options.concurrency = MAX_PARALLEL_DIALS] - Number of max concurrent dials.
+ * @param {number} [options.perPeerLimit = MAX_PER_PEER_DIALS] - Number of max concurrent dials per peer.
+ * @param {number} [options.timeout = DIAL_TIMEOUT] - How long a dial attempt is allowed to take.
*/
constructor ({
transportManager,
@@ -62,9 +63,9 @@ class Dialer {
* The dial to the first address that is successfully able to upgrade a connection
* will be used.
*
- * @param {PeerId|Multiaddr|string} peer The peer to dial
+ * @param {PeerId|Multiaddr|string} peer - The peer to dial
* @param {object} [options]
- * @param {AbortSignal} [options.signal] An AbortController signal
+ * @param {AbortSignal} [options.signal] - An AbortController signal
* @returns {Promise}
*/
async connectToPeer (peer, options = {}) {
@@ -101,8 +102,9 @@ class Dialer {
* Creates a DialTarget. The DialTarget is used to create and track
* the DialRequest to a given peer.
* If a multiaddr is received it should be the first address attempted.
+ *
* @private
- * @param {PeerId|Multiaddr|string} peer A PeerId or Multiaddr
+ * @param {PeerId|Multiaddr|string} peer - A PeerId or Multiaddr
* @returns {DialTarget}
*/
_createDialTarget (peer) {
@@ -137,10 +139,11 @@ class Dialer {
/**
* Creates a PendingDial that wraps the underlying DialRequest
+ *
* @private
* @param {DialTarget} dialTarget
* @param {object} [options]
- * @param {AbortSignal} [options.signal] An AbortController signal
+ * @param {AbortSignal} [options.signal] - An AbortController signal
* @returns {PendingDial}
*/
_createPendingDial (dialTarget, options) {
diff --git a/src/get-peer.js b/src/get-peer.js
index cb6cba4c19..bc36b04cc9 100644
--- a/src/get-peer.js
+++ b/src/get-peer.js
@@ -9,8 +9,8 @@ const { codes } = require('./errors')
/**
* Converts the given `peer` to a `Peer` object.
* If a multiaddr is received, the addressBook is updated.
+ *
* @param {PeerId|Multiaddr|string} peer
- * @param {PeerStore} peerStore
* @returns {{ id: PeerId, multiaddrs: Array }}
*/
function getPeer (peer) {
diff --git a/src/identify/index.js b/src/identify/index.js
index a313ad0e3f..f42a8b6f94 100644
--- a/src/identify/index.js
+++ b/src/identify/index.js
@@ -32,7 +32,8 @@ const { codes } = require('../errors')
class IdentifyService {
/**
* Takes the `addr` and converts it to a Multiaddr if possible
- * @param {Uint8Array|String} addr
+ *
+ * @param {Uint8Array | string} addr
* @returns {Multiaddr|null}
*/
static getCleanMultiaddr (addr) {
@@ -47,10 +48,10 @@ class IdentifyService {
}
/**
- * @constructor
+ * @class
* @param {object} options
* @param {Libp2p} options.libp2p
- * @param {Map} options.protocols A reference to the protocols we support
+ * @param {Map} options.protocols - A reference to the protocols we support
*/
constructor ({ libp2p, protocols }) {
/**
@@ -86,6 +87,7 @@ class IdentifyService {
/**
* Send an Identify Push update to the list of connections
+ *
* @param {Array} connections
* @returns {Promise}
*/
@@ -119,6 +121,7 @@ class IdentifyService {
/**
* Calls `push` for all peers in the `peerStore` that are connected
+ *
* @param {PeerStore} peerStore
*/
pushToPeerStore (peerStore) {
@@ -209,7 +212,7 @@ class IdentifyService {
* A handler to register with Libp2p to process identify messages.
*
* @param {object} options
- * @param {String} options.protocol
+ * @param {string} options.protocol
* @param {*} options.stream
* @param {Connection} options.connection
* @returns {Promise}
@@ -228,6 +231,7 @@ class IdentifyService {
/**
* Sends the `Identify` response with the Signed Peer Record
* to the requesting peer over the given `connection`
+ *
* @private
* @param {object} options
* @param {*} options.stream
@@ -265,6 +269,7 @@ class IdentifyService {
/**
* Reads the Identify Push message from the given `connection`
+ *
* @private
* @param {object} options
* @param {*} options.stream
@@ -311,7 +316,8 @@ class IdentifyService {
/**
* Get self signed peer record raw envelope.
- * @return {Uint8Array}
+ *
+ * @returns {Uint8Array}
*/
async _getSelfPeerRecord () {
const selfSignedPeerRecord = this.peerStore.addressBook.getRawEnvelope(this.peerId)
@@ -340,6 +346,7 @@ class IdentifyService {
module.exports.IdentifyService = IdentifyService
/**
* The protocols the IdentifyService supports
+ *
* @property multicodecs
*/
module.exports.multicodecs = {
diff --git a/src/index.js b/src/index.js
index 8ff4e0f7ec..e7a70e013b 100644
--- a/src/index.js
+++ b/src/index.js
@@ -206,6 +206,7 @@ class Libp2p extends EventEmitter {
/**
* Overrides EventEmitter.emit to conditionally emit errors
* if there is a handler. If not, errors will be logged.
+ *
* @param {string} eventName
* @param {...any} args
* @returns {void}
@@ -240,6 +241,7 @@ class Libp2p extends EventEmitter {
/**
* Stop the libp2p node by closing its listeners and open connections
+ *
* @async
* @returns {void}
*/
@@ -281,6 +283,7 @@ class Libp2p extends EventEmitter {
/**
* Load keychain keys from the datastore.
* Imports the private key as 'self', if needed.
+ *
* @async
* @returns {void}
*/
@@ -299,6 +302,7 @@ class Libp2p extends EventEmitter {
/**
* Gets a Map of the current connections. The keys are the stringified
* `PeerId` of the peer. The value is an array of Connections to that peer.
+ *
* @returns {Map}
*/
get connections () {
@@ -308,7 +312,8 @@ class Libp2p extends EventEmitter {
/**
* Dials to the provided peer. If successful, the known metadata of the
* peer will be added to the nodes `peerStore`
- * @param {PeerId|Multiaddr|string} peer The peer to dial
+ *
+ * @param {PeerId|Multiaddr|string} peer - The peer to dial
* @param {object} options
* @param {AbortSignal} [options.signal]
* @returns {Promise}
@@ -321,8 +326,9 @@ class Libp2p extends EventEmitter {
* Dials to the provided peer and handshakes with the given protocol.
* If successful, the known metadata of the peer will be added to the nodes `peerStore`,
* and the `Connection` will be returned
+ *
* @async
- * @param {PeerId|Multiaddr|string} peer The peer to dial
+ * @param {PeerId|Multiaddr|string} peer - The peer to dial
* @param {string[]|string} protocols
* @param {object} options
* @param {AbortSignal} [options.signal]
@@ -350,7 +356,8 @@ class Libp2p extends EventEmitter {
* Get peer advertising multiaddrs by concating the addresses used
* by transports to listen with the announce addresses.
* Duplicated addresses and noAnnounce addresses are filtered out.
- * @return {Array}
+ *
+ * @returns {Array}
*/
get multiaddrs () {
// Filter noAnnounce multiaddrs
@@ -376,7 +383,8 @@ class Libp2p extends EventEmitter {
/**
* Disconnects all connections to the given `peer`
- * @param {PeerId|multiaddr|string} peer the peer to close connections to
+ *
+ * @param {PeerId|multiaddr|string} peer - the peer to close connections to
* @returns {Promise}
*/
async hangUp (peer) {
@@ -397,7 +405,8 @@ class Libp2p extends EventEmitter {
/**
* Pings the given peer in order to obtain the operation latency.
- * @param {PeerId|Multiaddr|string} peer The peer to ping
+ *
+ * @param {PeerId|Multiaddr|string} peer - The peer to ping
* @returns {Promise}
*/
ping (peer) {
@@ -413,6 +422,7 @@ class Libp2p extends EventEmitter {
/**
* Registers the `handler` for each protocol
+ *
* @param {string[]|string} protocols
* @param {function({ connection:*, stream:*, protocol:string })} handler
*/
@@ -431,6 +441,7 @@ class Libp2p extends EventEmitter {
/**
* Removes the handler for each protocol. The protocol
* will no longer be supported on streams.
+ *
* @param {string[]|string} protocols
*/
unhandle (protocols) {
@@ -471,6 +482,7 @@ class Libp2p extends EventEmitter {
/**
* Called when libp2p has started and before it returns
+ *
* @private
*/
async _onDidStart () {
@@ -496,6 +508,7 @@ class Libp2p extends EventEmitter {
/**
* Called whenever peer discovery services emit `peer` events.
* Known peers may be emitted.
+ *
* @private
* @param {{ id: PeerId, multiaddrs: Array, protocols: Array }} peer
*/
@@ -513,6 +526,7 @@ class Libp2p extends EventEmitter {
* Will dial to the given `peerId` if the current number of
* connected peers is less than the configured `ConnectionManager`
* minConnections.
+ *
* @private
* @param {PeerId} peerId
*/
@@ -586,7 +600,8 @@ class Libp2p extends EventEmitter {
/**
* Like `new Libp2p(options)` except it will create a `PeerId`
* instance if one is not provided in options.
- * @param {object} options Libp2p configuration options
+ *
+ * @param {object} options - Libp2p configuration options
* @returns {Libp2p}
*/
Libp2p.create = async function create (options = {}) {
diff --git a/src/keychain/index.js b/src/keychain/index.js
index d01acb68fb..c823eb3e46 100644
--- a/src/keychain/index.js
+++ b/src/keychain/index.js
@@ -228,7 +228,7 @@ class Keychain {
/**
* List all the keys.
*
- * @returns {KeyInfo[]}
+ * @returns {KeyInfo[]}
*/
async listKeys () {
const self = this
@@ -248,7 +248,7 @@ class Keychain {
* Find a key by it's id.
*
* @param {string} id - The universally unique key identifier.
- * @returns {KeyInfo}
+ * @returns {KeyInfo}
*/
async findKeyById (id) {
try {
@@ -263,7 +263,7 @@ class Keychain {
* Find a key by it's name.
*
* @param {string} name - The local key name.
- * @returns {KeyInfo}
+ * @returns {KeyInfo}
*/
async findKeyByName (name) {
if (!validateKeyName(name)) {
@@ -283,7 +283,7 @@ class Keychain {
* Remove an existing key.
*
* @param {string} name - The local key name; must already exist.
- * @returns {KeyInfo}
+ * @returns {KeyInfo}
*/
async removeKey (name) {
const self = this
@@ -304,7 +304,7 @@ class Keychain {
*
* @param {string} oldName - The old local key name; must already exist.
* @param {string} newName - The new local key name; must not already exist.
- * @returns {KeyInfo}
+ * @returns {KeyInfo}
*/
async renameKey (oldName, newName) {
const self = this
@@ -345,7 +345,7 @@ class Keychain {
*
* @param {string} name - The local key name; must already exist.
* @param {string} password - The password
- * @returns {string}
+ * @returns {string}
*/
async exportKey (name, password) {
if (!validateKeyName(name)) {
@@ -372,7 +372,7 @@ class Keychain {
* @param {string} name - The local key name; must not already exist.
* @param {string} pem - The PEM encoded PKCS #8 string
* @param {string} password - The password.
- * @returns {KeyInfo}
+ * @returns {KeyInfo}
*/
async importKey (name, pem, password) {
const self = this
@@ -448,7 +448,7 @@ class Keychain {
* Gets the private key as PEM encoded PKCS #8 string.
*
* @param {string} name
- * @returns {string}
+ * @returns {string}
* @private
*/
async _getPrivateKey (name) {
diff --git a/src/keychain/util.js b/src/keychain/util.js
index 816b4366d7..56386fe488 100644
--- a/src/keychain/util.js
+++ b/src/keychain/util.js
@@ -77,7 +77,7 @@ exports.certificateForKey = (key, privateKey) => {
* resolve to either `true` or `false`.
*
* @param {Array} array
- * @param {function(*)} asyncCompare An async function that returns a boolean
+ * @param {function(*)} asyncCompare - An async function that returns a boolean
*/
async function findAsync (array, asyncCompare) {
const promises = array.map(asyncCompare)
diff --git a/src/metrics/index.js b/src/metrics/index.js
index cfddd837d6..9d0f436041 100644
--- a/src/metrics/index.js
+++ b/src/metrics/index.js
@@ -66,6 +66,7 @@ class Metrics {
/**
* Gets the global `Stats` object
+ *
* @returns {Stats}
*/
get global () {
@@ -74,6 +75,7 @@ class Metrics {
/**
* Returns a list of `PeerId` strings currently being tracked
+ *
* @returns {Array}
*/
get peers () {
@@ -83,6 +85,7 @@ class Metrics {
/**
* Returns the `Stats` object for the given `PeerId` whether it
* is a live peer, or in the disconnected peer LRU cache.
+ *
* @param {PeerId} peerId
* @returns {Stats}
*/
@@ -93,6 +96,7 @@ class Metrics {
/**
* Returns a list of all protocol strings currently being tracked.
+ *
* @returns {Array}
*/
get protocols () {
@@ -101,6 +105,7 @@ class Metrics {
/**
* Returns the `Stats` object for the given `protocol`.
+ *
* @param {string} protocol
* @returns {Stats}
*/
@@ -112,6 +117,7 @@ class Metrics {
* Should be called when all connections to a given peer
* have closed. The `Stats` collection for the peer will
* be stopped and moved to an LRU for temporary retention.
+ *
* @param {PeerId} peerId
*/
onPeerDisconnected (peerId) {
@@ -131,10 +137,10 @@ class Metrics {
*
* @private
* @param {object} params
- * @param {PeerId} params.remotePeer Remote peer
- * @param {string} [params.protocol] Protocol string the stream is running
- * @param {string} params.direction One of ['in','out']
- * @param {number} params.dataLength Size of the message
+ * @param {PeerId} params.remotePeer - Remote peer
+ * @param {string} [params.protocol] - Protocol string the stream is running
+ * @param {string} params.direction - One of ['in','out']
+ * @param {number} params.dataLength - Size of the message
* @returns {void}
*/
_onMessage ({ remotePeer, protocol, direction, dataLength }) {
@@ -167,7 +173,8 @@ class Metrics {
* Replaces the `PeerId` string with the given `peerId`.
* If stats are already being tracked for the given `peerId`, the
* placeholder stats will be merged with the existing stats.
- * @param {PeerId} placeholder A peerId string
+ *
+ * @param {PeerId} placeholder - A peerId string
* @param {PeerId} peerId
*/
updatePlaceholder (placeholder, peerId) {
@@ -198,9 +205,9 @@ class Metrics {
* with the placeholder string returned from here, and the known `PeerId`.
*
* @param {Object} options
- * @param {{ sink: function(*), source: function() }} options.stream A duplex iterable stream
- * @param {PeerId} [options.peerId] The id of the remote peer that's connected
- * @param {string} [options.protocol] The protocol the stream is running
+ * @param {{ sink: function(*), source: function() }} options.stream - A duplex iterable stream
+ * @param {PeerId} [options.remotePeer] - The id of the remote peer that's connected
+ * @param {string} [options.protocol] - The protocol the stream is running
* @returns {string} The peerId string or placeholder string
*/
trackStream ({ stream, remotePeer, protocol }) {
@@ -233,6 +240,7 @@ class Metrics {
/**
* Merges `other` into `target`. `target` will be modified
* and returned.
+ *
* @param {Stats} target
* @param {Stats} other
* @returns {Stats}
diff --git a/src/metrics/old-peers.js b/src/metrics/old-peers.js
index 4ebc015a90..08d317dc09 100644
--- a/src/metrics/old-peers.js
+++ b/src/metrics/old-peers.js
@@ -5,7 +5,7 @@ const LRU = require('hashlru')
/**
* Creates and returns a Least Recently Used Cache
*
- * @param {Number} maxSize
+ * @param {number} maxSize
* @returns {LRUCache}
*/
module.exports = (maxSize) => {
diff --git a/src/metrics/stats.js b/src/metrics/stats.js
index fa8252757e..3517766309 100644
--- a/src/metrics/stats.js
+++ b/src/metrics/stats.js
@@ -196,8 +196,8 @@ class Stats extends EventEmitter {
*
* @private
* @param {string} key
- * @param {number} timeDiffMS Time in milliseconds
- * @param {Timestamp} latestTime Time in ticks
+ * @param {number} timeDiffMS - Time in milliseconds
+ * @param {Timestamp} latestTime - Time in ticks
* @returns {void}
*/
_updateFrequencyFor (key, timeDiffMS, latestTime) {
diff --git a/src/peer-routing.js b/src/peer-routing.js
index a38eb53b17..7594f15d77 100644
--- a/src/peer-routing.js
+++ b/src/peer-routing.js
@@ -15,9 +15,9 @@ module.exports = (node) => {
/**
* Iterates over all peer routers in series to find the given peer.
*
- * @param {String} id The id of the peer to find
+ * @param {string} id - The id of the peer to find
* @param {object} [options]
- * @param {number} [options.timeout] How long the query should run
+ * @param {number} [options.timeout] - How long the query should run
* @returns {Promise<{ id: PeerId, multiaddrs: Multiaddr[] }>}
*/
findPeer: async (id, options) => { // eslint-disable-line require-await
diff --git a/src/peer-store/address-book.js b/src/peer-store/address-book.js
index 0036a0ce2b..c8fa2ec6f5 100644
--- a/src/peer-store/address-book.js
+++ b/src/peer-store/address-book.js
@@ -23,29 +23,32 @@ const Envelope = require('../record/envelope')
class AddressBook extends Book {
/**
* Address object
+ *
* @typedef {Object} Address
* @property {Multiaddr} multiaddr peer multiaddr.
* @property {boolean} isCertified obtained from a signed peer record.
*/
/**
- * CertifiedRecord object
- * @typedef {Object} CertifiedRecord
- * @property {Uint8Array} raw raw envelope.
- * @property {number} seqNumber seq counter.
- */
+ * CertifiedRecord object
+ *
+ * @typedef {Object} CertifiedRecord
+ * @property {Uint8Array} raw raw envelope.
+ * @property {number} seqNumber seq counter.
+ */
/**
- * Entry object for the addressBook
- * @typedef {Object} Entry
- * @property {Array} addresses peer Addresses.
- * @property {CertifiedRecord} record certified peer record.
- */
+ * Entry object for the addressBook
+ *
+ * @typedef {Object} Entry
+ * @property {Array} addresses peer Addresses.
+ * @property {CertifiedRecord} record certified peer record.
+ */
/**
- * @constructor
- * @param {PeerStore} peerStore
- */
+ * @class
+ * @param {PeerStore} peerStore
+ */
constructor (peerStore) {
/**
* PeerStore Event emitter, used by the AddressBook to emit:
@@ -66,6 +69,7 @@ class AddressBook extends Book {
/**
* Map known peers to their known Address Entries.
+ *
* @type {Map>}
*/
this.data = new Map()
@@ -75,8 +79,9 @@ class AddressBook extends Book {
* ConsumePeerRecord adds addresses from a signed peer record contained in a record envelope.
* This will return a boolean that indicates if the record was successfully processed and added
* into the AddressBook.
+ *
* @param {Envelope} envelope
- * @return {boolean}
+ * @returns {boolean}
*/
consumePeerRecord (envelope) {
let peerRecord
@@ -127,8 +132,9 @@ class AddressBook extends Book {
/**
* Get the raw Envelope for a peer. Returns
* undefined if no Envelope is found.
+ *
* @param {PeerId} peerId
- * @return {Uint8Array|undefined}
+ * @returns {Uint8Array|undefined}
*/
getRawEnvelope (peerId) {
const entry = this.data.get(peerId.toB58String())
@@ -143,8 +149,9 @@ class AddressBook extends Book {
/**
* Get an Envelope containing a PeerRecord for the given peer.
* Returns undefined if no record exists.
+ *
* @param {PeerId} peerId
- * @return {Promise}
+ * @returns {Promise}
*/
getPeerRecord (peerId) {
const raw = this.getRawEnvelope(peerId)
@@ -161,6 +168,7 @@ class AddressBook extends Book {
* This will replace previously stored multiaddrs, if available.
* Replacing stored multiaddrs might result in losing obtained certified addresses.
* If you are not sure, it's recommended to use `add` instead.
+ *
* @override
* @param {PeerId} peerId
* @param {Array} multiaddrs
@@ -211,6 +219,7 @@ class AddressBook extends Book {
/**
* Add known addresses of a provided peer.
* If the peer is not known, it is set with the given addresses.
+ *
* @param {PeerId} peerId
* @param {Array} multiaddrs
* @returns {AddressBook}
@@ -258,6 +267,7 @@ class AddressBook extends Book {
/**
* Get the known data of a provided peer.
+ *
* @override
* @param {PeerId} peerId
* @returns {Array}
@@ -274,6 +284,7 @@ class AddressBook extends Book {
/**
* Transforms received multiaddrs into Address.
+ *
* @private
* @param {Array} multiaddrs
* @param {boolean} [isCertified]
@@ -306,6 +317,7 @@ class AddressBook extends Book {
* Get the known multiaddrs for a given peer. All returned multiaddrs
* will include the encapsulated `PeerId` of the peer.
* Returns `undefined` if there are no known multiaddrs for the given peer.
+ *
* @param {PeerId} peerId
* @returns {Array|undefined}
*/
diff --git a/src/peer-store/book.js b/src/peer-store/book.js
index 8827c9fa8c..f0a830f97a 100644
--- a/src/peer-store/book.js
+++ b/src/peer-store/book.js
@@ -14,12 +14,12 @@ const passthrough = data => data
*/
class Book {
/**
- * @constructor
+ * @class
* @param {Object} properties
- * @param {PeerStore} properties.peerStore PeerStore instance.
- * @param {string} properties.eventName Name of the event to emit by the PeerStore.
- * @param {string} properties.eventProperty Name of the property to emit by the PeerStore.
- * @param {function} [properties.eventTransformer] Transformer function of the provided data for being emitted.
+ * @param {PeerStore} properties.peerStore - PeerStore instance.
+ * @param {string} properties.eventName - Name of the event to emit by the PeerStore.
+ * @param {string} properties.eventProperty - Name of the property to emit by the PeerStore.
+ * @param {Function} [properties.eventTransformer] - Transformer function of the provided data for being emitted.
*/
constructor ({ peerStore, eventName, eventProperty, eventTransformer = passthrough }) {
this._ps = peerStore
@@ -29,6 +29,7 @@ class Book {
/**
* Map known peers to their data.
+ *
* @type {Map}
*/
this.data = new Map()
@@ -36,6 +37,7 @@ class Book {
/**
* Set known data of a provided peer.
+ *
* @param {PeerId} peerId
* @param {Array|Data} data
*/
@@ -45,12 +47,13 @@ class Book {
/**
* Set data into the datastructure, persistence and emit it using the provided transformers.
+ *
* @private
- * @param {PeerId} peerId peerId of the data to store
- * @param {*} data data to store.
- * @param {Object} [options] storing options.
- * @param {boolean} [options.emit = true] emit the provided data.
- * @return {void}
+ * @param {PeerId} peerId - peerId of the data to store
+ * @param {*} data - data to store.
+ * @param {Object} [options] - storing options.
+ * @param {boolean} [options.emit = true] - emit the provided data.
+ * @returns {void}
*/
_setData (peerId, data, { emit = true } = {}) {
const b58key = peerId.toB58String()
@@ -64,6 +67,7 @@ class Book {
/**
* Emit data.
+ *
* @private
* @param {PeerId} peerId
* @param {*} data
@@ -78,6 +82,7 @@ class Book {
/**
* Get the known data of a provided peer.
* Returns `undefined` if there is no available data for the given peer.
+ *
* @param {PeerId} peerId
* @returns {Array|undefined}
*/
@@ -93,6 +98,7 @@ class Book {
/**
* Deletes the provided peer from the book.
+ *
* @param {PeerId} peerId
* @returns {boolean}
*/
diff --git a/src/peer-store/index.js b/src/peer-store/index.js
index b379c96df2..69a1f15a57 100644
--- a/src/peer-store/index.js
+++ b/src/peer-store/index.js
@@ -19,6 +19,7 @@ const {
/**
* Responsible for managing known peers, as well as their addresses, protocols and metadata.
+ *
* @fires PeerStore#peer Emitted when a new peer is added.
* @fires PeerStore#change:protocols Emitted when a known peer supports a different set of protocols.
* @fires PeerStore#change:multiaddrs Emitted when a known peer has a different set of multiaddrs.
@@ -28,6 +29,7 @@ const {
class PeerStore extends EventEmitter {
/**
* Peer object
+ *
* @typedef {Object} Peer
* @property {PeerId} id peer's peer-id instance.
* @property {Array} addresses peer's addresses containing its multiaddrs and metadata.
@@ -36,7 +38,9 @@ class PeerStore extends EventEmitter {
*/
/**
- * @constructor
+ * @param {object} options
+ * @param {PeerId} options.peerId
+ * @class
*/
constructor ({ peerId }) {
super()
@@ -76,6 +80,7 @@ class PeerStore extends EventEmitter {
/**
* Get all the stored information of every peer known.
+ *
* @returns {Map}
*/
get peers () {
@@ -99,6 +104,7 @@ class PeerStore extends EventEmitter {
/**
* Delete the information of the given peer in every book.
+ *
* @param {PeerId} peerId
* @returns {boolean} true if found and removed
*/
@@ -113,6 +119,7 @@ class PeerStore extends EventEmitter {
/**
* Get the stored information of a given peer.
+ *
* @param {PeerId} peerId
* @returns {Peer}
*/
diff --git a/src/peer-store/key-book.js b/src/peer-store/key-book.js
index a5b26edce3..607d12795f 100644
--- a/src/peer-store/key-book.js
+++ b/src/peer-store/key-book.js
@@ -18,9 +18,9 @@ const {
*/
class KeyBook extends Book {
/**
- * @constructor
- * @param {PeerStore} peerStore
- */
+ * @class
+ * @param {PeerStore} peerStore
+ */
constructor (peerStore) {
super({
peerStore,
@@ -31,6 +31,7 @@ class KeyBook extends Book {
/**
* Map known peers to their known Public Key.
+ *
* @type {Map}
*/
this.data = new Map()
@@ -38,11 +39,12 @@ class KeyBook extends Book {
/**
* Set the Peer public key.
+ *
* @override
* @param {PeerId} peerId
* @param {RsaPublicKey|Ed25519PublicKey|Secp256k1PublicKey} publicKey
- * @return {KeyBook}
- */
+ * @returns {KeyBook}
+ */
set (peerId, publicKey) {
if (!PeerId.isPeerId(peerId)) {
log.error('peerId must be an instance of peer-id to store data')
@@ -67,9 +69,10 @@ class KeyBook extends Book {
/**
* Get Public key of the given PeerId, if stored.
+ *
* @override
* @param {PeerId} peerId
- * @return {RsaPublicKey|Ed25519PublicKey|Secp256k1PublicKey}
+ * @returns {RsaPublicKey|Ed25519PublicKey|Secp256k1PublicKey}
*/
get (peerId) {
if (!PeerId.isPeerId(peerId)) {
diff --git a/src/peer-store/metadata-book.js b/src/peer-store/metadata-book.js
index bd84f53a27..490ef02b09 100644
--- a/src/peer-store/metadata-book.js
+++ b/src/peer-store/metadata-book.js
@@ -17,13 +17,14 @@ const {
/**
* The MetadataBook is responsible for keeping the known supported
* protocols of a peer.
+ *
* @fires MetadataBook#change:metadata
*/
class MetadataBook extends Book {
/**
- * @constructor
- * @param {PeerStore} peerStore
- */
+ * @class
+ * @param {PeerStore} peerStore
+ */
constructor (peerStore) {
/**
* PeerStore Event emitter, used by the MetadataBook to emit:
@@ -37,6 +38,7 @@ class MetadataBook extends Book {
/**
* Map known peers to their known protocols.
+ *
* @type {Map>}
*/
this.data = new Map()
@@ -44,10 +46,11 @@ class MetadataBook extends Book {
/**
* Set metadata key and value of a provided peer.
+ *
* @override
* @param {PeerId} peerId
- * @param {string} key metadata key
- * @param {Uint8Array} value metadata value
+ * @param {string} key - metadata key
+ * @param {Uint8Array} value - metadata value
* @returns {ProtoBook}
*/
set (peerId, key, value) {
@@ -68,6 +71,7 @@ class MetadataBook extends Book {
/**
* Set data into the datastructure
+ *
* @override
*/
_setValue (peerId, key, value, { emit = true } = {}) {
@@ -89,6 +93,7 @@ class MetadataBook extends Book {
/**
* Get the known data of a provided peer.
+ *
* @param {PeerId} peerId
* @returns {Map}
*/
@@ -102,6 +107,7 @@ class MetadataBook extends Book {
/**
* Get specific metadata value, if it exists
+ *
* @param {PeerId} peerId
* @param {string} key
* @returns {Uint8Array}
@@ -117,6 +123,7 @@ class MetadataBook extends Book {
/**
* Deletes the provided peer from the book.
+ *
* @param {PeerId} peerId
* @returns {boolean}
*/
@@ -136,6 +143,7 @@ class MetadataBook extends Book {
/**
* Deletes the provided peer metadata key from the book.
+ *
* @param {PeerId} peerId
* @param {string} key
* @returns {boolean}
diff --git a/src/peer-store/persistent/index.js b/src/peer-store/persistent/index.js
index 68505911f6..2d87620e61 100644
--- a/src/peer-store/persistent/index.js
+++ b/src/peer-store/persistent/index.js
@@ -26,11 +26,11 @@ const Protocols = require('./pb/proto-book.proto')
*/
class PersistentPeerStore extends PeerStore {
/**
- * @constructor
+ * @class
* @param {Object} properties
* @param {PeerId} properties.peerId
- * @param {Datastore} properties.datastore Datastore to persist data.
- * @param {number} [properties.threshold = 5] Number of dirty peers allowed before commit data.
+ * @param {Datastore} properties.datastore - Datastore to persist data.
+ * @param {number} [properties.threshold = 5] - Number of dirty peers allowed before commit data.
*/
constructor ({ peerId, datastore, threshold = 5 }) {
super({ peerId })
@@ -47,6 +47,7 @@ class PersistentPeerStore extends PeerStore {
/**
* Peers metadata changed mapping peer identifers to metadata changed.
+ *
* @type {Map>}
*/
this._dirtyMetadata = new Map()
@@ -57,7 +58,8 @@ class PersistentPeerStore extends PeerStore {
/**
* Start Persistent PeerStore.
- * @return {Promise}
+ *
+ * @returns {Promise}
*/
async start () {
log('PeerStore is starting')
@@ -76,6 +78,11 @@ class PersistentPeerStore extends PeerStore {
log('PeerStore started')
}
+ /**
+ * Stop Persistent PeerStore.
+ *
+ * @returns {Promise}
+ */
async stop () {
log('PeerStore is stopping')
this.removeAllListeners()
@@ -85,6 +92,7 @@ class PersistentPeerStore extends PeerStore {
/**
* Add modified peer to the dirty set
+ *
* @private
* @param {Object} params
* @param {PeerId} params.peerId
@@ -105,6 +113,7 @@ class PersistentPeerStore extends PeerStore {
/**
* Add modified metadata peer to the set.
+ *
* @private
* @param {Object} params
* @param {PeerId} params.peerId
@@ -131,9 +140,9 @@ class PersistentPeerStore extends PeerStore {
/**
* Add all the peers current data to a datastore batch and commit it.
+ *
* @private
- * @param {Array} peers
- * @return {Promise}
+ * @returns {Promise}
*/
async _commitData () {
const commitPeers = Array.from(this._dirtyPeers)
@@ -170,6 +179,7 @@ class PersistentPeerStore extends PeerStore {
/**
* Add address book data of the peer to the batch.
+ *
* @private
* @param {PeerId} peerId
* @param {Object} batch
@@ -206,6 +216,7 @@ class PersistentPeerStore extends PeerStore {
/**
* Add Key book data of the peer to the batch.
+ *
* @private
* @param {PeerId} peerId
* @param {Object} batch
@@ -231,6 +242,7 @@ class PersistentPeerStore extends PeerStore {
/**
* Add metadata book data of the peer to the batch.
+ *
* @private
* @param {PeerId} peerId
* @param {Object} batch
@@ -257,6 +269,7 @@ class PersistentPeerStore extends PeerStore {
/**
* Add proto book data of the peer to the batch.
+ *
* @private
* @param {PeerId} peerId
* @param {Object} batch
@@ -284,11 +297,12 @@ class PersistentPeerStore extends PeerStore {
/**
* Process datastore entry and add its data to the correct book.
+ *
* @private
* @param {Object} params
- * @param {Key} params.key datastore key
- * @param {Uint8Array} params.value datastore value stored
- * @return {Promise}
+ * @param {Key} params.key - datastore key
+ * @param {Uint8Array} params.value - datastore value stored
+ * @returns {Promise}
*/
async _processDatastoreEntry ({ key, value }) {
try {
diff --git a/src/peer-store/proto-book.js b/src/peer-store/proto-book.js
index edd906fbb3..073b7e47e5 100644
--- a/src/peer-store/proto-book.js
+++ b/src/peer-store/proto-book.js
@@ -16,13 +16,14 @@ const {
/**
* The ProtoBook is responsible for keeping the known supported
* protocols of a peer.
+ *
* @fires ProtoBook#change:protocols
*/
class ProtoBook extends Book {
/**
- * @constructor
- * @param {PeerStore} peerStore
- */
+ * @class
+ * @param {PeerStore} peerStore
+ */
constructor (peerStore) {
/**
* PeerStore Event emitter, used by the ProtoBook to emit:
@@ -37,6 +38,7 @@ class ProtoBook extends Book {
/**
* Map known peers to their known protocols.
+ *
* @type {Map>}
*/
this.data = new Map()
@@ -45,6 +47,7 @@ class ProtoBook extends Book {
/**
* Set known protocols of a provided peer.
* If the peer was not known before, it will be added.
+ *
* @override
* @param {PeerId} peerId
* @param {Array} protocols
@@ -83,6 +86,7 @@ class ProtoBook extends Book {
/**
* Adds known protocols of a provided peer.
* If the peer was not known before, it will be added.
+ *
* @param {PeerId} peerId
* @param {Array} protocols
* @returns {ProtoBook}
diff --git a/src/ping/index.js b/src/ping/index.js
index 7c481739ca..e882f81f4c 100644
--- a/src/ping/index.js
+++ b/src/ping/index.js
@@ -14,9 +14,10 @@ const { PROTOCOL, PING_LENGTH } = require('./constants')
/**
* Ping a given peer and wait for its response, getting the operation latency.
+ *
* @param {Libp2p} node
* @param {PeerId|multiaddr} peer
- * @returns {Promise}
+ * @returns {Promise}
*/
async function ping (node, peer) {
log('dialing %s to %s', PROTOCOL, peer.toB58String ? peer.toB58String() : peer)
@@ -44,6 +45,7 @@ async function ping (node, peer) {
/**
* Subscribe ping protocol handler.
+ *
* @param {Libp2p} node
*/
function mount (node) {
@@ -52,6 +54,7 @@ function mount (node) {
/**
* Unsubscribe ping protocol handler.
+ *
* @param {Libp2p} node
*/
function unmount (node) {
diff --git a/src/pnet/crypto.js b/src/pnet/crypto.js
index ec8f445219..ae824bfcfb 100644
--- a/src/pnet/crypto.js
+++ b/src/pnet/crypto.js
@@ -12,10 +12,10 @@ log.trace = debug('libp2p:pnet:trace')
log.error = debug('libp2p:pnet:err')
/**
- * Creates a stream iterable to encrypt messages in a private network
+ * Creates a stream iterable to encrypt messages in a private network
*
- * @param {Uint8Array} nonce The nonce to use in encryption
- * @param {Uint8Array} psk The private shared key to use in encryption
+ * @param {Uint8Array} nonce - The nonce to use in encryption
+ * @param {Uint8Array} psk - The private shared key to use in encryption
* @returns {*} a through iterable
*/
module.exports.createBoxStream = (nonce, psk) => {
@@ -28,10 +28,10 @@ module.exports.createBoxStream = (nonce, psk) => {
}
/**
- * Creates a stream iterable to decrypt messages in a private network
+ * Creates a stream iterable to decrypt messages in a private network
*
- * @param {Uint8Array} nonce The nonce of the remote peer
- * @param {Uint8Array} psk The private shared key to use in decryption
+ * @param {Uint8Array} nonce - The nonce of the remote peer
+ * @param {Uint8Array} psk - The private shared key to use in decryption
* @returns {*} a through iterable
*/
module.exports.createUnboxStream = (nonce, psk) => {
diff --git a/src/pnet/index.js b/src/pnet/index.js
index 43b5a52710..e5f82331a2 100644
--- a/src/pnet/index.js
+++ b/src/pnet/index.js
@@ -25,8 +25,8 @@ log.error = debug('libp2p:pnet:err')
*/
class Protector {
/**
- * @param {Uint8Array} keyBuffer The private shared key buffer
- * @constructor
+ * @param {Uint8Array} keyBuffer - The private shared key buffer
+ * @class
*/
constructor (keyBuffer) {
const decodedPSK = decodeV1PSK(keyBuffer)
@@ -39,7 +39,7 @@ class Protector {
* between its two peers from the PSK the Protector instance was
* created with.
*
- * @param {Connection} connection The connection to protect
+ * @param {Connection} connection - The connection to protect
* @returns {*} A protected duplex iterable
*/
async protect (connection) {
diff --git a/src/pnet/key-generator.js b/src/pnet/key-generator.js
index 64a24dfbb6..b3676dcccf 100644
--- a/src/pnet/key-generator.js
+++ b/src/pnet/key-generator.js
@@ -7,7 +7,8 @@ const uint8ArrayFromString = require('uint8arrays/from-string')
/**
* Generates a PSK that can be used in a libp2p-pnet private network
- * @param {Uint8Array} bytes An object to write the psk into
+ *
+ * @param {Uint8Array} bytes - An object to write the psk into
* @returns {void}
*/
function generate (bytes) {
diff --git a/src/pubsub-adapter.js b/src/pubsub-adapter.js
index 6927178c75..1f42cc7d15 100644
--- a/src/pubsub-adapter.js
+++ b/src/pubsub-adapter.js
@@ -5,6 +5,7 @@ module.exports = (PubsubRouter, libp2p, options) => {
class Pubsub extends PubsubRouter {
/**
* Subscribes to a given topic.
+ *
* @override
* @param {string} topic
* @param {function(msg: InMessage)} [handler]
@@ -18,6 +19,7 @@ module.exports = (PubsubRouter, libp2p, options) => {
/**
* Unsubscribe from the given topic.
+ *
* @override
* @param {string} topic
* @param {function(msg: InMessage)} [handler]
diff --git a/src/record/envelope/index.js b/src/record/envelope/index.js
index 1eb4e108a7..6a73914f2a 100644
--- a/src/record/envelope/index.js
+++ b/src/record/envelope/index.js
@@ -20,12 +20,12 @@ const Protobuf = require('./envelope.proto')
*/
class Envelope {
/**
- * @constructor
+ * @class
* @param {object} params
* @param {PeerId} params.peerId
* @param {Uint8Array} params.payloadType
- * @param {Uint8Array} params.payload marshaled record
- * @param {Uint8Array} params.signature signature of the domain string :: type hint :: payload.
+ * @param {Uint8Array} params.payload - marshaled record
+ * @param {Uint8Array} params.signature - signature of the domain string :: type hint :: payload.
*/
constructor ({ peerId, payloadType, payload, signature }) {
this.peerId = peerId
@@ -39,7 +39,8 @@ class Envelope {
/**
* Marshal the envelope content.
- * @return {Uint8Array}
+ *
+ * @returns {Uint8Array}
*/
marshal () {
if (this._marshal) {
@@ -60,8 +61,9 @@ class Envelope {
/**
* Verifies if the other Envelope is identical to this one.
+ *
* @param {Envelope} other
- * @return {boolean}
+ * @returns {boolean}
*/
equals (other) {
return uint8arraysEquals(this.peerId.pubKey.bytes, other.peerId.pubKey.bytes) &&
@@ -72,8 +74,9 @@ class Envelope {
/**
* Validate envelope data signature for the given domain.
+ *
* @param {string} domain
- * @return {Promise}
+ * @returns {Promise}
*/
validate (domain) {
const signData = formatSignaturePayload(domain, this.payloadType, this.payload)
@@ -84,10 +87,11 @@ class Envelope {
/**
* Helper function that prepares a Uint8Array to sign or verify a signature.
+ *
* @param {string} domain
* @param {Uint8Array} payloadType
* @param {Uint8Array} payload
- * @return {Uint8Array}
+ * @returns {Uint8Array}
*/
const formatSignaturePayload = (domain, payloadType, payload) => {
// When signing, a peer will prepare a Uint8Array by concatenating the following:
@@ -115,8 +119,9 @@ const formatSignaturePayload = (domain, payloadType, payload) => {
/**
* Unmarshal a serialized Envelope protobuf message.
+ *
* @param {Uint8Array} data
- * @return {Promise}
+ * @returns {Promise}
*/
Envelope.createFromProtobuf = async (data) => {
const envelopeData = Protobuf.decode(data)
@@ -131,13 +136,14 @@ Envelope.createFromProtobuf = async (data) => {
}
/**
-* Seal marshals the given Record, places the marshaled bytes inside an Envelope
-* and signs it with the given peerId's private key.
-* @async
-* @param {Record} record
-* @param {PeerId} peerId
-* @return {Envelope}
-*/
+ * Seal marshals the given Record, places the marshaled bytes inside an Envelope
+ * and signs it with the given peerId's private key.
+ *
+ * @async
+ * @param {Record} record
+ * @param {PeerId} peerId
+ * @returns {Envelope}
+ */
Envelope.seal = async (record, peerId) => {
const domain = record.domain
const payloadType = record.codec
@@ -157,9 +163,10 @@ Envelope.seal = async (record, peerId) => {
/**
* Open and certify a given marshalled envelope.
* Data is unmarshalled and the signature validated for the given domain.
+ *
* @param {Uint8Array} data
* @param {string} domain
- * @return {Envelope}
+ * @returns {Envelope}
*/
Envelope.openAndCertify = async (data, domain) => {
const envelope = await Envelope.createFromProtobuf(data)
diff --git a/src/record/peer-record/index.js b/src/record/peer-record/index.js
index 2bd5cdc90e..51c43a7970 100644
--- a/src/record/peer-record/index.js
+++ b/src/record/peer-record/index.js
@@ -17,11 +17,11 @@ const {
*/
class PeerRecord extends Record {
/**
- * @constructor
+ * @class
* @param {object} params
* @param {PeerId} params.peerId
- * @param {Array} params.multiaddrs addresses of the associated peer.
- * @param {number} [params.seqNumber] monotonically-increasing sequence counter that's used to order PeerRecords in time.
+ * @param {Array} params.multiaddrs - addresses of the associated peer.
+ * @param {number} [params.seqNumber] - monotonically-increasing sequence counter that's used to order PeerRecords in time.
*/
constructor ({ peerId, multiaddrs = [], seqNumber = Date.now() }) {
super(ENVELOPE_DOMAIN_PEER_RECORD, ENVELOPE_PAYLOAD_TYPE_PEER_RECORD)
@@ -36,7 +36,8 @@ class PeerRecord extends Record {
/**
* Marshal a record to be used in an envelope.
- * @return {Uint8Array}
+ *
+ * @returns {Uint8Array}
*/
marshal () {
if (this._marshal) {
@@ -56,8 +57,9 @@ class PeerRecord extends Record {
/**
* Returns true if `this` record equals the `other`.
+ *
* @param {Record} other
- * @return {boolean}
+ * @returns {boolean}
*/
equals (other) {
// Validate PeerId
@@ -81,8 +83,9 @@ class PeerRecord extends Record {
/**
* Unmarshal Peer Record Protobuf.
- * @param {Uint8Array} buf marshaled peer record.
- * @return {PeerRecord}
+ *
+ * @param {Uint8Array} buf - marshaled peer record.
+ * @returns {PeerRecord}
*/
PeerRecord.createFromProtobuf = (buf) => {
// Decode
diff --git a/src/registrar.js b/src/registrar.js
index 6aa601f003..5130a02fcb 100644
--- a/src/registrar.js
+++ b/src/registrar.js
@@ -18,7 +18,7 @@ class Registrar {
* @param {Object} props
* @param {PeerStore} props.peerStore
* @param {connectionManager} props.connectionManager
- * @constructor
+ * @class
*/
constructor ({ peerStore, connectionManager }) {
// Used on topology to listen for protocol changes
@@ -49,6 +49,7 @@ class Registrar {
/**
* Get a connection with a peer.
+ *
* @param {PeerId} peerId
* @returns {Connection}
*/
@@ -58,8 +59,9 @@ class Registrar {
/**
* Register handlers for a set of multicodecs given
- * @param {Topology} topology protocol topology
- * @return {string} registrar identifier
+ *
+ * @param {Topology} topology - protocol topology
+ * @returns {string} registrar identifier
*/
register (topology) {
if (!Topology.isTopology(topology)) {
@@ -79,8 +81,9 @@ class Registrar {
/**
* Unregister topology.
- * @param {string} id registrar identifier
- * @return {boolean} unregistered successfully
+ *
+ * @param {string} id - registrar identifier
+ * @returns {boolean} unregistered successfully
*/
unregister (id) {
return this.topologies.delete(id)
@@ -88,6 +91,7 @@ class Registrar {
/**
* Remove a disconnected peer from the record
+ *
* @param {Connection} connection
* @param {Error} [error]
* @returns {void}
diff --git a/src/transport-manager.js b/src/transport-manager.js
index beeb6bb6e2..e18841bf02 100644
--- a/src/transport-manager.js
+++ b/src/transport-manager.js
@@ -9,11 +9,11 @@ log.error = debug('libp2p:transports:error')
class TransportManager {
/**
- * @constructor
+ * @class
* @param {object} options
- * @param {Libp2p} options.libp2p The Libp2p instance. It will be passed to the transports.
- * @param {Upgrader} options.upgrader The upgrader to provide to the transports
- * @param {boolean} [options.faultTolerance = FAULT_TOLERANCE.FATAL_ALL] Address listen error tolerance.
+ * @param {Libp2p} options.libp2p - The Libp2p instance. It will be passed to the transports.
+ * @param {Upgrader} options.upgrader - The upgrader to provide to the transports
+ * @param {boolean} [options.faultTolerance = FAULT_TOLERANCE.FATAL_ALL] - Address listen error tolerance.
*/
constructor ({ libp2p, upgrader, faultTolerance = FAULT_TOLERANCE.FATAL_ALL }) {
this.libp2p = libp2p
@@ -26,9 +26,9 @@ class TransportManager {
/**
* Adds a `Transport` to the manager
*
- * @param {String} key
+ * @param {string} key
* @param {Transport} Transport
- * @param {*} transportOptions Additional options to pass to the transport
+ * @param {*} transportOptions - Additional options to pass to the transport
* @returns {void}
*/
add (key, Transport, transportOptions = {}) {
@@ -54,6 +54,7 @@ class TransportManager {
/**
* Stops all listeners
+ *
* @async
*/
async close () {
@@ -75,6 +76,7 @@ class TransportManager {
/**
* Dials the given Multiaddr over it's supported transport
+ *
* @param {Multiaddr} ma
* @param {*} options
* @returns {Promise}
@@ -95,6 +97,7 @@ class TransportManager {
/**
* Returns all Multiaddr's the listeners are using
+ *
* @returns {Multiaddr[]}
*/
getAddrs () {
@@ -109,6 +112,7 @@ class TransportManager {
/**
* Returns all the transports instances.
+ *
* @returns {Iterator}
*/
getTransports () {
@@ -117,6 +121,7 @@ class TransportManager {
/**
* Finds a transport that matches the given Multiaddr
+ *
* @param {Multiaddr} ma
* @returns {Transport|null}
*/
@@ -130,6 +135,7 @@ class TransportManager {
/**
* Starts listeners for each listen Multiaddr.
+ *
* @async
*/
async listen () {
@@ -206,6 +212,7 @@ class TransportManager {
/**
* Removes all transports from the manager.
* If any listeners are running, they will be closed.
+ *
* @async
*/
async removeAll () {
@@ -222,6 +229,7 @@ class TransportManager {
* Enum Transport Manager Fault Tolerance values.
* FATAL_ALL should be used for failing in any listen circumstance.
* NO_FATAL should be used for not failing when not listening.
+ *
* @readonly
* @enum {number}
*/
diff --git a/src/upgrader.js b/src/upgrader.js
index 11188f962e..b53b647598 100644
--- a/src/upgrader.js
+++ b/src/upgrader.js
@@ -14,7 +14,7 @@ const { codes } = require('./errors')
/**
* @typedef MultiaddrConnection
- * @property {function} sink
+ * @property {Function} sink
* @property {AsyncIterator} source
* @property {*} conn
* @property {Multiaddr} remoteAddr
@@ -34,7 +34,7 @@ class Upgrader {
* @param {Metrics} options.metrics
* @param {Map} options.cryptos
* @param {Map} options.muxers
- * @param {function(Connection)} options.onConnection Called when a connection is upgraded
+ * @param {function(Connection)} options.onConnection - Called when a connection is upgraded
* @param {function(Connection)} options.onConnectionEnd
*/
constructor ({
@@ -57,6 +57,7 @@ class Upgrader {
/**
* Upgrades an inbound connection
+ *
* @async
* @param {MultiaddrConnection} maConn
* @returns {Promise}
@@ -124,6 +125,7 @@ class Upgrader {
/**
* Upgrades an outbound connection
+ *
* @async
* @param {MultiaddrConnection} maConn
* @returns {Promise}
@@ -198,14 +200,15 @@ class Upgrader {
/**
* A convenience method for generating a new `Connection`
+ *
* @private
* @param {object} options
- * @param {string} cryptoProtocol The crypto protocol that was negotiated
- * @param {string} direction One of ['inbound', 'outbound']
- * @param {MultiaddrConnection} maConn The transport layer connection
- * @param {*} upgradedConn A duplex connection returned from multiplexer and/or crypto selection
- * @param {Muxer} Muxer The muxer to be used for muxing
- * @param {PeerId} remotePeer The peer the connection is with
+ * @param {string} options.cryptoProtocol - The crypto protocol that was negotiated
+ * @param {string} options.direction - One of ['inbound', 'outbound']
+ * @param {MultiaddrConnection} options.maConn - The transport layer connection
+ * @param {*} options.upgradedConn - A duplex connection returned from multiplexer and/or crypto selection
+ * @param {Muxer} options.Muxer - The muxer to be used for muxing
+ * @param {PeerId} options.remotePeer - The peer the connection is with
* @returns {Connection}
*/
_createConnection ({
@@ -302,9 +305,10 @@ class Upgrader {
/**
* Routes incoming streams to the correct handler
+ *
* @private
* @param {object} options
- * @param {Connection} options.connection The connection the stream belongs to
+ * @param {Connection} options.connection - The connection the stream belongs to
* @param {Stream} options.stream
* @param {string} options.protocol
*/
@@ -315,9 +319,10 @@ class Upgrader {
/**
* Attempts to encrypt the incoming `connection` with the provided `cryptos`.
+ *
* @private
* @async
- * @param {PeerId} localPeer The initiators PeerId
+ * @param {PeerId} localPeer - The initiators PeerId
* @param {*} connection
* @param {Map} cryptos
* @returns {CryptoResult} An encrypted connection, remote peer `PeerId` and the protocol of the `Crypto` used
@@ -344,9 +349,10 @@ class Upgrader {
/**
* Attempts to encrypt the given `connection` with the provided `cryptos`.
* The first `Crypto` module to succeed will be used
+ *
* @private
* @async
- * @param {PeerId} localPeer The initiators PeerId
+ * @param {PeerId} localPeer - The initiators PeerId
* @param {*} connection
* @param {PeerId} remotePeerId
* @param {Map} cryptos
@@ -374,10 +380,11 @@ class Upgrader {
/**
* Selects one of the given muxers via multistream-select. That
* muxer will be used for all future streams on the connection.
+ *
* @private
* @async
- * @param {*} connection A basic duplex connection to multiplex
- * @param {Map} muxers The muxers to attempt multiplexing with
+ * @param {*} connection - A basic duplex connection to multiplex
+ * @param {Map} muxers - The muxers to attempt multiplexing with
* @returns {*} A muxed connection
*/
async _multiplexOutbound (connection, muxers) {
@@ -397,10 +404,11 @@ class Upgrader {
/**
* Registers support for one of the given muxers via multistream-select. The
* selected muxer will be used for all future streams on the connection.
+ *
* @private
* @async
- * @param {*} connection A basic duplex connection to multiplex
- * @param {Map} muxers The muxers to attempt multiplexing with
+ * @param {*} connection - A basic duplex connection to multiplex
+ * @param {Map} muxers - The muxers to attempt multiplexing with
* @returns {*} A muxed connection
*/
async _multiplexInbound (connection, muxers) {
diff --git a/test/utils/creators/peer.js b/test/utils/creators/peer.js
index 6e4a586597..2c77cb63a0 100644
--- a/test/utils/creators/peer.js
+++ b/test/utils/creators/peer.js
@@ -13,13 +13,14 @@ const listenAddr = multiaddr('/ip4/127.0.0.1/tcp/0')
/**
* Create libp2p nodes.
+ *
* @param {Object} [properties]
* @param {Object} [properties.config]
- * @param {number} [properties.number] number of peers (default: 1).
- * @param {boolean} [properties.fixture] use fixture for peer-id generation (default: true)
- * @param {boolean} [properties.started] nodes should start (default: true)
- * @param {boolean} [properties.populateAddressBooks] nodes addressBooks should be populated with other peers (default: true)
- * @return {Promise>}
+ * @param {number} [properties.number] - number of peers (default: 1).
+ * @param {boolean} [properties.fixture] - use fixture for peer-id generation (default: true)
+ * @param {boolean} [properties.started] - nodes should start (default: true)
+ * @param {boolean} [properties.populateAddressBooks] - nodes addressBooks should be populated with other peers (default: true)
+ * @returns {Promise>}
*/
async function createPeer ({ number = 1, fixture = true, started = true, populateAddressBooks = true, config = {} } = {}) {
const peerIds = await createPeerId({ number, fixture })
@@ -53,10 +54,11 @@ function _populateAddressBooks (peers) {
/**
* Create Peer-ids.
+ *
* @param {Object} [properties]
- * @param {number} [properties.number] number of peers (default: 1).
- * @param {boolean} [properties.fixture] use fixture for peer-id generation (default: true)
- * @return {Promise>}
+ * @param {number} [properties.number] - number of peers (default: 1).
+ * @param {boolean} [properties.fixture] - use fixture for peer-id generation (default: true)
+ * @returns {Promise>}
*/
function createPeerId ({ number = 1, fixture = true } = {}) {
return pTimes(number, (i) => fixture
diff --git a/test/utils/mockConnection.js b/test/utils/mockConnection.js
index d77253b875..b85c036ebb 100644
--- a/test/utils/mockConnection.js
+++ b/test/utils/mockConnection.js
@@ -58,9 +58,9 @@ module.exports = async (properties = {}) => {
* Creates a full connection pair, without the transport or encryption
*
* @param {object} options
- * @param {Multiaddr[]} options.addrs Should contain two addresses for the local and remote peer respectively
- * @param {PeerId[]} options.remotePeer Should contain two peer ids, for the local and remote peer respectively
- * @param {Map} options.protocols The protocols the connections should support
+ * @param {Multiaddr[]} options.addrs - Should contain two addresses for the local and remote peer respectively
+ * @param {Array} options.peers - Array containing local and remote peer ids
+ * @param {Map} options.protocols - The protocols the connections should support
* @returns {{inbound:Connection, outbound:Connection}}
*/
module.exports.pair = function connectionPair ({ addrs, peers, protocols }) {
diff --git a/test/utils/mockMultiaddrConn.js b/test/utils/mockMultiaddrConn.js
index 9fd9c9b597..bb0cf6df7c 100644
--- a/test/utils/mockMultiaddrConn.js
+++ b/test/utils/mockMultiaddrConn.js
@@ -6,9 +6,10 @@ const AbortController = require('abort-controller')
/**
* Returns both sides of a mocked MultiaddrConnection
+ *
* @param {object} options
- * @param {Multiaddr[]} options.addrs Should contain two addresses for the local and remote peer
- * @param {PeerId} options.remotePeer The peer that is being "dialed"
+ * @param {Multiaddr[]} options.addrs - Should contain two addresses for the local and remote peer
+ * @param {PeerId} options.remotePeer - The peer that is being "dialed"
* @returns {{inbound:MultiaddrConnection, outbound:MultiaddrConnection}}
*/
module.exports = function mockMultiaddrConnPair ({ addrs, remotePeer }) {
From 60d437f59539e6be8a5f216a63bb134fb912cc6d Mon Sep 17 00:00:00 2001
From: Vasco Santos
Date: Tue, 6 Oct 2020 15:37:01 +0200
Subject: [PATCH 009/447] fix: flakey identify test firefox (#774)
---
test/identify/index.spec.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/test/identify/index.spec.js b/test/identify/index.spec.js
index 799a3ebd49..1ccbf67122 100644
--- a/test/identify/index.spec.js
+++ b/test/identify/index.spec.js
@@ -364,7 +364,7 @@ describe('Identify', () => {
expect(libp2p.identifyService.identify.callCount).to.equal(1)
// The connection should have no open streams
- expect(connection.streams).to.have.length(0)
+ await pWaitFor(() => connection.streams.length === 0)
await connection.close()
})
From 0d48fc4f5a19c73297dc017e8f681eb328a216b6 Mon Sep 17 00:00:00 2001
From: Vasco Santos
Date: Wed, 7 Oct 2020 14:50:01 +0200
Subject: [PATCH 010/447] test: use ed25519 keys in tests (#669)
* chore: use ed25519 keys in tests
* fix: persisted keybook recheck keybook content for delete
* chore: only store if key not inline
* chore: update peer id
* chore: identify wait for closed streams
---
package.json | 2 +-
src/peer-store/persistent/index.js | 29 ++++++++++++++--
test/fixtures/browser.js | 2 +-
test/fixtures/peers.js | 36 ++++++++++----------
test/peer-store/persisted-peer-store.spec.js | 11 +++---
5 files changed, 52 insertions(+), 28 deletions(-)
diff --git a/package.json b/package.json
index c4a7f7dd7b..6a963181a1 100644
--- a/package.json
+++ b/package.json
@@ -72,7 +72,7 @@
"p-any": "^3.0.0",
"p-fifo": "^1.0.0",
"p-settle": "^4.0.1",
- "peer-id": "^0.14.0",
+ "peer-id": "^0.14.2",
"protons": "^2.0.0",
"retimer": "^2.0.0",
"sanitize-filename": "^1.6.3",
diff --git a/src/peer-store/persistent/index.js b/src/peer-store/persistent/index.js
index 2d87620e61..5b5d4f8ac4 100644
--- a/src/peer-store/persistent/index.js
+++ b/src/peer-store/persistent/index.js
@@ -67,7 +67,7 @@ class PersistentPeerStore extends PeerStore {
// Handlers for dirty peers
this.on('change:protocols', this._addDirtyPeer)
this.on('change:multiaddrs', this._addDirtyPeer)
- this.on('change:pubkey', this._addDirtyPeer)
+ this.on('change:pubkey', this._addDirtyPeerKey)
this.on('change:metadata', this._addDirtyPeerMetadata)
// Load data
@@ -111,6 +111,31 @@ class PersistentPeerStore extends PeerStore {
}
}
+ /**
+ * Add modified peer key to the dirty set
+ * @private
+ * @param {Object} params
+ * @param {PeerId} params.peerId
+ */
+ _addDirtyPeerKey ({ peerId }) {
+ // Not add if inline key available
+ if (peerId.hasInlinePublicKey()) {
+ return
+ }
+
+ const peerIdstr = peerId.toB58String()
+
+ log('add dirty peer key', peerIdstr)
+ this._dirtyPeers.add(peerIdstr)
+
+ if (this._dirtyPeers.size >= this.threshold) {
+ // Commit current data
+ this._commitData().catch(err => {
+ log.error('error committing data', err)
+ })
+ }
+ }
+
/**
* Add modified metadata peer to the set.
*
@@ -164,7 +189,7 @@ class PersistentPeerStore extends PeerStore {
this._batchAddressBook(peerId, batch)
// Key Book
- this._batchKeyBook(peerId, batch)
+ !peerId.hasInlinePublicKey() && this._batchKeyBook(peerId, batch)
// Metadata Book
this._batchMetadataBook(peerId, batch)
diff --git a/test/fixtures/browser.js b/test/fixtures/browser.js
index 901c32e6c9..f5f33259dc 100644
--- a/test/fixtures/browser.js
+++ b/test/fixtures/browser.js
@@ -3,5 +3,5 @@
const multiaddr = require('multiaddr')
module.exports.MULTIADDRS_WEBSOCKETS = [
- multiaddr('/ip4/127.0.0.1/tcp/15001/ws/p2p/QmckxVrJw1Yo8LqvmDJNUmdAsKtSbiKWmrXJFyKmUraBoN')
+ multiaddr('/ip4/127.0.0.1/tcp/15001/ws/p2p/12D3KooWHFKTMzwerBtsVmtz4ZZEQy2heafxzWw6wNn5PPYkBxJ5')
]
diff --git a/test/fixtures/peers.js b/test/fixtures/peers.js
index fad0d23e8b..27150e5e84 100644
--- a/test/fixtures/peers.js
+++ b/test/fixtures/peers.js
@@ -1,27 +1,27 @@
'use strict'
module.exports = [{
- id: 'QmNMMAqSxPetRS1cVMmutW5BCN1qQQyEr4u98kUvZjcfEw',
- privKey: 'CAASpQkwggShAgEAAoIBAQDPek2aeHMa0blL42RTKd6xgtkk4Zkldvq4LHxzcag5uXepiQzWANEUvoD3KcUTmMRmx14PvsxdLCNst7S2JSa0R2n5wSRs14zGy6892lx4H4tLBD1KSpQlJ6vabYM1CJhIQRG90BtzDPrJ/X1iJ2HA0PPDz0Mflam2QUMDDrU0IuV2m7gSCJ5r4EmMs3U0xnH/1gShkVx4ir0WUdoWf5KQUJOmLn1clTRHYPv4KL9A/E38+imNAXfkH3c2T7DrCcYRkZSpK+WecjMsH1dCX15hhhggNqfp3iulO1tGPxHjm7PDGTPUjpCWKpD5e50sLqsUwexac1ja6ktMfszIR+FPAgMBAAECggEAB2H2uPRoRCAKU+T3gO4QeoiJaYKNjIO7UCplE0aMEeHDnEjAKC1HQ1G0DRdzZ8sb0fxuIGlNpFMZv5iZ2ZFg2zFfV//DaAwTek9tIOpQOAYHUtgHxkj5FIlg2BjlflGb+ZY3J2XsVB+2HNHkUEXOeKn2wpTxcoJE07NmywkO8Zfr1OL5oPxOPlRN1gI4ffYH2LbfaQVtRhwONR2+fs5ISfubk5iKso6BX4moMYkxubYwZbpucvKKi/rIjUA3SK86wdCUnno1KbDfdXSgCiUlvxt/IbRFXFURQoTV6BOi3sP5crBLw8OiVubMr9/8WE6KzJ0R7hPd5+eeWvYiYnWj4QKBgQD6jRlAFo/MgPO5NZ/HRAk6LUG+fdEWexA+GGV7CwJI61W/Dpbn9ZswPDhRJKo3rquyDFVZPdd7+RlXYg1wpmp1k54z++L1srsgj72vlg4I8wkZ4YLBg0+zVgHlQ0kxnp16DvQdOgiRFvMUUMEgetsoIx1CQWTd67hTExGsW+WAZQKBgQDT/WaHWvwyq9oaZ8G7F/tfeuXvNTk3HIJdfbWGgRXB7lJ7Gf6FsX4x7PeERfL5a67JLV6JdiLLVuYC2CBhipqLqC2DB962aKMvxobQpSljBBZvZyqP1IGPoKskrSo+2mqpYkeCLbDMuJ1nujgMP7gqVjabs2zj6ACKmmpYH/oNowJ/T0ZVtvFsjkg+1VsiMupUARRQuPUWMwa9HOibM1NIZcoQV2NGXB5Z++kR6JqxQO0DZlKArrviclderUdY+UuuY4VRiSEprpPeoW7ZlbTku/Ap8QZpWNEzZorQDro7bnfBW91fX9/81ets/gCPGrfEn+58U3pdb9oleCOQc/ifpQKBgBTYGbi9bYbd9vgZs6bd2M2um+VFanbMytS+g5bSIn2LHXkVOT2UEkB+eGf9KML1n54QY/dIMmukA8HL1oNAyalpw+/aWj+9Ui5kauUhGEywHjSeBEVYM9UXizxz+m9rsoktLLLUI0o97NxCJzitG0Kub3gn0FEogsUeIc7AdinZAoGBANnM1vcteSQDs7x94TDEnvvqwSkA2UWyLidD2jXgE0PG4V6tTkK//QPBmC9eq6TIqXkzYlsErSw4XeKO91knFofmdBzzVh/ddgx/NufJV4tXF+a2iTpqYBUJiz9wpIKgf43/Ob+P1EA99GAhSdxz1ess9O2aTqf3ANzn6v6g62Pv',
- pubKey: 'CAASpgIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPek2aeHMa0blL42RTKd6xgtkk4Zkldvq4LHxzcag5uXepiQzWANEUvoD3KcUTmMRmx14PvsxdLCNst7S2JSa0R2n5wSRs14zGy6892lx4H4tLBD1KSpQlJ6vabYM1CJhIQRG90BtzDPrJ/X1iJ2HA0PPDz0Mflam2QUMDDrU0IuV2m7gSCJ5r4EmMs3U0xnH/1gShkVx4ir0WUdoWf5KQUJOmLn1clTRHYPv4KL9A/E38+imNAXfkH3c2T7DrCcYRkZSpK+WecjMsH1dCX15hhhggNqfp3iulO1tGPxHjm7PDGTPUjpCWKpD5e50sLqsUwexac1ja6ktMfszIR+FPAgMBAAE='
+ id: '12D3KooWNvSZnPi3RrhrTwEY4LuuBeB6K6facKUCJcyWG1aoDd2p',
+ privKey: 'CAESYHyCgD+3HtEHm6kzPO6fuwP+BAr/PxfJKlvAOWhc/IqAwrZjCNn0jz93sSl81cP6R6x/g+iVYmR5Wxmn4ZtzJFnCtmMI2fSPP3exKXzVw/pHrH+D6JViZHlbGafhm3MkWQ==',
+ pubKey: 'CAESIMK2YwjZ9I8/d7EpfNXD+kesf4PolWJkeVsZp+GbcyRZ'
}, {
- id: 'QmW8rAgaaA6sRydK1k6vonShQME47aDxaFidbtMevWs73t',
- privKey: 'CAASpwkwggSjAgEAAoIBAQCTU3gVDv3SRXLOsFln9GEf1nJ/uCEDhOG10eC0H9l9IPpVxjuPT1ep+ykFUdvefq3D3q+W3hbmiHm81o8dYv26RxZIEioToUWp7Ec5M2B/niYoE93za9/ZDwJdl7eh2hNKwAdxTmdbXUPjkIU4vLyHKRFbJIn9X8w9djldz8hoUvC1BK4L1XrT6F2l0ruJXErH2ZwI1youfSzo87TdXIoFKdrQLuW6hOtDCGKTiS+ab/DkMODc6zl8N47Oczv7vjzoWOJMUJs1Pg0ZsD1zmISY38P0y/QyEhatZn0B8BmSWxlLQuukatzOepQI6k+HtfyAAjn4UEqnMaXTP1uwLldVAgMBAAECggEAHq2f8MqpYjLiAFZKl9IUs3uFZkEiZsgx9BmbMAb91Aec+WWJG4OLHrNVTG1KWp+IcaQablEa9bBvoToQnS7y5OpOon1d066egg7Ymfmv24NEMM5KRpktCNcOSA0CySpPIB6yrg6EiUr3ixiaFUGABKkxmwgVz/Q15IqM0ZMmCUsC174PMAz1COFZxD0ZX0zgHblOJQW3dc0X3XSzhht8vU02SMoVObQHQfeXEHv3K/RiVj/Ax0bTc5JVkT8dm8xksTtsFCNOzRBqFS6MYqX6U/u0Onz3Jm5Jt7fLWb5n97gZR4SleyGrqxYNb46d9X7mP0ie7E6bzFW0DsWBIeAqVQKBgQDW0We2L1n44yOvJaMs3evpj0nps13jWidt2I3RlZXjWzWHiYQfvhWUWqps/xZBnAYgnN/38xbKzHZeRNhrqOo+VB0WK1IYl0lZVE4l6TNKCsLsUfQzsb1pePkd1eRZA+TSqsi+I/IOQlQU7HA0bMrah/5FYyUBP0jYvCOvYTlZuwKBgQCvkcVRydVlzjUgv7lY5lYvT8IHV5iYO4Qkk2q6Wjv9VUKAJZauurMdiy05PboWfs5kbETdwFybXMBcknIvZO4ihxmwL8mcoNwDVZHI4bXapIKMTCyHgUKvJ9SeTcKGC7ZuQJ8mslRmYox/HloTOXEJgQgPRxXcwa3amzvdZI+6LwKBgQCLsnQqgxKUi0m6bdR2qf7vzTH4258z6X34rjpT0F5AEyF1edVFOz0XU/q+lQhpNEi7zqjLuvbYfSyA026WXKuwSsz7jMJ/oWqev/duKgAjp2npesY/E9gkjfobD+zGgoS9BzkyhXe1FCdP0A6L2S/1+zg88WOwMvJxl6/xLl24XwKBgCm60xSajX8yIQyUpWBM9yUtpueJ2Xotgz4ST+bVNbcEAddll8gWFiaqgug9FLLuFu5lkYTHiPtgc1RNdphvO+62/9MRuLDixwh/2TPO+iNqwKDKJjda8Nei9vVddCPaOtU/xNQ0xLzFJbG9LBmvqH9izOCcu8SJwGHaTcNUeJj/AoGADCJ26cY30c13F/8awAAmFYpZWCuTP5ppTsRmjd63ixlrqgkeLGpJ7kYb5fXkcTycRGYgP0e1kssBGcmE7DuG955fx3ZJESX3GQZ+XfMHvYGONwF1EiK1f0p6+GReC2VlQ7PIkoD9o0hojM6SnWvv9EXNjCPALEbfPFFvcniKVsE=',
- pubKey: 'CAASpgIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCTU3gVDv3SRXLOsFln9GEf1nJ/uCEDhOG10eC0H9l9IPpVxjuPT1ep+ykFUdvefq3D3q+W3hbmiHm81o8dYv26RxZIEioToUWp7Ec5M2B/niYoE93za9/ZDwJdl7eh2hNKwAdxTmdbXUPjkIU4vLyHKRFbJIn9X8w9djldz8hoUvC1BK4L1XrT6F2l0ruJXErH2ZwI1youfSzo87TdXIoFKdrQLuW6hOtDCGKTiS+ab/DkMODc6zl8N47Oczv7vjzoWOJMUJs1Pg0ZsD1zmISY38P0y/QyEhatZn0B8BmSWxlLQuukatzOepQI6k+HtfyAAjn4UEqnMaXTP1uwLldVAgMBAAE='
+ id: '12D3KooWLV3w42LqUb9MWE7oTzG7vwaFjPw9GvDqmsuDif5chTn9',
+ privKey: 'CAESYI44p8HiCHtCBhuUcetU9XdIEtWvon15a5ZLsfyssSj9nn3mt4oZI0t6wXTHOvIA0GSFWrYkdKp1338oFIambdKefea3ihkjS3rBdMc68gDQZIVatiR0qnXffygUhqZt0g==',
+ pubKey: 'CAESIJ595reKGSNLesF0xzryANBkhVq2JHSqdd9/KBSGpm3S'
}, {
- id: 'QmZqCdSzgpsmB3Qweb9s4fojAoqELWzqku21UVrqtVSKi4',
- privKey: 'CAASpgkwggSiAgEAAoIBAQCdbSEsTmw7lp5HagRcx57DaLiSUEkh4iBcKc7Y+jHICEIA8NIVi9FlfGEZj9G21FpiTR4Cy+BLVEuf8Nm90bym4iV+cSumeS21fvD8xGTEbeKGljs6OYHy3M45JhWF85gqHQJOqZufI2NRDuRgMZEO2+qGEXmSlv9mMXba/+9ecze8nSpB7bG2Z2pnKDeYwhF9Cz+ElMyn7TBWDjJERGVgFbTpdM3rBnbhB/TGpvs732QqZmIBlxnDb/Jn0l1gNZCgkEDcJ/0NDMBJTQ8vbvcdmaw3eaMPLkn1ix4wdu9QWCA0IBtuY1R7vSUtf4irnLJG7DnAw2GfM5QrF3xF1GLXAgMBAAECggEAQ1N0qHoxl5pmvqv8iaFlqLSUmx5y6GbI6CGJMQpvV9kQQU68yjItr3VuIXx8d/CBZyEMAK4oko7OeOyMcr3MLKLy3gyQWnXgsopDjhZ/8fH8uwps8g2+IZuFJrO+6LaxEPGvFu06fOiphPUVfn40R2KN/iBjGeox+AaXijmCqaV2vEdNJJPpMfz6VKZBDLTrbiqvo/3GN1U99PUqfPWpOWR29oAhh/Au6blSqvqTUPXB2+D/X6e1JXv31mxMPK68atDHSUjZWKB9lE4FMK1bkSKJRbyXmNIlbZ9V8X4/0r8/6T7JnW7ZT8ugRkquohmwgG7KkDXB1YsOCKXYUqzVYQKBgQDtnopFXWYl7XUyePJ/2MA5i7eoko9jmF44L31irqmHc5unNf6JlNBjlxTNx3WyfzhUzrn3c18psnGkqtow0tkBj5hmqn8/WaPbc5UA/5R1FNaNf8W5khn7MDm6KtYRPjN9djqTDiVHyC6ljONYd+5S+MqyKVWZ3t/xvG60sw85qwKBgQCpmpDtL+2JBwkfeUr3LyDcQxvbfzcv8lXj2otopWxWiLiZF1HzcqgAa2CIwu9kCGEt9Zr+9E4uINbe1To0b01/FhvR6xKO/ukceGA/mBB3vsKDcRmvpBUp+3SmnhY0nOk+ArQl4DhJ34k8pDM3EDPrixPf8SfVdU/8IM32lsdHhQKBgHLgpvCKCwxjFLnmBzcPzz8C8TOqR3BbBZIcQ34l+wflOGdKj1hsfaLoM8KYn6pAHzfBCd88A9Hg11hI0VuxVACRL5jS7NnvuGwsIOluppNEE8Ys86aXn7/0vLPoab3EWJhbRE48FIHzobmft3nZ4XpzlWs02JGfUp1IAC2UM9QpAoGAeWy3pZhSr2/iEC5+hUmwdQF2yEbj8+fDpkWo2VrVnX506uXPPkQwE1zM2Bz31t5I9OaJ+U5fSpcoPpDaAwBMs1fYwwlRWB8YNdHY1q6/23svN3uZsC4BGPV2JnO34iMUudilsRg+NGVdk5TbNejbwx7nM8Urh59djFzQGGMKeSECgYA0QMCARPpdMY50Mf2xQaCP7HfMJhESSPaBq9V3xY6ToEOEnXgAR5pNjnU85wnspHp+82r5XrKfEQlFxGpj2YA4DRRmn239sjDa29qP42UNAFg1+C3OvXTht1d5oOabaGhU0udwKmkEKUbb0bG5xPQJ5qeSJ5T1gLzLk3SIP0GlSw==',
- pubKey: 'CAASpgIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCdbSEsTmw7lp5HagRcx57DaLiSUEkh4iBcKc7Y+jHICEIA8NIVi9FlfGEZj9G21FpiTR4Cy+BLVEuf8Nm90bym4iV+cSumeS21fvD8xGTEbeKGljs6OYHy3M45JhWF85gqHQJOqZufI2NRDuRgMZEO2+qGEXmSlv9mMXba/+9ecze8nSpB7bG2Z2pnKDeYwhF9Cz+ElMyn7TBWDjJERGVgFbTpdM3rBnbhB/TGpvs732QqZmIBlxnDb/Jn0l1gNZCgkEDcJ/0NDMBJTQ8vbvcdmaw3eaMPLkn1ix4wdu9QWCA0IBtuY1R7vSUtf4irnLJG7DnAw2GfM5QrF3xF1GLXAgMBAAE='
+ id: '12D3KooWDRHe5x3tEQfZi4yirsdhA3zgqhE8awxAjET7zVF23JHB',
+ privKey: 'CAESYP+GrxgDqKnx79W5l4sgpCEYvNF9bBlCSVu3McENPluhNYVEwxo5KboVuOPnYO6ZOeeTmglqc2vcN8pldRF8lq41hUTDGjkpuhW44+dg7pk555OaCWpza9w3ymV1EXyWrg==',
+ pubKey: 'CAESIDWFRMMaOSm6Fbjj52DumTnnk5oJanNr3DfKZXURfJau'
}, {
- id: 'QmR5VwgsL7jyfZHAGyp66tguVrQhCRQuRc3NokocsCZ3fA',
- privKey: 'CAASpwkwggSjAgEAAoIBAQCGXYU+uc2nn1zuJhfdFOl34upztnrD1gpHu58ousgHdGlGgYgbqLBAvIAauXdEL0+e30HofjA634SQxE+9nV+0FQBam1DDzHQlXsuwHV+2SKvSDkk4bVllMFpu2SJtts6VH+OXC/2ANJOm+eTALykQPYXgLIBxrhp/eD+Jz5r6wW2nq3k6OmYyK/4pgGzFjo5UyX+fa/171AJ68UPboFpDy6BZCcUjS0ondxPvD7cv5jMNqqMKIB/7rpi8n+Q3oeccRqVL56wH+FE3/QLjwYHwY6ILNRyvNXRqHjwBEXB2R5moXN0AFUWTw9rt3KhFiEjR1U81BTw5/xS7W2Iu0FgZAgMBAAECggEAS64HK8JZfE09eYGJNWPe8ECmD1C7quw21BpwVe+GVPSTizvQHswPohbKDMNj0srXDMPxCnNw1OgqcaOwyjsGuZaOoXoTroTM8nOHRIX27+PUqzaStS6aCG2IsiCozKUHjGTuupftS7XRaF4eIsUtWtFcQ1ytZ9pJYHypRQTi5NMSrTze5ThjnWxtHilK7gnBXik+aR0mYEVfSn13czQEC4rMOs+b9RAc/iibDNoLopfIdvmCCvfxzmySnR7Cu1iSUAONkir7PB+2Mt/qRFCH6P+jMamtCgQ8AmifXgVmDUlun+4MnKg3KrPd6ZjOEKhVe9mCHtGozk65RDREShfDdQKBgQDi+x2MuRa9peEMOHnOyXTS+v+MFcfmG0InsO08rFNBKZChLB+c9UHBdIvexpfBHigSyERfuDye4z6lxi8ZnierWMYJP30nxmrnxwTGTk1MQquhfs1A0kpmDnPsjlOS/drEIEIssNx2WbfJ7YtMxLWBtp+BJzGpQmr0LKC+NHRSrwKBgQCXiy2kJESIUkIs2ihV55hhT6/bZo1B1O5DPA2nkjOBXqXF6fvijzMDX82JjLd07lQZlI0n1Q/Hw0p4iYi9YVd2bLkLXF5UIb2qOeHj76enVFOrPHUSkC9Y2g/0Xs+60Ths2xRd8RrrfQU3kl5iVpBywkCIrb2M5+wRnNTk1W3TtwKBgQCvplyrteAfSurpJhs9JzE8w/hWU9SqAZYkWQp91W1oE95Um2yrbjBAoQxMjaqKS+f/APPIjy56Vqj4aHGyhW11b/Fw3qzfxvCcBKtxOs8eoMlo5FO6QgJJEA4tlcafDcvp0nzjUMqK28safLU7503+33B35fjMXxWdd5u9FaKfCQKBgC4W6j6tuRosymuRvgrCcRnHfpify/5loEFallyMnpWOD6Tt0OnK25z/GifnYDRz96gAAh5HMpFy18dpLOlMHamqz2yhHx8/U8vd5tHIJZlCkF/X91M5/uxrBccwvsT2tM6Got8fYSyVzWxlW8dUxIHiinYHQUsFjkqdBDLEpq5pAoGASoTw5RBEWFM0GuAZdXsyNyxU+4S+grkTS7WdW/Ymkukh+bJZbnvF9a6MkSehqXnknthmufonds2AFNS//63gixENsoOhzT5+2cdfc6tJECvJ9xXVXkf85AoQ6T/RrXF0W4m9yQyCngNJUrKUOIH3oDIfdZITlYzOC3u1ojj7VuQ=',
- pubKey: 'CAASpgIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCGXYU+uc2nn1zuJhfdFOl34upztnrD1gpHu58ousgHdGlGgYgbqLBAvIAauXdEL0+e30HofjA634SQxE+9nV+0FQBam1DDzHQlXsuwHV+2SKvSDkk4bVllMFpu2SJtts6VH+OXC/2ANJOm+eTALykQPYXgLIBxrhp/eD+Jz5r6wW2nq3k6OmYyK/4pgGzFjo5UyX+fa/171AJ68UPboFpDy6BZCcUjS0ondxPvD7cv5jMNqqMKIB/7rpi8n+Q3oeccRqVL56wH+FE3/QLjwYHwY6ILNRyvNXRqHjwBEXB2R5moXN0AFUWTw9rt3KhFiEjR1U81BTw5/xS7W2Iu0FgZAgMBAAE='
+ id: '12D3KooWQJMnsoT7js35ZgkboxzUjXpVhfvG8cMqZnBJTP4XPuhU',
+ privKey: 'CAESYL1Fwm/+layh15V1ITWkK9tEQLuGeJFi16VkNDUU+GFs1y90DFs9vlkRziuJFZ/QtEIlYZWjFTsNRJxFA/etwCvXL3QMWz2+WRHOK4kVn9C0QiVhlaMVOw1EnEUD963AKw==',
+ pubKey: 'CAESINcvdAxbPb5ZEc4riRWf0LRCJWGVoxU7DUScRQP3rcAr'
}, {
- id: 'QmScLDqRg7H6ipCYxm9fVk152UWavQFKscTdoT4YNHxgqp',
- privKey: 'CAASpwkwggSjAgEAAoIBAQCWEHaTZ6LBLFP5OPrUqjDM/cF4b2zrfh1Zm3kd02ZtgQB3iYtZqRPJT5ctT3A7WdVF/7dCxPGOCkJlLekTx4Y4gD8JtjA+EfN9fR/2RBKbti2N3CD4vkGp9ss4hbBFcXIhl8zuD/ELHutbV6b8b4QXJGnxfp/B+1kNPnyd7SJznS0QyvI8OLI1nAkVKdYLDRW8kPKeHyx1xhdNDuTQVTFyAjRGQ4e3UYFB7bYIHW3E6kCtCoJDlj+JPC02Yt1LHzIzZVLvPvNFnYY2mag6OiGFuh/oMBIqvnPc1zRZ3eLUqeGZjQVaoR0kdgZUKz7Q2TBeNldxK/s6XO0DnkQTlelNAgMBAAECggEAdmt1dyswR2p4tdIeNpY7Pnj9JNIhTNDPznefI0dArCdBvBMhkVaYk6MoNIxcj6l7YOrDroAF8sXr0TZimMY6B/pERKCt/z1hPWTxRQBBAvnHhwvwRPq2jK6BfhAZoyM8IoBNKowP9mum5QUNdGV4Al8s73KyFX0IsCfgZSvNpRdlt+DzPh+hu/CyoZaMpRchJc1UmK8Fyk3KfO+m0DZNfHP5P08lXNfM6MZLgTJVVgERHyG+vBOzTd2RElMe19nVCzHwb3dPPRZSQ7Fnz3rA+GeLqsM2Zi4HNhfbD1OcD9C4wDj5tYL6hWTkdz4IlfVcjCeUHxgIOhdDV2K+OwbuAQKBgQD0FjUZ09UW2FQ/fitbvIB5f1SkXWPxTF9l6mAeuXhoGv2EtQUO4vq/PK6N08RjrZdWQy6UsqHgffi7lVQ8o3hvCKdbtf4sP+cM92OrY0WZV89os79ndj4tyvmnP8WojwRjt/2XEfgdoWcgWxW9DiYINTOQVimZX+X/3on4s8hEgQKBgQCdY3kOMbyQeLTRkqHXjVTY4ddO+v4S4wOUa1l4rTqAbq1W3JYWwoDQgFuIu3limIHmjnSJpCD4EioXFsM7p6csenoc20sHxsaHnJ6Mn5Te41UYmY9EW0otkQ0C3KbXM0hwQkjyplnEmZawGKmjEHW8DJ3vRYTv9TUCgYKxDHgOzQKBgB4A/NYH7BG61eBYKgxEx6YnuMfbkwV+Vdu5S8d7FQn3B2LgvZZu4FPRqcNVXLbEB+5ao8czjiKCWaj1Wj15+rvrXGcxn+Tglg5J+r5+nXeUC7LbJZQaPNp0MOwWMr3dlrSLUWjYlJ9Pz9VyXOG4c4Rexc/gR4zK9QLW4C7qKpwBAoGAZzyUb0cYlPtYQA+asTU3bnvVKy1f8yuNcZFowst+EDiI4u0WVh+HNzy6zdmLKa03p+/RaWeLaK0hhrubnEnAUmCUMNF3ScaM+u804LDcicc8TkKLwx7ObU0z56isl4RAA8K27tNHFrpYKXJD834cfBkaj5ReOrfw6Y/iFhhDuBECgYEA8gbC76uz7LSHhW30DSRTcqOzTyoe2oYKQaxuxYNp7vSSOkcdRen+mrdflDvud2q/zN2QdL4pgqdldHlR35M/lJ0f0B6zp74jlzbO9700wzsOqreezGc5eWiroDL100U9uIZ50BKb8CKtixIHpinUSPIUcVDkSAZ2y7mbfCxQwqQ=',
- pubKey: 'CAASpgIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCWEHaTZ6LBLFP5OPrUqjDM/cF4b2zrfh1Zm3kd02ZtgQB3iYtZqRPJT5ctT3A7WdVF/7dCxPGOCkJlLekTx4Y4gD8JtjA+EfN9fR/2RBKbti2N3CD4vkGp9ss4hbBFcXIhl8zuD/ELHutbV6b8b4QXJGnxfp/B+1kNPnyd7SJznS0QyvI8OLI1nAkVKdYLDRW8kPKeHyx1xhdNDuTQVTFyAjRGQ4e3UYFB7bYIHW3E6kCtCoJDlj+JPC02Yt1LHzIzZVLvPvNFnYY2mag6OiGFuh/oMBIqvnPc1zRZ3eLUqeGZjQVaoR0kdgZUKz7Q2TBeNldxK/s6XO0DnkQTlelNAgMBAAE='
+ id: '12D3KooWFYyvJysHGbbYiruVY8bgjKn7sYN9axgbnMxrWVkGXABF',
+ privKey: 'CAESYCtlyHA9SQ9F0yO6frmkrFFmboLCzGt8syr0ix8QkuTcVTVAp9JiBXb2xI1lzK6Fn2mRJUxtQIuuW+3V2mu3DZZVNUCn0mIFdvbEjWXMroWfaZElTG1Ai65b7dXaa7cNlg==',
+ pubKey: 'CAESIFU1QKfSYgV29sSNZcyuhZ9pkSVMbUCLrlvt1dprtw2W'
}, {
- id: 'QmckxVrJw1Yo8LqvmDJNUmdAsKtSbiKWmrXJFyKmUraBoN',
- privKey: 'CAASpwkwggSjAgEAAoIBAQC1/GFud/7xutux7qRfMj1sIdMRh99/chR6HqVj6LQqrgk4jil0mdN/LCk/tqPqmDtObHdmEhCoybzuhLbCKgUqryKDwO6yBJHSKWY9QqrKZtLJ37SgKwGjE3+NUD4r1dJHhtQrICFdOdSCBzs/v8gi+J+KZLHo7+Nms4z09ysy7qZh94Pd7cW4gmSMergqUeANLD9C0ERw1NXolswOW7Bi7UGr7yuBxejICLO3nkxe0OtpQBrYrqdCD9vs3t/HQZbPWVoiRj4VO7fxkAPKLl30HzcIfxj/ayg8NHcH59d08D+N2v5Sdh28gsiYKIPE9CXvuw//HUY2WVRY5fDC5JglAgMBAAECggEBAKb5aN/1w3pBqz/HqRMbQpYLNuD33M3PexBNPAy+P0iFpDo63bh5Rz+A4lvuFNmzUX70MFz7qENlzi6+n/zolxMB29YtWBUH8k904rTEjXXl//NviQgITZk106tx+4k2x5gPEm57LYGfBOdFAUzNhzDnE2LkXwRNzkS161f7zKwOEsaGWRscj6UvhO4MIFxjb32CVwt5eK4yOVqtyMs9u30K4Og+AZYTlhtm+bHg6ndCCBO6CQurCQ3jD6YOkT+L3MotKqt1kORpvzIB0ujZRf49Um8wlcjC5G9aexBeGriXaVdPF62zm7GA7RMsbQM/6aRbA1fEQXvJhHUNF9UFeaECgYEA8wCjKqQA7UQnHjRwTsktdwG6szfxd7z+5MTqHHTWhWzgcQLgdh5/dO/zanEoOThadMk5C1Bqjq96gH2xim8dg5XQofSVtV3Ui0dDa+XRB3E3fyY4D3RF5hHv85O0GcvQc6DIb+Ja1oOhvHowFB1C+CT3yEgwzX/EK9xpe+KtYAkCgYEAv7hCnj/DcZFU3fAfS+unBLuVoVJT/drxv66P686s7J8UM6tW+39yDBZ1IcwY9vHFepBvxY2fFfEeLI02QFM+lZXVhNGzFkP90agNHK01psGgrmIufl9zAo8WOKgkLgbYbSHzkkDeqyjEPU+B0QSsZOCE+qLCHSdsnTmo/TjQhj0CgYAz1+j3yfGgrS+jVBC53lXi0+2fGspbf2jqKdDArXSvFqFzuudki/EpY6AND4NDYfB6hguzjD6PnoSGMUrVfAtR7X6LbwEZpqEX7eZGeMt1yQPMDr1bHrVi9mS5FMQR1NfuM1lP9Xzn00GIUpE7WVrWUhzDEBPJY/7YVLf0hFH08QKBgDWBRQZJIVBmkNrHktRrVddaSq4U/d/Q5LrsCrpymYwH8WliHgpeTQPWmKXwAd+ZJdXIzYjCt202N4eTeVqGYOb6Q/anV2WVYBbM4avpIxoA28kPGY6nML+8EyWIt2ApBOmgGgvtEreNzwaVU9NzjHEyv6n7FlVwlT1jxCe3XWq5AoGASYPKQoPeDlW+NmRG7z9EJXJRPVtmLL40fmGgtju9QIjLnjuK8XaczjAWT+ySI93Whu+Eujf2Uj7Q+NfUjvAEzJgwzuOd3jlQvoALq11kuaxlNQTn7rx0A1QhBgUJE8AkvShPC9FEnA4j/CLJU0re9H/8VvyN6qE0Mho0+YbjpP8=',
- pubKey: 'CAASpgIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC1/GFud/7xutux7qRfMj1sIdMRh99/chR6HqVj6LQqrgk4jil0mdN/LCk/tqPqmDtObHdmEhCoybzuhLbCKgUqryKDwO6yBJHSKWY9QqrKZtLJ37SgKwGjE3+NUD4r1dJHhtQrICFdOdSCBzs/v8gi+J+KZLHo7+Nms4z09ysy7qZh94Pd7cW4gmSMergqUeANLD9C0ERw1NXolswOW7Bi7UGr7yuBxejICLO3nkxe0OtpQBrYrqdCD9vs3t/HQZbPWVoiRj4VO7fxkAPKLl30HzcIfxj/ayg8NHcH59d08D+N2v5Sdh28gsiYKIPE9CXvuw//HUY2WVRY5fDC5JglAgMBAAE='
+ id: '12D3KooWHFKTMzwerBtsVmtz4ZZEQy2heafxzWw6wNn5PPYkBxJ5',
+ privKey: 'CAESYLU/qFxBHsdsQa63w3MrP8VvxJDyAk7rB7gLnIN01CyibmZCtQc7a1gIEDOGb10maUltL8wJxEdmOw3Bpjo7xrpuZkK1BztrWAgQM4ZvXSZpSW0vzAnER2Y7DcGmOjvGug==',
+ pubKey: 'CAESIG5mQrUHO2tYCBAzhm9dJmlJbS/MCcRHZjsNwaY6O8a6'
}]
diff --git a/test/peer-store/persisted-peer-store.spec.js b/test/peer-store/persisted-peer-store.spec.js
index ee6b1cedfb..3c58e21dcc 100644
--- a/test/peer-store/persisted-peer-store.spec.js
+++ b/test/peer-store/persisted-peer-store.spec.js
@@ -135,8 +135,7 @@ describe('Persisted PeerStore', () => {
peerStore.keyBook.set(peers[0], peers[0].pubKey)
peerStore.keyBook.set(peers[1], peers[1].pubKey)
- // let batch commit complete
- await Promise.all(commitSpy.returnValues)
+ // no batch commit as public key inline
// ProtoBook
peerStore.protoBook.set(peers[0], protocols)
@@ -151,7 +150,7 @@ describe('Persisted PeerStore', () => {
// let batch commit complete
await Promise.all(commitSpy.returnValues)
- expect(spyDs).to.have.property('callCount', 7) // 2 Address + 2 Key + 2 Proto + 1 Metadata
+ expect(spyDs).to.have.property('callCount', 5) // 2 Address + 2 Proto + 1 Metadata
expect(peerStore.peers.size).to.equal(2)
await peerStore.stop()
@@ -164,12 +163,12 @@ describe('Persisted PeerStore', () => {
await peerStore.start()
- expect(spy).to.have.property('callCount', 7)
- expect(spyDs).to.have.property('callCount', 7)
+ expect(spy).to.have.property('callCount', 5)
+ expect(spyDs).to.have.property('callCount', 5)
expect(peerStore.peers.size).to.equal(2)
expect(peerStore.addressBook.data.size).to.equal(2)
- expect(peerStore.keyBook.data.size).to.equal(2)
+ expect(peerStore.keyBook.data.size).to.equal(0)
expect(peerStore.protoBook.data.size).to.equal(2)
expect(peerStore.metadataBook.data.size).to.equal(1)
})
From a1053bdc54a51bc1adeddae338ab382c801f7fb7 Mon Sep 17 00:00:00 2001
From: Vasco Santos
Date: Wed, 7 Oct 2020 14:51:51 +0200
Subject: [PATCH 011/447] chore: remove outdated events from libp2p js docs
(#766)
---
src/index.js | 2 --
1 file changed, 2 deletions(-)
diff --git a/src/index.js b/src/index.js
index e7a70e013b..cd900457d6 100644
--- a/src/index.js
+++ b/src/index.js
@@ -35,8 +35,6 @@ const {
/**
* @fires Libp2p#error Emitted when an error occurs
- * @fires Libp2p#peer:connect Emitted when a peer is connected to this node
- * @fires Libp2p#peer:disconnect Emitted when a peer disconnects from this node
* @fires Libp2p#peer:discovery Emitted when a peer is discovered
*/
class Libp2p extends EventEmitter {
From ec6f7d1cfd70f69a970d1af72ff0c2918df070ce Mon Sep 17 00:00:00 2001
From: Vasco Santos
Date: Wed, 7 Oct 2020 15:39:24 +0200
Subject: [PATCH 012/447] chore: lint issue fixed (#775)
---
src/peer-store/persistent/index.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/peer-store/persistent/index.js b/src/peer-store/persistent/index.js
index 5b5d4f8ac4..70a417f4f7 100644
--- a/src/peer-store/persistent/index.js
+++ b/src/peer-store/persistent/index.js
@@ -113,6 +113,7 @@ class PersistentPeerStore extends PeerStore {
/**
* Add modified peer key to the dirty set
+ *
* @private
* @param {Object} params
* @param {PeerId} params.peerId
From 2fd3b0a0e590aee2963dfe6b4a550584d6e90561 Mon Sep 17 00:00:00 2001
From: Vasco Santos
Date: Wed, 7 Oct 2020 16:16:36 +0200
Subject: [PATCH 013/447] chore: examples not using secio (#747)
* chore: examples not using secio
* chore(docs): remove unused dep
* chore(docs): remove reference of secio in setup
* chore(docs): replace circuit secio reference with noise
Co-authored-by: Jacob Heun
---
doc/CONFIGURATION.md | 2 +-
examples/chat/src/libp2p-bundle.js | 3 +--
examples/chat/src/listener.js | 1 -
examples/chat/src/stream.js | 1 -
examples/discovery-mechanisms/1.js | 3 +--
examples/discovery-mechanisms/2.js | 3 +--
examples/discovery-mechanisms/README.md | 8 ++++----
examples/echo/src/libp2p-bundle.js | 3 +--
examples/encrypted-communications/1.js | 3 +--
examples/encrypted-communications/README.md | 13 +++----------
examples/libp2p-in-the-browser/index.js | 3 +--
examples/libp2p-in-the-browser/package.json | 1 -
examples/peer-and-content-routing/1.js | 3 +--
examples/peer-and-content-routing/2.js | 3 +--
examples/peer-and-content-routing/README.md | 2 +-
examples/pnet/libp2p-node.js | 3 +--
examples/protocol-and-stream-muxing/1.js | 3 +--
examples/protocol-and-stream-muxing/2.js | 3 +--
examples/protocol-and-stream-muxing/3.js | 3 +--
examples/pubsub/1.js | 3 +--
examples/pubsub/README.md | 2 +-
examples/pubsub/message-filtering/1.js | 3 +--
examples/pubsub/message-filtering/README.md | 2 +-
examples/transports/1.js | 3 +--
examples/transports/2.js | 3 +--
examples/transports/3.js | 3 +--
examples/transports/README.md | 7 +++----
src/circuit/README.md | 4 ++--
28 files changed, 33 insertions(+), 61 deletions(-)
diff --git a/doc/CONFIGURATION.md b/doc/CONFIGURATION.md
index 4c219481ee..4983754c2e 100644
--- a/doc/CONFIGURATION.md
+++ b/doc/CONFIGURATION.md
@@ -223,7 +223,7 @@ Besides the `modules` and `config`, libp2p allows other internal options and con
// Creating a libp2p node with:
// transport: websockets + tcp
// stream-muxing: mplex
-// crypto-channel: secio
+// crypto-channel: noise
// discovery: multicast-dns
// dht: kad-dht
// pubsub: gossipsub
diff --git a/examples/chat/src/libp2p-bundle.js b/examples/chat/src/libp2p-bundle.js
index 92771d664a..dd4596708f 100644
--- a/examples/chat/src/libp2p-bundle.js
+++ b/examples/chat/src/libp2p-bundle.js
@@ -3,7 +3,6 @@
const TCP = require('libp2p-tcp')
const WS = require('libp2p-websockets')
const mplex = require('libp2p-mplex')
-const SECIO = require('libp2p-secio')
const { NOISE } = require('libp2p-noise')
const defaultsDeep = require('@nodeutils/defaults-deep')
const libp2p = require('../../..')
@@ -17,7 +16,7 @@ class Node extends libp2p {
WS
],
streamMuxer: [ mplex ],
- connEncryption: [ NOISE, SECIO ]
+ connEncryption: [ NOISE ]
}
}
diff --git a/examples/chat/src/listener.js b/examples/chat/src/listener.js
index 8b30773d64..9b4aa49576 100644
--- a/examples/chat/src/listener.js
+++ b/examples/chat/src/listener.js
@@ -1,7 +1,6 @@
'use strict'
/* eslint-disable no-console */
-const multaddr = require('multiaddr')
const PeerId = require('peer-id')
const Node = require('./libp2p-bundle.js')
const { stdinToStream, streamToConsole } = require('./stream')
diff --git a/examples/chat/src/stream.js b/examples/chat/src/stream.js
index 6c44abcbf4..7e883db03c 100644
--- a/examples/chat/src/stream.js
+++ b/examples/chat/src/stream.js
@@ -3,7 +3,6 @@
const pipe = require('it-pipe')
const lp = require('it-length-prefixed')
-const uint8ArrayToString = require('uint8arrays/to-string')
function stdinToStream(stream) {
// Read utf-8 from stdin
diff --git a/examples/discovery-mechanisms/1.js b/examples/discovery-mechanisms/1.js
index 5f006406c0..b21f6eddc9 100644
--- a/examples/discovery-mechanisms/1.js
+++ b/examples/discovery-mechanisms/1.js
@@ -4,7 +4,6 @@
const Libp2p = require('../../')
const TCP = require('libp2p-tcp')
const Mplex = require('libp2p-mplex')
-const SECIO = require('libp2p-secio')
const { NOISE } = require('libp2p-noise')
const Bootstrap = require('libp2p-bootstrap')
@@ -29,7 +28,7 @@ const bootstrapers = [
modules: {
transport: [TCP],
streamMuxer: [Mplex],
- connEncryption: [NOISE, SECIO],
+ connEncryption: [NOISE],
peerDiscovery: [Bootstrap]
},
config: {
diff --git a/examples/discovery-mechanisms/2.js b/examples/discovery-mechanisms/2.js
index 3481675c7b..15c801cdec 100644
--- a/examples/discovery-mechanisms/2.js
+++ b/examples/discovery-mechanisms/2.js
@@ -4,7 +4,6 @@
const Libp2p = require('../../')
const TCP = require('libp2p-tcp')
const Mplex = require('libp2p-mplex')
-const SECIO = require('libp2p-secio')
const { NOISE } = require('libp2p-noise')
const MulticastDNS = require('libp2p-mdns')
@@ -16,7 +15,7 @@ const createNode = async () => {
modules: {
transport: [TCP],
streamMuxer: [Mplex],
- connEncryption: [NOISE, SECIO],
+ connEncryption: [NOISE],
peerDiscovery: [MulticastDNS]
},
config: {
diff --git a/examples/discovery-mechanisms/README.md b/examples/discovery-mechanisms/README.md
index db75f76565..8234716d13 100644
--- a/examples/discovery-mechanisms/README.md
+++ b/examples/discovery-mechanisms/README.md
@@ -8,7 +8,7 @@ These mechanisms save configuration and enable a node to operate without any exp
## 1. Bootstrap list of Peers when booting a node
-For this demo, we will connect to IPFS default bootstrapper nodes and so, we will need to support the same set of features those nodes have, that are: TCP, mplex and SECIO. You can see the complete example at [1.js](./1.js).
+For this demo, we will connect to IPFS default bootstrapper nodes and so, we will need to support the same set of features those nodes have, that are: TCP, mplex and NOISE. You can see the complete example at [1.js](./1.js).
First, we create our libp2p node.
@@ -20,7 +20,7 @@ const node = Libp2p.create({
modules: {
transport: [ TCP ],
streamMuxer: [ Mplex ],
- connEncryption: [ NOISE, SECIO ],
+ connEncryption: [ NOISE ],
peerDiscovery: [ Bootstrap ]
},
config: {
@@ -62,7 +62,7 @@ const node = await Libp2p.create({
modules: {
transport: [ TCP ],
streamMuxer: [ Mplex ],
- connEncryption: [ NOISE, SECIO ],
+ connEncryption: [ NOISE ],
peerDiscovery: [ Bootstrap ]
},
config: {
@@ -130,7 +130,7 @@ const createNode = () => {
modules: {
transport: [ TCP ],
streamMuxer: [ Mplex ],
- connEncryption: [ NOISE, SECIO ],
+ connEncryption: [ NOISE ],
peerDiscovery: [ MulticastDNS ]
},
config: {
diff --git a/examples/echo/src/libp2p-bundle.js b/examples/echo/src/libp2p-bundle.js
index 106bf69411..0e11a7103d 100644
--- a/examples/echo/src/libp2p-bundle.js
+++ b/examples/echo/src/libp2p-bundle.js
@@ -3,7 +3,6 @@
const TCP = require('libp2p-tcp')
const WS = require('libp2p-websockets')
const mplex = require('libp2p-mplex')
-const SECIO = require('libp2p-secio')
const { NOISE } = require('libp2p-noise')
const defaultsDeep = require('@nodeutils/defaults-deep')
@@ -18,7 +17,7 @@ class Node extends libp2p {
WS
],
streamMuxer: [ mplex ],
- connEncryption: [ NOISE, SECIO ]
+ connEncryption: [ NOISE ]
}
}
diff --git a/examples/encrypted-communications/1.js b/examples/encrypted-communications/1.js
index 8f908a6dee..d17498afcd 100644
--- a/examples/encrypted-communications/1.js
+++ b/examples/encrypted-communications/1.js
@@ -4,7 +4,6 @@ const Libp2p = require('../../')
const TCP = require('libp2p-tcp')
const Mplex = require('libp2p-mplex')
const { NOISE } = require('libp2p-noise')
-const SECIO = require('libp2p-secio')
const pipe = require('it-pipe')
@@ -16,7 +15,7 @@ const createNode = async () => {
modules: {
transport: [TCP],
streamMuxer: [Mplex],
- connEncryption: [NOISE, SECIO]
+ connEncryption: [NOISE]
}
})
diff --git a/examples/encrypted-communications/README.md b/examples/encrypted-communications/README.md
index a17939c7bd..3e23ea6de5 100644
--- a/examples/encrypted-communications/README.md
+++ b/examples/encrypted-communications/README.md
@@ -8,31 +8,24 @@ A byproduct of having these encrypted communications modules is that we can auth
# 1. Set up encrypted communications
-We will build this example on top of example for [Protocol and Stream Multiplexing](../protocol-and-stream-multiplexing). You will need the modules `libp2p-secio`* and `libp2p-noise` to complete it, go ahead and `npm install libp2p-secio libp2p-noise`.
+We will build this example on top of example for [Protocol and Stream Multiplexing](../protocol-and-stream-multiplexing). You will need the `libp2p-noise` module to complete it, go ahead and `npm install libp2p-noise`.
To add them to your libp2p configuration, all you have to do is:
```JavaScript
const Libp2p = require('libp2p')
const { NOISE } = require('libp2p-noise')
-const SECIO = require('libp2p-secio')
const createNode = () => {
return Libp2p.create({
modules: {
transport: [ TCP ],
streamMuxer: [ Mplex ],
- // Attach secio as the crypto channel to use
- connEncryption: [ NOISE, SECIO ]
+ // Attach noise as the crypto channel to use
+ connEncryption: [ NOISE ]
}
})
}
```
And that's it, from now on, all your libp2p communications are encrypted. Try running the example [1.js](./1.js) to see it working.
-
-_* SECIO is the crypto channel developed for IPFS, it is a TLS 1.3 like crypto channel that established an encrypted communication channel between two peers._
-
-If you want to want to learn more about how SECIO works, you can read the [great write up done by Dominic Tarr](https://github.com/auditdrivencrypto/secure-channel/blob/master/prior-art.md#ipfss-secure-channel).
-
-Important note: SECIO hasn't been audited and so, we do not recommend to trust its security. We intent to move to TLS 1.3 once the specification is finalized and an implementation exists that we can use.
diff --git a/examples/libp2p-in-the-browser/index.js b/examples/libp2p-in-the-browser/index.js
index dcd8b8da37..be03f08b6c 100644
--- a/examples/libp2p-in-the-browser/index.js
+++ b/examples/libp2p-in-the-browser/index.js
@@ -3,7 +3,6 @@ import Libp2p from 'libp2p'
import Websockets from 'libp2p-websockets'
import WebRTCStar from 'libp2p-webrtc-star'
import { NOISE } from 'libp2p-noise'
-import Secio from 'libp2p-secio'
import Mplex from 'libp2p-mplex'
import Bootstrap from 'libp2p-bootstrap'
@@ -21,7 +20,7 @@ document.addEventListener('DOMContentLoaded', async () => {
},
modules: {
transport: [Websockets, WebRTCStar],
- connEncryption: [NOISE, Secio],
+ connEncryption: [NOISE],
streamMuxer: [Mplex],
peerDiscovery: [Bootstrap]
},
diff --git a/examples/libp2p-in-the-browser/package.json b/examples/libp2p-in-the-browser/package.json
index 6c8b212361..8d09b86d31 100644
--- a/examples/libp2p-in-the-browser/package.json
+++ b/examples/libp2p-in-the-browser/package.json
@@ -19,7 +19,6 @@
"libp2p-bootstrap": "^0.12.1",
"libp2p-mplex": "^0.10.0",
"libp2p-noise": "^2.0.0",
- "libp2p-secio": "^0.13.1",
"libp2p-webrtc-star": "^0.20.0",
"libp2p-websockets": "^0.14.0"
},
diff --git a/examples/peer-and-content-routing/1.js b/examples/peer-and-content-routing/1.js
index a6940cbe1f..46c54f1d79 100644
--- a/examples/peer-and-content-routing/1.js
+++ b/examples/peer-and-content-routing/1.js
@@ -5,7 +5,6 @@ const Libp2p = require('../../')
const TCP = require('libp2p-tcp')
const Mplex = require('libp2p-mplex')
const { NOISE } = require('libp2p-noise')
-const SECIO = require('libp2p-secio')
const KadDHT = require('libp2p-kad-dht')
const delay = require('delay')
@@ -18,7 +17,7 @@ const createNode = async () => {
modules: {
transport: [TCP],
streamMuxer: [Mplex],
- connEncryption: [NOISE, SECIO],
+ connEncryption: [NOISE],
dht: KadDHT
},
config: {
diff --git a/examples/peer-and-content-routing/2.js b/examples/peer-and-content-routing/2.js
index 51fcb96426..14f513ecfd 100644
--- a/examples/peer-and-content-routing/2.js
+++ b/examples/peer-and-content-routing/2.js
@@ -4,7 +4,6 @@
const Libp2p = require('../../')
const TCP = require('libp2p-tcp')
const Mplex = require('libp2p-mplex')
-const SECIO = require('libp2p-secio')
const { NOISE } = require('libp2p-noise')
const CID = require('cids')
const KadDHT = require('libp2p-kad-dht')
@@ -20,7 +19,7 @@ const createNode = async () => {
modules: {
transport: [TCP],
streamMuxer: [Mplex],
- connEncryption: [NOISE, SECIO],
+ connEncryption: [NOISE],
dht: KadDHT
},
config: {
diff --git a/examples/peer-and-content-routing/README.md b/examples/peer-and-content-routing/README.md
index 6079e07f38..9832003e22 100644
--- a/examples/peer-and-content-routing/README.md
+++ b/examples/peer-and-content-routing/README.md
@@ -23,7 +23,7 @@ const node = await Libp2p.create({
modules: {
transport: [ TCP ],
streamMuxer: [ Mplex ],
- connEncryption: [ NOISE, SECIO ],
+ connEncryption: [ NOISE ],
// we add the DHT module that will enable Peer and Content Routing
dht: KadDHT
},
diff --git a/examples/pnet/libp2p-node.js b/examples/pnet/libp2p-node.js
index 849d47d35f..8fc8a01f4b 100644
--- a/examples/pnet/libp2p-node.js
+++ b/examples/pnet/libp2p-node.js
@@ -3,7 +3,6 @@
const Libp2p = require('libp2p')
const TCP = require('libp2p-tcp')
const MPLEX = require('libp2p-mplex')
-const SECIO = require('libp2p-secio')
const { NOISE } = require('libp2p-noise')
const Protector = require('libp2p/src/pnet')
@@ -24,7 +23,7 @@ const privateLibp2pNode = async (swarmKey) => {
streamMuxer: [MPLEX], // We're only using mplex muxing
// Let's make sure to use identifying crypto in our pnet since the protector doesn't
// care about node identity, and only the presence of private keys
- connEncryption: [NOISE, SECIO],
+ connEncryption: [NOISE],
// Leave peer discovery empty, we don't want to find peers. We could omit the property, but it's
// being left in for explicit readability.
// We should explicitly dial pnet peers, or use a custom discovery service for finding nodes in our pnet
diff --git a/examples/protocol-and-stream-muxing/1.js b/examples/protocol-and-stream-muxing/1.js
index 1c4ab27ee1..70ee3175f6 100644
--- a/examples/protocol-and-stream-muxing/1.js
+++ b/examples/protocol-and-stream-muxing/1.js
@@ -4,7 +4,6 @@ const Libp2p = require('../../')
const TCP = require('libp2p-tcp')
const MPLEX = require('libp2p-mplex')
const { NOISE } = require('libp2p-noise')
-const SECIO = require('libp2p-secio')
const pipe = require('it-pipe')
@@ -16,7 +15,7 @@ const createNode = async () => {
modules: {
transport: [TCP],
streamMuxer: [MPLEX],
- connEncryption: [NOISE, SECIO]
+ connEncryption: [NOISE]
}
})
diff --git a/examples/protocol-and-stream-muxing/2.js b/examples/protocol-and-stream-muxing/2.js
index d2e46ccaa1..3ac6bd4206 100644
--- a/examples/protocol-and-stream-muxing/2.js
+++ b/examples/protocol-and-stream-muxing/2.js
@@ -4,7 +4,6 @@ const Libp2p = require('../../')
const TCP = require('libp2p-tcp')
const MPLEX = require('libp2p-mplex')
const { NOISE } = require('libp2p-noise')
-const SECIO = require('libp2p-secio')
const pipe = require('it-pipe')
@@ -16,7 +15,7 @@ const createNode = async () => {
modules: {
transport: [TCP],
streamMuxer: [MPLEX],
- connEncryption: [NOISE, SECIO]
+ connEncryption: [NOISE]
}
})
diff --git a/examples/protocol-and-stream-muxing/3.js b/examples/protocol-and-stream-muxing/3.js
index a247722e00..bd15f55f8a 100644
--- a/examples/protocol-and-stream-muxing/3.js
+++ b/examples/protocol-and-stream-muxing/3.js
@@ -5,7 +5,6 @@ const Libp2p = require('../../')
const TCP = require('libp2p-tcp')
const MPLEX = require('libp2p-mplex')
const { NOISE } = require('libp2p-noise')
-const SECIO = require('libp2p-secio')
const pipe = require('it-pipe')
@@ -17,7 +16,7 @@ const createNode = async () => {
modules: {
transport: [TCP],
streamMuxer: [MPLEX],
- connEncryption: [NOISE, SECIO]
+ connEncryption: [NOISE]
}
})
diff --git a/examples/pubsub/1.js b/examples/pubsub/1.js
index 62cf622d2c..8c6fdfdb91 100644
--- a/examples/pubsub/1.js
+++ b/examples/pubsub/1.js
@@ -5,7 +5,6 @@ const Libp2p = require('../../')
const TCP = require('libp2p-tcp')
const Mplex = require('libp2p-mplex')
const { NOISE } = require('libp2p-noise')
-const SECIO = require('libp2p-secio')
const Gossipsub = require('libp2p-gossipsub')
const uint8ArrayFromString = require('uint8arrays/from-string')
const uint8ArrayToString = require('uint8arrays/to-string')
@@ -18,7 +17,7 @@ const createNode = async () => {
modules: {
transport: [TCP],
streamMuxer: [Mplex],
- connEncryption: [NOISE, SECIO],
+ connEncryption: [NOISE],
pubsub: Gossipsub
}
})
diff --git a/examples/pubsub/README.md b/examples/pubsub/README.md
index 96e7892a60..17a896f3a6 100644
--- a/examples/pubsub/README.md
+++ b/examples/pubsub/README.md
@@ -27,7 +27,7 @@ const node = await Libp2p.create({
modules: {
transport: [ TCP ],
streamMuxer: [ Mplex ],
- connEncryption: [ NOISE, SECIO ],
+ connEncryption: [ NOISE ],
// we add the Pubsub module we want
pubsub: Gossipsub
}
diff --git a/examples/pubsub/message-filtering/1.js b/examples/pubsub/message-filtering/1.js
index fffcd2e7a2..85d7bcf8c4 100644
--- a/examples/pubsub/message-filtering/1.js
+++ b/examples/pubsub/message-filtering/1.js
@@ -5,7 +5,6 @@ const Libp2p = require('../../../')
const TCP = require('libp2p-tcp')
const Mplex = require('libp2p-mplex')
const { NOISE } = require('libp2p-noise')
-const SECIO = require('libp2p-secio')
const Gossipsub = require('libp2p-gossipsub')
const uint8ArrayFromString = require('uint8arrays/from-string')
const uint8ArrayToString = require('uint8arrays/to-string')
@@ -18,7 +17,7 @@ const createNode = async () => {
modules: {
transport: [TCP],
streamMuxer: [Mplex],
- connEncryption: [NOISE, SECIO],
+ connEncryption: [NOISE],
pubsub: Gossipsub
}
})
diff --git a/examples/pubsub/message-filtering/README.md b/examples/pubsub/message-filtering/README.md
index bff85c9077..a9c0dad26d 100644
--- a/examples/pubsub/message-filtering/README.md
+++ b/examples/pubsub/message-filtering/README.md
@@ -17,7 +17,7 @@ const node = await Libp2p.create({
modules: {
transport: [ TCP ],
streamMuxer: [ Mplex ],
- connEncryption: [ NOISE, SECIO ],
+ connEncryption: [ NOISE ],
pubsub: Gossipsub
}
})
diff --git a/examples/transports/1.js b/examples/transports/1.js
index 49fc386bf5..cd78019dfb 100644
--- a/examples/transports/1.js
+++ b/examples/transports/1.js
@@ -4,7 +4,6 @@
const Libp2p = require('../..')
const TCP = require('libp2p-tcp')
const { NOISE } = require('libp2p-noise')
-const SECIO = require('libp2p-secio')
const createNode = async () => {
const node = await Libp2p.create({
@@ -15,7 +14,7 @@ const createNode = async () => {
},
modules: {
transport: [TCP],
- connEncryption: [NOISE, SECIO]
+ connEncryption: [NOISE]
}
})
diff --git a/examples/transports/2.js b/examples/transports/2.js
index 7310ed867e..f7a6f63ce4 100644
--- a/examples/transports/2.js
+++ b/examples/transports/2.js
@@ -4,7 +4,6 @@
const Libp2p = require('../..')
const TCP = require('libp2p-tcp')
const { NOISE } = require('libp2p-noise')
-const SECIO = require('libp2p-secio')
const MPLEX = require('libp2p-mplex')
const pipe = require('it-pipe')
@@ -19,7 +18,7 @@ const createNode = async () => {
},
modules: {
transport: [TCP],
- connEncryption: [NOISE, SECIO],
+ connEncryption: [NOISE],
streamMuxer: [MPLEX]
}
})
diff --git a/examples/transports/3.js b/examples/transports/3.js
index 93b82cbed2..39f9cc97cc 100644
--- a/examples/transports/3.js
+++ b/examples/transports/3.js
@@ -5,7 +5,6 @@ const Libp2p = require('../..')
const TCP = require('libp2p-tcp')
const WebSockets = require('libp2p-websockets')
const { NOISE } = require('libp2p-noise')
-const SECIO = require('libp2p-secio')
const MPLEX = require('libp2p-mplex')
const pipe = require('it-pipe')
@@ -21,7 +20,7 @@ const createNode = async (transports, addresses = []) => {
},
modules: {
transport: transports,
- connEncryption: [NOISE, SECIO],
+ connEncryption: [NOISE],
streamMuxer: [MPLEX]
}
})
diff --git a/examples/transports/README.md b/examples/transports/README.md
index 2aaa98b6b3..467c535c62 100644
--- a/examples/transports/README.md
+++ b/examples/transports/README.md
@@ -13,7 +13,7 @@ When using libp2p, you need properly configure it, that is, pick your set of mod
You will need 4 dependencies total, so go ahead and install all of them with:
```bash
-> npm install libp2p libp2p-tcp libp2p-secio peer-info
+> npm install libp2p libp2p-tcp libp2p-noise peer-info
```
Then, on your favorite text editor create a file with the `.js` extension. I've called mine `1.js`.
@@ -26,7 +26,6 @@ First thing is to create our own libp2p node! Insert:
const Libp2p = require('libp2p')
const TCP = require('libp2p-tcp')
const { NOISE } = require('libp2p-noise')
-const SECIO = require('libp2p-secio')
const createNode = async () => {
const node = await Libp2p.create({
@@ -37,7 +36,7 @@ const createNode = async () => {
},
modules: {
transport: [ TCP ],
- connEncryption: [ NOISE, SECIO ]
+ connEncryption: [ NOISE ]
}
})
@@ -174,7 +173,7 @@ const createNode = async (transports, multiaddrs = []) => {
},
modules: {
transport: transports,
- connEncryption: [SECIO],
+ connEncryption: [NOISE],
streamMuxer: [MPLEX]
}
})
diff --git a/src/circuit/README.md b/src/circuit/README.md
index df4f293847..e2dd5018b9 100644
--- a/src/circuit/README.md
+++ b/src/circuit/README.md
@@ -41,7 +41,7 @@ const multiaddr = require('multiaddr')
const Libp2p = require('libp2p')
const TCP = require('libp2p-tcp')
const MPLEX = require('libp2p-mplex')
-const SECIO = require('libp2p-secio')
+const { NOISE } = require('libp2p-noise')
const relayAddr = ...
@@ -52,7 +52,7 @@ const node = await Libp2p.create({
modules: {
transport: [TCP],
streamMuxer: [MPLEX],
- connEncryption: [SECIO]
+ connEncryption: [NOISE]
},
config: {
relay: { // Circuit Relay options (this config is part of libp2p core configurations)
From 4eabe07bde1b562e7eb42a270c6e4450b33d35fa Mon Sep 17 00:00:00 2001
From: Vasco Santos
Date: Sun, 11 Oct 2020 18:02:09 +0200
Subject: [PATCH 014/447] chore: update node badge
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 34bd8267cc..e6d8af7285 100644
--- a/README.md
+++ b/README.md
@@ -24,7 +24,7 @@
-
+
From 4c7a89b710ab8e1317f3d35c1fe510eb1cc47d29 Mon Sep 17 00:00:00 2001
From: acolytec3 <17355484+acolytec3@users.noreply.github.com>
Date: Mon, 12 Oct 2020 06:08:53 -0400
Subject: [PATCH 015/447] doc(pubsub): add topicValidators links in API.md
table of contents
---
doc/API.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/doc/API.md b/doc/API.md
index 4b412dd97b..69e0ca4f78 100644
--- a/doc/API.md
+++ b/doc/API.md
@@ -48,6 +48,8 @@
* [`pubsub.unsubscribe`](#pubsubunsubscribe)
* [`pubsub.on`](#pubsubon)
* [`pubsub.removeListener`](#pubsubremovelistener)
+ * [`pubsub.topicValidators.set`](#pubsubtopicvalidatorsset)
+ * [`pubsub.topicValidators.delete`](#pubsubtopicvalidatorsdelete)
* [`connectionManager.get`](#connectionmanagerget)
* [`connectionManager.setPeerValue`](#connectionmanagersetpeervalue)
* [`connectionManager.size`](#connectionmanagersize)
From d7d8439e71c3e834caf5b0405f2f643888938499 Mon Sep 17 00:00:00 2001
From: Ethan Lam
Date: Thu, 15 Oct 2020 10:28:01 -0500
Subject: [PATCH 016/447] docs: update transport example (#770)
---
examples/transports/1.js | 2 +-
examples/transports/2.js | 2 +-
examples/transports/3.js | 2 +-
examples/transports/README.md | 81 +++++++++++++++++++++--------------
4 files changed, 53 insertions(+), 34 deletions(-)
diff --git a/examples/transports/1.js b/examples/transports/1.js
index cd78019dfb..73857aad4d 100644
--- a/examples/transports/1.js
+++ b/examples/transports/1.js
@@ -8,7 +8,7 @@ const { NOISE } = require('libp2p-noise')
const createNode = async () => {
const node = await Libp2p.create({
addresses: {
- // To signall the addresses we want to be available, we use
+ // To signal the addresses we want to be available, we use
// the multiaddr format, a self describable address
listen: ['/ip4/0.0.0.0/tcp/0']
},
diff --git a/examples/transports/2.js b/examples/transports/2.js
index f7a6f63ce4..2d62849db0 100644
--- a/examples/transports/2.js
+++ b/examples/transports/2.js
@@ -12,7 +12,7 @@ const concat = require('it-concat')
const createNode = async () => {
const node = await Libp2p.create({
addresses: {
- // To signall the addresses we want to be available, we use
+ // To signal the addresses we want to be available, we use
// the multiaddr format, a self describable address
listen: ['/ip4/0.0.0.0/tcp/0']
},
diff --git a/examples/transports/3.js b/examples/transports/3.js
index 39f9cc97cc..c692444341 100644
--- a/examples/transports/3.js
+++ b/examples/transports/3.js
@@ -16,7 +16,7 @@ const createNode = async (transports, addresses = []) => {
const node = await Libp2p.create({
addresses: {
- listen: addresses.map((a) => a)
+ listen: addresses
},
modules: {
transport: transports,
diff --git a/examples/transports/README.md b/examples/transports/README.md
index 467c535c62..98b1a5e341 100644
--- a/examples/transports/README.md
+++ b/examples/transports/README.md
@@ -13,10 +13,10 @@ When using libp2p, you need properly configure it, that is, pick your set of mod
You will need 4 dependencies total, so go ahead and install all of them with:
```bash
-> npm install libp2p libp2p-tcp libp2p-noise peer-info
+> npm install libp2p libp2p-tcp libp2p-noise
```
-Then, on your favorite text editor create a file with the `.js` extension. I've called mine `1.js`.
+Then, in your favorite text editor create a file with the `.js` extension. I've called mine `1.js`.
First thing is to create our own libp2p node! Insert:
@@ -30,7 +30,7 @@ const { NOISE } = require('libp2p-noise')
const createNode = async () => {
const node = await Libp2p.create({
addresses: {
- // To signall the addresses we want to be available, we use
+ // To signal the addresses we want to be available, we use
// the multiaddr format, a self describable address
listen: ['/ip4/0.0.0.0/tcp/0']
},
@@ -77,20 +77,41 @@ That `QmW2cKTakTYqbQkUzBTEGXgWYFj1YEPeUndE1YWs6CBzDQ` is the PeerId that was cre
Now that we have our `createNode` function, let's create two nodes and make them dial to each other! You can find the complete solution at [2.js](./2.js).
-For this step, we will need one more dependency.
+For this step, we will need some more dependencies.
```bash
-> npm install it-pipe it-buffer
+> npm install it-pipe it-concat libp2p-mplex
```
-And we also need to import the module on our .js file:
+And we also need to import the modules on our .js file:
```js
const pipe = require('it-pipe')
-const { toBuffer } = require('it-buffer')
+const concat = require('it-concat')
+const MPLEX = require('libp2p-mplex')
```
-We are going to reuse the `createNode` function from step 1, but this time to make things simpler, we will create another function to print the addrs to avoid duplicating code.
+We are going to reuse the `createNode` function from step 1, but this time add a stream multiplexer from `libp2p-mplex`.
+```js
+const createNode = async () => {
+ const node = await Libp2p.create({
+ addresses: {
+ // To signal the addresses we want to be available, we use
+ // the multiaddr format, a self describable address
+ listen: ['/ip4/0.0.0.0/tcp/0']
+ },
+ modules: {
+ transport: [TCP],
+ connEncryption: [NOISE, SECIO],
+ streamMuxer: [MPLEX] // <--- Add this line
+ }
+ })
+
+ await node.start()
+ return node
+}
+```
+We will also make things simpler by creating another function to print the multiaddresses to avoid duplicating code.
```JavaScript
function printAddrs (node, number) {
@@ -99,7 +120,7 @@ function printAddrs (node, number) {
}
```
-Then,
+Then add,
```js
;(async () => {
@@ -111,18 +132,15 @@ Then,
printAddrs(node1, '1')
printAddrs(node2, '2')
- node2.handle('/print', ({ stream }) => {
- pipe(
+ node2.handle('/print', async ({ stream }) => {
+ const result = await pipe(
stream,
- async function (source) {
- for await (const msg of source) {
- console.log(msg.toString())
- }
- }
+ concat
)
+ console.log(result.toString())
})
-node1.peerStore.addressBook.set(node2.peerId, node2.multiaddrs)
+ node1.peerStore.addressBook.set(node2.peerId, node2.multiaddrs)
const { stream } = await node1.dialProtocol(node2.peerId, '/print')
await pipe(
@@ -131,8 +149,9 @@ node1.peerStore.addressBook.set(node2.peerId, node2.multiaddrs)
)
})();
```
+For more information refer to the [docs](https://github.com/libp2p/js-libp2p/blob/master/doc/API.md).
-The result should be look like:
+The result should look like:
```bash
> node 2.js
@@ -147,29 +166,29 @@ Hello p2p world!
## 3. Using multiple transports
-Next, we want to be available in multiple transports to increase our chances of having common transports in the network. A simple scenario, a node running in the browser only has access to HTTP, WebSockets and WebRTC since the browser doesn't let you open any other kind of transport, for this node to dial to some other node, that other node needs to share a common transport.
+Next, we want nodes to have multiple transports available to increase their chances of having a common transport in the network to communicate over. A simple scenario is a node running in the browser only having access to HTTP, WebSockets and WebRTC since the browser doesn't let you open any other kind of transport. For this node to dial to some other node, that other node needs to share a common transport.
-What we are going to do in this step is to create 3 nodes, one with TCP, another with TCP+WebSockets and another one with just WebSockets. The full solution can be found on [3.js](./3.js).
+What we are going to do in this step is to create 3 nodes: one with TCP, another with TCP+WebSockets and another one with just WebSockets. The full solution can be found on [3.js](./3.js).
-In this example, we will need to also install `libp2p-websockets`, go ahead and install:
+In this example, we will need to also install `libp2p-websockets`:
```bash
> npm install libp2p-websockets
```
-We want to create 3 nodes, one with TCP, one with TCP+WebSockets and one with just WebSockets. We need to update our `createNode` function to contemplate WebSockets as well. Moreover, let's upgrade our function to enable us to pick the addrs in which a node will start a listener:
+We want to create 3 nodes: one with TCP, one with TCP+WebSockets and one with just WebSockets. We need to update our `createNode` function to accept WebSocket connections as well. Moreover, let's upgrade our function to enable us to pick the addresses over which a node will start a listener:
```JavaScript
// ...
-const createNode = async (transports, multiaddrs = []) => {
- if (!Array.isArray(multiaddrs)) {
- multiaddrs = [multiaddrs]
+const createNode = async (transports, addresses = []) => {
+ if (!Array.isArray(addresses)) {
+ addresses = [addresses]
}
const node = await Libp2p.create({
addresses: {
- listen: multiaddrs.map((a) => multiaddr(a))
+ listen: addresses
},
modules: {
transport: transports,
@@ -231,7 +250,7 @@ try {
}
```
-`print` is a function created using the code from 2.js, but factored into its own function to save lines, here it is:
+`print` is a function that prints each piece of data from a stream onto a new line but factored into its own function to save lines:
```JavaScript
function print ({ stream }) {
@@ -246,7 +265,7 @@ function print ({ stream }) {
}
```
-If everything was set correctly, you now should see the following after you run the script:
+If everything was set correctly, you now should see something similar to the following after running the script:
```Bash
> node 3.js
@@ -265,13 +284,13 @@ node 3 failed to dial to node 1 with:
Error: No transport available for address /ip4/127.0.0.1/tcp/51482
```
-As expected, we created 3 nodes, node 1 with TCP, node 2 with TCP+WebSockets and node 3 with just WebSockets. node 1 -> node 2 and node 2 -> node 3 managed to dial correctly because they shared a common transport, however, node 3 -> node 1 failed because they didn't share any.
+As expected, we created 3 nodes: node 1 with TCP, node 2 with TCP+WebSockets and node 3 with just WebSockets. node 1 -> node 2 and node 2 -> node 3 managed to dial correctly because they shared a common transport; however, node 3 -> node 1 failed because they didn't share any.
## 4. How to create a new libp2p transport
-Today there are already several transports available and plenty to come, you can find these at [interface-transport implementations](https://github.com/libp2p/js-interfaces/tree/master/src/transport#modules-that-implement-the-interface) list.
+Today there are already several transports available and plenty to come. You can find these at [interface-transport implementations](https://github.com/libp2p/js-interfaces/tree/master/src/transport#modules-that-implement-the-interface) list.
-Adding more transports is done through the same way as you added TCP and WebSockets. Some transports might offer extra functionalities, but as far as libp2p is concerned, if it follows the interface defined at the [spec](https://github.com/libp2p/js-interfaces/tree/master/src/transport#api) it will be able to use it.
+Adding more transports is done through the same way as you added TCP and WebSockets. Some transports might offer extra functionalities, but as far as libp2p is concerned, if it follows the interface defined in the [spec](https://github.com/libp2p/js-interfaces/tree/master/src/transport#api) it will be able to use it.
If you decide to implement a transport yourself, please consider adding to the list so that others can use it as well.
From 5f50054d9458e0d704f6903d6b5aee7734bdfb30 Mon Sep 17 00:00:00 2001
From: Cindy Wu
Date: Wed, 21 Oct 2020 23:02:00 -1000
Subject: [PATCH 017/447] docs: fix typo in transports example readme (#788)
---
examples/transports/README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/examples/transports/README.md b/examples/transports/README.md
index 98b1a5e341..8378c9a3e1 100644
--- a/examples/transports/README.md
+++ b/examples/transports/README.md
@@ -102,7 +102,7 @@ const createNode = async () => {
},
modules: {
transport: [TCP],
- connEncryption: [NOISE, SECIO],
+ connEncryption: [NOISE],
streamMuxer: [MPLEX] // <--- Add this line
}
})
From 4c6be9158879161955b178d15e9898fad8592fd7 Mon Sep 17 00:00:00 2001
From: Jacob Heun
Date: Tue, 20 Oct 2020 12:52:17 +0200
Subject: [PATCH 018/447] fix: ensure streams are closed on connection close
---
package.json | 2 +-
src/upgrader.js | 12 +++++++---
test/dialing/direct.node.js | 46 +++++++++++++++++++++++++++++++++++++
3 files changed, 56 insertions(+), 4 deletions(-)
diff --git a/package.json b/package.json
index 6a963181a1..84c4bc57cd 100644
--- a/package.json
+++ b/package.json
@@ -105,7 +105,7 @@
"libp2p-gossipsub": "^0.6.0",
"libp2p-kad-dht": "^0.20.0",
"libp2p-mdns": "^0.15.0",
- "libp2p-mplex": "^0.10.0",
+ "libp2p-mplex": "libp2p/js-libp2p-mplex#fix/stream-close",
"libp2p-noise": "^2.0.0",
"libp2p-secio": "^0.13.1",
"libp2p-tcp": "^0.15.1",
diff --git a/src/upgrader.js b/src/upgrader.js
index b53b647598..d583a8b8d6 100644
--- a/src/upgrader.js
+++ b/src/upgrader.js
@@ -5,6 +5,7 @@ const log = debug('libp2p:upgrader')
log.error = debug('libp2p:upgrader:error')
const Multistream = require('multistream-select')
const { Connection } = require('libp2p-interfaces/src/connection')
+const ConnectionStatus = require('libp2p-interfaces/src/connection/status')
const PeerId = require('peer-id')
const pipe = require('it-pipe')
const errCode = require('err-code')
@@ -268,8 +269,13 @@ class Upgrader {
maConn.timeline = new Proxy(_timeline, {
set: (...args) => {
if (connection && args[1] === 'close' && args[2] && !_timeline.close) {
- connection.stat.status = 'closed'
- this.onConnectionEnd(connection)
+ // Wait for close to finish before notifying of the closure
+ (async () => {
+ if (connection.stat.status === ConnectionStatus.OPEN) {
+ await connection.close()
+ }
+ this.onConnectionEnd(connection)
+ })()
}
return Reflect.set(...args)
@@ -295,7 +301,7 @@ class Upgrader {
},
newStream: newStream || errConnectionNotMultiplexed,
getStreams: () => muxer ? muxer.streams : errConnectionNotMultiplexed,
- close: err => maConn.close(err)
+ close: (err) => maConn.close(err)
})
this.onConnection(connection)
diff --git a/test/dialing/direct.node.js b/test/dialing/direct.node.js
index 401f4eb501..752f462e06 100644
--- a/test/dialing/direct.node.js
+++ b/test/dialing/direct.node.js
@@ -11,7 +11,9 @@ const PeerId = require('peer-id')
const delay = require('delay')
const pDefer = require('p-defer')
const pSettle = require('p-settle')
+const pWaitFor = require('p-wait-for')
const pipe = require('it-pipe')
+const pushable = require('it-pushable')
const AggregateError = require('aggregate-error')
const { Connection } = require('libp2p-interfaces/src/connection')
const { AbortError } = require('libp2p-interfaces/src/transport/errors')
@@ -299,6 +301,50 @@ describe('Dialing (direct, TCP)', () => {
expect(libp2p.dialer.connectToPeer.callCount).to.equal(1)
})
+ it('should close all streams when the connection closes', async () => {
+ libp2p = new Libp2p({
+ peerId,
+ modules: {
+ transport: [Transport],
+ streamMuxer: [Muxer],
+ connEncryption: [Crypto]
+ }
+ })
+
+ // register some stream handlers to simulate several protocols
+ libp2p.handle('/stream-count/1', ({ stream }) => pipe(stream, stream))
+ libp2p.handle('/stream-count/2', ({ stream }) => pipe(stream, stream))
+ remoteLibp2p.handle('/stream-count/3', ({ stream }) => pipe(stream, stream))
+ remoteLibp2p.handle('/stream-count/4', ({ stream }) => pipe(stream, stream))
+
+ libp2p.peerStore.addressBook.set(remotePeerId, remoteLibp2p.multiaddrs)
+ const connection = await libp2p.dial(remotePeerId)
+
+ // Create local to remote streams
+ const { stream } = await connection.newStream('/echo/1.0.0')
+ await connection.newStream('/stream-count/3')
+ await libp2p.dialProtocol(remoteLibp2p.peerId, '/stream-count/4')
+
+ // Partially write to the echo stream
+ const source = pushable()
+ stream.sink(source)
+ source.push('hello')
+
+ // Create remote to local streams
+ await remoteLibp2p.dialProtocol(libp2p.peerId, '/stream-count/1')
+ await remoteLibp2p.dialProtocol(libp2p.peerId, '/stream-count/2')
+
+ // Verify stream count
+ const remoteConn = remoteLibp2p.connectionManager.get(libp2p.peerId)
+ expect(connection.streams).to.have.length(5)
+ expect(remoteConn.streams).to.have.length(5)
+
+ // Close the connection and verify all streams have been closed
+ await connection.close()
+ await pWaitFor(() => connection.streams.length === 0)
+ await pWaitFor(() => remoteConn.streams.length === 0)
+ })
+
it('should be able to use hangup to close connections', async () => {
libp2p = new Libp2p({
peerId,
From e04224a1e264295551b73e056db8fbd16bb8e8f2 Mon Sep 17 00:00:00 2001
From: Jacob Heun
Date: Wed, 21 Oct 2020 17:52:26 +0200
Subject: [PATCH 019/447] fix: catch error in upgrader close call
---
src/upgrader.js | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/src/upgrader.js b/src/upgrader.js
index d583a8b8d6..fd8fe1195a 100644
--- a/src/upgrader.js
+++ b/src/upgrader.js
@@ -271,10 +271,15 @@ class Upgrader {
if (connection && args[1] === 'close' && args[2] && !_timeline.close) {
// Wait for close to finish before notifying of the closure
(async () => {
- if (connection.stat.status === ConnectionStatus.OPEN) {
- await connection.close()
+ try {
+ if (connection.stat.status === ConnectionStatus.OPEN) {
+ await connection.close()
+ }
+ } catch (err) {
+ log.error(err)
+ } finally {
+ this.onConnectionEnd(connection)
}
- this.onConnectionEnd(connection)
})()
}
From f2d010a3abffcf1271a3ff21928b263a9803d8a4 Mon Sep 17 00:00:00 2001
From: Jacob Heun
Date: Thu, 22 Oct 2020 13:24:15 +0200
Subject: [PATCH 020/447] chore: update mplex
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index 84c4bc57cd..8d48271b26 100644
--- a/package.json
+++ b/package.json
@@ -105,7 +105,7 @@
"libp2p-gossipsub": "^0.6.0",
"libp2p-kad-dht": "^0.20.0",
"libp2p-mdns": "^0.15.0",
- "libp2p-mplex": "libp2p/js-libp2p-mplex#fix/stream-close",
+ "libp2p-mplex": "^0.10.1",
"libp2p-noise": "^2.0.0",
"libp2p-secio": "^0.13.1",
"libp2p-tcp": "^0.15.1",
From f75ae341bb22edd41fbc05c48d905962544116cf Mon Sep 17 00:00:00 2001
From: Jacob Heun
Date: Thu, 22 Oct 2020 13:52:10 +0200
Subject: [PATCH 021/447] test: lock ci on node 14
---
.travis.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.travis.yml b/.travis.yml
index 839394510b..bb21bd4028 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -7,7 +7,7 @@ stages:
node_js:
- 'lts/*'
- - 'stable'
+ - '14'
os:
- linux
From 4a80afce8f5dd72e34e73e9e212cfd2b5b5ff3e3 Mon Sep 17 00:00:00 2001
From: Jacob Heun
Date: Thu, 22 Oct 2020 14:33:28 +0200
Subject: [PATCH 022/447] chore: update contributors
---
package.json | 30 ++++++++++++++++--------------
1 file changed, 16 insertions(+), 14 deletions(-)
diff --git a/package.json b/package.json
index 8d48271b26..ca88d94868 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "libp2p",
- "version": "0.29.0",
+ "version": "0.29.1",
"description": "JavaScript implementation of libp2p, a modular peer to peer network stack",
"leadMaintainer": "Jacob Heun ",
"main": "src/index.js",
@@ -132,39 +132,41 @@
"Friedel Ziegelmayer ",
"Maciej Krüger ",
"Hugo Dias ",
- "Volker Mische ",
"dirkmc ",
+ "Volker Mische ",
"Richard Littauer ",
- "ᴠɪᴄᴛᴏʀ ʙᴊᴇʟᴋʜᴏʟᴍ ",
- "Andrew Nesbitt ",
"Elven ",
+ "Andrew Nesbitt ",
"Giovanni T. Parra ",
"Ryan Bell ",
"Thomas Eizinger ",
+ "ᴠɪᴄᴛᴏʀ ʙᴊᴇʟᴋʜᴏʟᴍ ",
"Didrik Nordström ",
- "Francis Gulotta ",
- "Florian-Merle ",
+ "Henrique Dias ",
+ "Fei Liu ",
+ "Irakli Gozalishvili ",
+ "Ethan Lam ",
"Joel Gustafson ",
"Julien Bouquillon ",
"Kevin Kwok ",
- "Felipe Martins ",
"Nuno Nogueira ",
- "Fei Liu ",
- "RasmusErik Voel Jensen ",
"Dmitriy Ryajov ",
+ "RasmusErik Voel Jensen ",
+ "Diogo Silva ",
+ "robertkiel ",
"Soeren ",
"Sönke Hahn ",
"Tiago Alves ",
- "Diogo Silva ",
+ "Daijiro Wachi ",
"Yusef Napora ",
"Zane Starr ",
- "Daijiro Wachi ",
+ "Cindy Wu ",
"Chris Bratlien ",
"ebinks ",
"Bernd Strehl ",
"isan_rivkin ",
- "Henrique Dias ",
- "robertkiel ",
- "Irakli Gozalishvili "
+ "Florian-Merle ",
+ "Francis Gulotta ",
+ "Felipe Martins "
]
}
From 887963436313dd1657c66d74a655683bcd3d125b Mon Sep 17 00:00:00 2001
From: Jacob Heun
Date: Thu, 22 Oct 2020 14:33:29 +0200
Subject: [PATCH 023/447] chore: release version v0.29.1
---
CHANGELOG.md | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9681e9374e..3c39591299 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,15 @@
+
+## [0.29.1](https://github.com/libp2p/js-libp2p/compare/v0.29.0...v0.29.1) (2020-10-22)
+
+
+### Bug Fixes
+
+* catch error in upgrader close call ([e04224a](https://github.com/libp2p/js-libp2p/commit/e04224a))
+* ensure streams are closed on connection close ([4c6be91](https://github.com/libp2p/js-libp2p/commit/4c6be91))
+* flakey identify test firefox ([#774](https://github.com/libp2p/js-libp2p/issues/774)) ([60d437f](https://github.com/libp2p/js-libp2p/commit/60d437f))
+
+
+
# [0.29.0](https://github.com/libp2p/js-libp2p/compare/v0.28.10...v0.29.0) (2020-08-27)
From 06f26e586fb2652d2ea1258d3862f3ddd27ab2e0 Mon Sep 17 00:00:00 2001
From: Jacob Heun
Date: Fri, 23 Oct 2020 15:34:59 +0200
Subject: [PATCH 024/447] fix: cleanup open streams on conn close (#791)
---
src/upgrader.js | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/src/upgrader.js b/src/upgrader.js
index fd8fe1195a..92997eb15f 100644
--- a/src/upgrader.js
+++ b/src/upgrader.js
@@ -306,7 +306,13 @@ class Upgrader {
},
newStream: newStream || errConnectionNotMultiplexed,
getStreams: () => muxer ? muxer.streams : errConnectionNotMultiplexed,
- close: (err) => maConn.close(err)
+ close: async (err) => {
+ await maConn.close(err)
+ // Ensure remaining streams are aborted
+ if (muxer) {
+ muxer.streams.map(stream => stream.abort(err))
+ }
+ }
})
this.onConnection(connection)
From f82da56901fd9355a5f2e5c4726d7459ff7d0b8d Mon Sep 17 00:00:00 2001
From: Jacob Heun
Date: Fri, 23 Oct 2020 15:40:53 +0200
Subject: [PATCH 025/447] chore: update contributors
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index ca88d94868..c52c8f630e 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "libp2p",
- "version": "0.29.1",
+ "version": "0.29.2",
"description": "JavaScript implementation of libp2p, a modular peer to peer network stack",
"leadMaintainer": "Jacob Heun ",
"main": "src/index.js",
From 61c36f9e09f61d630c1b00576e9fb2549bad1dfd Mon Sep 17 00:00:00 2001
From: Jacob Heun
Date: Fri, 23 Oct 2020 15:40:54 +0200
Subject: [PATCH 026/447] chore: release version v0.29.2
---
CHANGELOG.md | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3c39591299..4c915a1eef 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,13 @@
+
+## [0.29.2](https://github.com/libp2p/js-libp2p/compare/v0.29.1...v0.29.2) (2020-10-23)
+
+
+### Bug Fixes
+
+* cleanup open streams on conn close ([#791](https://github.com/libp2p/js-libp2p/issues/791)) ([06f26e5](https://github.com/libp2p/js-libp2p/commit/06f26e5))
+
+
+
## [0.29.1](https://github.com/libp2p/js-libp2p/compare/v0.29.0...v0.29.1) (2020-10-22)
From 093c0ea13f9106de037fdf3b243a4709c5832de7 Mon Sep 17 00:00:00 2001
From: Vasco Santos
Date: Wed, 4 Nov 2020 13:54:50 +0100
Subject: [PATCH 027/447] feat: resolve multiaddrs before dial (#782)
---
doc/CONFIGURATION.md | 8 +-
doc/GETTING_STARTED.md | 4 +-
examples/libp2p-in-the-browser/index.js | 11 +-
package.json | 2 +-
src/config.js | 7 +-
src/dialer/index.js | 72 +++++++++-
src/index.js | 3 +-
test/dialing/direct.node.js | 6 +-
test/dialing/direct.spec.js | 5 -
test/dialing/resolver.spec.js | 176 ++++++++++++++++++++++++
10 files changed, 267 insertions(+), 27 deletions(-)
create mode 100644 test/dialing/resolver.spec.js
diff --git a/doc/CONFIGURATION.md b/doc/CONFIGURATION.md
index 4983754c2e..527ee35733 100644
--- a/doc/CONFIGURATION.md
+++ b/doc/CONFIGURATION.md
@@ -465,6 +465,7 @@ Dialing in libp2p can be configured to limit the rate of dialing, and how long d
| maxParallelDials | `number` | How many multiaddrs we can dial in parallel. |
| maxDialsPerPeer | `number` | How many multiaddrs we can dial per peer, in parallel. |
| dialTimeout | `number` | Second dial timeout per peer in ms. |
+| resolvers | `object` | Dial [Resolvers](https://github.com/multiformats/js-multiaddr/blob/master/src/resolvers/index.js) for resolving multiaddrs |
The below configuration example shows how the dialer should be configured, with the current defaults:
@@ -474,6 +475,8 @@ const TCP = require('libp2p-tcp')
const MPLEX = require('libp2p-mplex')
const { NOISE } = require('libp2p-noise')
+const { dnsaddrResolver } = require('multiaddr/src/resolvers')
+
const node = await Libp2p.create({
modules: {
transport: [TCP],
@@ -483,7 +486,10 @@ const node = await Libp2p.create({
dialer: {
maxParallelDials: 100,
maxDialsPerPeer: 4,
- dialTimeout: 30e3
+ dialTimeout: 30e3,
+ resolvers: {
+ dnsaddr: dnsaddrResolver
+ }
}
```
diff --git a/doc/GETTING_STARTED.md b/doc/GETTING_STARTED.md
index e7398cc1d7..fd180e8428 100644
--- a/doc/GETTING_STARTED.md
+++ b/doc/GETTING_STARTED.md
@@ -204,8 +204,8 @@ const Bootstrap = require('libp2p-bootstrap')
// Known peers addresses
const bootstrapMultiaddrs = [
- '/dns4/ams-1.bootstrap.libp2p.io/tcp/443/wss/p2p/QmSoLer265NRgSp2LA3dPaeykiS1J6DifTC88f5uVQKNAd',
- '/dns4/lon-1.bootstrap.libp2p.io/tcp/443/wss/p2p/QmSoLMeWqB7YGVLJN3pNLQpmmEk35v6wYtsMGLzSr5QBU3'
+ '/dnsaddr/bootstrap.libp2p.io/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb',
+ '/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN'
]
const node = await Libp2p.create({
diff --git a/examples/libp2p-in-the-browser/index.js b/examples/libp2p-in-the-browser/index.js
index be03f08b6c..fe5e31afed 100644
--- a/examples/libp2p-in-the-browser/index.js
+++ b/examples/libp2p-in-the-browser/index.js
@@ -31,12 +31,11 @@ document.addEventListener('DOMContentLoaded', async () => {
[Bootstrap.tag]: {
enabled: true,
list: [
- '/dns4/ams-1.bootstrap.libp2p.io/tcp/443/wss/p2p/QmSoLer265NRgSp2LA3dPaeykiS1J6DifTC88f5uVQKNAd',
- '/dns4/lon-1.bootstrap.libp2p.io/tcp/443/wss/p2p/QmSoLMeWqB7YGVLJN3pNLQpmmEk35v6wYtsMGLzSr5QBU3',
- '/dns4/sfo-3.bootstrap.libp2p.io/tcp/443/wss/p2p/QmSoLPppuBtQSGwKDZT2M73ULpjvfd3aZ6ha4oFGL1KrGM',
- '/dns4/sgp-1.bootstrap.libp2p.io/tcp/443/wss/p2p/QmSoLSafTMBsPKadTEgaXctDQVcqN88CNLHXMkTNwMKPnu',
- '/dns4/nyc-1.bootstrap.libp2p.io/tcp/443/wss/p2p/QmSoLueR4xBeUbY9WZ9xGUUxunbKWcrNFTDAadQJmocnWm',
- '/dns4/nyc-2.bootstrap.libp2p.io/tcp/443/wss/p2p/QmSoLV4Bbm51jM9C4gDYZQ9Cy3U6aXMJDAbzgu2fzaDs64'
+ '/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN',
+ '/dnsaddr/bootstrap.libp2p.io/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb',
+ '/dnsaddr/bootstrap.libp2p.io/p2p/QmZa1sAxajnQjVM8WjWXoMbmPd7NsWhfKsPkErzpm9wGkp',
+ '/dnsaddr/bootstrap.libp2p.io/p2p/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa',
+ '/dnsaddr/bootstrap.libp2p.io/p2p/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt'
]
}
}
diff --git a/package.json b/package.json
index c52c8f630e..a1ea90db83 100644
--- a/package.json
+++ b/package.json
@@ -64,7 +64,7 @@
"mafmt": "^8.0.0",
"merge-options": "^2.0.0",
"moving-average": "^1.0.0",
- "multiaddr": "^8.0.0",
+ "multiaddr": "^8.1.0",
"multicodec": "^2.0.0",
"multistream-select": "^1.0.0",
"mutable-proxy": "^1.0.0",
diff --git a/src/config.js b/src/config.js
index 7e3d630efe..1cc0f097b4 100644
--- a/src/config.js
+++ b/src/config.js
@@ -1,6 +1,8 @@
'use strict'
const mergeOptions = require('merge-options')
+const { dnsaddrResolver } = require('multiaddr/src/resolvers')
+
const Constants = require('./constants')
const { FaultTolerance } = require('./transport-manager')
@@ -20,7 +22,10 @@ const DefaultConfig = {
dialer: {
maxParallelDials: Constants.MAX_PARALLEL_DIALS,
maxDialsPerPeer: Constants.MAX_PER_PEER_DIALS,
- dialTimeout: Constants.DIAL_TIMEOUT
+ dialTimeout: Constants.DIAL_TIMEOUT,
+ resolvers: {
+ dnsaddr: dnsaddrResolver
+ }
},
metrics: {
enabled: false
diff --git a/src/dialer/index.js b/src/dialer/index.js
index fc02b357a1..49d77e467d 100644
--- a/src/dialer/index.js
+++ b/src/dialer/index.js
@@ -27,13 +27,15 @@ class Dialer {
* @param {number} [options.concurrency = MAX_PARALLEL_DIALS] - Number of max concurrent dials.
* @param {number} [options.perPeerLimit = MAX_PER_PEER_DIALS] - Number of max concurrent dials per peer.
* @param {number} [options.timeout = DIAL_TIMEOUT] - How long a dial attempt is allowed to take.
+ * @param {object} [options.resolvers = {}] - multiaddr resolvers to use when dialing
*/
constructor ({
transportManager,
peerStore,
concurrency = MAX_PARALLEL_DIALS,
timeout = DIAL_TIMEOUT,
- perPeerLimit = MAX_PER_PEER_DIALS
+ perPeerLimit = MAX_PER_PEER_DIALS,
+ resolvers = {}
}) {
this.transportManager = transportManager
this.peerStore = peerStore
@@ -42,6 +44,10 @@ class Dialer {
this.perPeerLimit = perPeerLimit
this.tokens = [...new Array(concurrency)].map((_, index) => index)
this._pendingDials = new Map()
+
+ for (const [key, value] of Object.entries(resolvers)) {
+ multiaddr.resolvers.set(key, value)
+ }
}
/**
@@ -69,7 +75,7 @@ class Dialer {
* @returns {Promise}
*/
async connectToPeer (peer, options = {}) {
- const dialTarget = this._createDialTarget(peer)
+ const dialTarget = await this._createDialTarget(peer)
if (!dialTarget.addrs.length) {
throw errCode(new Error('The dial request has no addresses'), codes.ERR_NO_VALID_ADDRESSES)
@@ -105,22 +111,28 @@ class Dialer {
*
* @private
* @param {PeerId|Multiaddr|string} peer - A PeerId or Multiaddr
- * @returns {DialTarget}
+ * @returns {Promise}
*/
- _createDialTarget (peer) {
+ async _createDialTarget (peer) {
const { id, multiaddrs } = getPeer(peer)
if (multiaddrs) {
this.peerStore.addressBook.add(id, multiaddrs)
}
- let addrs = this.peerStore.addressBook.getMultiaddrsForPeer(id) || []
+ let knownAddrs = this.peerStore.addressBook.getMultiaddrsForPeer(id) || []
// If received a multiaddr to dial, it should be the first to use
// But, if we know other multiaddrs for the peer, we should try them too.
if (multiaddr.isMultiaddr(peer)) {
- addrs = addrs.filter((addr) => !peer.equals(addr))
- addrs.unshift(peer)
+ knownAddrs = knownAddrs.filter((addr) => !peer.equals(addr))
+ knownAddrs.unshift(peer)
+ }
+
+ const addrs = []
+ for (const a of knownAddrs) {
+ const resolvedAddrs = await this._resolve(a)
+ resolvedAddrs.forEach(ra => addrs.push(ra))
}
return {
@@ -190,6 +202,52 @@ class Dialer {
log('token %d released', token)
this.tokens.push(token)
}
+
+ /**
+ * Resolve multiaddr recursively.
+ *
+ * @param {Multiaddr} ma
+ * @returns {Promise>}
+ */
+ async _resolve (ma) {
+ // TODO: recursive logic should live in multiaddr once dns4/dns6 support is in place
+ // Now only supporting resolve for dnsaddr
+ const resolvableProto = ma.protoNames().includes('dnsaddr')
+
+ // Multiaddr is not resolvable? End recursion!
+ if (!resolvableProto) {
+ return [ma]
+ }
+
+ const resolvedMultiaddrs = await this._resolveRecord(ma)
+ const recursiveMultiaddrs = await Promise.all(resolvedMultiaddrs.map((nm) => {
+ return this._resolve(nm)
+ }))
+
+ return recursiveMultiaddrs.flat().reduce((array, newM) => {
+ if (!array.find(m => m.equals(newM))) {
+ array.push(newM)
+ }
+ return array
+ }, []) // Unique addresses
+ }
+
+ /**
+ * Resolve a given multiaddr. If this fails, an empty array will be returned
+ *
+ * @param {Multiaddr} ma
+ * @returns {Promise>}
+ */
+ async _resolveRecord (ma) {
+ try {
+ ma = multiaddr(ma.toString()) // Use current multiaddr module
+ const multiaddrs = await ma.resolve()
+ return multiaddrs
+ } catch (_) {
+ log.error(`multiaddr ${ma} could not be resolved`)
+ return []
+ }
+ }
}
module.exports = Dialer
diff --git a/src/index.js b/src/index.js
index cd900457d6..85547f4702 100644
--- a/src/index.js
+++ b/src/index.js
@@ -134,7 +134,8 @@ class Libp2p extends EventEmitter {
peerStore: this.peerStore,
concurrency: this._options.dialer.maxParallelDials,
perPeerLimit: this._options.dialer.maxDialsPerPeer,
- timeout: this._options.dialer.dialTimeout
+ timeout: this._options.dialer.dialTimeout,
+ resolvers: this._options.dialer.resolvers
})
this._modules.transport.forEach((Transport) => {
diff --git a/test/dialing/direct.node.js b/test/dialing/direct.node.js
index 752f462e06..6b89fee4af 100644
--- a/test/dialing/direct.node.js
+++ b/test/dialing/direct.node.js
@@ -158,9 +158,9 @@ describe('Dialing (direct, TCP)', () => {
it('should dial to the max concurrency', async () => {
const addrs = [
- '/ip4/0.0.0.0/tcp/8000',
- '/ip4/0.0.0.0/tcp/8001',
- '/ip4/0.0.0.0/tcp/8002'
+ multiaddr('/ip4/0.0.0.0/tcp/8000'),
+ multiaddr('/ip4/0.0.0.0/tcp/8001'),
+ multiaddr('/ip4/0.0.0.0/tcp/8002')
]
const dialer = new Dialer({
transportManager: localTM,
diff --git a/test/dialing/direct.spec.js b/test/dialing/direct.spec.js
index e3d60e5960..540f528b65 100644
--- a/test/dialing/direct.spec.js
+++ b/test/dialing/direct.spec.js
@@ -263,7 +263,6 @@ describe('Dialing (direct, WebSockets)', () => {
describe('libp2p.dialer', () => {
let libp2p
- let remoteLibp2p
afterEach(async () => {
sinon.restore()
@@ -271,10 +270,6 @@ describe('Dialing (direct, WebSockets)', () => {
libp2p = null
})
- after(async () => {
- remoteLibp2p && await remoteLibp2p.stop()
- })
-
it('should create a dialer', () => {
libp2p = new Libp2p({
peerId,
diff --git a/test/dialing/resolver.spec.js b/test/dialing/resolver.spec.js
new file mode 100644
index 0000000000..ba81a5c8b2
--- /dev/null
+++ b/test/dialing/resolver.spec.js
@@ -0,0 +1,176 @@
+'use strict'
+/* eslint-env mocha */
+
+const { expect } = require('aegir/utils/chai')
+const sinon = require('sinon')
+
+const multiaddr = require('multiaddr')
+const { Resolver } = require('multiaddr/src/resolvers/dns')
+
+const { codes: ErrorCodes } = require('../../src/errors')
+
+const peerUtils = require('../utils/creators/peer')
+const baseOptions = require('../utils/base-options.browser')
+
+const { MULTIADDRS_WEBSOCKETS } = require('../fixtures/browser')
+const relayAddr = MULTIADDRS_WEBSOCKETS[0]
+
+const getDnsaddrStub = (peerId) => [
+ [`dnsaddr=/dnsaddr/ams-1.bootstrap.libp2p.io/p2p/${peerId}`],
+ [`dnsaddr=/dnsaddr/ams-2.bootstrap.libp2p.io/p2p/${peerId}`],
+ [`dnsaddr=/dnsaddr/lon-1.bootstrap.libp2p.io/p2p/${peerId}`],
+ [`dnsaddr=/dnsaddr/nrt-1.bootstrap.libp2p.io/p2p/${peerId}`],
+ [`dnsaddr=/dnsaddr/nyc-1.bootstrap.libp2p.io/p2p/${peerId}`],
+ [`dnsaddr=/dnsaddr/sfo-2.bootstrap.libp2p.io/p2p/${peerId}`]
+]
+
+const relayedAddr = (peerId) => `${relayAddr}/p2p-circuit/p2p/${peerId}`
+
+const getDnsRelayedAddrStub = (peerId) => [
+ [`dnsaddr=${relayedAddr(peerId)}`]
+]
+
+describe('Dialing (resolvable addresses)', () => {
+ let libp2p, remoteLibp2p
+
+ beforeEach(async () => {
+ [libp2p, remoteLibp2p] = await peerUtils.createPeer({
+ number: 2,
+ config: {
+ modules: baseOptions.modules,
+ addresses: {
+ listen: [multiaddr(`${relayAddr}/p2p-circuit`)]
+ },
+ config: {
+ peerDiscovery: {
+ autoDial: false
+ }
+ }
+ },
+ started: true,
+ populateAddressBooks: false
+ })
+ })
+
+ afterEach(async () => {
+ sinon.restore()
+ await Promise.all([libp2p, remoteLibp2p].map(n => n.stop()))
+ })
+
+ it('resolves dnsaddr to ws local address', async () => {
+ const remoteId = remoteLibp2p.peerId.toB58String()
+ const dialAddr = multiaddr(`/dnsaddr/remote.libp2p.io/p2p/${remoteId}`)
+ const relayedAddrFetched = multiaddr(relayedAddr(remoteId))
+
+ // Transport spy
+ const transport = libp2p.transportManager._transports.get('Circuit')
+ sinon.spy(transport, 'dial')
+
+ // Resolver stub
+ const stub = sinon.stub(Resolver.prototype, 'resolveTxt')
+ stub.onCall(0).returns(Promise.resolve(getDnsRelayedAddrStub(remoteId)))
+
+ // Dial with address resolve
+ const connection = await libp2p.dial(dialAddr)
+ expect(connection).to.exist()
+ expect(connection.remoteAddr.equals(relayedAddrFetched))
+
+ const dialArgs = transport.dial.firstCall.args
+ expect(dialArgs[0].equals(relayedAddrFetched)).to.eql(true)
+ })
+
+ it('resolves a dnsaddr recursively', async () => {
+ const remoteId = remoteLibp2p.peerId.toB58String()
+ const dialAddr = multiaddr(`/dnsaddr/remote.libp2p.io/p2p/${remoteId}`)
+ const relayedAddrFetched = multiaddr(relayedAddr(remoteId))
+
+ // Transport spy
+ const transport = libp2p.transportManager._transports.get('Circuit')
+ sinon.spy(transport, 'dial')
+
+ // Resolver stub
+ const stub = sinon.stub(Resolver.prototype, 'resolveTxt')
+ let firstCall = false
+ stub.callsFake(() => {
+ if (!firstCall) {
+ firstCall = true
+ // Return an array of dnsaddr
+ return Promise.resolve(getDnsaddrStub(remoteId))
+ }
+ return Promise.resolve(getDnsRelayedAddrStub(remoteId))
+ })
+
+ // Dial with address resolve
+ const connection = await libp2p.dial(dialAddr)
+ expect(connection).to.exist()
+ expect(connection.remoteAddr.equals(relayedAddrFetched))
+
+ const dialArgs = transport.dial.firstCall.args
+ expect(dialArgs[0].equals(relayedAddrFetched)).to.eql(true)
+ })
+
+ // TODO: Temporary solution does not resolve dns4/dns6
+ // Resolver just returns the received multiaddrs
+ it('stops recursive resolve if finds dns4/dns6 and dials it', async () => {
+ const remoteId = remoteLibp2p.peerId.toB58String()
+ const dialAddr = multiaddr(`/dnsaddr/remote.libp2p.io/p2p/${remoteId}`)
+
+ // Stub resolver
+ const dnsMa = multiaddr(`/dns4/ams-1.remote.libp2p.io/tcp/443/wss/p2p/${remoteId}`)
+ const stubResolve = sinon.stub(Resolver.prototype, 'resolveTxt')
+ stubResolve.returns(Promise.resolve([
+ [`dnsaddr=${dnsMa}`]
+ ]))
+
+ // Stub transport
+ const transport = libp2p.transportManager._transports.get('WebSockets')
+ const stubTransport = sinon.stub(transport, 'dial')
+ stubTransport.callsFake((multiaddr) => {
+ expect(multiaddr.equals(dnsMa)).to.eql(true)
+ })
+
+ await libp2p.dial(dialAddr)
+ })
+
+ it('resolves a dnsaddr recursively not failing if one address fails to resolve', async () => {
+ const remoteId = remoteLibp2p.peerId.toB58String()
+ const dialAddr = multiaddr(`/dnsaddr/remote.libp2p.io/p2p/${remoteId}`)
+ const relayedAddrFetched = multiaddr(relayedAddr(remoteId))
+
+ // Transport spy
+ const transport = libp2p.transportManager._transports.get('Circuit')
+ sinon.spy(transport, 'dial')
+
+ // Resolver stub
+ const stub = sinon.stub(Resolver.prototype, 'resolveTxt')
+ stub.onCall(0).callsFake(() => Promise.resolve(getDnsaddrStub(remoteId)))
+ stub.onCall(1).callsFake(() => Promise.reject(new Error()))
+ stub.callsFake(() => Promise.resolve(getDnsRelayedAddrStub(remoteId)))
+
+ // Dial with address resolve
+ const connection = await libp2p.dial(dialAddr)
+ expect(connection).to.exist()
+ expect(connection.remoteAddr.equals(relayedAddrFetched))
+
+ const dialArgs = transport.dial.firstCall.args
+ expect(dialArgs[0].equals(relayedAddrFetched)).to.eql(true)
+ })
+
+ it('fails to dial if resolve fails and there are no addresses to dial', async () => {
+ const remoteId = remoteLibp2p.peerId.toB58String()
+ const dialAddr = multiaddr(`/dnsaddr/remote.libp2p.io/p2p/${remoteId}`)
+
+ // Stub resolver
+ const stubResolve = sinon.stub(Resolver.prototype, 'resolveTxt')
+ stubResolve.returns(Promise.reject(new Error()))
+
+ // Stub transport
+ const transport = libp2p.transportManager._transports.get('WebSockets')
+ const spy = sinon.spy(transport, 'dial')
+
+ await expect(libp2p.dial(dialAddr))
+ .to.eventually.be.rejectedWith(Error)
+ .and.to.have.nested.property('.code', ErrorCodes.ERR_NO_VALID_ADDRESSES)
+ expect(spy.callCount).to.eql(0)
+ })
+})
From 8f29a667a1e3be49d8097e13e579dbce5bea775a Mon Sep 17 00:00:00 2001
From: Vasco Santos
Date: Wed, 4 Nov 2020 14:05:08 +0100
Subject: [PATCH 028/447] chore: update contributors
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index a1ea90db83..41587182fa 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "libp2p",
- "version": "0.29.2",
+ "version": "0.29.3",
"description": "JavaScript implementation of libp2p, a modular peer to peer network stack",
"leadMaintainer": "Jacob Heun ",
"main": "src/index.js",
From fef54b2b2c14944fef5751f07dfd3f56680e66de Mon Sep 17 00:00:00 2001
From: Vasco Santos
Date: Wed, 4 Nov 2020 14:05:08 +0100
Subject: [PATCH 029/447] chore: release version v0.29.3
---
CHANGELOG.md | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4c915a1eef..d2da849cc2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,13 @@
+
+## [0.29.3](https://github.com/libp2p/js-libp2p/compare/v0.29.2...v0.29.3) (2020-11-04)
+
+
+### Features
+
+* resolve multiaddrs before dial ([#782](https://github.com/libp2p/js-libp2p/issues/782)) ([093c0ea](https://github.com/libp2p/js-libp2p/commit/093c0ea))
+
+
+
## [0.29.2](https://github.com/libp2p/js-libp2p/compare/v0.29.1...v0.29.2) (2020-10-23)
From 824a444f562abf898e960e9784258dc9383792d2 Mon Sep 17 00:00:00 2001
From: Samlior
Date: Wed, 18 Nov 2020 17:28:43 +0800
Subject: [PATCH 030/447] docs(fix): fix contentRouting.getMany (#803)
---
doc/API.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/doc/API.md b/doc/API.md
index 69e0ca4f78..d277ba87c4 100644
--- a/doc/API.md
+++ b/doc/API.md
@@ -665,7 +665,7 @@ Queries the DHT for the n values stored for the given key (without sorting).
// ...
const key = '/key'
-const { from, val } = await libp2p.contentRouting.get(key)
+const records = await libp2p.contentRouting.getMany(key, 2)
```
### peerRouting.findPeer
From d0a9fada32677ee3b810d5c2fb8d5e2c4f5a9fef Mon Sep 17 00:00:00 2001
From: Vasco Santos
Date: Fri, 20 Nov 2020 15:14:01 +0100
Subject: [PATCH 031/447] feat: custom and store self agent version + store
self protocol version (#800)
* feat: custom and store self protocol and agent version
* fix: do not enable custom protocolVersion
---
doc/API.md | 1 +
src/config.js | 4 ++
src/identify/index.js | 14 ++++++-
test/identify/index.spec.js | 78 ++++++++++++++++++++++++++++++++-----
4 files changed, 85 insertions(+), 12 deletions(-)
diff --git a/doc/API.md b/doc/API.md
index d277ba87c4..f059741721 100644
--- a/doc/API.md
+++ b/doc/API.md
@@ -92,6 +92,7 @@ Creates an instance of Libp2p.
| options.modules | [`Array