26b75e77b3
* use Proxy for `db` * don't merge arrays in deepMerge by default * extract sync and cache from styleMan
65 lines
1.4 KiB
JavaScript
65 lines
1.4 KiB
JavaScript
/* global chromeLocal */// storage-util.js
|
|
'use strict';
|
|
|
|
/* exported createChromeStorageDB */
|
|
function createChromeStorageDB(PREFIX) {
|
|
let INC;
|
|
const isMain = !PREFIX;
|
|
if (!PREFIX) PREFIX = 'style-';
|
|
|
|
return {
|
|
|
|
delete(id) {
|
|
return chromeLocal.remove(PREFIX + id);
|
|
},
|
|
|
|
get(id) {
|
|
return chromeLocal.getValue(PREFIX + id);
|
|
},
|
|
|
|
async getAll() {
|
|
const all = await chromeLocal.get();
|
|
if (!INC) prepareInc(all);
|
|
return Object.entries(all)
|
|
.map(([key, val]) => key.startsWith(PREFIX) &&
|
|
(!isMain || Number(key.slice(PREFIX.length))) &&
|
|
val)
|
|
.filter(Boolean);
|
|
},
|
|
|
|
async put(item) {
|
|
if (!item.id) {
|
|
if (!INC) await prepareInc();
|
|
item.id = INC++;
|
|
}
|
|
await chromeLocal.setValue(PREFIX + item.id, item);
|
|
return item.id;
|
|
},
|
|
|
|
async putMany(items) {
|
|
const data = {};
|
|
for (const item of items) {
|
|
if (!item.id) {
|
|
if (!INC) await prepareInc();
|
|
item.id = INC++;
|
|
}
|
|
data[PREFIX + item.id] = item;
|
|
}
|
|
await chromeLocal.set(data);
|
|
return items.map(_ => _.id);
|
|
},
|
|
};
|
|
|
|
async function prepareInc(data) {
|
|
INC = 1;
|
|
for (const key in data || await chromeLocal.get()) {
|
|
if (key.startsWith(PREFIX)) {
|
|
const id = Number(key.slice(PREFIX.length));
|
|
if (id >= INC) {
|
|
INC = id + 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|