char-slop/berry

multipurpose self-modifiable agentic harness

git clone https://git.t4t.associates/char-slop/berry

Charlotte Somrestore queued messages to the composer on abort3d23fd2

main
1.4 KiB34 linesraw
1let database: Promise<IDBDatabase> | undefined;
2
3function open(): Promise<IDBDatabase> {
4  return database ??= new Promise((resolve, reject) => {
5    if (typeof indexedDB === "undefined") {
6      return reject(new Error("Your browser cannot save image drafts"));
7    }
8    const request = indexedDB.open("berry.drafts", 1);
9    request.onupgradeneeded = () => request.result.createObjectStore("images");
10    request.onerror = () => reject(request.error);
11    request.onblocked = () => reject(new Error("Close other berry tabs to enable image drafts"));
12    request.onsuccess = () => {
13      request.result.onversionchange = () => request.result.close();
14      resolve(request.result);
15    };
16  });
17}
18
19/** Browser-local drafts, sharing a store with the original image drafts. */
20export async function storedDraft<T>(key: string, value?: readonly T[]): Promise<T[]> {
21  const db = await open();
22  return await new Promise((resolve, reject) => {
23    const transaction = db.transaction("images", value === undefined ? "readonly" : "readwrite");
24    const store = transaction.objectStore("images");
25    const request = value === undefined
26      ? store.get(key)
27      : value.length === 0
28      ? store.delete(key)
29      : store.put(value, key);
30    transaction.oncomplete = () => resolve(value === undefined ? request.result ?? [] : []);
31    transaction.onabort = () =>
32      reject(transaction.error ?? new Error("Image draft storage failed"));
33  });
34}