Skip to content

Commit 549d695

Browse files
committed
Revert "firestore: minor refactor of listener registration of "versionchange" indexedb events (#9087)"
This reverts commit f73e08b.
1 parent 5200f7b commit 549d695

File tree

5 files changed

+33
-85
lines changed

5 files changed

+33
-85
lines changed

packages/firestore/src/core/firestore_client.ts

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -231,23 +231,11 @@ export async function setOfflineComponentProvider(
231231
}
232232
});
233233

234-
offlineComponentProvider.persistence.setDatabaseDeletedListener(() => {
235-
logWarn('Terminating Firestore due to IndexedDb database deletion');
236-
client
237-
.terminate()
238-
.then(() => {
239-
logDebug(
240-
'Terminating Firestore due to IndexedDb database deletion ' +
241-
'completed successfully'
242-
);
243-
})
244-
.catch(error => {
245-
logWarn(
246-
'Terminating Firestore due to IndexedDb database deletion failed',
247-
error
248-
);
249-
});
250-
});
234+
// When a user calls clearPersistence() in one client, all other clients
235+
// need to be terminated to allow the delete to succeed.
236+
offlineComponentProvider.persistence.setDatabaseDeletedListener(() =>
237+
client.terminate()
238+
);
251239

252240
client._offlineComponents = offlineComponentProvider;
253241
}

packages/firestore/src/local/indexeddb_persistence.ts

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,7 @@ import { IndexedDbTargetCache } from './indexeddb_target_cache';
5858
import { getStore, IndexedDbTransaction } from './indexeddb_transaction';
5959
import { LocalSerializer } from './local_serializer';
6060
import { LruParams } from './lru_garbage_collector';
61-
import {
62-
DatabaseDeletedListener,
63-
Persistence,
64-
PrimaryStateListener
65-
} from './persistence';
61+
import { Persistence, PrimaryStateListener } from './persistence';
6662
import { PersistencePromise } from './persistence_promise';
6763
import {
6864
PersistenceTransaction,
@@ -328,25 +324,20 @@ export class IndexedDbPersistence implements Persistence {
328324
}
329325

330326
/**
331-
* Registers a listener that gets called when the underlying database receives
332-
* an event indicating that it either has been deleted or is pending deletion
333-
* and must be closed.
334-
*
335-
* For example, this callback will be called in the case that multi-tab
336-
* IndexedDB persistence is in use and another tab calls
337-
* clearIndexedDbPersistence(). In that case, this Firestore instance must
338-
* close its IndexedDB connection in order to allow the deletion initiated by
339-
* the other tab to proceed.
340-
*
341-
* This method may only be called once; subsequent invocations will result in
342-
* an exception, refusing to supersede the previously-registered listener.
327+
* Registers a listener that gets called when the database receives a
328+
* version change event indicating that it has deleted.
343329
*
344330
* PORTING NOTE: This is only used for Web multi-tab.
345331
*/
346332
setDatabaseDeletedListener(
347-
databaseDeletedListener: DatabaseDeletedListener
333+
databaseDeletedListener: () => Promise<void>
348334
): void {
349-
this.simpleDb.setDatabaseDeletedListener(databaseDeletedListener);
335+
this.simpleDb.setVersionChangeListener(async event => {
336+
// Check if an attempt is made to delete IndexedDB.
337+
if (event.newVersion === null) {
338+
await databaseDeletedListener();
339+
}
340+
});
350341
}
351342

352343
/**

packages/firestore/src/local/persistence.ts

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,6 @@ export interface ReferenceDelegate {
9898
): PersistencePromise<void>;
9999
}
100100

101-
export type DatabaseDeletedListener = () => void;
102-
103101
/**
104102
* Persistence is the lowest-level shared interface to persistent storage in
105103
* Firestore.
@@ -153,23 +151,13 @@ export interface Persistence {
153151
shutdown(): Promise<void>;
154152

155153
/**
156-
* Registers a listener that gets called when the underlying database receives
157-
* an event indicating that it either has been deleted or is pending deletion
158-
* and must be closed.
159-
*
160-
* For example, this callback will be called in the case that multi-tab
161-
* IndexedDB persistence is in use and another tab calls
162-
* clearIndexedDbPersistence(). In that case, this Firestore instance must
163-
* close its IndexedDB connection in order to allow the deletion initiated by
164-
* the other tab to proceed.
165-
*
166-
* This method may only be called once; subsequent invocations will result in
167-
* an exception, refusing to supersede the previously-registered listener.
154+
* Registers a listener that gets called when the database receives a
155+
* version change event indicating that it has deleted.
168156
*
169157
* PORTING NOTE: This is only used for Web multi-tab.
170158
*/
171159
setDatabaseDeletedListener(
172-
databaseDeletedListener: DatabaseDeletedListener
160+
databaseDeletedListener: () => Promise<void>
173161
): void;
174162

175163
/**

packages/firestore/src/local/simple_db.ts

Lines changed: 13 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,9 @@ import { getGlobal, getUA, isIndexedDBAvailable } from '@firebase/util';
1919

2020
import { debugAssert } from '../util/assert';
2121
import { Code, FirestoreError } from '../util/error';
22-
import { logDebug, logError, logWarn } from '../util/log';
22+
import { logDebug, logError } from '../util/log';
2323
import { Deferred } from '../util/promise';
2424

25-
import { DatabaseDeletedListener } from './persistence';
2625
import { PersistencePromise } from './persistence_promise';
2726

2827
// References to `indexedDB` are guarded by SimpleDb.isAvailable() and getGlobal()
@@ -159,7 +158,8 @@ export class SimpleDbTransaction {
159158
*/
160159
export class SimpleDb {
161160
private db?: IDBDatabase;
162-
private databaseDeletedListener?: DatabaseDeletedListener;
161+
private lastClosedDbVersion: number | null = null;
162+
private versionchangelistener?: (event: IDBVersionChangeEvent) => void;
163163

164164
/** Deletes the specified database. */
165165
static delete(name: string): Promise<void> {
@@ -365,35 +365,22 @@ export class SimpleDb {
365365
});
366366
}
367367

368-
this.db.addEventListener(
369-
'versionchange',
370-
event => {
371-
// Notify the listener if another tab attempted to delete the IndexedDb
372-
// database, such as by calling clearIndexedDbPersistence().
373-
if (event.newVersion === null) {
374-
logWarn(
375-
`Received "versionchange" event with newVersion===null; ` +
376-
'notifying the registered DatabaseDeletedListener, if any'
377-
);
378-
this.databaseDeletedListener?.();
379-
}
380-
},
381-
{ passive: true }
382-
);
368+
if (this.versionchangelistener) {
369+
this.db.onversionchange = event => this.versionchangelistener!(event);
370+
}
383371

384372
return this.db;
385373
}
386374

