From 9ea3a3a1d6317fc64adcba969d28c52d5d3d3c3c Mon Sep 17 00:00:00 2001 From: Joe Ardent Date: Sun, 3 Aug 2025 15:45:38 -0700 Subject: [PATCH] fixed deadlock, needs https --- src/app/mod.rs | 15 ++++++++++----- src/app/widgets.rs | 7 +++++-- src/transfer.rs | 16 ++++++++-------- 3 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/app/mod.rs b/src/app/mod.rs index e100cf0..d316bce 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -221,21 +221,26 @@ impl App { // send content to selected peer, or change directories in the file explorer async fn send_content(&mut self) { - if let Some(_bytes) = self.content.iter().next().cloned() { + debug!("sending content"); + + if let Some(_bytes) = self.content.to_owned() { // self.service.send_bytes(session_id, content_id, token, body) warn!("entering text is not yet supported"); } else { let file = self.file_picker.current().path().clone(); - if file.is_dir() && let Err(e) = self.file_picker.set_cwd(&file) { error!("could not list directory {file:?}: {e}"); - } else if let Some((peer, _)) = self.service.peers.lock().await.first_key_value() + } + + if let Some((_, (_, peer))) = self.peers.first_key_value() && file.is_file() - && let Err(e) = self.service.send_file(peer.to_owned(), file.clone()).await { - error!("got error sending content: {e:?}"); + debug!("sending {file:?}"); + if let Err(e) = self.service.send_file(peer.to_owned(), file.clone()).await { + error!("got error sending content: {e:?}"); + } } } } diff --git a/src/app/widgets.rs b/src/app/widgets.rs index 41eabb2..95d9733 100644 --- a/src/app/widgets.rs +++ b/src/app/widgets.rs @@ -145,9 +145,10 @@ impl Widget for &mut App { receive_requests( &rx_reqs, &mut self.receiving_state, - area.inner(subscreen_margin), + top.inner(subscreen_margin), buf, ); + logger(bottom.inner(subscreen_margin), buf); } CurrentScreen::Sending(s) => { match s { @@ -164,7 +165,9 @@ impl Widget for &mut App { self.file_picker .widget() - .render(top.inner(subscreen_margin), buf); + .render(header_left.inner(header_margin), buf); + logger(header_right.inner(header_margin), buf); + peers.render(bottom.inner(subscreen_margin), buf); } _ => { diff --git a/src/transfer.rs b/src/transfer.rs index 294da79..c2143e9 100644 --- a/src/transfer.rs +++ b/src/transfer.rs @@ -1,4 +1,4 @@ -use std::{collections::BTreeMap, net::SocketAddr, path::PathBuf}; +use std::{collections::BTreeMap, net::SocketAddr, path::PathBuf, time::Duration}; use axum::{ Json, @@ -58,23 +58,23 @@ impl JoecalService { peer: String, files: BTreeMap, ) -> Result { - if !self.peers.lock().await.contains_key(&peer) { + let Some((addr, device)) = self.peers.lock().await.get(&peer).cloned() else { return Err(LocalSendError::PeerNotFound); - } + }; - let peer = self.peers.lock().await.get(&peer).unwrap().clone(); + debug!("sending to peer at {addr:?}"); let response = self .client .post(format!( "{}://{}/api/localsend/v2/prepare-upload", - peer.1.protocol, - peer.0.clone() + device.protocol, addr )) .json(&PrepareUploadRequest { info: self.device.clone(), files: files.clone(), }) + .timeout(Duration::from_secs(30)) .send() .await?; @@ -86,10 +86,10 @@ impl JoecalService { session_id: response.session_id.clone(), files, file_tokens: response.files.clone(), - receiver: peer.1, + receiver: device, sender: self.device.clone(), status: SessionStatus::Active, - addr: peer.0, + addr, }; self.sessions