cipher/public
maverick 67367d5e83 Add WebRTC E2E voice/video calling (1:1)
- call.js: CallManager — RTCPeerConnection lifecycle, offer/answer/ICE/bye state
  machine, mute/camera toggles, hangup. STUN (Google + Cloudflare) for NAT.
- Signaling (SDP + ICE) rides the existing E2E message relay as {k:"call"}
  payloads — never seen by the server in clear. Media is P2P, encrypted by
  WebRTC's mandatory DTLS-SRTP, so audio/video is end-to-end and never hits R2.
- app.js: call buttons (📞/🎥) in DM headers, incoming/outgoing/connected call
  overlay with video tiles + PiP, mute/camera/hangup, ring pulse, duration timer.
- Verified signaling state machine (mocked WebRTC): both sides reach 'connected'.
  Group calls not supported yet (needs SFU). SW cache v5->v6.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-22 13:21:52 +10:00
..
icons Cipher: E2E encrypted messenger scaffold (Signal Protocol + Cloudflare) 2026-07-22 01:56:59 +10:00
js Add WebRTC E2E voice/video calling (1:1) 2026-07-22 13:21:52 +10:00
index.html Add WebRTC E2E voice/video calling (1:1) 2026-07-22 13:21:52 +10:00
manifest.webmanifest Cipher: E2E encrypted messenger scaffold (Signal Protocol + Cloudflare) 2026-07-22 01:56:59 +10:00
sw.js Add WebRTC E2E voice/video calling (1:1) 2026-07-22 13:21:52 +10:00