387-
setDatabaseDeletedListener(
388-
databaseDeletedListener: DatabaseDeletedListener
375+
setVersionChangeListener(
376+
versionChangeListener: (event: IDBVersionChangeEvent) => void
389377
): void {
390-
if (this.databaseDeletedListener) {
391-
throw new Error(
392-
'setDatabaseDeletedListener() may only be called once, ' +
393-
'and it has already been called'
394-
);
378+
this.versionchangelistener = versionChangeListener;
379+
if (this.db) {
380+
this.db.onversionchange = (event: IDBVersionChangeEvent) => {
381+
return versionChangeListener(event);
382+
};
395383
}
396-
this.databaseDeletedListener = databaseDeletedListener;
397384
}
398385

399386
async runTransaction<T>(

packages/firestore/test/unit/specs/spec_test_runner.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -365,14 +365,8 @@ abstract class TestRunner {
365365
this.eventManager.onLastRemoteStoreUnlisten =
366366
triggerRemoteStoreUnlisten.bind(null, this.syncEngine);
367367

368-
this.persistence.setDatabaseDeletedListener(() => {
369-
this.shutdown().catch(error => {
370-
console.warn(
371-
'WARNING: this.shutdown() failed in callback ' +
372-
'specified to persistence.setDatabaseDeletedListener',
373-
error
374-
);
375-
});
368+
await this.persistence.setDatabaseDeletedListener(async () => {
369+
await this.shutdown();
376370
});
377371

378372
this.started = true;

0 commit comments

Comments
 (0)