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 网络编程
201 个月下载量
在 3 个包(2个直接) 中使用
4.5MB
115K SLoC
datachannel-rs ──
Rust对libdatachannel的封装,这是一个C++中的独立WebRTC数据通道实现。
用法
此包提供两个必须由最终用户实现的特质,分别是DataChannelHandler
和PeerConnectionHandler
,分别定义了RtcPeerConnection
和RtcDataChannel
结构体的所有回调。
上述特质定义如下
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