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} storeNames * @returns {Promise} */ 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; }