paraMatrix/src/storage.js

57 行
1.2 KiB
JavaScript

/* global browser */
var STORAGE_DEFAULTS = {
'rules': {},
'savedRules': {},
'requests': {},
'recording': true,
};
var STORAGE_AREAS = {
'rules': browser.storage.local,
'savedRules': browser.storage.local,
'requests': browser.storage.session,
'recording': browser.storage.local,
};
var lock = Promise.resolve();
var cache = {};
var _get = async function(key) {
var data = await STORAGE_AREAS[key].get(key);
return data[key] ?? STORAGE_DEFAULTS[key];
};
export var get = function(key) {
if (!cache[key]) {
cache[key] = _get(key);
}
return cache[key];
};
var _change = async function(key, fn) {
var oldValue = await get(key);
var data = {};
data[key] = fn(oldValue);
delete cache[key];
await STORAGE_AREAS[key].set(data);
};
export var change = async function(key, fn) {
lock = lock.then(() => _change(key, fn));
await lock;
};
var invalidateCache = function(changes) {
for (var key in changes) {
delete cache[key];
}
};
browser.storage.local.onChanged.addListener(invalidateCache);
// migrations
browser.runtime.onInstalled.addListener(() => {
// 0.8.0: store requests to session storage
lock = lock.then(() => browser.storage.local.remove('requests'));
});