summaryrefslogtreecommitdiff
path: root/packages/taler-wallet-core/src/operations/recoup.ts
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2020-09-04 03:10:36 +0530
committerFlorian Dold <florian.dold@gmail.com>2020-09-04 03:10:36 +0530
commitc7a2abedbabe9142ce9a15902f90a5d1f4b36f05 (patch)
tree71346990d8e11212a1153f740bfec9921c067dcc /packages/taler-wallet-core/src/operations/recoup.ts
parent9754109004f37a789f7a00fa6c1073d22e089484 (diff)
downloadwallet-core-c7a2abedbabe9142ce9a15902f90a5d1f4b36f05.tar.gz
wallet-core-c7a2abedbabe9142ce9a15902f90a5d1f4b36f05.tar.bz2
wallet-core-c7a2abedbabe9142ce9a15902f90a5d1f4b36f05.zip
don't unnecessarily repeat reserve processing after recoup
Diffstat (limited to 'packages/taler-wallet-core/src/operations/recoup.ts')
-rw-r--r--packages/taler-wallet-core/src/operations/recoup.ts33
1 files changed, 26 insertions, 7 deletions
diff --git a/packages/taler-wallet-core/src/operations/recoup.ts b/packages/taler-wallet-core/src/operations/recoup.ts
index 91579f602..eb268f18b 100644
--- a/packages/taler-wallet-core/src/operations/recoup.ts
+++ b/packages/taler-wallet-core/src/operations/recoup.ts
@@ -40,7 +40,7 @@ import {
import { codecForRecoupConfirmation } from "../types/talerTypes";
import { NotificationType } from "../types/notifications";
-import { forceQueryReserve, getReserveRequestTimeout } from "./reserves";
+import { forceQueryReserve, getReserveRequestTimeout, processReserve } from "./reserves";
import { Amounts } from "../util/amounts";
import { createRefreshGroup, processRefreshGroup } from "./refresh";
@@ -200,8 +200,13 @@ async function recoupWithdrawCoin(
updatedCoin.status = CoinStatus.Dormant;
const currency = updatedCoin.currentAmount.currency;
updatedCoin.currentAmount = Amounts.getZero(currency);
- updatedReserve.reserveStatus = ReserveRecordStatus.QUERYING_STATUS;
- updatedReserve.retryInfo = initRetryInfo();
+ if (updatedReserve.reserveStatus === ReserveRecordStatus.DORMANT) {
+ updatedReserve.reserveStatus = ReserveRecordStatus.QUERYING_STATUS;
+ updatedReserve.retryInfo = initRetryInfo();
+ } else {
+ updatedReserve.requestedQuery = true;
+ updatedReserve.retryInfo = initRetryInfo();
+ }
await tx.put(Stores.coins, updatedCoin);
await tx.put(Stores.reserves, updatedReserve);
await putGroupAsFinished(ws, tx, recoupGroup, coinIdx);
@@ -211,10 +216,6 @@ async function recoupWithdrawCoin(
ws.notify({
type: NotificationType.RecoupFinished,
});
-
- forceQueryReserve(ws, reserve.reservePub).catch((e) => {
- logger.error("re-querying reserve after recoup failed:", e);
- });
}
async function recoupRefreshCoin(
@@ -341,6 +342,24 @@ async function processRecoupGroupImpl(
processRecoup(ws, recoupGroupId, i),
);
await Promise.all(ps);
+
+ const reserveSet = new Set<string>();
+ for (let i = 0; i < recoupGroup.coinPubs.length; i++) {
+ const coinPub = recoupGroup.coinPubs[i];
+ const coin = await ws.db.get(Stores.coins, coinPub);
+ if (!coin) {
+ throw Error(`Coin ${coinPub} not found, can't request payback`);
+ }
+ if (coin.coinSource.type === CoinSourceType.Withdraw) {
+ reserveSet.add(coin.coinSource.reservePub);
+ }
+ }
+
+ for (const r of reserveSet.values()) {
+ processReserve(ws, r).catch((e) => {
+ logger.error(`processing reserve ${r} after recoup failed`);
+ });
+ }
}
export async function createRecoupGroup(