import type { LightNode } from "@waku/interfaces"; import ChatList from "./ChatList"; import MessageInput from "./MessageInput"; import { useWaku, useContentPair, useLightPush } from "@waku/react"; import { TitleBar } from "@livechat/ui-kit"; import { Message } from "./Message"; import { ChatMessage } from "./chat_message"; import { useEffect, useState } from "react"; interface Props { messages: Message[]; commandHandler: (cmd: string) => void; nick: string; } export default function Room(props: Props) { const { node } = useWaku(); const { encoder } = useContentPair(); const { push: onPush } = useLightPush({ node, encoder }); const onSend = async (text: string) => { if (!onPush) { return; } if (text.startsWith("/")) { props.commandHandler(text); } else { const timestamp = new Date(); const chatMessage = ChatMessage.fromUtf8String( timestamp, props.nick, text ); const payload = chatMessage.encode(); await onPush({ payload, timestamp }); } }; const [storePeers, setStorePeers] = useState(0); const [filterPeers, setFilterPeers] = useState(0); const [lightPushPeers, setLightPushPeers] = useState(0); const [bootstrapPeers, setBootstrapPeers] = useState(new Set()); const [peerExchangePeers, setPeerExchangePeers] = useState(new Set()); useEffect(() => { if (!node) return; // Update store peer when new peer connected & identified node.libp2p.peerStore.addEventListener("change:protocols", async (evt) => { const { peerId } = evt.detail; const tags = (await node.libp2p.peerStore.getTags(peerId)).map( (t) => t.name ); if (tags.includes("peer-exchange")) { setPeerExchangePeers((peers) => new Set(peers).add(peerId.toString())); } else { setBootstrapPeers((peers) => new Set(peers).add(peerId.toString())); } const storePeers = await node.store.peers(); setStorePeers(storePeers.length); const filterPeers = await node.filter.peers(); setFilterPeers(filterPeers.length); const lightPushPeers = await node.lightPush.peers(); setLightPushPeers(lightPushPeers.length); }); }, [node]); useEffect(() => { console.log("Bootstrap Peers:"); console.table(bootstrapPeers); console.log("Peer Exchange Peers:"); console.table(peerExchangePeers); }, [bootstrapPeers, peerExchangePeers]); return (
); }