From c32769a85922b9e1f47efe3c9742f88ededc5683 Mon Sep 17 00:00:00 2001 From: Sasha Date: Thu, 23 Feb 2023 20:08:29 +0100 Subject: [PATCH] update types, add usePeers, add prettierignore --- .prettierignore | 1 + src/index.ts | 1 + src/useLightPush.ts | 6 ++-- src/usePeers.ts | 71 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 75 insertions(+), 4 deletions(-) create mode 100644 .prettierignore create mode 100644 src/usePeers.ts diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..1521c8b --- /dev/null +++ b/.prettierignore @@ -0,0 +1 @@ +dist diff --git a/src/index.ts b/src/index.ts index 9c7c3ec..26da696 100644 --- a/src/index.ts +++ b/src/index.ts @@ -8,6 +8,7 @@ export { } from "./useCreateWaku"; export { useFilterMessages } from "./useFilterMessages"; export { useLightPush } from "./useLightPush"; +export { usePeers } from "./usePeers"; export { useStoreMessages } from "./useStoreMessages"; export { FullNodeProvider, diff --git a/src/useLightPush.ts b/src/useLightPush.ts index 49599f1..56e95c5 100644 --- a/src/useLightPush.ts +++ b/src/useLightPush.ts @@ -23,7 +23,7 @@ type PushFn = ( ) => Promise; type UseLightPushResult = { - push: undefined | PushFn; + push?: undefined | PushFn; }; /** @@ -45,9 +45,7 @@ export const useLightPush = ( ); if (!node && !encoder) { - return { - push: undefined, - }; + return {}; } return { diff --git a/src/usePeers.ts b/src/usePeers.ts new file mode 100644 index 0000000..79da3ac --- /dev/null +++ b/src/usePeers.ts @@ -0,0 +1,71 @@ +import React from "react"; +import type { + Peer, + PeerProtocolsChangeData, +} from "@libp2p/interface-peer-store"; +import type { Waku } from "@waku/interfaces"; + +type UsePeersParams = { + node: undefined | Waku; +}; + +type UsePeersResults = { + storePeers?: undefined | Peer[]; + filterPeers?: undefined | Peer[]; + lightPushPeers?: undefined | Peer[]; + peerExchangePeers?: undefined | Peer[]; +}; + +/** + * Hook returns map of peers for different protocols. + * If protocol is not implemented on the node peers are undefined. + * @example + * const { storePeers } = usePeers({ node }); + * @param {Waku} params.node - Waku node, if not set then no peers will be returned + * @returns {Object} map of peers, if some of the protocols is not implemented then undefined + */ +export const usePeers = (params: UsePeersParams): UsePeersResults => { + const { node } = params; + const [peers, setPeers] = React.useState({}); + + React.useEffect(() => { + if (!node) { + return; + } + + const listener = async (_event: CustomEvent) => { + const peers = await Promise.all([ + handleCatch(node?.store?.peers()), + handleCatch(node?.filter?.peers()), + handleCatch(node?.lightPush?.peers()), + handleCatch(node?.peerExchange?.peers()), + ]); + + setPeers({ + storePeers: peers[0], + filterPeers: peers[1], + lightPushPeers: peers[2], + peerExchangePeers: peers[3], + }); + }; + + node.libp2p.peerStore.addEventListener("change:protocols", listener); + + return () => { + node.libp2p.peerStore.removeEventListener("change:protocols", listener); + }; + }, [node, setPeers]); + + return peers; +}; + +// TODO: handle error in case fetching of peers failed +function handleCatch(promise?: Promise): Promise { + if (!promise) { + return Promise.resolve(undefined); + } + + return promise.catch((_) => { + return undefined; + }); +}