diff options
| author | Gustav Sörnäs <gustav@sornas.net> | 2021-01-02 18:41:59 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-01-02 18:41:59 +0100 |
| commit | 28f0ccd4639865e10690022c8164ba4c5b337102 (patch) | |
| tree | 24c79ff42ce823b29cd94f72d7e567c67a7fc8f0 /mumd/src/client.rs | |
| parent | 67364577263943e815be9ba700c10845698e116d (diff) | |
| parent | aef5b85b22b916a3a7f84b1b9bbea151544580f3 (diff) | |
| download | mum-28f0ccd4639865e10690022c8164ba4c5b337102.tar.gz | |
Merge pull request #49 from sornas/move-more-to-backend
Move mumble client stuff away from main
Diffstat (limited to 'mumd/src/client.rs')
| -rw-r--r-- | mumd/src/client.rs | 55 |
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), + ); +} |
