68 lines
2 KiB
JavaScript
68 lines
2 KiB
JavaScript
/* global indexedDB */
|
|
|
|
// Module for interacting with IndexedDB without Backbone IndexedDB adapter
|
|
// and using promises. Revisit use of `idb` dependency as it might cover
|
|
// this functionality.
|
|
|
|
const { isObject, isNumber } = require('lodash');
|
|
|
|
exports.open = (name, version, { onUpgradeNeeded } = {}) => {
|
|
const request = indexedDB.open(name, version);
|
|
return new Promise((resolve, reject) => {
|
|
request.onblocked = () => reject(new Error('Database blocked'));
|
|
|
|
request.onupgradeneeded = event => {
|
|
const hasRequestedSpecificVersion = isNumber(version);
|
|
if (!hasRequestedSpecificVersion) {
|
|
return;
|
|
}
|
|
|
|
const { newVersion, oldVersion } = event;
|
|
if (onUpgradeNeeded) {
|
|
const { transaction } = event.target;
|
|
onUpgradeNeeded({ oldVersion, transaction });
|
|
return;
|
|
}
|
|
|
|
reject(
|
|
new Error(
|
|
'Database upgrade required:' +
|
|
` oldVersion: ${oldVersion}, newVersion: ${newVersion}`
|
|
)
|
|
);
|
|
};
|
|
|
|
request.onerror = event => reject(event.target.error);
|
|
|
|
request.onsuccess = event => {
|
|
const connection = event.target.result;
|
|
resolve(connection);
|
|
};
|
|
});
|
|
};
|
|
|
|
exports.completeTransaction = transaction =>
|
|
new Promise((resolve, reject) => {
|
|
transaction.addEventListener('abort', event => reject(event.target.error));
|
|
transaction.addEventListener('error', event => reject(event.target.error));
|
|
transaction.addEventListener('complete', () => resolve());
|
|
});
|
|
|
|
exports.getVersion = async name => {
|
|
const connection = await exports.open(name);
|
|
const { version } = connection;
|
|
connection.close();
|
|
return version;
|
|
};
|
|
|
|
exports.getCount = async ({ store } = {}) => {
|
|
if (!isObject(store)) {
|
|
throw new TypeError("'store' is required");
|
|
}
|
|
|
|
const request = store.count();
|
|
return new Promise((resolve, reject) => {
|
|
request.onerror = event => reject(event.target.error);
|
|
request.onsuccess = event => resolve(event.target.result);
|
|
});
|
|
};
|