summaryrefslogtreecommitdiff
path: root/client-native-lib/src/state.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2022-10-07 19:59:43 +0200
committermetamuffin <metamuffin@disroot.org>2022-10-07 19:59:43 +0200
commit439428f5c3967f5dd76db5540e085cdd91e7b747 (patch)
tree35be38807c121c833439025721f8bf386b45a003 /client-native-lib/src/state.rs
parent8f07699fbe594e1ec007fbc908adced89fc41f7e (diff)
downloadkeks-meet-439428f5c3967f5dd76db5540e085cdd91e7b747.tar
keks-meet-439428f5c3967f5dd76db5540e085cdd91e7b747.tar.bz2
keks-meet-439428f5c3967f5dd76db5540e085cdd91e7b747.tar.zst
some work on native lib
Diffstat (limited to 'client-native-lib/src/state.rs')
-rw-r--r--client-native-lib/src/state.rs61
1 files changed, 52 insertions, 9 deletions
diff --git a/client-native-lib/src/state.rs b/client-native-lib/src/state.rs
index 841c876..d129e32 100644
--- a/client-native-lib/src/state.rs
+++ b/client-native-lib/src/state.rs
@@ -4,11 +4,12 @@
Copyright (C) 2022 metamuffin <metamuffin@disroot.org>
*/
use crate::{
- crypto::Key,
+ build_api,
+ crypto::{self, Key},
peer::Peer,
protocol::{self, ClientboundPacket, RelayMessage, RelayMessageWrapper, ServerboundPacket},
- signaling::SignalingConnection,
- Config,
+ signaling::{self, SignalingConnection},
+ Config, EventHandler, LocalResource,
};
use futures_util::{SinkExt, StreamExt};
use log::{debug, info, warn};
@@ -17,14 +18,32 @@ use tokio::sync::RwLock;
use webrtc::api::API;
pub struct State {
+ pub event_handler: Box<dyn EventHandler>,
pub conn: SignalingConnection,
pub config: Config,
pub api: API,
pub key: Key,
- pub my_id: RwLock<Option<usize>>,
+ local_resources: RwLock<HashMap<String, Box<dyn LocalResource>>>,
+ my_id: RwLock<Option<usize>>,
pub peers: RwLock<HashMap<usize, Arc<Peer>>>,
}
impl State {
+ pub async fn new(config: Config, event_handler: Box<dyn EventHandler>) -> Arc<Self> {
+ let conn = signaling::SignalingConnection::new(&config.signaling_uri, &config.secret).await;
+ let key = crypto::Key::derive(&config.secret);
+
+ Arc::new(Self {
+ event_handler,
+ api: build_api(),
+ my_id: RwLock::new(None),
+ peers: Default::default(),
+ local_resources: Default::default(),
+ config,
+ conn,
+ key,
+ })
+ }
+
pub async fn my_id(&self) -> usize {
self.my_id.read().await.expect("not initialized yet")
}
@@ -47,14 +66,22 @@ impl State {
if id == self.my_id().await {
// we joined - YAY!
} else {
- self.peers
- .write()
- .await
- .insert(id, Peer::create(self.clone(), id).await);
+ let peer = Peer::create(self.clone(), id).await;
+ self.peers.write().await.insert(id, peer.clone());
+ peer.send_relay(RelayMessage::Identify {
+ username: self.config.username.clone(),
+ })
+ .await;
}
}
protocol::ClientboundPacket::ClientLeave { id } => {
- self.peers.write().await.remove(&id);
+ self.peers
+ .write()
+ .await
+ .remove(&id)
+ .unwrap()
+ .on_leave()
+ .await;
}
protocol::ClientboundPacket::Message { sender, message } => {
let message = self.key.decrypt(&message);
@@ -90,4 +117,20 @@ impl State {
.await
.unwrap()
}
+
+ pub async fn add_local_resource(&self, res: Box<dyn LocalResource>) {
+ for (pid, peer) in self.peers.read().await.iter() {
+ peer.send_relay(RelayMessage::Provide(res.info()));
+ }
+ self.local_resources
+ .write()
+ .await
+ .insert(res.info().id, res);
+ }
+ pub async fn remove_local_resource(&self, id: String) {
+ self.local_resources.write().await.remove(&id);
+ for (pid, peer) in self.peers.read().await.iter() {
+ peer.send_relay(RelayMessage::ProvideStop { id: id.clone() });
+ }
+ }
}