mirror of
https://github.com/waku-org/examples.waku.org.git
synced 2025-02-22 10:48:22 +00:00
useNodePeers
to return granularity about peers discovered
This commit is contained in:
parent
6bd51cefcb
commit
e057e1b636
@ -1,11 +1,13 @@
|
|||||||
import React, { useEffect, useState } from "react";
|
import React, { useEffect, useState } from "react";
|
||||||
import { generate } from "server-name-generator";
|
import { generate } from "server-name-generator";
|
||||||
import { Message } from "./Message";
|
import { Message } from "./Message";
|
||||||
import type {
|
import type { Peer } from "@libp2p/interface-peer-store";
|
||||||
Peer,
|
import {
|
||||||
PeerProtocolsChangeData,
|
EPeersByDiscoveryEvents,
|
||||||
} from "@libp2p/interface-peer-store";
|
LightNode,
|
||||||
import type { LightNode, StoreQueryOptions, Waku } from "@waku/interfaces";
|
StoreQueryOptions,
|
||||||
|
Waku,
|
||||||
|
} from "@waku/interfaces";
|
||||||
import type { waku } from "@waku/sdk";
|
import type { waku } from "@waku/sdk";
|
||||||
|
|
||||||
import { useFilterMessages, useStoreMessages } from "@waku/react";
|
import { useFilterMessages, useStoreMessages } from "@waku/react";
|
||||||
@ -62,42 +64,52 @@ export const useMessages = (params: UseMessagesParams): UseMessagesResult => {
|
|||||||
// can be safely ignored
|
// can be safely ignored
|
||||||
// this is for experiments on waku side around new discovery options
|
// this is for experiments on waku side around new discovery options
|
||||||
export const useNodePeers = (node: undefined | LightNode) => {
|
export const useNodePeers = (node: undefined | LightNode) => {
|
||||||
const [bootstrapPeers, setBootstrapPeers] = useState(new Set<string>());
|
const [discoveredBootstrapPeers, setBootstrapPeers] = useState<Peer[]>([]);
|
||||||
const [peerExchangePeers, setPeerExchangePeers] = useState(new Set<string>());
|
const [connectedBootstrapPeers, setConnectedBootstrapPeers] = useState<
|
||||||
|
Peer[]
|
||||||
|
>([]);
|
||||||
|
const [discoveredPeerExchangePeers, setPeerExchangePeers] = useState<Peer[]>(
|
||||||
|
[]
|
||||||
|
);
|
||||||
|
const [connectedPeerExchangePeers, setConnectedPeerExchangePeers] = useState<
|
||||||
|
Peer[]
|
||||||
|
>([]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!node) return;
|
if (!node) return;
|
||||||
|
|
||||||
const listener = async (evt: any) => {
|
//TODO: remove any once @waku/sdk is updated
|
||||||
const { peerId } = evt.detail;
|
(node as any).connectionManager.addEventListener(
|
||||||
const tags = (await node.libp2p.peerStore.getTags(peerId)).map(
|
EPeersByDiscoveryEvents.PEER_DISCOVERY_BOOTSTRAP,
|
||||||
(t) => t.name
|
(event: CustomEvent<Peer>) => {
|
||||||
);
|
setBootstrapPeers((prev) => [...prev, event.detail]);
|
||||||
if (tags.includes("peer-exchange")) {
|
|
||||||
setPeerExchangePeers((peers) => new Set(peers).add(peerId.toString()));
|
|
||||||
} else {
|
|
||||||
setBootstrapPeers((peers) => new Set(peers).add(peerId.toString()));
|
|
||||||
}
|
}
|
||||||
};
|
);
|
||||||
|
(node as any).connectionManager.addEventListener(
|
||||||
// Update store peer when new peer connected & identified
|
EPeersByDiscoveryEvents.PEER_CONNECT_BOOTSTRAP,
|
||||||
node.libp2p.peerStore.addEventListener("change:protocols", listener);
|
(event: CustomEvent<Peer>) => {
|
||||||
return () => {
|
setConnectedBootstrapPeers((prev) => [...prev, event.detail]);
|
||||||
node.libp2p.peerStore.removeEventListener("change:protocols", listener);
|
}
|
||||||
};
|
);
|
||||||
|
(node as any).connectionManager.addEventListener(
|
||||||
|
EPeersByDiscoveryEvents.PEER_DISCOVERY_PEER_EXCHANGE,
|
||||||
|
(event: CustomEvent<Peer>) => {
|
||||||
|
setPeerExchangePeers((prev) => [...prev, event.detail]);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
(node as any).connectionManager.addEventListener(
|
||||||
|
EPeersByDiscoveryEvents.PEER_CONNECT_PEER_EXCHANGE,
|
||||||
|
(event: CustomEvent<Peer>) => {
|
||||||
|
setConnectedPeerExchangePeers((prev) => [...prev, event.detail]);
|
||||||
|
}
|
||||||
|
);
|
||||||
}, [node]);
|
}, [node]);
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
console.log("Bootstrap Peers:");
|
|
||||||
console.table(bootstrapPeers);
|
|
||||||
|
|
||||||
console.log("Peer Exchange Peers:");
|
|
||||||
console.table(peerExchangePeers);
|
|
||||||
}, [bootstrapPeers, peerExchangePeers]);
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
bootstrapPeers,
|
discoveredBootstrapPeers,
|
||||||
peerExchangePeers,
|
connectedBootstrapPeers,
|
||||||
|
discoveredPeerExchangePeers,
|
||||||
|
connectedPeerExchangePeers,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -128,7 +140,7 @@ export const usePeers = (params: UsePeersParams): UsePeersResults => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const listener = async (_event?: CustomEvent<PeerProtocolsChangeData>) => {
|
const listener = async () => {
|
||||||
const peers = await Promise.all([
|
const peers = await Promise.all([
|
||||||
handleCatch(node?.store?.peers()),
|
handleCatch(node?.store?.peers()),
|
||||||
handleCatch(node?.filter?.peers()),
|
handleCatch(node?.filter?.peers()),
|
||||||
@ -143,9 +155,9 @@ export const usePeers = (params: UsePeersParams): UsePeersResults => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
listener(); // populate peers before event is invoked
|
listener(); // populate peers before event is invoked
|
||||||
node.libp2p.peerStore.addEventListener("change:protocols", listener);
|
node.libp2p.addEventListener("peer:update", listener);
|
||||||
return () => {
|
return () => {
|
||||||
node.libp2p.peerStore.removeEventListener("change:protocols", listener);
|
node.libp2p.removeEventListener("peer:update", listener);
|
||||||
};
|
};
|
||||||
}, [node, setPeers]);
|
}, [node, setPeers]);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user