blob: bb8225d9038eba7a9c8e9f6c33c8963efa789179 [file] [log] [blame]
// This task queue ensures that IDB open calls are done in their own tick
// and sequentially - i.e. we wait for the async IDB open to *fully* complete
// before calling the next one. This works around IE/Edge race conditions in IDB.
import { nextTick } from 'pouchdb-utils';
var running = false;
var queue = [];
function tryCode(fun, err, res, PouchDB) {
try {
fun(err, res);
} catch (err) {
// Shouldn't happen, but in some odd cases
// IndexedDB implementations might throw a sync
// error, in which case this will at least log it.
PouchDB.emit('error', err);
}
}
function applyNext() {
if (running || !queue.length) {
return;
}
running = true;
queue.shift()();
}
function enqueueTask(action, callback, PouchDB) {
queue.push(function runAction() {
action(function runCallback(err, res) {
tryCode(callback, err, res, PouchDB);
running = false;
nextTick(function runNext() {
applyNext(PouchDB);
});
});
});
applyNext();
}
export {
enqueueTask,
};