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

Download history 978/week @ 2024-04-19 684/week @ 2024-04-26 860/week @ 2024-05-03 999/week @ 2024-05-10 1154/week @ 2024-05-17 1100/week @ 2024-05-24 1029/week @ 2024-05-31 979/week @ 2024-06-07 799/week @ 2024-06-14 721/week @ 2024-06-21 649/week @ 2024-06-28 628/week @ 2024-07-05 621/week @ 2024-07-12 847/week @ 2024-07-19 662/week @ 2024-07-26 457/week @ 2024-08-02

每月 2,604 次下载

EUPL-1.2

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 插件

默认情况下,echotestvideoroom 已启用。

依赖关系

~12–23MB
~360K SLoC