diff --git a/extension/injected.js b/extension/injected.js new file mode 100644 index 0000000..61e4d73 --- /dev/null +++ b/extension/injected.js @@ -0,0 +1,29 @@ +(() => { + if (window.inscriboor) return; + const pending = new Map(); + window.addEventListener("message", event => { + if (event.source !== window || event.data?.source !== "inscriboor-extension") return; + const request = pending.get(event.data.id); + if (!request) return; + pending.delete(event.data.id); + event.data.error ? request.reject(new Error(event.data.error)) : request.resolve(event.data.result); + }); + const provider = Object.freeze({ + isInscriboor: true, + request({ method, params = {} } = {}) { + if (typeof method !== "string" || !method) return Promise.reject(new Error("A provider method is required.")); + const id = crypto.randomUUID(); + return new Promise((resolve, reject) => { + pending.set(id, { resolve, reject }); + window.postMessage({ source: "inscriboor-page", id, method, params }, "*"); + setTimeout(() => { + if (!pending.has(id)) return; + pending.delete(id); + reject(new Error("Inscriboor request timed out.")); + }, 120000); + }); + } + }); + Object.defineProperty(window, "inscriboor", { value: provider, configurable: false, writable: false }); + window.dispatchEvent(new Event("inscriboor#initialized")); +})();