diff --git a/packages/web-ui/src/storage/backends/indexeddb-storage-backend.ts b/packages/web-ui/src/storage/backends/indexeddb-storage-backend.ts index 5c603df0..1b51946f 100644 --- a/packages/web-ui/src/storage/backends/indexeddb-storage-backend.ts +++ b/packages/web-ui/src/storage/backends/indexeddb-storage-backend.ts @@ -96,6 +96,34 @@ export class IndexedDBStorageBackend implements StorageBackend { } } + async getAllFromIndex( + storeName: string, + indexName: string, + direction: "asc" | "desc" = "asc", + ): Promise { + const db = await this.getDB(); + const tx = db.transaction(storeName, "readonly"); + const store = tx.objectStore(storeName); + const index = store.index(indexName); + + return new Promise((resolve, reject) => { + const results: T[] = []; + const request = index.openCursor(null, direction === "desc" ? "prev" : "next"); + + request.onsuccess = () => { + const cursor = request.result; + if (cursor) { + results.push(cursor.value as T); + cursor.continue(); + } else { + resolve(results); + } + }; + + request.onerror = () => reject(request.error); + }); + } + async clear(storeName: string): Promise { const db = await this.getDB(); const tx = db.transaction(storeName, "readwrite"); diff --git a/packages/web-ui/src/storage/stores/sessions-store.ts b/packages/web-ui/src/storage/stores/sessions-store.ts index d6a05a03..0dd8f60b 100644 --- a/packages/web-ui/src/storage/stores/sessions-store.ts +++ b/packages/web-ui/src/storage/stores/sessions-store.ts @@ -42,11 +42,8 @@ export class SessionsStore extends Store { } async getAllMetadata(): Promise { - const keys = await this.getBackend().keys("sessions-metadata"); - const metadata = await Promise.all( - keys.map((key) => this.getBackend().get("sessions-metadata", key)), - ); - return metadata.filter((m): m is SessionMetadata => m !== null); + // Use the lastModified index to get sessions sorted by most recent first + return this.getBackend().getAllFromIndex("sessions-metadata", "lastModified", "desc"); } async delete(id: string): Promise { diff --git a/packages/web-ui/src/storage/types.ts b/packages/web-ui/src/storage/types.ts index c1bf1df5..cec632fb 100644 --- a/packages/web-ui/src/storage/types.ts +++ b/packages/web-ui/src/storage/types.ts @@ -48,6 +48,14 @@ export interface StorageBackend { */ keys(storeName: string, prefix?: string): Promise; + /** + * Get all values from a specific store, ordered by an index. + * @param storeName - The store to query + * @param indexName - The index to use for ordering + * @param direction - Sort direction ("asc" or "desc") + */ + getAllFromIndex(storeName: string, indexName: string, direction?: "asc" | "desc"): Promise; + /** * Clear all data from a specific store. */