Skip to content

Commit 6981762

Browse files
committed
add clear and fix some typings for aot compilation
1 parent 10eed3b commit 6981762

File tree

2 files changed

+62
-6
lines changed

2 files changed

+62
-6
lines changed

spec/database.spec.ts

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,4 +188,29 @@ describe('database functionality', () => {
188188
});
189189
});
190190

191-
});
191+
it('should clear store', (done) => {
192+
let found;
193+
idb.clear('todos').subscribe(
194+
() => {},
195+
err => {
196+
console.error(err),
197+
done(err);
198+
},
199+
() => {
200+
idb.query('todos').toArray().subscribe(
201+
(records) => {
202+
found = records;
203+
},
204+
err => {
205+
console.error(err);
206+
done(err);
207+
},
208+
() => {
209+
expect(found.length).toEqual(0);
210+
done();
211+
}
212+
);
213+
})
214+
});
215+
216+
});

src/database.ts

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { mergeMap } from 'rxjs/operator/mergeMap';
66
import { map } from 'rxjs/operator/map';
77
import { _do } from 'rxjs/operator/do';
88
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';
1010

1111

1212
const IDB_SUCCESS = 'success';
@@ -37,19 +37,18 @@ export interface DBSchema {
3737
stores: {[storename: string]: DBStore};
3838
}
3939

40-
export function getIDBFactory(): IDBFactory {
40+
export function getIDBFactory() {
4141
return typeof window !== 'undefined' ? window.indexedDB : self.indexedDB;
4242
}
4343

44-
@Injectable()
4544
export class Database {
4645

4746
public changes: Subject<any> = new Subject();
4847

49-
private _idb: IDBFactory;
48+
private _idb;
5049
private _schema: DBSchema;
5150

52-
constructor(@Inject(DatabaseBackend) idbBackend: any, @Inject(IDB_SCHEMA) schema: any) {
51+
constructor(@Inject(DatabaseBackend) idbBackend, @Inject(IDB_SCHEMA) schema: DBSchema) {
5352
this._schema = schema;
5453
this._idb = idbBackend;
5554
}
@@ -270,6 +269,38 @@ export class Database {
270269
compare(a: any, b: any): number {
271270
return this._idb.cmp(a, b);
272271
}
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+
}
273304
}
274305

275306

0 commit comments

Comments
 (0)