Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save schmidt-sebastian/22566fb61bfef994825bd24b45bcda02 to your computer and use it in GitHub Desktop.
Save schmidt-sebastian/22566fb61bfef994825bd24b45bcda02 to your computer and use it in GitHub Desktop.
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