use super::PortmasterExt; use crate::portapi::client::connect; use log::{debug, error, info, warn}; use tauri::{AppHandle, Runtime}; use tokio::time::{sleep, Duration}; /// Starts a backround thread (via tauri::async_runtime) that connects to the Portmaster /// Websocket database API. pub fn start_websocket_thread<R: Runtime>(app: AppHandle<R>) { let app = app.clone(); tauri::async_runtime::spawn(async move { loop { debug!("Trying to connect to websocket endpoint"); let api = connect("ws://127.0.0.1:817/api/database/v1").await; match api { Ok(cli) => { let portmaster = app.portmaster(); info!("Successfully connected to portmaster"); portmaster.on_connect(cli.clone()); while !cli.is_closed() { let _ = sleep(Duration::from_secs(1)).await; } portmaster.on_disconnect(); warn!("lost connection to portmaster, retrying ....") } Err(err) => { error!("failed to create portapi client: {}", err); app.portmaster().on_disconnect(); // sleep and retry sleep(Duration::from_secs(2)).await; } } } }); }