net_stream/server/
actor_handle.rs

1use super::actor::Message;
2use super::peer_uid::PeerUid;
3use crate::message_types::MessageTypes;
4use futures::channel::mpsc;
5use futures::channel::oneshot;
6use std::sync::Arc;
7use tokio::task::JoinHandle;
8
9/// Handle to the server actor task.
10#[derive(Debug, Clone)]
11pub struct ActorHandle<M: MessageTypes> {
12    sender: mpsc::UnboundedSender<Message<M>>,
13    _join_handle: Arc<JoinHandle<()>>,
14}
15
16impl<M> ActorHandle<M>
17where
18    M: MessageTypes,
19{
20    /// Create new handle
21    pub(crate) fn new(join_handle: JoinHandle<()>, sender: mpsc::UnboundedSender<Message<M>>) -> ActorHandle<M> {
22        Self {
23            _join_handle: Arc::new(join_handle),
24            sender,
25        }
26    }
27
28    /// Send message to client on TCP.
29    pub fn message_peer_tcp(&self, peer_uid: PeerUid, msg: M::TcpFromServer) {
30        log::debug!("Message {peer_uid:?} TCP");
31        self.sender
32            .unbounded_send(Message::ToPeerTcp { peer_uid, msg })
33            .expect("Actor is not accepting any new messages")
34    }
35
36    /// Send message to client on UDP (lossy).
37    pub fn message_peer_udp(&self, peer_uid: PeerUid, msg: M::UdpFromServer) {
38        log::debug!("Message {peer_uid:?} UDP");
39        self.sender
40            .unbounded_send(Message::ToPeerUdp { peer_uid, msg })
41            .expect("Actor is not accepting any new messages")
42    }
43
44    /// Send announcement to all connected clients on TCP.
45    pub fn announce_tcp(&self, msg: M::TcpFromServer) {
46        log::debug!("Announce TCP");
47        self.sender
48            .unbounded_send(Message::AnnounceTcp { msg })
49            .expect("Actor is not accepting any new messages")
50    }
51
52    /// Send announcement to all connected clients on UDP (lossy).
53    pub fn announce_udp(&self, msg: M::UdpFromServer) {
54        log::debug!("Announce UDP");
55        self.sender
56            .unbounded_send(Message::AnnounceUdp { msg })
57            .expect("Actor is not accepting any new messages")
58    }
59
60    /// Get number of connected peers.
61    pub async fn get_number_of_connected_peers(&self) -> usize {
62        let (tx, rx) = oneshot::channel();
63        self.sender
64            .unbounded_send(Message::GetNumberOfConnectedPeers { tx })
65            .expect("Actor is not accepting any new messages");
66
67        rx.await.expect("Expected response from actor")
68    }
69}