@@ -96,48 +96,31 @@ function sendMcpMessage(
9696
9797export { sendMcpMessage }
9898
99- // Module-level queue for render data events
100- const renderDataQueue : Array < { type : string ; payload : any } > = [ ]
101-
102- // Set up global listener immediately when module loads (only in the client)
103- if ( typeof document !== 'undefined' ) {
104- window . addEventListener ( 'message' , ( event ) => {
105- if ( event . data ?. type === 'ui-lifecycle-iframe-render-data' ) {
106- renderDataQueue . push ( event . data )
107- }
108- } )
109- }
110-
11199export function waitForRenderData < RenderData > (
112100 schema : z . ZodSchema < RenderData > ,
113101) : Promise < RenderData > {
114102 return new Promise ( ( resolve , reject ) => {
115- // Check if we already received the data
116- const queuedEvent = renderDataQueue . find (
117- ( event ) => event . type === 'ui-lifecycle-iframe-render-data' ,
103+ const messageId = crypto . randomUUID ( )
104+
105+ window . parent . postMessage (
106+ { type : 'ui-request-render-data' , messageId } ,
107+ '*' ,
118108 )
119- if ( queuedEvent ) {
120- const result = schema . safeParse ( queuedEvent . payload . renderData )
121- if ( ! result . success ) {
122- console . error ( 'Invalid render data' , queuedEvent . payload . renderData )
123- }
124- return result . success ? resolve ( result . data ) : reject ( result . error )
125- }
126109
127- // Otherwise, set up the normal listening logic
128- function cleanup ( ) {
110+ function handleMessage ( event : MessageEvent ) {
111+ if ( event . data ?. type !== 'ui-message-response' ) return
112+ if ( event . data . messageId !== messageId ) return
129113 window . removeEventListener ( 'message' , handleMessage )
130- }
131114
132- function handleMessage ( event : MessageEvent ) {
133- if ( event . data ?. type !== 'ui-lifecycle-iframe-render-data' ) return
134-
135- const result = schema . safeParse ( event . data . payload )
136- cleanup ( )
137- if ( ! result . success ) {
138- console . error ( 'Invalid render data' , event . data . payload )
139- }
140- return result . success ? resolve ( result . data ) : reject ( result . error )
115+ const { response , error } = event . data . payload
116+
117+ if ( error ) return reject ( error )
118+ if ( ! schema ) return resolve ( response )
119+
120+ const parseResult = schema . safeParse ( response )
121+ if ( ! parseResult . success ) return reject ( parseResult . error )
122+
123+ return resolve ( parseResult . data )
141124 }
142125
143126 window . addEventListener ( 'message' , handleMessage )
0 commit comments