diff --git a/client/packages/core/__tests__/src/utils/PersistedObject.test.ts b/client/packages/core/__tests__/src/utils/PersistedObject.test.ts index f6f3069545..eff170f413 100644 --- a/client/packages/core/__tests__/src/utils/PersistedObject.test.ts +++ b/client/packages/core/__tests__/src/utils/PersistedObject.test.ts @@ -1,5 +1,5 @@ import 'fake-indexeddb/auto'; -import { test, expect, describe } from 'vitest'; +import { test, expect, describe, vi } from 'vitest'; import { PersistedObject } from '../../../src/utils/PersistedObject'; import { IndexedDBStorage } from '../../../src'; import { randomUUID } from 'crypto'; @@ -423,3 +423,24 @@ test('IndexedDBStorage recovers when the database connection closes', async () = await idb.removeItem('key4'); expect(await idb.getItem('key4')).toBe(null); }); + +test('IndexedDBStorage explicitly commits write transactions', async () => { + const commitSpy = vi.spyOn(IDBTransaction.prototype, 'commit'); + try { + const idb = new IndexedDBStorage(randomUUID(), 'kv'); + + await idb.setItem('key1', 'value1'); + await idb.multiSet([ + ['key2', 'value2'], + ['key3', 'value3'], + ]); + await idb.removeItem('key3'); + + expect(commitSpy).toHaveBeenCalledTimes(3); + expect(await idb.getItem('key1')).toBe('value1'); + expect(await idb.getItem('key2')).toBe('value2'); + expect(await idb.getItem('key3')).toBe(null); + } finally { + commitSpy.mockRestore(); + } +}); diff --git a/client/packages/core/src/IndexedDBStorage.ts b/client/packages/core/src/IndexedDBStorage.ts index 36299ec17c..f55b622dee 100644 --- a/client/packages/core/src/IndexedDBStorage.ts +++ b/client/packages/core/src/IndexedDBStorage.ts @@ -300,6 +300,7 @@ export default class IndexedDBStorage extends StoreInterface { transaction.oncomplete = () => resolve(); transaction.onerror = () => reject(transaction.error); transaction.onabort = () => reject(transaction.error); + transaction.commit?.(); }); }); } @@ -316,6 +317,7 @@ export default class IndexedDBStorage extends StoreInterface { transaction.oncomplete = () => resolve(); transaction.onerror = () => reject(transaction.error); transaction.onabort = () => reject(transaction.error); + transaction.commit?.(); }); }); } @@ -330,6 +332,7 @@ export default class IndexedDBStorage extends StoreInterface { transaction.oncomplete = () => resolve(); transaction.onerror = () => reject(transaction.error); transaction.onabort = () => reject(transaction.error); + transaction.commit?.(); }); }); } diff --git a/client/packages/version/src/version.ts b/client/packages/version/src/version.ts index 78c9301904..edaa696c85 100644 --- a/client/packages/version/src/version.ts +++ b/client/packages/version/src/version.ts @@ -2,6 +2,6 @@ // Update the version here and merge your code to main to // publish a new version of all of the packages to npm. -const version = 'v1.0.63'; +const version = 'v1.0.64'; export { version };