@@ -464,6 +464,25 @@ export const unsubscribeFromLightningSubscriptions = (): void => {
464464 onSpendableOutputsSubscription ?. remove ( ) ;
465465} ;
466466
467+ let isRefreshing = false ;
468+ let pendingRefreshPromises : Array < ( result : Result < string > ) => void > = [ ] ;
469+
470+ const resolveAllPendingRefreshPromises = ( result : Result < string > ) : void => {
471+ isRefreshing = false ;
472+ while ( pendingRefreshPromises . length > 0 ) {
473+ const resolve = pendingRefreshPromises . shift ( ) ;
474+ if ( resolve ) {
475+ resolve ( result ) ;
476+ }
477+ }
478+ } ;
479+
480+ const handleRefreshError = ( errorMessage : string ) : Result < string > => {
481+ isRefreshing = false ;
482+ resolveAllPendingRefreshPromises ( err ( errorMessage ) ) ;
483+ return err ( errorMessage ) ;
484+ } ;
485+
467486/**
468487 * This method syncs LDK, re-adds peers & updates lightning channels.
469488 * @param {TWalletName } [selectedWallet]
@@ -477,6 +496,13 @@ export const refreshLdk = async ({
477496 selectedWallet ?: TWalletName ;
478497 selectedNetwork ?: TAvailableNetworks ;
479498} = { } ) : Promise < Result < string > > => {
499+ if ( isRefreshing ) {
500+ return new Promise ( ( resolve ) => {
501+ pendingRefreshPromises . push ( resolve ) ;
502+ } ) ;
503+ }
504+ isRefreshing = true ;
505+
480506 try {
481507 // wait for interactions/animations to be completed
482508 await new Promise ( ( resolve ) => {
@@ -498,14 +524,14 @@ export const refreshLdk = async ({
498524 shouldRefreshLdk : false ,
499525 } ) ;
500526 if ( setupResponse . isErr ( ) ) {
501- return err ( setupResponse . error . message ) ;
527+ return handleRefreshError ( setupResponse . error . message ) ;
502528 }
503529 keepLdkSynced ( { selectedNetwork } ) . then ( ) ;
504530 }
505531
506532 const syncRes = await lm . syncLdk ( ) ;
507533 if ( syncRes . isErr ( ) ) {
508- return err ( syncRes . error . message ) ;
534+ return handleRefreshError ( syncRes . error . message ) ;
509535 }
510536 await lm . setFees ( ) ;
511537
@@ -521,10 +547,12 @@ export const refreshLdk = async ({
521547 await migrateToLdkV2Account ( selectedWallet , selectedNetwork ) ;
522548 }
523549 updateUi ( { isLDKReady : true } ) ;
550+
551+ resolveAllPendingRefreshPromises ( ok ( '' ) ) ;
524552 return ok ( '' ) ;
525553 } catch ( e ) {
526554 console . log ( e ) ;
527- return err ( e ) ;
555+ return handleRefreshError ( e . message ) ;
528556 }
529557} ;
530558
0 commit comments