@@ -57,6 +57,7 @@ import {
57
57
TransactionToken ,
58
58
TransactionLockHelper ,
59
59
} from "./TransactionLockHelper" ;
60
+ import { LogWriter } from "./LogWriter" ;
60
61
61
62
const IndexPrefix = "nsp_i_" ;
62
63
@@ -80,7 +81,7 @@ export class IndexedDbProvider extends DbProvider {
80
81
private _handleOnClose : OnCloseHandler | undefined = undefined ;
81
82
82
83
private _lockHelper : TransactionLockHelper | undefined ;
83
- private logger : IObjectStoreProviderLogger ;
84
+ private logWriter : LogWriter ;
84
85
85
86
// By default, it uses the in-browser indexed db factory, but you can pass in an explicit factory. Currently only used for unit tests.
86
87
constructor (
@@ -91,7 +92,7 @@ export class IndexedDbProvider extends DbProvider {
91
92
) {
92
93
super ( ) ;
93
94
94
- this . logger = logger ? logger : console ;
95
+ this . logWriter = new LogWriter ( logger ? logger : console ) ;
95
96
96
97
if ( explicitDbFactory ) {
97
98
this . _dbFactory = explicitDbFactory ;
@@ -155,20 +156,29 @@ export class IndexedDbProvider extends DbProvider {
155
156
156
157
if ( ! this . _dbFactory ) {
157
158
// Couldn't even find a supported indexeddb object on the browser...
158
- return Promise . reject < void > ( "No support for IndexedDB in this browser" ) ;
159
+ const message = `No support for IndexedDB in this browser, returning` ;
160
+ this . logWriter . error ( message ) ;
161
+ return Promise . reject < void > ( message ) ;
159
162
}
160
163
161
164
if ( wipeIfExists ) {
165
+ this . logWriter . log ( `Wiping db` , { dbName } ) ;
162
166
try {
163
167
let req = this . _dbFactory . deleteDatabase ( dbName ) ;
164
168
await IndexedDbProvider . WrapRequest ( req ) ;
165
- } catch ( e ) {
169
+ } catch ( e : any ) {
166
170
// Don't care
171
+ this . logWriter . error (
172
+ `Wiping db failed, message: ${ e ?. message } . Ignoring and proceeding further` ,
173
+ { dbName }
174
+ ) ;
167
175
}
176
+ this . logWriter . log ( `Wiping db success` , { dbName } ) ;
168
177
}
169
178
170
179
this . _lockHelper = new TransactionLockHelper ( schema , true ) ;
171
180
181
+ this . logWriter . log ( `Opening db, version: ${ schema . version } ` , { dbName } ) ;
172
182
const dbOpen = this . _dbFactory . open ( dbName , schema . version ) ;
173
183
174
184
let migrationPutters : Promise < void > [ ] = [ ] ;
@@ -179,9 +189,12 @@ export class IndexedDbProvider extends DbProvider {
179
189
const trans = target . transaction ;
180
190
181
191
if ( ! trans ) {
192
+ this . logWriter . error ( `No transaction, unable to do upgrade` ) ;
182
193
throw new Error ( "onupgradeneeded: target is null!" ) ;
183
194
}
184
195
196
+ this . logWriter . log ( `Upgrade needed for db` , { dbName } ) ;
197
+
185
198
// Avoid clearing object stores when event.oldVersion returns 0.
186
199
// oldVersion returns 0 if db doesn't exist yet: https://developer.mozilla.org/en-US/docs/Web/API/IDBVersionChangeEvent/oldVersion
187
200
if ( event . oldVersion ) {
@@ -190,8 +203,8 @@ export class IndexedDbProvider extends DbProvider {
190
203
event . oldVersion < schema . lastUsableVersion
191
204
) {
192
205
// Clear all stores if it's past the usable version
193
- this . logger . log (
194
- " Old version detected (" + event . oldVersion + " ), clearing all data"
206
+ this . logWriter . log (
207
+ ` Old version detected (${ event . oldVersion } ), clearing all data`
195
208
) ;
196
209
each ( db . objectStoreNames , ( name ) => {
197
210
db . deleteObjectStore ( name ) ;
@@ -204,9 +217,12 @@ export class IndexedDbProvider extends DbProvider {
204
217
db . deleteObjectStore ( storeName ) ;
205
218
}
206
219
} ) ;
220
+
221
+ this . logWriter . log ( `Deleted all object stores` , { dbName } ) ;
207
222
}
208
223
209
224
// Create all stores
225
+ this . logWriter . log ( `Creating stores as part of upgrade process` ) ;
210
226
each ( schema . stores , ( storeSchema ) => {
211
227
let store : IDBObjectStore ;
212
228
const storeExistedBefore = includes (
@@ -222,6 +238,10 @@ export class IndexedDbProvider extends DbProvider {
222
238
}
223
239
224
240
// Any is to fix a lib.d.ts issue in TS 2.0.3 - it doesn't realize that keypaths can be compound for some reason...
241
+ this . logWriter . log ( `Store doesn't exist, creating object store` , {
242
+ dbName,
243
+ storeName : storeSchema . name ,
244
+ } ) ;
225
245
store = db . createObjectStore ( storeSchema . name , {
226
246
keyPath : primaryKeyPath ,
227
247
} as any ) ;
@@ -261,6 +281,11 @@ export class IndexedDbProvider extends DbProvider {
261
281
}
262
282
263
283
if ( nuke ) {
284
+ this . logWriter . log ( `Index no longer exists, deleting` , {
285
+ dbName,
286
+ storeName : storeSchema . name ,
287
+ indexName,
288
+ } ) ;
264
289
store . deleteIndex ( indexName ) ;
265
290
}
266
291
} ) ;
@@ -279,6 +304,10 @@ export class IndexedDbProvider extends DbProvider {
279
304
throw new Error ( "Can't use multiEntry and compound keys" ) ;
280
305
} else {
281
306
// Create an object store for the index
307
+ this . logWriter . log ( `Creating object store and index` , {
308
+ dbName,
309
+ storeName : storeSchema . name ,
310
+ } ) ;
282
311
let indexStore = db . createObjectStore (
283
312
storeSchema . name + "_" + indexSchema . name ,
284
313
{ autoIncrement : true }
@@ -292,6 +321,11 @@ export class IndexedDbProvider extends DbProvider {
292
321
}
293
322
} else if ( isCompoundKeyPath ( keyPath ) ) {
294
323
// Going to have to hack the compound index into a column, so here it is.
324
+ this . logWriter . log ( `Creating index` , {
325
+ dbName,
326
+ storeName : storeSchema . name ,
327
+ indexName : indexSchema . name ,
328
+ } ) ;
295
329
store . createIndex (
296
330
indexSchema . name ,
297
331
IndexPrefix + indexSchema . name ,
@@ -300,11 +334,21 @@ export class IndexedDbProvider extends DbProvider {
300
334
}
301
335
) ;
302
336
} else {
337
+ this . logWriter . log ( `Creating index` , {
338
+ dbName,
339
+ storeName : storeSchema . name ,
340
+ indexName : indexSchema . name ,
341
+ } ) ;
303
342
store . createIndex ( indexSchema . name , keyPath , {
304
343
unique : indexSchema . unique ,
305
344
} ) ;
306
345
}
307
346
} else if ( indexSchema . fullText ) {
347
+ this . logWriter . log ( `Creating index` , {
348
+ dbName,
349
+ storeName : storeSchema . name ,
350
+ indexName : indexSchema . name ,
351
+ } ) ;
308
352
store . createIndex (
309
353
indexSchema . name ,
310
354
IndexPrefix + indexSchema . name ,
@@ -318,6 +362,11 @@ export class IndexedDbProvider extends DbProvider {
318
362
needsMigrate = true ;
319
363
}
320
364
} else {
365
+ this . logWriter . log ( `Creating index` , {
366
+ dbName,
367
+ storeName : storeSchema . name ,
368
+ indexName : indexSchema . name ,
369
+ } ) ;
321
370
store . createIndex ( indexSchema . name , keyPath , {
322
371
unique : indexSchema . unique ,
323
372
multiEntry : indexSchema . multiEntry ,
@@ -339,12 +388,15 @@ export class IndexedDbProvider extends DbProvider {
339
388
fakeToken ,
340
389
schema ,
341
390
this . _fakeComplicatedKeys ,
342
- this . logger
391
+ this . logWriter
343
392
) ;
344
393
const tStore = iTrans . getStore ( storeSchema . name ) ;
345
394
346
395
const cursorReq = store . openCursor ( ) ;
347
396
let thisIndexPutters : Promise < void > [ ] = [ ] ;
397
+ this . logWriter . log ( `Adding store to migrationPutters` , {
398
+ storeName : storeSchema . name ,
399
+ } ) ;
348
400
migrationPutters . push (
349
401
IndexedDbIndex . iterateOverCursorRequest ( cursorReq , ( cursor ) => {
350
402
const err = attempt ( ( ) => {
@@ -358,7 +410,15 @@ export class IndexedDbProvider extends DbProvider {
358
410
if ( err ) {
359
411
thisIndexPutters . push ( Promise . reject < void > ( err ) ) ;
360
412
}
361
- } ) . then ( ( ) => Promise . all ( thisIndexPutters ) . then ( noop ) )
413
+ } ) . then (
414
+ ( ) => Promise . all ( thisIndexPutters ) . then ( noop ) ,
415
+ ( err ) => {
416
+ this . logWriter . error (
417
+ `Error when iterating over cursor on idb index, message: ${ err ?. message } ` ,
418
+ { storeName : storeSchema . name }
419
+ ) ;
420
+ }
421
+ )
362
422
) ;
363
423
}
364
424
} ) ;
@@ -368,7 +428,12 @@ export class IndexedDbProvider extends DbProvider {
368
428
369
429
return promise . then (
370
430
( db ) => {
431
+ this . logWriter . log (
432
+ `Waiting for migrationPutters: ${ migrationPutters . length } to complete for db` ,
433
+ { dbName }
434
+ ) ;
371
435
return Promise . all ( migrationPutters ) . then ( ( ) => {
436
+ this . logWriter . log ( `Opening db success` , { dbName } ) ;
372
437
this . _db = db ;
373
438
this . _db . onclose = ( event : Event ) => {
374
439
if ( this . _handleOnClose ) {
@@ -409,14 +474,18 @@ export class IndexedDbProvider extends DbProvider {
409
474
err . target . error . name === "VersionError"
410
475
) {
411
476
if ( ! wipeIfExists ) {
412
- this . logger . log (
413
- "Database version too new, Wiping: " +
414
- ( err . target . error . message || err . target . error . name )
477
+ this . logWriter . log (
478
+ `Database version too new, Wiping: ${
479
+ err . target . error . message || err . target . error . name
480
+ } `
415
481
) ;
416
482
417
483
return this . open ( dbName , schema , true , verbose ) ;
418
484
}
419
485
}
486
+ this . logWriter . error ( `Error opening db, message: ${ err ?. message } ` , {
487
+ dbName,
488
+ } ) ;
420
489
return Promise . reject < void > ( err ) ;
421
490
}
422
491
) ;
@@ -520,7 +589,7 @@ export class IndexedDbProvider extends DbProvider {
520
589
transToken ,
521
590
this . _schema ! ! ! ,
522
591
this . _fakeComplicatedKeys ,
523
- this . logger
592
+ this . logWriter
524
593
)
525
594
) ;
526
595
}
@@ -538,7 +607,7 @@ class IndexedDbTransaction implements DbTransaction {
538
607
private _transToken : TransactionToken ,
539
608
private _schema : DbSchema ,
540
609
private _fakeComplicatedKeys : boolean ,
541
- private logger : IObjectStoreProviderLogger
610
+ private logWriter : LogWriter
542
611
) {
543
612
this . _stores = map ( this . _transToken . storeNames , ( storeName ) =>
544
613
this . _trans . objectStore ( storeName )
@@ -566,7 +635,7 @@ class IndexedDbTransaction implements DbTransaction {
566
635
) ;
567
636
568
637
if ( history . length > 1 ) {
569
- this . logger . warn (
638
+ this . logWriter . warn (
570
639
"IndexedDbTransaction Errored after Resolution, Swallowing. Error: " +
571
640
( this . _trans . error ? this . _trans . error . message : undefined ) +
572
641
", History: " +
@@ -590,7 +659,7 @@ class IndexedDbTransaction implements DbTransaction {
590
659
) ;
591
660
592
661
if ( history . length > 1 ) {
593
- this . logger . warn (
662
+ this . logWriter . warn (
594
663
"IndexedDbTransaction Aborted after Resolution, Swallowing. Error: " +
595
664
( this . _trans . error ? this . _trans . error . message : undefined ) +
596
665
", History: " +
0 commit comments