summaryrefslogtreecommitdiff
path: root/packages/taler-wallet-core/src/wallet.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/taler-wallet-core/src/wallet.ts')
-rw-r--r--packages/taler-wallet-core/src/wallet.ts25
1 files changed, 25 insertions, 0 deletions
diff --git a/packages/taler-wallet-core/src/wallet.ts b/packages/taler-wallet-core/src/wallet.ts
index 96722aefb..579710d4e 100644
--- a/packages/taler-wallet-core/src/wallet.ts
+++ b/packages/taler-wallet-core/src/wallet.ts
@@ -327,6 +327,27 @@ export interface RetryLoopOpts {
}
/**
+ * This iteration hint will keep incrementing while the taskLoop iteration.
+ * If the hint does not match the current iteration it means that another
+ * promises is also working or has done some work before.
+ */
+let iterationHint = 0
+function thereIsAnotherPromiseWorking(iteration: number): boolean {
+ if (iterationHint > iteration) {
+ logger.trace(`some other promise is or has done some progress`);
+ iterationHint = iteration;
+ //we know that another promise did some work but don't know if still active
+ //so we take ownership and do work
+ } else if (iterationHint < iteration) {
+ //another promise take ownership that means that our time has come to an end
+ return true
+ }
+ // increment the hint to match the next loop
+ iterationHint++
+ return false
+}
+
+/**
* Main retry loop of the wallet.
*
* Looks up pending operations from the wallet, runs them, repeat.
@@ -336,6 +357,10 @@ async function runTaskLoop(
opts: RetryLoopOpts = {},
): Promise<void> {
for (let iteration = 0; !ws.stopped; iteration++) {
+ if (thereIsAnotherPromiseWorking(iteration)) {
+ logger.trace(`another promise is working, we just need one`);
+ return;
+ }
const pending = await getPendingOperations(ws);
logger.trace(`pending operations: ${j2s(pending)}`);
let numGivingLiveness = 0;