taler-typescript-core

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

commit 7983507bfe19dc1a64050a6d24fe85c1f47fa5bc
parent d3f5967df502f17907da56c13199c45bd956f2af
Author: Florian Dold <florian@dold.me>
Date:   Wed, 19 Feb 2025 18:56:37 +0100

remove deprecated helper

Diffstat:
Mpackages/taler-harness/src/harness/environments.ts | 25+++++++++++++------------
Mpackages/taler-harness/src/index.ts | 110++++++++++++++++++++++++++++++++++++++++++-------------------------------------
Mpackages/taler-harness/src/integrationtests/test-bank-wop.ts | 44+++++++++++++++++++++-----------------------
Mpackages/taler-harness/src/integrationtests/test-otp.ts | 9+++------
Mpackages/taler-harness/src/integrationtests/test-withdrawal-cashacceptor.ts | 29+++++++++++++++--------------
Mpackages/taler-harness/src/lint.ts | 26++++++++++++--------------
Mpackages/taler-util/src/operation.ts | 20--------------------
7 files changed, 123 insertions(+), 140 deletions(-)

diff --git a/packages/taler-harness/src/harness/environments.ts b/packages/taler-harness/src/harness/environments.ts @@ -39,7 +39,6 @@ import { j2s, LegitimizationRuleSet, Logger, - narrowOpSuccessOrThrow, NotificationType, PartialWalletRunConfig, PreparePayResultType, @@ -1268,24 +1267,26 @@ export async function registerHarnessBankTestUser( ): Promise<TestUserResult> { const username = "user-" + encodeCrock(getRandomBytes(10)).toLowerCase(); const password = "pw-" + encodeCrock(getRandomBytes(10)).toLowerCase(); - const createRes = await bankClient.createAccount(undefined, { - name: username, - username, - password, - }); - narrowOpSuccessOrThrow("createAccount", createRes); + const createRes = succeedOrThrow( + await bankClient.createAccount(undefined, { + name: username, + username, + password, + }), + ); // It's a test account, so it's safe to log credentials. logger.info( `Created test bank account ${username} with password ${password}`, ); - const tokRes = await bankClient.createAccessTokenBasic(username, password, { - scope: "readwrite", - }); - narrowOpSuccessOrThrow("token", tokRes); + const tokRes = succeedOrThrow( + await bankClient.createAccessTokenBasic(username, password, { + scope: "readwrite", + }), + ); return { password, username, - token: tokRes.body.access_token, + token: tokRes.access_token, }; } diff --git a/packages/taler-harness/src/index.ts b/packages/taler-harness/src/index.ts @@ -44,11 +44,11 @@ import { generateIban, getRandomBytes, j2s, - narrowOpSuccessOrThrow, randomBytes, rsaBlind, setGlobalLogLevelFromString, stringifyPayTemplateUri, + succeedOrThrow, } from "@gnu-taler/taler-util"; import { clk } from "@gnu-taler/taler-util/clk"; import { readlinePrompt } from "@gnu-taler/taler-util/compat"; @@ -138,53 +138,58 @@ testingCli const username = "user-" + encodeCrock(getRandomBytes(10)).toLowerCase(); const password = "pw-" + encodeCrock(getRandomBytes(10)).toLowerCase(); - const createRes = await bank.createAccount(undefined, { - name: username, - username, - password, - }); - narrowOpSuccessOrThrow("create", createRes); + succeedOrThrow( + await bank.createAccount(undefined, { + name: username, + username, + password, + }), + ); // It's a test account, so it's safe to log credentials. logger.info( `Created test bank account ${username} with password ${password}`, ); - const tokRes = await bank.createAccessTokenBasic(username, password, { - scope: "readwrite", - }); - narrowOpSuccessOrThrow("token", tokRes); - const token = tokRes.body.access_token; + const tokRes = succeedOrThrow( + await bank.createAccessTokenBasic(username, password, { + scope: "readwrite", + }), + ); + const token = tokRes.access_token; const bankAuth = { username, token }; logger.info(`Test account access token ${token}`); - const createWithdrawalResp = await bank.createWithdrawal(bankAuth, { - no_amount_to_wallet: true, - }); - narrowOpSuccessOrThrow("create-withdrawal", createWithdrawalResp); + const createWithdrawalResp = succeedOrThrow( + await bank.createWithdrawal(bankAuth, { + no_amount_to_wallet: true, + }), + ); // libeufin doesn't automatically append the external-confirmation. logger.info( - `Created withdrawal operation ${createWithdrawalResp.body.taler_withdraw_uri}?external-confirmation=1`, + `Created withdrawal operation ${createWithdrawalResp.taler_withdraw_uri}?external-confirmation=1`, ); - const wopid = createWithdrawalResp.body.withdrawal_id; + const wopid = createWithdrawalResp.withdrawal_id; while (true) { logger.info(`Waiting for status change.`); - const statusRes = await bank.getWithdrawalById(wopid, { - timeoutMs: 30000, - old_state: "pending", - }); - narrowOpSuccessOrThrow("getWithdrawalById", statusRes); - logger.info(`Withdrawal status: ${j2s(statusRes.body.status)}`); - if (statusRes.body.status === "selected") { + const statusRes = succeedOrThrow( + await bank.getWithdrawalById(wopid, { + timeoutMs: 30000, + old_state: "pending", + }), + ); + logger.info(`Withdrawal status: ${j2s(statusRes.status)}`); + if (statusRes.status === "selected") { break; } } const amountStr = await readlinePrompt("Amount to withdraw: "); - const confirmRes = await bank.confirmWithdrawalById( - bankAuth, - { - amount: amountStr as AmountString, - }, - wopid, + succeedOrThrow( + await bank.confirmWithdrawalById( + bankAuth, + { + amount: amountStr as AmountString, + }, + wopid, + ), ); - narrowOpSuccessOrThrow("confirmWithdrawalById", confirmRes); logger.info("Withdrawal operation confirmed"); }); @@ -195,32 +200,35 @@ testingCli .action(async (args) => { const merchantBaseUrl = "https://backend.test.taler.net/instances/sandbox/"; const merchantApi = new TalerMerchantInstanceHttpClient(merchantBaseUrl); - const tokResp = await merchantApi.createLoginToken("secret-token:sandbox", { - scope: "write", - }); - narrowOpSuccessOrThrow("", tokResp); + const tokResp = succeedOrThrow( + await merchantApi.createLoginToken("secret-token:sandbox", { + scope: "write", + }), + ); - const tok: AccessToken = tokResp.body.token; + const tok: AccessToken = tokResp.token; - const createResp = await merchantApi.createOrder(tok, { - order: { - amount: "TESTKUDOS:42", - summary: "Hello", - // Intentional, test.taler.net merchant does not support it. - wire_method: "bitcoin", - }, - }); - narrowOpSuccessOrThrow("", createResp); - const orderId = createResp.body.order_id; - const statusResp = await merchantApi.getOrderDetails(tok, orderId); - narrowOpSuccessOrThrow("", statusResp); - if (statusResp.body.order_status !== "unpaid") { + const createResp = succeedOrThrow( + await merchantApi.createOrder(tok, { + order: { + amount: "TESTKUDOS:42", + summary: "Hello", + // Intentional, test.taler.net merchant does not support it. + wire_method: "bitcoin", + }, + }), + ); + const orderId = createResp.order_id; + const statusResp = succeedOrThrow( + await merchantApi.getOrderDetails(tok, orderId), + ); + if (statusResp.order_status !== "unpaid") { throw Error("unexpected order state"); } console.log( "Insufficient balance order (undepositable due to bitcoin wire method):", ); - console.log(statusResp.body.taler_pay_uri); + console.log(statusResp.taler_pay_uri); }); const advancedCli = talerHarnessCli.subcommand("advancedArgs", "advanced", { diff --git a/packages/taler-harness/src/integrationtests/test-bank-wop.ts b/packages/taler-harness/src/integrationtests/test-bank-wop.ts @@ -21,7 +21,7 @@ import { createEddsaKeyPair, encodeCrock, j2s, - narrowOpSuccessOrThrow, + succeedOrThrow, TalerBankIntegrationHttpClient, TalerCoreBankHttpClient, } from "@gnu-taler/taler-util"; @@ -44,41 +44,39 @@ export async function runBankWopTest(t: GlobalTestState) { const bankUser = await registerHarnessBankTestUser(bankClientNg); - const withdrawalRes = await bankClientNg.createWithdrawal(bankUser, { - amount: "TESTKUDOS:42", - }); - - narrowOpSuccessOrThrow("", withdrawalRes); + const withdrawalRes = succeedOrThrow( + await bankClientNg.createWithdrawal(bankUser, { + amount: "TESTKUDOS:42", + }), + ); const biClient = new TalerBankIntegrationHttpClient( `${bank.corebankApiBaseUrl}taler-integration/`, ); - const wopid = withdrawalRes.body.withdrawal_id; + const wopid = withdrawalRes.withdrawal_id; - const wopStatus = await biClient.getWithdrawalOperationById(wopid); - narrowOpSuccessOrThrow("", wopStatus); + const wopStatus = succeedOrThrow( + await biClient.getWithdrawalOperationById(wopid), + ); console.log(`${j2s(wopStatus)}`); const keyPair = createEddsaKeyPair(); - const postRes = await biClient.completeWithdrawalOperationById(wopid, { - selected_exchange: exchangeBankAccount.accountPaytoUri, - reserve_pub: encodeCrock(keyPair.eddsaPub), - }); - narrowOpSuccessOrThrow("", postRes); - - const confirmResp = await bankClientNg.confirmWithdrawalById( - bankUser, - {}, - wopid, + succeedOrThrow( + await biClient.completeWithdrawalOperationById(wopid, { + selected_exchange: exchangeBankAccount.accountPaytoUri, + reserve_pub: encodeCrock(keyPair.eddsaPub), + }), ); - narrowOpSuccessOrThrow("", confirmResp); - const wopStatus2 = await biClient.getWithdrawalOperationById(wopid); - narrowOpSuccessOrThrow("", wopStatus2); - console.log(`status after: ${j2s(wopStatus2.body)}`); + succeedOrThrow(await bankClientNg.confirmWithdrawalById(bankUser, {}, wopid)); + + const wopStatus2 = succeedOrThrow( + await biClient.getWithdrawalOperationById(wopid), + ); + console.log(`status after: ${j2s(wopStatus2)}`); } runBankWopTest.suites = ["wallet"]; diff --git a/packages/taler-harness/src/integrationtests/test-otp.ts b/packages/taler-harness/src/integrationtests/test-otp.ts @@ -24,7 +24,6 @@ import { TalerMerchantInstanceHttpClient, TransactionType, j2s, - narrowOpSuccessOrThrow, randomRfc3548Base32Key, succeedOrThrow, } from "@gnu-taler/taler-util"; @@ -72,13 +71,11 @@ export async function runOtpTest(t: GlobalTestState) { }), ); - const getTemplateResp = await merchantClient.getTemplateDetails( - undefined, - "tpl1", + const getTemplateResp = succeedOrThrow( + await merchantClient.getTemplateDetails(undefined, "tpl1"), ); - narrowOpSuccessOrThrow("getTemplate", getTemplateResp); - console.log(`template: ${j2s(getTemplateResp.body)}`); + console.log(`template: ${j2s(getTemplateResp)}`); const wres = await withdrawViaBankV3(t, { walletClient, diff --git a/packages/taler-harness/src/integrationtests/test-withdrawal-cashacceptor.ts b/packages/taler-harness/src/integrationtests/test-withdrawal-cashacceptor.ts @@ -19,7 +19,7 @@ */ import { j2s, - narrowOpSuccessOrThrow, + succeedOrThrow, TalerCoreBankHttpClient, } from "@gnu-taler/taler-util"; import { WalletApiOperation } from "@gnu-taler/taler-wallet-core"; @@ -48,13 +48,13 @@ export async function runWithdrawalCashacceptorTest(t: GlobalTestState) { const bankUser = await registerHarnessBankTestUser(bankClientNg); - const withdrawalRes = await bankClientNg.createWithdrawal(bankUser, { - no_amount_to_wallet: true, - }); - - narrowOpSuccessOrThrow("createWithdrawal", withdrawalRes); + const withdrawalRes = succeedOrThrow( + await bankClientNg.createWithdrawal(bankUser, { + no_amount_to_wallet: true, + }), + ); - const wop = withdrawalRes.body; + const wop = withdrawalRes; const talerWithdrawUri = `${wop.taler_withdraw_uri}?external-confirmation=1`; @@ -82,14 +82,15 @@ export async function runWithdrawalCashacceptorTest(t: GlobalTestState) { ); console.log(`transactions: ${j2s(txns)}`); - const bankConfirmResp = await bankClientNg.confirmWithdrawalById( - bankUser, - { - amount: "TESTKUDOS:10", - }, - wop.withdrawal_id, + const bankConfirmResp = succeedOrThrow( + await bankClientNg.confirmWithdrawalById( + bankUser, + { + amount: "TESTKUDOS:10", + }, + wop.withdrawal_id, + ), ); - narrowOpSuccessOrThrow("confirmWithdrawalById", bankConfirmResp); await walletClient.call(WalletApiOperation.TestingWaitTransactionsFinal, {}); const bal = await walletClient.call(WalletApiOperation.GetBalances, {}); diff --git a/packages/taler-harness/src/lint.ts b/packages/taler-harness/src/lint.ts @@ -38,8 +38,8 @@ import { codecForKeysManagementResponse, Configuration, decodeCrock, - narrowOpSuccessOrThrow, parsePaytoUri, + succeedOrThrow, TalerExchangeHttpClient, TalerProtocolTimestamp, } from "@gnu-taler/taler-util"; @@ -581,25 +581,23 @@ export async function lintExchangeUrl(exchangeBaseUrl: string): Promise<void> { process.exit(1); } const exchangeClient = new TalerExchangeHttpClient(canonUrl); - const configResp = await exchangeClient.getConfig(); - narrowOpSuccessOrThrow("", configResp); - const currency = configResp.body.currency; - const keysResp = await exchangeClient.getKeys(); - narrowOpSuccessOrThrow("", configResp); + const configResp = succeedOrThrow(await exchangeClient.getConfig()); + const currency = configResp.currency; + const keysResp = succeedOrThrow(await exchangeClient.getKeys()); const reporter = new LintReporter(); - if (keysResp.body.currency != currency) { + if (keysResp.currency != currency) { reporter.reportError("currency mismatch between /config and /keys"); } - if (keysResp.body.signkeys.length == 0) { + if (keysResp.signkeys.length == 0) { reporter.reportError("exchange has no signing keys"); } // Check for valid signing key { let haveValidSk = false; - for (const sk of keysResp.body.signkeys) { + for (const sk of keysResp.signkeys) { if (isCurrentlyValid(sk.stamp_start, sk.stamp_end)) { haveValidSk = true; break; @@ -614,7 +612,7 @@ export async function lintExchangeUrl(exchangeBaseUrl: string): Promise<void> { let numDenomLost = 0; // Check denominations { - for (const denomGroup of keysResp.body.denominations) { + for (const denomGroup of keysResp.denominations) { for (const denom of denomGroup.denoms) { if (denom.lost) { numDenomLost++; @@ -642,7 +640,7 @@ export async function lintExchangeUrl(exchangeBaseUrl: string): Promise<void> { } { let haveGlobalFee = false; - for (const gf of keysResp.body.global_fees) { + for (const gf of keysResp.global_fees) { if (isCurrentlyValid(gf.start_date, gf.end_date)) { haveGlobalFee = true; break; @@ -652,11 +650,11 @@ export async function lintExchangeUrl(exchangeBaseUrl: string): Promise<void> { reporter.reportError("no valid global fees for current time"); } } - if (keysResp.body.accounts.length === 0) { + if (keysResp.accounts.length === 0) { reporter.reportError("no wire accounts configured"); } let wireTypesSet = new Set<string>(); - for (const acc of keysResp.body.accounts) { + for (const acc of keysResp.accounts) { const payto = parsePaytoUri(acc.payto_uri); if (!payto) { reporter.reportError(`invalid account payto URI: ${acc.payto_uri}`); @@ -666,7 +664,7 @@ export async function lintExchangeUrl(exchangeBaseUrl: string): Promise<void> { } for (const wireType of wireTypesSet) { let haveAccountFees = false; - for (const wf of keysResp.body.wire_fees[wireType]) { + for (const wf of keysResp.wire_fees[wireType]) { if (isCurrentlyValid(wf.start_date, wf.end_date)) { haveAccountFees = true; break; diff --git a/packages/taler-util/src/operation.ts b/packages/taler-util/src/operation.ts @@ -166,26 +166,6 @@ export function opUnknownFailure( ); } -/** - * Convenience function to throw an error if the operation is not a success. - */ -export function narrowOpSuccessOrThrow<Body>( - opName: string, - opRes: OperationResult<Body, unknown>, -): asserts opRes is OperationOk<Body> { - if (opRes.type !== "ok") { - throw TalerError.fromDetail( - TalerErrorCode.GENERIC_CLIENT_INTERNAL_ERROR, - { - operation: opName, - error: String(opRes.case), - detail: "detail" in opRes ? opRes.detail : undefined, - }, - `Operation ${opName} failed: ${String(opRes.case)}`, - ); - } -} - export function succeedOrThrow<R>(resp: OperationResult<R, unknown>): R { if (isOperationOk(resp)) { return resp.body;