diff --git a/crates/live_kit_client2/examples/test_app.rs b/crates/live_kit_client2/examples/test_app.rs index 2147f6ab8c..ad10a4c95d 100644 --- a/crates/live_kit_client2/examples/test_app.rs +++ b/crates/live_kit_client2/examples/test_app.rs @@ -1,175 +1,178 @@ -// use std::time::Duration; -// todo!() +use std::{sync::Arc, time::Duration}; -// use futures::StreamExt; -// use gpui2::{actions, keymap_matcher::Binding, Menu, MenuItem}; -// use live_kit_client2::{ -// LocalAudioTrack, LocalVideoTrack, RemoteAudioTrackUpdate, RemoteVideoTrackUpdate, Room, -// }; -// use live_kit_server::token::{self, VideoGrant}; -// use log::LevelFilter; -// use simplelog::SimpleLogger; +use futures::StreamExt; +use gpui2::KeyBinding; +use live_kit_client2::{ + LocalAudioTrack, LocalVideoTrack, RemoteAudioTrackUpdate, RemoteVideoTrackUpdate, Room, +}; +use live_kit_server::token::{self, VideoGrant}; +use log::LevelFilter; +use serde_derive::Deserialize; +use simplelog::SimpleLogger; -// actions!(capture, [Quit]); +#[derive(Deserialize, Debug, Clone, Copy, PartialEq, Eq, Default)] +struct Quit; fn main() { - // SimpleLogger::init(LevelFilter::Info, Default::default()).expect("could not initialize logger"); + SimpleLogger::init(LevelFilter::Info, Default::default()).expect("could not initialize logger"); - // gpui2::App::new(()).unwrap().run(|cx| { - // #[cfg(any(test, feature = "test-support"))] - // println!("USING TEST LIVEKIT"); + gpui2::App::production(Arc::new(())).run(|cx| { + #[cfg(any(test, feature = "test-support"))] + println!("USING TEST LIVEKIT"); - // #[cfg(not(any(test, feature = "test-support")))] - // println!("USING REAL LIVEKIT"); + #[cfg(not(any(test, feature = "test-support")))] + println!("USING REAL LIVEKIT"); - // cx.platform().activate(true); - // cx.add_global_action(quit); + cx.activate(true); - // cx.add_bindings([Binding::new("cmd-q", Quit, None)]); - // cx.set_menus(vec![Menu { - // name: "Zed", - // items: vec![MenuItem::Action { - // name: "Quit", - // action: Box::new(Quit), - // os_action: None, - // }], - // }]); + cx.on_action(quit); + cx.bind_keys([KeyBinding::new("cmd-q", Quit, None)]); - // let live_kit_url = std::env::var("LIVE_KIT_URL").unwrap_or("http://localhost:7880".into()); - // let live_kit_key = std::env::var("LIVE_KIT_KEY").unwrap_or("devkey".into()); - // let live_kit_secret = std::env::var("LIVE_KIT_SECRET").unwrap_or("secret".into()); + // todo!() + // cx.set_menus(vec![Menu { + // name: "Zed", + // items: vec![MenuItem::Action { + // name: "Quit", + // action: Box::new(Quit), + // os_action: None, + // }], + // }]); - // cx.spawn(|cx| async move { - // let user_a_token = token::create( - // &live_kit_key, - // &live_kit_secret, - // Some("test-participant-1"), - // VideoGrant::to_join("test-room"), - // ) - // .unwrap(); - // let room_a = Room::new(); - // room_a.connect(&live_kit_url, &user_a_token).await.unwrap(); + let live_kit_url = std::env::var("LIVE_KIT_URL").unwrap_or("http://localhost:7880".into()); + let live_kit_key = std::env::var("LIVE_KIT_KEY").unwrap_or("devkey".into()); + let live_kit_secret = std::env::var("LIVE_KIT_SECRET").unwrap_or("secret".into()); - // let user2_token = token::create( - // &live_kit_key, - // &live_kit_secret, - // Some("test-participant-2"), - // VideoGrant::to_join("test-room"), - // ) - // .unwrap(); - // let room_b = Room::new(); - // room_b.connect(&live_kit_url, &user2_token).await.unwrap(); + cx.spawn_on_main(|cx| async move { + let user_a_token = token::create( + &live_kit_key, + &live_kit_secret, + Some("test-participant-1"), + VideoGrant::to_join("test-room"), + ) + .unwrap(); + let room_a = Room::new(); + room_a.connect(&live_kit_url, &user_a_token).await.unwrap(); - // let mut audio_track_updates = room_b.remote_audio_track_updates(); - // let audio_track = LocalAudioTrack::create(); - // let audio_track_publication = room_a.publish_audio_track(audio_track).await.unwrap(); + let user2_token = token::create( + &live_kit_key, + &live_kit_secret, + Some("test-participant-2"), + VideoGrant::to_join("test-room"), + ) + .unwrap(); + let room_b = Room::new(); + room_b.connect(&live_kit_url, &user2_token).await.unwrap(); - // if let RemoteAudioTrackUpdate::Subscribed(track, _) = - // audio_track_updates.next().await.unwrap() - // { - // let remote_tracks = room_b.remote_audio_tracks("test-participant-1"); - // assert_eq!(remote_tracks.len(), 1); - // assert_eq!(remote_tracks[0].publisher_id(), "test-participant-1"); - // assert_eq!(track.publisher_id(), "test-participant-1"); - // } else { - // panic!("unexpected message"); - // } + let mut audio_track_updates = room_b.remote_audio_track_updates(); + let audio_track = LocalAudioTrack::create(); + let audio_track_publication = room_a.publish_audio_track(audio_track).await.unwrap(); - // audio_track_publication.set_mute(true).await.unwrap(); + if let RemoteAudioTrackUpdate::Subscribed(track, _) = + audio_track_updates.next().await.unwrap() + { + let remote_tracks = room_b.remote_audio_tracks("test-participant-1"); + assert_eq!(remote_tracks.len(), 1); + assert_eq!(remote_tracks[0].publisher_id(), "test-participant-1"); + assert_eq!(track.publisher_id(), "test-participant-1"); + } else { + panic!("unexpected message"); + } - // println!("waiting for mute changed!"); - // if let RemoteAudioTrackUpdate::MuteChanged { track_id, muted } = - // audio_track_updates.next().await.unwrap() - // { - // let remote_tracks = room_b.remote_audio_tracks("test-participant-1"); - // assert_eq!(remote_tracks[0].sid(), track_id); - // assert_eq!(muted, true); - // } else { - // panic!("unexpected message"); - // } + audio_track_publication.set_mute(true).await.unwrap(); - // audio_track_publication.set_mute(false).await.unwrap(); + println!("waiting for mute changed!"); + if let RemoteAudioTrackUpdate::MuteChanged { track_id, muted } = + audio_track_updates.next().await.unwrap() + { + let remote_tracks = room_b.remote_audio_tracks("test-participant-1"); + assert_eq!(remote_tracks[0].sid(), track_id); + assert_eq!(muted, true); + } else { + panic!("unexpected message"); + } - // if let RemoteAudioTrackUpdate::MuteChanged { track_id, muted } = - // audio_track_updates.next().await.unwrap() - // { - // let remote_tracks = room_b.remote_audio_tracks("test-participant-1"); - // assert_eq!(remote_tracks[0].sid(), track_id); - // assert_eq!(muted, false); - // } else { - // panic!("unexpected message"); - // } + audio_track_publication.set_mute(false).await.unwrap(); - // println!("Pausing for 5 seconds to test audio, make some noise!"); - // let timer = cx.background().timer(Duration::from_secs(5)); - // timer.await; - // let remote_audio_track = room_b - // .remote_audio_tracks("test-participant-1") - // .pop() - // .unwrap(); - // room_a.unpublish_track(audio_track_publication); + if let RemoteAudioTrackUpdate::MuteChanged { track_id, muted } = + audio_track_updates.next().await.unwrap() + { + let remote_tracks = room_b.remote_audio_tracks("test-participant-1"); + assert_eq!(remote_tracks[0].sid(), track_id); + assert_eq!(muted, false); + } else { + panic!("unexpected message"); + } - // // Clear out any active speakers changed messages - // let mut next = audio_track_updates.next().await.unwrap(); - // while let RemoteAudioTrackUpdate::ActiveSpeakersChanged { speakers } = next { - // println!("Speakers changed: {:?}", speakers); - // next = audio_track_updates.next().await.unwrap(); - // } + println!("Pausing for 5 seconds to test audio, make some noise!"); + let timer = cx.executor().timer(Duration::from_secs(5)); + timer.await; + let remote_audio_track = room_b + .remote_audio_tracks("test-participant-1") + .pop() + .unwrap(); + room_a.unpublish_track(audio_track_publication); - // if let RemoteAudioTrackUpdate::Unsubscribed { - // publisher_id, - // track_id, - // } = next - // { - // assert_eq!(publisher_id, "test-participant-1"); - // assert_eq!(remote_audio_track.sid(), track_id); - // assert_eq!(room_b.remote_audio_tracks("test-participant-1").len(), 0); - // } else { - // panic!("unexpected message"); - // } + // Clear out any active speakers changed messages + let mut next = audio_track_updates.next().await.unwrap(); + while let RemoteAudioTrackUpdate::ActiveSpeakersChanged { speakers } = next { + println!("Speakers changed: {:?}", speakers); + next = audio_track_updates.next().await.unwrap(); + } - // let mut video_track_updates = room_b.remote_video_track_updates(); - // let displays = room_a.display_sources().await.unwrap(); - // let display = displays.into_iter().next().unwrap(); + if let RemoteAudioTrackUpdate::Unsubscribed { + publisher_id, + track_id, + } = next + { + assert_eq!(publisher_id, "test-participant-1"); + assert_eq!(remote_audio_track.sid(), track_id); + assert_eq!(room_b.remote_audio_tracks("test-participant-1").len(), 0); + } else { + panic!("unexpected message"); + } - // let local_video_track = LocalVideoTrack::screen_share_for_display(&display); - // let local_video_track_publication = - // room_a.publish_video_track(local_video_track).await.unwrap(); + let mut video_track_updates = room_b.remote_video_track_updates(); + let displays = room_a.display_sources().await.unwrap(); + let display = displays.into_iter().next().unwrap(); - // if let RemoteVideoTrackUpdate::Subscribed(track) = - // video_track_updates.next().await.unwrap() - // { - // let remote_video_tracks = room_b.remote_video_tracks("test-participant-1"); - // assert_eq!(remote_video_tracks.len(), 1); - // assert_eq!(remote_video_tracks[0].publisher_id(), "test-participant-1"); - // assert_eq!(track.publisher_id(), "test-participant-1"); - // } else { - // panic!("unexpected message"); - // } + let local_video_track = LocalVideoTrack::screen_share_for_display(&display); + let local_video_track_publication = + room_a.publish_video_track(local_video_track).await.unwrap(); - // let remote_video_track = room_b - // .remote_video_tracks("test-participant-1") - // .pop() - // .unwrap(); - // room_a.unpublish_track(local_video_track_publication); - // if let RemoteVideoTrackUpdate::Unsubscribed { - // publisher_id, - // track_id, - // } = video_track_updates.next().await.unwrap() - // { - // assert_eq!(publisher_id, "test-participant-1"); - // assert_eq!(remote_video_track.sid(), track_id); - // assert_eq!(room_b.remote_video_tracks("test-participant-1").len(), 0); - // } else { - // panic!("unexpected message"); - // } + if let RemoteVideoTrackUpdate::Subscribed(track) = + video_track_updates.next().await.unwrap() + { + let remote_video_tracks = room_b.remote_video_tracks("test-participant-1"); + assert_eq!(remote_video_tracks.len(), 1); + assert_eq!(remote_video_tracks[0].publisher_id(), "test-participant-1"); + assert_eq!(track.publisher_id(), "test-participant-1"); + } else { + panic!("unexpected message"); + } - // cx.platform().quit(); - // }) - // .detach(); - // }); + let remote_video_track = room_b + .remote_video_tracks("test-participant-1") + .pop() + .unwrap(); + room_a.unpublish_track(local_video_track_publication); + if let RemoteVideoTrackUpdate::Unsubscribed { + publisher_id, + track_id, + } = video_track_updates.next().await.unwrap() + { + assert_eq!(publisher_id, "test-participant-1"); + assert_eq!(remote_video_track.sid(), track_id); + assert_eq!(room_b.remote_video_tracks("test-participant-1").len(), 0); + } else { + panic!("unexpected message"); + } + + cx.update(|cx| cx.quit()).ok(); + }) + .detach(); + }); } -// fn quit(_: &Quit, cx: &mut gpui2::AppContext) { -// cx.platform().quit(); -// } +fn quit(_: &Quit, cx: &mut gpui2::AppContext) { + cx.quit(); +} diff --git a/crates/live_kit_client2/src/live_kit_client2.rs b/crates/live_kit_client2/src/live_kit_client2.rs index 35682382e9..47cc3873ff 100644 --- a/crates/live_kit_client2/src/live_kit_client2.rs +++ b/crates/live_kit_client2/src/live_kit_client2.rs @@ -1,11 +1,11 @@ -// #[cfg(not(any(test, feature = "test-support")))] +#[cfg(not(any(test, feature = "test-support")))] pub mod prod; -// #[cfg(not(any(test, feature = "test-support")))] +#[cfg(not(any(test, feature = "test-support")))] pub use prod::*; -// #[cfg(any(test, feature = "test-support"))] -// pub mod test; +#[cfg(any(test, feature = "test-support"))] +pub mod test; -// #[cfg(any(test, feature = "test-support"))] -// pub use test::*; +#[cfg(any(test, feature = "test-support"))] +pub use test::*; diff --git a/crates/live_kit_client2/src/test.rs b/crates/live_kit_client2/src/test.rs index 7185c11fa8..535ab20afb 100644 --- a/crates/live_kit_client2/src/test.rs +++ b/crates/live_kit_client2/src/test.rs @@ -1,4 +1,4 @@ -use anyhow::{anyhow, Result}; +use anyhow::{anyhow, Result, Context}; use async_trait::async_trait; use collections::{BTreeMap, HashMap}; use futures::Stream; @@ -364,7 +364,7 @@ impl Room { let token = token.to_string(); async move { let server = TestServer::get(&url)?; - server.join_room(token.clone(), this.clone()).await?; + server.join_room(token.clone(), this.clone()).await.context("room join")?; *this.0.lock().connection.0.borrow_mut() = ConnectionState::Connected { url, token }; Ok(()) }