UNPKG

to-userscript

Version:

Converts simple browser extensions to userscripts

93 lines (73 loc) 2.34 kB
// --- Abstraction Layer: PostMessage Target let nextRequestId = 1; const pendingRequests = new Map(); // requestId -> { resolve, reject, timeout } function sendAbstractionRequest(method, args = []) { return new Promise((resolve, reject) => { const requestId = nextRequestId++; const timeout = setTimeout(() => { pendingRequests.delete(requestId); reject(new Error(`PostMessage request timeout for method: ${method}`)); }, 10000); pendingRequests.set(requestId, { resolve, reject, timeout }); window.parent.postMessage({ type: "abstraction-request", requestId, method, args, }); }); } window.addEventListener("message", (event) => { const { type, requestId, success, result, error } = event.data; if (type === "abstraction-response") { const pending = pendingRequests.get(requestId); if (pending) { clearTimeout(pending.timeout); pendingRequests.delete(requestId); if (success) { pending.resolve(result); } else { const err = new Error(error.message); err.stack = error.stack; pending.reject(err); } } } }); async function _storageSet(items) { return sendAbstractionRequest("_storageSet", [items]); } async function _storageGet(keys) { return sendAbstractionRequest("_storageGet", [keys]); } async function _storageRemove(keysToRemove) { return sendAbstractionRequest("_storageRemove", [keysToRemove]); } async function _storageClear() { return sendAbstractionRequest("_storageClear"); } async function _cookieList(details) { return sendAbstractionRequest("_cookieList", [details]); } async function _cookieSet(details) { return sendAbstractionRequest("_cookieSet", [details]); } async function _cookieDelete(details) { return sendAbstractionRequest("_cookieDelete", [details]); } async function _fetch(url, options) { return sendAbstractionRequest("_fetch", [url, options]); } function _registerMenuCommand(name, func) { _warn("_registerMenuCommand called from iframe context:", name); return sendAbstractionRequest("_registerMenuCommand", [ name, func.toString(), ]); } function _openTab(url, active) { return sendAbstractionRequest("_openTab", [url, active]); } async function _initStorage() { return sendAbstractionRequest("_initStorage"); }