/** Relay qortalRequest from embedded child iframes (websites) to Hub via Qortal Web. */ (function () { function isChildFrameSource(src) { if (!src || src === window) return false; try { var ifr = document.getElementsByTagName('iframe'); for (var i = 0; i < ifr.length; i++) { if (ifr[i].contentWindow === src) return true; } } catch (e) { return false; } return false; } window.addEventListener('message', function (ev) { if (!ev || !ev.data) return; if (!ev.ports || !ev.ports[0]) return; if (typeof ev.data.action !== 'string' || !ev.data.action) return; if (!isChildFrameSource(ev.source)) return; var port = ev.ports[0]; function replyRes(res) { try { port.postMessage({ result: res, error: null }); } catch (e) {} } function replyErr(err) { var msg; if (err == null) msg = 'Unknown error'; else if (typeof err === 'string') msg = err; else if (err && typeof err === 'object' && 'message' in err) msg = String(err.message); else msg = String(err); try { port.postMessage({ result: null, error: { message: msg } }); } catch (e) {} } if (typeof window.qortalRequest === 'function') { var clean = {}; for (var k in ev.data) { if (Object.prototype.hasOwnProperty.call(ev.data, k) && k !== 'requestedHandler') clean[k] = ev.data[k]; } var run = typeof window.qortalRequestWithNoTimeout === 'function' ? window.qortalRequestWithNoTimeout(clean) : window.qortalRequest(clean); run.then(replyRes, function (e) { replyErr(e); }); return; } if (window.top && window.top !== window) { try { window.top.postMessage(ev.data, '*', [port]); } catch (e) { replyErr(e); } return; } replyErr('No Qortal bridge on this page for embedded website'); }); })();