use js_sys::Array;
use wasm_bindgen::prelude::*;
use wasm_bindgen::JsCast;
#[wasm_bindgen(inline_js = r#"
const DB_NAME = "oxillama-model-cache";
const STORE_NAME = "models";
function openDb() {
return new Promise((resolve, reject) => {
const req = indexedDB.open(DB_NAME, 1);
req.onupgradeneeded = (e) => {
e.target.result.createObjectStore(STORE_NAME);
};
req.onsuccess = (e) => resolve(e.target.result);
req.onerror = (e) => reject(e.target.error);
});
}
export async function idb_put_model(name, data) {
const db = await openDb();
return new Promise((resolve, reject) => {
const tx = db.transaction(STORE_NAME, "readwrite");
tx.objectStore(STORE_NAME).put(data, name);
tx.oncomplete = () => resolve();
tx.onerror = (e) => reject(e.target.error);
});
}
export async function idb_get_model(name) {
const db = await openDb();
return new Promise((resolve, reject) => {
const tx = db.transaction(STORE_NAME, "readonly");
const req = tx.objectStore(STORE_NAME).get(name);
req.onsuccess = (e) => resolve(e.target.result ?? null);
req.onerror = (e) => reject(e.target.error);
});
}
export async function idb_list_models() {
const db = await openDb();
return new Promise((resolve, reject) => {
const tx = db.transaction(STORE_NAME, "readonly");
const req = tx.objectStore(STORE_NAME).getAllKeys();
req.onsuccess = (e) => resolve(e.target.result);
req.onerror = (e) => reject(e.target.error);
});
}
export async function idb_delete_model(name) {
const db = await openDb();
return new Promise((resolve, reject) => {
const tx = db.transaction(STORE_NAME, "readwrite");
tx.objectStore(STORE_NAME).delete(name);
tx.oncomplete = () => resolve();
tx.onerror = (e) => reject(e.target.error);
});
}
"#)]
extern "C" {
async fn idb_put_model(name: &str, data: &[u8]) -> JsValue;
async fn idb_get_model(name: &str) -> JsValue;
async fn idb_list_models() -> JsValue;
async fn idb_delete_model(name: &str) -> JsValue;
}
#[wasm_bindgen(js_name = cacheModel)]
pub async fn cache_model(name: &str, data: &[u8]) -> Result<(), JsValue> {
idb_put_model(name, data).await;
Ok(())
}
#[wasm_bindgen(js_name = loadCachedModel)]
pub async fn load_cached_model(name: &str) -> Result<JsValue, JsValue> {
let result = idb_get_model(name).await;
Ok(result)
}
#[wasm_bindgen(js_name = listCachedModels)]
pub async fn list_cached_models() -> Result<Array, JsValue> {
let result = idb_list_models().await;
result
.dyn_into::<Array>()
.map_err(|_| JsValue::from_str("Expected Array from idb_list_models"))
}
#[wasm_bindgen(js_name = deleteCachedModel)]
pub async fn delete_cached_model(name: &str) -> Result<(), JsValue> {
idb_delete_model(name).await;
Ok(())
}