cydd / static /js /utils /offline-store.js
chaofenghui's picture
Upload folder using huggingface_hub
dd92d97 verified
Raw
History Blame Contribute Delete
2.96 kB
(function () {
const DB_NAME = 'ShortTrackOffline';
const DB_VERSION = 1;
let dbInstance = null;
const cache = new Map();
function open() {
return new Promise((resolve, reject) => {
if (dbInstance) { resolve(dbInstance); return; }
const req = indexedDB.open(DB_NAME, DB_VERSION);
req.onupgradeneeded = (e) => {
const db = e.target.result;
if (!db.objectStoreNames.contains('data')) {
db.createObjectStore('data', { keyPath: 'key' });
}
};
req.onsuccess = (e) => { dbInstance = e.target.result; resolve(dbInstance); };
req.onerror = (e) => reject(e.target.error);
});
}
async function save(key, data) {
cache.set(key, data);
try {
const db = await open();
const tx = db.transaction('data', 'readwrite');
tx.objectStore('data').put({ key, data, updatedAt: Date.now() });
await new Promise((res, rej) => { tx.oncomplete = res; tx.onerror = rej; });
} catch (e) { console.log('OfflineStore.save error:', e); }
}
async function get(key) {
try {
const db = await open();
const tx = db.transaction('data', 'readonly');
const req = tx.objectStore('data').get(key);
return new Promise((resolve) => { req.onsuccess = () => resolve(req.result?.data || null); req.onerror = () => resolve(null); });
} catch (e) { return null; }
}
function cacheGet(key) {
return cache.get(key);
}
function cacheSet(key, data) {
cache.set(key, data);
}
function cacheDelete(key) {
cache.delete(key);
}
async function restoreCache() {
try {
const db = await open();
const tx = db.transaction('data', 'readonly');
const store = tx.objectStore('data');
return new Promise((resolve) => {
const req = store.openCursor();
req.onsuccess = (e) => {
const cursor = e.target.result;
if (cursor) {
cache.set(cursor.value.key, cursor.value.data);
cursor.continue();
} else {
resolve();
}
};
req.onerror = () => resolve();
});
} catch (e) { return; }
}
async function remove(key) {
cache.delete(key);
try {
const db = await open();
const tx = db.transaction('data', 'readwrite');
tx.objectStore('data').delete(key);
} catch (e) {}
}
window.OfflineStore = {
open,
save,
get,
cacheGet,
cacheSet,
cacheDelete,
restoreCache,
remove,
get cache() { return cache; },
};
})();