diff --git a/packages/desktop/src/main/storage/drafts.test.ts b/packages/desktop/src/main/storage/drafts.test.ts index def7fdefb5..0fd08c300b 100644 --- a/packages/desktop/src/main/storage/drafts.test.ts +++ b/packages/desktop/src/main/storage/drafts.test.ts @@ -14,3 +14,16 @@ test("flushes the latest buffered draft and stores blobs", () => { expect(store.getBlob(id)).toEqual(bytes) store.close() }) + +test("allows repeated flushes until closing", () => { + const store = createDesktopDraftStore(":memory:") + store.set("prompt", "first") + store.flush() + store.set("prompt", "draft") + store.flush() + expect(store.get("prompt")).toBe("draft") + store.close() + + expect(() => store.flush()).not.toThrow() + expect(() => store.close()).not.toThrow() +}) diff --git a/packages/desktop/src/main/storage/drafts.ts b/packages/desktop/src/main/storage/drafts.ts index 839eff26af..0700614722 100644 --- a/packages/desktop/src/main/storage/drafts.ts +++ b/packages/desktop/src/main/storage/drafts.ts @@ -36,11 +36,14 @@ export function createDesktopDraftStore(filename: string) { .forEach(({ id }) => db.delete(blobs).where(eq(blobs.id, id)).run()) const pending = new Map() let timer: ReturnType | undefined + let closed = false const flush = () => { if (timer) clearTimeout(timer) timer = undefined + if (closed) return const writes = [...pending] pending.clear() + if (!writes.length) return db.transaction((tx) => { writes.forEach(([key, value]) => { if (value === null) tx.delete(documents).where(eq(documents.key, key)).run() @@ -75,7 +78,9 @@ export function createDesktopDraftStore(filename: string) { getBlob: (id: string) => db.select({ data: blobs.data }).from(blobs).where(eq(blobs.id, id)).get()?.data ?? null, flush, close() { + if (closed) return flush() + closed = true native.close() }, }