]> git.lizzy.rs Git - mt_rudp.git/blobdiff - src/client.rs
Use channels
[mt_rudp.git] / src / client.rs
index 56db92a9ae060f8e6bfce7ce38017bda6c3199d0..29244d0401e7aeda9a10cfd0a2f14562508ecda5 100644 (file)
@@ -1,16 +1,19 @@
 use super::*;
 use async_trait::async_trait;
 use std::{io, sync::Arc};
-use tokio::net;
+use tokio::{
+    net,
+    sync::{mpsc, watch},
+};
 
 #[derive(Debug)]
-pub struct ToSrv(Arc<net::UdpSocket>);
+pub struct UdpCltSender(Arc<net::UdpSocket>);
 
 #[derive(Debug)]
-pub struct FromSrv(Arc<net::UdpSocket>);
+pub struct UdpCltReceiver(Arc<net::UdpSocket>);
 
 #[async_trait]
-impl UdpSender for ToSrv {
+impl UdpSender for UdpCltSender {
     async fn send(&self, data: &[u8]) -> io::Result<()> {
         self.0.send(data).await?;
         Ok(())
@@ -18,7 +21,7 @@ impl UdpSender for ToSrv {
 }
 
 #[async_trait]
-impl UdpReceiver for FromSrv {
+impl UdpReceiver for UdpCltReceiver {
     async fn recv(&mut self) -> io::Result<Vec<u8>> {
         let mut buffer = Vec::new();
         buffer.resize(UDP_PKT_SIZE, 0);
@@ -30,21 +33,35 @@ impl UdpReceiver for FromSrv {
     }
 }
 
-pub struct RemoteSrv;
-impl UdpPeer for RemoteSrv {
-    type Sender = ToSrv;
-    type Receiver = FromSrv;
+#[derive(Debug)]
+pub struct CltReceiver(mpsc::UnboundedReceiver<Result<Pkt<'static>, Error>>);
+
+impl CltReceiver {
+    pub async fn recv_rudp(&mut self) -> Option<Result<Pkt<'static>, Error>> {
+        self.0.recv().await
+    }
 }
 
-pub async fn connect(addr: &str) -> io::Result<(RudpSender<RemoteSrv>, RudpReceiver<RemoteSrv>)> {
+pub type CltSender = Arc<Sender<UdpCltSender>>;
+pub type CltWorker = Worker<UdpCltSender, UdpCltReceiver>;
+
+pub async fn connect(addr: &str) -> io::Result<(CltSender, CltReceiver, CltWorker)> {
     let sock = Arc::new(net::UdpSocket::bind("0.0.0.0:0").await?);
     sock.connect(addr).await?;
 
-    new(
+    let (close_tx, close_rx) = watch::channel(false);
+    let (pkt_tx, pkt_rx) = mpsc::unbounded_channel();
+
+    let sender = Sender::new(
+        UdpCltSender(Arc::clone(&sock)),
+        close_tx,
         PeerID::Srv as u16,
         PeerID::Nil as u16,
-        ToSrv(Arc::clone(&sock)),
-        FromSrv(sock),
-    )
-    .await
+    );
+
+    Ok((
+        Arc::clone(&sender),
+        CltReceiver(pkt_rx),
+        Worker::new(UdpCltReceiver(sock), close_rx, sender, pkt_tx),
+    ))
 }