Real-time audio streaming engine with MQTT pub/sub and P2P modes.
┌─────────────┐ MQTT (QoS 0) ┌──────────────┐
│ Client A │◄─────────────────────►│ Agora Broker │
│ (capture) │ PCM/Opus frames │ (rumqttd) │
└─────────────┘ └──────┬───────┘
│
┌─────────────┐ MQTT (QoS 0) │
│ Client B │◄──────────────────────────────┘
│ (playback) │
└─────────────┘
── OR ──
┌─────────────┐ QUIC (direct) ┌─────────────┐
│ Client A │◄────────────────────►│ Client B │
│ │ P2P audio stream │ │
└─────────────┘ └─────────────┘
▲ ▲
│ Signaling only │
└────────── Broker ──────────────────┘
- agora-protocol — Shared wire types (PCM/Opus frames, signaling, room events). MessagePack serialized.
- agora-broker — MQTT broker (rumqttd) with room management. Topics:
agora/{room}/audio/{peer},agora/{room}/events. - agora-p2p — QUIC-based peer-to-peer connections via Quinn. Self-signed certs, NAT traversal.
- agora-client — Client library with jitter buffer, audio mixer, MQTT transport.
- agora-cli — CLI:
agora join,agora serve,agora create-room,agora list-rooms,agora bench.
# Run the broker
cargo run --bin agora -- serve
# Join a room (in another terminal)
cargo run --bin agora -- join --room my-room
# Run tests
make test
# Run benchmarks
make bench
# Deploy to K8s
make k8s-deployCentral broker relays PCM audio chunks. Clients subscribe to room topics, publish mic audio as PCM frames. QoS 0 for lowest latency.
Direct peer-to-peer streaming. Broker handles signaling/discovery only. Uses Quinn (QUIC) with self-signed certificates. Falls back to MQTT relay if hole-punching fails.
All messages use MessagePack (rmp-serde) for compact, low-latency serialization.
| Frame Type | Typical Size (20ms @ 48kHz mono) |
|---|---|
| PCM (f32) | ~3.8 KB |
| Opus | ~60-120 bytes |
cargo build --workspace
cargo clippy --workspace -- -D warnings
cargo test --workspace
cargo fmt --allMIT