// Desktop auto-update — prompt-on-update flow. // // Runs ONLY inside the Tauri desktop shell; a plain browser has no updater, so // this is a guarded no-op there. On launch it checks the configured update // endpoint (tauri.conf.json → plugins.updater); if a signed newer version is // available it asks the operator, then downloads + installs and relaunches. // // The plugins are imported dynamically so the browser build never bundles them // and never tries to resolve the Tauri APIs. Offline-first: a failed check (no // network — the appliance is usually offline) is swallowed; updates only happen // when someone has brought the box online (e.g. a phone hotspot) on purpose. /** True when running inside the Tauri webview (not a normal browser). */ function inTauri(): boolean { return typeof window !== "undefined" && "__TAURI_INTERNALS__" in window; } export interface UpdatePrompt { /** Newer version string offered by the server. */ version: string; /** Release notes, if the server provided them. */ notes?: string; } /** * Check for an update. If one is available, calls `confirm` (your UI) with the * version/notes; when it resolves true, downloads + installs and relaunches. * No-op (resolves silently) in the browser or when no update / offline. */ export async function checkForDesktopUpdate( confirm: (info: UpdatePrompt) => Promise, ): Promise { if (!inTauri()) return; try { const { check } = await import("@tauri-apps/plugin-updater"); const update = await check(); if (!update) return; // up to date const accepted = await confirm({ version: update.version, notes: update.body }); if (!accepted) return; // Download + install the signed update (signature verified against the // pubkey in tauri.conf.json), then relaunch into the new version. await update.downloadAndInstall(); const { relaunch } = await import("@tauri-apps/plugin-process"); await relaunch(); } catch { // Offline / endpoint unreachable / no update server yet → ignore. The app // keeps running on the current version; checking again next launch. } }