diff options
Diffstat (limited to 'common')
-rw-r--r-- | common/indexeddb.js | 60 |
1 files changed, 33 insertions, 27 deletions
diff --git a/common/indexeddb.js b/common/indexeddb.js index 371d491..cf38d23 100644 --- a/common/indexeddb.js +++ b/common/indexeddb.js @@ -59,13 +59,13 @@ const nr_reductor = ([i, s], num) => [i - 1, s + num * 1024 ** i]; const version_nr = ver => ver.slice(0, 3).reduce(nr_reductor, [2, 0])[1]; const stores = [ - ["files", {keyPath: "sha256"}], + ["file", {keyPath: "sha256"}], ["file_uses", {keyPath: "sha256"}], ["resource", {keyPath: "identifier"}], ["mapping", {keyPath: "identifier"}], - ["settings", {keyPath: "name"}], + ["setting", {keyPath: "name"}], ["blocking", {keyPath: "pattern"}], - ["repos", {keyPath: "url"}] + ["repo", {keyPath: "url"}] ]; let db = null; @@ -111,7 +111,7 @@ async function perform_upgrade(event) { store = opened_db.createObjectStore(store_name, key_mode); const ctx = make_context(store.transaction, initial_data.file); - await _save_items(initial_data.resources, initial_data.mappings, ctx); + await _save_items(initial_data.resource, initial_data.mapping, [], ctx); return opened_db; } @@ -186,7 +186,7 @@ function make_context(transaction, files) async function start_items_transaction(item_store_names, files) { const db = await get_db(); - const scope = [...item_store_names, "files", "file_uses"]; + const scope = [...item_store_names, "file", "file_uses"]; return make_context(db.transaction(scope, "readwrite"), files); } #EXPORT start_items_transaction @@ -226,7 +226,7 @@ async function finalize_transaction(context) if (uses.uses < 1) { if (!is_new) { idb_del(context.transaction, "file_uses", sha256); - idb_del(context.transaction, "files", sha256); + idb_del(context.transaction, "file", sha256); } continue; @@ -246,7 +246,7 @@ async function finalize_transaction(context) throw "file not present: " + sha256; } - idb_put(context.transaction, "files", {sha256, contents: file}); + idb_put(context.transaction, "file", {sha256, contents: file}); } return context.result; @@ -257,7 +257,7 @@ async function finalize_transaction(context) * How a sample data argument to the function below might look like: * * data = { - * resources: { + * resource: { * "resource1": { * "1": { * // some stuff @@ -272,7 +272,7 @@ async function finalize_transaction(context) * } * }, * }, - * mappings: { + * mapping: { * "mapping1": { * "2": { * // some stuff @@ -295,13 +295,16 @@ async function finalize_transaction(context) async function save_items(data) { const item_store_names = ["resource", "mapping"]; + if ("repo" in data) + item_store_names.push("repo"); + const context = await start_items_transaction(item_store_names, data.file); - return _save_items(data.resources, data.mappings, context); + return _save_items(data.resource, data.mapping, data.repo || [], context); } #EXPORT save_items -async function _save_items(resources, mappings, context) +async function _save_items(resources, mappings, repos, context) { resources = Object.values(resources || {}).map(entities.get_newest); mappings = Object.values(mappings || {}).map(entities.get_newest); @@ -309,6 +312,9 @@ async function _save_items(resources, mappings, context) for (const item of resources.concat(mappings)) await save_item(item, context); + for (const repo_url of repos) + await idb_put(context.transaction, "repo", {url: repo_url}); + await finalize_transaction(context); } @@ -378,7 +384,7 @@ async function get_all(store_name) /* * A simplified kind of transaction for modifying stores without special - * inter-store integrity constraints ("settings", "blocking", "repos"). + * inter-store integrity constraints ("setting", "blocking", "repo"). */ async function start_simple_transaction(store_name) { @@ -386,20 +392,20 @@ async function start_simple_transaction(store_name) return make_context(db.transaction(store_name, "readwrite"), {}); } -/* Functions to access the "settings" store. */ +/* Functions to access the "setting" store. */ async function set_setting(name, value) { - const context = await start_simple_transaction("settings"); - broadcast.prepare(context.sender, "idb_changes_settings", name); - await idb_put(context.transaction, "settings", {name, value}); + const context = await start_simple_transaction("setting"); + broadcast.prepare(context.sender, "idb_changes_setting", name); + await idb_put(context.transaction, "setting", {name, value}); return finalize_transaction(context); } #EXPORT set_setting async function get_setting(name) { - const transaction = (await get_db()).transaction("settings"); - return ((await idb_get(transaction, "settings", name)) || {}).value; + const transaction = (await get_db()).transaction("setting"); + return ((await idb_get(transaction, "setting", name)) || {}).value; } #EXPORT get_setting @@ -429,15 +435,15 @@ async function get_allowing(pattern) } #EXPORT get_allowing -/* Functions to access the "repos" store. */ +/* Functions to access the "repo" store. */ async function set_repo(url, remove=false) { - const context = await start_simple_transaction("repos"); - broadcast.prepare(context.sender, "idb_changes_repos", url); + const context = await start_simple_transaction("repo"); + broadcast.prepare(context.sender, "idb_changes_repo", url); if (remove) - await idb_del(context.transaction, "repos", url); + await idb_del(context.transaction, "repo", url); else - await idb_put(context.transaction, "repos", {url}); + await idb_put(context.transaction, "repo", {url}); return finalize_transaction(context); } #EXPORT set_repo @@ -445,7 +451,7 @@ async function set_repo(url, remove=false) const del_repo = url => set_repo(url, true); #EXPORT del_repo -const get_repos = () => get_all("repos").then(list => list.map(obj => obj.url)); +const get_repos = () => get_all("repo").then(list => list.map(obj => obj.url)); #EXPORT get_repos /* Callback used when listening to broadcasts while tracking db changes. */ @@ -460,8 +466,8 @@ async function track_change(tracking, key) /* * Monitor changes to `store_name` IndexedDB object store. * - * `store_name` should be either "resource", "mapping", "settings", "blocking" - * or "repos". + * `store_name` should be either "resource", "mapping", "setting", "blocking" + * or "repo". * * `onchange` should be a callback that will be called when an item is added, * modified or removed from the store. The callback will be passed an object @@ -492,7 +498,7 @@ async function start_tracking(store_name, onchange) } const track = {}; -const trackable = ["resource", "mapping", "settings", "blocking", "repos"]; +const trackable = ["resource", "mapping", "setting", "blocking", "repo"]; for (const store_name of trackable) track[store_name] = onchange => start_tracking(store_name, onchange); #EXPORT track |