aboutsummaryrefslogtreecommitdiff
path: root/packages/taler-wallet-core/src/operations/exchanges.ts
diff options
context:
space:
mode:
authorFlorian Dold <florian@dold.me>2022-03-28 23:59:16 +0200
committerFlorian Dold <florian@dold.me>2022-03-28 23:59:16 +0200
commitf5d194dfc61ae0d358a27b994861dc20b83cf98e (patch)
tree8bdb1509be601294329f9a6739823cc798ad9de1 /packages/taler-wallet-core/src/operations/exchanges.ts
parent80e43db2cac84e588c2ef3889e8d90b76bd53714 (diff)
downloadwallet-core-f5d194dfc61ae0d358a27b994861dc20b83cf98e.tar.xz
wallet: cancellation for deposit
Diffstat (limited to 'packages/taler-wallet-core/src/operations/exchanges.ts')
-rw-r--r--packages/taler-wallet-core/src/operations/exchanges.ts60
1 files changed, 50 insertions, 10 deletions
diff --git a/packages/taler-wallet-core/src/operations/exchanges.ts b/packages/taler-wallet-core/src/operations/exchanges.ts
index 09449c875..fe1c9ef35 100644
--- a/packages/taler-wallet-core/src/operations/exchanges.ts
+++ b/packages/taler-wallet-core/src/operations/exchanges.ts
@@ -61,7 +61,11 @@ import {
readSuccessResponseTextOrThrow,
} from "../util/http.js";
import { DbAccess, GetReadOnlyAccess } from "../util/query.js";
-import { initRetryInfo, updateRetryInfoTimeout } from "../util/retries.js";
+import {
+ initRetryInfo,
+ RetryInfo,
+ updateRetryInfoTimeout,
+} from "../util/retries.js";
import {
WALLET_CACHE_BREAKER_CLIENT_VERSION,
WALLET_EXCHANGE_PROTOCOL_VERSION,
@@ -102,7 +106,7 @@ function denominationRecordFromKeys(
return d;
}
-async function handleExchangeUpdateError(
+async function reportExchangeUpdateError(
ws: InternalWalletState,
baseUrl: string,
err: TalerErrorDetail,
@@ -114,14 +118,44 @@ async function handleExchangeUpdateError(
if (!exchange) {
return;
}
- exchange.retryInfo.retryCounter++;
- updateRetryInfoTimeout(exchange.retryInfo);
exchange.lastError = err;
await tx.exchanges.put(exchange);
});
- if (err) {
- ws.notify({ type: NotificationType.ExchangeOperationError, error: err });
- }
+ ws.notify({ type: NotificationType.ExchangeOperationError, error: err });
+}
+
+async function resetExchangeUpdateRetry(
+ ws: InternalWalletState,
+ baseUrl: string,
+): Promise<void> {
+ await ws.db
+ .mktx((x) => ({ exchanges: x.exchanges }))
+ .runReadWrite(async (tx) => {
+ const exchange = await tx.exchanges.get(baseUrl);
+ if (!exchange) {
+ return;
+ }
+ delete exchange.lastError;
+ exchange.retryInfo = initRetryInfo();
+ await tx.exchanges.put(exchange);
+ });
+}
+
+async function incrementExchangeUpdateRetry(
+ ws: InternalWalletState,
+ baseUrl: string,
+): Promise<void> {
+ await ws.db
+ .mktx((x) => ({ exchanges: x.exchanges }))
+ .runReadWrite(async (tx) => {
+ const exchange = await tx.exchanges.get(baseUrl);
+ if (!exchange) {
+ return;
+ }
+ delete exchange.lastError;
+ exchange.retryInfo = RetryInfo.increment(exchange.retryInfo);
+ await tx.exchanges.put(exchange);
+ });
}
export function getExchangeRequestTimeout(): Duration {
@@ -349,7 +383,7 @@ export async function updateExchangeFromUrl(
exchangeDetails: ExchangeDetailsRecord;
}> {
const onOpErr = (e: TalerErrorDetail): Promise<void> =>
- handleExchangeUpdateError(ws, baseUrl, e);
+ reportExchangeUpdateError(ws, baseUrl, e);
return await guardOperationException(
() => updateExchangeFromUrlImpl(ws, baseUrl, acceptedFormat, forceNow),
onOpErr,
@@ -543,6 +577,12 @@ async function updateExchangeFromUrlImpl(
return { exchange, exchangeDetails };
}
+ if (forceNow) {
+ await resetExchangeUpdateRetry(ws, baseUrl);
+ } else {
+ await incrementExchangeUpdateRetry(ws, baseUrl);
+ }
+
logger.info("updating exchange /keys info");
const timeout = getExchangeRequestTimeout();
@@ -624,8 +664,8 @@ async function updateExchangeFromUrlImpl(
termsOfServiceAcceptedTimestamp: TalerProtocolTimestamp.now(),
};
// FIXME: only update if pointer got updated
- r.lastError = undefined;
- r.retryInfo = initRetryInfo();
+ delete r.lastError;
+ delete r.retryInfo;
r.lastUpdate = TalerProtocolTimestamp.now();
r.nextUpdate = keysInfo.expiry;
// New denominations might be available.