From e3c204b2080232f80dfdd4441448429a2815f67c Mon Sep 17 00:00:00 2001 From: Erwan Leboucher Date: Wed, 5 Aug 2026 15:19:57 +0200 Subject: [PATCH 1/2] fix: diagnostics and refresh CEF runtime --- src-tauri/Cargo.lock | 38 ++++++++++---------- src-tauri/src/desktop/diagnostics.rs | 14 +++++--- src-tauri/src/desktop/download.rs | 14 +++++--- src/app/generated/tauri/commands.ts | 2 +- src/app/generated/tauri/events.ts | 2 +- src/app/generated/tauri/index.ts | 2 +- src/app/generated/tauri/types.ts | 2 +- src/app/pages/client/DesktopUpdater.test.tsx | 10 +++++- src/app/pages/client/DesktopUpdater.tsx | 16 +++++++-- 9 files changed, 66 insertions(+), 34 deletions(-) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 1a51fdd8a7..ddd0a10ad8 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -168,7 +168,7 @@ version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -179,7 +179,7 @@ checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -1011,7 +1011,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" dependencies = [ "lazy_static", - "windows-sys 0.59.0", + "windows-sys 0.48.0", ] [[package]] @@ -1553,7 +1553,7 @@ dependencies = [ "libc", "option-ext", "redox_users", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -1585,7 +1585,7 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab8ecd87370524b461f8557c119c405552c396ed91fc0a8eec68679eab26f94a" dependencies = [ - "libloading 0.8.9", + "libloading 0.7.4", ] [[package]] @@ -1855,7 +1855,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -3653,7 +3653,7 @@ dependencies = [ "png 0.18.1", "serde", "thiserror 2.0.19", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -3777,7 +3777,7 @@ version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -4217,7 +4217,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d8fae84b431384b68627d0f9b3b1245fcf9f46f6c0e3dc902e9dce64edd1967" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.48.0", ] [[package]] @@ -4875,7 +4875,7 @@ dependencies = [ "once_cell", "socket2 0.6.5", "tracing", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -5294,7 +5294,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -5352,7 +5352,7 @@ dependencies = [ "security-framework", "security-framework-sys", "webpki-root-certs", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -6051,7 +6051,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -6957,7 +6957,7 @@ dependencies = [ [[package]] name = "tauri-runtime-cef" version = "0.1.0" -source = "git+https://github.com/SableClient/tauri-runtime-cef?branch=main#c0d9ff8ecf0eac8504c1947932274e7fe7d9fb8c" +source = "git+https://github.com/SableClient/tauri-runtime-cef?branch=main#6aee1cdbe137b53cb28201417ec302b75a93330a" dependencies = [ "base64 0.22.1", "cef", @@ -7070,7 +7070,7 @@ dependencies = [ "serde_with", "swift-rs", "thiserror 2.0.19", - "toml 1.1.3+spec-1.1.0", + "toml 0.9.12+spec-1.1.0", "url", "urlpattern", "uuid", @@ -7109,7 +7109,7 @@ dependencies = [ "getrandom 0.4.3", "once_cell", "rustix", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -7734,7 +7734,7 @@ dependencies = [ "png 0.18.1", "serde", "thiserror 2.0.19", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -7808,7 +7808,7 @@ checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" dependencies = [ "memoffset", "tempfile", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -8438,7 +8438,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.48.0", ] [[package]] diff --git a/src-tauri/src/desktop/diagnostics.rs b/src-tauri/src/desktop/diagnostics.rs index c741e2a4e8..6d93b35551 100644 --- a/src-tauri/src/desktop/diagnostics.rs +++ b/src-tauri/src/desktop/diagnostics.rs @@ -7,16 +7,22 @@ use tauri_plugin_dialog::DialogExt; const DEFAULT_ARCHIVE_NAME: &str = "sable-diagnostics.zip"; #[tauri::command] -pub fn export_diagnostics( +pub async fn export_diagnostics( app: AppHandle, frontend_logs: Option, ) -> Result, String> { - let Some(path) = app - .dialog() + let (sender, receiver) = tokio::sync::oneshot::channel(); + app.dialog() .file() .set_file_name(DEFAULT_ARCHIVE_NAME) .add_filter("ZIP archive", &["zip"]) - .blocking_save_file() + .save_file(move |path| { + let _ = sender.send(path); + }); + + let Some(path) = receiver + .await + .map_err(|error| format!("Save dialog did not return a result: {error}"))? else { return Ok(None); }; diff --git a/src-tauri/src/desktop/download.rs b/src-tauri/src/desktop/download.rs index 30078f801a..cba83d6b36 100644 --- a/src-tauri/src/desktop/download.rs +++ b/src-tauri/src/desktop/download.rs @@ -2,16 +2,22 @@ use tauri::AppHandle; use tauri_plugin_dialog::DialogExt; #[tauri::command] -pub fn save_download( +pub async fn save_download( app: AppHandle, filename: String, bytes: Vec, ) -> Result { - let Some(path) = app - .dialog() + let (sender, receiver) = tokio::sync::oneshot::channel(); + app.dialog() .file() .set_file_name(&filename) - .blocking_save_file() + .save_file(move |path| { + let _ = sender.send(path); + }); + + let Some(path) = receiver + .await + .map_err(|error| format!("Save dialog did not return a result: {error}"))? else { return Ok(false); }; diff --git a/src/app/generated/tauri/commands.ts b/src/app/generated/tauri/commands.ts index 1dd132bbba..a712d062e2 100644 --- a/src/app/generated/tauri/commands.ts +++ b/src/app/generated/tauri/commands.ts @@ -1,7 +1,7 @@ /** * Auto-generated TypeScript bindings for Tauri commands * Generated by tauri-typegen v0.5.0 - * Generated at: 2026-07-31T11:14:58.599659+00:00 + * Generated at: 2026-08-05T12:41:11.731056+00:00 * Generator: none * * Do not edit manually - regenerate using: cargo tauri-typegen generate diff --git a/src/app/generated/tauri/events.ts b/src/app/generated/tauri/events.ts index 0260d39ed0..ff0d638558 100644 --- a/src/app/generated/tauri/events.ts +++ b/src/app/generated/tauri/events.ts @@ -1,7 +1,7 @@ /** * Auto-generated TypeScript bindings for Tauri commands * Generated by tauri-typegen v0.5.0 - * Generated at: 2026-07-31T11:14:58.602356+00:00 + * Generated at: 2026-08-05T12:41:11.732167+00:00 * Generator: none * * Do not edit manually - regenerate using: cargo tauri-typegen generate diff --git a/src/app/generated/tauri/index.ts b/src/app/generated/tauri/index.ts index 727bb5d08e..0b97ef4c53 100644 --- a/src/app/generated/tauri/index.ts +++ b/src/app/generated/tauri/index.ts @@ -1,7 +1,7 @@ /** * Auto-generated TypeScript bindings for Tauri commands * Generated by tauri-typegen v0.5.0 - * Generated at: 2026-07-31T11:14:58.603222+00:00 + * Generated at: 2026-08-05T12:41:11.732351+00:00 * Generator: none * * Do not edit manually - regenerate using: cargo tauri-typegen generate diff --git a/src/app/generated/tauri/types.ts b/src/app/generated/tauri/types.ts index 5c41032aff..8bd687fe82 100644 --- a/src/app/generated/tauri/types.ts +++ b/src/app/generated/tauri/types.ts @@ -1,7 +1,7 @@ /** * Auto-generated TypeScript bindings for Tauri commands * Generated by tauri-typegen v0.5.0 - * Generated at: 2026-07-31T11:14:58.596290+00:00 + * Generated at: 2026-08-05T12:41:11.729365+00:00 * Generator: none * * Do not edit manually - regenerate using: cargo tauri-typegen generate diff --git a/src/app/pages/client/DesktopUpdater.test.tsx b/src/app/pages/client/DesktopUpdater.test.tsx index dcf3f8a6d1..ccae75e22c 100644 --- a/src/app/pages/client/DesktopUpdater.test.tsx +++ b/src/app/pages/client/DesktopUpdater.test.tsx @@ -4,6 +4,7 @@ import { useAtomValue, useSetAtom, Provider } from 'jotai'; import { globalBannersAtom } from '$state/globalBanners'; import { triggerUpdateCheckAtom } from '$state/desktopUpdate'; import { DesktopUpdatePill } from '$components/tauri/DesktopUpdatePill'; +import { getDebugLogger } from '$utils/debugLogger'; import { DesktopUpdater } from './DesktopUpdater'; const { checkFn } = vi.hoisted(() => ({ checkFn: vi.fn<() => Promise>() })); @@ -156,8 +157,9 @@ describe('DesktopUpdater', () => { it('retries when downloadAndInstall fails', async () => { const update = makeUpdate('4.0.0'); + const debugLog = vi.spyOn(getDebugLogger(), 'log'); update.downloadAndInstall - .mockRejectedValueOnce(new Error('eacces')) + .mockRejectedValueOnce({ message: 'permission denied' }) .mockResolvedValueOnce(undefined); checkFn.mockResolvedValue(update); @@ -178,6 +180,12 @@ describe('DesktopUpdater', () => { await waitFor(() => { expect(screen.getByRole('button', { name: 'Download & Install' })).toBeInTheDocument(); }); + expect(debugLog).toHaveBeenCalledWith( + 'error', + 'network', + 'DesktopUpdater', + 'Failed to install update: permission denied' + ); fireEvent.click(screen.getByRole('button', { name: 'Download & Install' })); await waitFor(() => expect(update.downloadAndInstall).toHaveBeenCalledTimes(2)); diff --git a/src/app/pages/client/DesktopUpdater.tsx b/src/app/pages/client/DesktopUpdater.tsx index 80a279d9c8..fe02f69c09 100644 --- a/src/app/pages/client/DesktopUpdater.tsx +++ b/src/app/pages/client/DesktopUpdater.tsx @@ -4,6 +4,7 @@ import type { Update } from '@tauri-apps/plugin-updater'; import { isDesktopTauri } from '$utils/platform'; import { autoUpdateCheckAtom } from '$state/autoUpdateCheck'; import { createLogger } from '$utils/debug'; +import { getDebugLogger } from '$utils/debugLogger'; import { hasCustomDesktopTitlebar } from '$utils/tauriTitlebar'; import { useDesktopSetting } from '$state/hooks/desktopSettings'; import { ArrowUp } from '$components/icons/phosphor'; @@ -19,6 +20,17 @@ import { const log = createLogger('DesktopUpdater'); const UPDATE_POLL_INTERVAL_MS = 300_000; // 5 minutes +const logUpdaterError = (message: string, error: unknown): void => { + log.error(message, error); + const detail = + error instanceof Error + ? error.message + : typeof error === 'object' && error !== null && 'message' in error + ? String(error.message) + : String(error); + getDebugLogger().log('error', 'network', 'DesktopUpdater', `${message}: ${detail}`); +}; + export function DesktopUpdater() { const autoUpdateCheck = useAtomValue(autoUpdateCheckAtom); const triggerCount = useAtomValue(triggerUpdateCheckAtom); @@ -92,7 +104,7 @@ export function DesktopUpdater() { setLastChecked(new Date().toISOString()); if (!hasCustomDesktopTitlebar(useCustomTitleBar)) setBannerVisible(true); } catch (err) { - log.error('Desktop update check failed', err); + logUpdaterError('Desktop update check failed', err); if (mounted) { if (!hasUpdateRef.current) { setPhase({ type: 'idle' }); @@ -179,7 +191,7 @@ export function DesktopUpdater() { pendingUpdateRef.current = null; closePendingUpdate(updateInfo); } catch (err) { - log.error('Failed to install update', err); + logUpdaterError('Failed to install update', err); setIsDownloading(false); setIsInstalling(false); installStartedRef.current = false; From 32792c11263a1e7061a1784439ff7c56d9147fcb Mon Sep 17 00:00:00 2001 From: 7w1 Date: Thu, 6 Aug 2026 10:57:34 -0500 Subject: [PATCH 2/2] chore: fix unrelated dependency version changes --- src-tauri/Cargo.lock | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index ddd0a10ad8..07e089fb66 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -168,7 +168,7 @@ version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -179,7 +179,7 @@ checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -1011,7 +1011,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" dependencies = [ "lazy_static", - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] @@ -1553,7 +1553,7 @@ dependencies = [ "libc", "option-ext", "redox_users", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -1585,7 +1585,7 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab8ecd87370524b461f8557c119c405552c396ed91fc0a8eec68679eab26f94a" dependencies = [ - "libloading 0.7.4", + "libloading 0.8.9", ] [[package]] @@ -1855,7 +1855,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -3653,7 +3653,7 @@ dependencies = [ "png 0.18.1", "serde", "thiserror 2.0.19", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -3777,7 +3777,7 @@ version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -4217,7 +4217,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d8fae84b431384b68627d0f9b3b1245fcf9f46f6c0e3dc902e9dce64edd1967" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.61.2", ] [[package]] @@ -4875,7 +4875,7 @@ dependencies = [ "once_cell", "socket2 0.6.5", "tracing", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -5294,7 +5294,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -5352,7 +5352,7 @@ dependencies = [ "security-framework", "security-framework-sys", "webpki-root-certs", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -6051,7 +6051,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -7070,7 +7070,7 @@ dependencies = [ "serde_with", "swift-rs", "thiserror 2.0.19", - "toml 0.9.12+spec-1.1.0", + "toml 1.1.3+spec-1.1.0", "url", "urlpattern", "uuid", @@ -7109,7 +7109,7 @@ dependencies = [ "getrandom 0.4.3", "once_cell", "rustix", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -7734,7 +7734,7 @@ dependencies = [ "png 0.18.1", "serde", "thiserror 2.0.19", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -7808,7 +7808,7 @@ checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" dependencies = [ "memoffset", "tempfile", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -8438,7 +8438,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.61.2", ] [[package]]