taler-typescript-core

Wallet core logic and WebUIs for various components
Log | Files | Refs | Submodules | README | LICENSE

commit e79cb11dc9890ca4b061d1de5118381ec843d186
parent 4b5367e23483965f83d9ea58528f654a583ba41a
Author: Florian Dold <florian@dold.me>
Date:   Sat, 30 May 2026 00:06:21 +0200

fix excessive logging, make payment-share-idempotency test more robust

Diffstat:
Mpackages/taler-harness/src/harness/harness.ts | 1+
Mpackages/taler-harness/src/integrationtests/test-payment-share-idempotency.ts | 11++++++++++-
Mpackages/taler-wallet-core/src/coinSelection.ts | 19-------------------
Mpackages/taler-wallet-core/src/pay-merchant.ts | 2+-
Mpackages/taler-wallet-core/src/withdraw.ts | 14+-------------
5 files changed, 13 insertions(+), 34 deletions(-)

diff --git a/packages/taler-harness/src/harness/harness.ts b/packages/taler-harness/src/harness/harness.ts @@ -1754,6 +1754,7 @@ export class ExchangeService implements ExchangeServiceInterface { } const cryptoEddsa = this.helperCryptoEddsaProc; if (cryptoEddsa) { + logger.info(`stopping eddsa helper`); cryptoEddsa.proc.kill("SIGTERM"); await cryptoEddsa.wait(); this.helperCryptoRsaProc = undefined; diff --git a/packages/taler-harness/src/integrationtests/test-payment-share-idempotency.ts b/packages/taler-harness/src/integrationtests/test-payment-share-idempotency.ts @@ -171,16 +171,25 @@ export async function runPaymentShareIdempotencyTest(t: GlobalTestState) { claimSecondWalletAgain.status === PreparePayResultType.PaymentPossible, ); + // Preparing the payment must return the same transaction ID here. + t.assertTrue( + claimSecondWallet.transactionId === claimSecondWalletAgain.transactionId, + ); + t.logStep("w2-claimed-again"); + console.log(`confirming ${claimSecondWalletAgain.transactionId}`); + // pay from the second wallet const r2 = await secondWallet.call(WalletApiOperation.ConfirmPay, { transactionId: claimSecondWalletAgain.transactionId, }); + t.logStep("w2-confirmed"); + t.assertTrue(r2.type === ConfirmPayResultType.Done); - t.logStep("w2-confirmed"); + t.logStep("w2-confirmed-checked"); // Wait for refresh to settle before we do checks await secondWallet.call( diff --git a/packages/taler-wallet-core/src/coinSelection.ts b/packages/taler-wallet-core/src/coinSelection.ts @@ -225,14 +225,6 @@ async function internalSelectPayCoins( const wireFeesPerExchange = candidateRes.currentWireFeePerExchange; const candidateDenoms = candidateRes.coinAvailability; - if (logger.shouldLogTrace()) { - logger.trace( - `instructed amount: ${Amounts.stringify(req.contractTermsAmount)}`, - ); - logger.trace(`wire fees per exchange: ${j2s(wireFeesPerExchange)}`); - logger.trace(`candidates: ${j2s(candidateDenoms)}`); - } - const coinRes: SelectedCoin[] = []; const currency = contractTermsAmount.currency; @@ -363,10 +355,6 @@ export async function selectPayCoinsInTx( materialAvSel.tally, ); - if (logger.shouldLogTrace()) { - logger.trace(`coin selection: ${j2s(coinSel)}`); - } - return { type: "success", coinSel, @@ -453,7 +441,6 @@ async function assembleSelectPayCoinsSuccessResult( selInfo.maxAge, CoinStatus.Fresh, ]; - logger.trace(`query: ${j2s(query)}`); const coins = await tx.coins.indexes.byExchangeDenomPubHashAndAgeAndStatus.getAll( query, @@ -1296,12 +1283,6 @@ async function internalSelectPeerCoins( wireFeesPerExchange: {}, }); - if (logger.shouldLogTrace()) { - logger.trace(`candidates: ${j2s(candidates)}`); - logger.trace(`instructedAmount: ${j2s(req.instructedAmount)}`); - logger.trace(`tally: ${j2s(tally)}`); - } - const selRes = selectGreedy( { wireFeesPerExchange: {}, diff --git a/packages/taler-wallet-core/src/pay-merchant.ts b/packages/taler-wallet-core/src/pay-merchant.ts @@ -2993,7 +2993,7 @@ export async function confirmPay( } // In case we're sharing the payment and we're long-polling - wex.taskScheduler.stopShepherdTask(ctx.taskId); + await wex.taskScheduler.resetTask(ctx.taskId); // This will become the default behavior on the future. if (wex.ws.devExperimentState.flagConfirmPayNoWait) { diff --git a/packages/taler-wallet-core/src/withdraw.ts b/packages/taler-wallet-core/src/withdraw.ts @@ -1267,7 +1267,7 @@ export async function getWithdrawableDenomsTx( if (logger.shouldLogTrace()) { const maxStr = maxAmount ? Amounts.stringify(maxAmount) : "<unknown>"; logger.trace( - `getting withdrawable denoms for ${currency} / ${maxStr} at ${exchangeBaseUrl}`, + `getting withdrawable denoms for ${currency} / max=${maxStr} at ${exchangeBaseUrl}`, ); logger.trace(`have ${allFamilies.length} families`); } @@ -1287,9 +1287,6 @@ export async function getWithdrawableDenomsTx( // Denom value too high, no point in selecting. continue; } - if (logger.shouldLogTrace()) { - logger.trace(`finding representative for denom family: ${j2s(fam)}`); - } const fpSerial = fam.denominationFamilySerial; checkDbInvariant(typeof fpSerial === "number", "denominationFamilySerial"); // Now we need to find a representative denom for the family. @@ -1306,28 +1303,22 @@ export async function getWithdrawableDenomsTx( (dr0.value.denominationFamilySerial === fpSerial && dr0.value.stampExpireWithdraw < dbNow) ) { - logger.trace(`continuing cursor past ${j2s([fpSerial, dbNow])}`); denomCursor.continue([fpSerial, dbNow]); } while (1) { const dr = await denomCursor.current(); if (!dr.hasValue) { - logger.trace(`cursor exhausted`); break; } if (dr.value.denominationFamilySerial != fpSerial) { // Cursor went to next serial already, we need to stop. - logger.trace(`cursor past target`); break; } - logger.trace(`considering ${j2s(dr.value)}`); if (isCandidateWithdrawableDenomRec(dr.value)) { denom = dr.value; break; } - logger.trace(`continuing cursor to next record`); - denomCursor.continue(); } if (denom) { @@ -1338,9 +1329,6 @@ export async function getWithdrawableDenomsTx( } } relevantDenoms.sort((d1, d2) => Amounts.cmp(d2.value, d1.value)); - if (logger.shouldLogTrace()) { - logger.trace(`relevant denoms: ${j2s(relevantDenoms)}`); - } for (const denom of relevantDenoms) { if (denom.exchangeBaseUrl != exchangeBaseUrl) { throw Error(