summaryrefslogtreecommitdiff
path: root/packages/taler-wallet-core/src/operations/deposits.ts
diff options
context:
space:
mode:
authorFlorian Dold <florian@dold.me>2023-05-25 19:26:40 +0200
committerFlorian Dold <florian@dold.me>2023-05-25 19:26:40 +0200
commitfe8749c3f81547d080ea23d580497750d52fed91 (patch)
tree2c0e8960fa33fc318b460538fd09fe33e5896500 /packages/taler-wallet-core/src/operations/deposits.ts
parent8624d798b799d78a4b6393493a0750027094904d (diff)
downloadwallet-core-fe8749c3f81547d080ea23d580497750d52fed91.tar.gz
wallet-core-fe8749c3f81547d080ea23d580497750d52fed91.tar.bz2
wallet-core-fe8749c3f81547d080ea23d580497750d52fed91.zip
wallet-core: implement cancelAbortingTransaction for deposit groups
Diffstat (limited to 'packages/taler-wallet-core/src/operations/deposits.ts')
-rw-r--r--packages/taler-wallet-core/src/operations/deposits.ts80
1 files changed, 54 insertions, 26 deletions
diff --git a/packages/taler-wallet-core/src/operations/deposits.ts b/packages/taler-wallet-core/src/operations/deposits.ts
index 6c41d76f6..dc743e17f 100644
--- a/packages/taler-wallet-core/src/operations/deposits.ts
+++ b/packages/taler-wallet-core/src/operations/deposits.ts
@@ -167,6 +167,14 @@ export function computeDepositTransactionStatus(
return {
major: TransactionMajorState.Aborted,
}
+ case DepositOperationStatus.Failed:
+ return {
+ major: TransactionMajorState.Failed,
+ }
+ case DepositOperationStatus.SuspendedAborting:
+ return {
+ major: TransactionMajorState.SuspendedAborting,
+ }
default:
throw Error(`unexpected deposit group state (${dg.operationStatus})`);
}
@@ -184,7 +192,7 @@ export async function suspendDepositGroup(
tag: PendingTaskType.Deposit,
depositGroupId,
});
- let res = await ws.db
+ const transitionInfo = await ws.db
.mktx((x) => [x.depositGroups])
.runReadWrite(async (tx) => {
const dg = await tx.depositGroups.get(depositGroupId);
@@ -212,14 +220,7 @@ export async function suspendDepositGroup(
return undefined;
});
stopLongpolling(ws, retryTag);
- if (res) {
- ws.notify({
- type: NotificationType.TransactionStateTransition,
- transactionId,
- oldTxState: res.oldTxState,
- newTxState: res.newTxState,
- });
- }
+ notifyTransition(ws, transactionId, transitionInfo);
}
export async function resumeDepositGroup(
@@ -230,7 +231,7 @@ export async function resumeDepositGroup(
tag: TransactionType.Deposit,
depositGroupId,
});
- let res = await ws.db
+ const transitionInfo = await ws.db
.mktx((x) => [x.depositGroups])
.runReadWrite(async (tx) => {
const dg = await tx.depositGroups.get(depositGroupId);
@@ -258,14 +259,7 @@ export async function resumeDepositGroup(
return undefined;
});
ws.workAvailable.trigger();
- if (res) {
- ws.notify({
- type: NotificationType.TransactionStateTransition,
- transactionId,
- oldTxState: res.oldTxState,
- newTxState: res.newTxState,
- });
- }
+ notifyTransition(ws, transactionId, transitionInfo);
}
export async function abortDepositGroup(
@@ -280,7 +274,7 @@ export async function abortDepositGroup(
tag: PendingTaskType.Deposit,
depositGroupId,
});
- let res = await ws.db
+ const transitionInfo = await ws.db
.mktx((x) => [x.depositGroups])
.runReadWrite(async (tx) => {
const dg = await tx.depositGroups.get(depositGroupId);
@@ -311,14 +305,48 @@ export async function abortDepositGroup(
stopLongpolling(ws, retryTag);
// Need to process the operation again.
ws.workAvailable.trigger();
- if (res) {
- ws.notify({
- type: NotificationType.TransactionStateTransition,
- transactionId,
- oldTxState: res.oldTxState,
- newTxState: res.newTxState,
+ notifyTransition(ws, transactionId, transitionInfo);
+}
+
+export async function cancelAbortingDepositGroup(
+ ws: InternalWalletState,
+ depositGroupId: string,
+): Promise<void> {
+ const transactionId = constructTransactionIdentifier({
+ tag: TransactionType.Deposit,
+ depositGroupId,
+ });
+ const retryTag = constructTaskIdentifier({
+ tag: PendingTaskType.Deposit,
+ depositGroupId,
+ });
+ const transitionInfo = await ws.db
+ .mktx((x) => [x.depositGroups])
+ .runReadWrite(async (tx) => {
+ const dg = await tx.depositGroups.get(depositGroupId);
+ if (!dg) {
+ logger.warn(
+ `can't cancel aborting deposit group, depositGroupId=${depositGroupId} not found`,
+ );
+ return undefined;
+ }
+ const oldState = computeDepositTransactionStatus(dg);
+ switch (dg.operationStatus) {
+ case DepositOperationStatus.SuspendedAborting:
+ case DepositOperationStatus.Aborting: {
+ dg.operationStatus = DepositOperationStatus.Failed;
+ await tx.depositGroups.put(dg);
+ return {
+ oldTxState: oldState,
+ newTxState: computeDepositTransactionStatus(dg),
+ };
+ }
+ }
+ return undefined;
});
- }
+ // FIXME: Also cancel ongoing work (via cancellation token, once implemented)
+ stopLongpolling(ws, retryTag);
+ notifyTransition(ws, transactionId, transitionInfo);
}
export async function deleteDepositGroup(