import { Badge, Box, Drawer, DrawerBody, DrawerCloseButton, DrawerContent, DrawerHeader, DrawerOverlay, Heading, HStack, Select, Stack, Table, Tbody, Td, Text, Tr, useDisclosure, useToast, } from '@chakra-ui/react'; import { RemoteTrackPublication, Room, RoomEvent } from 'livekit-client'; import { useEffect, useState } from 'react'; import tinykeys from 'tinykeys'; interface DebugProps { room: Room; } export const DebugOverlay = ({ room }: DebugProps) => { const { isOpen, onOpen, onClose } = useDisclosure(); const [, setRender] = useState({}); const toast = useToast(); useEffect(() => { if (window) { const unsubscribe = tinykeys(window, { 'Shift+D': () => { if (isOpen) { onClose(); } else { onOpen(); } }, }); // timer to re-render const interval = setInterval(() => { setRender({}); }, 1000); return () => { unsubscribe(); clearInterval(interval); }; } }, [isOpen]); if (typeof window === 'undefined' || !isOpen) { return null; } const handleSimulate = (event: React.ChangeEvent) => { const { value } = event.target; if (value == '') { return; } onClose(); event.target.value = ''; let isReconnect = false; switch (value) { case 'signal-reconnect': case 'migration': isReconnect = true; // fall through default: room.simulateScenario(value); } if (isReconnect && room.engine) { toast({ title: 'Reconnecting...', description: `current server: ${room.engine.connectedServerAddress}`, status: 'info', duration: 3000, }); room.once(RoomEvent.Reconnected, () => { toast({ title: 'Reconnected', description: `reconnected server: ${room.engine.connectedServerAddress}`, status: 'success', duration: 3000, }); }); } }; const lp = room.localParticipant; const roomInfo = (
Room {room.name}  {room.sid}
Participant {lp.identity}  {lp.sid}
Simulate
); return ( Debug {roomInfo} Published Tracks {Array.from(lp.tracks.values()).map((t) => ( <> {t.source.toString()}  {t.trackSid}
Kind {t.kind}  {t.kind === 'video' && ( {t.track?.dimensions?.width}x{t.track?.dimensions?.height} )}
Bitrate {Math.ceil(t.track!.currentBitrate / 1000)} kbps
))}
{Array.from(room.participants.values()).map((p) => ( {p.identity} {Array.from(p.tracks.values()).map((t) => ( <> {t.source.toString()}  {t.trackSid} {t.track && ( )}
Kind {t.kind}  {t.kind === 'video' && ( {t.dimensions?.width}x{t.dimensions?.height} )}
Status {trackStatus(t)}
Bitrate {Math.ceil(t.track.currentBitrate / 1000)} kbps
))}
))}
); }; function trackStatus(t: RemoteTrackPublication): string { if (t.isSubscribed) { return t.isEnabled ? 'enabled' : 'disabled'; } else { return 'unsubscribed'; } } export default DebugOverlay;