@@ -711,7 +711,7 @@ async function createDepsOptimizer(
711
711
}
712
712
}
713
713
714
- const runOptimizerIfIdleAfterMs = 50
714
+ const callCrawlEndIfIdleAfterMs = 50
715
715
716
716
interface CrawlEndFinder {
717
717
ensureFirstRun : ( ) => void
@@ -721,18 +721,17 @@ interface CrawlEndFinder {
721
721
}
722
722
723
723
function setupOnCrawlEnd ( onCrawlEnd : ( ) => void ) : CrawlEndFinder {
724
- let registeredIds : { id : string ; done : ( ) => Promise < any > } [ ] = [ ]
724
+ const registeredIds = new Set < string > ( )
725
725
const seenIds = new Set < string > ( )
726
726
const workersSources = new Set < string > ( )
727
- const waitingOn = new Map < string , ( ) => void > ( )
728
- let firstRunEnsured = false
729
- let crawlEndCalled = false
727
+ let timeoutHandle : NodeJS . Timeout | undefined
730
728
731
729
let cancelled = false
732
730
function cancel ( ) {
733
731
cancelled = true
734
732
}
735
733
734
+ let crawlEndCalled = false
736
735
function callOnCrawlEnd ( ) {
737
736
if ( ! cancelled && ! crawlEndCalled ) {
738
737
crawlEndCalled = true
@@ -743,84 +742,56 @@ function setupOnCrawlEnd(onCrawlEnd: () => void): CrawlEndFinder {
743
742
// If all the inputs are dependencies, we aren't going to get any
744
743
// delayDepsOptimizerUntil(id) calls. We need to guard against this
745
744
// by forcing a rerun if no deps have been registered
745
+ let firstRunEnsured = false
746
746
function ensureFirstRun ( ) {
747
747
if ( ! firstRunEnsured && seenIds . size === 0 ) {
748
748
setTimeout ( ( ) => {
749
749
if ( seenIds . size === 0 ) {
750
750
callOnCrawlEnd ( )
751
751
}
752
- } , runOptimizerIfIdleAfterMs )
752
+ } , 200 )
753
753
}
754
754
firstRunEnsured = true
755
755
}
756
756
757
757
function registerWorkersSource ( id : string ) : void {
758
758
workersSources . add ( id )
759
+
759
760
// Avoid waiting for this id, as it may be blocked by the rollup
760
761
// bundling process of the worker that also depends on the optimizer
761
- registeredIds = registeredIds . filter ( ( registered ) => registered . id !== id )
762
+ registeredIds . delete ( id )
762
763
763
- const resolve = waitingOn . get ( id )
764
- // Forced resolve to avoid waiting for the bundling of the worker to finish
765
- resolve ?.( )
764
+ checkIfCrawlEndAfterTimeout ( )
766
765
}
767
766
768
767
function delayDepsOptimizerUntil ( id : string , done : ( ) => Promise < any > ) : void {
769
768
if ( ! seenIds . has ( id ) ) {
770
769
seenIds . add ( id )
771
- registeredIds . push ( { id, done } )
772
- callOnCrawlEndWhenIdle ( )
770
+ if ( ! workersSources . has ( id ) ) {
771
+ registeredIds . add ( id )
772
+ done ( )
773
+ . catch ( ( ) => { } )
774
+ . finally ( ( ) => markIdAsDone ( id ) )
775
+ }
773
776
}
774
777
}
778
+ function markIdAsDone ( id : string ) : void {
779
+ registeredIds . delete ( id )
780
+ checkIfCrawlEndAfterTimeout ( )
781
+ }
775
782
776
- async function callOnCrawlEndWhenIdle ( ) {
777
- if ( cancelled || waitingOn . size > 0 ) return
778
-
779
- const processingRegisteredIds = registeredIds
780
- registeredIds = [ ]
781
-
782
- const donePromises = processingRegisteredIds . map ( async ( registeredId ) => {
783
- // During build, we need to cancel workers
784
- let resolve : ( ) => void
785
- const waitUntilDone = new Promise < void > ( ( _resolve ) => {
786
- resolve = _resolve
787
- registeredId
788
- . done ( )
789
- . catch ( ( ) => {
790
- // Ignore errors
791
- } )
792
- . finally ( ( ) => resolve ( ) )
793
- } )
794
- waitingOn . set ( registeredId . id , ( ) => resolve ( ) )
795
-
796
- await waitUntilDone
797
- waitingOn . delete ( registeredId . id )
798
- } )
799
-
800
- const afterLoad = ( ) => {
801
- if ( cancelled ) return
802
- if (
803
- registeredIds . length > 0 &&
804
- registeredIds . every ( ( registeredId ) =>
805
- workersSources . has ( registeredId . id ) ,
806
- )
807
- ) {
808
- return
809
- }
810
-
811
- if ( registeredIds . length > 0 ) {
812
- callOnCrawlEndWhenIdle ( )
813
- } else {
814
- callOnCrawlEnd ( )
815
- }
816
- }
783
+ function checkIfCrawlEndAfterTimeout ( ) {
784
+ if ( cancelled || registeredIds . size > 0 ) return
817
785
818
- await Promise . allSettled ( donePromises )
819
- if ( registeredIds . length > 0 ) {
820
- afterLoad ( )
821
- } else {
822
- setTimeout ( afterLoad , runOptimizerIfIdleAfterMs )
823
- }
786
+ if ( timeoutHandle ) clearTimeout ( timeoutHandle )
787
+ timeoutHandle = setTimeout (
788
+ callOnCrawlEndWhenIdle ,
789
+ callCrawlEndIfIdleAfterMs ,
790
+ )
791
+ }
792
+ async function callOnCrawlEndWhenIdle ( ) {
793
+ if ( cancelled || registeredIds . size > 0 ) return
794
+ callOnCrawlEnd ( )
824
795
}
825
796
826
797
return {
0 commit comments