/** * Myext storage through connection (server side) * * Copyright (C) 2021 Wojtek Kosior * * This code is dual-licensed under: * - Asshole license 1.0, * - GPLv3 or (at your option) any later version * * "dual-licensed" means you can choose the license you prefer. * * This code is released under a permissive license because I disapprove of * copyright and wouldn't be willing to sue a violator. Despite not putting * this code under copyleft (which is also kind of copyright), I do not want * it to be made proprietary. Hence, the permissive alternative to GPL is the * Asshole license 1.0 that allows me to call you an asshole if you use it. * This means you're legally ok regardless of how you utilize this code but if * you make it into something nonfree, you're an asshole. * * You should have received a copy of both GPLv3 and Asshole license 1.0 * together with this code. If not, please see: * - https://www.gnu.org/licenses/gpl-3.0.en.html * - https://koszko.org/asshole-license.txt */ "use strict"; (() => { const listen_for_connection = window.listen_for_connection; const get_storage = window.get_storage; const TYPE_PREFIX = window.TYPE_PREFIX; const CONNECTION_TYPE = window.CONNECTION_TYPE; var storage; async function handle_remote_call(port, message) { let [call_id, func, args] = message; try { let result = await Promise.resolve(storage[func](...args)); port.postMessage({call_id, result}); } catch (error) { error = error + ''; port.postMessage({call_id, error}); } } function remove_storage_listener(cb) { storage.remove_change_listener(cb); } function new_connection(port) { console.log("new remote storage connection!"); port.postMessage({ [TYPE_PREFIX.SCRIPT] : storage.get_all(TYPE_PREFIX.SCRIPT), [TYPE_PREFIX.BAG] : storage.get_all(TYPE_PREFIX.BAG), [TYPE_PREFIX.PAGE] : storage.get_all(TYPE_PREFIX.PAGE) }); let handle_change = change => port.postMessage(change); storage.add_change_listener(handle_change); port.onMessage.addListener(m => handle_remote_call(port, m)); port.onDisconnect.addListener(() => remove_storage_listener(handle_change)); } async function start() { storage = await get_storage(); listen_for_connection(CONNECTION_TYPE.REMOTE_STORAGE, new_connection); } window.start_storage_server = start; })();