@@ -133,17 +133,77 @@ const checkErrorMessage = async (logLines: string[]): Promise<boolean> => {
133133 return results . some ( ( result ) => result === true ) ;
134134} ;
135135
136+ /**
137+ * waitForLogs polls the log file until meaningful content appears or timeout is reached
138+ * @returns {string } the log file content
139+ */
140+ const waitForLogs = async ( ) : Promise < string > => {
141+ const pollInterval = 10 ; // seconds between checks
142+ const maxWaitTime = 180 ; // max 3 minutes total wait
143+ const minLogLines = 5 ; // minimum lines to consider logs "ready"
144+
145+ const startMessages = [
146+ 'info Starting logkitty' ,
147+ 'React Native iOS Logger started for XCode project' ,
148+ ] ;
149+
150+ let elapsed = 0 ;
151+ log (
152+ 'info' ,
153+ `Waiting for logs (polling every ${ pollInterval } s, max ${ maxWaitTime } s)...`
154+ ) ;
155+
156+ while ( elapsed < maxWaitTime ) {
157+ await sleep ( pollInterval ) ;
158+ elapsed += pollInterval ;
159+
160+ if ( ! fs . existsSync ( logFileName ) ) {
161+ log ( 'info' , `[${ elapsed } s] Log file not found yet...` ) ;
162+ continue ;
163+ }
164+
165+ const logFile = fs . readFileSync ( logFileName , 'utf-8' ) ;
166+ const logLines = logFile . split ( '\n' ) . filter ( ( line ) => line !== '' ) ;
167+
168+ // Check if we only have the start message (logs not ready yet)
169+ if ( logLines . length === 1 ) {
170+ const isOnlyStartMessage = startMessages . some ( ( msg ) =>
171+ logLines [ 0 ] . includes ( msg )
172+ ) ;
173+ if ( isOnlyStartMessage ) {
174+ log ( 'info' , `[${ elapsed } s] Only start message found, waiting...` ) ;
175+ continue ;
176+ }
177+ }
178+
179+ // Check if we have enough log lines
180+ if ( logLines . length >= minLogLines ) {
181+ log (
182+ 'success' ,
183+ `[${ elapsed } s] Found ${ logLines . length } log lines, proceeding with check`
184+ ) ;
185+ return logFile ;
186+ }
187+
188+ log (
189+ 'info' ,
190+ `[${ elapsed } s] Found ${ logLines . length } lines, waiting for more...`
191+ ) ;
192+ }
193+
194+ // Timeout reached, return whatever we have
195+ log ( 'warning' , `Timeout reached after ${ maxWaitTime } s` ) ;
196+ if ( fs . existsSync ( logFileName ) ) {
197+ return fs . readFileSync ( logFileName , 'utf-8' ) ;
198+ }
199+ return '' ;
200+ } ;
201+
136202const checkReactNativeLog = async ( ) : Promise < void > => {
137203 log ( 'command' , `cd mega-apps/${ megaAppName } ` ) ;
138204 process . chdir ( `mega-apps/${ megaAppName } ` ) ;
139205
140- // Wait for the logging messages to be ready. The number is based on real experiments in Github Actions.
141- const timeToWait = 500 ;
142-
143- log ( 'info' , `Sleep for '${ timeToWait } ' seconds...` ) ;
144- await sleep ( timeToWait ) ;
145-
146- const logFile = fs . readFileSync ( logFileName , 'utf-8' ) ;
206+ const logFile = await waitForLogs ( ) ;
147207 const logLines = logFile . split ( '\n' ) . filter ( ( line ) => line !== '' ) ;
148208
149209 await checkStartMessage ( logLines , logFile ) ;
0 commit comments