82 lines
2.4 KiB
JavaScript
82 lines
2.4 KiB
JavaScript
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;
|
|
}
|