async function cachedExpFetchTranslate(text, sourceLang, targetLang) {
async function openDatabase() {
return new Promise((resolve, reject) => {
const request = indexedDB.open("TranslationCacheDB", 1);
request.onerror = (event) => {
reject("IndexedDB error: ", event.target.errorCode);
};
request.onupgradeneeded = (event) => {
const db = event.target.result;
db.createObjectStore("translations", { keyPath: "key" });
};
request.onsuccess = (event) => {
resolve(event.target.result);
};
});
}
async function getCachedTranslation(db, key) {
return new Promise((resolve, reject) => {
const transaction = db.transaction(["translations"], "readonly");
const store = transaction.objectStore("translations");
const request = store.get(key);
request.onsuccess = (event) => {
if (event.target.result) {
resolve(event.target.result.translation);
} else {
resolve(null);
}
};
request.onerror = (event) => {
reject("Error in retrieving from IndexedDB: ", event.target.errorCode);
};
});
}
async function cacheTranslation(db, key, translation) {
return new Promise((resolve, reject) => {
const transaction = db.transaction(["translations"], "readwrite");
const store = transaction.objectStore("translations");
const request = store.put({ key, translation });
request.onsuccess = () => {
resolve();
};
request.onerror = (event) => {
reject("Error in saving to IndexedDB: ", event.target.errorCode);
};
});
}
const db = await openDatabase();
const key = `${text}-${sourceLang}-${targetLang}`;
const cachedTranslation = await getCachedTranslation(db, key);
if (cachedTranslation) {
return cachedTranslation;
} else {
const translation = await expFetchTranslate(text, sourceLang, targetLang);
await cacheTranslation(db, key, translation);
return translation;
}
}