offline-web/static/client.js

82 lines
2.4 KiB
JavaScript
Raw Normal View History

2025-03-30 21:18:08 -04:00
export { bootstrap };
// 1. Record a start time.
// 2. Load the bootstrap document.
// 3. Load all the content_addresses from the bootstrap.
// 4. Record the end time.
async function load_bootstrap() {
let response = await fetch("/api/v1/ref/all/username");
if (!response.ok) {
throw new Error("Network response was not ok: " + response.statusText);
}
return await response.json();
}
/**
* @param {String} dbName
* @param {Array<String>} storeNames
* @returns {Promise<IDBDatabase>}
*/
async function openDatabase(dbName, storeNames) {
return await new Promise((resolve, reject) => {
const request = indexedDB.open(dbName, 1);
request.onupgradeneeded = (event) => {
const db = event.target.result;
for (var storeName of storeNames) {
// Create the object store if it doesn't exist
if (!db.objectStoreNames.contains(storeName)) {
db.createObjectStore(storeName);
}
}
};
request.onsuccess = (event) => {
const db = event.target.result;
resolve(db);
};
request.onerror = (event) => {
reject(event.target.error);
};
});
}
/**
* @param {IDBObjectStore} store
* @param {Object} reference
*/
function load_reference_paths(store, reference) {
let root_path = reference.path;
return new Promise(async (resolve, reject) => {
if (reference.dependents) {
for (var dep of reference.dependents) {
await load_reference_paths(store, dep);
}
}
const request = store.put(JSON.stringify(reference), root_path);
request.onerror = (evt) => {
reject(evt.target.error);
console.log("Failed to store object", evt);
};
request.onsuccess = (evt) => {
resolve(evt.target.result);
};
});
}
async function bootstrap() {
const refStoreName = "references"
const objectStoreName = "objects"
const databaseName = "MerkleStore";
const start = new Date().getTime();
let root = await load_bootstrap();
let db = await openDatabase(databaseName, [refStoreName, objectStoreName]);
const transaction = db.transaction([refStoreName], "readwrite");
const store = transaction.objectStore(refStoreName);
load_reference_paths(store, root);
var end = new Date().getTime();
return end - start;
}