Skip to content
This repository was archived by the owner on Feb 8, 2026. It is now read-only.

Commit 7c33f37

Browse files
authored
Merge pull request #1346 from synonymdev/refresh-fix
fix(lightning): prevent refresh from being called multiple times
2 parents 655974b + 51879d1 commit 7c33f37

1 file changed

Lines changed: 31 additions & 3 deletions

File tree

src/utils/lightning/index.ts

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)