commit 7983507bfe19dc1a64050a6d24fe85c1f47fa5bc
parent d3f5967df502f17907da56c13199c45bd956f2af
Author: Florian Dold <florian@dold.me>
Date: Wed, 19 Feb 2025 18:56:37 +0100
remove deprecated helper
Diffstat:
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;