17
17
18
18
import { getGlobal , getUA , isIndexedDBAvailable } from '@firebase/util' ;
19
19
20
- import { debugAssert } from '../util/assert' ;
21
- import { generateUniqueDebugId } from '../util/debug_uid' ;
20
+ import { debugAssert , fail } from '../util/assert' ;
22
21
import { Code , FirestoreError } from '../util/error' ;
23
- import { logDebug , logError } from '../util/log' ;
22
+ import { logDebug , logError , logWarn } from '../util/log' ;
24
23
import { Deferred } from '../util/promise' ;
25
24
26
- import {
27
- ClearSiteDataDatabaseDeletedEvent ,
28
- DatabaseDeletedListener ,
29
- VersionChangeDatabaseDeletedEvent
30
- } from './persistence' ;
25
+ import { DatabaseDeletedListener } from './persistence' ;
31
26
import { PersistencePromise } from './persistence_promise' ;
32
27
33
28
// References to `indexedDB` are guarded by SimpleDb.isAvailable() and getGlobal()
@@ -166,7 +161,6 @@ export class SimpleDb {
166
161
private db ?: IDBDatabase ;
167
162
private databaseDeletedListener ?: DatabaseDeletedListener ;
168
163
private lastClosedDbVersion : number | null = null ;
169
- private readonly logTag = `${ LOG_TAG } [${ generateUniqueDebugId ( ) } ]` ;
170
164
171
165
/** Deletes the specified database. */
172
166
static delete ( name : string ) : Promise < void > {
@@ -271,7 +265,6 @@ export class SimpleDb {
271
265
private readonly version : number ,
272
266
private readonly schemaConverter : SimpleDbSchemaConverter
273
267
) {
274
- logDebug ( `${ this . logTag } created!` ) ;
275
268
debugAssert (
276
269
SimpleDb . isAvailable ( ) ,
277
270
'IndexedDB not supported in current environment.'
@@ -297,8 +290,7 @@ export class SimpleDb {
297
290
*/
298
291
async ensureDb ( action : string ) : Promise < IDBDatabase > {
299
292
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 ) ;
302
294
this . db = await new Promise < IDBDatabase > ( ( resolve , reject ) => {
303
295
// TODO(mikelehen): Investigate browser compatibility.
304
296
// https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API/Using_IndexedDB
@@ -307,37 +299,9 @@ export class SimpleDb {
307
299
// https://developer.mozilla.org/en-US/docs/Web/API/IDBVersionChangeRequest/setVersion
308
300
const request = indexedDB . open ( this . name , this . version ) ;
309
301
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
-
319
302
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
-
333
303
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 ) ;
341
305
} ;
342
306
343
307
request . onblocked = ( ) => {
@@ -380,7 +344,7 @@ export class SimpleDb {
380
344
381
345
request . onupgradeneeded = ( event : IDBVersionChangeEvent ) => {
382
346
logDebug (
383
- this . logTag ,
347
+ LOG_TAG ,
384
348
'Database "' + this . name + '" requires upgrade from version:' ,
385
349
event . oldVersion
386
350
) ;
@@ -389,14 +353,19 @@ export class SimpleDb {
389
353
this . lastClosedDbVersion !== null &&
390
354
this . lastClosedDbVersion !== event . oldVersion
391
355
) {
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 } `
400
369
) ;
401
370
}
402
371
this . schemaConverter
@@ -408,7 +377,7 @@ export class SimpleDb {
408
377
)
409
378
. next ( ( ) => {
410
379
logDebug (
411
- this . logTag ,
380
+ LOG_TAG ,
412
381
'Database upgrade to version ' + this . version + ' complete'
413
382
) ;
414
383
} ) ;
@@ -418,7 +387,6 @@ export class SimpleDb {
418
387
this . db . addEventListener (
419
388
'close' ,
420
389
event => {
421
- logDebug ( `${ this . logTag } close callback` , event ) ;
422
390
const db = event . target as IDBDatabase ;
423
391
this . lastClosedDbVersion = db . version ;
424
392
} ,
@@ -432,12 +400,11 @@ export class SimpleDb {
432
400
// Notify the listener if another tab attempted to delete the IndexedDb
433
401
// database, such as by calling clearIndexedDbPersistence().
434
402
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'
440
406
) ;
407
+ this . databaseDeletedListener ?.( ) ;
441
408
}
442
409
} ,
443
410
{ passive : true }
@@ -464,7 +431,6 @@ export class SimpleDb {
464
431
objectStores : string [ ] ,
465
432
transactionFn : ( transaction : SimpleDbTransaction ) => PersistencePromise < T >
466
433
) : Promise < T > {
467
- logDebug ( `${ this . logTag } runTransaction action=${ action } ` ) ;
468
434
const readonly = mode === 'readonly' ;
469
435
let attemptNumber = 0 ;
470
436
@@ -517,7 +483,7 @@ export class SimpleDb {
517
483
error . name !== 'FirebaseError' &&
518
484
attemptNumber < TRANSACTION_RETRY_COUNT ;
519
485
logDebug (
520
- this . logTag ,
486
+ LOG_TAG ,
521
487
'Transaction failed with error:' ,
522
488
error . message ,
523
489
'Retrying:' ,
@@ -534,7 +500,6 @@ export class SimpleDb {
534
500
}
535
501
536
502
close ( ) : void {
537
- logDebug ( `${ this . logTag } close() called!` ) ;
538
503
if ( this . db ) {
539
504
this . db . close ( ) ;
540
505
}
0 commit comments