//! Core update commands. The UI never passes a path, key or verification flag. use super::{logged, main_core, text, CommandResult}; use crate::core::app::CoreSlot; use crate::core::error::CoreError; use serde_json::{json, Value}; use tauri::{State, Webview}; #[tauri::command] pub async fn core_updates_get_state(webview: Webview, slot: State<'_, CoreSlot>) -> CommandResult { Ok(main_core(&webview, &slot)?.services.updates.get_state()) } #[tauri::command] pub async fn core_updates_check(webview: Webview, slot: State<'_, CoreSlot>) -> CommandResult { let core = main_core(&webview, &slot)?; let result = core.services.updates.check().await; logged(&core, "updates:check", result) } #[tauri::command] pub async fn core_updates_select(webview: Webview, slot: State<'_, CoreSlot>, payload: Option) -> CommandResult { let core = main_core(&webview, &slot)?; let payload = super::payload(payload); logged(&core, "updates:select", core.services.updates.select(text(&payload, "id"))) } #[tauri::command] pub async fn core_updates_download(webview: Webview, slot: State<'_, CoreSlot>) -> CommandResult { let core = main_core(&webview, &slot)?; let result = core.services.updates.download().await; logged(&core, "updates:download", result) } #[tauri::command] pub async fn core_updates_install(webview: Webview, slot: State<'_, CoreSlot>) -> CommandResult { let core = main_core(&webview, &slot)?; let result = async { core.services.biometrics.require_sensitive_action().await?; // Re-hash and re-verify the internally tracked artifact right before launching it. let path = core.services.updates.prepare_installer_launch().await?; let launched = crate::core::updates::launcher::install(&core.app, &path, &core.logger).await?; core.services.updates.mark_installer_launched()?; if launched.restart { let app = core.app.clone(); tauri::async_runtime::spawn(async move { tokio::time::sleep(std::time::Duration::from_millis(250)).await; app.restart(); }); } Ok(json!({ "ok": true, "installed": launched.installed, "restarting": launched.restart })) } .await; logged(&core, "updates:install", result) } #[tauri::command] pub async fn core_updates_reveal(webview: Webview, slot: State<'_, CoreSlot>) -> CommandResult { let core = main_core(&webview, &slot)?; let result = (|| { let path = core.services.updates.verified_download_path().ok_or_else(|| CoreError::plain("No verified update has been downloaded."))?; use tauri_plugin_opener::OpenerExt; core.app.opener().reveal_item_in_dir(&path).map_err(|e| CoreError::plain(e.to_string()))?; Ok(json!({ "ok": true })) })(); logged(&core, "updates:reveal", result) }