#data-channel #web-rtc #p2p #signaling-server #send-receive

wasm-peers

使用 Rust 编写并编译为 WASM 的 WebRTC DataChannels 点对点连接的易于使用的包装器

5 个版本

0.4.1 2022 年 10 月 3 日
0.4.0 2022 年 3 月 2 日
0.3.2 2022 年 2 月 7 日
0.3.1 2022 年 2 月 7 日
0.3.0 2022 年 2 月 7 日

373WebAssembly

MIT/Apache

81KB
1K SLoC

wasm-peers logo

wasm-peers

crates.io docs.rs CI coverage status APACHE licensed MIT licensed pre-commit

此 crate 为 WebRTC 和 DataChannels 提供了一个易于使用的包装器,用于点对点连接。

概述

正如著名的 agar.io 创建者所说 WebRTC 是很难的。这个库旨在帮助,通过抽象所有设置,并提供一种简单的方式来通过数据通道发送和接收消息。

这就像提供 配套 crate 中信号服务器实例的地址并指定两个回调一样简单。一个指定当连接建立时应该发生什么,另一个指定当接收到消息时应该发生什么。之后,您可以发送和接收消息,而无需担心实现细节。

库包含三种网络拓扑,one-to-one,在两个对等体之间创建等价连接,one-to-many,指定一个主机和任意数量的客户端,以及 many-to-many,为每对对等体创建连接,并允许向其中的任何一个发送消息。

要检查使用此库构建的“生产就绪”应用程序,请查看 Live DocumentFootballers

示例

此示例展示了两个对等体相互发送 pingpong 消息。

use wasm_peers::ConnectionType;
use wasm_peers::one_to_one::NetworkManager;
use web_sys::console;

// there must be a signaling server from accompanying crate running on this port
const SIGNALING_SERVER_URL: &str = "ws://0.0.0.0:9001/one-to-one";

fn main() {
    // there must be some mechanism for exchanging session ids between peers
    let session_id = SessionId::new("some-session-id".to_string());
    let mut peer1 = NetworkManager::new(
        SIGNALING_SERVER_URL,
        session_id.clone(),
        ConnectionType::Stun,
    ).unwrap();

    let peer1_clone = peer1.clone();
    let peer1_on_open = move || peer1_clone.send_message("ping!").unwrap();
    let peer1_on_message = {
        move |message| {
            console::log_1(&format!("peer1 received message: {}", message).into());
        }
    };
    peer1.start(peer1_on_open, peer1_on_message).unwrap();

    let mut peer2 = NetworkManager::new(
        SIGNALING_SERVER_URL,
        session_id,
        ConnectionType::Stun,
    ).unwrap();
    let peer2_on_open = || { /* do nothing */ };
    let peer2_clone = peer2.clone();
    let peer2_on_message = {
        let peer2_received_message = peer2_received_message.clone();
        move |message| {
            console::log_1(&format!("peer2 received message: {}", message).into());
            peer2_clone.send_message("pong!").unwrap();
        }
    };
    peer2.start(peer2_on_open, peer2_on_message).unwrap();
}

要查看其他拓扑的示例,请参阅 文档

路线图

  • 添加测试
  • 改进错误处理
  • 引入使用 futures 的替代 API
  • 添加通过已建立的连接传递视频/音频流的可能性

版本历史

  • 0.4
    • MiniServer 回调现在不接受 UserId 参数(它总是主机)
    • 修复文档测试,以便它们可以编译
  • 0.3
    • 首次公开发布

类似项目

许可协议

本项目许可协议为以下之一

贡献

除非你明确声明,否则根据Apache-2.0许可证定义的,你有意提交以包含在作品中的任何贡献,都应双许可如上,不附加任何额外条款或条件。

作者

塔莫什·卡罗夫斯基 LinkedIn

致谢

这些项目帮助我掌握Rust中的WebRTC

此外,特别感谢与我一起完成本科论文的伙伴们。

依赖项

~8–10MB
~196K SLoC