From 97e86308ce19f673ae8873954a82021082476b46 Mon Sep 17 00:00:00 2001 From: Sosthene Date: Tue, 15 Jul 2025 21:18:44 +0200 Subject: [PATCH] [bug] make MessageBus more reliable --- src/sdk/Iframe.tsx | 3 --- src/sdk/IframeReference.ts | 5 ++++ src/sdk/MessageBus.ts | 52 ++++++++++++++------------------------ 3 files changed, 24 insertions(+), 36 deletions(-) diff --git a/src/sdk/Iframe.tsx b/src/sdk/Iframe.tsx index f410736e..01bc3f08 100644 --- a/src/sdk/Iframe.tsx +++ b/src/sdk/Iframe.tsx @@ -12,9 +12,6 @@ function Iframe({ showIframe = false }: IframeProps) { if (iframeRef.current) { IframeReference.setIframe(iframeRef.current); } - return () => { - IframeReference.setIframe(null); - }; }, [iframeRef.current]); return ( diff --git a/src/sdk/IframeReference.ts b/src/sdk/IframeReference.ts index b47c0476..4e27472a 100644 --- a/src/sdk/IframeReference.ts +++ b/src/sdk/IframeReference.ts @@ -5,6 +5,11 @@ export default class IframeReference { private constructor() { } public static setTargetOrigin(targetOrigin: string): void { + if (this.targetOrigin) { + console.debug("targetOrigin is already set"); + return; + } + try { new URL(targetOrigin); this.targetOrigin = targetOrigin; diff --git a/src/sdk/MessageBus.ts b/src/sdk/MessageBus.ts index b75165d3..aeb6316f 100644 --- a/src/sdk/MessageBus.ts +++ b/src/sdk/MessageBus.ts @@ -759,17 +759,15 @@ export default class MessageBus { } private sendMessage(message: any): void { - const targetOrigin = IframeReference.getTargetOrigin(); - if (!targetOrigin) { - console.error('[MessageBus] sendMessage: targetOrigin not found'); - return; - } - const iframe = IframeReference.getIframe(); - if (!iframe) { - console.error('[MessageBus] sendMessage: iframe not found'); - return; - } - iframe.contentWindow?.postMessage(message, targetOrigin); + this.isReady().then(() => { + try { + const targetOrigin = IframeReference.getTargetOrigin(); + const iframe = IframeReference.getIframe(); + iframe.contentWindow?.postMessage(message, targetOrigin); + } catch (error) { + console.error('[MessageBus] sendMessage: error', error); + } + }).catch(console.error); } private handleMessage(event: MessageEvent): void { @@ -777,30 +775,18 @@ export default class MessageBus { return; } - const iframe = IframeReference.getIframe(); - if (!iframe) { - console.error('[MessageBus] handleMessage: iframe not found'); - return; - } + try { + const targetOrigin = IframeReference.getTargetOrigin(); - if (event.source !== iframe.contentWindow) { - console.error('[MessageBus] handleMessage: source not match'); - return; - } + if (event.origin !== targetOrigin) { + throw new Error(`origin don't match: expected ${targetOrigin}, got ${event.origin} with type ${event.data.type}`); + } - const targetOrigin = IframeReference.getTargetOrigin(); - if (!targetOrigin) { - console.error('[MessageBus] handleMessage: targetOrigin not found'); - return; - } - - if (event.origin !== targetOrigin) { - console.error('[MessageBus] handleMessage: origin not match'); - return; - } - - if (!event.data || typeof event.data !== 'object') { - console.error('[MessageBus] handleMessage: data not found'); + if (!event.data || typeof event.data !== 'object') { + throw new Error('data not found'); + } + } catch (error) { + console.error('[MessageBus] handleMessage:', error); return; }