summaryrefslogtreecommitdiff
path: root/packages/taler-wallet-core
diff options
context:
space:
mode:
authorSebastian <sebasjm@gmail.com>2022-04-28 13:26:29 -0300
committerSebastian <sebasjm@gmail.com>2022-04-28 13:26:29 -0300
commitb239ae1029eef5a68bf98d21e81acd317abb0673 (patch)
treef0e7657a35e92a7a4f75222ff6aa247e578e9af2 /packages/taler-wallet-core
parent451c9884dcd20e7e886ed32e5ef93913d29e36ff (diff)
downloadwallet-core-b239ae1029eef5a68bf98d21e81acd317abb0673.tar.gz
wallet-core-b239ae1029eef5a68bf98d21e81acd317abb0673.tar.bz2
wallet-core-b239ae1029eef5a68bf98d21e81acd317abb0673.zip
keep alive manifest v3
Diffstat (limited to 'packages/taler-wallet-core')
-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;