Skip to content

Commit 6c37162

Browse files
Handle IndexedDb errors in unsubscribe callback
Addresses one of the three problems I found during randomized testing.
1 parent 0395a1d commit 6c37162

File tree

2 files changed

+7
-9
lines changed

2 files changed

+7
-9
lines changed

packages/firestore/src/core/event_manager.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -102,21 +102,19 @@ export class EventManager implements SyncEngineListener {
102102

103103
async unlisten(listener: QueryListener): Promise<void> {
104104
const query = listener.query;
105-
let lastListen = false;
106105

107106
const queryInfo = this.queries.get(query);
108107
if (queryInfo) {
109108
const i = queryInfo.listeners.indexOf(listener);
110109
if (i >= 0) {
111-
queryInfo.listeners.splice(i, 1);
112-
lastListen = queryInfo.listeners.length === 0;
110+
if (queryInfo.listeners.length > 1) {
111+
queryInfo.listeners.splice(i, 1);
112+
} else {
113+
await this.syncEngine.unlisten(query);
114+
this.queries.delete(query);
115+
}
113116
}
114117
}
115-
116-
if (lastListen) {
117-
this.queries.delete(query);
118-
return this.syncEngine.unlisten(query);
119-
}
120118
}
121119

122120
onWatchChange(viewSnaps: ViewSnapshot[]): void {

packages/firestore/src/core/firestore_client.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,7 @@ export class FirestoreClient {
404404
if (this.clientTerminated) {
405405
return;
406406
}
407-
this.asyncQueue.enqueueAndForget(() => {
407+
this.asyncQueue.enqueueRetryable(() => {
408408
return this.eventMgr.unlisten(listener);
409409
});
410410
}

0 commit comments

Comments
 (0)