Voice
Voice channels coordinate who is present and how peers should connect; the server does not carry media. A joining client supplies a peer_id. In-memory state tracks each user and mute flag, while channel serialization exposes a username/muted summary.
Join, leave, mute, and unmute changes are broadcast to viewers of the channel. Disconnect cleanup removes the connection from voice state. Because this state is ephemeral, a process restart clears active voice sessions and clients must rejoin.
Actual audio capture, WebRTC/media negotiation, device management, and reconnection are client responsibilities.
