aboutsummaryrefslogtreecommitdiff
path: root/src/wallet.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/wallet.ts')
-rw-r--r--src/wallet.ts37
1 files changed, 24 insertions, 13 deletions
diff --git a/src/wallet.ts b/src/wallet.ts
index 9e96bffd3..354072130 100644
--- a/src/wallet.ts
+++ b/src/wallet.ts
@@ -379,6 +379,8 @@ export class Wallet {
private notifier: Notifier;
public cryptoApi: CryptoApi;
+ private processPreCoinConcurrent = 0;
+
/**
* Set of identifiers for running operations.
*/
@@ -725,22 +727,29 @@ export class Wallet {
private async processPreCoin(preCoin: PreCoinRecord,
- retryDelayMs = 100): Promise<void> {
-
- const exchange = await this.q().get(Stores.exchanges,
- preCoin.exchangeBaseUrl);
- if (!exchange) {
- console.error("db inconsistend: exchange for precoin not found");
- return;
- }
- const denom = await this.q().get(Stores.denominations,
- [preCoin.exchangeBaseUrl, preCoin.denomPub]);
- if (!denom) {
- console.error("db inconsistent: denom for precoin not found");
+ retryDelayMs = 200): Promise<void> {
+ if (this.processPreCoinConcurrent >= 1) {
+ console.log("delaying processPreCoin");
+ setTimeout(() => this.processPreCoin(preCoin, retryDelayMs * 2),
+ retryDelayMs);
return;
}
-
+ console.log("executing processPreCoin");
+ this.processPreCoinConcurrent++;
try {
+ const exchange = await this.q().get(Stores.exchanges,
+ preCoin.exchangeBaseUrl);
+ if (!exchange) {
+ console.error("db inconsistend: exchange for precoin not found");
+ return;
+ }
+ const denom = await this.q().get(Stores.denominations,
+ [preCoin.exchangeBaseUrl, preCoin.denomPub]);
+ if (!denom) {
+ console.error("db inconsistent: denom for precoin not found");
+ return;
+ }
+
const coin = await this.withdrawExecute(preCoin);
const mutateReserve = (r: ReserveRecord) => {
@@ -784,6 +793,8 @@ export class Wallet {
let nextRetryDelayMs = Math.min(retryDelayMs * 2, 1000 * 60);
setTimeout(() => this.processPreCoin(preCoin, nextRetryDelayMs),
retryDelayMs);
+ } finally {
+ this.processPreCoinConcurrent--;
}
}