gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-typescript-core] branch master updated: wallet-core: remove depre


From: Admin
Subject: [taler-typescript-core] branch master updated: wallet-core: remove deprecated notifyTransition function
Date: Thu, 05 Jun 2025 01:46:26 +0200

This is an automated email from the git hooks/post-receive script.

dold pushed a commit to branch master
in repository taler-typescript-core.

The following commit(s) were added to refs/heads/master by this push:
     new 9c5bfb3f9 wallet-core: remove deprecated notifyTransition function
9c5bfb3f9 is described below

commit 9c5bfb3f9417c7fb8177285c65ad05909dd46aaa
Author: Florian Dold <florian@dold.me>
AuthorDate: Thu Jun 5 01:46:21 2025 +0200

    wallet-core: remove deprecated notifyTransition function
---
 packages/taler-wallet-core/src/deposits.ts     | 101 +++--
 packages/taler-wallet-core/src/pay-merchant.ts | 505 +++++++++----------------
 packages/taler-wallet-core/src/transactions.ts |  19 -
 3 files changed, 236 insertions(+), 389 deletions(-)

diff --git a/packages/taler-wallet-core/src/deposits.ts 
b/packages/taler-wallet-core/src/deposits.ts
index a3b14100e..1532a6f97 100644
--- a/packages/taler-wallet-core/src/deposits.ts
+++ b/packages/taler-wallet-core/src/deposits.ts
@@ -138,7 +138,6 @@ import {
   applyNotifyTransition,
   constructTransactionIdentifier,
   isUnsuccessfulTransaction,
-  notifyTransition,
   parseTransactionIdentifier,
 } from "./transactions.js";
 import { WalletExecutionContext, getDenomInfo } from "./wallet.js";
@@ -483,7 +482,7 @@ export class DepositTransactionContext implements 
TransactionContext {
 
   async resumeTransaction(): Promise<void> {
     const { wex, depositGroupId, transactionId, taskId: retryTag } = this;
-    const transitionInfo = await wex.db.runReadWriteTx(
+    await wex.db.runReadWriteTx(
       { storeNames: ["depositGroups", "transactionsMeta"] },
       async (tx) => {
         const dg = await tx.depositGroups.get(depositGroupId);
@@ -538,14 +537,13 @@ export class DepositTransactionContext implements 
TransactionContext {
         dg.operationStatus = newOpStatus;
         await tx.depositGroups.put(dg);
         await this.updateTransactionMeta(tx);
-        return {
+        applyNotifyTransition(tx.notify, transactionId, {
           oldTxState: oldState,
           newTxState: computeDepositTransactionStatus(dg),
           balanceEffect: BalanceEffect.None,
-        };
+        });
       },
     );
-    notifyTransition(wex, transactionId, transitionInfo);
     wex.taskScheduler.startShepherdTask(retryTag);
   }
 
@@ -596,15 +594,14 @@ export class DepositTransactionContext implements 
TransactionContext {
         dg.failReason = reason;
         await tx.depositGroups.put(dg);
         await this.updateTransactionMeta(tx);
-        return {
+        applyNotifyTransition(tx.notify, transactionId, {
           oldTxState: oldState,
           newTxState: computeDepositTransactionStatus(dg),
           balanceEffect: BalanceEffect.Any,
-        };
+        });
       },
     );
     wex.taskScheduler.stopShepherdTask(taskId);
-    notifyTransition(wex, transactionId, transitionInfo);
   }
 }
 
@@ -985,7 +982,7 @@ async function waitForRefreshOnDepositGroup(
     },
   });
 
-  const transitionInfo = await wex.db.runReadWriteTx(
+  const didTransition = await wex.db.runReadWriteTx(
     { storeNames: ["depositGroups", "refreshGroups", "transactionsMeta"] },
     async (tx) => {
       const refreshGroup = await tx.refreshGroups.get(abortRefreshGroupId);
@@ -1004,23 +1001,26 @@ async function waitForRefreshOnDepositGroup(
           break;
         }
         default:
-          return undefined;
+          return false;
       }
       const newDg = await tx.depositGroups.get(depositGroup.depositGroupId);
       if (!newDg) {
-        return;
+        return false;
       }
       const oldTxState = computeDepositTransactionStatus(newDg);
       newDg.operationStatus = newOpState;
       const newTxState = computeDepositTransactionStatus(newDg);
       await tx.depositGroups.put(newDg);
       await ctx.updateTransactionMeta(tx);
-      return { oldTxState, newTxState, balanceEffect: BalanceEffect.Any };
+      applyNotifyTransition(tx.notify, ctx.transactionId, {
+        oldTxState,
+        newTxState,
+        balanceEffect: BalanceEffect.Any,
+      });
+      return true;
     },
   );
-
-  notifyTransition(wex, ctx.transactionId, transitionInfo);
-  if (transitionInfo) {
+  if (didTransition) {
     return TaskRunResult.progress();
   }
   return TaskRunResult.backoff();
@@ -1118,10 +1118,13 @@ async function processDepositGroupPendingKyc(
         await tx.depositGroups.put(newDg);
         await ctx.updateTransactionMeta(tx);
         const newTxState = computeDepositTransactionStatus(newDg);
-        return { oldTxState, newTxState, balanceEffect: BalanceEffect.Any };
+        applyNotifyTransition(tx.notify, ctx.transactionId, {
+          oldTxState,
+          newTxState,
+          balanceEffect: BalanceEffect.Any,
+        });
       },
     );
