diff options
Diffstat (limited to 'src/wallet.ts')
-rw-r--r-- | src/wallet.ts | 37 |
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--; } } |