aboutsummaryrefslogtreecommitdiffstats
path: root/mumd/src/client.rs
diff options
context:
space:
mode:
authorKapten Z∅∅m <55669224+default-username-852@users.noreply.github.com>2021-01-04 22:46:58 +0100
committerGitHub <noreply@github.com>2021-01-04 22:46:58 +0100
commit50b322f4ef974765a2948dfb08b1c9e8128b1bed (patch)
tree88d41a434b3a0c242ac7b35c6afefff0f75ee656 /mumd/src/client.rs
parent1af9b90133a8d6102a09102bbd6f726f598c24fc (diff)
parentbe7748be2f1e9d1e88ebd093da9eec16d1ad4049 (diff)
downloadmum-50b322f4ef974765a2948dfb08b1c9e8128b1bed.tar.gz
Merge branch 'main' into noise-gate
Diffstat (limited to 'mumd/src/client.rs')
-rw-r--r--mumd/src/client.rs55
1 files changed, 55 insertions, 0 deletions
diff --git a/mumd/src/client.rs b/mumd/src/client.rs
new file mode 100644
index 0000000..3613061
--- /dev/null
+++ b/mumd/src/client.rs
@@ -0,0 +1,55 @@
+use crate::command;
+use crate::network::{tcp, udp, ConnectionInfo};
+use crate::state::State;
+
+use futures_util::join;
+use ipc_channel::ipc::IpcSender;
+use mumble_protocol::{Serverbound, control::ControlPacket, crypt::ClientCryptState};
+use mumlib::command::{Command, CommandResponse};
+use std::sync::{Arc, Mutex};
+use tokio::sync::{mpsc, watch};
+
+pub async fn handle(
+ command_receiver: mpsc::UnboundedReceiver<(
+ Command,
+ IpcSender<mumlib::error::Result<Option<CommandResponse>>>,
+ )>,
+) {
+ let (connection_info_sender, connection_info_receiver) =
+ watch::channel::<Option<ConnectionInfo>>(None);
+ let (crypt_state_sender, crypt_state_receiver) =
+ mpsc::channel::<ClientCryptState>(1);
+ let (packet_sender, packet_receiver) =
+ mpsc::unbounded_channel::<ControlPacket<Serverbound>>();
+ let (ping_request_sender, ping_request_receiver) =
+ mpsc::unbounded_channel();
+ let (response_sender, response_receiver) =
+ mpsc::unbounded_channel();
+
+ let state = State::new();
+ let state = Arc::new(Mutex::new(state));
+ join!(
+ tcp::handle(
+ Arc::clone(&state),
+ connection_info_receiver.clone(),
+ crypt_state_sender,
+ packet_sender.clone(),
+ packet_receiver,
+ response_receiver,
+ ),
+ udp::handle(
+ Arc::clone(&state),
+ connection_info_receiver.clone(),
+ crypt_state_receiver,
+ ),
+ command::handle(
+ state,
+ command_receiver,
+ response_sender,
+ ping_request_sender,
+ packet_sender,
+ connection_info_sender,
+ ),
+ udp::handle_pings(ping_request_receiver),
+ );
+}