let database: Promise | undefined; function open(): Promise { return database ??= new Promise((resolve, reject) => { if (typeof indexedDB === "undefined") { return reject(new Error("Your browser cannot save image drafts")); } const request = indexedDB.open("berry.drafts", 1); request.onupgradeneeded = () => request.result.createObjectStore("images"); request.onerror = () => reject(request.error); request.onblocked = () => reject(new Error("Close other berry tabs to enable image drafts")); request.onsuccess = () => { request.result.onversionchange = () => request.result.close(); resolve(request.result); }; }); } /** Browser-local drafts, sharing a store with the original image drafts. */ export async function storedDraft(key: string, value?: readonly T[]): Promise { const db = await open(); return await new Promise((resolve, reject) => { const transaction = db.transaction("images", value === undefined ? "readonly" : "readwrite"); const store = transaction.objectStore("images"); const request = value === undefined ? store.get(key) : value.length === 0 ? store.delete(key) : store.put(value, key); transaction.oncomplete = () => resolve(value === undefined ? request.result ?? [] : []); transaction.onabort = () => reject(transaction.error ?? new Error("Image draft storage failed")); }); }