@@ -645,13 +645,29 @@ export class SimpleDbStore<
645
645
indexOrRange ?: string | IDBKeyRange ,
646
646
range ?: IDBKeyRange
647
647
) : PersistencePromise < ValueType [ ] > {
648
- const cursor = this . cursor ( this . options ( indexOrRange , range ) ) ;
649
- const results : ValueType [ ] = [ ] ;
650
- return this . iterateCursor ( cursor , ( key , value ) => {
651
- results . push ( value ) ;
652
- } ) . next ( ( ) => {
653
- return results ;
654
- } ) ;
648
+ const iterateOptions = this . options ( indexOrRange , range ) ;
649
+ // Use `getAll()` if the browser supports IndexedDB v3, as it is roughly
650
+ // 20% faster. Unfortunately, getAll() does not support custom indices.
651
+ if ( ! iterateOptions . index && typeof this . store . getAll === 'function'
652
+ ) {
653
+ const request = this . store . getAll ( iterateOptions . range ) ;
654
+ return new PersistencePromise ( ( resolve , reject ) => {
655
+ request . onerror = ( event : Event ) => {
656
+ reject ( ( event . target as IDBRequest ) . error ! ) ;
657
+ } ;
658
+ request . onsuccess = ( event : Event ) => {
659
+ resolve ( ( event . target as IDBRequest ) . result ) ;
660
+ } ;
661
+ } ) ;
662
+ } else {
663
+ const cursor = this . cursor ( iterateOptions ) ;
664
+ const results : ValueType [ ] = [ ] ;
665
+ return this . iterateCursor ( cursor , ( key , value ) => {
666
+ results . push ( value ) ;
667
+ } ) . next ( ( ) => {
668
+ return results ;
669
+ } ) ;
670
+ }
655
671
}
656
672
657
673
deleteAll ( ) : PersistencePromise < void > ;
0 commit comments