Skip to content

Commit

Permalink
Wait for current transactions to close db. Try to reopen DB. fix #452,
Browse files Browse the repository at this point in the history
…fix #708, fix #779
  • Loading branch information
charlag committed Nov 15, 2018
1 parent 9e147bc commit b74f08a
Showing 1 changed file with 27 additions and 13 deletions.
40 changes: 27 additions & 13 deletions src/api/worker/search/DbFacade.js
Expand Up @@ -14,8 +14,10 @@ const DB_VERSION = 2
export class DbFacade {
_id: string;
_db: LazyLoaded<IDBDatabase>;
_activeTransactions: number;

constructor(supported: boolean) {
this._activeTransactions = 0
this._db = new LazyLoaded(() => {
// If indexedDB is disabled in Firefox, the browser crashes when accessing indexedDB in worker process
// ask the main thread if indexedDB is supported.
Expand Down Expand Up @@ -60,7 +62,10 @@ export class DbFacade {
DBOpenRequest.onsuccess = (event) => {
//console.log("opened db", event)
DBOpenRequest.result.onabort = (event) => console.log("db aborted", event)
DBOpenRequest.result.onclose = (event) => console.log("db closed", event)
DBOpenRequest.result.onclose = (event) => {
console.log("db closed", event)
this._db.reset()
}
DBOpenRequest.result.onerror = (event) => console.log("db error", event)
callback(null, DBOpenRequest.result)
}
Expand Down Expand Up @@ -92,17 +97,21 @@ export class DbFacade {
*/
deleteDatabase(): Promise<void> {
if (this._db.isLoaded()) {
this._db.getLoaded().close()
return Promise.fromCallback(cb => {
let deleteRequest = indexedDB.deleteDatabase(this._db.getLoaded().name)
deleteRequest.onerror = (event) => {
cb(new DbError(`could not delete database ${this._db.getLoaded().name}`, event))
}
deleteRequest.onsuccess = (event) => {
this._db.reset()
cb()
}
})
if (this._activeTransactions > 0) {
return Promise.delay(150).then(() => this.deleteDatabase())
} else {
this._db.getLoaded().close()
return Promise.fromCallback(cb => {
let deleteRequest = indexedDB.deleteDatabase(this._db.getLoaded().name)
deleteRequest.onerror = (event) => {
cb(new DbError(`could not delete database ${this._db.getLoaded().name}`, event))
}
deleteRequest.onsuccess = (event) => {
this._db.reset()
cb()
}
})
}
} else {
return Promise.resolve()
}
Expand All @@ -114,7 +123,12 @@ export class DbFacade {
createTransaction(readOnly: boolean, objectStores: string[]): Promise<DbTransaction> {
return this._db.getAsync().then(db => {
try {
return new DbTransaction(db.transaction(objectStores, readOnly ? "readonly" : "readwrite"))
const transaction = new DbTransaction(db.transaction(objectStores, readOnly ? "readonly" : "readwrite"))
this._activeTransactions++
transaction.wait().finally(() => {
this._activeTransactions--
})
return transaction
} catch (e) {
throw new DbError("could not create transaction", e)
}
Expand Down

0 comments on commit b74f08a

Please sign in to comment.