/** * 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);