diff options
Diffstat (limited to 'packages/taler-wallet-core/src/operations')
5 files changed, 78 insertions, 26 deletions
| diff --git a/packages/taler-wallet-core/src/operations/pending.ts b/packages/taler-wallet-core/src/operations/pending.ts index 1819aa1b8..7590280bc 100644 --- a/packages/taler-wallet-core/src/operations/pending.ts +++ b/packages/taler-wallet-core/src/operations/pending.ts @@ -101,14 +101,14 @@ async function gatherExchangePending(        case ExchangeEntryDbUpdateStatus.Failed:          return;      } -    const opTag = TaskIdentifiers.forExchangeUpdate(exch); -    let opr = await tx.operationRetries.get(opTag); +    const opUpdateExchangeTag = TaskIdentifiers.forExchangeUpdate(exch); +    let opr = await tx.operationRetries.get(opUpdateExchangeTag);      const timestampDue = opr?.retryInfo.nextRetry ?? exch.nextRefreshCheckStamp;      resp.pendingOperations.push({        type: PendingTaskType.ExchangeUpdate,        ...getPendingCommon(          ws, -        opTag, +        opUpdateExchangeTag,          AbsoluteTime.fromPreciseTimestamp(timestampPreciseFromDb(timestampDue)),        ),        givesLifeness: false, @@ -119,11 +119,12 @@ async function gatherExchangePending(      // We only schedule a check for auto-refresh if the exchange update      // was successful.      if (!opr?.lastError) { +      const opCheckRefreshTag = TaskIdentifiers.forExchangeCheckRefresh(exch);        resp.pendingOperations.push({          type: PendingTaskType.ExchangeCheckRefresh,          ...getPendingCommon(            ws, -          opTag, +          opCheckRefreshTag,            AbsoluteTime.fromPreciseTimestamp(              timestampPreciseFromDb(timestampDue),            ), diff --git a/packages/taler-wallet-core/src/operations/reward.ts b/packages/taler-wallet-core/src/operations/reward.ts index 4e16d977d..ed9927bab 100644 --- a/packages/taler-wallet-core/src/operations/reward.ts +++ b/packages/taler-wallet-core/src/operations/reward.ts @@ -23,7 +23,7 @@ import {    Amounts,    BlindedDenominationSignature,    codecForMerchantTipResponseV2, -  codecForTipPickupGetResponse, +  codecForRewardPickupGetResponse,    CoinStatus,    DenomKeyType,    encodeCrock, @@ -168,11 +168,11 @@ export async function prepareTip(      const merchantResp = await ws.http.fetch(tipStatusUrl.href);      const tipPickupStatus = await readSuccessResponseJsonOrThrow(        merchantResp, -      codecForTipPickupGetResponse(), +      codecForRewardPickupGetResponse(),      );      logger.trace(`status ${j2s(tipPickupStatus)}`); -    const amount = Amounts.parseOrThrow(tipPickupStatus.tip_amount); +    const amount = Amounts.parseOrThrow(tipPickupStatus.reward_amount);      logger.trace("new tip, creating tip record");      await updateExchangeFromUrl(ws, tipPickupStatus.exchange_url); diff --git a/packages/taler-wallet-core/src/operations/testing.ts b/packages/taler-wallet-core/src/operations/testing.ts index 607d03470..f5bed13dd 100644 --- a/packages/taler-wallet-core/src/operations/testing.ts +++ b/packages/taler-wallet-core/src/operations/testing.ts @@ -74,6 +74,7 @@ import {  import { initiatePeerPushDebit } from "./pay-peer-push-debit.js";  import { OpenedPromise, openPromise } from "../index.js";  import { getTransactionById, getTransactions } from "./transactions.js"; +import { getPendingOperations } from "./pending.js";  const logger = new Logger("operations/testing.ts"); @@ -290,7 +291,7 @@ export async function runIntegrationTest(      corebankApiBaseUrl: args.corebankApiBaseUrl,      exchangeBaseUrl: args.exchangeBaseUrl,    }); -  await waitUntilDone(ws); +  await waitUntilTransactionsFinal(ws);    logger.info("done withdrawing test balance");    const balance = await getBalances(ws); @@ -305,7 +306,7 @@ export async function runIntegrationTest(    await makePayment(ws, myMerchant, args.amountToSpend, "hello world");    // Wait until the refresh is done -  await waitUntilDone(ws); +  await waitUntilTransactionsFinal(ws);    logger.trace("withdrawing test balance for refund");    const withdrawAmountTwo = Amounts.parseOrThrow(`${currency}:18`); @@ -320,7 +321,7 @@ export async function runIntegrationTest(    });    // Wait until the withdraw is done -  await waitUntilDone(ws); +  await waitUntilTransactionsFinal(ws);    const { orderId: refundOrderId } = await makePayment(      ws, @@ -344,7 +345,7 @@ export async function runIntegrationTest(    logger.trace("integration test: applied refund");    // Wait until the refund is done -  await waitUntilDone(ws); +  await waitUntilTransactionsFinal(ws);    logger.trace("integration test: making payment after refund"); @@ -357,12 +358,17 @@ export async function runIntegrationTest(    logger.trace("integration test: make payment done"); -  await waitUntilDone(ws); +  await waitUntilTransactionsFinal(ws);    logger.trace("integration test: all done!");  } -export async function waitUntilDone(ws: InternalWalletState): Promise<void> { +/** + * Wait until all transactions are in a final state. + */ +export async function waitUntilTransactionsFinal( +  ws: InternalWalletState, +): Promise<void> {    logger.info("waiting until all transactions are in a final state");    ws.ensureTaskLoopRunning();    let p: OpenedPromise<void> | undefined = undefined; @@ -410,6 +416,44 @@ export async function waitUntilDone(ws: InternalWalletState): Promise<void> {    logger.info("done waiting until all transactions are in a final state");  } +/** + * Wait until pending work is processed. + */ +export async function waitUntilTasksProcessed( +  ws: InternalWalletState, +): Promise<void> { +  logger.info("waiting until pending work is processed"); +  ws.ensureTaskLoopRunning(); +  let p: OpenedPromise<void> | undefined = undefined; +  const cancelNotifs = ws.addNotificationListener((notif) => { +    if (!p) { +      return; +    } +    if (notif.type === NotificationType.PendingOperationProcessed) { +      p.resolve(); +    } +  }); +  while (1) { +    p = openPromise(); +    const pendingTasksResp = await getPendingOperations(ws); +    logger.info(`waiting on pending ops: ${j2s(pendingTasksResp)}`); +    let finished = true; +    for (const task of pendingTasksResp.pendingOperations) { +      if (task.isDue) { +        finished = false; +      } +      logger.info(`continuing waiting for task ${task.id}`); +    } +    if (finished) { +      break; +    } +    // Wait until task is done +    await p.promise; +  } +  logger.info("done waiting until pending work is processed"); +  cancelNotifs(); +} +  export async function waitUntilRefreshesDone(    ws: InternalWalletState,  ): Promise<void> { @@ -463,7 +507,7 @@ export async function waitUntilRefreshesDone(    logger.info("done waiting until all refreshes are in a final state");  } -async function waitUntilPendingReady( +async function waitUntilTransactionPendingReady(    ws: InternalWalletState,    transactionId: string,  ): Promise<void> { @@ -560,7 +604,7 @@ export async function runIntegrationTest2(      corebankApiBaseUrl: args.corebankApiBaseUrl,      exchangeBaseUrl: args.exchangeBaseUrl,    }); -  await waitUntilDone(ws); +  await waitUntilTransactionsFinal(ws);    logger.info("done withdrawing test balance");    const balance = await getBalances(ws); @@ -580,7 +624,7 @@ export async function runIntegrationTest2(    );    // Wait until the refresh is done -  await waitUntilDone(ws); +  await waitUntilTransactionsFinal(ws);    logger.trace("withdrawing test balance for refund");    const withdrawAmountTwo = Amounts.parseOrThrow(`${currency}:18`); @@ -595,7 +639,7 @@ export async function runIntegrationTest2(    });    // Wait until the withdraw is done -  await waitUntilDone(ws); +  await waitUntilTransactionsFinal(ws);    const { orderId: refundOrderId } = await makePayment(      ws, @@ -619,7 +663,7 @@ export async function runIntegrationTest2(    logger.trace("integration test: applied refund");    // Wait until the refund is done -  await waitUntilDone(ws); +  await waitUntilTransactionsFinal(ws);    logger.trace("integration test: making payment after refund"); @@ -632,7 +676,7 @@ export async function runIntegrationTest2(    logger.trace("integration test: make payment done"); -  await waitUntilDone(ws); +  await waitUntilTransactionsFinal(ws);    const peerPushInit = await initiatePeerPushDebit(ws, {      partialContractTerms: { @@ -647,7 +691,7 @@ export async function runIntegrationTest2(      },    }); -  await waitUntilPendingReady(ws, peerPushInit.transactionId); +  await waitUntilTransactionPendingReady(ws, peerPushInit.transactionId);    const peerPushCredit = await preparePeerPushCredit(ws, {      talerUri: peerPushInit.talerUri, @@ -670,7 +714,7 @@ export async function runIntegrationTest2(      },    }); -  await waitUntilPendingReady(ws, peerPullInit.transactionId); +  await waitUntilTransactionPendingReady(ws, peerPullInit.transactionId);    const peerPullInc = await preparePeerPullDebit(ws, {      talerUri: peerPullInit.talerUri, @@ -680,7 +724,7 @@ export async function runIntegrationTest2(      peerPullDebitId: peerPullInc.peerPullDebitId,    }); -  await waitUntilDone(ws); +  await waitUntilTransactionsFinal(ws);    logger.trace("integration test: all done!");  } diff --git a/packages/taler-wallet-core/src/operations/transactions.ts b/packages/taler-wallet-core/src/operations/transactions.ts index 72c67b153..bebb3d60b 100644 --- a/packages/taler-wallet-core/src/operations/transactions.ts +++ b/packages/taler-wallet-core/src/operations/transactions.ts @@ -1290,9 +1290,16 @@ export async function getTransactions(    const txPending = transactions.filter((x) => isPending(x));    const txNotPending = transactions.filter((x) => !isPending(x)); +  let sortSign: number; +  if (transactionsRequest?.sort == "descending") { +    sortSign = -1; +  } else { +    sortSign = 1; +  } +    const txCmp = (h1: Transaction, h2: Transaction) => {      // Order transactions by timestamp.  Newest transactions come first. -    const tsCmp = -AbsoluteTime.cmp( +    const tsCmp = AbsoluteTime.cmp(        AbsoluteTime.fromPreciseTimestamp(h1.timestamp),        AbsoluteTime.fromPreciseTimestamp(h2.timestamp),      ); @@ -1300,7 +1307,7 @@ export async function getTransactions(      if (tsCmp === 0) {        return Math.sign(txOrder[h1.type] - txOrder[h2.type]);      } -    return tsCmp; +    return sortSign * tsCmp;    };    txPending.sort(txCmp); diff --git a/packages/taler-wallet-core/src/operations/withdraw.ts b/packages/taler-wallet-core/src/operations/withdraw.ts index eff427bec..245eec4fa 100644 --- a/packages/taler-wallet-core/src/operations/withdraw.ts +++ b/packages/taler-wallet-core/src/operations/withdraw.ts @@ -33,7 +33,7 @@ import {    codecForReserveStatus,    codecForTalerConfigResponse,    codecForWalletKycUuid, -  codecForWithdrawBatchResponse, +  codecForExchangeWithdrawBatchResponse,    codecForWithdrawOperationStatusResponse,    codecForWithdrawResponse,    CoinStatus, @@ -944,7 +944,7 @@ async function processPlanchetExchangeBatchRequest(      }      const r = await readSuccessResponseJsonOrThrow(        resp, -      codecForWithdrawBatchResponse(), +      codecForExchangeWithdrawBatchResponse(),      );      return {        coinIdxs: requestCoinIdxs, | 
