From ce72bed0a5a6ce7ed6ab674e707009694c20ff80 Mon Sep 17 00:00:00 2001 From: Sebastian Schmidt Date: Mon, 1 Oct 2018 14:23:52 -0700 Subject: [PATCH 1/5] Fix map() --- .../src/local/persistence_promise.ts | 24 ++++++-- .../unit/local/persistence_promise.test.ts | 60 +++++++++++++++++++ .../test/unit/local/simple_db.test.ts | 2 +- 3 files changed, 81 insertions(+), 5 deletions(-) diff --git a/packages/firestore/src/local/persistence_promise.ts b/packages/firestore/src/local/persistence_promise.ts index c79b555bc90..c73b746f99e 100644 --- a/packages/firestore/src/local/persistence_promise.ts +++ b/packages/firestore/src/local/persistence_promise.ts @@ -200,10 +200,26 @@ export class PersistencePromise { static map(all: Iterable>): PersistencePromise { const results: R[] = []; - return PersistencePromise.forEach(all, result => { - results.push(result); - return PersistencePromise.resolve(); - }).next(() => results); + const promises: Array> = []; + + const it = all[Symbol.iterator](); + let result = it.next(); + let count = 0; + while (!result.done) { + const value = result.value; + const index = count; + + promises.push( + value.next(val => { + results[index] = val; + }) + ); + + result = it.next(); + ++count; + } + + return PersistencePromise.waitFor(promises).next(() => results); } static forEach( diff --git a/packages/firestore/test/unit/local/persistence_promise.test.ts b/packages/firestore/test/unit/local/persistence_promise.test.ts index a02c2c9c739..a216097010a 100644 --- a/packages/firestore/test/unit/local/persistence_promise.test.ts +++ b/packages/firestore/test/unit/local/persistence_promise.test.ts @@ -16,6 +16,12 @@ import { expect } from 'chai'; import { PersistencePromise } from '../../../src/local/persistence_promise'; +import { Deferred } from '../../../src/util/promise'; + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; + +chai.use(chaiAsPromised); describe('PersistencePromise', () => { function async(value: R): PersistencePromise { @@ -214,6 +220,17 @@ describe('PersistencePromise', () => { .toPromise(); }); + it('propagates error for waitFor()', () => { + const resolved = PersistencePromise.resolve('resolved'); + const rejected: PersistencePromise = PersistencePromise.reject( + new Error('rejected') + ); + + const p = PersistencePromise.waitFor([resolved, rejected]).toPromise(); + + return expect(p).to.be.eventually.rejectedWith('rejected'); + }); + it('executes forEach in order', async () => { let result = ''; await PersistencePromise.forEach(['a', 'b', 'c'], el => { @@ -222,4 +239,47 @@ describe('PersistencePromise', () => { }).toPromise(); expect(result).to.equal('abc'); }); + + it('propagates error for forEach()', () => { + const p = PersistencePromise.forEach([true, false], success => { + if (success) { + return PersistencePromise.resolve(); + } else { + return PersistencePromise.reject(new Error('rejected')); + } + }).toPromise(); + + return expect(p).to.be.eventually.rejectedWith('rejected'); + }); + + it('maintains order for map()', async () => { + const deferred = new Deferred(); + + const pending = new PersistencePromise(resolve => { + return deferred.promise.then(() => resolve('first')); + }); + const resolved = PersistencePromise.resolve('second'); + + const p = PersistencePromise.map([pending, resolved]).next(results => { + expect(results).to.deep.eq(['first', 'second']); + return PersistencePromise.resolve(); + }); + + setImmediate(() => { + deferred.resolve(); + }); + + await p.toPromise(); + }); + + it('propagates error for map()', () => { + const resolved = PersistencePromise.resolve('resolved'); + const rejected: PersistencePromise = PersistencePromise.reject( + new Error('rejected') + ); + + const p = PersistencePromise.map([resolved, rejected]).toPromise(); + + return expect(p).to.be.eventually.rejectedWith('rejected'); + }); }); diff --git a/packages/firestore/test/unit/local/simple_db.test.ts b/packages/firestore/test/unit/local/simple_db.test.ts index 862effb0ec9..06d2a751526 100644 --- a/packages/firestore/test/unit/local/simple_db.test.ts +++ b/packages/firestore/test/unit/local/simple_db.test.ts @@ -488,7 +488,7 @@ describe('SimpleDb', () => { for (let i = 0; i < 1000; ++i) { promises.push(store.get(i)); } - return PersistencePromise.map(promises).next(() => { + return PersistencePromise.waitFor(promises).next(() => { const end = new Date().getTime(); // tslint:disable-next-line:no-console console.log(`Reading: ${end - start} ms`); From c62b05aa12963b77be571f412552681609a34230 Mon Sep 17 00:00:00 2001 From: Sebastian Schmidt Date: Mon, 1 Oct 2018 14:32:45 -0700 Subject: [PATCH 2/5] [AUTOMATED]: Prettier Code Styling --- packages/firestore/test/unit/local/persistence_promise.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/firestore/test/unit/local/persistence_promise.test.ts b/packages/firestore/test/unit/local/persistence_promise.test.ts index a216097010a..c27fda5159f 100644 --- a/packages/firestore/test/unit/local/persistence_promise.test.ts +++ b/packages/firestore/test/unit/local/persistence_promise.test.ts @@ -279,7 +279,6 @@ describe('PersistencePromise', () => { ); const p = PersistencePromise.map([resolved, rejected]).toPromise(); - return expect(p).to.be.eventually.rejectedWith('rejected'); }); }); From 204a11d8e10bef5020024ddadbca43232349dbb6 Mon Sep 17 00:00:00 2001 From: Sebastian Schmidt Date: Mon, 1 Oct 2018 15:11:28 -0700 Subject: [PATCH 3/5] Fix type for forEach --- packages/firestore/src/local/persistence_promise.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/firestore/src/local/persistence_promise.ts b/packages/firestore/src/local/persistence_promise.ts index c73b746f99e..d5ab49f271d 100644 --- a/packages/firestore/src/local/persistence_promise.ts +++ b/packages/firestore/src/local/persistence_promise.ts @@ -224,7 +224,7 @@ export class PersistencePromise { static forEach( all: Iterable, - callback: (T) => PersistencePromise + callback: (elem:T) => PersistencePromise ): PersistencePromise { const it = all[Symbol.iterator](); From 77c2d65bebbc9e2a5f703c7bb67cfb85ac42ce06 Mon Sep 17 00:00:00 2001 From: Sebastian Schmidt Date: Mon, 1 Oct 2018 15:30:04 -0700 Subject: [PATCH 4/5] Compile fix --- .../firestore/test/unit/local/indexeddb_persistence.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/firestore/test/unit/local/indexeddb_persistence.test.ts b/packages/firestore/test/unit/local/indexeddb_persistence.test.ts index f1631eb0a8e..f60c4143fea 100644 --- a/packages/firestore/test/unit/local/indexeddb_persistence.test.ts +++ b/packages/firestore/test/unit/local/indexeddb_persistence.test.ts @@ -416,7 +416,7 @@ describe('IndexedDbSchema: createOrUpgradeDb', () => { return PersistencePromise.forEach(testMutation.mutations, write => { const indexKey = DbDocumentMutation.key( testMutation.userId, - path(write.update.name, 5), + path(write.update!.name!, 5), testMutation.batchId ); return documentMutationStore.put( From 5f9ff817974b5559a3b2c0116811748d28fdea3d Mon Sep 17 00:00:00 2001 From: Sebastian Schmidt Date: Mon, 1 Oct 2018 15:30:39 -0700 Subject: [PATCH 5/5] [AUTOMATED]: Prettier Code Styling --- packages/firestore/src/local/persistence_promise.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/firestore/src/local/persistence_promise.ts b/packages/firestore/src/local/persistence_promise.ts index d5ab49f271d..dae9545ff5f 100644 --- a/packages/firestore/src/local/persistence_promise.ts +++ b/packages/firestore/src/local/persistence_promise.ts @@ -224,7 +224,7 @@ export class PersistencePromise { static forEach( all: Iterable, - callback: (elem:T) => PersistencePromise + callback: (elem: T) => PersistencePromise ): PersistencePromise { const it = all[Symbol.iterator]();