2026-09-02 13:27:35 +00:00
|
|
|
import type {Page} from "@playwright/test"
|
|
|
|
|
import type {TrustedEvent} from "@welshman/util"
|
|
|
|
|
|
2026-09-24 18:23:21 +00:00
|
|
|
// Must match the database name and the `events` table in src/app/storage.ts.
|
2026-09-02 13:27:35 +00:00
|
|
|
const databaseName = (pubkey: string) => `flotilla-9gl-${pubkey}`
|
|
|
|
|
|
2026-09-24 18:23:21 +00:00
|
|
|
/** What this user's client has written to disk. Events reach indexeddb in three-second batches. */
|
2026-09-02 13:27:35 +00:00
|
|
|
export const readCachedEvents = (page: Page, pubkey: string): Promise<TrustedEvent[]> =>
|
|
|
|
|
page.evaluate(async name => {
|
|
|
|
|
const open = await new Promise<IDBDatabase>((resolve, reject) => {
|
|
|
|
|
const request = indexedDB.open(name)
|
|
|
|
|
|
|
|
|
|
request.onsuccess = () => resolve(request.result)
|
|
|
|
|
request.onerror = () => reject(request.error)
|
|
|
|
|
})
|
|
|
|
|
|
2026-09-24 18:23:21 +00:00
|
|
|
// An unversioned open creates the database when it is missing, so a client with no writes has no store.
|
2026-09-02 13:27:35 +00:00
|
|
|
if (!open.objectStoreNames.contains("events")) {
|
|
|
|
|
open.close()
|
|
|
|
|
|
|
|
|
|
return []
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const items = await new Promise<{event: TrustedEvent}[]>((resolve, reject) => {
|
|
|
|
|
const request = open.transaction("events", "readonly").objectStore("events").getAll()
|
|
|
|
|
|
|
|
|
|
request.onsuccess = () => resolve(request.result)
|
|
|
|
|
request.onerror = () => reject(request.error)
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
open.close()
|
|
|
|
|
|
|
|
|
|
return items.map(item => item.event)
|
|
|
|
|
}, databaseName(pubkey))
|