safing-portmaster/desktop/tauri/src-tauri/src/portmaster/websocket.rs

45 lines
1.4 KiB
Rust

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;
}
}
}
});
}