5 个版本 (3 个破坏性版本)
0.3.1 | 2024年5月27日 |
---|---|
0.3.0 | 2024年4月22日 |
0.2.0 | 2024年3月25日 |
0.1.0 | 2024年3月19日 |
0.0.0 | 2023年2月8日 |
#58 in WebSocket
每月 2,604 次下载
160KB
4K SLoC
此 crate 封装了 Janus WebSocket 异步 API,以提供更多或更少的惯用 Rust API。
为此,客户端内部根据传入的响应及其相应的交易标识符解析 futures。这是隐藏的,以提供一个您可以简单调用函数并 .await 响应的 API。因此,此代码需要在异步/.await 运行时中运行。目前我们仅支持 tokio 运行时。
示例
# use opentalk_janus_client::types::outgoing;
# use opentalk_janus_client::{JanusPlugin, Client, RabbitMqConfig, ClientId};
# use tokio::sync::{broadcast,mpsc};
# use std::sync::Arc;
# tokio_test::block_on(async {
let (sink, _) = mpsc::channel(1);
let connection = lapin::Connection::connect("amqp://janus-backend:5672", lapin::ConnectionProperties::default()).await.unwrap();
let channel = connection.create_channel().await.unwrap();
let config = RabbitMqConfig::new_from_channel(channel, "janus-gateway".into(), "to-janus".into(), "from-janus".into(), "opentalk-signaling".into());
let client = Client::new(config, ClientId("".into()), sink).await.unwrap();
let session = client.create_session().await.unwrap();
let echo_handle = session
.attach_to_plugin(JanusPlugin::Echotest, None)
.await
.unwrap();
let echo = echo_handle
.send(outgoing::EchoPluginUnnamed {
audio: Some(true),
..Default::default()
})
.await.unwrap();
println!("Echo {:?}, JSEP: {:?}", &echo.0, &echo.1);
# });
此外,您可以封装 API 并在此基础上构建,类似于 spreed
pub struct SubscriberClient(Handle);
impl SubscriberClient {
/// Joins a Room
pub async fn join_room(&self, candidate: String ) {
let room_id: RoomId = 2.into();
let feed_id: FeedId = 1.into();
let request = VideoRoomPluginJoinSubscriber::new(room_id, feed_id);
self.0.send(request).await;
}
}
pub struct PublisherClient(Handle);
impl PublisherClient {
/// Sends the candidate SDP string to Janus
pub async fn send_candidates(&self, candidate: String ) {
self.0.trickle(TrickleMessage::Candidate(TrickleCandidate{
candidate: "candidate:..".to_owned(),
sdp_m_line_index: 1
})).await;
}
}
tokio_test::block_on(async {
let (sink, _) = mpsc::channel(1);
let connection = lapin::Connection::connect("amqp://janus-backend:5672", lapin::ConnectionProperties::default()).await.unwrap();
let channel = connection.create_channel().await.unwrap();
let config = RabbitMqConfig::new_from_channel(channel, "janus-gateway".into(), "to-janus".into(), "from-janus".into(), "opentalk-signaling".into());
let client = opentalk_janus_client::Client::new(config, ClientId("".into()), sink).await.unwrap();
let session = client.create_session().await.unwrap();
let echo_handle = session
.attach_to_plugin(JanusPlugin::VideoRoom, None)
.await
.unwrap();
let publisher = PublisherClient(echo_handle);
let echo_handle = session
.attach_to_plugin(JanusPlugin::VideoRoom, None)
.await
.unwrap();
let subscriber = SubscriberClient(echo_handle);
});
}
功能
特定的插件隐藏在功能标志后面。支持的 Janus 插件可以通过以下 cargo 功能启用
echotest
用于 EchoTest Janus 插件videoroom
用于 VideoRoom Janus 插件
默认情况下,echotest
和 videoroom
已启用。
依赖关系
~12–23MB
~360K SLoC