-    notifyTransition(wex, ctx.transactionId, transitionInfo);
   } else if (kycStatusRes.status === HttpStatusCode.Accepted) {
     const statusResp = await readResponseJsonOrThrow(
       kycStatusRes,
@@ -1202,12 +1205,12 @@ async function processDepositGroupPendingKycAuth(
 async function transitionKycAuthSuccess(
   ctx: DepositTransactionContext,
 ): Promise<TaskRunResult> {
-  const transitionInfo = await ctx.wex.db.runReadWriteTx(
+  const didTransition = await ctx.wex.db.runReadWriteTx(
     { storeNames: ["depositGroups", "transactionsMeta"] },
     async (tx) => {
       const newDg = await tx.depositGroups.get(ctx.depositGroupId);
       if (!newDg) {
-        return;
+        return false;
       }
       const oldTxState = computeDepositTransactionStatus(newDg);
       switch (newDg.operationStatus) {
@@ -1215,16 +1218,20 @@ async function transitionKycAuthSuccess(
           newDg.operationStatus = DepositOperationStatus.PendingDeposit;
           break;
         default:
-          return;
+          return false;
       }
       await tx.depositGroups.put(newDg);
       await ctx.updateTransactionMeta(tx);
       const newTxState = computeDepositTransactionStatus(newDg);
-      return { oldTxState, newTxState, balanceEffect: BalanceEffect.None };
+      applyNotifyTransition(tx.notify, ctx.transactionId, {
+        oldTxState,
+        newTxState,
+        balanceEffect: BalanceEffect.None,
+      });
+      return true;
     },
   );
-  notifyTransition(ctx.wex, ctx.transactionId, transitionInfo);
-  if (transitionInfo) {
+  if (didTransition) {
     return TaskRunResult.progress();
   } else {
     return TaskRunResult.backoff();
@@ -1343,10 +1350,13 @@ async function transitionToKycRequired(
           await tx.depositGroups.put(dg);
           await ctx.updateTransactionMeta(tx);
           const newTxState = computeDepositTransactionStatus(dg);
-          return { oldTxState, newTxState, balanceEffect: BalanceEffect.Any };
+          applyNotifyTransition(tx.notify, ctx.transactionId, {
+            oldTxState,
+            newTxState,
+            balanceEffect: BalanceEffect.Any,
+          });
         },
       );
-      notifyTransition(wex, ctx.transactionId, transitionInfo);
       return TaskRunResult.progress();
     }
     default: {
@@ -1394,10 +1404,13 @@ async function transitionToKycAuthRequired(
       await tx.depositGroups.put(dg);
       await ctx.updateTransactionMeta(tx);
       const newTxState = computeDepositTransactionStatus(dg);
-      return { oldTxState, newTxState, balanceEffect: BalanceEffect.Flags };
+      applyNotifyTransition(tx.notify, ctx.transactionId, {
+        oldTxState,
+        newTxState,
+        balanceEffect: BalanceEffect.Flags,
+      });
     },
   );
-  notifyTransition(wex, ctx.transactionId, transitionInfo);
   return TaskRunResult.progress();
 }
 
@@ -1560,10 +1573,13 @@ async function processDepositGroupTrack(
         await ctx.updateTransactionMeta(tx);
       }
       const newTxState = computeDepositTransactionStatus(dg);
-      return { oldTxState, newTxState, balanceEffect: BalanceEffect.Any };
+      applyNotifyTransition(tx.notify, ctx.transactionId, {
+        oldTxState,
+        newTxState,
+        balanceEffect: BalanceEffect.Any,
+      });
     },
   );
-  notifyTransition(wex, ctx.transactionId, transitionInfo);
   if (allWired) {
     return TaskRunResult.finished();
   } else {
@@ -1833,7 +1849,7 @@ async function processDepositGroupPendingDeposit(
     );
   }
 
-  const transitionInfo = await wex.db.runReadWriteTx(
+  await wex.db.runReadWriteTx(
     { storeNames: ["depositGroups", "transactionsMeta"] },
     async (tx) => {
       const dg = await tx.depositGroups.get(depositGroupId);
@@ -1845,11 +1861,13 @@ async function processDepositGroupPendingDeposit(
       await tx.depositGroups.put(dg);
       await ctx.updateTransactionMeta(tx);
       const newTxState = computeDepositTransactionStatus(dg);
-      return { oldTxState, newTxState, balanceEffect: BalanceEffect.None };
+      applyNotifyTransition(tx.notify, ctx.transactionId, {
+        oldTxState,
+        newTxState,
+        balanceEffect: BalanceEffect.None,
+      });
     },
   );
-
-  notifyTransition(wex, ctx.transactionId, transitionInfo);
   return TaskRunResult.progress();
 }
 
@@ -2382,18 +2400,17 @@ export async function createDepositGroup(
         h: contractTermsHash,
       });
       await ctx.updateTransactionMeta(tx);
-      return computeDepositTransactionStatus(depositGroup);
+      const oldTxState = { major: TransactionMajorState.None };
+      const newTxState = computeDepositTransactionStatus(depositGroup);
+      applyNotifyTransition(tx.notify, transactionId, {
+        oldTxState,
+        newTxState,
+        balanceEffect: BalanceEffect.Any,
+      });
+      return newTxState;
     },
   );
 
-  notifyTransition(wex, transactionId, {
-    oldTxState: {
-      major: TransactionMajorState.None,
-    },
-    newTxState,
-    balanceEffect: BalanceEffect.Any,
-  });
-
   wex.taskScheduler.startShepherdTask(ctx.taskId);
 
   return {
diff --git a/packages/taler-wallet-core/src/pay-merchant.ts 
b/packages/taler-wallet-core/src/pay-merchant.ts
index 7cd1b575e..8154abf39 100644
--- a/packages/taler-wallet-core/src/pay-merchant.ts
+++ b/packages/taler-wallet-core/src/pay-merchant.ts
@@ -172,12 +172,11 @@ import {
   SelectPayTokensResult,
 } from "./tokenSelection.js";
 import {
+  applyNotifyTransition,
   BalanceEffect,
   constructTransactionIdentifier,
   isUnsuccessfulTransaction,
-  notifyTransition,
   parseTransactionIdentifier,
-  TransitionInfo,
 } from "./transactions.js";
 import {
   EXCHANGE_COINS_LOCK,
@@ -382,7 +381,7 @@ export class PayMerchantTransactionContext implements 
TransactionContext {
   ): Promise<void> {
     const ws = this.wex;
     const extraStores = opts.extraStores ?? [];
-    const transitionInfo = await ws.db.runReadWriteTx(
+    await ws.db.runReadWriteTx(
       { storeNames: ["purchases", "transactionsMeta", ...extraStores] },
       async (tx) => {
         const purchaseRec = await tx.purchases.get(this.proposalId);
@@ -396,30 +395,31 @@ export class PayMerchantTransactionContext implements 
TransactionContext {
             await tx.purchases.put(purchaseRec);
             await this.updateTransactionMeta(tx);
             const newTxState = computePayMerchantTransactionState(purchaseRec);
-            return {
+            applyNotifyTransition(tx.notify, this.transactionId, {
               oldTxState,
               newTxState,
               // FIXME: The transition function should really return the effect
               // and not just the status.
               balanceEffect: BalanceEffect.Any,
-            };
+            });
+            return;
           }
           case TransitionResultType.Delete:
             await tx.purchases.delete(this.proposalId);
             await this.updateTransactionMeta(tx);
-            return {
+            applyNotifyTransition(tx.notify, this.transactionId, {
               oldTxState,
               newTxState: {
                 major: TransactionMajorState.None,
               },
               balanceEffect: BalanceEffect.Any,
-            };
+            });
+            return;
           default:
             return undefined;
         }
       },
     );
-    notifyTransition(ws, this.transactionId, transitionInfo);
   }
 
   async deleteTransaction(): Promise<void> {
@@ -496,7 +496,7 @@ export class PayMerchantTransactionContext implements 
TransactionContext {
   async suspendTransaction(): Promise<void> {
     const { wex, proposalId, transactionId } = this;
     wex.taskScheduler.stopShepherdTask(this.taskId);
-    const transitionInfo = await wex.db.runReadWriteTx(
+    await wex.db.runReadWriteTx(
       { storeNames: ["purchases", "transactionsMeta"] },
       async (tx) => {
         const purchase = await tx.purchases.get(proposalId);
@@ -506,15 +506,18 @@ export class PayMerchantTransactionContext implements 
TransactionContext {
         const oldTxState = computePayMerchantTransactionState(purchase);
         let newStatus = transitionSuspend[purchase.purchaseStatus];
         if (!newStatus) {
-          return undefined;
+          return;
         }
         await tx.purchases.put(purchase);
         await this.updateTransactionMeta(tx);
         const newTxState = computePayMerchantTransactionState(purchase);
-        return { oldTxState, newTxState, balanceEffect: BalanceEffect.None };
+        applyNotifyTransition(tx.notify, transactionId, {
+          oldTxState,
+          newTxState,
+          balanceEffect: BalanceEffect.None,
+        });
       },
     );
-    notifyTransition(wex, transactionId, transitionInfo);
   }
 
   async abortTransaction(reason?: TalerErrorDetail): Promise<void> {
@@ -590,16 +593,19 @@ export class PayMerchantTransactionContext implements 
TransactionContext {
         await tx.purchases.put(purchase);
         await this.updateTransactionMeta(tx);
         const newTxState = computePayMerchantTransactionState(purchase);
-        return { oldTxState, newTxState, balanceEffect: BalanceEffect.Any };
+        applyNotifyTransition(tx.notify, transactionId, {
+          oldTxState,
+          newTxState,
+          balanceEffect: BalanceEffect.Any,
+        });
       },
     );
     wex.taskScheduler.stopShepherdTask(this.taskId);
-    notifyTransition(wex, transactionId, transitionInfo);
     wex.taskScheduler.startShepherdTask(this.taskId);
   }
 
   async resumeTransaction(): Promise<void> {
-    const { wex, proposalId, transactionId, taskId: retryTag } = this;
+    const { wex, proposalId, transactionId } = this;
     const transitionInfo = await wex.db.runReadWriteTx(
       { storeNames: ["purchases", "transactionsMeta"] },
       async (tx) => {
@@ -615,10 +621,13 @@ export class PayMerchantTransactionContext implements 
TransactionContext {
         await tx.purchases.put(purchase);
         await this.updateTransactionMeta(tx);
         const newTxState = computePayMerchantTransactionState(purchase);
-        return { oldTxState, newTxState, balanceEffect: BalanceEffect.Any };
+        applyNotifyTransition(tx.notify, transactionId, {
+          oldTxState,
+          newTxState,
+          balanceEffect: BalanceEffect.Any,
+        });
       },
     );
-    notifyTransition(wex, transactionId, transitionInfo);
     wex.taskScheduler.startShepherdTask(this.taskId);
   }
 
@@ -655,10 +664,13 @@ export class PayMerchantTransactionContext implements 
TransactionContext {
         }
         await this.updateTransactionMeta(tx);
         const newTxState = computePayMerchantTransactionState(purchase);
-        return { oldTxState, newTxState, balanceEffect: BalanceEffect.Any };
+        applyNotifyTransition(tx.notify, transactionId, {
+          oldTxState,
+          newTxState,
+          balanceEffect: BalanceEffect.Any,
+        });
       },
     );
-    notifyTransition(wex, transactionId, transitionInfo);
     wex.taskScheduler.stopShepherdTask(this.taskId);
   }
 }
@@ -894,7 +906,7 @@ async function failProposalPermanently(
   err: TalerErrorDetail,
 ): Promise<void> {
   const ctx = new PayMerchantTransactionContext(wex, proposalId);
-  const transitionInfo = await wex.db.runReadWriteTx(
+  await wex.db.runReadWriteTx(
     { storeNames: ["purchases", "transactionsMeta"] },
     async (tx) => {
       const p = await tx.purchases.get(proposalId);
@@ -907,10 +919,13 @@ async function failProposalPermanently(
       const newTxState = computePayMerchantTransactionState(p);
       await tx.purchases.put(p);
       await ctx.updateTransactionMeta(tx);
-      return { oldTxState, newTxState, balanceEffect: BalanceEffect.Any };
+      applyNotifyTransition(tx.notify, ctx.transactionId, {
+        oldTxState,
+        newTxState,
+        balanceEffect: BalanceEffect.Any,
+      });
     },
   );
-  notifyTransition(wex, ctx.transactionId, transitionInfo);
 }
 
 function getPayRequestTimeout(purchase: PurchaseRecord): Duration {
@@ -1174,7 +1189,7 @@ async function processDownloadProposal(
 
   logger.trace(`extracted contract data: ${j2s(contractData)}`);
 
-  const transitionInfo = await wex.db.runReadWriteTx(
+  await wex.db.runReadWriteTx(
     { storeNames: ["purchases", "contractTerms", "transactionsMeta"] },
     async (tx) => {
       const p = await tx.purchases.get(proposalId);
@@ -1243,16 +1258,14 @@ async function processDownloadProposal(
       }
       await ctx.updateTransactionMeta(tx);
       const newTxState = computePayMerchantTransactionState(p);
-      return {
+      applyNotifyTransition(tx.notify, transactionId, {
         oldTxState,
         newTxState,
         balanceEffect: BalanceEffect.None,
-      } satisfies TransitionInfo;
+      });
     },
   );
 
-  notifyTransition(wex, transactionId, transitionInfo);
-
   return TaskRunResult.progress();
 }
 
@@ -1390,33 +1403,20 @@ async function createOrReusePurchase(
       // if this transaction was shared and the order is paid then it
       // means that another wallet already paid the proposal
       if (paid) {
-        const transitionInfo = await wex.db.runReadWriteTx(
-          { storeNames: ["purchases", "transactionsMeta"] },
-          async (tx) => {
-            const p = await tx.purchases.get(oldProposal.proposalId);
-            if (!p) {
-              logger.warn("purchase does not exist anymore");
-              return;
-            }
-            // The order is only paid by another wallet
-            // if the merchant says it's paid but the local
-            // wallet is still in a dialog state.
-            switch (p.purchaseStatus) {
-              case PurchaseStatus.DialogProposed:
-              case PurchaseStatus.DialogShared:
-                break;
-              default:
-                return undefined;
-            }
-            const oldTxState = computePayMerchantTransactionState(p);
-            p.purchaseStatus = PurchaseStatus.FailedPaidByOther;
-            const newTxState = computePayMerchantTransactionState(p);
-            await tx.purchases.put(p);
-            await oldCtx.updateTransactionMeta(tx);
-            return { oldTxState, newTxState, balanceEffect: BalanceEffect.Any 
};
-          },
-        );
-        notifyTransition(wex, oldCtx.transactionId, transitionInfo);
+        await oldCtx.transition(async (p) => {
+          // The order is only paid by another wallet
+          // if the merchant says it's paid but the local
+          // wallet is still in a dialog state.
+          switch (p.purchaseStatus) {
+            case PurchaseStatus.DialogProposed:
+            case PurchaseStatus.DialogShared:
+              break;
+            default:
+              return TransitionResultType.Stay;
+          }
+          p.purchaseStatus = PurchaseStatus.FailedPaidByOther;
+          return TransitionResultType.Transition;
+        });
       }
     }
     return {
@@ -1475,24 +1475,23 @@ async function createOrReusePurchase(
 
   const ctx = new PayMerchantTransactionContext(wex, proposalId);
 
-  const transitionInfo = await wex.db.runReadWriteTx(
+  await wex.db.runReadWriteTx(
     { storeNames: ["purchases", "transactionsMeta"] },
-    async (tx): Promise<TransitionInfo> => {
+    async (tx) => {
       await tx.purchases.put(proposalRecord);
       await ctx.updateTransactionMeta(tx);
       const oldTxState: TransactionState = {
         major: TransactionMajorState.None,
       };
       const newTxState = computePayMerchantTransactionState(proposalRecord);
-      return {
+      applyNotifyTransition(tx.notify, ctx.transactionId, {
         oldTxState,
         newTxState,
         balanceEffect: BalanceEffect.None,
-      };
+      });
     },
   );
 
-  notifyTransition(wex, ctx.transactionId, transitionInfo);
   return {
     proposalId,
     transactionId: ctx.transactionId,
@@ -1507,21 +1506,16 @@ async function storeFirstPaySuccess(
 ): Promise<void> {
   const ctx = new PayMerchantTransactionContext(wex, proposalId);
   const now = AbsoluteTime.toPreciseTimestamp(AbsoluteTime.now());
-  const transitionInfo = await wex.db.runReadWriteTx(
-    { storeNames: ["contractTerms", "purchases", "transactionsMeta"] },
-    async (tx) => {
-      const purchase = await tx.purchases.get(proposalId);
-
-      if (!purchase) {
-        logger.warn("purchase does not exist anymore");
-        return;
-      }
+  await ctx.transitionExtra(
+    {
+      extraStores: ["contractTerms"],
+    },
+    async (purchase, tx) => {
       const isFirst = purchase.timestampFirstSuccessfulPay === undefined;
       if (!isFirst) {
         logger.warn("payment success already stored");
-        return;
+        return TransitionResultType.Stay;
       }
-      const oldTxState = computePayMerchantTransactionState(purchase);
       if (purchase.purchaseStatus === PurchaseStatus.PendingPaying) {
         purchase.purchaseStatus = PurchaseStatus.Done;
       }
@@ -1557,17 +1551,9 @@ async function storeFirstPaySuccess(
           ),
         );
       }
-      await tx.purchases.put(purchase);
-      await ctx.updateTransactionMeta(tx);
-      const newTxState = computePayMerchantTransactionState(purchase);
-      return {
-        oldTxState,
-        newTxState,
-        balanceEffect: BalanceEffect.Any,
-      };
+      return TransitionResultType.Transition;
     },
   );
-  notifyTransition(wex, ctx.transactionId, transitionInfo);
 }
 
 async function storePayReplaySuccess(
@@ -1576,34 +1562,20 @@ async function storePayReplaySuccess(
   sessionId: string | undefined,
 ): Promise<void> {
   const ctx = new PayMerchantTransactionContext(wex, proposalId);
-  const transitionInfo = await wex.db.runReadWriteTx(
-    { storeNames: ["purchases", "transactionsMeta"] },
-    async (tx) => {
-      const purchase = await tx.purchases.get(proposalId);
-
-      if (!purchase) {
-        logger.warn("purchase does not exist anymore");
-        return;
-      }
-      const isFirst = purchase.timestampFirstSuccessfulPay === undefined;
-      if (isFirst) {
-        throw Error("invalid payment state");
-      }
-      const oldTxState = computePayMerchantTransactionState(purchase);
-      if (
-        purchase.purchaseStatus === PurchaseStatus.PendingPaying ||
-        purchase.purchaseStatus === PurchaseStatus.PendingPayingReplay
-      ) {
+  await ctx.transition(async (purchase) => {
+    const isFirst = purchase.timestampFirstSuccessfulPay === undefined;
+    if (isFirst) {
+      throw Error("invalid payment state");
+    }
+    switch (purchase.purchaseStatus) {
+      case PurchaseStatus.PendingPaying:
+      case PurchaseStatus.PendingPayingReplay:
         purchase.purchaseStatus = PurchaseStatus.Done;
-      }
-      purchase.lastSessionId = sessionId;
-      await tx.purchases.put(purchase);
-      await ctx.updateTransactionMeta(tx);
-      const newTxState = computePayMerchantTransactionState(purchase);
-      return { oldTxState, newTxState, balanceEffect: BalanceEffect.Any };
-    },
-  );
-  notifyTransition(wex, ctx.transactionId, transitionInfo);
+        break;
+    }
+    purchase.lastSessionId = sessionId;
+    return TransitionResultType.Transition;
+  });
 }
 
 /**
@@ -1996,23 +1968,12 @@ async function checkPaymentByProposalId(
       "automatically re-submitting payment with different session ID",
     );
     logger.trace(`last: ${purchase.lastSessionId}, current: ${sessionId}`);
-    const transitionInfo = await wex.db.runReadWriteTx(
-      { storeNames: ["purchases", "transactionsMeta"] },
-      async (tx) => {
-        const p = await tx.purchases.get(proposalId);
-        if (!p) {
-          return;
-        }
-        const oldTxState = computePayMerchantTransactionState(p);
-        p.lastSessionId = sessionId;
-        p.purchaseStatus = PurchaseStatus.PendingPayingReplay;
-        await tx.purchases.put(p);
-        await ctx.updateTransactionMeta(tx);
-        const newTxState = computePayMerchantTransactionState(p);
-        return { oldTxState, newTxState, balanceEffect: BalanceEffect.Any };
-      },
-    );
-    notifyTransition(wex, transactionId, transitionInfo);
+    await ctx.transition(async (p) => {
+      p.lastSessionId = sessionId;
+      p.purchaseStatus = PurchaseStatus.PendingPayingReplay;
+      return TransitionResultType.Transition;
+    });
+
     wex.taskScheduler.startShepherdTask(ctx.taskId);
 
     // FIXME: Consider changing the API here so that we don't have to
@@ -2933,7 +2894,11 @@ export async function confirmPay(
           break;
       }
       const newTxState = computePayMerchantTransactionState(p);
-      return { oldTxState, newTxState, balanceEffect: BalanceEffect.Any };
+      applyNotifyTransition(tx.notify, transactionId, {
+        oldTxState,
+        newTxState,
+        balanceEffect: BalanceEffect.Any,
+      });
     },
   );
 
@@ -2955,8 +2920,6 @@ export async function confirmPay(
     }
   }
 
-  notifyTransition(wex, transactionId, transitionInfo);
-
   // In case we're sharing the payment and we're long-polling
   wex.taskScheduler.stopShepherdTask(ctx.taskId);
 
@@ -3091,29 +3054,11 @@ async function processPurchasePay(
     );
 
     if (paid) {
-      const transitionInfo = await wex.db.runReadWriteTx(
-        { storeNames: ["purchases", "transactionsMeta"] },
-        async (tx) => {
-          const p = await tx.purchases.get(purchase.proposalId);
-          if (!p) {
-            logger.warn("purchase does not exist anymore");
-            return;
-          }
-          const oldTxState = computePayMerchantTransactionState(p);
-          p.purchaseStatus = PurchaseStatus.FailedPaidByOther;
-          const newTxState = computePayMerchantTransactionState(p);
-          await tx.purchases.put(p);
-          await ctx.updateTransactionMeta(tx);
-          return { oldTxState, newTxState, balanceEffect: BalanceEffect.Any };
-        },
-      );
-      const transactionId = constructTransactionIdentifier({
-        tag: TransactionType.Payment,
-        proposalId,
+      await ctx.transition(async (p) => {
+        p.purchaseStatus = PurchaseStatus.FailedPaidByOther;
+        return TransitionResultType.Transition;
       });
 
-      notifyTransition(wex, transactionId, transitionInfo);
-
       return {
         type: TaskRunResultType.Error,
         errorDetail: makeErrorDetail(TalerErrorCode.WALLET_ORDER_ALREADY_PAID, 
{
@@ -3592,30 +3537,17 @@ export async function refuseProposal(
   proposalId: string,
 ): Promise<void> {
   const ctx = new PayMerchantTransactionContext(wex, proposalId);
-  const transitionInfo = await wex.db.runReadWriteTx(
-    { storeNames: ["purchases", "transactionsMeta"] },
-    async (tx) => {
-      const proposal = await tx.purchases.get(proposalId);
-      if (!proposal) {
-        logger.trace(`proposal ${proposalId} not found, won't refuse 
proposal`);
-        return undefined;
-      }
-      if (
-        proposal.purchaseStatus !== PurchaseStatus.DialogProposed &&
-        proposal.purchaseStatus !== PurchaseStatus.DialogShared
-      ) {
-        return undefined;
-      }
-      const oldTxState = computePayMerchantTransactionState(proposal);
-      proposal.purchaseStatus = PurchaseStatus.AbortedProposalRefused;
-      const newTxState = computePayMerchantTransactionState(proposal);
-      await tx.purchases.put(proposal);
-      await ctx.updateTransactionMeta(tx);
-      return { oldTxState, newTxState, balanceEffect: BalanceEffect.Any };
-    },
-  );
-
-  notifyTransition(wex, ctx.transactionId, transitionInfo);
+  await ctx.transition(async (proposal) => {
+    switch (proposal.purchaseStatus) {
+      case PurchaseStatus.DialogProposed:
+      case PurchaseStatus.DialogShared:
+        break;
+      default:
+        return TransitionResultType.Stay;
+    }
+    proposal.purchaseStatus = PurchaseStatus.AbortedProposalRefused;
+    return TransitionResultType.Transition;
+  });
 }
 
 const transitionSuspend: {
@@ -3966,16 +3898,17 @@ export async function sharePayment(
 
       const newTxState = computePayMerchantTransactionState(p);
 
+      applyNotifyTransition(tx.notify, ctx.transactionId, {
+        oldTxState,
+        newTxState,
+        balanceEffect: BalanceEffect.Any,
+      });
+
       return {
         proposalId: p.proposalId,
         nonce: p.noncePriv,
         session: p.lastSessionId ?? p.downloadSessionId,
         token: p.claimToken,
-        transitionInfo: {
-          oldTxState,
-          newTxState,
-          balanceEffect: BalanceEffect.Any,
-        },
       };
     },
   );
@@ -3984,8 +3917,6 @@ export async function sharePayment(
     throw Error("This purchase can't be shared");
   }
 
-  notifyTransition(wex, ctx.transactionId, result.transitionInfo);
-
   // schedule a task to watch for the status
   wex.taskScheduler.startShepherdTask(ctx.taskId);
 
@@ -4050,29 +3981,13 @@ async function processPurchaseDialogShared(
     download.contractData,
     true,
   );
+
   if (paid) {
-    const transitionInfo = await wex.db.runReadWriteTx(
-      { storeNames: ["purchases", "transactionsMeta"] },
-      async (tx) => {
-        const p = await tx.purchases.get(purchase.proposalId);
-        if (!p) {
-          logger.warn("purchase does not exist anymore");
-          return;
-        }
-        const oldTxState = computePayMerchantTransactionState(p);
-        p.purchaseStatus = PurchaseStatus.FailedPaidByOther;
-        const newTxState = computePayMerchantTransactionState(p);
-        await tx.purchases.put(p);
-        await ctx.updateTransactionMeta(tx);
-        return { oldTxState, newTxState, balanceEffect: BalanceEffect.Any };
-      },
-    );
-    const transactionId = constructTransactionIdentifier({
-      tag: TransactionType.Payment,
-      proposalId,
+    await ctx.transition(async (p) => {
+      p.purchaseStatus = PurchaseStatus.FailedPaidByOther;
+      return TransitionResultType.Transition;
     });
-
-    notifyTransition(wex, transactionId, transitionInfo);
+    return TaskRunResult.progress();
   }
 
   return TaskRunResult.backoff();
@@ -4130,32 +4045,19 @@ async function processPurchaseAutoRefund(
   // is over or the product is already fully refunded.
 
   if (noAutoRefundOrExpired || fullyRefunded) {
-    const transitionInfo = await wex.db.runReadWriteTx(
-      { storeNames: ["purchases", "transactionsMeta"] },
-      async (tx) => {
-        const p = await tx.purchases.get(purchase.proposalId);
-        if (!p) {
-          logger.warn("purchase does not exist anymore");
-          return;
-        }
-        switch (p.purchaseStatus) {
-          case PurchaseStatus.PendingQueryingAutoRefund:
-          case PurchaseStatus.FinalizingQueryingAutoRefund:
-            break;
-          default:
-            return;
-        }
-        const oldTxState = computePayMerchantTransactionState(p);
-        p.purchaseStatus = PurchaseStatus.Done;
-        p.refundAmountAwaiting = undefined;
-        const newTxState = computePayMerchantTransactionState(p);
-        await tx.purchases.put(p);
-        await ctx.updateTransactionMeta(tx);
-        return { oldTxState, newTxState, balanceEffect: BalanceEffect.Any };
-      },
-    );
-    notifyTransition(wex, ctx.transactionId, transitionInfo);
-    return TaskRunResult.finished();
+    await ctx.transition(async (p) => {
+      switch (p.purchaseStatus) {
+        case PurchaseStatus.PendingQueryingAutoRefund:
+        case PurchaseStatus.FinalizingQueryingAutoRefund:
+          break;
+        default:
+          return TransitionResultType.Stay;
+      }
+      p.purchaseStatus = PurchaseStatus.Done;
+      p.refundAmountAwaiting = undefined;
+      return TransitionResultType.Transition;
+    });
+    return TaskRunResult.progress();
   }
 
   const requestUrl = new URL(
@@ -4178,35 +4080,22 @@ async function processPurchaseAutoRefund(
     codecForMerchantOrderStatusPaid(),
   );
 
-  if (orderStatus.refund_pending) {
-    const transitionInfo = await wex.db.runReadWriteTx(
-      { storeNames: ["purchases", "transactionsMeta"] },
-      async (tx) => {
-        const p = await tx.purchases.get(purchase.proposalId);
-        if (!p) {
-          logger.warn("purchase does not exist anymore");
-          return;
-        }
-        switch (p.purchaseStatus) {
-          case PurchaseStatus.PendingQueryingAutoRefund:
-          case PurchaseStatus.FinalizingQueryingAutoRefund:
-            break;
-          default:
-            return;
-        }
-        const oldTxState = computePayMerchantTransactionState(p);
-        p.purchaseStatus = PurchaseStatus.PendingAcceptRefund;
-        const newTxState = computePayMerchantTransactionState(p);
-        await tx.purchases.put(p);
-        await ctx.updateTransactionMeta(tx);
-        return { oldTxState, newTxState, balanceEffect: BalanceEffect.Any };
-      },
-    );
-    notifyTransition(wex, ctx.transactionId, transitionInfo);
-    return TaskRunResult.progress();
+  if (!orderStatus.refund_pending) {
+    return TaskRunResult.longpollReturnedPending();
   }
 
-  return TaskRunResult.longpollReturnedPending();
+  await ctx.transition(async (p) => {
+    switch (p.purchaseStatus) {
+      case PurchaseStatus.PendingQueryingAutoRefund:
+      case PurchaseStatus.FinalizingQueryingAutoRefund:
+        break;
+      default:
+        return TransitionResultType.Stay;
+    }
+    p.purchaseStatus = PurchaseStatus.PendingAcceptRefund;
+    return TransitionResultType.Transition;
+  });
+  return TaskRunResult.progress();
 }
 
 async function processPurchaseAbortingRefund(
@@ -4337,57 +4226,30 @@ async function processPurchaseQueryRefund(
   const ctx = new PayMerchantTransactionContext(wex, proposalId);
 
   if (!orderStatus.refund_pending) {
-    const transitionInfo = await wex.db.runReadWriteTx(
-      { storeNames: ["purchases", "transactionsMeta"] },
-      async (tx) => {
-        const p = await tx.purchases.get(purchase.proposalId);
-        if (!p) {
-          logger.warn("purchase does not exist anymore");
-          return undefined;
-        }
-        if (p.purchaseStatus !== PurchaseStatus.PendingQueryingRefund) {
-          return undefined;
-        }
-        const oldTxState = computePayMerchantTransactionState(p);
-        p.purchaseStatus = PurchaseStatus.Done;
-        p.refundAmountAwaiting = undefined;
-        const newTxState = computePayMerchantTransactionState(p);
-        await tx.purchases.put(p);
-        await ctx.updateTransactionMeta(tx);
-        return { oldTxState, newTxState, balanceEffect: BalanceEffect.Any };
-      },
-    );
-    notifyTransition(wex, ctx.transactionId, transitionInfo);
-    return TaskRunResult.progress();
+    await ctx.transition(async (p) => {
+      if (p.purchaseStatus !== PurchaseStatus.PendingQueryingRefund) {
+        return TransitionResultType.Stay;
+      }
+      p.purchaseStatus = PurchaseStatus.Done;
+      p.refundAmountAwaiting = undefined;
+      return TransitionResultType.Transition;
+    });
   } else {
     const refundAwaiting = Amounts.sub(
       Amounts.parseOrThrow(orderStatus.refund_amount),
       Amounts.parseOrThrow(orderStatus.refund_taken),
     ).amount;
 
-    const transitionInfo = await wex.db.runReadWriteTx(
-      { storeNames: ["purchases", "transactionsMeta"] },
-      async (tx) => {
-        const p = await tx.purchases.get(purchase.proposalId);
-        if (!p) {
-          logger.warn("purchase does not exist anymore");
-          return;
-        }
-        if (p.purchaseStatus !== PurchaseStatus.PendingQueryingRefund) {
-          return;
-        }
-        const oldTxState = computePayMerchantTransactionState(p);
-        p.refundAmountAwaiting = Amounts.stringify(refundAwaiting);
-        p.purchaseStatus = PurchaseStatus.PendingAcceptRefund;
-        const newTxState = computePayMerchantTransactionState(p);
-        await tx.purchases.put(p);
-        await ctx.updateTransactionMeta(tx);
-        return { oldTxState, newTxState, balanceEffect: BalanceEffect.Any };
-      },
-    );
-    notifyTransition(wex, ctx.transactionId, transitionInfo);
-    return TaskRunResult.progress();
+    await ctx.transition(async (p) => {
+      if (p.purchaseStatus !== PurchaseStatus.PendingQueryingRefund) {
+        return TransitionResultType.Stay;
+      }
+      p.refundAmountAwaiting = Amounts.stringify(refundAwaiting);
+      p.purchaseStatus = PurchaseStatus.PendingAcceptRefund;
+      return TransitionResultType.Transition;
+    });
   }
+  return TaskRunResult.progress();
 }
 
 async function processPurchaseAcceptRefund(
@@ -4480,10 +4342,13 @@ export async function startQueryRefund(
       const newTxState = computePayMerchantTransactionState(p);
       await tx.purchases.put(p);
       await ctx.updateTransactionMeta(tx);
-      return { oldTxState, newTxState, balanceEffect: BalanceEffect.Any };
+      applyNotifyTransition(tx.notify, ctx.transactionId, {
+        oldTxState,
+        newTxState,
+        balanceEffect: BalanceEffect.Any,
+      });
     },
   );
-  notifyTransition(wex, ctx.transactionId, transitionInfo);
   wex.taskScheduler.startShepherdTask(ctx.taskId);
 }
 
@@ -4564,11 +4429,6 @@ async function storeRefunds(
 
   const currency = Amounts.currencyOf(amountRaw);
 
-  const transitions: {
-    transactionId: string;
-    transitionInfo: TransitionInfo;
-  }[] = [];
-
   const result = await wex.db.runReadWriteTx(
     {
       storeNames: [
@@ -4691,13 +4551,10 @@ async function storeRefunds(
         );
         await tx.refundGroups.put(newGroup);
         await refundCtx.updateTransactionMeta(tx);
-        transitions.push({
-          transactionId: refundCtx.transactionId,
-          transitionInfo: {
-            oldTxState: { major: TransactionMajorState.None },
-            newTxState: computeRefundTransactionState(newGroup),
-            balanceEffect: BalanceEffect.Any,
-          },
+        applyNotifyTransition(tx.notify, refundCtx.transactionId, {
+          oldTxState: { major: TransactionMajorState.None },
+          newTxState: computeRefundTransactionState(newGroup),
+          balanceEffect: BalanceEffect.Any,
         });
       }
 
@@ -4748,13 +4605,10 @@ async function storeRefunds(
           const refreshCoins = await computeRefreshRequest(wex, tx, items);
           const newTxState: TransactionState =
             computeRefundTransactionState(refundGroup);
-          transitions.push({
-            transactionId: refundCtx.transactionId,
-            transitionInfo: {
-              oldTxState,
-              newTxState,
-              balanceEffect: BalanceEffect.Any,
-            },
+          applyNotifyTransition(tx.notify, refundCtx.transactionId, {
+            oldTxState,
+            newTxState,
+            balanceEffect: BalanceEffect.Any,
           });
           await createRefreshGroup(
             wex,
@@ -4797,13 +4651,14 @@ async function storeRefunds(
       await ctx.updateTransactionMeta(tx);
       const newTxState = computePayMerchantTransactionState(myPurchase);
 
+      applyNotifyTransition(tx.notify, ctx.transactionId, {
+        oldTxState,
+        newTxState,
+        balanceEffect: BalanceEffect.Any,
+      });
+
       return {
         numPendingItemsTotal,
-        transitionInfo: {
-          oldTxState,
-          newTxState,
-          balanceEffect: BalanceEffect.Any,
-        },
       };
     },
   );
@@ -4812,12 +4667,6 @@ async function storeRefunds(
     return TaskRunResult.finished();
   }
 
-  for (const trs of transitions) {
-    notifyTransition(wex, trs.transactionId, trs.transitionInfo);
-  }
-
-  notifyTransition(wex, ctx.transactionId, result.transitionInfo);
-
   if (result.numPendingItemsTotal > 0) {
     return TaskRunResult.backoff();
   } else {
diff --git a/packages/taler-wallet-core/src/transactions.ts 
b/packages/taler-wallet-core/src/transactions.ts
index 7ba8c3e15..74cda6fe7 100644
--- a/packages/taler-wallet-core/src/transactions.ts
+++ b/packages/taler-wallet-core/src/transactions.ts
@@ -991,22 +991,3 @@ export function applyNotifyTransition(
     );
   }
 }
-
-/**
- * Notify of a state transition if necessary.
- *
- * @deprecated use applyNotifyTransition inside transaction
- */
-export function notifyTransition(
-  wex: WalletExecutionContext,
-  transactionId: string,
-  transitionInfo: TransitionInfo | undefined,
-  experimentalUserData: any = undefined,
-): void {
-  applyNotifyTransition(
-    (wn: WalletNotification) => wex.ws.notify(wn),
-    transactionId,
-    transitionInfo,
-    experimentalUserData,
-  );
-}

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]