Created
July 7, 2020 17:08
-
-
Save schmidt-sebastian/22566fb61bfef994825bd24b45bcda02 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/packages/firestore/src/api/bundle.ts b/packages/firestore/src/api/bundle.ts | |
index c02f267d4..9f8df58c1 100644 | |
--- a/packages/firestore/src/api/bundle.ts | |
+++ b/packages/firestore/src/api/bundle.ts | |
@@ -18,7 +18,7 @@ | |
import * as firestore from '@firebase/firestore-types'; | |
import { Deferred } from '../util/promise'; | |
-export class LoadBundleTask implements firestore.LoadBundleTask { | |
+export class LoadBundleTask implements firestore.LoadBundleTask, PromiseLike<firestore.LoadBundleTaskProgress> { | |
private _progressResolver = new Deferred<void>(); | |
private _userProgressHandler?: ( | |
progress: firestore.LoadBundleTaskProgress | |
diff --git a/packages/firestore/src/core/firestore_client.ts b/packages/firestore/src/core/firestore_client.ts | |
index 0c42d132d..7cf5f24c4 100644 | |
--- a/packages/firestore/src/core/firestore_client.ts | |
+++ b/packages/firestore/src/core/firestore_client.ts | |
@@ -530,8 +530,9 @@ export class FirestoreClient { | |
} | |
const reader = new BundleReader(toByteStreamReader(content)); | |
const task = new LoadBundleTask(); | |
- this.asyncQueue.enqueueAndForget(() => { | |
- return loadBundle(this.syncEngine, reader, task); | |
+ this.asyncQueue.enqueueAndForget(async () => { | |
+ loadBundle(this.syncEngine, reader, task); | |
+ await task; | |
}); | |
return task; | |
diff --git a/packages/firestore/src/core/sync_engine.ts b/packages/firestore/src/core/sync_engine.ts | |
index 71edb14f7..c2ee6c132 100644 | |
--- a/packages/firestore/src/core/sync_engine.ts | |
+++ b/packages/firestore/src/core/sync_engine.ts | |
@@ -1386,19 +1386,16 @@ export function newMultiTabSyncEngine( | |
* @param bundleReader Bundle to load into the SDK. | |
* @param task LoadBundleTask used to update the loading progress to public API. | |
*/ | |
-export async function loadBundle( | |
+export function loadBundle( | |
syncEngine: SyncEngine, | |
bundleReader: BundleReader, | |
task: LoadBundleTask | |
-): Promise<void> { | |
+) : void { | |
const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl); | |
syncEngineImpl.assertSubscribed('loadBundle()'); | |
- try { | |
- await loadBundleImpl(syncEngineImpl, bundleReader, task); | |
- } catch (e) { | |
- task._failedWith(e); | |
- } | |
+ // tslint:disable-next-line:no-floating-promises | |
+ loadBundleImpl(syncEngineImpl, bundleReader, task); | |
} | |
async function loadBundleImpl( | |
@@ -1406,42 +1403,46 @@ async function loadBundleImpl( | |
reader: BundleReader, | |
task: LoadBundleTask | |
): Promise<void> { | |
- const metadata = await reader.getMetadata(); | |
- const skip = await hasNewerBundle(syncEngine.localStore, metadata); | |
- if (skip) { | |
- await reader.close(); | |
- task._completeWith(skipLoadingProgress(metadata)); | |
- return; | |
- } | |
+ try { | |
+ const metadata = await reader.getMetadata(); | |
+ const skip = await hasNewerBundle(syncEngine.localStore, metadata); | |
+ if (skip) { | |
+ await reader.close(); | |
+ task._completeWith(skipLoadingProgress(metadata)); | |
+ return; | |
+ } | |
- task._updateProgress(initialProgress(metadata)); | |
+ task._updateProgress(initialProgress(metadata)); | |
- const loader = new BundleLoader(metadata, syncEngine.localStore); | |
- let element = await reader.nextElement(); | |
- while (element) { | |
- debugAssert( | |
- !element.payload.metadata, | |
- 'Unexpected BundleMetadata element.' | |
- ); | |
- const progress = await loader.addSizedElement(element); | |
- if (progress) { | |
- task._updateProgress(progress); | |
+ const loader = new BundleLoader(metadata, syncEngine.localStore); | |
+ let element = await reader.nextElement(); | |
+ while (element) { | |
+ debugAssert( | |
+ !element.payload.metadata, | |
+ 'Unexpected BundleMetadata element.' | |
+ ); | |
+ const progress = await loader.addSizedElement(element); | |
+ if (progress) { | |
+ task._updateProgress(progress); | |
+ } | |
+ | |
+ element = await reader.nextElement(); | |
} | |
- element = await reader.nextElement(); | |
- } | |
+ const result = await loader.complete(); | |
+ if (result.changedDocs) { | |
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises | |
+ syncEngine.emitNewSnapsAndNotifyLocalStore( | |
+ result.changedDocs, | |
+ /* remoteEvent */ undefined, | |
+ /* fromBundle */ true | |
+ ); | |
+ } | |
- const result = await loader.complete(); | |
- if (result.changedDocs) { | |
- // eslint-disable-next-line @typescript-eslint/no-floating-promises | |
- syncEngine.emitNewSnapsAndNotifyLocalStore( | |
- result.changedDocs, | |
- /* remoteEvent */ undefined, | |
- /* fromBundle */ true | |
- ); | |
+ // Save metadata, so loading the same bundle will skip. | |
+ await saveBundle(syncEngine.localStore, metadata); | |
+ task._completeWith(result.progress); | |
+ } catch (e) { | |
+ task._failedWith(e); | |
} | |
- | |
- // Save metadata, so loading the same bundle will skip. | |
- await saveBundle(syncEngine.localStore, metadata); | |
- task._completeWith(result.progress); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment