Skip to content

Commit 390a472

Browse files
committed
revert changes by dconeybe on this branch
1 parent be1fcd5 commit 390a472

File tree

4 files changed

+32
-166
lines changed

4 files changed

+32
-166
lines changed

.changeset/hot-birds-report.md

Lines changed: 0 additions & 5 deletions
This file was deleted.

packages/firestore/src/core/firestore_client.ts

Lines changed: 6 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -231,49 +231,22 @@ export async function setOfflineComponentProvider(
231231
}
232232
});
233233

234-
offlineComponentProvider.persistence.setDatabaseDeletedListener(event => {
235-
let error: FirestoreError | undefined;
236-
237-
if (event.type === 'ClearSiteDataDatabaseDeletedEvent') {
238-
// Throw FirestoreError rather than just Error so that the error will
239-
// be treated as "non-retryable".
240-
error = new FirestoreError(
241-
'failed-precondition',
242-
`Terminating Firestore in response to "${event.type}" event ` +
243-
`to prevent potential IndexedDB database corruption. ` +
244-
`This situation could be caused by clicking the ` +
245-
`"Clear Site Data" button in a web browser. ` +
246-
`Try reloading the web page to re-initialize the ` +
247-
`IndexedDB database.`
248-
);
249-
logWarn(error.message, event.data);
250-
} else {
251-
logWarn(
252-
`Terminating Firestore in response to "${event.type}" event`,
253-
event.data
254-
);
255-
}
256-
234+
offlineComponentProvider.persistence.setDatabaseDeletedListener(() => {
235+
logWarn('Terminating Firestore due to IndexedDb database deletion');
257236
client
258237
.terminate()
259238
.then(() => {
260239
logDebug(
261-
`Terminating Firestore in response to "${event.type}" event ` +
262-
'completed successfully',
263-
event.data
240+
'Terminating Firestore due to IndexedDb database deletion ' +
241+
'completed successfully'
264242
);
265243
})
266244
.catch(error => {
267245
logWarn(
268-
`Terminating Firestore in response to "${event.type}" event failed:`,
269-
error,
270-
event.data
246+
'Terminating Firestore due to IndexedDb database deletion failed',
247+
error
271248
);
272249
});
273-
274-
if (error) {
275-
throw error;
276-
}
277250
});
278251

279252
client._offlineComponents = offlineComponentProvider;

packages/firestore/src/local/persistence.ts

Lines changed: 1 addition & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -98,74 +98,7 @@ export interface ReferenceDelegate {
9898
): PersistencePromise<void>;
9999
}
100100

101-
/**
102-
* A {@link DatabaseDeletedListener} event indicating that the IndexedDB
103-
* database received a "versionchange" event with a null value for "newVersion".
104-
* This event indicates that another tab in multi-tab IndexedDB persistence mode
105-
* has called `clearIndexedDbPersistence()` and requires this tab to close its
106-
* IndexedDB connection in order to allow the "clear" operation to proceed.
107-
*/
108-
export class VersionChangeDatabaseDeletedEvent {
109-
/** A type discriminator. */
110-
readonly type = 'VersionChangeDatabaseDeletedEvent' as const;
111-
112-
constructor(
113-
readonly data: {
114-
/** A unique ID for this event. */
115-
eventId: string;
116-
/**
117-
* The value of the "newVersion" property of the "versionchange" event
118-
* that triggered this event. Its value is _always_ `null`, but is kept
119-
* here for posterity.
120-
*/
121-
eventNewVersion: null;
122-
}
123-
) {}
124-
}
125-
126-
/**
127-
* A {@link DatabaseDeletedListener} event indicating that the "Clear Site Data"
128-
* button in a web browser was (likely) clicked, deleting the IndexedDB
129-
* database.
130-
*/
131-
export class ClearSiteDataDatabaseDeletedEvent {
132-
/** A type discriminator. */
133-
readonly type = 'ClearSiteDataDatabaseDeletedEvent' as const;
134-
135-
constructor(
136-
readonly data: {
137-
/** A unique ID for this event. */
138-
eventId: string;
139-
/** The IndexedDB version that was last reported by the database. */
140-
lastClosedVersion: number;
141-
/**
142-
* The value of the "oldVersion" property of the "onupgradeneeded"
143-
* IndexedDB event that triggered this event.
144-
*/
145-
eventOldVersion: number;
146-
/**
147-
* The value of the "newVersion" property of the "onupgradeneeded"
148-
* IndexedDB event that triggered this event.
149-
*/
150-
eventNewVersion: number | null;
151-
/**
152-
* The value of the "version" property of the "IDBDatabase" object.
153-
*/
154-
dbVersion: number;
155-
}
156-
) {}
157-
}
158-
159-
/**
160-
* The type of the "event" parameter of {@link DatabaseDeletedListener}.
161-
*/
162-
export type DatabaseDeletedListenerEvent =
163-
| VersionChangeDatabaseDeletedEvent
164-
| ClearSiteDataDatabaseDeletedEvent;
165-
166-
export type DatabaseDeletedListener = (
167-
event: DatabaseDeletedListenerEvent
168-
) => void;
101+
export type DatabaseDeletedListener = () => void;
169102

170103
/**
171104
* Persistence is the lowest-level shared interface to persistent storage in

packages/firestore/src/local/simple_db.ts

Lines changed: 25 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,12 @@
1717

1818
import { getGlobal, getUA, isIndexedDBAvailable } from '@firebase/util';
1919

20-
import { debugAssert } from '../util/assert';
21-
import { generateUniqueDebugId } from '../util/debug_uid';
20+
import { debugAssert, fail } from '../util/assert';
2221
import { Code, FirestoreError } from '../util/error';
23-
import { logDebug, logError } from '../util/log';
22+
import { logDebug, logError, logWarn } from '../util/log';
2423
import { Deferred } from '../util/promise';
2524

26-
import {
27-
ClearSiteDataDatabaseDeletedEvent,
28-
DatabaseDeletedListener,
29-
VersionChangeDatabaseDeletedEvent
30-
} from './persistence';
25+
import { DatabaseDeletedListener } from './persistence';
3126
import { PersistencePromise } from './persistence_promise';
3227

3328
// References to `indexedDB` are guarded by SimpleDb.isAvailable() and getGlobal()
@@ -166,7 +161,6 @@ export class SimpleDb {
166161
private db?: IDBDatabase;
167162
private databaseDeletedListener?: DatabaseDeletedListener;
168163
private lastClosedDbVersion: number | null = null;
169-
private readonly logTag = `${LOG_TAG} [${generateUniqueDebugId()}]`;
170164

171165
/** Deletes the specified database. */
172166
static delete(name: string): Promise<void> {
@@ -271,7 +265,6 @@ export class SimpleDb {
271265
private readonly version: number,
272266
private readonly schemaConverter: SimpleDbSchemaConverter
273267
) {
274-
logDebug(`${this.logTag} created!`);
275268
debugAssert(
276269
SimpleDb.isAvailable(),
277270
'IndexedDB not supported in current environment.'
@@ -297,8 +290,7 @@ export class SimpleDb {
297290
*/
298291
async ensureDb(action: string): Promise<IDBDatabase> {
299292
if (!this.db) {
300-
console.trace("zzyzx SimpleDb.ensureDb() is opening a new database connection");
301-
logDebug(this.logTag, 'Opening database:', this.name);
293+
logDebug(LOG_TAG, 'Opening database:', this.name);
302294
this.db = await new Promise<IDBDatabase>((resolve, reject) => {
303295
// TODO(mikelehen): Investigate browser compatibility.
304296
// https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API/Using_IndexedDB
@@ -307,37 +299,9 @@ export class SimpleDb {
307299
// https://developer.mozilla.org/en-US/docs/Web/API/IDBVersionChangeRequest/setVersion
308300
const request = indexedDB.open(this.name, this.version);
309301

310-
// Store information about "Clear Site Data" being detected in the
311-
// "onupgradeneeded" event listener and handle it in the "onsuccess"
312-
// event listener, as opposed to throwing directly from the
313-
// "onupgradeneeded" event listener. Do this because throwing from the
314-
// "onupgradeneeded" event listener results in a generic error being
315-
// reported to the "onerror" event listener that cannot be distinguished
316-
// from other errors.
317-
const clearSiteDataEvent: ClearSiteDataDatabaseDeletedEvent[] = [];
318-
319302
request.onsuccess = (event: Event) => {
320-
let error: unknown;
321-
if (clearSiteDataEvent.length > 0) {
322-
try {
323-
this.databaseDeletedListener?.(clearSiteDataEvent[0]);
324-
} catch (e) {
325-
logError(
326-
`zzyzx this.databaseDeletedListener?.(clearSiteDataEvent[0]) threw`,
327-
e
328-
);
329-
error = e;
330-
}
331-
}
332-
333303
const db = (event.target as IDBOpenDBRequest).result;
334-
335-
if (error) {
336-
reject(error);
337-
db.close();
338-
} else {
339-
resolve(db);
340-
}
304+
resolve(db);
341305
};
342306

343307
request.onblocked = () => {
@@ -380,7 +344,7 @@ export class SimpleDb {
380344

381345
request.onupgradeneeded = (event: IDBVersionChangeEvent) => {
382346
logDebug(
383-
this.logTag,
347+
LOG_TAG,
384348
'Database "' + this.name + '" requires upgrade from version:',
385349
event.oldVersion
386350
);
@@ -389,14 +353,19 @@ export class SimpleDb {
389353
this.lastClosedDbVersion !== null &&
390354
this.lastClosedDbVersion !== event.oldVersion
391355
) {
392-
clearSiteDataEvent.push(
393-
new ClearSiteDataDatabaseDeletedEvent({
394-
eventId: generateUniqueDebugId(),
395-
lastClosedVersion: this.lastClosedDbVersion,
396-
eventOldVersion: event.oldVersion,
397-
eventNewVersion: event.newVersion,
398-
dbVersion: db.version
399-
})
356+
// This thrown error will get passed to the `onerror` callback
357+
// registered above, and will then be propagated correctly.
358+
fail(
359+
0x3456,
360+
`refusing to open IndexedDB database due to potential ` +
361+
`corruption of the IndexedDB database data; this corruption ` +
362+
`could be caused by clicking the "clear site data" button in ` +
363+
`a web browser; try reloading the web page to re-initialize ` +
364+
`the IndexedDB database: ` +
365+
`lastClosedDbVersion=${this.lastClosedDbVersion}, ` +
366+
`event.oldVersion=${event.oldVersion}, ` +
367+
`event.newVersion=${event.newVersion}, ` +
368+
`db.version=${db.version}`
400369
);
401370
}
402371
this.schemaConverter
@@ -408,7 +377,7 @@ export class SimpleDb {
408377
)
409378
.next(() => {
410379
logDebug(
411-
this.logTag,
380+
LOG_TAG,
412381
'Database upgrade to version ' + this.version + ' complete'
413382
);
414383
});
@@ -418,7 +387,6 @@ export class SimpleDb {
418387
this.db.addEventListener(
419388
'close',
420389
event => {
421-
logDebug(`${this.logTag} close callback`, event);
422390
const db = event.target as IDBDatabase;
423391
this.lastClosedDbVersion = db.version;
424392
},
@@ -432,12 +400,11 @@ export class SimpleDb {
432400
// Notify the listener if another tab attempted to delete the IndexedDb
433401
// database, such as by calling clearIndexedDbPersistence().
434402
if (event.newVersion === null) {
435-
this.databaseDeletedListener?.(
436-
new VersionChangeDatabaseDeletedEvent({
437-
eventId: generateUniqueDebugId(),
438-
eventNewVersion: event.newVersion
439-
})
403+
logWarn(
404+
`Received "versionchange" event with newVersion===null; ` +
405+
'notifying the registered DatabaseDeletedListener, if any'
440406
);
407+
this.databaseDeletedListener?.();
441408
}
442409
},
443410
{ passive: true }
@@ -464,7 +431,6 @@ export class SimpleDb {
464431
objectStores: string[],
465432
transactionFn: (transaction: SimpleDbTransaction) => PersistencePromise<T>
466433
): Promise<T> {
467-
logDebug(`${this.logTag} runTransaction action=${action}`);
468434
const readonly = mode === 'readonly';
469435
let attemptNumber = 0;
470436

@@ -517,7 +483,7 @@ export class SimpleDb {
517483
error.name !== 'FirebaseError' &&
518484
attemptNumber < TRANSACTION_RETRY_COUNT;
519485
logDebug(
520-
this.logTag,
486+
LOG_TAG,
521487
'Transaction failed with error:',
522488
error.message,
523489
'Retrying:',
@@ -534,7 +500,6 @@ export class SimpleDb {
534500
}
535501

536502
close(): void {
537-
logDebug(`${this.logTag} close() called!`);
538503
if (this.db) {
539504
this.db.close();
540505
}

0 commit comments

Comments
 (0)