diff --git a/.changeset/late-tables-juggle.md b/.changeset/late-tables-juggle.md new file mode 100644 index 00000000000..c0b5148cd52 --- /dev/null +++ b/.changeset/late-tables-juggle.md @@ -0,0 +1,5 @@ +--- +"@firebase/firestore": patch +--- + +Some database operations now use `IndexedDB.getAll()` on browsers where support is availbe. diff --git a/packages/firestore/src/local/simple_db.ts b/packages/firestore/src/local/simple_db.ts index f03ac114dd5..fabd1c4367e 100644 --- a/packages/firestore/src/local/simple_db.ts +++ b/packages/firestore/src/local/simple_db.ts @@ -645,13 +645,28 @@ export class SimpleDbStore< indexOrRange?: string | IDBKeyRange, range?: IDBKeyRange ): PersistencePromise { - const cursor = this.cursor(this.options(indexOrRange, range)); - const results: ValueType[] = []; - return this.iterateCursor(cursor, (key, value) => { - results.push(value); - }).next(() => { - return results; - }); + const iterateOptions = this.options(indexOrRange, range); + // Use `getAll()` if the browser supports IndexedDB v3, as it is roughly + // 20% faster. Unfortunately, getAll() does not support custom indices. + if (!iterateOptions.index && typeof this.store.getAll === 'function') { + const request = this.store.getAll(iterateOptions.range); + return new PersistencePromise((resolve, reject) => { + request.onerror = (event: Event) => { + reject((event.target as IDBRequest).error!); + }; + request.onsuccess = (event: Event) => { + resolve((event.target as IDBRequest).result); + }; + }); + } else { + const cursor = this.cursor(iterateOptions); + const results: ValueType[] = []; + return this.iterateCursor(cursor, (key, value) => { + results.push(value); + }).next(() => { + return results; + }); + } } deleteAll(): PersistencePromise;