feat: flush IndexedDB cache on DATA_VERSION bump

The idempotent upgrade only created missing object stores, so bumping
DATA_VERSION no longer reset bad or stale data — it just added stores. This
restores a bump as a true global cache flush: the upgrade now clears every
existing store before recreating any missing ones, so shipping a version
bump forces all clients to refetch fresh on next boot.

Gated on oldVersion > 0 so fresh installs skip the flush, and clearing
before creating means only pre-existing stores are touched. This is the
break-glass lever for the one non-self-healing failure mode (non-empty
store holding wrong-shaped data paired with a matching cache key), e.g.
after a serializer shape change shipped without a version bump.
This commit is contained in:
Shivam Mishra
2026-05-27 12:31:51 +05:30
parent f4c5f45327
commit 5cb517612f
2 changed files with 17 additions and 7 deletions
@@ -13,7 +13,17 @@ export class DataManager {
if (this.db) return this.db;
const dbName = `cw-store-${this.accountId}`;
this.db = await openDB(dbName, DATA_VERSION, {
upgrade(db) {
upgrade(db, oldVersion, _newVersion, tx) {
// Flush data carried over from a previous schema version so a
// DATA_VERSION bump acts as a global cache reset. oldVersion === 0 on
// first install, so fresh devices skip this. Clearing before creating
// means we only ever clear stores that pre-existed this upgrade.
if (oldVersion > 0) {
[...db.objectStoreNames].forEach(name =>
tx.objectStore(name).clear()
);
}
if (!db.objectStoreNames.contains('cache-keys')) {
db.createObjectStore('cache-keys');
}
@@ -1,9 +1,9 @@
// Bump DATA_VERSION whenever a new object store is added to the IDB schema
// (the `upgrade()` callback in DataManager only runs when the stored DB
// version is less than the requested version). The upgrade body itself is
// idempotent — it conditionally creates each store via
// `objectStoreNames.contains(name)` — so a single bump is enough to add any
// number of new stores without losing existing data.
// Bump DATA_VERSION to (a) add new object stores to the IDB schema or (b)
// flush bad/stale cache globally. The `upgrade()` callback in DataManager runs
// only when the stored DB version is less than the requested version; on any
// such bump it clears every existing store (a full cache reset) and then
// idempotently creates any missing stores. So bump this whenever a cached
// model's serializer shape changes, or to force all clients to refetch.
//
// Wednesday, 21 May 2026 — bumped to add canned_response + account_user stores
export const DATA_VERSION = '1747785600';