@@ -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 ;
@@ -156,27 +157,28 @@ export class IndexedDbProvider extends DbProvider {
156
157
if ( ! this . _dbFactory ) {
157
158
// Couldn't even find a supported indexeddb object on the browser...
158
159
const message = `No support for IndexedDB in this browser, returning` ;
159
- this . logger . error ( message ) ;
160
+ this . logWriter . error ( message ) ;
160
161
return Promise . reject < void > ( message ) ;
161
162
}
162
163
163
164
if ( wipeIfExists ) {
164
- this . logger . log ( `Wiping db: ${ dbName } ` ) ;
165
+ this . logWriter . log ( `Wiping db` , { dbName } ) ;
165
166
try {
166
167
let req = this . _dbFactory . deleteDatabase ( dbName ) ;
167
168
await IndexedDbProvider . WrapRequest ( req ) ;
168
169
} catch ( e : any ) {
169
170
// Don't care
170
- this . logger . error (
171
- `Wiping db: ${ dbName } failed, message: ${ e ?. message } . Ignoring and proceeding further`
171
+ this . logWriter . error (
172
+ `Wiping db failed, message: ${ e ?. message } . Ignoring and proceeding further` ,
173
+ { dbName }
172
174
) ;
173
175
}
174
- this . logger . log ( `Wiping db: ${ dbName } success` ) ;
176
+ this . logWriter . log ( `Wiping db success` , { dbName } ) ;
175
177
}
176
178
177
179
this . _lockHelper = new TransactionLockHelper ( schema , true ) ;
178
180
179
- this . logger . log ( `Opening db: ${ dbName } , version: ${ schema . version } ` ) ;
181
+ this . logWriter . log ( `Opening db, version: ${ schema . version } ` , { dbName } ) ;
180
182
const dbOpen = this . _dbFactory . open ( dbName , schema . version ) ;
181
183
182
184
let migrationPutters : Promise < void > [ ] = [ ] ;
@@ -187,11 +189,11 @@ export class IndexedDbProvider extends DbProvider {
187
189
const trans = target . transaction ;
188
190
189
191
if ( ! trans ) {
190
- this . logger . error ( `No transaction, unable to do upgrade` ) ;
192
+ this . logWriter . error ( `No transaction, unable to do upgrade` ) ;
191
193
throw new Error ( "onupgradeneeded: target is null!" ) ;
192
194
}
193
195
194
- this . logger . log ( `Upgrade needed for db: ${ dbName } ` ) ;
196
+ this . logWriter . log ( `Upgrade needed for db` , { dbName } ) ;
195
197
196
198
// Avoid clearing object stores when event.oldVersion returns 0.
197
199
// oldVersion returns 0 if db doesn't exist yet: https://developer.mozilla.org/en-US/docs/Web/API/IDBVersionChangeEvent/oldVersion
@@ -201,8 +203,8 @@ export class IndexedDbProvider extends DbProvider {
201
203
event . oldVersion < schema . lastUsableVersion
202
204
) {
203
205
// Clear all stores if it's past the usable version
204
- this . logger . log (
205
- " Old version detected (" + event . oldVersion + " ), clearing all data"
206
+ this . logWriter . log (
207
+ ` Old version detected (${ event . oldVersion } ), clearing all data`
206
208
) ;
207
209
each ( db . objectStoreNames , ( name ) => {
208
210
db . deleteObjectStore ( name ) ;
@@ -215,10 +217,12 @@ export class IndexedDbProvider extends DbProvider {
215
217
db . deleteObjectStore ( storeName ) ;
216
218
}
217
219
} ) ;
220
+
221
+ this . logWriter . log ( `Deleted all object stores` , { dbName } ) ;
218
222
}
219
223
220
224
// Create all stores
221
- this . logger . log ( `Creating stores as part of upgrade process` ) ;
225
+ this . logWriter . log ( `Creating stores as part of upgrade process` ) ;
222
226
each ( schema . stores , ( storeSchema ) => {
223
227
let store : IDBObjectStore ;
224
228
const storeExistedBefore = includes (
@@ -234,6 +238,10 @@ export class IndexedDbProvider extends DbProvider {
234
238
}
235
239
236
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
+ } ) ;
237
245
store = db . createObjectStore ( storeSchema . name , {
238
246
keyPath : primaryKeyPath ,
239
247
} as any ) ;
@@ -273,6 +281,11 @@ export class IndexedDbProvider extends DbProvider {
273
281
}
274
282
275
283
if ( nuke ) {
284
+ this . logWriter . log ( `Index no longer exists, deleting` , {
285
+ dbName,
286
+ storeName : storeSchema . name ,
287
+ indexName,
288
+ } ) ;
276
289
store . deleteIndex ( indexName ) ;
277
290
}
278
291
} ) ;
@@ -291,6 +304,10 @@ export class IndexedDbProvider extends DbProvider {
291
304
throw new Error ( "Can't use multiEntry and compound keys" ) ;
292
305
} else {
293
306
// Create an object store for the index
307
+ this . logWriter . log ( `Creating object store and index` , {
308
+ dbName,
309
+ storeName : storeSchema . name ,
310
+ } ) ;
294
311
let indexStore = db . createObjectStore (
295
312
storeSchema . name + "_" + indexSchema . name ,
296
313
{ autoIncrement : true }
@@ -304,6 +321,11 @@ export class IndexedDbProvider extends DbProvider {
304
321
}
305
322
} else if ( isCompoundKeyPath ( keyPath ) ) {
306
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
+ } ) ;
307
329
store . createIndex (
308
330
indexSchema . name ,
309
331
IndexPrefix + indexSchema . name ,
@@ -312,11 +334,21 @@ export class IndexedDbProvider extends DbProvider {
312
334
}
313
335
) ;
314
336
} else {
337
+ this . logWriter . log ( `Creating index` , {
338
+ dbName,
339
+ storeName : storeSchema . name ,
340
+ indexName : indexSchema . name ,
341
+ } ) ;
315
342
store . createIndex ( indexSchema . name , keyPath , {
316
343
unique : indexSchema . unique ,
317
344
} ) ;
318
345
}
319
346
} else if ( indexSchema . fullText ) {
347
+ this . logWriter . log ( `Creating index` , {
348
+ dbName,
349
+ storeName : storeSchema . name ,
350
+ indexName : indexSchema . name ,
351
+ } ) ;
320
352
store . createIndex (
321
353
indexSchema . name ,
322
354
IndexPrefix + indexSchema . name ,
@@ -330,6 +362,11 @@ export class IndexedDbProvider extends DbProvider {
330
362
needsMigrate = true ;
331
363
}
332
364
} else {
365
+ this . logWriter . log ( `Creating index` , {
366
+ dbName,
367
+ storeName : storeSchema . name ,
368
+ indexName : indexSchema . name ,
369
+ } ) ;
333
370
store . createIndex ( indexSchema . name , keyPath , {
334
371
unique : indexSchema . unique ,
335
372
multiEntry : indexSchema . multiEntry ,
@@ -351,15 +388,15 @@ export class IndexedDbProvider extends DbProvider {
351
388
fakeToken ,
352
389
schema ,
353
390
this . _fakeComplicatedKeys ,
354
- this . logger
391
+ this . logWriter
355
392
) ;
356
393
const tStore = iTrans . getStore ( storeSchema . name ) ;
357
394
358
395
const cursorReq = store . openCursor ( ) ;
359
396
let thisIndexPutters : Promise < void > [ ] = [ ] ;
360
- this . logger . log (
361
- `Adding store: ${ storeSchema . name } to migrationPutters`
362
- ) ;
397
+ this . logWriter . log ( `Adding store to migrationPutters` , {
398
+ storeName : storeSchema . name ,
399
+ } ) ;
363
400
migrationPutters . push (
364
401
IndexedDbIndex . iterateOverCursorRequest ( cursorReq , ( cursor ) => {
365
402
const err = attempt ( ( ) => {
@@ -376,8 +413,9 @@ export class IndexedDbProvider extends DbProvider {
376
413
} ) . then (
377
414
( ) => Promise . all ( thisIndexPutters ) . then ( noop ) ,
378
415
( err ) => {
379
- this . logger . error (
380
- `Error when iterating over cursor on idb index, message: ${ err ?. message } `
416
+ this . logWriter . error (
417
+ `Error when iterating over cursor on idb index, message: ${ err ?. message } ` ,
418
+ { storeName : storeSchema . name }
381
419
) ;
382
420
}
383
421
)
@@ -390,11 +428,12 @@ export class IndexedDbProvider extends DbProvider {
390
428
391
429
return promise . then (
392
430
( db ) => {
393
- this . logger . log (
394
- `Waiting for migrationPutters: ${ migrationPutters . length } to complete for db: ${ dbName } `
431
+ this . logWriter . log (
432
+ `Waiting for migrationPutters: ${ migrationPutters . length } to complete for db` ,
433
+ { dbName }
395
434
) ;
396
435
return Promise . all ( migrationPutters ) . then ( ( ) => {
397
- this . logger . log ( `Opening db: ${ dbName } success` ) ;
436
+ this . logWriter . log ( `Opening db success` , { dbName } ) ;
398
437
this . _db = db ;
399
438
this . _db . onclose = ( event : Event ) => {
400
439
if ( this . _handleOnClose ) {
@@ -435,17 +474,18 @@ export class IndexedDbProvider extends DbProvider {
435
474
err . target . error . name === "VersionError"
436
475
) {
437
476
if ( ! wipeIfExists ) {
438
- this . logger . log (
439
- "Database version too new, Wiping: " +
440
- ( 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
+ } `
441
481
) ;
442
482
443
483
return this . open ( dbName , schema , true , verbose ) ;
444
484
}
445
485
}
446
- this . logger . error (
447
- `Error opening db: ${ dbName } , message: ${ err ?. message } `
448
- ) ;
486
+ this . logWriter . error ( `Error opening db, message: ${ err ?. message } ` , {
487
+ dbName,
488
+ } ) ;
449
489
return Promise . reject < void > ( err ) ;
450
490
}
451
491
) ;
@@ -549,7 +589,7 @@ export class IndexedDbProvider extends DbProvider {
549
589
transToken ,
550
590
this . _schema ! ! ! ,
551
591
this . _fakeComplicatedKeys ,
552
- this . logger
592
+ this . logWriter
553
593
)
554
594
) ;
555
595
}
@@ -567,7 +607,7 @@ class IndexedDbTransaction implements DbTransaction {
567
607
private _transToken : TransactionToken ,
568
608
private _schema : DbSchema ,
569
609
private _fakeComplicatedKeys : boolean ,
570
- private logger : IObjectStoreProviderLogger
610
+ private logWriter : LogWriter
571
611
) {
572
612
this . _stores = map ( this . _transToken . storeNames , ( storeName ) =>
573
613
this . _trans . objectStore ( storeName )
@@ -595,7 +635,7 @@ class IndexedDbTransaction implements DbTransaction {
595
635
) ;
596
636
597
637
if ( history . length > 1 ) {
598
- this . logger . warn (
638
+ this . logWriter . warn (
599
639
"IndexedDbTransaction Errored after Resolution, Swallowing. Error: " +
600
640
( this . _trans . error ? this . _trans . error . message : undefined ) +
601
641
", History: " +
@@ -619,7 +659,7 @@ class IndexedDbTransaction implements DbTransaction {
619
659
) ;
620
660
621
661
if ( history . length > 1 ) {
622
- this . logger . warn (
662
+ this . logWriter . warn (
623
663
"IndexedDbTransaction Aborted after Resolution, Swallowing. Error: " +
624
664
( this . _trans . error ? this . _trans . error . message : undefined ) +
625
665
", History: " +
0 commit comments