b54a3139c7
Includes QWB, Qortal Web, and Q-Shops Q-Apps with shared packages and build scripts. Co-authored-by: Cursor <cursoragent@cursor.com>
64 lines
1.9 KiB
JavaScript
64 lines
1.9 KiB
JavaScript
/** 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');
|
|
});
|
|
})();
|