diff --git a/apps/desktop/src/main/lib/storage-ipcs.ts b/apps/desktop/src/main/lib/storage-ipcs.ts index 749985abd0a..f2c5c00f32b 100644 --- a/apps/desktop/src/main/lib/storage-ipcs.ts +++ b/apps/desktop/src/main/lib/storage-ipcs.ts @@ -7,17 +7,42 @@ import { store } from "./storage-manager"; */ export function registerStorageHandlers() { ipcMain.handle("storage:get", async (_event, input: { key: string }) => { - return store.get(input.key); + try { + if (!input || typeof input.key !== "string") { + console.error("[storage:get] Invalid input:", input); + return undefined; + } + return store.get(input.key); + } catch (error) { + console.error("[storage:get] Error getting value:", error); + return undefined; + } }); ipcMain.handle( "storage:set", async (_event, input: { key: string; value: unknown }) => { - store.set(input.key, input.value); + try { + if (!input || typeof input.key !== "string") { + console.error("[storage:set] Invalid input:", input); + return; + } + store.set(input.key, input.value); + } catch (error) { + console.error("[storage:set] Error setting value:", error); + } }, ); ipcMain.handle("storage:delete", async (_event, input: { key: string }) => { - store.delete(input.key); + try { + if (!input || typeof input.key !== "string") { + console.error("[storage:delete] Invalid input:", input); + return; + } + store.delete(input.key); + } catch (error) { + console.error("[storage:delete] Error deleting value:", error); + } }); } diff --git a/apps/desktop/src/preload/index.ts b/apps/desktop/src/preload/index.ts index 24d60a47952..3b7ad21fa8c 100644 --- a/apps/desktop/src/preload/index.ts +++ b/apps/desktop/src/preload/index.ts @@ -11,9 +11,9 @@ declare global { App: typeof API; ipcRenderer: typeof ipcRendererAPI; electronStore: { - get: (key: string) => unknown; - set: (key: string, value: unknown) => void; - delete: (key: string) => void; + get: (key: string) => Promise; + set: (key: string, value: unknown) => Promise; + delete: (key: string) => Promise; }; webUtils: { getPathForFile: (file: File) => string; diff --git a/apps/desktop/src/renderer/lib/electron-storage.ts b/apps/desktop/src/renderer/lib/electron-storage.ts index 455c7e7c5b9..2e5e06d8b56 100644 --- a/apps/desktop/src/renderer/lib/electron-storage.ts +++ b/apps/desktop/src/renderer/lib/electron-storage.ts @@ -6,14 +6,41 @@ import { createJSONStorage } from "zustand/middleware"; */ const electronStorageAdapter = { getItem: async (name: string): Promise => { - const value = await window.electronStore.get(name); - return value as string | null; + try { + const value = await window.electronStore.get(name); + + // Validate that the value is either null, undefined, or a string + if (value === null || value === undefined) { + return null; + } + + if (typeof value === "string") { + return value; + } + + // If we got a non-string value, it's corrupted data + console.error("[electronStorage] Corrupted data for key:", name, "Expected string, got:", typeof value); + return null; + } catch (error) { + console.error("[electronStorage] Failed to get item:", name, error); + return null; + } }, setItem: async (name: string, value: string): Promise => { - await window.electronStore.set(name, value); + try { + await window.electronStore.set(name, value); + } catch (error) { + console.error("[electronStorage] Failed to set item:", name, error); + // Don't throw - let Zustand handle the failure gracefully + } }, removeItem: async (name: string): Promise => { - await window.electronStore.delete(name); + try { + await window.electronStore.delete(name); + } catch (error) { + console.error("[electronStorage] Failed to remove item:", name, error); + // Don't throw - let Zustand handle the failure gracefully + } }, };