feat: remove peers
This commit is contained in:
@@ -21,6 +21,7 @@ const MAX_THREADS: usize = 100;
|
|||||||
pub enum ClientOperation {
|
pub enum ClientOperation {
|
||||||
ConnectToPeer(Peer),
|
ConnectToPeer(Peer),
|
||||||
SearchResult(FileSearchResult),
|
SearchResult(FileSearchResult),
|
||||||
|
PeerDisconnected(String),
|
||||||
}
|
}
|
||||||
struct ClientContext {
|
struct ClientContext {
|
||||||
peers: HashMap<String, DefaultPeer>,
|
peers: HashMap<String, DefaultPeer>,
|
||||||
@@ -103,6 +104,14 @@ impl Client {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
|
pub fn remove_peer(&self, username: &str) {
|
||||||
|
let mut context = self.context.lock().unwrap();
|
||||||
|
if let Some(peer) = context.peers.remove(username) {
|
||||||
|
drop(peer); // Explicitly drop to trigger cleanup
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn search(&self, query: &str, timeout: Duration) -> Vec<FileSearchResult> {
|
pub fn search(&self, query: &str, timeout: Duration) -> Vec<FileSearchResult> {
|
||||||
println!("Searching for {}", query);
|
println!("Searching for {}", query);
|
||||||
if let Some(server) = &self.server {
|
if let Some(server) = &self.server {
|
||||||
@@ -139,6 +148,12 @@ impl Client {
|
|||||||
.search_results
|
.search_results
|
||||||
.push(file_search);
|
.push(file_search);
|
||||||
}
|
}
|
||||||
|
ClientOperation::PeerDisconnected(username) => {
|
||||||
|
let mut context = client_context.lock().unwrap();
|
||||||
|
if let Some(peer) = context.peers.remove(&username) {
|
||||||
|
drop(peer); // Explicitly drop to trigger cleanup
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -36,7 +36,6 @@ impl DefaultPeer {
|
|||||||
peer,
|
peer,
|
||||||
peer_channel: None,
|
peer_channel: None,
|
||||||
client_channel,
|
client_channel,
|
||||||
// Initialize handles as None
|
|
||||||
read_thread: None,
|
read_thread: None,
|
||||||
write_thread: None,
|
write_thread: None,
|
||||||
}
|
}
|
||||||
@@ -69,6 +68,7 @@ impl DefaultPeer {
|
|||||||
let mut write_stream = stream; // Use the original stream for writing
|
let mut write_stream = stream; // Use the original stream for writing
|
||||||
|
|
||||||
let peer = self.peer.clone();
|
let peer = self.peer.clone();
|
||||||
|
let client_channel_for_read = self.client_channel.clone();
|
||||||
|
|
||||||
// Spawn the reader thread
|
// Spawn the reader thread
|
||||||
self.read_thread = Some(thread::spawn(move || {
|
self.read_thread = Some(thread::spawn(move || {
|
||||||
@@ -91,6 +91,7 @@ impl DefaultPeer {
|
|||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
eprintln!("Error reading from peer: {}. Terminating read loop.", e);
|
eprintln!("Error reading from peer: {}. Terminating read loop.", e);
|
||||||
|
let _ = client_channel_for_read.send(ClientOperation::PeerDisconnected(peer.username.clone()));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -102,6 +103,7 @@ impl DefaultPeer {
|
|||||||
"Error extracting message in default peer: {}. Terminating read loop.",
|
"Error extracting message in default peer: {}. Terminating read loop.",
|
||||||
e
|
e
|
||||||
);
|
);
|
||||||
|
let _ = client_channel_for_read.send(ClientOperation::PeerDisconnected(peer.username.clone()));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
Ok(None) => continue,
|
Ok(None) => continue,
|
||||||
@@ -110,6 +112,7 @@ impl DefaultPeer {
|
|||||||
}));
|
}));
|
||||||
|
|
||||||
let client_channel = self.client_channel.clone();
|
let client_channel = self.client_channel.clone();
|
||||||
|
let peer_username = self.peer.username.clone();
|
||||||
self.write_thread = Some(thread::spawn(move || {
|
self.write_thread = Some(thread::spawn(move || {
|
||||||
loop {
|
loop {
|
||||||
match peer_reader.recv() {
|
match peer_reader.recv() {
|
||||||
@@ -118,6 +121,7 @@ impl DefaultPeer {
|
|||||||
PeerOperation::SendMessage(message) => {
|
PeerOperation::SendMessage(message) => {
|
||||||
if let Err(e) = write_stream.write_all(&message.get_buffer()) {
|
if let Err(e) = write_stream.write_all(&message.get_buffer()) {
|
||||||
eprintln!("Error writing message to stream: {}. Terminating write loop.", e);
|
eprintln!("Error writing message to stream: {}. Terminating write loop.", e);
|
||||||
|
let _ = client_channel.send(ClientOperation::PeerDisconnected(peer_username.clone()));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user