[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[taler-wallet-core] branch master updated: wallet-core: reset reserve re
From: |
gnunet |
Subject: |
[taler-wallet-core] branch master updated: wallet-core: reset reserve retry when resetting withdrawal retry |
Date: |
Mon, 13 Dec 2021 11:28:18 +0100 |
This is an automated email from the git hooks/post-receive script.
dold pushed a commit to branch master
in repository wallet-core.
The following commit(s) were added to refs/heads/master by this push:
new c493a306 wallet-core: reset reserve retry when resetting withdrawal
retry
c493a306 is described below
commit c493a3069ec330b955efd8604cb9d8b76277c74e
Author: Florian Dold <florian@dold.me>
AuthorDate: Mon Dec 13 11:28:15 2021 +0100
wallet-core: reset reserve retry when resetting withdrawal retry
---
packages/taler-wallet-core/src/common.ts | 11 ++++-
.../taler-wallet-core/src/operations/reserves.ts | 53 +++++++++++++++++-----
.../src/operations/transactions.ts | 34 +++++++++-----
.../taler-wallet-core/src/operations/withdraw.ts | 27 +++++++++--
packages/taler-wallet-core/src/wallet.ts | 5 ++
5 files changed, 102 insertions(+), 28 deletions(-)
diff --git a/packages/taler-wallet-core/src/common.ts
b/packages/taler-wallet-core/src/common.ts
index d3c4a522..5b61ef14 100644
--- a/packages/taler-wallet-core/src/common.ts
+++ b/packages/taler-wallet-core/src/common.ts
@@ -51,7 +51,7 @@ export interface TrustInfo {
isAudited: boolean;
}
-export interface MerchantInfo {
+export interface MerchantInfo {
protocolVersionCurrent: number;
}
@@ -65,6 +65,14 @@ export interface MerchantOperations {
): Promise<MerchantInfo>;
}
+export interface ReserveOperations {
+ processReserve(
+ ws: InternalWalletState,
+ reservePub: string,
+ forceNow?: boolean,
+ ): Promise<void>;
+}
+
/**
* Interface for exchange-related operations.
*/
@@ -152,6 +160,7 @@ export interface InternalWalletState {
exchangeOps: ExchangeOperations;
recoupOps: RecoupOperations;
merchantOps: MerchantOperations;
+ reserveOps: ReserveOperations;
db: DbAccess<typeof WalletStoresV1>;
http: HttpRequestLibrary;
diff --git a/packages/taler-wallet-core/src/operations/reserves.ts
b/packages/taler-wallet-core/src/operations/reserves.ts
index 43e0d7d3..5a9fbb40 100644
--- a/packages/taler-wallet-core/src/operations/reserves.ts
+++ b/packages/taler-wallet-core/src/operations/reserves.ts
@@ -15,35 +15,63 @@
*/
import {
- AcceptWithdrawalResponse, addPaytoQueryParams, Amounts, canonicalizeBaseUrl,
codecForBankWithdrawalOperationPostResponse,
+ AcceptWithdrawalResponse,
+ addPaytoQueryParams,
+ Amounts,
+ canonicalizeBaseUrl,
+ codecForBankWithdrawalOperationPostResponse,
codecForReserveStatus,
- codecForWithdrawOperationStatusResponse, CreateReserveRequest,
- CreateReserveResponse, Duration,
+ codecForWithdrawOperationStatusResponse,
+ CreateReserveRequest,
+ CreateReserveResponse,
+ Duration,
durationMax,
- durationMin, encodeCrock, getRandomBytes, getTimestampNow, Logger,
NotificationType, randomBytes, ReserveTransactionType,
- TalerErrorCode, TalerErrorDetails, URL
+ durationMin,
+ encodeCrock,
+ getRandomBytes,
+ getTimestampNow,
+ Logger,
+ NotificationType,
+ randomBytes,
+ ReserveTransactionType,
+ TalerErrorCode,
+ TalerErrorDetails,
+ URL,
} from "@gnu-taler/taler-util";
import { InternalWalletState } from "../common.js";
import {
ReserveBankInfo,
- ReserveRecord, ReserveRecordStatus, WalletStoresV1, WithdrawalGroupRecord
+ ReserveRecord,
+ ReserveRecordStatus,
+ WalletStoresV1,
+ WithdrawalGroupRecord,
} from "../db.js";
import { guardOperationException, OperationFailedError } from "../errors.js";
import { assertUnreachable } from "../util/assertUnreachable.js";
import {
readSuccessResponseJsonOrErrorCode,
readSuccessResponseJsonOrThrow,
- throwUnexpectedRequestError
+ throwUnexpectedRequestError,
} from "../util/http.js";
import { GetReadOnlyAccess } from "../util/query.js";
import {
- getRetryDuration, initRetryInfo, updateRetryInfoTimeout
+ getRetryDuration,
+ initRetryInfo,
+ updateRetryInfoTimeout,
} from "../util/retries.js";
import {
- getExchangeDetails, getExchangePaytoUri, getExchangeTrust,
updateExchangeFromUrl
+ getExchangeDetails,
+ getExchangePaytoUri,
+ getExchangeTrust,
+ updateExchangeFromUrl,
} from "./exchanges.js";
import {
- denomSelectionInfoToState, getBankWithdrawalInfo,
getCandidateWithdrawalDenoms, processWithdrawGroup,
selectWithdrawalDenominations, updateWithdrawalDenoms
+ denomSelectionInfoToState,
+ getBankWithdrawalInfo,
+ getCandidateWithdrawalDenoms,
+ processWithdrawGroup,
+ selectWithdrawalDenominations,
+ updateWithdrawalDenoms,
} from "./withdraw.js";
const logger = new Logger("reserves.ts");
@@ -514,7 +542,7 @@ async function updateReserve(
if (
resp.status === 404 &&
result.talerErrorResponse.code ===
- TalerErrorCode.EXCHANGE_RESERVES_GET_STATUS_UNKNOWN
+ TalerErrorCode.EXCHANGE_RESERVES_GET_STATUS_UNKNOWN
) {
ws.notify({
type: NotificationType.ReserveNotYetFound,
@@ -617,7 +645,8 @@ async function updateReserve(
logger.trace(
`Remaining unclaimed amount in reseve is ${Amounts.stringify(
remainingAmount,
- )} and can be withdrawn with ${denomSelInfo.selectedDenoms.length
+ )} and can be withdrawn with ${
+ denomSelInfo.selectedDenoms.length
} coins`,
);
diff --git a/packages/taler-wallet-core/src/operations/transactions.ts
b/packages/taler-wallet-core/src/operations/transactions.ts
index b00779fa..106d72d0 100644
--- a/packages/taler-wallet-core/src/operations/transactions.ts
+++ b/packages/taler-wallet-core/src/operations/transactions.ts
@@ -19,12 +19,25 @@
*/
import {
AmountJson,
- Amounts, OrderShortInfo, PaymentStatus, timestampCmp, Transaction,
TransactionsRequest,
- TransactionsResponse, TransactionType, WithdrawalDetails, WithdrawalType
+ Amounts,
+ Logger,
+ OrderShortInfo,
+ PaymentStatus,
+ timestampCmp,
+ Transaction,
+ TransactionsRequest,
+ TransactionsResponse,
+ TransactionType,
+ WithdrawalDetails,
+ WithdrawalType,
} from "@gnu-taler/taler-util";
import { InternalWalletState } from "../common.js";
import {
- AbortStatus, RefundState, ReserveRecord, ReserveRecordStatus,
WalletRefundItem
+ AbortStatus,
+ RefundState,
+ ReserveRecord,
+ ReserveRecordStatus,
+ WalletRefundItem,
} from "../db.js";
import { processDepositGroup } from "./deposits.js";
import { getExchangeDetails } from "./exchanges.js";
@@ -34,6 +47,8 @@ import { getFundingPaytoUris } from "./reserves.js";
import { processTip } from "./tip.js";
import { processWithdrawGroup } from "./withdraw.js";
+const logger = new Logger("taler-wallet-core:transactions.ts");
+
/**
* Create an event ID from the type and the primary key for the event.
*/
@@ -404,13 +419,6 @@ export enum TombstoneTag {
DeleteRefund = "delete-refund",
}
-export async function retryTransactionNow(
- ws: InternalWalletState,
- transactionId: string,
-): Promise<void> {
- const [type, ...rest] = transactionId.split(":");
-}
-
/**
* Immediately retry the underlying operation
* of a transaction.
@@ -419,6 +427,8 @@ export async function retryTransaction(
ws: InternalWalletState,
transactionId: string,
): Promise<void> {
+ logger.info(`retrying transaction ${transactionId}`);
+
const [type, ...rest] = transactionId.split(":");
switch (type) {
@@ -478,8 +488,8 @@ export async function deleteTransaction(
const reserveRecord:
| ReserveRecord
| undefined = await
tx.reserves.indexes.byInitialWithdrawalGroupId.get(
- withdrawalGroupId,
- );
+ withdrawalGroupId,
+ );
if (reserveRecord && !reserveRecord.initialWithdrawalStarted) {
const reservePub = reserveRecord.reservePub;
await tx.reserves.delete(reservePub);
diff --git a/packages/taler-wallet-core/src/operations/withdraw.ts
b/packages/taler-wallet-core/src/operations/withdraw.ts
index 48d308b6..652b26c1 100644
--- a/packages/taler-wallet-core/src/operations/withdraw.ts
+++ b/packages/taler-wallet-core/src/operations/withdraw.ts
@@ -854,7 +854,10 @@ async function resetWithdrawalGroupRetry(
withdrawalGroupId: string,
): Promise<void> {
await ws.db
- .mktx((x) => ({ withdrawalGroups: x.withdrawalGroups }))
+ .mktx((x) => ({
+ withdrawalGroups: x.withdrawalGroups,
+ reserves: x.reserves,
+ }))
.runReadWrite(async (tx) => {
const x = await tx.withdrawalGroups.get(withdrawalGroupId);
if (x) {
@@ -879,8 +882,26 @@ async function processWithdrawGroupImpl(
return tx.withdrawalGroups.get(withdrawalGroupId);
});
if (!withdrawalGroup) {
- logger.trace("withdraw session doesn't exist");
- return;
+ // Withdrawal group doesn't exist yet, but reserve might exist
+ // (and reference the yet to be created withdrawal group)
+ const reservePub = await ws.db
+ .mktx((x) => ({ reserves: x.reserves }))
+ .runReadOnly(async (tx) => {
+ const r = await tx.reserves.indexes.byInitialWithdrawalGroupId.get(
+ withdrawalGroupId,
+ );
+ if (r) {
+ return r.reservePub;
+ }
+ return undefined;
+ });
+ if (!reservePub) {
+ logger.warn(
+ "withdrawal group doesn't exist (and reserve doesn't exist either)",
+ );
+ return;
+ }
+ return await ws.reserveOps.processReserve(ws, reservePub, forceNow);
}
await ws.exchangeOps.updateExchangeFromUrl(
diff --git a/packages/taler-wallet-core/src/wallet.ts
b/packages/taler-wallet-core/src/wallet.ts
index 7e798079..ed0046c5 100644
--- a/packages/taler-wallet-core/src/wallet.ts
+++ b/packages/taler-wallet-core/src/wallet.ts
@@ -103,6 +103,7 @@ import {
MerchantOperations,
NotificationListener,
RecoupOperations,
+ ReserveOperations,
} from "./common.js";
import {
runIntegrationTest,
@@ -1122,6 +1123,10 @@ class InternalWalletStateImpl implements
InternalWalletState {
getMerchantInfo: getMerchantInfo,
};
+ reserveOps: ReserveOperations = {
+ processReserve: processReserve,
+ }
+
/**
* Promises that are waiting for a particular resource.
*/
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [taler-wallet-core] branch master updated: wallet-core: reset reserve retry when resetting withdrawal retry,
gnunet <=