diff --git a/spec/database.spec.ts b/spec/database.spec.ts index db1b51a..22812d7 100644 --- a/spec/database.spec.ts +++ b/spec/database.spec.ts @@ -188,4 +188,29 @@ describe('database functionality', () => { }); }); + it('should clear store', (done) => { + let found; + idb.clear('todos').subscribe( + () => {}, + err => { + console.error(err), + done(err); + }, + () => { + idb.query('todos').toArray().subscribe( + (records) => { + found = records; + }, + err => { + console.error(err); + done(err); + }, + () => { + expect(found.length).toEqual(0); + done(); + } + ); + }) + }); + }); diff --git a/src/database.ts b/src/database.ts index b3e393c..bff56fd 100644 --- a/src/database.ts +++ b/src/database.ts @@ -269,6 +269,38 @@ export class Database { compare(a: any, b: any): number { return this._idb.cmp(a, b); } + + clear(storeName: string) { + const open$ = this.open(this._schema.name); + return mergeMap.call(open$, (db: IDBDatabase) => { + return new Observable( (txnObserver: Observer) => { + const recordSchema = this._schema.stores[storeName]; + const mapper = this._mapRecord(recordSchema); + const txn = db.transaction([storeName], IDB_TXN_READWRITE); + const objectStore = txn.objectStore(storeName); + + const clearRequest = objectStore.clear(); + + const onTxnError = (err: any) => txnObserver.error(err); + const onTxnComplete = () => txnObserver.complete(); + const onClear = () => txnObserver.next(null); + + txn.addEventListener(IDB_COMPLETE, onTxnComplete); + txn.addEventListener(IDB_ERROR, onTxnError); + + clearRequest.addEventListener(IDB_SUCCESS, onClear); + clearRequest.addEventListener(IDB_ERROR, onTxnError); + + return () => { + clearRequest.removeEventListener(IDB_SUCCESS, onClear); + clearRequest.removeEventListener(IDB_ERROR, onTxnError); + txn.removeEventListener(IDB_COMPLETE, onTxnComplete); + txn.removeEventListener(IDB_ERROR, onTxnError); + }; + + }); + }); + } }