feat(calls): WebRTC voice/video calls and enclave voice channels #96
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/voice-and-video-calls"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Real-time calling for lets-chat, signaled over the existing chat WebSocket hub (no media server).
is_voiceroom flag, orthogonal to public/private visibility. Full-mesh multi-party (no SFU, so practically ~4-6 per channel). Newest joiner offers to everyone present; peers removed only by the explicitVoiceLeftevent so one leaver does not cascade.LETS_CHAT_ICE_SERVERS; avatar fallback when a participant has no camera on;/avatars/{id}now always resolves (generated default SVG for users with no custom avatar).messages.is_system(0023) for system notices,rooms.is_voice(0024) for voice channels. Stale hardcoded migration lists in affected test files brought current.Test plan
just test(full suite was green - 446 passing - before the final avatar/UI tweaks;cargo checkpasses after)Note: WebRTC paths could not be exercised in a browser in the dev env (container OOM + multi-party needs several clients). Logic verified by code/spec review.
🤖 Generated with Claude Code
Adds real-time calling, signaled over the existing chat WebSocket hub (no media server). 1:1 DM calls: voice and video are one call type that differs only in whether the camera starts on; either peer can toggle their camera at any time. Setup has the caller as sole offerer (no glare); mid-call renegotiation uses perfect negotiation. Mutual-dial glare is resolved deterministically by user id. A "started a call" system message is posted into the DM. Enclave voice channels: a new `is_voice` room flag (orthogonal to public/private visibility) plus a full-mesh multi-party page. The newest joiner offers to everyone already present; participants are removed only by the explicit VoiceLeft event so one person leaving does not cascade. Shared: per-user ICE config via LETS_CHAT_ICE_SERVERS, avatar fallback when a participant has no camera on, and `/avatars/{id}` now always resolves by serving a generated default SVG. Schema: `messages.is_system` (0023) for system notices, `rooms.is_voice` (0024) for voice channels. Stale hardcoded migration lists in the affected test files were brought current. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>