@@ -6,7 +6,7 @@ import { mergeMap } from 'rxjs/operator/mergeMap';
6
6
import { map } from 'rxjs/operator/map' ;
7
7
import { _do } from 'rxjs/operator/do' ;
8
8
import { from } from 'rxjs/observable/from' ;
9
- import { OpaqueToken , Inject , Injectable , NgModule , ModuleWithProviders } from '@angular/core' ;
9
+ import { OpaqueToken , Inject , NgModule , ModuleWithProviders } from '@angular/core' ;
10
10
11
11
12
12
const IDB_SUCCESS = 'success' ;
@@ -37,19 +37,18 @@ export interface DBSchema {
37
37
stores : { [ storename : string ] : DBStore } ;
38
38
}
39
39
40
- export function getIDBFactory ( ) : IDBFactory {
40
+ export function getIDBFactory ( ) {
41
41
return typeof window !== 'undefined' ? window . indexedDB : self . indexedDB ;
42
42
}
43
43
44
- @Injectable ( )
45
44
export class Database {
46
45
47
46
public changes : Subject < any > = new Subject ( ) ;
48
47
49
- private _idb : IDBFactory ;
48
+ private _idb ;
50
49
private _schema : DBSchema ;
51
50
52
- constructor ( @Inject ( DatabaseBackend ) idbBackend : any , @Inject ( IDB_SCHEMA ) schema : any ) {
51
+ constructor ( @Inject ( DatabaseBackend ) idbBackend , @Inject ( IDB_SCHEMA ) schema : DBSchema ) {
53
52
this . _schema = schema ;
54
53
this . _idb = idbBackend ;
55
54
}
@@ -270,6 +269,38 @@ export class Database {
270
269
compare ( a : any , b : any ) : number {
271
270
return this . _idb . cmp ( a , b ) ;
272
271
}
272
+
273
+ clear ( storeName : string ) {
274
+ const open$ = this . open ( this . _schema . name ) ;
275
+ return mergeMap . call ( open$ , ( db : IDBDatabase ) => {
276
+ return new Observable ( ( txnObserver : Observer < any > ) => {
277
+ const recordSchema = this . _schema . stores [ storeName ] ;
278
+ const mapper = this . _mapRecord ( recordSchema ) ;
279
+ const txn = db . transaction ( [ storeName ] , IDB_TXN_READWRITE ) ;
280
+ const objectStore = txn . objectStore ( storeName ) ;
281
+
282
+ const clearRequest = objectStore . clear ( ) ;
283
+
284
+ const onTxnError = ( err : any ) => txnObserver . error ( err ) ;
285
+ const onTxnComplete = ( ) => txnObserver . complete ( ) ;
286
+ const onClear = ( ) => txnObserver . next ( null ) ;
287
+
288
+ txn . addEventListener ( IDB_COMPLETE , onTxnComplete ) ;
289
+ txn . addEventListener ( IDB_ERROR , onTxnError ) ;
290
+
291
+ clearRequest . addEventListener ( IDB_SUCCESS , onClear ) ;
292
+ clearRequest . addEventListener ( IDB_ERROR , onTxnError ) ;
293
+
294
+ return ( ) => {
295
+ clearRequest . removeEventListener ( IDB_SUCCESS , onClear ) ;
296
+ clearRequest . removeEventListener ( IDB_ERROR , onTxnError ) ;
297
+ txn . removeEventListener ( IDB_COMPLETE , onTxnComplete ) ;
298
+ txn . removeEventListener ( IDB_ERROR , onTxnError ) ;
299
+ } ;
300
+
301
+ } ) ;
302
+ } ) ;
303
+ }
273
304
}
274
305
275
306
0 commit comments