From 38fdb4a13115a30e94a87cc1a261006a82a9f42b Mon Sep 17 00:00:00 2001 From: Denis Davidyuk Date: Fri, 2 Oct 2020 14:25:38 +0300 Subject: [PATCH] Poll aepps in reverse iframe mode --- src/lib/wallet.js | 58 +++++++++++++++++++++++++++++------------------ 1 file changed, 36 insertions(+), 22 deletions(-) diff --git a/src/lib/wallet.js b/src/lib/wallet.js index db0a61d9a..258237aa4 100644 --- a/src/lib/wallet.js +++ b/src/lib/wallet.js @@ -154,30 +154,44 @@ export default { }); if (IN_FRAME) { - const connectedFrames = new Set(); - const connectToFrame = target => { - if (connectedFrames.has(target)) return; - connectedFrames.add(target); - const connection = BrowserWindowMessageConnection({ target }); - const originalConnect = connection.connect; - connection.connect = function connect(onMessage) { - originalConnect.call(this, (data, origin, source) => { - if (source !== target) return; - onMessage(data, origin, source); - }); - }; - sdk.addRpcClient(connection); - sdk.shareWalletInfo(connection.sendMessage.bind(connection)); - setTimeout(() => sdk.shareWalletInfo(connection.sendMessage.bind(connection)), 3000); + const getArrayOfAvailableFrames = () => [ + window.parent, + ...times(window.parent.frames.length, i => window.parent.frames[i]), + ]; + const executeAndSetInterval = (handler, timeout) => { + handler(); + return setInterval(handler, timeout); }; - connectToFrame(window.parent); - const connectToParentFrames = () => - times(window.parent.frames.length, i => window.parent.frames[i]) - .filter(frame => frame !== window) - .forEach(connectToFrame); - connectToParentFrames(); - setInterval(connectToParentFrames, 3000); + const connectedFrames = new Set(); + executeAndSetInterval( + () => + getArrayOfAvailableFrames() + .filter(frame => frame !== window) + .forEach(target => { + if (connectedFrames.has(target)) return; + connectedFrames.add(target); + const connection = BrowserWindowMessageConnection({ target }); + const originalConnect = connection.connect; + let intervalId; + connection.connect = function connect(onMessage) { + originalConnect.call(this, (data, origin, source) => { + if (source !== target) return; + clearInterval(intervalId); + onMessage(data, origin, source); + }); + }; + sdk.addRpcClient(connection); + intervalId = executeAndSetInterval(() => { + if (!getArrayOfAvailableFrames().includes(target)) { + clearInterval(intervalId); + return; + } + sdk.shareWalletInfo(connection.sendMessage.bind(connection)); + }, 3000); + }), + 3000, + ); } await store.commit('initSdk', sdk);