#web-rtc #p2p #wrapper #define

datachannel

Rust对libdatachannel的封装

42个版本

0.13.1 2024年7月30日
0.12.1 2024年3月17日
0.11.2 2023年12月21日
0.11.0 2023年9月23日
0.1.1 2020年7月25日

#755 in 网络编程

Download history 181/week @ 2024-04-26 76/week @ 2024-05-03 83/week @ 2024-05-10 77/week @ 2024-05-17 35/week @ 2024-05-24 82/week @ 2024-05-31 107/week @ 2024-06-07 15/week @ 2024-06-14 6/week @ 2024-06-21 11/week @ 2024-06-28 9/week @ 2024-07-12 6/week @ 2024-07-19 135/week @ 2024-07-26 37/week @ 2024-08-02 17/week @ 2024-08-09

201 个月下载量
3 个包(2个直接) 中使用

MPL-2.0 许可证

4.5MB
115K SLoC

C 97K SLoC // 0.2% comments C++ 16K SLoC // 0.1% comments Rust 1.5K SLoC // 0.0% comments Shell 265 SLoC // 0.3% comments Python 159 SLoC // 0.1% comments Automake 145 SLoC // 0.4% comments Objective-C++ 21 SLoC // 0.1% comments INI 13 SLoC // 0.4% comments

datachannel-rs ── 最新 doc

Rust对libdatachannel的封装,这是一个C++中的独立WebRTC数据通道实现。

用法

此包提供两个必须由最终用户实现的特质,分别是DataChannelHandlerPeerConnectionHandler,分别定义了RtcPeerConnectionRtcDataChannel结构体的所有回调。

上述特质定义如下

pub trait DataChannelHandler {
    fn on_open(&mut self) {}
    fn on_closed(&mut self) {}
    fn on_error(&mut self, err: &str) {}
    fn on_message(&mut self, msg: &[u8]) {}
    fn on_buffered_amount_low(&mut self) {}
    fn on_available(&mut self) {}
}

pub trait PeerConnectionHandler {
    type DCH;

    fn data_channel_handler(&mut self, info: DataChannelInfo) -> Self::DCH;

    fn on_description(&mut self, sess_desc: SessionDescription) {}
    fn on_candidate(&mut self, cand: IceCandidate) {}
    fn on_connection_state_change(&mut self, state: ConnectionState) {}
    fn on_gathering_state_change(&mut self, state: GatheringState) {}
    fn on_data_channel(&mut self, data_channel: Box<RtcDataChannel<Self::DCH>>) {}
}

请注意,所有on_*方法都有一个默认的空操作实现。

主结构体RtcPeerconnection接受一个RtcConfig(定义ICE服务器)和一个PeerConnectionHandler实例。

以下是基本的工作流程

use datachannel::{DataChannelHandler, DataChannelInfo, PeerConnectionHandler, RtcConfig, RtcPeerConnection};

struct MyChannel;

impl DataChannelHandler for MyChannel {
    fn on_open(&mut self) {
        // TODO: notify that the data channel is ready (optional)
    }

    fn on_message(&mut self, msg: &[u8]) {
        // TODO: process the received message
    }
}

struct MyConnection;

impl PeerConnectionHandler for MyConnection {
    type DCH = MyChannel;

    /// Used to create the `RtcDataChannel` received through `on_data_channel`.
    fn data_channel_handler(&mut self, _info: DataChannelInfo) -> Self::DCH {
        MyChannel
    }

    fn on_data_channel(&mut self, mut dc: Box<RtcDataChannel<Self::DCH>>) {
        // TODO: store `dc` to keep receiving its messages (otherwise it will be dropped)
    }
}

let ice_servers = vec!["stun:stun.l.google.com:19302"];
let conf = RtcConfig::new(&ice_servers);

let mut pc = RtcPeerConnection::new(&conf, MyConnection)?;

let mut dc = pc.create_data_channel("test-dc", MyChannel)?;
// TODO: exchange `SessionDescription` and `IceCandidate` with remote peer
// TODO: wait for `dc` to be opened (should be signaled through `on_open`)
// ...
// Then send a message
dc.send("Hello Peer!".as_bytes())?;

完整的实现示例可以在测试中找到。

有关基于异步实现的更多信息,请参阅async-datachannel

Cargo功能

  • log (默认) 启用由log包提供的日志记录(与tracing互斥)。
  • tracing 启用由tracing包提供的日志记录(与log互斥)。
  • vendored 将libdatachannel及其依赖项静态构建并捆绑到构建中(包括OpenSSL)。
  • media 通过libdatachannel启用媒体支持。

构建

请注意,需要CMake才能通过datachannel-sys编译libdatachannel

Apple macOS

如果您的构建因与OpenSSL相关的错误而失败,您可能需要设置以下环境变量。

export OPENSSL_ROOT_DIR=/usr/local/opt/openssl@3
export OPENSSL_LIBRARIES=/usr/local/opt/openssl@3/lib

使用您本地 OpenSSL 安装路径。

Ubuntu

所需依赖

# Needed to compile libdatachannel
sudo apt install build-essential cmake pkg-config libssl-dev clang

依赖项

~3–11MB
~162K SLoC