Shared_Storage_Bridge script for the extension
Tento skript by neměl být instalován přímo. Jedná se o knihovnu, kterou by měly jiné skripty využívat pomocí meta příkazu // @require https://update.greasyfork.org/scripts/566657/1756895/Shared_Storage_Bridge.js
// ==UserScript==
// @name Shared_Storage_Bridge
// @description Shared_Storage_Bridge script for the extension
// @version 0.1
// ==/UserScript==
function createSharedStorages({ timeout = 3000, maxRetries = 3 } = {}) {
const pendingRequests = new Map();
function generateRequestId() {
return Math.random().toString(36).substring(2, 10);
}
function send(action, key, value = null) {
const id = generateRequestId();
let attempts = 0;
return new Promise((resolve, reject) => {
const trySend = () => {
attempts++;
const timer = setTimeout(() => {
pendingRequests.delete(id);
if (attempts < maxRetries) {
trySend(); // Retry
} else {
reject(new Error(`Request timed out after ${maxRetries} attempts`));
}
}, timeout);
// Store resolver to be called on success
pendingRequests.set(id, (msg) => {
clearTimeout(timer);
resolve(msg);
});
// Send message
window.postMessage(
{ direction: "toExtension", action, key, value, requestId: id },
"*"
);
};
trySend(); // Initial attempt
});
}
// Listen for responses
window.addEventListener("message", function (event) {
const msg = event.data;
if (msg?.direction !== "fromExtension") return;
const { requestId } = msg;
if (requestId && pendingRequests.has(requestId)) {
const resolver = pendingRequests.get(requestId);
pendingRequests.delete(requestId);
resolver(msg);
}
});
return { send };
}
window.SharedStorages = createSharedStorages();
const getSharedStorages = async (key) => {
let { value } = await window.SharedStorages.send("get", key);
try { return JSON.parse(value); } catch { return value; }
};
const setSharedStorages = (key, value) => window.SharedStorages.send("set", key, JSON.stringify(value));
const deleteSharedStorages = (key) => window.SharedStorages.send("delete", key);