Async-friendly WebRTC implementation in Rust
Sponsored with π by
Silver Sponsors:
Bronze Sponsors:
AdrianEddy
WebRTC.rs is an async-friendly WebRTC implementation in Rust, originally inspired by and largely rewriting the Pion stack. The project is currently evolving into a clean, ergonomic, runtime-agnostic implementation that works with any async runtime (Tokio, async-std, smol, embassy).
Architecture:
- rtc: Sans-I/O protocol core with complete WebRTC stack (95%+ W3C API compliance)
- webrtc (this crate): Async-friendly API with runtime abstraction layer
π Learn more: Read our architecture blog post for design details and roadmap.
v0.17.x is the final feature release of the Tokio-coupled async WebRTC implementation.
- v0.17.x branch: Receives bug fixes only (no new features). Use this for Tokio-based production applications.
- Master branch: Under active development for v0.20.0 with new Sans-I/O architecture and runtime abstraction.
The new architecture will address critical issues in v0.17.x:
- β Callback hell and Arc explosion
- β Resources leak in callback
- β Tight Tokio coupling (cannot use async-std, smol, embassy)
v0.20.0+ will provide:
β Runtime Independence
- Support for Tokio, async-std, smol, embassy via Quinn-style runtime abstraction
- Feature flags:
runtime-tokio(default),runtime-async-std,runtime-smol,runtime-embassy
β Clean Event Handling
- Trait-based event handlers with native
async fn in trait - No more callback Arc cloning or
Box::new(move |...| Box::pin(async move { ... })) - Centralized state management with
&mut self
β Sans-I/O Foundation
- Protocol logic completely separate from I/O (via rtc crate)
- Deterministic testing without real network I/O
- Zero-cost abstractions
We're actively designing v0.20.0+ and welcome your input:
- Review the architecture blog post
- Join discussions on GitHub Issues
- Chat with us on Discord
For production use: Stick with v0.17.x branch until v0.20.0+ is stable.
For early adopters: Follow master branch development and provide feedback!
# Update rtc submodule first
git submodule update --init --recursive
# Build the library
cargo build
# Run tests
cargo test
# Build documentation
cargo doc --open
# Run examples
cargo run --example data-channelsDual licensing under both MIT and Apache-2.0 is the currently accepted standard by the Rust language community and has been used for both the compiler and many public libraries since ( see https://doc.rust-lang.org/1.6.0/complement-project-faq.html#why-dual-mitasl2-license). In order to match the community standards, webrtc-rs is using the dual MIT+Apache-2.0 license.
Contributors or Pull Requests are Welcome!!!
