From cde23d9ec39aec644e8b9937407f314cfe563aa5 Mon Sep 17 00:00:00 2001 From: danisharora099 Date: Wed, 15 Mar 2023 11:45:57 +0530 Subject: [PATCH] check peer:disconnect vs libp2pPing --- examples/web-chat/src/Room.tsx | 35 ++++++++++++++++++++++++++++++++++ examples/web-chat/src/hooks.ts | 9 +++++---- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/examples/web-chat/src/Room.tsx b/examples/web-chat/src/Room.tsx index 432f567..1bcb945 100644 --- a/examples/web-chat/src/Room.tsx +++ b/examples/web-chat/src/Room.tsx @@ -6,6 +6,8 @@ import { TitleBar } from "@livechat/ui-kit"; import { Message } from "./Message"; import { ChatMessage } from "./chat_message"; import { useNodePeers } from "./hooks"; +import { useEffect, useState } from "react"; +import type { PeerId } from "@libp2p/interface-peer-id"; interface Props { messages: Message[]; @@ -18,9 +20,42 @@ export default function Room(props: Props) { const { encoder } = useContentPair(); const { push: onPush } = useLightPush({ node, encoder }); + const [started, setStarted] = useState(false); + const { bootstrapPeers, peerExchangePeers } = useNodePeers(node); const { storePeers, filterPeers, lightPushPeers } = usePeers({ node }); + const ping = (node: LightNode, peerId: PeerId) => { + node.libp2p + // @ts-ignore + .ping(peerId) + .then((res) => { + console.log(`Ping: ${res}`); + }) + .catch((err) => { + console.log(`Ping error: ${err}`); + }); + }; + + useEffect(() => { + if (!node || (!bootstrapPeers && !peerExchangePeers) || started) return; + + const peerId = Array.from(bootstrapPeers)[0]; + if (!peerId) return; + + // pings work well and can be interpreted as a good source of checking connectivity with a peer + // however, the peer:disconnect event is not triggered when we manually go offline + + node.libp2p.connectionManager.addEventListener("peer:disconnect", (cb) => { + console.log("peer:disconnect", cb); + }); + setInterval(() => { + ping(node, peerId); + }, 1000); + + setStarted(true); + }, [node, bootstrapPeers, peerExchangePeers, started]); + const onSend = async (text: string) => { if (!onPush || !text) { return; diff --git a/examples/web-chat/src/hooks.ts b/examples/web-chat/src/hooks.ts index bc9d8db..933bcee 100644 --- a/examples/web-chat/src/hooks.ts +++ b/examples/web-chat/src/hooks.ts @@ -3,6 +3,7 @@ import { generate } from "server-name-generator"; import { Message } from "./Message"; import { Decoder } from "@waku/core/lib/message/version_0"; import { LightNode, StoreQueryOptions } from "@waku/interfaces"; +import type { PeerId } from "@libp2p/interface-peer-id"; import { useFilterMessages, useStoreMessages } from "@waku/react"; @@ -58,8 +59,8 @@ export const useMessages = (params: UseMessagesParams): UseMessagesResult => { // can be safely ignored // this is for experiments on waku side around new discovery options export const useNodePeers = (node: undefined | LightNode) => { - const [bootstrapPeers, setBootstrapPeers] = useState(new Set()); - const [peerExchangePeers, setPeerExchangePeers] = useState(new Set()); + const [bootstrapPeers, setBootstrapPeers] = useState(new Set()); + const [peerExchangePeers, setPeerExchangePeers] = useState(new Set()); useEffect(() => { if (!node) return; @@ -71,9 +72,9 @@ export const useNodePeers = (node: undefined | LightNode) => { (t) => t.name ); if (tags.includes("peer-exchange")) { - setPeerExchangePeers((peers) => new Set(peers).add(peerId.toString())); + setPeerExchangePeers((peers) => new Set(peers).add(peerId)); } else { - setBootstrapPeers((peers) => new Set(peers).add(peerId.toString())); + setBootstrapPeers((peers) => new Set(peers).add(peerId)); } }); }, [node]);