@@ -3473,48 +3473,75 @@ export class SharedLog<
34733473
34743474 let coverageThreshold = options ?. coverageThreshold ?? 1 ;
34753475 let deferred = pDefer < void > ( ) ;
3476+ let settled = false ;
34763477
34773478 const roleAge = options ?. roleAge ?? ( await this . getDefaultMinRoleAge ( ) ) ;
34783479 const providedCustomRoleAge = options ?. roleAge != null ;
34793480
3480- let checkCoverage = async ( ) => {
3481+ const resolve = ( ) => {
3482+ if ( settled ) return ;
3483+ settled = true ;
3484+ deferred . resolve ( ) ;
3485+ } ;
3486+
3487+ const reject = ( error : unknown ) => {
3488+ if ( settled ) return ;
3489+ settled = true ;
3490+ deferred . reject ( error ) ;
3491+ } ;
3492+
3493+ let checkInFlight : Promise < void > | undefined ;
3494+ const checkCoverage = async ( ) => {
34813495 const coverage = await this . calculateCoverage ( {
34823496 roleAge,
34833497 } ) ;
34843498
34853499 if ( coverage >= coverageThreshold ) {
3486- deferred . resolve ( ) ;
3500+ resolve ( ) ;
34873501 return true ;
34883502 }
34893503 return false ;
34903504 } ;
3505+
3506+ const scheduleCheckCoverage = ( ) => {
3507+ if ( settled || checkInFlight ) {
3508+ return ;
3509+ }
3510+
3511+ checkInFlight = checkCoverage ( )
3512+ . then ( ( ) => { } )
3513+ . catch ( reject )
3514+ . finally ( ( ) => {
3515+ checkInFlight = undefined ;
3516+ } ) ;
3517+ } ;
34913518 const onReplicatorMature = ( ) => {
3492- checkCoverage ( ) ;
3519+ scheduleCheckCoverage ( ) ;
34933520 } ;
34943521 const onReplicationChange = ( ) => {
3495- checkCoverage ( ) ;
3522+ scheduleCheckCoverage ( ) ;
34963523 } ;
34973524 this . events . addEventListener ( "replicator:mature" , onReplicatorMature ) ;
34983525 this . events . addEventListener ( "replication:change" , onReplicationChange ) ;
3499- await checkCoverage ( ) ;
3526+ await checkCoverage ( ) . catch ( reject ) ;
35003527
3501- let interval = providedCustomRoleAge
3502- ? setInterval ( ( ) => {
3503- checkCoverage ( ) ;
3504- } , 100 )
3505- : undefined ;
3528+ let intervalMs = providedCustomRoleAge ? 100 : 250 ;
3529+ let interval =
3530+ roleAge > 0
3531+ ? setInterval ( ( ) => {
3532+ scheduleCheckCoverage ( ) ;
3533+ } , intervalMs )
3534+ : undefined ;
35063535
35073536 let timeout = options ?. timeout ?? this . waitForReplicatorTimeout ;
35083537 const timer = setTimeout ( ( ) => {
35093538 clear ( ) ;
3510- deferred . reject (
3511- new TimeoutError ( `Timeout waiting for mature replicators` ) ,
3512- ) ;
3539+ reject ( new TimeoutError ( `Timeout waiting for mature replicators` ) ) ;
35133540 } , timeout ) ;
35143541
35153542 const abortListener = ( ) => {
35163543 clear ( ) ;
3517- deferred . reject ( new AbortError ( ) ) ;
3544+ reject ( new AbortError ( ) ) ;
35183545 } ;
35193546
35203547 if ( options ?. signal ) {
0 commit comments