You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
buster/src/storage/storage.js

74 lines
1.8 KiB
JavaScript

import {storageRevisions} from 'utils/config';
async function isStorageArea({area = 'local'} = {}) {
try {
await browser.storage[area].get('');
return true;
} catch (err) {
return false;
}
}
const storageReady = {};
async function isStorageReady({area = 'local'} = {}) {
if (storageReady[area]) {
return true;
} else {
const {storageVersion} = await browser.storage[area].get('storageVersion');
if (storageVersion && storageVersion === storageRevisions[area]) {
storageReady[area] = true;
return true;
}
}
return false;
}
async function ensureStorageReady({area = 'local'} = {}) {
if (!storageReady[area]) {
return new Promise((resolve, reject) => {
let stop;
const checkStorage = async function () {
if (await isStorageReady({area})) {
window.clearTimeout(timeoutId);
resolve();
} else if (stop) {
reject(new Error(`Storage (${area}) is not ready`));
} else {
window.setTimeout(checkStorage, 30);
}
};
const timeoutId = window.setTimeout(function () {
stop = true;
}, 60000); // 1 minute
checkStorage();
});
}
}
async function get(keys = null, {area = 'local'} = {}) {
await ensureStorageReady({area});
return browser.storage[area].get(keys);
}
async function set(obj, {area = 'local'} = {}) {
await ensureStorageReady({area});
return browser.storage[area].set(obj);
}
async function remove(keys, {area = 'local'} = {}) {
await ensureStorageReady({area});
return browser.storage[area].remove(keys);
}
async function clear({area = 'local'} = {}) {
await ensureStorageReady({area});
return browser.storage[area].clear();
}
export default {get, set, remove, clear};
export {isStorageArea, isStorageReady, ensureStorageReady};