mirror of
https://github.com/fluencelabs/js-libp2p
synced 2025-07-08 21:31:32 +00:00
Compare commits
22 Commits
v0.33.0
...
fix/remove
Author | SHA1 | Date | |
---|---|---|---|
c7e923a812 | |||
ae21299ade | |||
149120bebc | |||
91c2ec9856 | |||
6d0ac819f1 | |||
15a0b1dbf2 | |||
9cbf36fcb5 | |||
3a9d5f64d9 | |||
eacd7e8f76 | |||
7f2cc4dc44 | |||
5cc5a8749a | |||
ee60e18213 | |||
a4a2fac41e | |||
2f598eba09 | |||
443a102528 | |||
3bed7b4cb2 | |||
3fb424914f | |||
bb0ca28195 | |||
01a8b8da9b | |||
77d7cb8f08 | |||
a335fda852 | |||
43e3af0c12 |
65
.github/workflows/examples.yml
vendored
65
.github/workflows/examples.yml
vendored
@ -12,6 +12,9 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: 16
|
||||
- run: npm install
|
||||
- run: npx aegir lint
|
||||
- run: npx aegir ts -p check
|
||||
@ -21,82 +24,118 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: 16
|
||||
- run: npm install
|
||||
- run: cd examples && yarn && npm run test -- auto-relay
|
||||
- run: cd examples && npm i && npm run test -- auto-relay
|
||||
test-chat-example:
|
||||
needs: check
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: 16
|
||||
- run: npm install
|
||||
- run: cd examples && yarn && npm run test -- chat
|
||||
- run: cd examples && npm i && npm run test -- chat
|
||||
test-connection-encryption-example:
|
||||
needs: check
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: 16
|
||||
- run: npm install
|
||||
- run: cd examples && yarn && npm run test -- connection-encryption
|
||||
- run: cd examples && npm i && npm run test -- connection-encryption
|
||||
test-discovery-mechanisms-example:
|
||||
needs: check
|
||||
runs-on: macos-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: 16
|
||||
- run: npm install
|
||||
- run: cd examples && yarn && npm run test -- discovery-mechanisms
|
||||
- run: cd examples && npm i && npm run test -- discovery-mechanisms
|
||||
test-echo-example:
|
||||
needs: check
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: 16
|
||||
- run: npm install
|
||||
- run: cd examples && yarn && npm run test -- echo
|
||||
- run: cd examples && npm i && npm run test -- echo
|
||||
test-libp2p-in-the-browser-example:
|
||||
needs: check
|
||||
runs-on: macos-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: 16
|
||||
- run: npm install
|
||||
- run: cd examples && yarn && npm run test -- libp2p-in-the-browser
|
||||
- run: cd examples && npm i && npm run test -- libp2p-in-the-browser
|
||||
test-peer-and-content-routing-example:
|
||||
needs: check
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: 16
|
||||
- run: npm install
|
||||
- run: cd examples && yarn && npm run test -- peer-and-content-routing
|
||||
- run: cd examples && npm i && npm run test -- peer-and-content-routing
|
||||
test-pnet-example:
|
||||
needs: check
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: 16
|
||||
- run: npm install
|
||||
- run: cd examples && yarn && npm run test -- pnet
|
||||
- run: cd examples && npm i && npm run test -- pnet
|
||||
test-protocol-and-stream-muxing-example:
|
||||
needs: check
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: 16
|
||||
- run: npm install
|
||||
- run: cd examples && yarn && npm run test -- protocol-and-stream-muxing
|
||||
- run: cd examples && npm i && npm run test -- protocol-and-stream-muxing
|
||||
test-pubsub-example:
|
||||
needs: check
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: 16
|
||||
- run: npm install
|
||||
- run: cd examples && yarn && npm run test -- pubsub
|
||||
- run: cd examples && npm i && npm run test -- pubsub
|
||||
test-transports-example:
|
||||
needs: check
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: 16
|
||||
- run: npm install
|
||||
- run: cd examples && yarn && npm run test -- transports
|
||||
- run: cd examples && npm i && npm run test -- transports
|
||||
test-webrtc-direct-example:
|
||||
needs: check
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- run: npm install
|
||||
- run: cd examples && yarn && npm run test -- webrtc-direct
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: 16
|
||||
- run: npm install -g @mapbox/node-pre-gyp && npm install
|
||||
- run: cd examples && npm i && npm run test -- webrtc-direct
|
19
.github/workflows/main.yml
vendored
19
.github/workflows/main.yml
vendored
@ -14,10 +14,9 @@ jobs:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: 14
|
||||
node-version: 16
|
||||
- run: npm install
|
||||
- run: npx aegir lint
|
||||
- uses: gozala/typescript-error-reporter-action@v1.0.8
|
||||
- run: npx aegir build
|
||||
- run: npx aegir dep-check
|
||||
- uses: ipfs/aegir/actions/bundle-size@v32.1.0
|
||||
@ -30,7 +29,7 @@ jobs:
|
||||
strategy:
|
||||
matrix:
|
||||
os: [windows-latest, ubuntu-latest, macos-latest]
|
||||
node: [14, 16]
|
||||
node: [16]
|
||||
fail-fast: true
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
@ -45,6 +44,9 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: lts/*
|
||||
- run: npm install
|
||||
- run: npx aegir test -t browser -t webworker --bail
|
||||
test-firefox:
|
||||
@ -52,6 +54,9 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: lts/*
|
||||
- run: npm install
|
||||
- run: npx aegir test -t browser -t webworker --bail -- --browser firefox
|
||||
test-ts:
|
||||
@ -59,6 +64,9 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: lts/*
|
||||
- run: npm install
|
||||
- run: npm run test:ts
|
||||
test-interop:
|
||||
@ -66,5 +74,8 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: lts/*
|
||||
- run: npm install
|
||||
- run: cd node_modules/interop-libp2p && yarn && LIBP2P_JS=${GITHUB_WORKSPACE}/src/index.js npx aegir test -t node --bail -- --exit
|
||||
- run: npm run test:interop -- --bail -- --exit
|
||||
|
47
CHANGELOG.md
47
CHANGELOG.md
@ -1,3 +1,50 @@
|
||||
## [0.35.1](https://github.com/libp2p/js-libp2p/compare/v0.35.0...v0.35.1) (2021-12-03)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* do not let closest peers run forever ([#1047](https://github.com/libp2p/js-libp2p/issues/1047)) ([91c2ec9](https://github.com/libp2p/js-libp2p/commit/91c2ec9856a3e972b7b2c9c4d9a4eda1d431c7ef))
|
||||
|
||||
|
||||
|
||||
# [0.35.0](https://github.com/libp2p/js-libp2p/compare/v0.34.0...v0.35.0) (2021-12-02)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* stop dht before connection manager ([#1041](https://github.com/libp2p/js-libp2p/issues/1041)) ([3a9d5f6](https://github.com/libp2p/js-libp2p/commit/3a9d5f64d96719ebb4d3b083c4f5832db4fa0816)), closes [#1039](https://github.com/libp2p/js-libp2p/issues/1039)
|
||||
|
||||
|
||||
### chore
|
||||
|
||||
* update peer id and libp2p crypto ([#1042](https://github.com/libp2p/js-libp2p/issues/1042)) ([9cbf36f](https://github.com/libp2p/js-libp2p/commit/9cbf36fcb54099e6fed35ceccc4a2376f0926c1f))
|
||||
|
||||
|
||||
### BREAKING CHANGES
|
||||
|
||||
* requires node 15+
|
||||
|
||||
|
||||
|
||||
# [0.34.0](https://github.com/libp2p/js-libp2p/compare/v0.33.0...v0.34.0) (2021-11-25)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* private ip ts compile has no call signatures ([#1020](https://github.com/libp2p/js-libp2p/issues/1020)) ([77d7cb8](https://github.com/libp2p/js-libp2p/commit/77d7cb8f0815f2cdd3bfdfa8b641a7a186fe9520))
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* update dht ([#1009](https://github.com/libp2p/js-libp2p/issues/1009)) ([2f598eb](https://github.com/libp2p/js-libp2p/commit/2f598eba09cff4301474af08196158065e3602d8))
|
||||
|
||||
|
||||
### BREAKING CHANGES
|
||||
|
||||
* libp2p-kad-dht has a new event-based API which is exposed as `_dht`
|
||||
|
||||
|
||||
|
||||
# [0.33.0](https://github.com/libp2p/js-libp2p/compare/v0.32.5...v0.33.0) (2021-09-24)
|
||||
|
||||
|
||||
|
@ -2086,7 +2086,7 @@ the NatManager performing NAT hole punching.
|
||||
|
||||
[address]: https://github.com/libp2p/js-libp2p/tree/master/src/peer-store/address-book.js
|
||||
[cid]: https://github.com/multiformats/js-cid
|
||||
[connection]: https://github.com/libp2p/js-interfaces/tree/master/src/connection
|
||||
[connection]: https://github.com/libp2p/js-libp2p-interfaces/tree/master/packages/interfaces/src/connection
|
||||
[multiaddr]: https://github.com/multiformats/js-multiaddr
|
||||
[peer-id]: https://github.com/libp2p/js-peer-id
|
||||
[keys]: https://github.com/libp2p/js-libp2p-crypto/tree/master/src/keys
|
||||
|
@ -1,6 +1,5 @@
|
||||
#
|
||||
|
||||
- [Configuration](#configuration)
|
||||
- [Overview](#overview)
|
||||
- [Modules](#modules)
|
||||
- [Transport](#transport)
|
||||
@ -31,6 +30,7 @@
|
||||
- [Configuring the NAT Manager](#configuring-the-nat-manager)
|
||||
- [Browser support](#browser-support)
|
||||
- [UPnP and NAT-PMP](#upnp-and-nat-pmp)
|
||||
- [Configuring protocol name](#configuring-protocol-name)
|
||||
- [Configuration examples](#configuration-examples)
|
||||
|
||||
## Overview
|
||||
@ -210,7 +210,7 @@ const modules = {
|
||||
Moreover, the majority of the modules can be customized via option parameters. This way, it is also possible to provide this options through a `config` object. This config object should have the property name of each building block to configure, the same way as the modules specification.
|
||||
|
||||
Besides the `modules` and `config`, libp2p allows other internal options and configurations:
|
||||
- `datastore`: an instance of [ipfs/interface-datastore](https://github.com/ipfs/interface-datastore/) modules.
|
||||
- `datastore`: an instance of [ipfs/interface-datastore](https://github.com/ipfs/js-ipfs-interfaces/tree/master/packages/interface-datastore) modules.
|
||||
- This is used in modules such as the DHT. If it is not provided, `js-libp2p` will use an in memory datastore.
|
||||
- `peerId`: the identity of the node, an instance of [libp2p/js-peer-id](https://github.com/libp2p/js-peer-id).
|
||||
- This is particularly useful if you want to reuse the same `peer-id`, as well as for modules like `libp2p-delegated-content-routing`, which need a `peer-id` in their instantiation.
|
||||
@ -374,11 +374,7 @@ const node = await Libp2p.create({
|
||||
dht: { // The DHT options (and defaults) can be found in its documentation
|
||||
kBucketSize: 20,
|
||||
enabled: true, // This flag is required for DHT to run (disabled by default)
|
||||
randomWalk: {
|
||||
enabled: true, // Allows to disable discovery (enabled by default)
|
||||
interval: 300e3,
|
||||
timeout: 10e3
|
||||
}
|
||||
clientMode: false // Whether to run the WAN DHT in client or server mode (default: client mode)
|
||||
}
|
||||
}
|
||||
})
|
||||
@ -419,14 +415,7 @@ const node = await Libp2p.create({
|
||||
contentRouting: [delegatedContentRouting],
|
||||
peerRouting: [delegatedPeerRouting],
|
||||
},
|
||||
peerId,
|
||||
peerRouting: { // Peer routing configuration
|
||||
refreshManager: { // Refresh known and connected closest peers
|
||||
enabled: true, // Should find the closest peers.
|
||||
interval: 6e5, // Interval for getting the new for closest peers of 10min
|
||||
bootDelay: 10e3 // Delay for the initial query for closest peers
|
||||
}
|
||||
}
|
||||
peerId
|
||||
})
|
||||
```
|
||||
|
||||
|
14
doc/migrations/v0.32-v0.33.md
Normal file
14
doc/migrations/v0.32-v0.33.md
Normal file
@ -0,0 +1,14 @@
|
||||
<!--Specify versions for migration below-->
|
||||
# Migrating to libp2p@33
|
||||
|
||||
A migration guide for refactoring your application code from libp2p v0.32.x to v0.33.0.
|
||||
|
||||
## Table of Contents
|
||||
|
||||
- [Module Updates](#module-updates)
|
||||
|
||||
## Module Updates
|
||||
|
||||
Libp2p uses a datastore implementation for Peerstore persistence and for the DHT state. While libp2p defaults to a datastore implementation, it can receive any implementation of a datastore compliant with the [interface-datastore](https://github.com/ipfs/js-ipfs-interfaces/tree/master/packages/interface-datastore) via its configuration.
|
||||
|
||||
In this release, we updated to `interface-datastore@6.0.0`. As a result, libp2p users relying on a configured datastore should update it to a compliant implementation for updating libp2p.
|
@ -125,7 +125,7 @@ As you can see in the code, we need to provide the relay address, `relayAddr`, a
|
||||
You should now run the following to start the node running Auto Relay:
|
||||
|
||||
```sh
|
||||
node listener.js /ip4/192.168.1.120/tcp/58941/ws/p2p/QmQKCBm87HQMbFqy14oqC85pMmnRrj6iD46ggM6reqNpsd
|
||||
node listener.js /ip4/192.168.1.120/tcp/61592/ws/p2p/QmWDn2LY8nannvSWJzruUYoLZ4vV83vfCBwd8DipvdgQc3
|
||||
```
|
||||
|
||||
This should print out something similar to the following:
|
||||
@ -173,7 +173,7 @@ console.log(`Connected to the auto relay node via ${conn.remoteAddr.toString()}`
|
||||
You should now run the following to start the relay node using the listen address from step 2:
|
||||
|
||||
```sh
|
||||
node dialer.js /ip4/192.168.1.120/tcp/58941/ws/p2p/QmQKCBm87HQMbFqy14oqC85pMmnRrj6iD46ggM6reqNpsd
|
||||
node dialer.js /ip4/192.168.1.120/tcp/61592/ws/p2p/QmWDn2LY8nannvSWJzruUYoLZ4vV83vfCBwd8DipvdgQc3
|
||||
```
|
||||
|
||||
Once you start your test node, it should print out something similar to the following:
|
||||
|
@ -7,7 +7,7 @@
|
||||
"libp2p": "github:libp2p/js-libp2p#master",
|
||||
"libp2p-delegated-content-routing": "~0.2.2",
|
||||
"libp2p-delegated-peer-routing": "~0.2.2",
|
||||
"libp2p-kad-dht": "~0.14.12",
|
||||
"libp2p-kad-dht": "^0.26.5",
|
||||
"libp2p-mplex": "~0.8.5",
|
||||
"libp2p-secio": "~0.11.1",
|
||||
"libp2p-webrtc-star": "~0.15.8",
|
||||
|
@ -55,7 +55,7 @@ const node = await Libp2p.create({
|
||||
peerId,
|
||||
addresses: {
|
||||
listen: ['/ip4/0.0.0.0/tcp/0']
|
||||
}
|
||||
},
|
||||
modules: {
|
||||
transport: [ TCP ],
|
||||
streamMuxer: [ Mplex ],
|
||||
@ -117,7 +117,7 @@ const createNode = () => {
|
||||
return Libp2p.create({
|
||||
addresses: {
|
||||
listen: ['/ip4/0.0.0.0/tcp/0']
|
||||
}
|
||||
},
|
||||
modules: {
|
||||
transport: [ TCP ],
|
||||
streamMuxer: [ Mplex ],
|
||||
@ -144,8 +144,13 @@ const [node1, node2] = await Promise.all([
|
||||
createNode()
|
||||
])
|
||||
|
||||
node1.on('peer:discovery', (peer) => console.log('Discovered:', peer.id.toB58String()))
|
||||
node2.on('peer:discovery', (peer) => console.log('Discovered:', peer.id.toB58String()))
|
||||
node1.on('peer:discovery', (peer) => console.log('Discovered:', peerId.toB58String()))
|
||||
node2.on('peer:discovery', (peer) => console.log('Discovered:', peerId.toB58String()))
|
||||
|
||||
await Promise.all([
|
||||
node1.start(),
|
||||
node2.start()
|
||||
])
|
||||
```
|
||||
|
||||
If you run this example, you will see the other peers being discovered.
|
||||
|
@ -28,6 +28,6 @@
|
||||
"babel-plugin-syntax-async-functions": "^6.13.0",
|
||||
"babel-plugin-transform-regenerator": "^6.26.0",
|
||||
"babel-polyfill": "^6.26.0",
|
||||
"parcel": "next"
|
||||
"parcel": "^2.0.1"
|
||||
}
|
||||
}
|
||||
|
@ -38,7 +38,7 @@ async function run() {
|
||||
)
|
||||
await browser.close();
|
||||
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
console.error(err)
|
||||
process.exit(1)
|
||||
} finally {
|
||||
|
@ -81,7 +81,7 @@ function print ({ stream }) {
|
||||
// node 3 (listening WebSockets) can dial node 1 (TCP)
|
||||
try {
|
||||
await node3.dialProtocol(node1.peerId, '/print')
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
console.log('node 3 failed to dial to node 1 with:', err.message)
|
||||
}
|
||||
})();
|
||||
|
@ -9,7 +9,7 @@ async function isExecutable (command) {
|
||||
await fs.access(command, fs.constants.X_OK)
|
||||
|
||||
return true
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
if (err.code === 'ENOENT') {
|
||||
return isExecutable(await which(command))
|
||||
}
|
||||
@ -49,7 +49,7 @@ async function waitForOutput (expectedOutput, command, args = [], opts = {}) {
|
||||
|
||||
try {
|
||||
await proc
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
if (!err.killed) {
|
||||
throw err
|
||||
}
|
||||
|
@ -12,6 +12,6 @@
|
||||
<main>
|
||||
<pre id="output"></pre>
|
||||
</main>
|
||||
<script src="./dialer.js"></script>
|
||||
<script src="./dialer.js" type="module"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
@ -3,7 +3,6 @@
|
||||
"version": "0.0.1",
|
||||
"private": true,
|
||||
"description": "",
|
||||
"main": "dist/index.html",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1",
|
||||
"build": "parcel build index.html",
|
||||
@ -16,7 +15,7 @@
|
||||
"babel-plugin-syntax-async-functions": "^6.13.0",
|
||||
"babel-plugin-transform-regenerator": "^6.26.0",
|
||||
"babel-polyfill": "^6.26.0",
|
||||
"parcel-bundler": "1.12.3",
|
||||
"parcel": "^2.0.1",
|
||||
"util": "^0.12.3"
|
||||
},
|
||||
"dependencies": {
|
||||
@ -25,7 +24,7 @@
|
||||
"libp2p-mplex": "^0.10.4",
|
||||
"@chainsafe/libp2p-noise": "^4.1.0",
|
||||
"libp2p-webrtc-direct": "^0.7.0",
|
||||
"peer-id": "^0.15.0"
|
||||
"peer-id": "^0.16.0"
|
||||
},
|
||||
"browser": {
|
||||
"ipfs": "ipfs/dist/index.min.js"
|
||||
|
@ -72,7 +72,7 @@ async function test () {
|
||||
{ timeout: 10000 }
|
||||
)
|
||||
await browser.close();
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
console.error(err)
|
||||
process.exit(1)
|
||||
} finally {
|
||||
|
57
package.json
57
package.json
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "libp2p",
|
||||
"version": "0.33.0",
|
||||
"version": "0.35.1",
|
||||
"description": "JavaScript implementation of libp2p, a modular peer to peer network stack",
|
||||
"leadMaintainer": "Jacob Heun <jacobheun@gmail.com>",
|
||||
"main": "src/index.js",
|
||||
@ -41,6 +41,7 @@
|
||||
"test:node": "aegir test -t node -f \"./test/**/*.{node,spec}.js\"",
|
||||
"test:browser": "aegir test -t browser",
|
||||
"test:examples": "cd examples && npm run test:all",
|
||||
"test:interop": "LIBP2P_JS=$PWD npx aegir test -t node -f ./node_modules/libp2p-interop/test/*",
|
||||
"prepare": "aegir build --no-bundle",
|
||||
"release": "aegir release -t node -t browser",
|
||||
"release-minor": "aegir release --type minor -t node -t browser",
|
||||
@ -65,7 +66,7 @@
|
||||
"homepage": "https://libp2p.io",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
"node": ">=15.0.0"
|
||||
},
|
||||
"browser": {
|
||||
"@motrix/nat-api": false
|
||||
@ -74,14 +75,14 @@
|
||||
"extends": "ipfs",
|
||||
"ignorePatterns": [
|
||||
"!.aegir.js",
|
||||
"test/ts-use"
|
||||
"test/ts-use",
|
||||
"*.d.ts"
|
||||
]
|
||||
},
|
||||
"dependencies": {
|
||||
"abortable-iterator": "^3.0.0",
|
||||
"@motrix/nat-api": "^0.3.1",
|
||||
"@vascosantos/moving-average": "^1.1.0",
|
||||
"abort-controller": "^3.0.0",
|
||||
"abortable-iterator": "^3.0.0",
|
||||
"aggregate-error": "^3.1.0",
|
||||
"any-signal": "^2.1.1",
|
||||
"bignumber.js": "^9.0.1",
|
||||
@ -103,8 +104,8 @@
|
||||
"it-merge": "^1.0.0",
|
||||
"it-pipe": "^1.1.0",
|
||||
"it-take": "^1.0.0",
|
||||
"libp2p-crypto": "^0.19.4",
|
||||
"libp2p-interfaces": "^1.0.0",
|
||||
"libp2p-crypto": "^0.21.0",
|
||||
"libp2p-interfaces": "^2.0.1",
|
||||
"libp2p-utils": "^0.4.0",
|
||||
"mafmt": "^10.0.0",
|
||||
"merge-options": "^3.0.4",
|
||||
@ -117,14 +118,14 @@
|
||||
"p-fifo": "^1.0.0",
|
||||
"p-retry": "^4.4.0",
|
||||
"p-settle": "^4.1.1",
|
||||
"peer-id": "^0.15.0",
|
||||
"peer-id": "^0.16.0",
|
||||
"private-ip": "^2.1.0",
|
||||
"protobufjs": "^6.10.2",
|
||||
"retimer": "^3.0.0",
|
||||
"sanitize-filename": "^1.6.3",
|
||||
"set-delayed-interval": "^1.0.0",
|
||||
"streaming-iterables": "^6.0.0",
|
||||
"timeout-abort-controller": "^1.1.1",
|
||||
"timeout-abort-controller": "^2.0.0",
|
||||
"uint8arrays": "^3.0.0",
|
||||
"varint": "^6.0.0",
|
||||
"wherearewe": "^1.0.0",
|
||||
@ -134,38 +135,37 @@
|
||||
"@chainsafe/libp2p-noise": "^4.0.0",
|
||||
"@nodeutils/defaults-deep": "^1.1.0",
|
||||
"@types/es6-promisify": "^6.0.0",
|
||||
"@types/node": "^16.0.1",
|
||||
"@types/node-forge": "^0.10.1",
|
||||
"@types/varint": "^6.0.0",
|
||||
"aegir": "^33.1.1",
|
||||
"aegir": "^36.0.0",
|
||||
"buffer": "^6.0.3",
|
||||
"datastore-core": "^6.0.7",
|
||||
"delay": "^5.0.0",
|
||||
"interop-libp2p": "^0.4.0",
|
||||
"into-stream": "^7.0.0",
|
||||
"ipfs-http-client": "^52.0.2",
|
||||
"into-stream": "^6.0.0",
|
||||
"ipfs-http-client": "^54.0.2",
|
||||
"it-concat": "^2.0.0",
|
||||
"it-pair": "^1.0.0",
|
||||
"it-pushable": "^1.4.0",
|
||||
"libp2p": ".",
|
||||
"libp2p-bootstrap": "^0.13.0",
|
||||
"libp2p-bootstrap": "^0.14.0",
|
||||
"libp2p-delegated-content-routing": "^0.11.0",
|
||||
"libp2p-delegated-peer-routing": "^0.10.0",
|
||||
"libp2p-delegated-peer-routing": "^0.11.0",
|
||||
"libp2p-floodsub": "^0.27.0",
|
||||
"libp2p-gossipsub": "^0.11.0",
|
||||
"libp2p-interfaces-compliance-tests": "^1.0.0",
|
||||
"libp2p-kad-dht": "^0.24.2",
|
||||
"libp2p-mdns": "^0.17.0",
|
||||
"libp2p-interfaces-compliance-tests": "^2.0.1",
|
||||
"libp2p-interop": "^0.5.0",
|
||||
"libp2p-kad-dht": "^0.27.1",
|
||||
"libp2p-mdns": "^0.18.0",
|
||||
"libp2p-mplex": "^0.10.1",
|
||||
"libp2p-tcp": "^0.17.0",
|
||||
"libp2p-webrtc-star": "^0.23.0",
|
||||
"libp2p-webrtc-star": "^0.25.0",
|
||||
"libp2p-websockets": "^0.16.0",
|
||||
"nock": "^13.0.3",
|
||||
"p-defer": "^3.0.0",
|
||||
"p-times": "^3.0.0",
|
||||
"p-wait-for": "^3.2.0",
|
||||
"rimraf": "^3.0.2",
|
||||
"sinon": "^11.1.1",
|
||||
"sinon": "^12.0.1",
|
||||
"util": "^0.12.3"
|
||||
},
|
||||
"contributors": [
|
||||
@ -179,28 +179,28 @@
|
||||
"Friedel Ziegelmayer <dignifiedquire@gmail.com>",
|
||||
"Maciej Krüger <mkg20001@gmail.com>",
|
||||
"Hugo Dias <mail@hugodias.me>",
|
||||
"Chris Dostert <chrisdostert@users.noreply.github.com>",
|
||||
"dirkmc <dirkmdev@gmail.com>",
|
||||
"Chris Dostert <chrisdostert@users.noreply.github.com>",
|
||||
"Volker Mische <volker.mische@gmail.com>",
|
||||
"zeim839 <50573884+zeim839@users.noreply.github.com>",
|
||||
"Richard Littauer <richard.littauer@gmail.com>",
|
||||
"a1300 <matthias-knopp@gmx.net>",
|
||||
"Ryan Bell <ryan@piing.net>",
|
||||
"ᴠɪᴄᴛᴏʀ ʙᴊᴇʟᴋʜᴏʟᴍ <victorbjelkholm@gmail.com>",
|
||||
"Franck Royer <franck@royer.one>",
|
||||
"Thomas Eizinger <thomas@eizinger.io>",
|
||||
"Giovanni T. Parra <fiatjaf@gmail.com>",
|
||||
"acolytec3 <17355484+acolytec3@users.noreply.github.com>",
|
||||
"Franck Royer <franck@royer.one>",
|
||||
"Elven <mon.samuel@qq.com>",
|
||||
"Robert Kiel <robert.kiel@hoprnet.org>",
|
||||
"Andrew Nesbitt <andrewnez@gmail.com>",
|
||||
"Samlior <samlior@foxmail.com>",
|
||||
"Thomas Eizinger <thomas@eizinger.io>",
|
||||
"Didrik Nordström <didrik.nordstrom@gmail.com>",
|
||||
"RasmusErik Voel Jensen <github@solsort.com>",
|
||||
"Robert Kiel <robert.kiel@hoprnet.org>",
|
||||
"Smite Chow <xiaopengyou@live.com>",
|
||||
"Soeren <nikorpoulsen@gmail.com>",
|
||||
"Sönke Hahn <soenkehahn@gmail.com>",
|
||||
"TJKoury <TJKoury@gmail.com>",
|
||||
"TheStarBoys <41286328+TheStarBoys@users.noreply.github.com>",
|
||||
"Tiago Alves <alvesjtiago@gmail.com>",
|
||||
"XiaoZhang <zxinmyth@gmail.com>",
|
||||
"Yusef Napora <yusef@napora.org>",
|
||||
@ -210,11 +210,13 @@
|
||||
"isan_rivkin <isanrivkin@gmail.com>",
|
||||
"mayerwin <mayerwin@users.noreply.github.com>",
|
||||
"mcclure <andi.m.mcclure@gmail.com>",
|
||||
"patrickwoodhead <91056047+patrickwoodhead@users.noreply.github.com>",
|
||||
"phillmac <phillmac@users.noreply.github.com>",
|
||||
"robertkiel <robert.kiel@validitylabs.org>",
|
||||
"shresthagrawal <34920931+shresthagrawal@users.noreply.github.com>",
|
||||
"swedneck <40505480+swedneck@users.noreply.github.com>",
|
||||
"greenSnot <greenSnot@users.noreply.github.com>",
|
||||
"Alan Smithee <ggnore.alan.smithee@gmail.com>",
|
||||
"Aleksei <vozhdb@gmail.com>",
|
||||
"Bernd Strehl <bernd.strehl@gmail.com>",
|
||||
"Chris Bratlien <chrisbratlien@gmail.com>",
|
||||
@ -242,6 +244,7 @@
|
||||
"Michael Burns <5170+mburns@users.noreply.github.com>",
|
||||
"Miguel Mota <miguelmota2@gmail.com>",
|
||||
"Nuno Nogueira <nunofmn@gmail.com>",
|
||||
"Philipp Muens <raute1337@gmx.de>"
|
||||
"Philipp Muens <raute1337@gmx.de>",
|
||||
"RasmusErik Voel Jensen <github@solsort.com>"
|
||||
]
|
||||
}
|
||||
|
@ -116,7 +116,7 @@ class AutoRelay {
|
||||
this._peerStore.metadataBook.set(peerId, HOP_METADATA_KEY, uint8ArrayFromString(HOP_METADATA_VALUE))
|
||||
await this._addListenRelay(connection, id)
|
||||
}
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
this._onError(err)
|
||||
}
|
||||
}
|
||||
@ -169,7 +169,7 @@ class AutoRelay {
|
||||
try {
|
||||
await this._transportManager.listen([new Multiaddr(listenAddr)])
|
||||
// Announce multiaddrs will update on listen success by TransportManager event being triggered
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
this._onError(err)
|
||||
this._listenRelays.delete(id)
|
||||
}
|
||||
@ -267,7 +267,7 @@ class AutoRelay {
|
||||
return
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
this._onError(err)
|
||||
}
|
||||
}
|
||||
@ -279,7 +279,7 @@ class AutoRelay {
|
||||
try {
|
||||
const connection = await this._libp2p.dial(peerId)
|
||||
await this._addListenRelay(connection, peerId.toB58String())
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
this._onError(err, `could not connect and listen on known hop relay ${peerId.toB58String()}`)
|
||||
}
|
||||
}
|
||||
|
@ -54,7 +54,7 @@ async function handleHop ({
|
||||
// Validate the HOP request has the required input
|
||||
try {
|
||||
validateAddrs(request, streamHandler)
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
return log.error('invalid hop request via peer %s', connection.remotePeer.toB58String(), err)
|
||||
}
|
||||
|
||||
@ -93,7 +93,7 @@ async function handleHop ({
|
||||
connection: destinationConnection,
|
||||
request: stopRequest
|
||||
})
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
return log.error(err)
|
||||
}
|
||||
|
||||
|
@ -34,7 +34,7 @@ module.exports.handleStop = function handleStop ({
|
||||
// Validate the STOP request has the required input
|
||||
try {
|
||||
validateAddrs(request, streamHandler)
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
return log.error('invalid stop request via peer %s', connection.remotePeer.toB58String(), err)
|
||||
}
|
||||
|
||||
|
@ -34,7 +34,7 @@ function validateAddrs (msg, streamHandler) {
|
||||
return new Multiaddr(addr)
|
||||
})
|
||||
}
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
writeResponse(streamHandler, msg.type === CircuitRelay.Type.HOP
|
||||
? CircuitRelay.Status.HOP_DST_MULTIADDR_INVALID
|
||||
: CircuitRelay.Status.STOP_DST_MULTIADDR_INVALID)
|
||||
@ -47,7 +47,7 @@ function validateAddrs (msg, streamHandler) {
|
||||
return new Multiaddr(addr)
|
||||
})
|
||||
}
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
writeResponse(streamHandler, msg.type === CircuitRelay.Type.HOP
|
||||
? CircuitRelay.Status.HOP_SRC_MULTIADDR_INVALID
|
||||
: CircuitRelay.Status.STOP_SRC_MULTIADDR_INVALID)
|
||||
|
@ -87,7 +87,7 @@ class Relay {
|
||||
try {
|
||||
const cid = await namespaceToCid(RELAY_RENDEZVOUS_NS)
|
||||
await this._libp2p.contentRouting.provide(cid)
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
if (err.code === 'NO_ROUTERS_AVAILABLE') {
|
||||
log.error('a content router, such as a DHT, must be provided in order to advertise the relay service', err)
|
||||
// Stop the advertise
|
||||
|
@ -171,7 +171,7 @@ class Circuit {
|
||||
log('new outbound connection %s', maConn.remoteAddr)
|
||||
|
||||
return this._upgrader.upgradeOutbound(maConn)
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
log.error('Circuit relay dial failed', err)
|
||||
disconnectOnFailure && await relayConnection.close()
|
||||
throw err
|
||||
|
@ -49,24 +49,11 @@ const DefaultConfig = {
|
||||
persistence: false,
|
||||
threshold: 5
|
||||
},
|
||||
peerRouting: {
|
||||
refreshManager: {
|
||||
enabled: true,
|
||||
interval: 6e5,
|
||||
bootDelay: 10e3
|
||||
}
|
||||
},
|
||||
config: {
|
||||
protocolPrefix: 'ipfs',
|
||||
dht: {
|
||||
enabled: false,
|
||||
kBucketSize: 20,
|
||||
randomWalk: {
|
||||
enabled: false, // disabled waiting for https://github.com/libp2p/js-libp2p-kad-dht/issues/86
|
||||
queriesPerPeriod: 1,
|
||||
interval: 300e3,
|
||||
timeout: 10e3
|
||||
}
|
||||
kBucketSize: 20
|
||||
},
|
||||
nat: {
|
||||
enabled: true,
|
||||
|
118
src/connection-manager/auto-dialler.js
Normal file
118
src/connection-manager/auto-dialler.js
Normal file
@ -0,0 +1,118 @@
|
||||
'use strict'
|
||||
|
||||
const debug = require('debug')
|
||||
const mergeOptions = require('merge-options')
|
||||
// @ts-ignore retimer does not have types
|
||||
const retimer = require('retimer')
|
||||
|
||||
const log = Object.assign(debug('libp2p:connection-manager:auto-dialler'), {
|
||||
error: debug('libp2p:connection-manager:auto-dialler:err')
|
||||
})
|
||||
|
||||
const defaultOptions = {
|
||||
enabled: true,
|
||||
minConnections: 0,
|
||||
autoDialInterval: 10000
|
||||
}
|
||||
|
||||
/**
|
||||
* @typedef {import('../index')} Libp2p
|
||||
* @typedef {import('libp2p-interfaces/src/connection').Connection} Connection
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} AutoDiallerOptions
|
||||
* @property {boolean} [enabled = true] - Should preemptively guarantee connections are above the low watermark
|
||||
* @property {number} [minConnections = 0] - The minimum number of connections to avoid pruning
|
||||
* @property {number} [autoDialInterval = 10000] - How often, in milliseconds, it should preemptively guarantee connections are above the low watermark
|
||||
*/
|
||||
|
||||
class AutoDialler {
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
* @class
|
||||
* @param {Libp2p} libp2p
|
||||
* @param {AutoDiallerOptions} options
|
||||
*/
|
||||
constructor (libp2p, options = {}) {
|
||||
this._options = mergeOptions.call({ ignoreUndefined: true }, defaultOptions, options)
|
||||
this._libp2p = libp2p
|
||||
this._running = false
|
||||
this._autoDialTimeout = null
|
||||
this._autoDial = this._autoDial.bind(this)
|
||||
|
||||
log('options: %j', this._options)
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts the auto dialer
|
||||
*/
|
||||
start () {
|
||||
if (!this._options.enabled) {
|
||||
log('not enabled')
|
||||
return
|
||||
}
|
||||
|
||||
this._running = true
|
||||
this._autoDial()
|
||||
log('started')
|
||||
}
|
||||
|
||||
/**
|
||||
* Stops the auto dialler
|
||||
*/
|
||||
async stop () {
|
||||
if (!this._options.enabled) {
|
||||
log('not enabled')
|
||||
return
|
||||
}
|
||||
|
||||
this._running = false
|
||||
this._autoDialTimeout && this._autoDialTimeout.clear()
|
||||
log('stopped')
|
||||
}
|
||||
|
||||
async _autoDial () {
|
||||
const minConnections = this._options.minConnections
|
||||
|
||||
// Already has enough connections
|
||||
if (this._libp2p.connections.size >= minConnections) {
|
||||
this._autoDialTimeout = retimer(this._autoDial, this._options.autoDialInterval)
|
||||
return
|
||||
}
|
||||
|
||||
// Sort peers on wether we know protocols of public keys for them
|
||||
const peers = Array.from(this._libp2p.peerStore.peers.values())
|
||||
.sort((a, b) => {
|
||||
if (b.protocols && b.protocols.length && (!a.protocols || !a.protocols.length)) {
|
||||
return 1
|
||||
} else if (b.id.pubKey && !a.id.pubKey) {
|
||||
return 1
|
||||
}
|
||||
return -1
|
||||
})
|
||||
|
||||
for (let i = 0; this._running && i < peers.length && this._libp2p.connections.size < minConnections; i++) {
|
||||
if (!this._libp2p.connectionManager.get(peers[i].id)) {
|
||||
log('connecting to a peerStore stored peer %s', peers[i].id.toB58String())
|
||||
try {
|
||||
await this._libp2p.dialer.connectToPeer(peers[i].id)
|
||||
} catch (/** @type {any} */ err) {
|
||||
log.error('could not connect to peerStore stored peer', err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Connection Manager was stopped
|
||||
if (!this._running) {
|
||||
return
|
||||
}
|
||||
|
||||
this._autoDialTimeout = retimer(this._autoDial, this._options.autoDialInterval)
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = AutoDialler
|
@ -94,9 +94,7 @@ class ConnectionManager extends EventEmitter {
|
||||
|
||||
this._started = false
|
||||
this._timer = null
|
||||
this._autoDialTimeout = null
|
||||
this._checkMetrics = this._checkMetrics.bind(this)
|
||||
this._autoDial = this._autoDial.bind(this)
|
||||
|
||||
this._latencyMonitor = new LatencyMonitor({
|
||||
latencyCheckIntervalMs: this._options.pollInterval,
|
||||
@ -128,8 +126,6 @@ class ConnectionManager extends EventEmitter {
|
||||
|
||||
this._started = true
|
||||
log('started')
|
||||
|
||||
this._options.autoDial && this._autoDial()
|
||||
}
|
||||
|
||||
/**
|
||||
@ -138,7 +134,6 @@ class ConnectionManager extends EventEmitter {
|
||||
* @async
|
||||
*/
|
||||
async stop () {
|
||||
this._autoDialTimeout && this._autoDialTimeout.clear()
|
||||
this._timer && this._timer.clear()
|
||||
|
||||
this._latencyMonitor.removeListener('data', this._onLatencyMeasure)
|
||||
@ -312,53 +307,6 @@ 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
|
||||
*/
|
||||
async _autoDial () {
|
||||
const minConnections = this._options.minConnections
|
||||
|
||||
// Already has enough connections
|
||||
if (this.size >= minConnections) {
|
||||
this._autoDialTimeout = retimer(this._autoDial, this._options.autoDialInterval)
|
||||
return
|
||||
}
|
||||
|
||||
// Sort peers on wether we know protocols of public keys for them
|
||||
const peers = Array.from(this._libp2p.peerStore.peers.values())
|
||||
.sort((a, b) => {
|
||||
if (b.protocols && b.protocols.length && (!a.protocols || !a.protocols.length)) {
|
||||
return 1
|
||||
} else if (b.id.pubKey && !a.id.pubKey) {
|
||||
return 1
|
||||
}
|
||||
return -1
|
||||
})
|
||||
|
||||
for (let i = 0; i < peers.length && this.size < minConnections; i++) {
|
||||
if (!this.get(peers[i].id)) {
|
||||
log('connecting to a peerStore stored peer %s', peers[i].id.toB58String())
|
||||
try {
|
||||
await this._libp2p.dialer.connectToPeer(peers[i].id)
|
||||
|
||||
// Connection Manager was stopped
|
||||
if (!this._started) {
|
||||
return
|
||||
}
|
||||
} catch (err) {
|
||||
log.error('could not connect to peerStore stored peer', err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this._autoDialTimeout = retimer(this._autoDial, this._options.autoDialInterval)
|
||||
}
|
||||
|
||||
/**
|
||||
* If we have more connections than our maximum, close a connection
|
||||
* to the lowest valued peer.
|
||||
|
@ -8,9 +8,10 @@ const {
|
||||
requirePeers,
|
||||
maybeLimitSource
|
||||
} = require('./utils')
|
||||
|
||||
const drain = require('it-drain')
|
||||
const merge = require('it-merge')
|
||||
const { pipe } = require('it-pipe')
|
||||
const { DHTContentRouting } = require('../dht/dht-content-routing')
|
||||
|
||||
/**
|
||||
* @typedef {import('peer-id')} PeerId
|
||||
@ -38,7 +39,7 @@ class ContentRouting {
|
||||
|
||||
// If we have the dht, add it to the available content routers
|
||||
if (this.dht && libp2p._config.dht.enabled) {
|
||||
this.routers.push(this.dht)
|
||||
this.routers.push(new DHTContentRouting(this.dht))
|
||||
}
|
||||
}
|
||||
|
||||
@ -91,12 +92,12 @@ class ContentRouting {
|
||||
* @param {number} [options.minPeers] - minimum number of peers required to successfully put
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
put (key, value, options) {
|
||||
async put (key, value, options) {
|
||||
if (!this.libp2p.isStarted() || !this.dht.isStarted) {
|
||||
throw errCode(new Error(messages.NOT_STARTED_YET), codes.DHT_NOT_STARTED)
|
||||
}
|
||||
|
||||
return this.dht.put(key, value, options)
|
||||
await drain(this.dht.put(key, value, options))
|
||||
}
|
||||
|
||||
/**
|
||||
@ -108,12 +109,18 @@ class ContentRouting {
|
||||
* @param {number} [options.timeout] - optional timeout (default: 60000)
|
||||
* @returns {Promise<GetData>}
|
||||
*/
|
||||
get (key, options) {
|
||||
async get (key, options) {
|
||||
if (!this.libp2p.isStarted() || !this.dht.isStarted) {
|
||||
throw errCode(new Error(messages.NOT_STARTED_YET), codes.DHT_NOT_STARTED)
|
||||
}
|
||||
|
||||
return this.dht.get(key, options)
|
||||
for await (const event of this.dht.get(key, options)) {
|
||||
if (event.name === 'VALUE') {
|
||||
return { from: event.peerId, val: event.value }
|
||||
}
|
||||
}
|
||||
|
||||
throw errCode(new Error(messages.NOT_FOUND), codes.ERR_NOT_FOUND)
|
||||
}
|
||||
|
||||
/**
|
||||
@ -123,14 +130,33 @@ class ContentRouting {
|
||||
* @param {number} nVals
|
||||
* @param {Object} [options] - get options
|
||||
* @param {number} [options.timeout] - optional timeout (default: 60000)
|
||||
* @returns {Promise<GetData[]>}
|
||||
*/
|
||||
async getMany (key, nVals, options) { // eslint-disable-line require-await
|
||||
async * getMany (key, nVals, options) { // eslint-disable-line require-await
|
||||
if (!this.libp2p.isStarted() || !this.dht.isStarted) {
|
||||
throw errCode(new Error(messages.NOT_STARTED_YET), codes.DHT_NOT_STARTED)
|
||||
}
|
||||
|
||||
return this.dht.getMany(key, nVals, options)
|
||||
if (!nVals) {
|
||||
return
|
||||
}
|
||||
|
||||
let gotValues = 0
|
||||
|
||||
for await (const event of this.dht.get(key, options)) {
|
||||
if (event.name === 'VALUE') {
|
||||
yield { from: event.peerId, val: event.value }
|
||||
|
||||
gotValues++
|
||||
|
||||
if (gotValues === nVals) {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (gotValues === 0) {
|
||||
throw errCode(new Error(messages.NOT_FOUND), codes.ERR_NOT_FOUND)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
44
src/dht/dht-content-routing.js
Normal file
44
src/dht/dht-content-routing.js
Normal file
@ -0,0 +1,44 @@
|
||||
'use strict'
|
||||
|
||||
const drain = require('it-drain')
|
||||
|
||||
/**
|
||||
* @typedef {import('peer-id')} PeerId
|
||||
* @typedef {import('libp2p-interfaces/src/content-routing/types').ContentRouting} ContentRoutingModule
|
||||
* @typedef {import('multiformats/cid').CID} CID
|
||||
*/
|
||||
|
||||
/**
|
||||
* Wrapper class to convert events into returned values
|
||||
*
|
||||
* @implements {ContentRoutingModule}
|
||||
*/
|
||||
class DHTContentRouting {
|
||||
/**
|
||||
* @param {import('libp2p-kad-dht').DHT} dht
|
||||
*/
|
||||
constructor (dht) {
|
||||
this._dht = dht
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {CID} cid
|
||||
*/
|
||||
async provide (cid) {
|
||||
await drain(this._dht.provide(cid))
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {CID} cid
|
||||
* @param {*} options
|
||||
*/
|
||||
async * findProviders (cid, options) {
|
||||
for await (const event of this._dht.findProviders(cid, options)) {
|
||||
if (event.name === 'PROVIDER') {
|
||||
yield * event.providers
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = { DHTContentRouting }
|
51
src/dht/dht-peer-routing.js
Normal file
51
src/dht/dht-peer-routing.js
Normal file
@ -0,0 +1,51 @@
|
||||
'use strict'
|
||||
|
||||
const errCode = require('err-code')
|
||||
const { messages, codes } = require('../errors')
|
||||
|
||||
/**
|
||||
* @typedef {import('peer-id')} PeerId
|
||||
* @typedef {import('libp2p-interfaces/src/peer-routing/types').PeerRouting} PeerRoutingModule
|
||||
*/
|
||||
|
||||
/**
|
||||
* Wrapper class to convert events into returned values
|
||||
*
|
||||
* @implements {PeerRoutingModule}
|
||||
*/
|
||||
class DHTPeerRouting {
|
||||
/**
|
||||
* @param {import('libp2p-kad-dht').DHT} dht
|
||||
*/
|
||||
constructor (dht) {
|
||||
this._dht = dht
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {PeerId} peerId
|
||||
* @param {any} options
|
||||
*/
|
||||
async findPeer (peerId, options = {}) {
|
||||
for await (const event of this._dht.findPeer(peerId, options)) {
|
||||
if (event.name === 'FINAL_PEER') {
|
||||
return event.peer
|
||||
}
|
||||
}
|
||||
|
||||
throw errCode(new Error(messages.NOT_FOUND), codes.ERR_NOT_FOUND)
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Uint8Array} key
|
||||
* @param {any} options
|
||||
*/
|
||||
async * getClosestPeers (key, options = {}) {
|
||||
for await (const event of this._dht.getClosestPeers(key, options)) {
|
||||
if (event.name === 'PEER_RESPONSE') {
|
||||
yield * event.closer
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = { DHTPeerRouting }
|
@ -1,7 +1,6 @@
|
||||
'use strict'
|
||||
|
||||
const errCode = require('err-code')
|
||||
const AbortController = require('abort-controller').default
|
||||
const { anySignal } = require('any-signal')
|
||||
// @ts-ignore p-fifo does not export types
|
||||
const FIFO = require('p-fifo')
|
||||
|
@ -6,8 +6,7 @@ const log = Object.assign(debug('libp2p:dialer'), {
|
||||
})
|
||||
const errCode = require('err-code')
|
||||
const { Multiaddr } = require('multiaddr')
|
||||
// @ts-ignore timeout-abourt-controles does not export types
|
||||
const TimeoutController = require('timeout-abort-controller')
|
||||
const { TimeoutController } = require('timeout-abort-controller')
|
||||
const { AbortError } = require('abortable-iterator')
|
||||
const { anySignal } = require('any-signal')
|
||||
|
||||
@ -95,7 +94,7 @@ class Dialer {
|
||||
for (const dial of this._pendingDials.values()) {
|
||||
try {
|
||||
dial.controller.abort()
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
log.error(err)
|
||||
}
|
||||
}
|
||||
@ -129,7 +128,7 @@ class Dialer {
|
||||
const connection = await pendingDial.promise
|
||||
log('dial succeeded to %s', dialTarget.id)
|
||||
return connection
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
// Error is a timeout
|
||||
if (pendingDial.controller.signal.aborted) {
|
||||
err.code = codes.ERR_TIMEOUT
|
||||
|
@ -3,7 +3,8 @@
|
||||
exports.messages = {
|
||||
NOT_STARTED_YET: 'The libp2p node is not started yet',
|
||||
DHT_DISABLED: 'DHT is not available',
|
||||
CONN_ENCRYPTION_REQUIRED: 'At least one connection encryption module is required'
|
||||
CONN_ENCRYPTION_REQUIRED: 'At least one connection encryption module is required',
|
||||
NOT_FOUND: 'Not found'
|
||||
}
|
||||
|
||||
exports.codes = {
|
||||
@ -29,6 +30,7 @@ exports.codes = {
|
||||
ERR_INVALID_PARAMETERS: 'ERR_INVALID_PARAMETERS',
|
||||
ERR_INVALID_PEER: 'ERR_INVALID_PEER',
|
||||
ERR_MUXER_UNAVAILABLE: 'ERR_MUXER_UNAVAILABLE',
|
||||
ERR_NOT_FOUND: 'ERR_NOT_FOUND',
|
||||
ERR_TIMEOUT: 'ERR_TIMEOUT',
|
||||
ERR_TRANSPORT_UNAVAILABLE: 'ERR_TRANSPORT_UNAVAILABLE',
|
||||
ERR_TRANSPORT_DIAL_FAILED: 'ERR_TRANSPORT_DIAL_FAILED',
|
||||
|
@ -32,7 +32,7 @@ function getPeer (peer) {
|
||||
|
||||
try {
|
||||
peer = PeerId.createFromB58String(idStr)
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
throw errCode(
|
||||
new Error(`${peer} is not a valid peer type`),
|
||||
codes.ERR_INVALID_MULTIADDR
|
||||
|
@ -124,7 +124,7 @@ class IdentifyService {
|
||||
stream,
|
||||
consume
|
||||
)
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
// Just log errors
|
||||
log.error('could not push identify update to peer', err)
|
||||
}
|
||||
@ -182,7 +182,7 @@ class IdentifyService {
|
||||
let message
|
||||
try {
|
||||
message = Message.Identify.decode(data)
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
throw errCode(err, codes.ERR_INVALID_MESSAGE)
|
||||
}
|
||||
|
||||
@ -211,14 +211,14 @@ class IdentifyService {
|
||||
this.peerStore.metadataBook.set(id, 'ProtocolVersion', uint8ArrayFromString(message.protocolVersion))
|
||||
return
|
||||
}
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
log('received invalid envelope, discard it and fallback to listenAddrs is available', err)
|
||||
}
|
||||
|
||||
// LEGACY: Update peers data in PeerStore
|
||||
try {
|
||||
this.peerStore.addressBook.set(id, listenAddrs.map((addr) => new Multiaddr(addr)))
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
log.error('received invalid addrs', err)
|
||||
}
|
||||
|
||||
@ -287,7 +287,7 @@ class IdentifyService {
|
||||
stream,
|
||||
consume
|
||||
)
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
log.error('could not respond to identify request', err)
|
||||
}
|
||||
}
|
||||
@ -313,7 +313,7 @@ class IdentifyService {
|
||||
collect
|
||||
)
|
||||
message = Message.Identify.decode(data)
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
return log.error('received invalid message', err)
|
||||
}
|
||||
|
||||
@ -325,7 +325,7 @@ class IdentifyService {
|
||||
this.peerStore.protoBook.set(id, message.protocols)
|
||||
return
|
||||
}
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
log('received invalid envelope, discard it and fallback to listenAddrs is available', err)
|
||||
}
|
||||
|
||||
@ -333,7 +333,7 @@ class IdentifyService {
|
||||
try {
|
||||
this.peerStore.addressBook.set(id,
|
||||
message.listenAddrs.map((addr) => new Multiaddr(addr)))
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
log.error('received invalid addrs', err)
|
||||
}
|
||||
|
||||
|
33
src/index.js
33
src/index.js
@ -18,6 +18,7 @@ const { codes, messages } = require('./errors')
|
||||
|
||||
const AddressManager = require('./address-manager')
|
||||
const ConnectionManager = require('./connection-manager')
|
||||
const AutoDialler = require('./connection-manager/auto-dialler')
|
||||
const Circuit = require('./circuit/transport')
|
||||
const Relay = require('./circuit')
|
||||
const Dialer = require('./dialer')
|
||||
@ -193,9 +194,13 @@ class Libp2p extends EventEmitter {
|
||||
|
||||
// Create the Connection Manager
|
||||
this.connectionManager = new ConnectionManager(this, {
|
||||
autoDial: this._config.peerDiscovery.autoDial,
|
||||
...this._options.connectionManager
|
||||
})
|
||||
this._autodialler = new AutoDialler(this, {
|
||||
enabled: this._config.peerDiscovery.autoDial,
|
||||
minConnections: this._options.connectionManager.minConnections,
|
||||
autoDialInterval: this._options.connectionManager.autoDialInterval
|
||||
})
|
||||
|
||||
// Create Metrics
|
||||
if (this._options.metrics.enabled) {
|
||||
@ -301,14 +306,9 @@ class Libp2p extends EventEmitter {
|
||||
// dht provided components (peerRouting, contentRouting, dht)
|
||||
if (this._modules.dht) {
|
||||
const DHT = this._modules.dht
|
||||
// @ts-ignore Object is not constructable
|
||||
this._dht = new DHT({
|
||||
// @ts-ignore TODO: types need fixing - DHT is an `object` which has no `create` method
|
||||
this._dht = DHT.create({
|
||||
libp2p: this,
|
||||
dialer: this.dialer,
|
||||
peerId: this.peerId,
|
||||
peerStore: this.peerStore,
|
||||
registrar: this.registrar,
|
||||
datastore: this.datastore,
|
||||
...this._config.dht
|
||||
})
|
||||
}
|
||||
@ -363,7 +363,7 @@ class Libp2p extends EventEmitter {
|
||||
await this._onStarting()
|
||||
await this._onDidStart()
|
||||
log('libp2p has started')
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
this.emit('error', err)
|
||||
log.error('An error occurred starting libp2p', err)
|
||||
await this.stop()
|
||||
@ -384,7 +384,8 @@ class Libp2p extends EventEmitter {
|
||||
this._isStarted = false
|
||||
|
||||
this.relay && this.relay.stop()
|
||||
this.peerRouting.stop()
|
||||
this._autodialler.stop()
|
||||
await (this._dht && this._dht.stop())
|
||||
|
||||
for (const service of this._discovery.values()) {
|
||||
service.removeListener('peer', this._onDiscoveryPeer)
|
||||
@ -399,7 +400,6 @@ class Libp2p extends EventEmitter {
|
||||
|
||||
await Promise.all([
|
||||
this.pubsub && this.pubsub.stop(),
|
||||
this._dht && this._dht.stop(),
|
||||
this.metrics && this.metrics.stop()
|
||||
])
|
||||
|
||||
@ -408,7 +408,7 @@ class Libp2p extends EventEmitter {
|
||||
|
||||
ping.unmount(this)
|
||||
this.dialer.destroy()
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
if (err) {
|
||||
log.error(err)
|
||||
this.emit('error', err)
|
||||
@ -431,7 +431,7 @@ class Libp2p extends EventEmitter {
|
||||
|
||||
try {
|
||||
await this.keychain.findKeyByName('self')
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
await this.keychain.importPeer('self', this.peerId)
|
||||
}
|
||||
}
|
||||
@ -624,7 +624,7 @@ class Libp2p extends EventEmitter {
|
||||
|
||||
// DHT subsystem
|
||||
if (this._config.dht.enabled) {
|
||||
this._dht && this._dht.start()
|
||||
this._dht && await this._dht.start()
|
||||
|
||||
// TODO: this should be modified once random-walk is used as
|
||||
// the other discovery modules
|
||||
@ -655,14 +655,13 @@ class Libp2p extends EventEmitter {
|
||||
}
|
||||
|
||||
this.connectionManager.start()
|
||||
this._autodialler.start()
|
||||
|
||||
// Peer discovery
|
||||
await this._setupPeerDiscovery()
|
||||
|
||||
// Relay
|
||||
this.relay && this.relay.start()
|
||||
|
||||
this.peerRouting.start()
|
||||
}
|
||||
|
||||
/**
|
||||
@ -698,7 +697,7 @@ class Libp2p extends EventEmitter {
|
||||
log('connecting to discovered peer %s', peerId.toB58String())
|
||||
try {
|
||||
await this.dialer.connectToPeer(peerId)
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
log.error(`could not connect to discovered peer ${peerId.toB58String()} with ${err}`)
|
||||
}
|
||||
}
|
||||
|
@ -55,7 +55,7 @@ async function encrypt (localId, conn, remoteId) {
|
||||
let peerId
|
||||
try {
|
||||
peerId = await PeerId.createFromPubKey(id.pubkey.Data)
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
log.error(err)
|
||||
throw new InvalidCryptoExchangeError('Remote did not provide its public key')
|
||||
}
|
||||
|
@ -90,7 +90,7 @@ class CMS {
|
||||
const obj = forge.asn1.fromDer(buf)
|
||||
// @ts-ignore not defined
|
||||
cms = forge.pkcs7.messageFromAsn1(obj)
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
throw errcode(new Error('Invalid CMS: ' + err.message), 'ERR_INVALID_CMS')
|
||||
}
|
||||
|
||||
@ -114,7 +114,7 @@ class CMS {
|
||||
try {
|
||||
const key = await this.keychain.findKeyById(recipient.keyId)
|
||||
if (key) return true
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
return false
|
||||
}
|
||||
return false
|
||||
|
@ -248,7 +248,7 @@ class Keychain {
|
||||
batch.put(DsInfoName(name), uint8ArrayFromString(JSON.stringify(keyInfo)))
|
||||
|
||||
await batch.commit()
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
return throwDelayed(err)
|
||||
}
|
||||
|
||||
@ -284,7 +284,7 @@ class Keychain {
|
||||
try {
|
||||
const keys = await this.listKeys()
|
||||
return keys.find((k) => k.id === id)
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
return throwDelayed(err)
|
||||
}
|
||||
}
|
||||
@ -304,7 +304,7 @@ class Keychain {
|
||||
try {
|
||||
const res = await this.store.get(dsname)
|
||||
return JSON.parse(uint8ArrayToString(res))
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
return throwDelayed(errcode(new Error(`Key '${name}' does not exist. ${err.message}`), 'ERR_KEY_NOT_FOUND'))
|
||||
}
|
||||
}
|
||||
@ -365,7 +365,7 @@ class Keychain {
|
||||
batch.delete(oldInfoName)
|
||||
await batch.commit()
|
||||
return keyInfo
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
return throwDelayed(err)
|
||||
}
|
||||
}
|
||||
@ -393,7 +393,7 @@ class Keychain {
|
||||
const dek = privates.get(this).dek
|
||||
const privateKey = await crypto.keys.import(pem, dek)
|
||||
return privateKey.export(password)
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
return throwDelayed(err)
|
||||
}
|
||||
}
|
||||
@ -421,7 +421,7 @@ class Keychain {
|
||||
let privateKey
|
||||
try {
|
||||
privateKey = await crypto.keys.import(pem, password)
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
return throwDelayed(errcode(new Error('Cannot read the key, most likely the password is wrong'), 'ERR_CANNOT_READ_KEY'))
|
||||
}
|
||||
|
||||
@ -431,7 +431,7 @@ class Keychain {
|
||||
/** @type {string} */
|
||||
const dek = privates.get(this).dek
|
||||
pem = await privateKey.export(dek)
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
return throwDelayed(err)
|
||||
}
|
||||
|
||||
@ -482,7 +482,7 @@ class Keychain {
|
||||
batch.put(DsInfoName(name), uint8ArrayFromString(JSON.stringify(keyInfo)))
|
||||
await batch.commit()
|
||||
return keyInfo
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
return throwDelayed(err)
|
||||
}
|
||||
}
|
||||
@ -502,7 +502,7 @@ class Keychain {
|
||||
const dsname = DsName(name)
|
||||
const res = await this.store.get(dsname)
|
||||
return uint8ArrayToString(res)
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
return throwDelayed(errcode(new Error(`Key '${name}' does not exist. ${err.message}`), 'ERR_KEY_NOT_FOUND'))
|
||||
}
|
||||
}
|
||||
|
@ -10,7 +10,6 @@ const log = Object.assign(debug('libp2p:nat'), {
|
||||
})
|
||||
const { isBrowser } = require('wherearewe')
|
||||
const retry = require('p-retry')
|
||||
// @ts-ignore private-api does not export types
|
||||
const isPrivateIp = require('private-ip')
|
||||
const pkg = require('../package.json')
|
||||
const errcode = require('err-code')
|
||||
@ -115,6 +114,7 @@ class NatManager {
|
||||
const client = this._getClient()
|
||||
const publicIp = this._externalIp || await client.externalIp()
|
||||
|
||||
// @ts-expect-error types are wrong
|
||||
if (isPrivateIp(publicIp)) {
|
||||
throw new Error(`${publicIp} is private - please set config.nat.externalIp to an externally routable IP or ensure you are not behind a double NAT`)
|
||||
}
|
||||
@ -188,7 +188,7 @@ class NatManager {
|
||||
try {
|
||||
await this._client.destroy()
|
||||
this._client = null
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
log.error(err)
|
||||
}
|
||||
}
|
||||
|
@ -1,26 +1,18 @@
|
||||
'use strict'
|
||||
|
||||
const debug = require('debug')
|
||||
const log = Object.assign(debug('libp2p:peer-routing'), {
|
||||
error: debug('libp2p:peer-routing:err')
|
||||
})
|
||||
const errCode = require('err-code')
|
||||
const {
|
||||
storeAddresses,
|
||||
uniquePeers,
|
||||
requirePeers
|
||||
} = require('./content-routing/utils')
|
||||
const { TimeoutController } = require('timeout-abort-controller')
|
||||
|
||||
const merge = require('it-merge')
|
||||
const { pipe } = require('it-pipe')
|
||||
const first = require('it-first')
|
||||
const drain = require('it-drain')
|
||||
const filter = require('it-filter')
|
||||
const {
|
||||
setDelayedInterval,
|
||||
clearDelayedInterval
|
||||
// @ts-ignore module with no types
|
||||
} = require('set-delayed-interval')
|
||||
const { DHTPeerRouting } = require('./dht/dht-peer-routing')
|
||||
|
||||
/**
|
||||
* @typedef {import('peer-id')} PeerId
|
||||
@ -29,13 +21,7 @@ const {
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} RefreshManagerOptions
|
||||
* @property {boolean} [enabled = true] - Whether to enable the Refresh manager
|
||||
* @property {number} [bootDelay = 6e5] - Boot delay to start the Refresh Manager (in ms)
|
||||
* @property {number} [interval = 10e3] - Interval between each Refresh Manager run (in ms)
|
||||
*
|
||||
* @typedef {Object} PeerRoutingOptions
|
||||
* @property {RefreshManagerOptions} [refreshManager]
|
||||
*/
|
||||
|
||||
class PeerRouting {
|
||||
@ -51,44 +37,8 @@ class PeerRouting {
|
||||
|
||||
// If we have the dht, add it to the available peer routers
|
||||
if (libp2p._dht && libp2p._config.dht.enabled) {
|
||||
this._routers.push(libp2p._dht)
|
||||
this._routers.push(new DHTPeerRouting(libp2p._dht))
|
||||
}
|
||||
|
||||
this._refreshManagerOptions = libp2p._options.peerRouting.refreshManager
|
||||
|
||||
this._findClosestPeersTask = this._findClosestPeersTask.bind(this)
|
||||
}
|
||||
|
||||
/**
|
||||
* Start peer routing service.
|
||||
*/
|
||||
start () {
|
||||
if (!this._routers.length || this._timeoutId || !this._refreshManagerOptions.enabled) {
|
||||
return
|
||||
}
|
||||
|
||||
this._timeoutId = setDelayedInterval(
|
||||
this._findClosestPeersTask, this._refreshManagerOptions.interval, this._refreshManagerOptions.bootDelay
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Recurrent task to find closest peers and add their addresses to the Address Book.
|
||||
*/
|
||||
async _findClosestPeersTask () {
|
||||
try {
|
||||
// nb getClosestPeers adds the addresses to the address book
|
||||
await drain(this.getClosestPeers(this._peerId.id))
|
||||
} catch (err) {
|
||||
log.error(err)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Stop peer routing service.
|
||||
*/
|
||||
stop () {
|
||||
clearDelayedInterval(this._timeoutId)
|
||||
}
|
||||
|
||||
/**
|
||||
@ -130,7 +80,8 @@ class PeerRouting {
|
||||
*
|
||||
* @param {Uint8Array} key - A CID like key
|
||||
* @param {Object} [options]
|
||||
* @param {number} [options.timeout=30e3] - How long the query can take.
|
||||
* @param {number} [options.timeout=30e3] - How long the query can take
|
||||
* @param {AbortSignal} [options.signal] - An AbortSignal to abort the request
|
||||
* @returns {AsyncIterable<{ id: PeerId, multiaddrs: Multiaddr[] }>}
|
||||
*/
|
||||
async * getClosestPeers (key, options = { timeout: 30e3 }) {
|
||||
@ -138,6 +89,10 @@ class PeerRouting {
|
||||
throw errCode(new Error('No peer routers available'), 'NO_ROUTERS_AVAILABLE')
|
||||
}
|
||||
|
||||
if (options.timeout) {
|
||||
options.signal = new TimeoutController(options.timeout).signal
|
||||
}
|
||||
|
||||
yield * pipe(
|
||||
merge(
|
||||
...this._routers.map(router => router.getClosestPeers(key, options))
|
||||
|
@ -83,7 +83,7 @@ class AddressBook extends Book {
|
||||
let peerRecord
|
||||
try {
|
||||
peerRecord = PeerRecord.createFromProtobuf(envelope.payload)
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
log.error('invalid peer record received')
|
||||
return false
|
||||
}
|
||||
|
@ -80,10 +80,11 @@ class MetadataBook extends Book {
|
||||
/**
|
||||
* Set data into the datastructure
|
||||
*
|
||||
* @override
|
||||
* @param {PeerId} peerId
|
||||
* @param {string} key
|
||||
* @param {Uint8Array} value
|
||||
* @param {object} [opts]
|
||||
* @param {boolean} [opts.emit]
|
||||
*/
|
||||
_setValue (peerId, key, value, { emit = true } = {}) {
|
||||
const id = peerId.toB58String()
|
||||
|
@ -249,7 +249,7 @@ class PersistentPeerStore extends PeerStore {
|
||||
}).finish()
|
||||
|
||||
batch.put(key, encodedData)
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
log.error(err)
|
||||
}
|
||||
}
|
||||
@ -275,7 +275,7 @@ class PersistentPeerStore extends PeerStore {
|
||||
const encodedData = peerId.marshalPubKey()
|
||||
|
||||
batch.put(key, encodedData)
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
log.error(err)
|
||||
}
|
||||
}
|
||||
@ -302,7 +302,7 @@ class PersistentPeerStore extends PeerStore {
|
||||
batch.delete(key)
|
||||
}
|
||||
})
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
log.error(err)
|
||||
}
|
||||
}
|
||||
@ -330,7 +330,7 @@ class PersistentPeerStore extends PeerStore {
|
||||
const encodedData = Protocols.encode({ protocols }).finish()
|
||||
|
||||
batch.put(key, encodedData)
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
log.error(err)
|
||||
}
|
||||
}
|
||||
@ -399,7 +399,7 @@ class PersistentPeerStore extends PeerStore {
|
||||
default:
|
||||
log('invalid data persisted for: ', key.toString())
|
||||
}
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
log.error(err)
|
||||
}
|
||||
}
|
||||
|
@ -77,7 +77,7 @@ module.exports.decodeV1PSK = (pskBuffer) => {
|
||||
codecName: codec,
|
||||
psk: psk
|
||||
}
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
log.error(err)
|
||||
throw new Error(Errors.INVALID_PSK)
|
||||
}
|
||||
|
@ -28,6 +28,6 @@ try {
|
||||
// @ts-ignore
|
||||
generate(process.stdout)
|
||||
}
|
||||
} catch (error) {
|
||||
} catch (/** @type {any} */ error) {
|
||||
|
||||
}
|
||||
|
@ -109,7 +109,7 @@ class TransportManager {
|
||||
|
||||
try {
|
||||
return await transport.dial(ma, options)
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
if (!err.code) err.code = codes.ERR_TRANSPORT_DIAL_FAILED
|
||||
throw err
|
||||
}
|
||||
|
@ -106,7 +106,7 @@ class Upgrader {
|
||||
} else {
|
||||
upgradedConn = encryptedConn
|
||||
}
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
log.error('Failed to upgrade inbound connection', err)
|
||||
await maConn.close(err)
|
||||
throw err
|
||||
@ -181,7 +181,7 @@ class Upgrader {
|
||||
} else {
|
||||
upgradedConn = encryptedConn
|
||||
}
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
log.error('Failed to upgrade outbound connection', err)
|
||||
await maConn.close(err)
|
||||
throw err
|
||||
@ -245,7 +245,7 @@ class Upgrader {
|
||||
if (this.metrics) this.metrics.trackStream({ stream, remotePeer, protocol })
|
||||
connection.addStream(muxedStream, { protocol })
|
||||
this._onStream({ connection, stream: { ...muxedStream, ...stream }, protocol })
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
log.error(err)
|
||||
}
|
||||
},
|
||||
@ -263,7 +263,7 @@ class Upgrader {
|
||||
const { stream, protocol } = await mss.select(protocols)
|
||||
if (this.metrics) this.metrics.trackStream({ stream, remotePeer, protocol })
|
||||
return { stream: { ...muxedStream, ...stream }, protocol }
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
log.error('could not create new stream', err)
|
||||
throw errCode(err, codes.ERR_UNSUPPORTED_PROTOCOL)
|
||||
}
|
||||
@ -283,7 +283,7 @@ class Upgrader {
|
||||
if (connection.stat.status === 'open') {
|
||||
await connection.close()
|
||||
}
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
log.error(err)
|
||||
} finally {
|
||||
this.onConnectionEnd(connection)
|
||||
@ -371,7 +371,7 @@ class Upgrader {
|
||||
...await crypto.secureInbound(localPeer, stream),
|
||||
protocol
|
||||
}
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
throw errCode(err, codes.ERR_ENCRYPTION_FAILED)
|
||||
}
|
||||
}
|
||||
@ -406,7 +406,7 @@ class Upgrader {
|
||||
...await crypto.secureOutbound(localPeer, stream, remotePeerId),
|
||||
protocol
|
||||
}
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
throw errCode(err, codes.ERR_ENCRYPTION_FAILED)
|
||||
}
|
||||
}
|
||||
@ -430,7 +430,7 @@ class Upgrader {
|
||||
log('%s selected as muxer protocol', protocol)
|
||||
const Muxer = muxers.get(protocol)
|
||||
return { stream, Muxer }
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
throw errCode(err, codes.ERR_MUXER_UNAVAILABLE)
|
||||
}
|
||||
}
|
||||
@ -453,7 +453,7 @@ class Upgrader {
|
||||
const { stream, protocol } = await listener.handle(protocols)
|
||||
const Muxer = muxers.get(protocol)
|
||||
return { stream, Muxer }
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
throw errCode(err, codes.ERR_MUXER_UNAVAILABLE)
|
||||
}
|
||||
}
|
||||
|
@ -34,7 +34,7 @@ describe('content-routing', () => {
|
||||
try {
|
||||
for await (const _ of node.contentRouting.findProviders('a cid')) {} // eslint-disable-line
|
||||
throw new Error('.findProviders should return an error')
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
expect(err).to.exist()
|
||||
expect(err.code).to.equal('NO_ROUTERS_AVAILABLE')
|
||||
}
|
||||
@ -238,7 +238,7 @@ describe('content-routing', () => {
|
||||
try {
|
||||
for await (const _ of node.contentRouting.findProviders(cid)) { } // eslint-disable-line
|
||||
throw new Error('should handle errors when finding providers')
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
expect(err).to.exist()
|
||||
}
|
||||
|
||||
|
@ -5,7 +5,6 @@ const { expect } = require('aegir/utils/chai')
|
||||
const sinon = require('sinon')
|
||||
|
||||
const { AbortError } = require('libp2p-interfaces/src/transport/errors')
|
||||
const AbortController = require('abort-controller')
|
||||
const AggregateError = require('aggregate-error')
|
||||
const pDefer = require('p-defer')
|
||||
const delay = require('delay')
|
||||
@ -125,7 +124,7 @@ describe('Dial Request', () => {
|
||||
try {
|
||||
await dialRequest.run({ signal: controller.signal })
|
||||
expect.fail('Should have thrown')
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
expect(err).to.be.an.instanceof(AggregateError)
|
||||
}
|
||||
|
||||
@ -162,7 +161,7 @@ describe('Dial Request', () => {
|
||||
try {
|
||||
await dialRequest.run({ signal: controller.signal })
|
||||
expect.fail('Should have thrown')
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
expect(err).to.be.an.instanceof(AggregateError)
|
||||
}
|
||||
|
||||
@ -212,7 +211,7 @@ describe('Dial Request', () => {
|
||||
setTimeout(() => controller.abort(), 100)
|
||||
await dialRequest.run({ signal: controller.signal })
|
||||
expect.fail('dial should have failed')
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
expect(err).to.be.an.instanceof(AggregateError)
|
||||
}
|
||||
|
||||
|
@ -277,7 +277,7 @@ describe('Dialing (direct, TCP)', () => {
|
||||
|
||||
try {
|
||||
await libp2p.dial(remoteLibp2p.transportManager.getAddrs()[0])
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
expect(err).to.have.property('code', ErrorCodes.ERR_INVALID_MULTIADDR)
|
||||
return
|
||||
}
|
||||
|
@ -304,7 +304,7 @@ describe('Dialing (direct, WebSockets)', () => {
|
||||
dialer.destroy()
|
||||
await dialPromise
|
||||
expect.fail('should have failed')
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
expect(err).to.be.an.instanceof(AggregateError)
|
||||
expect(dialer._pendingDials.size).to.equal(0) // 1 dial request
|
||||
}
|
||||
|
@ -519,7 +519,7 @@ describe('keychain', () => {
|
||||
it('should validate newPass is a string', async () => {
|
||||
try {
|
||||
await kc.rotateKeychainPass(oldPass, 1234567890)
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
expect(err).to.exist()
|
||||
}
|
||||
})
|
||||
@ -527,7 +527,7 @@ describe('keychain', () => {
|
||||
it('should validate oldPass is a string', async () => {
|
||||
try {
|
||||
await kc.rotateKeychainPass(1234, 'newInsecurePassword1')
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
expect(err).to.exist()
|
||||
}
|
||||
})
|
||||
@ -535,7 +535,7 @@ describe('keychain', () => {
|
||||
it('should validate newPass is at least 20 characters', async () => {
|
||||
try {
|
||||
await kc.rotateKeychainPass(oldPass, 'not20Chars')
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
expect(err).to.exist()
|
||||
}
|
||||
})
|
||||
@ -586,7 +586,7 @@ describe('libp2p.keychain', () => {
|
||||
|
||||
try {
|
||||
await libp2p.keychain.createKey('keyName', 'rsa', 2048)
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
expect(err).to.exist()
|
||||
return
|
||||
}
|
||||
|
@ -6,9 +6,7 @@ const nock = require('nock')
|
||||
const sinon = require('sinon')
|
||||
const intoStream = require('into-stream')
|
||||
|
||||
const delay = require('delay')
|
||||
const pDefer = require('p-defer')
|
||||
const pWaitFor = require('p-wait-for')
|
||||
const mergeOptions = require('merge-options')
|
||||
const drain = require('it-drain')
|
||||
const all = require('it-all')
|
||||
@ -43,7 +41,7 @@ describe('peer-routing', () => {
|
||||
try {
|
||||
for await (const _ of node.peerRouting.getClosestPeers('a cid')) { } // eslint-disable-line
|
||||
throw new Error('.getClosestPeers should return an error')
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
expect(err).to.exist()
|
||||
expect(err.code).to.equal('NO_ROUTERS_AVAILABLE')
|
||||
}
|
||||
@ -275,7 +273,7 @@ describe('peer-routing', () => {
|
||||
try {
|
||||
for await (const _ of node.peerRouting.getClosestPeers(peerId.id)) { } // eslint-disable-line
|
||||
throw new Error('should handle errors when getting the closest peers')
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
expect(err).to.exist()
|
||||
}
|
||||
|
||||
@ -453,109 +451,4 @@ describe('peer-routing', () => {
|
||||
expect(peers).to.be.an('array').with.a.lengthOf(1).that.deep.equals(results)
|
||||
})
|
||||
})
|
||||
|
||||
describe('peer routing refresh manager service', () => {
|
||||
let node
|
||||
let peerIds
|
||||
|
||||
before(async () => {
|
||||
peerIds = await peerUtils.createPeerId({ number: 2 })
|
||||
})
|
||||
|
||||
afterEach(() => {
|
||||
sinon.restore()
|
||||
|
||||
return node && node.stop()
|
||||
})
|
||||
|
||||
it('should be enabled and start by default', async () => {
|
||||
const results = [
|
||||
{ id: peerIds[0], multiaddrs: [new Multiaddr('/ip4/30.0.0.1/tcp/2000')] },
|
||||
{ id: peerIds[1], multiaddrs: [new Multiaddr('/ip4/32.0.0.1/tcp/2000')] }
|
||||
]
|
||||
|
||||
;[node] = await peerUtils.createPeer({
|
||||
config: mergeOptions(routingOptions, {
|
||||
peerRouting: {
|
||||
refreshManager: {
|
||||
bootDelay: 100
|
||||
}
|
||||
}
|
||||
}),
|
||||
started: false
|
||||
})
|
||||
|
||||
sinon.spy(node.peerStore.addressBook, 'add')
|
||||
sinon.stub(node._dht, 'getClosestPeers').callsFake(function * () {
|
||||
yield results[0]
|
||||
yield results[1]
|
||||
})
|
||||
|
||||
await node.start()
|
||||
|
||||
await pWaitFor(() => node._dht.getClosestPeers.callCount === 1)
|
||||
await pWaitFor(() => node.peerStore.addressBook.add.callCount === results.length)
|
||||
|
||||
const call0 = node.peerStore.addressBook.add.getCall(0)
|
||||
expect(call0.args[0].equals(results[0].id))
|
||||
call0.args[1].forEach((m, index) => {
|
||||
expect(m.equals(results[0].multiaddrs[index]))
|
||||
})
|
||||
|
||||
const call1 = node.peerStore.addressBook.add.getCall(1)
|
||||
expect(call1.args[0].equals(results[1].id))
|
||||
call0.args[1].forEach((m, index) => {
|
||||
expect(m.equals(results[1].multiaddrs[index]))
|
||||
})
|
||||
})
|
||||
|
||||
it('should support being disabled', async () => {
|
||||
[node] = await peerUtils.createPeer({
|
||||
config: mergeOptions(routingOptions, {
|
||||
peerRouting: {
|
||||
refreshManager: {
|
||||
bootDelay: 100,
|
||||
enabled: false
|
||||
}
|
||||
}
|
||||
}),
|
||||
started: false
|
||||
})
|
||||
|
||||
sinon.stub(node._dht, 'getClosestPeers').callsFake(function * () {
|
||||
yield
|
||||
throw new Error('should not be called')
|
||||
})
|
||||
|
||||
await node.start()
|
||||
await delay(100)
|
||||
|
||||
expect(node._dht.getClosestPeers.callCount === 0)
|
||||
})
|
||||
|
||||
it('should start and run recurrently on interval', async () => {
|
||||
[node] = await peerUtils.createPeer({
|
||||
config: mergeOptions(routingOptions, {
|
||||
peerRouting: {
|
||||
refreshManager: {
|
||||
interval: 500,
|
||||
bootDelay: 200
|
||||
}
|
||||
}
|
||||
}),
|
||||
started: false
|
||||
})
|
||||
|
||||
sinon.stub(node._dht, 'getClosestPeers').callsFake(function * () {
|
||||
yield { id: peerIds[0], multiaddrs: [new Multiaddr('/ip4/30.0.0.1/tcp/2000')] }
|
||||
})
|
||||
|
||||
await node.start()
|
||||
|
||||
await delay(300)
|
||||
expect(node._dht.getClosestPeers.callCount).to.eql(1)
|
||||
await delay(500)
|
||||
expect(node._dht.getClosestPeers.callCount).to.eql(2)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
@ -45,7 +45,7 @@ describe('addressBook', () => {
|
||||
it('throwns invalid parameters error if invalid PeerId is provided', () => {
|
||||
try {
|
||||
ab.set('invalid peerId')
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
expect(err.code).to.equal(ERR_INVALID_PARAMETERS)
|
||||
return
|
||||
}
|
||||
@ -55,7 +55,7 @@ describe('addressBook', () => {
|
||||
it('throwns invalid parameters error if no addresses provided', () => {
|
||||
try {
|
||||
ab.set(peerId)
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
expect(err.code).to.equal(ERR_INVALID_PARAMETERS)
|
||||
return
|
||||
}
|
||||
@ -65,7 +65,7 @@ describe('addressBook', () => {
|
||||
it('throwns invalid parameters error if invalid multiaddrs are provided', () => {
|
||||
try {
|
||||
ab.set(peerId, ['invalid multiaddr'])
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
expect(err.code).to.equal(ERR_INVALID_PARAMETERS)
|
||||
return
|
||||
}
|
||||
@ -159,7 +159,7 @@ describe('addressBook', () => {
|
||||
it('throwns invalid parameters error if invalid PeerId is provided', () => {
|
||||
try {
|
||||
ab.add('invalid peerId')
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
expect(err.code).to.equal(ERR_INVALID_PARAMETERS)
|
||||
return
|
||||
}
|
||||
@ -169,7 +169,7 @@ describe('addressBook', () => {
|
||||
it('throwns invalid parameters error if no addresses provided', () => {
|
||||
try {
|
||||
ab.add(peerId)
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
expect(err.code).to.equal(ERR_INVALID_PARAMETERS)
|
||||
return
|
||||
}
|
||||
@ -179,7 +179,7 @@ describe('addressBook', () => {
|
||||
it('throwns invalid parameters error if invalid multiaddrs are provided', () => {
|
||||
try {
|
||||
ab.add(peerId, ['invalid multiaddr'])
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
expect(err.code).to.equal(ERR_INVALID_PARAMETERS)
|
||||
return
|
||||
}
|
||||
@ -308,7 +308,7 @@ describe('addressBook', () => {
|
||||
it('throwns invalid parameters error if invalid PeerId is provided', () => {
|
||||
try {
|
||||
ab.get('invalid peerId')
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
expect(err.code).to.equal(ERR_INVALID_PARAMETERS)
|
||||
return
|
||||
}
|
||||
@ -343,7 +343,7 @@ describe('addressBook', () => {
|
||||
it('throwns invalid parameters error if invalid PeerId is provided', () => {
|
||||
try {
|
||||
ab.getMultiaddrsForPeer('invalid peerId')
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
expect(err.code).to.equal(ERR_INVALID_PARAMETERS)
|
||||
return
|
||||
}
|
||||
@ -391,7 +391,7 @@ describe('addressBook', () => {
|
||||
it('throwns invalid parameters error if invalid PeerId is provided', () => {
|
||||
try {
|
||||
ab.delete('invalid peerId')
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
expect(err.code).to.equal(ERR_INVALID_PARAMETERS)
|
||||
return
|
||||
}
|
||||
|
@ -23,7 +23,7 @@ describe('keyBook', () => {
|
||||
it('throws invalid parameters error if invalid PeerId is provided in set', () => {
|
||||
try {
|
||||
kb.set('invalid peerId')
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
expect(err.code).to.equal(ERR_INVALID_PARAMETERS)
|
||||
return
|
||||
}
|
||||
@ -33,7 +33,7 @@ describe('keyBook', () => {
|
||||
it('throws invalid parameters error if invalid PeerId is provided in get', () => {
|
||||
try {
|
||||
kb.get('invalid peerId')
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
expect(err.code).to.equal(ERR_INVALID_PARAMETERS)
|
||||
return
|
||||
}
|
||||
|
@ -34,7 +34,7 @@ describe('metadataBook', () => {
|
||||
it('throws invalid parameters error if invalid PeerId is provided', () => {
|
||||
try {
|
||||
mb.set('invalid peerId')
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
expect(err.code).to.equal(ERR_INVALID_PARAMETERS)
|
||||
return
|
||||
}
|
||||
@ -44,7 +44,7 @@ describe('metadataBook', () => {
|
||||
it('throws invalid parameters error if no key provided', () => {
|
||||
try {
|
||||
mb.set(peerId)
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
expect(err.code).to.equal(ERR_INVALID_PARAMETERS)
|
||||
return
|
||||
}
|
||||
@ -54,7 +54,7 @@ describe('metadataBook', () => {
|
||||
it('throws invalid parameters error if no value provided', () => {
|
||||
try {
|
||||
mb.set(peerId, 'location')
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
expect(err.code).to.equal(ERR_INVALID_PARAMETERS)
|
||||
return
|
||||
}
|
||||
@ -64,7 +64,7 @@ describe('metadataBook', () => {
|
||||
it('throws invalid parameters error if value is not a buffer', () => {
|
||||
try {
|
||||
mb.set(peerId, 'location', 'mars')
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
expect(err.code).to.equal(ERR_INVALID_PARAMETERS)
|
||||
return
|
||||
}
|
||||
@ -163,7 +163,7 @@ describe('metadataBook', () => {
|
||||
it('throws invalid parameters error if invalid PeerId is provided', () => {
|
||||
try {
|
||||
mb.get('invalid peerId')
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
expect(err.code).to.equal(ERR_INVALID_PARAMETERS)
|
||||
return
|
||||
}
|
||||
@ -199,7 +199,7 @@ describe('metadataBook', () => {
|
||||
it('throws invalid parameters error if invalid PeerId is provided', () => {
|
||||
try {
|
||||
mb.getValue('invalid peerId')
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
expect(err.code).to.equal(ERR_INVALID_PARAMETERS)
|
||||
return
|
||||
}
|
||||
@ -248,7 +248,7 @@ describe('metadataBook', () => {
|
||||
it('throwns invalid parameters error if invalid PeerId is provided', () => {
|
||||
try {
|
||||
mb.delete('invalid peerId')
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
expect(err.code).to.equal(ERR_INVALID_PARAMETERS)
|
||||
return
|
||||
}
|
||||
@ -305,7 +305,7 @@ describe('metadataBook', () => {
|
||||
it('throws invalid parameters error if invalid PeerId is provided', () => {
|
||||
try {
|
||||
mb.deleteValue('invalid peerId')
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
expect(err.code).to.equal(ERR_INVALID_PARAMETERS)
|
||||
return
|
||||
}
|
||||
|
@ -201,7 +201,7 @@ describe('libp2p.transportManager (dial only)', () => {
|
||||
|
||||
try {
|
||||
await libp2p.start()
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
expect(err).to.exist()
|
||||
expect(err.code).to.equal(ErrorCodes.ERR_NO_VALID_ADDRESSES)
|
||||
return
|
||||
|
@ -10,13 +10,13 @@
|
||||
"libp2p-delegated-peer-routing": "^0.10.0",
|
||||
"libp2p-gossipsub": "^0.9.0",
|
||||
"libp2p-interfaces": "^1.0.1",
|
||||
"libp2p-kad-dht": "^0.23.1",
|
||||
"libp2p-kad-dht": "^0.26.5",
|
||||
"libp2p-mplex": "^0.10.4",
|
||||
"@chainsafe/libp2p-noise": "^4.1.0",
|
||||
"libp2p-record": "^0.10.4",
|
||||
"libp2p-tcp": "^0.17.1",
|
||||
"libp2p-websockets": "^0.16.1",
|
||||
"peer-id": "^0.15.0"
|
||||
"peer-id": "^0.16.0"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "npx tsc",
|
||||
|
@ -62,13 +62,6 @@ async function main() {
|
||||
contentRouting: [delegatedContentRouting],
|
||||
peerRouting: [delegatedPeerRouting]
|
||||
},
|
||||
peerRouting: {
|
||||
refreshManager: {
|
||||
enabled: true,
|
||||
interval: 1000,
|
||||
bootDelay: 11111
|
||||
}
|
||||
},
|
||||
dialer: {
|
||||
maxParallelDials: 100,
|
||||
maxDialsPerPeer: 4,
|
||||
|
@ -108,7 +108,7 @@ function createConnection ({
|
||||
// Need to be able to notify a peer of this this._onStream({ connection, stream, protocol })
|
||||
const handler = protocols.get(protocol)
|
||||
handler({ connection, stream, protocol })
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
// Do nothing
|
||||
}
|
||||
},
|
||||
@ -124,7 +124,7 @@ function createConnection ({
|
||||
try {
|
||||
const { stream, protocol } = await mss.select(protocols)
|
||||
return { stream: { ...muxedStream, ...stream }, protocol }
|
||||
} catch (err) {
|
||||
} catch (/** @type {any} */ err) {
|
||||
throw errCode(err, codes.ERR_UNSUPPORTED_PROTOCOL)
|
||||
}
|
||||
}
|
||||
|
@ -2,7 +2,6 @@
|
||||
|
||||
const duplexPair = require('it-pair/duplex')
|
||||
const abortable = require('abortable-iterator')
|
||||
const AbortController = require('abort-controller')
|
||||
|
||||
/**
|
||||
* Returns both sides of a mocked MultiaddrConnection
|
||||
|
@ -1,5 +1,5 @@
|
||||
{
|
||||
"extends": "./node_modules/aegir/src/config/tsconfig.aegir.json",
|
||||
"extends": "aegir/src/config/tsconfig.aegir.json",
|
||||
"compilerOptions": {
|
||||
"outDir": "dist"
|
||||
},
|
||||
|
Reference in New Issue
Block a user