Files
arch-panel-extension-browser/src/services/storage-service.js

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,
});
})();