diff --git a/iris b/iris index 955e6b7..c7b255b 160000 --- a/iris +++ b/iris @@ -1 +1 @@ -Subproject commit 955e6b758811ac00b988db04afe249255ea5b64e +Subproject commit c7b255be4facfd20c0f261bc8e1380d1a2a38355 diff --git a/src/net/client.rs b/src/net/client.rs index d7b5ab1..9b6ec82 100644 --- a/src/net/client.rs +++ b/src/net/client.rs @@ -121,7 +121,7 @@ async fn connect_the(handle: AppHandle, info: ConnectInfo) -> NetResult<()> { }); let recv = ServerRecv { handle }; - tokio::spawn(recv_uni(conn_, recv)); + tokio::spawn(recv_uni(conn_, recv.into())); while let Some(msg) = ui_recv.recv().await { if send_uni(&conn, msg).await.is_err() { diff --git a/src/net/server.rs b/src/net/server.rs index 4079c16..e230e31 100644 --- a/src/net/server.rs +++ b/src/net/server.rs @@ -93,7 +93,7 @@ async fn handle_connection( accepter: Arc, ) -> std::io::Result<()> { let conn = conn.await?; - let handler = accepter.accept(ClientSender { conn: conn.clone() }).await; + let handler = Arc::new(accepter.accept(ClientSender { conn: conn.clone() }).await); let span = tracing::info_span!( "connection", remote = %conn.remote_address(), @@ -105,7 +105,8 @@ async fn handle_connection( .map_or_else(|| "".into(), |x| String::from_utf8_lossy(&x).into_owned()) ); async { - recv_uni(conn, handler).await; + let res = recv_uni(conn, handler.clone()).await; + handler.disconnect(res).await; } .instrument(span) .await; diff --git a/src/net/transfer.rs b/src/net/transfer.rs index 09e7afe..b6503ad 100644 --- a/src/net/transfer.rs +++ b/src/net/transfer.rs @@ -7,6 +7,9 @@ use tracing::Instrument as _; pub trait RecvHandler: Send + Sync + 'static { fn msg(&self, msg: M) -> impl Future + Send; + fn disconnect(&self, reason: DisconnectReason) -> impl Future + Send { + async { drop(reason) } + } } pub type SendResult = Result<(), ()>; @@ -21,16 +24,27 @@ pub async fn send_uni(conn: &Connection, msg: M) -> SendResu Ok(()) } -pub async fn recv_uni>(conn: Connection, handler: impl RecvHandler) { - let handler = Arc::new(handler); +pub enum DisconnectReason { + Closed, + Timeout, + Other(String), +} + +pub async fn recv_uni>( + conn: Connection, + handler: Arc>, +) -> DisconnectReason { loop { let mut recv = match conn.accept_uni().await { Err(quinn::ConnectionError::ApplicationClosed { .. }) => { - return; + return DisconnectReason::Closed; + } + Err(quinn::ConnectionError::TimedOut) => { + return DisconnectReason::Timeout; } Err(e) => { eprintln!("connection error: {e}"); - return; + return DisconnectReason::Other(e.to_string()); } Ok(s) => s, }; diff --git a/src/server/mod.rs b/src/server/mod.rs index 4b031c4..537f34c 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -2,7 +2,7 @@ use crate::{ net::{ ClientMsg, Msg, ServerMsg, server::{ClientSender, ConAccepter, listen}, - transfer::RecvHandler, + transfer::{DisconnectReason, RecvHandler}, }, rsc::DataDir, }; @@ -82,4 +82,11 @@ impl RecvHandler for ClientHandler { } } } + + async fn disconnect(&self, reason: DisconnectReason) -> () { + match reason { + DisconnectReason::Closed | DisconnectReason::Timeout => (), + DisconnectReason::Other(e) => println!("connection issue: {e}"), + } + } }