aboutsummaryrefslogtreecommitdiff
path: root/packages/taler-wallet-core/src/operations
diff options
context:
space:
mode:
authorÖzgür Kesim <oec-taler@kesim.org>2023-10-17 12:04:44 +0200
committerÖzgür Kesim <oec-taler@kesim.org>2023-10-17 12:04:44 +0200
commitfba664f9a3c35dfeb5bc5ac28f0baea09ff9b8a0 (patch)
tree6d069afdecade1b13914f4d13020d0331c2f4036 /packages/taler-wallet-core/src/operations
parentdef5ecda6fc4015417779af0a829d3f8aad4dd83 (diff)
parentaca3bc9423f15354913d0114cafbd4bd1782d801 (diff)
Merge branch 'master' into age-withdrawHEADage-withdraw
Diffstat (limited to 'packages/taler-wallet-core/src/operations')
-rw-r--r--packages/taler-wallet-core/src/operations/pending.ts9
-rw-r--r--packages/taler-wallet-core/src/operations/reward.ts6
-rw-r--r--packages/taler-wallet-core/src/operations/testing.ts74
-rw-r--r--packages/taler-wallet-core/src/operations/transactions.ts11
-rw-r--r--packages/taler-wallet-core/src/operations/withdraw.ts4
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,