@@ -675,14 +675,14 @@ async function createDepsOptimizer(
675
675
let registeredIds : { id : string ; done : ( ) => Promise < any > } [ ] = [ ]
676
676
let seenIds = new Set < string > ( )
677
677
let workersSources = new Set < string > ( )
678
- let waitingOn : string | undefined
678
+ const waitingOn = new Set < string > ( )
679
679
let firstRunEnsured = false
680
680
681
681
function resetRegisteredIds ( ) {
682
682
registeredIds = [ ]
683
683
seenIds = new Set < string > ( )
684
684
workersSources = new Set < string > ( )
685
- waitingOn = undefined
685
+ waitingOn . clear ( )
686
686
firstRunEnsured = false
687
687
}
688
688
@@ -705,8 +705,8 @@ async function createDepsOptimizer(
705
705
// Avoid waiting for this id, as it may be blocked by the rollup
706
706
// bundling process of the worker that also depends on the optimizer
707
707
registeredIds = registeredIds . filter ( ( registered ) => registered . id !== id )
708
- if ( waitingOn === id ) {
709
- waitingOn = undefined
708
+ if ( waitingOn . has ( id ) ) {
709
+ waitingOn . delete ( id )
710
710
runOptimizerWhenIdle ( )
711
711
}
712
712
}
@@ -719,32 +719,48 @@ async function createDepsOptimizer(
719
719
}
720
720
}
721
721
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 ( )
746
752
}
747
753
}
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
+ }
748
764
}
749
765
}
750
766
0 commit comments