mirror of
https://github.com/cerc-io/watcher-ts
synced 2024-11-19 12:26:19 +00:00
Upgrade js-libp2p and related dependencies (#298)
* Upgrade js-libp2p and related dependencies * Dial all multiaddr of a discovered peer in parallel * Dial using peer id instead of dialling individual multiaddr * Log peer id on discovery
This commit is contained in:
parent
7069a7f455
commit
ff64dcb43c
@ -16,7 +16,7 @@
|
|||||||
"@ethersproject/providers": "^5.4.4",
|
"@ethersproject/providers": "^5.4.4",
|
||||||
"@graphql-tools/utils": "^9.1.1",
|
"@graphql-tools/utils": "^9.1.1",
|
||||||
"@ipld/dag-cbor": "^8.0.0",
|
"@ipld/dag-cbor": "^8.0.0",
|
||||||
"@libp2p/interface-peer-id": "^1.1.2",
|
"@libp2p/interface-peer-id": "^2.0.0",
|
||||||
"apollo-server-express": "^3.11.1",
|
"apollo-server-express": "^3.11.1",
|
||||||
"debug": "^4.3.1",
|
"debug": "^4.3.1",
|
||||||
"express": "^4.18.2",
|
"express": "^4.18.2",
|
||||||
|
@ -51,7 +51,7 @@ function App() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
peer.node.peerStore.addEventListener('change:multiaddrs', forceUpdate)
|
peer.node.peerStore.addEventListener('change:multiaddrs', forceUpdate)
|
||||||
peer.node.connectionManager.addEventListener('peer:connect', forceUpdate)
|
peer.node.addEventListener('peer:connect', forceUpdate)
|
||||||
|
|
||||||
let lastDisconnect = new Date()
|
let lastDisconnect = new Date()
|
||||||
const disconnectHandler = () => {
|
const disconnectHandler = () => {
|
||||||
@ -63,14 +63,14 @@ function App() {
|
|||||||
lastDisconnect = now;
|
lastDisconnect = now;
|
||||||
}
|
}
|
||||||
|
|
||||||
peer.node.connectionManager.addEventListener('peer:disconnect', disconnectHandler)
|
peer.node.addEventListener('peer:disconnect', disconnectHandler)
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
unsubscribeMessage()
|
unsubscribeMessage()
|
||||||
unsubscribeTopic()
|
unsubscribeTopic()
|
||||||
peer.node?.peerStore.removeEventListener('change:multiaddrs', forceUpdate)
|
peer.node?.peerStore.removeEventListener('change:multiaddrs', forceUpdate)
|
||||||
peer.node?.connectionManager.removeEventListener('peer:connect', forceUpdate)
|
peer.node?.removeEventListener('peer:connect', forceUpdate)
|
||||||
peer.node?.connectionManager.removeEventListener('peer:disconnect', disconnectHandler)
|
peer.node?.removeEventListener('peer:disconnect', disconnectHandler)
|
||||||
}
|
}
|
||||||
}, [peer, forceUpdate])
|
}, [peer, forceUpdate])
|
||||||
|
|
||||||
@ -139,10 +139,10 @@ function App() {
|
|||||||
peer && peer.node && (
|
peer && peer.node && (
|
||||||
<>
|
<>
|
||||||
<Typography variant="subtitle1" color="inherit" noWrap>
|
<Typography variant="subtitle1" color="inherit" noWrap>
|
||||||
Remote Peer Connections (Count: {peer.node.connectionManager.getConnections().length})
|
Remote Peer Connections (Count: {peer.node.getConnections().length})
|
||||||
</Typography>
|
</Typography>
|
||||||
<br/>
|
<br/>
|
||||||
{peer.node.connectionManager.getConnections().map(connection => (
|
{peer.node.getConnections().map(connection => (
|
||||||
<TableContainer sx={{ mb: 2 }} key={connection.id} component={Paper}>
|
<TableContainer sx={{ mb: 2 }} key={connection.id} component={Paper}>
|
||||||
<Table size="small">
|
<Table size="small">
|
||||||
<TableBody>
|
<TableBody>
|
||||||
|
@ -27,12 +27,11 @@
|
|||||||
"relay-node": "node dist/relay.js"
|
"relay-node": "node dist/relay.js"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@chainsafe/libp2p-noise": "^10.2.0",
|
"@chainsafe/libp2p-noise": "^11.0.0",
|
||||||
"@libp2p/floodsub": "^5.0.0",
|
"@libp2p/floodsub": "^6.0.0",
|
||||||
"@libp2p/interface-peer-id": "^1.1.2",
|
|
||||||
"@libp2p/mplex": "^7.1.1",
|
"@libp2p/mplex": "^7.1.1",
|
||||||
"@libp2p/peer-id-factory": "^2.0.0",
|
"@libp2p/peer-id-factory": "^2.0.0",
|
||||||
"@libp2p/pubsub-peer-discovery": "^7.0.1",
|
"@libp2p/pubsub-peer-discovery": "^8.0.0",
|
||||||
"@libp2p/webrtc-star": "^5.0.3",
|
"@libp2p/webrtc-star": "^5.0.3",
|
||||||
"@multiformats/multiaddr": "^11.1.4",
|
"@multiformats/multiaddr": "^11.1.4",
|
||||||
"debug": "^4.3.1",
|
"debug": "^4.3.1",
|
||||||
@ -40,14 +39,14 @@
|
|||||||
"it-map": "^2.0.0",
|
"it-map": "^2.0.0",
|
||||||
"it-pipe": "^2.0.5",
|
"it-pipe": "^2.0.5",
|
||||||
"it-pushable": "^3.1.2",
|
"it-pushable": "^3.1.2",
|
||||||
"libp2p": "^0.41.0",
|
"libp2p": "^0.42.2",
|
||||||
"node-pre-gyp": "^0.13.0",
|
"node-pre-gyp": "^0.13.0",
|
||||||
"uint8arrays": "^4.0.3",
|
"uint8arrays": "^4.0.3",
|
||||||
"wrtc": "^0.4.7",
|
"wrtc": "^0.4.7",
|
||||||
"yargs": "^17.0.1"
|
"yargs": "^17.0.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@libp2p/webrtc-star-signalling-server": "^2.0.5",
|
"@libp2p/webrtc-star-signalling-server": "^3.0.0",
|
||||||
"@types/node": "16.11.7",
|
"@types/node": "16.11.7",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.47.1",
|
"@typescript-eslint/eslint-plugin": "^5.47.1",
|
||||||
"@typescript-eslint/parser": "^5.47.1",
|
"@typescript-eslint/parser": "^5.47.1",
|
||||||
|
@ -19,7 +19,7 @@ import { mplex } from '@libp2p/mplex';
|
|||||||
import type { Stream as P2PStream, Connection } from '@libp2p/interface-connection';
|
import type { Stream as P2PStream, Connection } from '@libp2p/interface-connection';
|
||||||
import type { PeerInfo } from '@libp2p/interface-peer-info';
|
import type { PeerInfo } from '@libp2p/interface-peer-info';
|
||||||
import type { Message } from '@libp2p/interface-pubsub';
|
import type { Message } from '@libp2p/interface-pubsub';
|
||||||
import { PeerId } from '@libp2p/interface-peer-id';
|
import type { PeerId } from '@libp2p/interface-peer-id';
|
||||||
import { multiaddr, Multiaddr } from '@multiformats/multiaddr';
|
import { multiaddr, Multiaddr } from '@multiformats/multiaddr';
|
||||||
import { floodsub } from '@libp2p/floodsub';
|
import { floodsub } from '@libp2p/floodsub';
|
||||||
import { pubsubPeerDiscovery } from '@libp2p/pubsub-peer-discovery';
|
import { pubsubPeerDiscovery } from '@libp2p/pubsub-peer-discovery';
|
||||||
@ -134,13 +134,13 @@ export class Peer {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Listen for peers connection
|
// Listen for peers connection
|
||||||
this._node.connectionManager.addEventListener('peer:connect', async (evt) => {
|
this._node.addEventListener('peer:connect', async (evt) => {
|
||||||
console.log('event peer:connect', evt);
|
console.log('event peer:connect', evt);
|
||||||
await this._handleConnect(evt.detail);
|
await this._handleConnect(evt.detail);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Listen for peers disconnecting
|
// Listen for peers disconnecting
|
||||||
this._node.connectionManager.addEventListener('peer:disconnect', (evt) => {
|
this._node.addEventListener('peer:disconnect', (evt) => {
|
||||||
console.log('event peer:disconnect', evt);
|
console.log('event peer:disconnect', evt);
|
||||||
this._handleDisconnect(evt.detail);
|
this._handleDisconnect(evt.detail);
|
||||||
});
|
});
|
||||||
@ -160,8 +160,8 @@ export class Peer {
|
|||||||
assert(this._node);
|
assert(this._node);
|
||||||
|
|
||||||
this._node.removeEventListener('peer:discovery');
|
this._node.removeEventListener('peer:discovery');
|
||||||
this._node.connectionManager.removeEventListener('peer:connect');
|
this._node.removeEventListener('peer:connect');
|
||||||
this._node.connectionManager.removeEventListener('peer:disconnect');
|
this._node.removeEventListener('peer:disconnect');
|
||||||
this._node.pubsub.removeEventListener('message');
|
this._node.pubsub.removeEventListener('message');
|
||||||
|
|
||||||
await this._node.unhandle(CHAT_PROTOCOL);
|
await this._node.unhandle(CHAT_PROTOCOL);
|
||||||
@ -272,7 +272,7 @@ export class Peer {
|
|||||||
_handleDiscovery (peer: PeerInfo): void {
|
_handleDiscovery (peer: PeerInfo): void {
|
||||||
// Check connected peers as they are discovered repeatedly.
|
// Check connected peers as they are discovered repeatedly.
|
||||||
if (![...this._remotePeerIds].some(remotePeerId => remotePeerId.toString() === peer.id.toString())) {
|
if (![...this._remotePeerIds].some(remotePeerId => remotePeerId.toString() === peer.id.toString())) {
|
||||||
console.log('Discovered peer multiaddrs', peer.multiaddrs.map(addr => addr.toString()));
|
console.log(`Discovered peer ${peer.id.toString()} with multiaddrs`, peer.multiaddrs.map(addr => addr.toString()));
|
||||||
this._connectPeer(peer);
|
this._connectPeer(peer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -359,30 +359,19 @@ export class Peer {
|
|||||||
assert(this._node);
|
assert(this._node);
|
||||||
|
|
||||||
// Dial them when we discover them
|
// Dial them when we discover them
|
||||||
// Attempt to dial all the multiaddrs of the discovered peer (to connect through relay)
|
const peerIdString = peer.id.toString();
|
||||||
for (const peerMultiaddr of peer.multiaddrs) {
|
try {
|
||||||
// Relay nodes sometimes give an additional multiaddr of signalling server (without peer id) in discovery
|
console.log(`Dialling peer ${peerIdString}`);
|
||||||
// Eg. /ip4/127.0.0.1/tcp/13579/wss/p2p-webrtc-star
|
// When dialling with peer id, all multiaddr(s) (direct/relayed) of the discovered peer are dialled in parallel
|
||||||
// Workaround to avoid dialling multiaddr(s) without peer id
|
const stream = await this._node.dialProtocol(peer.id, CHAT_PROTOCOL);
|
||||||
if (!peerMultiaddr.toString().includes('p2p/')) {
|
this._handleStream(peer.id, stream);
|
||||||
continue;
|
} catch (err: any) {
|
||||||
}
|
// Check if protocol negotiation failed (dial still succeeds)
|
||||||
|
// (happens in case of dialProtocol to relay nodes since they don't handle CHAT_PROTOCOL)
|
||||||
try {
|
if ((err as Error).message === ERR_PROTOCOL_SELECTION) {
|
||||||
console.log(`Dialling peer ${peer.id.toString()} using multiaddr ${peerMultiaddr.toString()}`);
|
console.log(`Protocol selection failed with peer ${peerIdString}`);
|
||||||
const stream = await this._node.dialProtocol(peerMultiaddr, CHAT_PROTOCOL);
|
} else {
|
||||||
|
console.log(`Could not dial ${peerIdString}`, err);
|
||||||
this._handleStream(peer.id, stream);
|
|
||||||
break;
|
|
||||||
} catch (err: any) {
|
|
||||||
// Check if protocol negotiation failed (dial still succeeds)
|
|
||||||
// (happens in case of dialProtocol to relay nodes since they don't handle CHAT_PROTOCOL)
|
|
||||||
if ((err as Error).message === ERR_PROTOCOL_SELECTION) {
|
|
||||||
console.log(`Protocol selection failed with peer ${peerMultiaddr}`);
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
console.log(`Could not dial ${peerMultiaddr.toString()}`, err);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -88,7 +88,7 @@ async function main (): Promise<void> {
|
|||||||
console.log();
|
console.log();
|
||||||
|
|
||||||
// Listen for peers connection
|
// Listen for peers connection
|
||||||
node.connectionManager.addEventListener('peer:connect', (evt) => {
|
node.addEventListener('peer:connect', (evt) => {
|
||||||
// console.log('event peer:connect', evt);
|
// console.log('event peer:connect', evt);
|
||||||
// Log connected peer
|
// Log connected peer
|
||||||
const connection: Connection = evt.detail;
|
const connection: Connection = evt.detail;
|
||||||
@ -96,7 +96,7 @@ async function main (): Promise<void> {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Listen for peers disconnecting
|
// Listen for peers disconnecting
|
||||||
node.connectionManager.addEventListener('peer:disconnect', (evt) => {
|
node.addEventListener('peer:disconnect', (evt) => {
|
||||||
// console.log('event peer:disconnect', evt);
|
// console.log('event peer:disconnect', evt);
|
||||||
// Log disconnected peer
|
// Log disconnected peer
|
||||||
const connection: Connection = evt.detail;
|
const connection: Connection = evt.detail;
|
||||||
|
Loading…
Reference in New Issue
Block a user