@@ -162,57 +162,24 @@ export interface IdbDatabaseDebugIdPair {
162
162
163
163
class SimpleDbStateNew {
164
164
readonly name = 'new' as const ;
165
-
166
- constructor (
167
- readonly databaseDeletedListener : DatabaseDeletedListener | null
168
- ) { }
169
-
170
- withDatabaseDeletedListener (
171
- databaseDeletedListener : DatabaseDeletedListener
172
- ) : SimpleDbStateNew {
173
- return new SimpleDbStateNew ( databaseDeletedListener ) ;
174
- }
175
165
}
176
166
177
167
class SimpleDbStateOpening {
178
168
readonly name = 'opening' as const ;
179
169
180
- constructor (
181
- readonly promise : Promise < unknown > ,
182
- readonly databaseDeletedListener : DatabaseDeletedListener | null
183
- ) { }
184
-
185
- withDatabaseDeletedListener (
186
- databaseDeletedListener : DatabaseDeletedListener
187
- ) : SimpleDbStateOpening {
188
- return new SimpleDbStateOpening ( this . promise , databaseDeletedListener ) ;
189
- }
170
+ constructor ( readonly promise : Promise < unknown > ) { }
190
171
}
191
172
192
173
class SimpleDbStateOpened {
193
174
readonly name = 'opened' as const ;
194
175
195
- constructor (
196
- readonly db : IdbDatabaseDebugIdPair ,
197
- readonly databaseDeletedListener : DatabaseDeletedListener | null
198
- ) { }
199
-
200
- withDatabaseDeletedListener (
201
- databaseDeletedListener : DatabaseDeletedListener
202
- ) : SimpleDbStateOpened {
203
- return new SimpleDbStateOpened ( this . db , databaseDeletedListener ) ;
204
- }
205
- }
206
-
207
- class SimpleDbStateClosed {
208
- readonly name = 'closed' as const ;
176
+ constructor ( readonly db : IdbDatabaseDebugIdPair ) { }
209
177
}
210
178
211
179
type SimpleDbState =
212
180
| SimpleDbStateNew
213
181
| SimpleDbStateOpened
214
- | SimpleDbStateOpening
215
- | SimpleDbStateClosed ;
182
+ | SimpleDbStateOpening ;
216
183
217
184
/**
218
185
* Provides a wrapper around IndexedDb with a simplified interface that uses
@@ -223,7 +190,8 @@ type SimpleDbState =
223
190
*/
224
191
export class SimpleDb {
225
192
readonly debugId = `SimpleDb@${ generateUniqueDebugId ( ) } ` ;
226
- private state : SimpleDbState = new SimpleDbStateNew ( null ) ;
193
+ private state : SimpleDbState = new SimpleDbStateNew ( ) ;
194
+ private databaseDeletedListener : DatabaseDeletedListener | null = null ;
227
195
228
196
/** Deletes the specified database. */
229
197
static delete ( name : string ) : Promise < void > {
@@ -363,36 +331,26 @@ export class SimpleDb {
363
331
async ensureDb ( action : string ) : Promise < IdbDatabaseDebugIdPair > {
364
332
while ( true ) {
365
333
const currentState = this . state ;
366
- if ( currentState . name === 'closed' ) {
367
- throw new Error ( `${ this . debugId } has been closed` ) ;
368
- } else if ( currentState . name === 'opening' ) {
334
+ if ( currentState . name === 'opening' ) {
369
335
await currentState . promise . catch ( _ => { } ) ;
370
336
} else if ( currentState . name === 'opened' ) {
371
337
return currentState . db ;
372
338
} else {
373
339
hardAssert ( currentState . name === 'new' , 0x56e8 , { state : this . state } ) ;
374
340
const promise = this . openDb ( action ) ;
375
- const openingState = new SimpleDbStateOpening (
376
- promise ,
377
- currentState . databaseDeletedListener
378
- ) ;
341
+ const openingState = new SimpleDbStateOpening ( promise ) ;
379
342
this . state = openingState ;
380
343
try {
381
344
const db = await promise ;
382
345
if ( this . state === openingState ) {
383
- this . state = new SimpleDbStateOpened (
384
- db ,
385
- openingState . databaseDeletedListener
386
- ) ;
346
+ this . state = new SimpleDbStateOpened ( db ) ;
387
347
return db ;
388
348
} else {
389
349
db . idbDatabase . close ( ) ;
390
350
}
391
351
} catch ( e ) {
392
352
if ( this . state === openingState ) {
393
- this . state = new SimpleDbStateNew (
394
- this . state . databaseDeletedListener
395
- ) ;
353
+ this . state = new SimpleDbStateNew ( ) ;
396
354
throw e ;
397
355
}
398
356
}
@@ -496,9 +454,7 @@ export class SimpleDb {
496
454
`Received "versionchange" event with newVersion===null; ` +
497
455
'notifying the registered DatabaseDeletedListener, if any'
498
456
) ;
499
- if ( 'databaseDeletedListener' in this . state ) {
500
- this . state . databaseDeletedListener ?.( ) ;
501
- }
457
+ this . databaseDeletedListener ?.( ) ;
502
458
}
503
459
} ,
504
460
{ passive : true }
@@ -514,7 +470,10 @@ export class SimpleDb {
514
470
`One possible cause is clicking the "Clear Site Data" button ` +
515
471
`in a web browser.`
516
472
) ;
517
- dumpLogBuffer ( "SimpleDbCloseEvent" ) ;
473
+ dumpLogBuffer ( 'SimpleDbCloseEvent' ) ;
474
+ if ( this . state . name === 'opened' && this . state . db . idbDatabase === db ) {
475
+ this . state = new SimpleDbStateNew ( ) ;
476
+ }
518
477
} ,
519
478
{ passive : true }
520
479
) ;
@@ -525,15 +484,10 @@ export class SimpleDb {
525
484
setDatabaseDeletedListener (
526
485
databaseDeletedListener : DatabaseDeletedListener
527
486
) : void {
528
- if ( ! ( 'databaseDeletedListener' in this . state ) ) {
529
- return ;
530
- }
531
- if ( this . state . databaseDeletedListener ) {
487
+ if ( this . databaseDeletedListener ) {
532
488
throw new Error ( 'setDatabaseDeletedListener() has already been called' ) ;
533
489
}
534
- this . state = this . state . withDatabaseDeletedListener (
535
- databaseDeletedListener
536
- ) ;
490
+ this . databaseDeletedListener = databaseDeletedListener ;
537
491
}
538
492
539
493
async runTransaction < T > (
@@ -614,7 +568,7 @@ export class SimpleDb {
614
568
) ;
615
569
616
570
if ( 'db' in this . state && dbBefore === this . state . db ) {
617
- this . state = new SimpleDbStateNew ( this . state . databaseDeletedListener ) ;
571
+ this . state = new SimpleDbStateNew ( ) ;
618
572
logWarn (
619
573
this . debugId ,
620
574
`Transaction transactionId=${ transactionId } closing IDBDatabase ` +
@@ -632,14 +586,11 @@ export class SimpleDb {
632
586
}
633
587
634
588
close ( ) : void {
635
- if ( this . state . name === 'closed' ) {
636
- return ;
637
- }
638
589
logDebug ( this . debugId , 'close()' ) ;
639
590
if ( 'db' in this . state ) {
640
591
this . state . db . idbDatabase . close ( ) ;
641
592
}
642
- this . state = new SimpleDbStateClosed ( ) ;
593
+ this . state = new SimpleDbStateNew ( ) ;
643
594
}
644
595
}
645
596
0 commit comments