Add getAllFromIndex method for efficient sorted queries

- Add getAllFromIndex to StorageBackend interface for index-based queries
- Implement getAllFromIndex in IndexedDBStorageBackend using cursor API
- Update SessionsStore.getAllMetadata to use lastModified index
- Enables database-native sorting instead of fetching all keys and sorting in JS

Benefits:
- Much faster for large datasets (uses IndexedDB cursor with direction)
- Reduces memory usage (no need to load all keys first)
- Leverages existing indices for optimal performance
This commit is contained in:
Mario Zechner 2025-10-11 16:21:28 +02:00
parent b129154cc8
commit 46c1da9826
3 changed files with 38 additions and 5 deletions

View file

@ -96,6 +96,34 @@ export class IndexedDBStorageBackend implements StorageBackend {
}
}
async getAllFromIndex<T = unknown>(
storeName: string,
indexName: string,
direction: "asc" | "desc" = "asc",
): Promise<T[]> {
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<void> {
const db = await this.getDB();
const tx = db.transaction(storeName, "readwrite");