@@ -675,14 +675,14 @@ async function createDepsOptimizer(
675675 let registeredIds : { id : string ; done : ( ) => Promise < any > } [ ] = [ ]
676676 let seenIds = new Set < string > ( )
677677 let workersSources = new Set < string > ( )
678- let waitingOn : string | undefined
678+ const waitingOn = new Set < string > ( )
679679 let firstRunEnsured = false
680680
681681 function resetRegisteredIds ( ) {
682682 registeredIds = [ ]
683683 seenIds = new Set < string > ( )
684684 workersSources = new Set < string > ( )
685- waitingOn = undefined
685+ waitingOn . clear ( )
686686 firstRunEnsured = false
687687 }
688688
@@ -705,8 +705,8 @@ async function createDepsOptimizer(
705705 // Avoid waiting for this id, as it may be blocked by the rollup
706706 // bundling process of the worker that also depends on the optimizer
707707 registeredIds = registeredIds . filter ( ( registered ) => registered . id !== id )
708- if ( waitingOn === id ) {
709- waitingOn = undefined
708+ if ( waitingOn . has ( id ) ) {
709+ waitingOn . delete ( id )
710710 runOptimizerWhenIdle ( )
711711 }
712712 }
@@ -719,32 +719,48 @@ async function createDepsOptimizer(
719719 }
720720 }
721721
722- function runOptimizerWhenIdle ( ) {
723- if ( ! waitingOn ) {
724- const next = registeredIds . pop ( )
725- if ( next ) {
726- waitingOn = next . id
727- const afterLoad = ( ) => {
728- waitingOn = undefined
729- if ( ! closed && ! workersSources . has ( next . id ) ) {
730- if ( registeredIds . length > 0 ) {
731- runOptimizerWhenIdle ( )
732- } else {
733- onCrawlEnd ( )
734- }
735- }
736- }
737- next
738- . done ( )
739- . then ( ( ) => {
740- setTimeout (
741- afterLoad ,
742- registeredIds . length > 0 ? 0 : runOptimizerIfIdleAfterMs ,
743- )
744- } )
745- . catch ( afterLoad )
722+ async function runOptimizerWhenIdle ( ) {
723+ if ( waitingOn . size > 0 ) return
724+
725+ const processingRegisteredIds = registeredIds
726+ registeredIds = [ ]
727+
728+ const donePromises = processingRegisteredIds . map ( async ( registeredId ) => {
729+ waitingOn . add ( registeredId . id )
730+ try {
731+ await registeredId . done ( )
732+ } finally {
733+ waitingOn . delete ( registeredId . id )
734+ }
735+ } )
736+
737+ const afterLoad = ( ) => {
738+ if ( closed ) return
739+ if (
740+ registeredIds . length > 0 &&
741+ registeredIds . every ( ( registeredId ) =>
742+ workersSources . has ( registeredId . id ) ,
743+ )
744+ ) {
745+ return
746+ }
747+
748+ if ( registeredIds . length > 0 ) {
749+ runOptimizerWhenIdle ( )
750+ } else {
751+ onCrawlEnd ( )
746752 }
747753 }
754+
755+ const results = await Promise . allSettled ( donePromises )
756+ if (
757+ registeredIds . length > 0 ||
758+ results . some ( ( result ) => result . status === 'rejected' )
759+ ) {
760+ afterLoad ( )
761+ } else {
762+ setTimeout ( afterLoad , runOptimizerIfIdleAfterMs )
763+ }
748764 }
749765}
750766
0 commit comments