57 行
1.2 KiB
JavaScript
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'));
|
|
});
|