42 lines
1.4 KiB
JavaScript
42 lines
1.4 KiB
JavaScript
// Settings shared by the page and the service worker. The service worker cannot read
|
|
// localStorage, so the sign-in lives in IndexedDB; the page keeps a copy in localStorage
|
|
// only for quick startup and falls back to IndexedDB.
|
|
|
|
const DB = 'sandbar-mobile';
|
|
|
|
function open() {
|
|
return new Promise((resolve, reject) => {
|
|
const r = indexedDB.open(DB, 1);
|
|
r.onupgradeneeded = () => r.result.createObjectStore('kv');
|
|
r.onsuccess = () => resolve(r.result);
|
|
r.onerror = () => reject(r.error);
|
|
});
|
|
}
|
|
|
|
export async function kvGet(key) {
|
|
const db = await open();
|
|
return new Promise((resolve, reject) => {
|
|
const r = db.transaction('kv').objectStore('kv').get(key);
|
|
r.onsuccess = () => resolve(r.result);
|
|
r.onerror = () => reject(r.error);
|
|
});
|
|
}
|
|
|
|
export async function kvSet(key, value) {
|
|
const db = await open();
|
|
return new Promise((resolve, reject) => {
|
|
const tx = db.transaction('kv', 'readwrite');
|
|
if (value === undefined) tx.objectStore('kv').delete(key);
|
|
else tx.objectStore('kv').put(value, key);
|
|
tx.oncomplete = () => resolve();
|
|
tx.onerror = () => reject(tx.error);
|
|
});
|
|
}
|
|
|
|
// session: { server, token, keyId, user }
|
|
export const getSession = () => kvGet('session');
|
|
export const setSession = (s) => kvSet('session', s);
|
|
// topics: the topics this device follows
|
|
export async function getTopics() { return (await kvGet('topics')) || ['alerts']; }
|
|
export const setTopics = (t) => kvSet('topics', t);
|