From 01937dc9d5215ef96ce756e3ccda51bf29032f58 Mon Sep 17 00:00:00 2001 From: Wojtek Kosior Date: Mon, 10 May 2021 18:07:05 +0200 Subject: initial commit --- background/reverse_use_info.mjs | 93 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 background/reverse_use_info.mjs (limited to 'background/reverse_use_info.mjs') diff --git a/background/reverse_use_info.mjs b/background/reverse_use_info.mjs new file mode 100644 index 0000000..c38c52f --- /dev/null +++ b/background/reverse_use_info.mjs @@ -0,0 +1,93 @@ +/** +* Myext scripts and bundles usage index +* +* Copyright (C) 2021 Wojtek Kosior +* +* Dual-licensed under: +* - 0BSD license +* - GPLv3 or (at your option) any later version +*/ + +import TYPE_PREFIX from '/common/stored_types.mjs'; +import get_storage from './storage.mjs'; +import make_once from '/common/once.mjs'; + +"use strict"; + +/* + * We want to count referenes to scripts and bundles in order to know, + * for example, whether one can be safely deleted. + */ + +var component_uses = new Map(); +var storage; + +function add_use_info_by_item(prefix, item, components) +{ + for (let component of components) { + component = component.join(""); + + let used_by_info = component_uses.get(component); + + if (used_by_info === undefined) { + used_by_info = {}; + component_uses.set(component, used_by_info); + } + + if (used_by_info[prefix] === undefined) + used_by_info[prefix] = new Set(); + + used_by_info[prefix].add(item); + } +} + +function remove_use_info_by_item(prefix, item, components) +{ + for (let component of components) { + used_by_info = component_uses.get(component.join("")); + if (used_by_info === undefined || used_by_info[prefix] === undefined) + return; + + used_by_info[prefix].delete(item); + } +} + +function build_reverse_uses_info(entries_it, type_prefix) +{ + for (let [item, components] of storage.get_all_it(type_prefix)) + add_use_info_by_item(type_prefix, item, components); +} + +function handle_change(change) +{ + if (change.old_val !== undefined) + remove_use_info_by_item(change.prefix, change.item, change.old_val); + + if (change.new_val !== undefined) + add_use_info_by_item(change.prefix, change.item, change.new_val); +} + +function get_uses(arg1, arg2=undefined) +{ + let [prefix, item] = [arg1, arg2]; + + if (arg2 === undefined) + [prefix, item] = arg1; + + return component_uses.get(prefix + item); +} + +async function init() +{ + storage = await get_storage(); + + prefixes = [TYPE_PREFIX.PAGE, TYPE_PREFIX.BUNDLE]; + for (let prefix of prefixes) + build_reverse_uses_info(prefix); + + storage.add_change_listener(handle_change, prefixes); + + return get_uses; +} + +export default make_once(init); -- cgit v1.2.3