diff --git a/.changeset/hungry-adults-count.md b/.changeset/hungry-adults-count.md new file mode 100644 index 00000000000..9408425f9cb --- /dev/null +++ b/.changeset/hungry-adults-count.md @@ -0,0 +1,5 @@ +--- +'@tanstack/query-persist-client-core': minor +--- + +removeItem if deserialize fails diff --git a/packages/query-persist-client-core/src/createPersister.ts b/packages/query-persist-client-core/src/createPersister.ts index 55fccc5558b..254073f22ac 100644 --- a/packages/query-persist-client-core/src/createPersister.ts +++ b/packages/query-persist-client-core/src/createPersister.ts @@ -131,7 +131,13 @@ export function experimental_createQueryPersister({ try { const storedData = await storage.getItem(storageKey) if (storedData) { - const persistedQuery = await deserialize(storedData) + let persistedQuery: PersistedQuery + try { + persistedQuery = await deserialize(storedData) + } catch { + await storage.removeItem(storageKey) + return + } if (isExpiredOrBusted(persistedQuery)) { await storage.removeItem(storageKey) @@ -241,11 +247,17 @@ export function experimental_createQueryPersister({ async function persisterGc() { if (storage?.entries) { + const storageKeyPrefix = `${prefix}-` const entries = await storage.entries() for (const [key, value] of entries) { - if (key.startsWith(prefix)) { - const persistedQuery = await deserialize(value) - + if (key.startsWith(storageKeyPrefix)) { + let persistedQuery: PersistedQuery + try { + persistedQuery = await deserialize(value) + } catch { + await storage.removeItem(key) + continue + } if (isExpiredOrBusted(persistedQuery)) { await storage.removeItem(key) } @@ -265,11 +277,17 @@ export function experimental_createQueryPersister({ const { exact, queryKey } = filters if (storage?.entries) { + const storageKeyPrefix = `${prefix}-` const entries = await storage.entries() for (const [key, value] of entries) { - if (key.startsWith(prefix)) { - const persistedQuery = await deserialize(value) - + if (key.startsWith(storageKeyPrefix)) { + let persistedQuery: PersistedQuery + try { + persistedQuery = await deserialize(value) + } catch { + await storage.removeItem(key) + continue + } if (isExpiredOrBusted(persistedQuery)) { await storage.removeItem(key) continue