96 lines
2.5 KiB
JavaScript
96 lines
2.5 KiB
JavaScript
(() => {
|
|
function openDatabase(cacheConfig) {
|
|
return new Promise((resolve, reject) => {
|
|
if (!globalThis.indexedDB) {
|
|
reject(new Error("IndexedDB is not available in this browser context."));
|
|
return;
|
|
}
|
|
|
|
const request = globalThis.indexedDB.open(
|
|
cacheConfig.dbName,
|
|
cacheConfig.dbVersion
|
|
);
|
|
|
|
request.onupgradeneeded = () => {
|
|
const database = request.result;
|
|
|
|
if (!database.objectStoreNames.contains(cacheConfig.storeName)) {
|
|
database.createObjectStore(cacheConfig.storeName, { keyPath: "key" });
|
|
}
|
|
};
|
|
|
|
request.onsuccess = () => {
|
|
resolve(request.result);
|
|
};
|
|
|
|
request.onerror = () => {
|
|
reject(request.error || new Error("Unable to open IndexedDB cache."));
|
|
};
|
|
});
|
|
}
|
|
|
|
async function withStore(cacheConfig, mode, callback) {
|
|
const database = await openDatabase(cacheConfig);
|
|
|
|
return new Promise((resolve, reject) => {
|
|
const transaction = database.transaction(cacheConfig.storeName, mode);
|
|
const store = transaction.objectStore(cacheConfig.storeName);
|
|
|
|
transaction.oncomplete = () => {
|
|
database.close();
|
|
};
|
|
|
|
transaction.onerror = () => {
|
|
const error =
|
|
transaction.error || new Error("IndexedDB transaction failed.");
|
|
database.close();
|
|
reject(error);
|
|
};
|
|
|
|
transaction.onabort = () => {
|
|
const error =
|
|
transaction.error || new Error("IndexedDB transaction was aborted.");
|
|
database.close();
|
|
reject(error);
|
|
};
|
|
|
|
callback(store, resolve, reject);
|
|
});
|
|
}
|
|
|
|
function readRecord(cacheConfig, key, errorMessage) {
|
|
return withStore(cacheConfig, "readonly", (store, resolve, reject) => {
|
|
const request = store.get(key);
|
|
|
|
request.onsuccess = () => {
|
|
resolve(request.result || null);
|
|
};
|
|
|
|
request.onerror = () => {
|
|
reject(request.error || new Error(errorMessage || "Unable to read cache."));
|
|
};
|
|
});
|
|
}
|
|
|
|
function writeRecord(cacheConfig, record, errorMessage) {
|
|
return withStore(cacheConfig, "readwrite", (store, resolve, reject) => {
|
|
const request = store.put(record);
|
|
|
|
request.onsuccess = () => {
|
|
resolve();
|
|
};
|
|
|
|
request.onerror = () => {
|
|
reject(request.error || new Error(errorMessage || "Unable to write cache."));
|
|
};
|
|
});
|
|
}
|
|
|
|
globalThis.ArchPanelStorageService = Object.freeze({
|
|
openDatabase,
|
|
withStore,
|
|
readRecord,
|
|
writeRecord,
|
|
});
|
|
})();
|