use client_domain::NetworkPort; use protocol::{ServerMessage, decode_server_message}; use std::thread; use std::time::Duration; pub fn run_connection_loop( net: &mut N, server_addr: &str, poll_interval: Duration, reconnect_delay: Duration, mut on_message: impl FnMut(ServerMessage), mut on_connection_change: impl FnMut(bool), ) { loop { if !net.is_connected() { match net.connect(server_addr) { Ok(()) => on_connection_change(true), Err(_) => { on_connection_change(false); thread::sleep(reconnect_delay); continue; } } } match net.receive() { Ok(Some(payload)) => { if let Ok(msg) = decode_server_message(&payload) { on_message(msg); } } Ok(None) => { thread::sleep(poll_interval); } Err(_) => { let _ = net.disconnect(); on_connection_change(false); thread::sleep(reconnect_delay); } } } }