5个不稳定版本
0.3.0 | 2023年11月18日 |
---|---|
0.2.0 | 2023年5月5日 |
0.1.2 | 2023年5月4日 |
0.1.1 | 2023年4月22日 |
0.1.0 | 2023年4月13日 |
#566 in 异步
每月28次下载
在 yrs-webrtc 中使用
54KB
1K SLoC
wrtc
这是一个围绕流行的 webrtc 的Rust库包装器,专注于开发者体验。消息交换协议与NPM simple-peer 库兼容,并尽可能遵循惯用的Rust结构,例如使用futures Sink
/Stream
而不是回调。
API覆盖范围
当前状态仅覆盖数据通道。
- WebRTC
PeerConnection
- 数据通道
- 流
- 传输器
示例
#[tokio::main]
async fn main() -> Result<(), Error> {
// we use default options with "test" data channel to be initialized
let options = Options::with_channels(&["test"]);
// setup first peer as a connection initiator
let p1 = Arc::new(PeerConnection::start(true, options.clone()).await?);
// setup second peer as a connection acceptor
let p2 = Arc::new(PeerConnection::start(false, options).await?);
// WebRTC requires offer/answer roundtrip between peers to be send
// outside of the WebRTC protocol itself. It's usually done via another
// medium (HTTP, Web Sockets etc.). Here we just send them straight
// over the memory.
let _ = exchange(p1.clone(), p2.clone());
let _ = exchange(p2.clone(), p1.clone());
// wait for connection negotiation to complete
p1.connected().await?;
p2.connected().await?;
{
// Get data channel references on both ends. In `wrtc`,
// `DataChannel` implements both futures Sink and Stream.
let mut dc1 = p1.data_channels().next().await.unwrap();
let mut dc2 = p2.data_channels().next().await.unwrap();
// make sure that channels have been established
dc1.ready().await?;
dc2.ready().await?;
// send message from peer 1 to peer 2
let data: Bytes = "hello".into();
dc1.send(data.clone()).await?;
let msg = dc2.next().await.unwrap()?;
assert_eq!(msg.data, data);
}
// gracefully close peers
p1.close().await?;
p2.close().await?;
Ok(())
}
fn exchange(
from: Arc<PeerConnection>,
to: Arc<PeerConnection>,
) -> JoinHandle<Result<(), Error>> {
tokio::spawn(async move {
while let Some(signal) = from.listen().await {
to.signal(signal).await?;
}
Ok(())
})
}
依赖项
~31–45MB
~876K SLoC