#web-rtc #developer #experience #peer-connection #future #channel #stream

wrtc

webrtc-rs库的包装器,专注于开发者体验

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 中使用

MIT 许可证

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