@@ -128,7 +128,6 @@ extension JSController {
128128 airdate: item [ " airdate " ] as? String ?? " "
129129 )
130130 }
131- Logger . shared. log ( " Successfully extracted \( resultItems. count) details " , type: " Info " )
132131 } else {
133132 Logger . shared. log ( " Failed to parse JSON of extractDetails " , type: " Error " )
134133 }
@@ -162,12 +161,27 @@ extension JSController {
162161 promiseDetails. invokeMethod ( " catch " , withArguments: [ catchFunctionDetails as Any ] )
163162
164163 dispatchGroup. enter ( )
164+ let promiseValueEpisodes = extractEpisodesFunction. call ( withArguments: [ url. absoluteString] )
165+
165166 var hasLeftEpisodesGroup = false
166167 let episodesGroupQueue = DispatchQueue ( label: " episodes.group " )
167168
168- let promiseValueEpisodes = extractEpisodesFunction. call ( withArguments: [ url. absoluteString] )
169+ let timeoutWorkItem = DispatchWorkItem {
170+ Logger . shared. log ( " Timeout for extractEpisodes " , type: " Warning " )
171+ episodesGroupQueue. sync {
172+ guard !hasLeftEpisodesGroup else {
173+ Logger . shared. log ( " extractEpisodes: timeout called but group already left " , type: " Debug " )
174+ return
175+ }
176+ hasLeftEpisodesGroup = true
177+ dispatchGroup. leave ( )
178+ }
179+ }
180+ DispatchQueue . main. asyncAfter ( deadline: . now( ) + 15.0 , execute: timeoutWorkItem)
181+
169182 guard let promiseEpisodes = promiseValueEpisodes else {
170183 Logger . shared. log ( " extractEpisodes did not return a Promise " , type: " Error " )
184+ timeoutWorkItem. cancel ( )
171185 episodesGroupQueue. sync {
172186 guard !hasLeftEpisodesGroup else { return }
173187 hasLeftEpisodesGroup = true
@@ -178,6 +192,7 @@ extension JSController {
178192 }
179193
180194 let thenBlockEpisodes : @convention ( block) ( JSValue ) -> Void = { result in
195+ timeoutWorkItem. cancel ( )
181196 episodesGroupQueue. sync {
182197 guard !hasLeftEpisodesGroup else {
183198 Logger . shared. log ( " extractEpisodes: thenBlock called but group already left " , type: " Debug " )
@@ -197,7 +212,6 @@ extension JSController {
197212 duration: nil
198213 )
199214 }
200- Logger . shared. log ( " Successfully extracted \( episodeLinks. count) episodes " , type: " Info " )
201215 } else {
202216 Logger . shared. log ( " Failed to parse JSON of extractEpisodes " , type: " Error " )
203217 }
@@ -212,6 +226,7 @@ extension JSController {
212226 }
213227
214228 let catchBlockEpisodes : @convention ( block) ( JSValue ) -> Void = { error in
229+ timeoutWorkItem. cancel ( )
215230 episodesGroupQueue. sync {
216231 guard !hasLeftEpisodesGroup else {
217232 Logger . shared. log ( " extractEpisodes: catchBlock called but group already left " , type: " Debug " )
0 commit comments