commit f94a88d897bf0b992735ee5cc6f9eb3973bca5c2 parent df77ca77dfb39571b1204bd0ccaaa0a7394686d3 Author: Florian Dold <florian@dold.me> Date: Fri, 29 May 2026 15:02:49 +0200 make response available in all HTTP helper results Diffstat:
16 files changed, 302 insertions(+), 271 deletions(-)
diff --git a/packages/taler-util/src/amounts.ts b/packages/taler-util/src/amounts.ts @@ -30,7 +30,7 @@ import { codecForString, renderContext, } from "./codec.js"; -import { opFixedSuccess, opKnownFailure } from "./operation.js"; +import { Result, ResultError, ResultOk } from "./result.js"; import { AmountString, CurrencySpecification } from "./types-taler-common.js"; /** @@ -470,18 +470,24 @@ export class Amounts { * Currency name size limit is 11 of ASCII letters * Fraction size limit is 8 */ - static parseWithError(s: string) { + static parseWithError(s: string): + | ResultOk<{ + currency: string; + fraction: number; + value: number; + }> + | ResultError<AmountParseError, undefined> { const c_idx = s.indexOf(CURRENCY_SEPARATOR); if (c_idx === -1 || c_idx === 0) { - return opKnownFailure(AmountParseError.MISSING_CURRENCY); + return Result.error(AmountParseError.MISSING_CURRENCY); } if (c_idx > 11) { - return opKnownFailure(AmountParseError.MISSING_CURRENCY); + return Result.error(AmountParseError.MISSING_CURRENCY); } const currency = s.substring(0, c_idx).toUpperCase(); if (!/^[a-zA-Z]+$/.test(currency)) { - return opKnownFailure(AmountParseError.BAD_CURRENCY); + return Result.error(AmountParseError.BAD_CURRENCY); } const number = s.substring(c_idx + 1); const d_idx = number.indexOf(FRAC_SEPARATOR); @@ -492,7 +498,7 @@ export class Amounts { : number.substring(d_idx + 1); if (!/^[0-9]+$/.test(integerStr) || !/^[0-9]+$/.test(fractStr)) { - return opKnownFailure(AmountParseError.BAD_NUMBER); + return Result.error(AmountParseError.BAD_NUMBER); } const value = Number.parseInt(integerStr, 10); @@ -500,15 +506,15 @@ export class Amounts { amountFractionalBase * Number.parseFloat(FRAC_SEPARATOR + fractStr), ); if (!Number.isInteger(value) || !Number.isInteger(fraction)) { - return opKnownFailure(AmountParseError.BAD_NUMBER); + return Result.error(AmountParseError.BAD_NUMBER); } if (value > amountMaxValue) { - return opKnownFailure(AmountParseError.TOO_HIGH); + return Result.error(AmountParseError.TOO_HIGH); } if (fractStr.length > amountFractionalLength) { - return opKnownFailure(AmountParseError.TOO_PRECISE); + return Result.error(AmountParseError.TOO_PRECISE); } - return opFixedSuccess({ + return Result.of({ currency, fraction, value, diff --git a/packages/taler-util/src/bank-api-client.ts b/packages/taler-util/src/bank-api-client.ts @@ -23,7 +23,6 @@ */ import { AmountString, - base64FromArrayBuffer, buildCodecForObject, Codec, codecForAny, @@ -37,7 +36,6 @@ import { opKnownHttpFailure, opUnknownHttpFailure, PaytoString, - stringToBytes, TalerCorebankApi, TalerError, TalerErrorCode, @@ -293,7 +291,7 @@ export class TalerCorebankApiClient { switch (resp.status) { case HttpStatusCode.Ok: case HttpStatusCode.NoContent: - return opEmptySuccess(); + return opEmptySuccess(resp); case HttpStatusCode.NotFound: return opKnownHttpFailure(resp.status, resp); default: diff --git a/packages/taler-util/src/bitcoin.ts b/packages/taler-util/src/bitcoin.ts @@ -75,14 +75,14 @@ export function generateFakeSegwitAddress( } const addr1 = BitcoinSewgit.encode(prefix, 0, Array.from(first_part)); - if (addr1.type === "fail") { + if (Result.isError(addr1)) { return Result.error(GenerateSegwitAddrError.INVALID_SEGWIT); } const addr2 = BitcoinSewgit.encode(prefix, 0, Array.from(second_part)); - if (addr2.type === "fail") { + if (Result.isError(addr2)) { return Result.error(GenerateSegwitAddrError.INVALID_SEGWIT); } - const result: [BtAddrString, BtAddrString] = [addr1.body, addr2.body]; + const result: [BtAddrString, BtAddrString] = [addr1.value, addr2.value]; return Result.of(result); } diff --git a/packages/taler-util/src/http-client/bank-conversion.ts b/packages/taler-util/src/http-client/bank-conversion.ts @@ -23,22 +23,22 @@ import { HttpStatusCode } from "../http-status-codes.js"; import { createPlatformHttpLib } from "../http.js"; import { LibtoolVersion } from "../libtool-version.js"; import { - FailCasesByMethod, - ResultByMethod, carefullyParseConfig, + FailCasesByMethod, opEmptySuccess, opKnownHttpFailure, opKnownTalerFailure, opSuccessFromHttp, opUnknownHttpFailure, + ResultByMethod, } from "../operation.js"; import { TalerErrorCode } from "../taler-error-codes.js"; import { - ConversionRate, codecForCashinConversionResponse, codecForCashoutConversionResponse, codecForConversionBankConfig, codecForConversionRate, + ConversionRate, } from "../types-taler-bank-conversion.js"; import { codecForTalerErrorDetail } from "../types-taler-wallet.js"; import { @@ -157,11 +157,11 @@ export class TalerBankConversionHttpClient { const details = codecForTalerErrorDetail().decode(body); switch (details.code) { case TalerErrorCode.GENERIC_PARAMETER_MISSING: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.GENERIC_PARAMETER_MALFORMED: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.GENERIC_CURRENCY_MISMATCH: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); default: return opUnknownHttpFailure(resp, details); } @@ -245,7 +245,7 @@ export class TalerBankConversionHttpClient { this.cacheEvictor.notifySuccess( TalerBankConversionCacheEviction.UPDATE_RATE, ); - return opEmptySuccess(); + return opEmptySuccess(resp); } case HttpStatusCode.Unauthorized: return opKnownHttpFailure(resp.status, resp); diff --git a/packages/taler-util/src/http-client/bank-core.ts b/packages/taler-util/src/http-client/bank-core.ts @@ -195,9 +195,9 @@ export class TalerCoreBankHttpClient { const details = await readTalerErrorResponse(resp); switch (details.code) { case TalerErrorCode.GENERIC_FORBIDDEN: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_ACCOUNT_LOCKED: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); default: return opUnknownHttpFailure(resp, details); } @@ -238,10 +238,10 @@ export class TalerCoreBankHttpClient { }); switch (resp.status) { case HttpStatusCode.Ok: - return opEmptySuccess(); + return opEmptySuccess(resp); // FIXME: missing in docs case HttpStatusCode.NoContent: - return opEmptySuccess(); + return opEmptySuccess(resp); // FIXME: missing in docs case HttpStatusCode.NotFound: return opKnownHttpFailure(resp.status, resp); @@ -264,9 +264,9 @@ export class TalerCoreBankHttpClient { case HttpStatusCode.Ok: return opSuccessFromHttp(resp, codecForTokenInfoList()); case HttpStatusCode.NoContent: - return opFixedSuccess({ public_accounts: [] }); + return opFixedSuccess(resp, { public_accounts: [] }); case HttpStatusCode.NotFound: - return opFixedSuccess({ public_accounts: [] }); + return opFixedSuccess(resp, { public_accounts: [] }); default: return opUnknownHttpFailure(resp); } @@ -345,29 +345,29 @@ export class TalerCoreBankHttpClient { const details = await readTalerErrorResponse(resp); switch (details.code) { case TalerErrorCode.BANK_REGISTER_USERNAME_REUSE: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_REGISTER_PAYTO_URI_REUSE: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_UNALLOWED_DEBIT: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_RESERVED_USERNAME_CONFLICT: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_NON_ADMIN_PATCH_DEBT_LIMIT: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_NON_ADMIN_SET_CONVERSION_RATE_CLASS: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_NON_ADMIN_SET_TAN_CHANNEL: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_TAN_CHANNEL_NOT_SUPPORTED: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_MISSING_TAN_INFO: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_PASSWORD_TOO_SHORT: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_PASSWORD_TOO_LONG: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_CONVERSION_RATE_CLASS_UNKNOWN: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); default: return opUnknownHttpFailure(resp, details); } @@ -406,7 +406,7 @@ export class TalerCoreBankHttpClient { codecForChallengeResponse(), ); case HttpStatusCode.NoContent: - return opEmptySuccess(); + return opEmptySuccess(resp, ); case HttpStatusCode.Unauthorized: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.NotFound: @@ -415,9 +415,9 @@ export class TalerCoreBankHttpClient { const details = await readTalerErrorResponse(resp); switch (details.code) { case TalerErrorCode.BANK_RESERVED_USERNAME_CONFLICT: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_ACCOUNT_BALANCE_NOT_ZERO: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); default: return opUnknownHttpFailure(resp, details); } @@ -460,7 +460,7 @@ export class TalerCoreBankHttpClient { await this.cacheEvictor.notifySuccess( TalerCoreBankCacheEviction.UPDATE_ACCOUNT, ); - return opEmptySuccess(); + return opEmptySuccess(resp, ); case HttpStatusCode.Unauthorized: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.NotFound: @@ -469,23 +469,23 @@ export class TalerCoreBankHttpClient { const details = await readTalerErrorResponse(resp); switch (details.code) { case TalerErrorCode.BANK_NON_ADMIN_PATCH_LEGAL_NAME: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_NON_ADMIN_PATCH_CASHOUT: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_NON_ADMIN_PATCH_DEBT_LIMIT: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_NON_ADMIN_SET_CONVERSION_RATE_CLASS: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_TAN_CHANNEL_NOT_SUPPORTED: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_MISSING_TAN_INFO: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_PASSWORD_TOO_SHORT: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_PASSWORD_TOO_LONG: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_CONVERSION_RATE_CLASS_UNKNOWN: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); default: return opUnknownHttpFailure(resp, details); } @@ -524,7 +524,7 @@ export class TalerCoreBankHttpClient { codecForChallengeResponse(), ); case HttpStatusCode.NoContent: - return opEmptySuccess(); + return opEmptySuccess(resp, ); case HttpStatusCode.NotFound: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.Unauthorized: @@ -535,13 +535,13 @@ export class TalerCoreBankHttpClient { const details = await readTalerErrorResponse(resp); switch (details.code) { case TalerErrorCode.BANK_NON_ADMIN_PATCH_MISSING_OLD_PASSWORD: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_PATCH_BAD_OLD_PASSWORD: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_PASSWORD_TOO_SHORT: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_PASSWORD_TOO_LONG: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); default: return opUnknownHttpFailure(resp, details); } @@ -571,9 +571,9 @@ export class TalerCoreBankHttpClient { case HttpStatusCode.Ok: return opSuccessFromHttp(resp, codecForPublicAccountsResponse()); case HttpStatusCode.NoContent: - return opFixedSuccess({ public_accounts: [] }); + return opFixedSuccess(resp, { public_accounts: [] }); case HttpStatusCode.NotFound: - return opFixedSuccess({ public_accounts: [] }); + return opFixedSuccess(resp, { public_accounts: [] }); default: return opUnknownHttpFailure(resp); } @@ -608,7 +608,7 @@ export class TalerCoreBankHttpClient { case HttpStatusCode.Ok: return opSuccessFromHttp(resp, codecForListBankAccountsResponse()); case HttpStatusCode.NoContent: - return opFixedSuccess({ accounts: [] }); + return opFixedSuccess(resp, { accounts: [] }); case HttpStatusCode.Unauthorized: return opKnownHttpFailure(resp.status, resp); default: @@ -668,7 +668,7 @@ export class TalerCoreBankHttpClient { codecForBankAccountTransactionsResponse(), ); case HttpStatusCode.NoContent: - return opFixedSuccess({ transactions: [] }); + return opFixedSuccess(resp, { transactions: [] }); case HttpStatusCode.Unauthorized: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.NotFound: @@ -747,15 +747,15 @@ export class TalerCoreBankHttpClient { const details = await readTalerErrorResponse(resp); switch (details.code) { case TalerErrorCode.BANK_ADMIN_CREDITOR: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_SAME_ACCOUNT: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_UNKNOWN_CREDITOR: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_UNALLOWED_DEBIT: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_TRANSFER_REQUEST_UID_REUSED: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); default: return opUnknownHttpFailure(resp, details); } @@ -851,7 +851,7 @@ export class TalerCoreBankHttpClient { await this.cacheEvictor.notifySuccess( TalerCoreBankCacheEviction.CONFIRM_WITHDRAWAL, ); - return opEmptySuccess(); + return opEmptySuccess(resp, ); //FIXME: missing in docs case HttpStatusCode.BadRequest: return opKnownHttpFailure(resp.status, resp); @@ -861,15 +861,15 @@ export class TalerCoreBankHttpClient { const details = await readTalerErrorResponse(resp); switch (details.code) { case TalerErrorCode.BANK_CONFIRM_ABORT_CONFLICT: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_CONFIRM_INCOMPLETE: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_UNALLOWED_DEBIT: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_AMOUNT_DIFFERS: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_AMOUNT_REQUIRED: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); default: return opUnknownHttpFailure(resp, details); } @@ -899,7 +899,7 @@ export class TalerCoreBankHttpClient { await this.cacheEvictor.notifySuccess( TalerCoreBankCacheEviction.ABORT_WITHDRAWAL, ); - return opEmptySuccess(); + return opEmptySuccess(resp, ); //FIXME: missing in docs case HttpStatusCode.BadRequest: return opKnownHttpFailure(resp.status, resp); @@ -988,15 +988,15 @@ export class TalerCoreBankHttpClient { const details = await readTalerErrorResponse(resp); switch (details.code) { case TalerErrorCode.BANK_TRANSFER_REQUEST_UID_REUSED: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_BAD_CONVERSION: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_CONVERSION_AMOUNT_TO_SMALL: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_UNALLOWED_DEBIT: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_CONFIRM_INCOMPLETE: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); default: return opUnknownHttpFailure(resp, details); } @@ -1005,7 +1005,7 @@ export class TalerCoreBankHttpClient { const details = await readTalerErrorResponse(resp); switch (details.code) { case TalerErrorCode.BANK_TAN_CHANNEL_SCRIPT_FAILED: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); default: return opUnknownHttpFailure(resp, details); } @@ -1014,7 +1014,7 @@ export class TalerCoreBankHttpClient { const details = await readTalerErrorResponse(resp); switch (details.code) { case TalerErrorCode.BANK_TAN_CHANNEL_NOT_SUPPORTED: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); default: return opKnownHttpFailure(resp.status, resp); } @@ -1067,7 +1067,7 @@ export class TalerCoreBankHttpClient { case HttpStatusCode.Ok: return opSuccessFromHttp(resp, codecForCashouts()); case HttpStatusCode.NoContent: - return opFixedSuccess({ cashouts: [] }); + return opFixedSuccess(resp, { cashouts: [] }); case HttpStatusCode.NotImplemented: return opKnownHttpFailure(resp.status, resp); default: @@ -1092,7 +1092,7 @@ export class TalerCoreBankHttpClient { case HttpStatusCode.Ok: return opSuccessFromHttp(resp, codecForGlobalCashouts()); case HttpStatusCode.NoContent: - return opFixedSuccess({ cashouts: [] }); + return opFixedSuccess(resp, { cashouts: [] }); case HttpStatusCode.NotImplemented: return opKnownHttpFailure(resp.status, resp); default: @@ -1138,7 +1138,7 @@ export class TalerCoreBankHttpClient { const details = await readTalerErrorResponse(resp); switch (details.code) { case TalerErrorCode.BANK_NAME_REUSE: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); default: return opUnknownHttpFailure(resp, details); } @@ -1172,7 +1172,7 @@ export class TalerCoreBankHttpClient { await this.cacheEvictor.notifySuccess( TalerCoreBankCacheEviction.UPDATE_CONVERSION_RATE_CLASS, ); - return opEmptySuccess(); + return opEmptySuccess(resp, ); case HttpStatusCode.Unauthorized: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.Forbidden: @@ -1183,7 +1183,7 @@ export class TalerCoreBankHttpClient { const details = await readTalerErrorResponse(resp); switch (details.code) { case TalerErrorCode.BANK_NAME_REUSE: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); default: return opUnknownHttpFailure(resp, details); } @@ -1213,7 +1213,7 @@ export class TalerCoreBankHttpClient { await this.cacheEvictor.notifySuccess( TalerCoreBankCacheEviction.DELETE_CONVERSION_RATE_CLASS, ); - return opEmptySuccess(); + return opEmptySuccess(resp, ); case HttpStatusCode.Unauthorized: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.Forbidden: @@ -1287,7 +1287,7 @@ export class TalerCoreBankHttpClient { case HttpStatusCode.Ok: return opSuccessFromHttp(resp, codecForConversionRateClasses()); case HttpStatusCode.NoContent: - return opFixedSuccess({ classes: [], default: {} as any }); + return opFixedSuccess(resp, { classes: [], default: {} as any }); case HttpStatusCode.Unauthorized: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.Forbidden: @@ -1318,7 +1318,7 @@ export class TalerCoreBankHttpClient { case HttpStatusCode.Ok: return opSuccessFromHttp(resp, codecForChallengeRequestResponse()); case HttpStatusCode.NoContent: - return opFixedSuccess<ChallengeRequestResponse>({}); + return opFixedSuccess<ChallengeRequestResponse>(resp, {}); case HttpStatusCode.Unauthorized: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.Forbidden: @@ -1331,7 +1331,7 @@ export class TalerCoreBankHttpClient { const details = await readTalerErrorResponse(resp); switch (details.code) { case TalerErrorCode.BANK_TAN_CHANNEL_SCRIPT_FAILED: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); default: return opUnknownHttpFailure(resp, details); } @@ -1360,16 +1360,16 @@ export class TalerCoreBankHttpClient { }); switch (resp.status) { case HttpStatusCode.NoContent: - return opEmptySuccess(); + return opEmptySuccess(resp, ); case HttpStatusCode.Unauthorized: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.Conflict: { const details = await readTalerErrorResponse(resp); switch (details.code) { case TalerErrorCode.BANK_TAN_CHALLENGE_FAILED: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_TAN_CHALLENGE_EXPIRED: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); default: return opUnknownHttpFailure(resp, details); } @@ -1378,9 +1378,9 @@ export class TalerCoreBankHttpClient { const details = await readTalerErrorResponse(resp); switch (details.code) { case TalerErrorCode.BANK_TRANSACTION_NOT_FOUND: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_TAN_CHALLENGE_EXPIRED: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); default: return opUnknownHttpFailure(resp, details); } diff --git a/packages/taler-util/src/http-client/bank-integration.ts b/packages/taler-util/src/http-client/bank-integration.ts @@ -150,19 +150,19 @@ export class TalerBankIntegrationHttpClient { const details = codecForTalerErrorDetail().decode(body); switch (details.code) { case TalerErrorCode.BANK_UPDATE_ABORT_CONFLICT: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_WITHDRAWAL_OPERATION_RESERVE_SELECTION_CONFLICT: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_DUPLICATE_RESERVE_PUB_SUBJECT: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_UNKNOWN_ACCOUNT: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_ACCOUNT_IS_NOT_EXCHANGE: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_AMOUNT_DIFFERS: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.BANK_UNALLOWED_DEBIT: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); default: return opUnknownHttpFailure(resp, details); } @@ -183,7 +183,7 @@ export class TalerBankIntegrationHttpClient { }); switch (resp.status) { case HttpStatusCode.NoContent: - return opEmptySuccess(); + return opEmptySuccess(resp); case HttpStatusCode.NotFound: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.Conflict: diff --git a/packages/taler-util/src/http-client/bank-prepared.ts b/packages/taler-util/src/http-client/bank-prepared.ts @@ -18,13 +18,6 @@ import { HttpRequestLibrary, readTalerErrorResponse } from "../http-common.js"; import { HttpStatusCode } from "../http-status-codes.js"; import { createPlatformHttpLib } from "../http.js"; import { - FailCasesByMethod, - ResultByMethod, - opKnownHttpFailure, - opSuccessFromHttp, - opUnknownHttpFailure, -} from "../operation.js"; -import { carefullyParseConfig, codecForTalerErrorDetail, LibtoolVersion, @@ -34,6 +27,13 @@ import { TalerPreparedTransferApi, } from "../index.js"; import { + FailCasesByMethod, + opKnownHttpFailure, + opSuccessFromHttp, + opUnknownHttpFailure, + ResultByMethod, +} from "../operation.js"; +import { codecForPreparedTransferConfig, codecForRegistrationResponse, } from "../types-taler-prepared-transfer.js"; @@ -129,7 +129,7 @@ export class TalerPreparedTransferHttpClient { }); switch (resp.status) { case HttpStatusCode.NoContent: - return opEmptySuccess(); + return opEmptySuccess(resp); case HttpStatusCode.BadRequest: case HttpStatusCode.Unauthorized: case HttpStatusCode.NotFound: @@ -140,7 +140,7 @@ export class TalerPreparedTransferHttpClient { switch (details.code) { case TalerErrorCode.BANK_OLD_TIMESTAMP: case TalerErrorCode.BANK_BAD_SIGNATURE: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); default: return opKnownHttpFailure(resp.status, resp, details); } diff --git a/packages/taler-util/src/http-client/bank-revenue.ts b/packages/taler-util/src/http-client/bank-revenue.ts @@ -114,7 +114,7 @@ export class TalerRevenueHttpClient { return opSuccessFromHttp(resp, codecForRevenueIncomingHistory()); // FIXME: missing in docs case HttpStatusCode.NoContent: - return opFixedSuccess({ + return opFixedSuccess(resp, { incoming_transactions: [], credit_account: "", }); diff --git a/packages/taler-util/src/http-client/bank-wire.ts b/packages/taler-util/src/http-client/bank-wire.ts @@ -19,11 +19,11 @@ import { HttpStatusCode } from "../http-status-codes.js"; import { createPlatformHttpLib } from "../http.js"; import { FailCasesByMethod, - ResultByMethod, opFixedSuccess, opKnownHttpFailure, opSuccessFromHttp, opUnknownHttpFailure, + ResultByMethod, } from "../operation.js"; import { codecForAddIncomingResponse, @@ -39,8 +39,6 @@ import { BasicOrTokenAuth, } from "./utils.js"; -import { LongPollParams, PaginationParams } from "../types-taler-common.js"; -import * as TalerWireGatewayApi from "../types-taler-wire-gateway.js"; import { carefullyParseConfig, codecForTalerErrorDetail, @@ -48,6 +46,8 @@ import { opKnownTalerFailure, TalerErrorCode, } from "../index.js"; +import { LongPollParams, PaginationParams } from "../types-taler-common.js"; +import * as TalerWireGatewayApi from "../types-taler-wire-gateway.js"; export type TalerWireGatewayResultByMethod< prop extends keyof TalerWireGatewayHttpClient, @@ -132,7 +132,7 @@ export class TalerWireGatewayHttpClient { switch (details.code) { case TalerErrorCode.BANK_TRANSFER_REQUEST_UID_REUSED: case TalerErrorCode.BANK_TRANSFER_WTID_REUSED: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); default: return opKnownHttpFailure(resp.status, resp, details); } @@ -167,7 +167,7 @@ export class TalerWireGatewayHttpClient { case HttpStatusCode.Ok: return opSuccessFromHttp(resp, codecForBankWireTransferList()); case HttpStatusCode.NoContent: - return opFixedSuccess({ + return opFixedSuccess(resp, { transfers: [], debit_account: undefined, }); @@ -221,7 +221,7 @@ export class TalerWireGatewayHttpClient { case HttpStatusCode.Ok: return opSuccessFromHttp(resp, codecForIncomingHistory()); case HttpStatusCode.NoContent: - return opFixedSuccess({ + return opFixedSuccess(resp, { incoming_transactions: [], credit_account: undefined, }); @@ -253,7 +253,7 @@ export class TalerWireGatewayHttpClient { case HttpStatusCode.Ok: return opSuccessFromHttp(resp, codecForOutgoingHistory()); case HttpStatusCode.NoContent: - return opFixedSuccess({ + return opFixedSuccess(resp, { outgoing_transactions: [], debit_account: undefined, }); @@ -292,7 +292,7 @@ export class TalerWireGatewayHttpClient { const details = codecForTalerErrorDetail().decode(body); switch (details.code) { case TalerErrorCode.BANK_DUPLICATE_RESERVE_PUB_SUBJECT: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); default: return opKnownHttpFailure(resp.status, resp, details); } @@ -352,7 +352,7 @@ export class TalerWireGatewayHttpClient { switch (details.code) { case TalerErrorCode.BANK_TRANSFER_MAPPING_UNKNOWN: case TalerErrorCode.BANK_TRANSFER_MAPPING_REUSED: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); default: return opKnownHttpFailure(resp.status, resp, details); } diff --git a/packages/taler-util/src/http-client/donau-client.ts b/packages/taler-util/src/http-client/donau-client.ts @@ -104,7 +104,7 @@ export class DonauHttpClient { case HttpStatusCode.Ok: const buffer = await resp.bytes(); const uintar = new Uint8Array(buffer); - return opFixedSuccess(uintar); + return opFixedSuccess(resp, uintar); case HttpStatusCode.NotFound: return opKnownHttpFailure(resp.status, resp); default: @@ -155,9 +155,9 @@ export class DonauHttpClient { case HttpStatusCode.Ok: return opSuccessFromHttp(resp, codecForIssuePrepareResponse()); case HttpStatusCode.NotFound: - return opKnownFailure(resp.status); + return opKnownFailure(resp, resp.status); case HttpStatusCode.Gone: - return opKnownFailure(resp.status); + return opKnownFailure(resp, resp.status); default: return opUnknownHttpFailure(resp); } @@ -183,13 +183,13 @@ export class DonauHttpClient { codecForAny() as Codec<BlindedDonationReceiptSignatures>, ); case HttpStatusCode.Forbidden: - return opKnownFailure(resp.status); + return opKnownFailure(resp, resp.status); case HttpStatusCode.NotFound: - return opKnownFailure(resp.status); + return opKnownFailure(resp, resp.status); case HttpStatusCode.Conflict: - return opKnownFailure(resp.status); + return opKnownFailure(resp, resp.status); case HttpStatusCode.Gone: - return opKnownFailure(resp.status); + return opKnownFailure(resp, resp.status); default: return opUnknownHttpFailure(resp); } @@ -209,11 +209,11 @@ export class DonauHttpClient { }); switch (resp.status) { case HttpStatusCode.Created: - return opEmptySuccess(); + return opEmptySuccess(resp); case HttpStatusCode.Forbidden: - return opKnownFailure(resp.status); + return opKnownFailure(resp, resp.status); case HttpStatusCode.NotFound: - return opKnownFailure(resp.status); + return opKnownFailure(resp, resp.status); default: return opUnknownHttpFailure(resp); } @@ -237,9 +237,9 @@ export class DonauHttpClient { codecForDonauDonationStatementResponse(), ); case HttpStatusCode.Forbidden: - return opKnownFailure(resp.status); + return opKnownFailure(resp, resp.status); case HttpStatusCode.NotFound: - return opKnownFailure(resp.status); + return opKnownFailure(resp, resp.status); default: return opUnknownHttpFailure(resp); } @@ -263,7 +263,7 @@ export class DonauHttpClient { case HttpStatusCode.Ok: return opSuccessFromHttp(resp, codecForAny() as Codec<Charities>); // FIXME: complete codec case HttpStatusCode.NoContent: - return opFixedSuccess({ + return opFixedSuccess(resp, { charities: [], }); default: @@ -289,7 +289,7 @@ export class DonauHttpClient { case HttpStatusCode.Ok: return opSuccessFromHttp(resp, codecForAny() as Codec<Charity>); // FIXME: complete codec case HttpStatusCode.NotFound: - return opKnownFailure(resp.status); + return opKnownFailure(resp, resp.status); default: return opUnknownHttpFailure(resp); } @@ -314,11 +314,11 @@ export class DonauHttpClient { case HttpStatusCode.Created: return opSuccessFromHttp(resp, codecForDonauCharityResponse()); case HttpStatusCode.NoContent: - return opKnownFailure(resp.status); + return opKnownFailure(resp, resp.status); case HttpStatusCode.Forbidden: - return opKnownFailure(resp.status); + return opKnownFailure(resp, resp.status); case HttpStatusCode.NotFound: - return opKnownFailure(resp.status); + return opKnownFailure(resp, resp.status); default: return opUnknownHttpFailure(resp); } @@ -340,11 +340,11 @@ export class DonauHttpClient { }); switch (resp.status) { case HttpStatusCode.Ok: - return opEmptySuccess(); + return opEmptySuccess(resp); case HttpStatusCode.Forbidden: - return opKnownFailure(resp.status); + return opKnownFailure(resp, resp.status); case HttpStatusCode.NotFound: // FIXME: missing in the spec - return opKnownFailure(resp.status); + return opKnownFailure(resp, resp.status); default: return opUnknownHttpFailure(resp); } @@ -365,11 +365,11 @@ export class DonauHttpClient { }); switch (resp.status) { case HttpStatusCode.NoContent: - return opEmptySuccess(); + return opEmptySuccess(resp); case HttpStatusCode.Forbidden: - return opKnownFailure(resp.status); + return opKnownFailure(resp, resp.status); case HttpStatusCode.NotFound: // FIXME: missing in the spec - return opKnownFailure(resp.status); + return opKnownFailure(resp, resp.status); default: return opUnknownHttpFailure(resp); } diff --git a/packages/taler-util/src/http-client/exchange-client.ts b/packages/taler-util/src/http-client/exchange-client.ts @@ -220,7 +220,7 @@ export class TalerExchangeHttpClient { case HttpStatusCode.Ok: const buffer = await resp.bytes(); const uintar = new Uint8Array(buffer); - return opFixedSuccess(uintar); + return opFixedSuccess(resp, uintar); case HttpStatusCode.NotFound: return opKnownHttpFailure(resp.status, resp); default: @@ -373,7 +373,7 @@ export class TalerExchangeHttpClient { }); switch (resp.status) { case HttpStatusCode.NoContent: - return opEmptySuccess(); + return opEmptySuccess(resp); case HttpStatusCode.NotFound: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.Conflict: @@ -481,7 +481,7 @@ export class TalerExchangeHttpClient { const details = await readTalerErrorResponse(resp); switch (details.code) { case TalerErrorCode.EXCHANGE_RESERVES_PURSE_EXPIRATION_BEFORE_NOW: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); default: return opUnknownHttpFailure(resp, details); } @@ -589,7 +589,7 @@ export class TalerExchangeHttpClient { case HttpStatusCode.Ok: return opSuccessFromHttp(resp, codecForAmlWalletKycCheckResponse()); case HttpStatusCode.NoContent: - return opEmptySuccess(); + return opEmptySuccess(resp); case HttpStatusCode.Forbidden: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.UnavailableForLegalReasons: @@ -650,7 +650,7 @@ export class TalerExchangeHttpClient { codecForAccountKycStatus(), ); case HttpStatusCode.NoContent: // no checks can be done - return opKnownFailureWithBody(resp.status, undefined); + return opKnownFailureWithBody(resp, resp.status, undefined); case HttpStatusCode.Forbidden: case HttpStatusCode.NotFound: case HttpStatusCode.Conflict: @@ -707,7 +707,7 @@ export class TalerExchangeHttpClient { codecForAccountKycStatus(), ); case HttpStatusCode.NoContent: // no checks can be done - return opKnownFailureWithBody(resp.status, undefined); + return opKnownFailureWithBody(resp, resp.status, undefined); case HttpStatusCode.Forbidden: case HttpStatusCode.NotFound: case HttpStatusCode.Conflict: @@ -803,7 +803,7 @@ export class TalerExchangeHttpClient { resp, codecForKycProcessClientInformation(), ); - return opFixedSuccess<KycProcessClientInformationWithEtag>({ + return opFixedSuccess<KycProcessClientInformationWithEtag>(resp, { ...body, etag, }); @@ -811,10 +811,10 @@ export class TalerExchangeHttpClient { case HttpStatusCode.Accepted: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.NoContent: - return opKnownFailure(resp.status); + return opKnownFailure(resp, resp.status); case HttpStatusCode.NotModified: // do not read details from response - return opKnownFailure(resp.status); + return opKnownFailure(resp, resp.status); default: return opUnknownHttpFailure(resp); } @@ -844,7 +844,7 @@ export class TalerExchangeHttpClient { this.cacheEvictor.notifySuccess( TalerExchangeCacheEviction.UPLOAD_KYC_FORM, ); - return opEmptySuccess(); + return opEmptySuccess(resp); } case HttpStatusCode.NotFound: case HttpStatusCode.InternalServerError: @@ -906,7 +906,7 @@ export class TalerExchangeHttpClient { switch (resp.status) { case HttpStatusCode.SeeOther: - return opEmptySuccess(); + return opEmptySuccess(resp); case HttpStatusCode.NotFound: return opKnownHttpFailure(resp.status, resp); default: @@ -989,7 +989,7 @@ export class TalerExchangeHttpClient { case HttpStatusCode.Ok: return opSuccessFromHttp(resp, codecForAmlStatisticsResponse()); case HttpStatusCode.NoContent: { - return opFixedSuccess({ + return opFixedSuccess(resp, { statistics: names.map( (name) => ({ counter: 0, name }) as EventCounter, ), @@ -1044,7 +1044,7 @@ export class TalerExchangeHttpClient { case HttpStatusCode.Ok: return opSuccessFromHttp(resp, codecForAmlDecisionsAccounts()); case HttpStatusCode.NoContent: - return opFixedSuccess({ accounts: [] }); + return opFixedSuccess(resp, { accounts: [] }); case HttpStatusCode.Forbidden: case HttpStatusCode.NotFound: case HttpStatusCode.Conflict: @@ -1100,7 +1100,7 @@ export class TalerExchangeHttpClient { switch (resp.status) { case HttpStatusCode.Ok: { - return opFixedSuccess(await resp.bytes()); + return opFixedSuccess(resp, await resp.bytes()); } case HttpStatusCode.NoContent: case HttpStatusCode.Forbidden: @@ -1159,7 +1159,7 @@ export class TalerExchangeHttpClient { case HttpStatusCode.Ok: return opSuccessFromHttp(resp, codecForAmlDecisionsResponse()); case HttpStatusCode.NoContent: - return opFixedSuccess({ records: [] }); + return opFixedSuccess(resp, { records: [] }); case HttpStatusCode.Forbidden: case HttpStatusCode.NotFound: case HttpStatusCode.Conflict: @@ -1201,7 +1201,7 @@ export class TalerExchangeHttpClient { case HttpStatusCode.Ok: return opSuccessFromHttp(resp, codecForLegitimizationMeasuresList()); case HttpStatusCode.NoContent: - return opFixedSuccess({ + return opFixedSuccess(resp, { measures: [], }); default: @@ -1240,7 +1240,7 @@ export class TalerExchangeHttpClient { case HttpStatusCode.Ok: return opSuccessFromHttp(resp, codecForAmlKycAttributes()); case HttpStatusCode.NoContent: - return opFixedSuccess({ details: [] }); + return opFixedSuccess(resp, { details: [] }); case HttpStatusCode.Forbidden: case HttpStatusCode.NotFound: case HttpStatusCode.Conflict: @@ -1282,7 +1282,7 @@ export class TalerExchangeHttpClient { switch (resp.status) { case HttpStatusCode.Ok: { - return opFixedSuccess(await resp.bytes()); + return opFixedSuccess(resp, await resp.bytes()); } case HttpStatusCode.NoContent: case HttpStatusCode.Forbidden: @@ -1325,7 +1325,7 @@ export class TalerExchangeHttpClient { this.cacheEvictor.notifySuccess( TalerExchangeCacheEviction.MAKE_AML_DECISION, ); - return opEmptySuccess(); + return opEmptySuccess(resp); } case HttpStatusCode.Forbidden: case HttpStatusCode.NotFound: @@ -1377,7 +1377,7 @@ export class TalerExchangeHttpClient { case HttpStatusCode.Ok: return opSuccessFromHttp(resp, codecForExchangeTransferList()); case HttpStatusCode.NoContent: - return opFixedSuccess({ transfers: [] }); + return opFixedSuccess(resp, { transfers: [] }); case HttpStatusCode.Forbidden: case HttpStatusCode.NotFound: case HttpStatusCode.Conflict: @@ -1428,7 +1428,7 @@ export class TalerExchangeHttpClient { case HttpStatusCode.Ok: return opSuccessFromHttp(resp, codecForExchangeTransferList()); case HttpStatusCode.NoContent: - return opFixedSuccess({ transfers: [] }); + return opFixedSuccess(resp, { transfers: [] }); case HttpStatusCode.Forbidden: case HttpStatusCode.NotFound: case HttpStatusCode.Conflict: @@ -1479,7 +1479,7 @@ export class TalerExchangeHttpClient { case HttpStatusCode.Ok: return opSuccessFromHttp(resp, codecForExchangeTransferList()); case HttpStatusCode.NoContent: - return opFixedSuccess({ transfers: [] }); + return opFixedSuccess(resp, { transfers: [] }); case HttpStatusCode.Forbidden: case HttpStatusCode.NotFound: case HttpStatusCode.Conflict: diff --git a/packages/taler-util/src/http-client/mailbox.ts b/packages/taler-util/src/http-client/mailbox.ts @@ -143,7 +143,7 @@ export class TalerMailboxInstanceHttpClient { switch (resp.status) { case HttpStatusCode.NoContent: { - return opEmptySuccess(); + return opEmptySuccess(resp); } case HttpStatusCode.PaymentRequired: { return opKnownHttpFailure(resp.status, resp); @@ -185,12 +185,15 @@ export class TalerMailboxInstanceHttpClient { const uintar = (await resp.bytes()) as Uint8Array; const etag = resp.headers.get("etag"); const index = etag ? etag : "0"; - return opFixedSuccess({ messages: uintar, etag: index }); + return opFixedSuccess(resp, { messages: uintar, etag: index }); } case HttpStatusCode.NoContent: { const etag = resp.headers.get("etag"); const index = etag ? etag : "0"; - return opFixedSuccess({ messages: new Uint8Array(), etag: index }); + return opFixedSuccess(resp, { + messages: new Uint8Array(), + etag: index, + }); } case HttpStatusCode.TooManyRequests: { return opKnownAlternativeHttpFailure( @@ -242,7 +245,7 @@ export class TalerMailboxInstanceHttpClient { switch (resp.status) { case HttpStatusCode.NoContent: { - return opEmptySuccess(); + return opEmptySuccess(resp); } case HttpStatusCode.Forbidden: case HttpStatusCode.NotFound: @@ -315,7 +318,7 @@ export class TalerMailboxInstanceHttpClient { switch (resp.status) { case HttpStatusCode.NoContent: { - return opFixedSuccess({ status: "ok" } as MailboxRegisterResult); + return opFixedSuccess(resp, { status: "ok" } as MailboxRegisterResult); } case HttpStatusCode.Forbidden: { return opKnownHttpFailure(resp.status, resp); @@ -324,6 +327,7 @@ export class TalerMailboxInstanceHttpClient { return { type: "fail", case: resp.status, + response: resp, body: { status: "payment-required", talerUri: resp.headers.get("Taler"), diff --git a/packages/taler-util/src/http-client/merchant.ts b/packages/taler-util/src/http-client/merchant.ts @@ -336,7 +336,7 @@ export class TalerMerchantInstanceHttpClient { case HttpStatusCode.Ok: return opSuccessFromHttp(resp, codecForTokenInfoList()); case HttpStatusCode.NoContent: - return opFixedSuccess({ tokens: [] }); + return opFixedSuccess(resp, { tokens: [] }); case HttpStatusCode.Unauthorized: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.Forbidden: @@ -367,7 +367,7 @@ export class TalerMerchantInstanceHttpClient { this.cacheEvictor.notifySuccess( TalerMerchantInstanceCacheEviction.DELETE_ACCESSTOKEN, ); - return opEmptySuccess(); + return opEmptySuccess(resp); } case HttpStatusCode.Forbidden: return opKnownHttpFailure(resp.status, resp); @@ -418,7 +418,7 @@ export class TalerMerchantInstanceHttpClient { const details = codecForTalerErrorDetail().decode(body); switch (details.code) { case TalerErrorCode.MERCHANT_POST_ORDERS_ID_CLAIM_NOT_FOUND: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); default: return opUnknownHttpFailure(resp, details); } @@ -715,7 +715,7 @@ export class TalerMerchantInstanceHttpClient { switch (resp.status) { case HttpStatusCode.Ok: // FIXME: missing in docs - return opEmptySuccess(); + return opEmptySuccess(resp); case HttpStatusCode.Accepted: { return opKnownAlternativeHttpFailure( resp, @@ -724,7 +724,7 @@ export class TalerMerchantInstanceHttpClient { ); } case HttpStatusCode.NoContent: - return opEmptySuccess(); + return opEmptySuccess(resp); case HttpStatusCode.Unauthorized: // FIXME: missing in docs return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.NotFound: @@ -762,7 +762,7 @@ export class TalerMerchantInstanceHttpClient { this.cacheEvictor.notifySuccess( TalerMerchantInstanceCacheEviction.UPDATE_CURRENT_INSTANCE, ); - return opEmptySuccess(); + return opEmptySuccess(resp); } case HttpStatusCode.Accepted: { return opKnownAlternativeHttpFailure( @@ -838,7 +838,7 @@ export class TalerMerchantInstanceHttpClient { this.cacheEvictor.notifySuccess( TalerMerchantInstanceCacheEviction.DELETE_CURRENT_INSTANCE, ); - return opEmptySuccess(); + return opEmptySuccess(resp); } case HttpStatusCode.Accepted: return opKnownAlternativeHttpFailure( @@ -928,14 +928,14 @@ export class TalerMerchantInstanceHttpClient { switch (resp.status) { case HttpStatusCode.Ok: { const f = await opSuccessFromHttp(resp, codecForAccountKycRedirects()); - return opFixedSuccess({ etag, ...f.body }); + return opFixedSuccess(resp, { etag, ...f.body }); } case HttpStatusCode.NoContent: // FIXME: using opKnownHttpFailure is wrong here // we expect to read a body with the error description - return opKnownFailure(resp.status); + return opKnownFailure(resp, resp.status); case HttpStatusCode.NotModified: - return opKnownFailureWithBody(resp.status, { etag }); + return opKnownFailureWithBody(resp, resp.status, { etag }); case HttpStatusCode.Unauthorized: // FIXME: missing in docs return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.NotFound: // FIXME: missing in docs @@ -1035,7 +1035,7 @@ export class TalerMerchantInstanceHttpClient { this.cacheEvictor.notifySuccess( TalerMerchantInstanceCacheEviction.UPDATE_BANK_ACCOUNT, ); - return opEmptySuccess(); + return opEmptySuccess(resp); } case HttpStatusCode.Unauthorized: // FIXME: missing in docs return opKnownHttpFailure(resp.status, resp); @@ -1122,7 +1122,7 @@ export class TalerMerchantInstanceHttpClient { this.cacheEvictor.notifySuccess( TalerMerchantInstanceCacheEviction.DELETE_BANK_ACCOUNT, ); - return opEmptySuccess(); + return opEmptySuccess(resp); } case HttpStatusCode.Unauthorized: // FIXME: missing in docs return opKnownHttpFailure(resp.status, resp); @@ -1217,7 +1217,7 @@ export class TalerMerchantInstanceHttpClient { this.cacheEvictor.notifySuccess( TalerMerchantInstanceCacheEviction.CREATE_CATEGORY, ); - return opEmptySuccess(); + return opEmptySuccess(resp); } case HttpStatusCode.Unauthorized: // FIXME: missing in docs return opKnownHttpFailure(resp.status, resp); @@ -1255,7 +1255,7 @@ export class TalerMerchantInstanceHttpClient { this.cacheEvictor.notifySuccess( TalerMerchantInstanceCacheEviction.UPDATE_CATEGORY, ); - return opEmptySuccess(); + return opEmptySuccess(resp); } case HttpStatusCode.Unauthorized: // FIXME: missing in docs return opKnownHttpFailure(resp.status, resp); @@ -1288,7 +1288,7 @@ export class TalerMerchantInstanceHttpClient { this.cacheEvictor.notifySuccess( TalerMerchantInstanceCacheEviction.DELETE_CATEGORY, ); - return opEmptySuccess(); + return opEmptySuccess(resp); } case HttpStatusCode.Unauthorized: // FIXME: missing in docs return opKnownHttpFailure(resp.status, resp); @@ -1325,7 +1325,7 @@ export class TalerMerchantInstanceHttpClient { this.cacheEvictor.notifySuccess( TalerMerchantInstanceCacheEviction.CREATE_PRODUCT, ); - return opEmptySuccess(); + return opEmptySuccess(resp); } case HttpStatusCode.Unauthorized: return opKnownHttpFailure(resp.status, resp); @@ -1333,13 +1333,13 @@ export class TalerMerchantInstanceHttpClient { const details = await readTalerErrorResponse(resp); switch (details.code) { case TalerErrorCode.MERCHANT_GENERIC_PRODUCT_GROUP_UNKNOWN: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.MERCHANT_GENERIC_CATEGORY_UNKNOWN: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.MERCHANT_GENERIC_MONEY_POT_UNKNOWN: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.MERCHANT_GENERIC_INSTANCE_UNKNOWN: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); default: return opUnknownHttpFailure(resp, details); } @@ -1376,7 +1376,7 @@ export class TalerMerchantInstanceHttpClient { this.cacheEvictor.notifySuccess( TalerMerchantInstanceCacheEviction.UPDATE_PRODUCT, ); - return opEmptySuccess(); + return opEmptySuccess(resp); } case HttpStatusCode.Unauthorized: // FIXME: missing in docs return opKnownHttpFailure(resp.status, resp); @@ -1515,7 +1515,7 @@ export class TalerMerchantInstanceHttpClient { this.cacheEvictor.notifySuccess( TalerMerchantInstanceCacheEviction.UPDATE_PRODUCT, ); - return opEmptySuccess(); + return opEmptySuccess(resp); } case HttpStatusCode.Unauthorized: // FIXME: missing in docs return opKnownHttpFailure(resp.status, resp); @@ -1557,7 +1557,7 @@ export class TalerMerchantInstanceHttpClient { this.cacheEvictor.notifySuccess( TalerMerchantInstanceCacheEviction.DELETE_PRODUCT, ); - return opEmptySuccess(); + return opEmptySuccess(resp); } case HttpStatusCode.Unauthorized: // FIXME: missing in docs return opKnownHttpFailure(resp.status, resp); @@ -1607,7 +1607,7 @@ export class TalerMerchantInstanceHttpClient { const details = await readTalerErrorResponse(resp); switch (details.code) { case TalerErrorCode.MERCHANT_PRIVATE_POST_ORDERS_INSTANCE_CONFIGURATION_LACKS_WIRE: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); default: return opUnknownHttpFailure(resp, details); } @@ -1753,7 +1753,7 @@ export class TalerMerchantInstanceHttpClient { switch (resp.status) { case HttpStatusCode.Ok: - return opFixedSuccess(new Uint8Array(await resp.bytes())); + return opFixedSuccess(resp, new Uint8Array(await resp.bytes())); case HttpStatusCode.NotFound: // FIXME: missing in docs return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.Unauthorized: // FIXME: missing in docs @@ -1815,15 +1815,15 @@ export class TalerMerchantInstanceHttpClient { resp, codecForMerchantOrderPrivateStatusResponse(), ); - return opFixedSuccess({ etag, ...f.body }); + return opFixedSuccess(resp, { etag, ...f.body }); } case HttpStatusCode.NotFound: { const details = await readTalerErrorResponse(resp); switch (details.code) { case TalerErrorCode.MERCHANT_GENERIC_ORDER_UNKNOWN: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); case TalerErrorCode.MERCHANT_GENERIC_INSTANCE_UNKNOWN: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); default: return opUnknownHttpFailure(resp, details); } @@ -1860,10 +1860,10 @@ export class TalerMerchantInstanceHttpClient { this.cacheEvictor.notifySuccess( TalerMerchantInstanceCacheEviction.UPDATE_ORDER, ); - return opEmptySuccess(); + return opEmptySuccess(resp); } case HttpStatusCode.NoContent: - return opEmptySuccess(); + return opEmptySuccess(resp); case HttpStatusCode.Unauthorized: // FIXME: missing in docs return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.BadRequest: @@ -1904,7 +1904,7 @@ export class TalerMerchantInstanceHttpClient { this.cacheEvictor.notifySuccess( TalerMerchantInstanceCacheEviction.DELETE_ORDER, ); - return opEmptySuccess(); + return opEmptySuccess(resp); } case HttpStatusCode.Unauthorized: // FIXME: missing in docs return opKnownHttpFailure(resp.status, resp); @@ -1997,7 +1997,7 @@ export class TalerMerchantInstanceHttpClient { this.cacheEvictor.notifySuccess( TalerMerchantInstanceCacheEviction.CREATE_TRANSFER, ); - return opEmptySuccess(); + return opEmptySuccess(resp); } case HttpStatusCode.Unauthorized: // FIXME: missing in docs return opKnownHttpFailure(resp.status, resp); @@ -2193,7 +2193,7 @@ export class TalerMerchantInstanceHttpClient { this.cacheEvictor.notifySuccess( TalerMerchantInstanceCacheEviction.CREATE_DEVICE, ); - return opEmptySuccess(); + return opEmptySuccess(resp); } case HttpStatusCode.Unauthorized: // FIXME: missing in docs return opKnownHttpFailure(resp.status, resp); @@ -2228,7 +2228,7 @@ export class TalerMerchantInstanceHttpClient { this.cacheEvictor.notifySuccess( TalerMerchantInstanceCacheEviction.UPDATE_DEVICE, ); - return opEmptySuccess(); + return opEmptySuccess(resp); } case HttpStatusCode.Unauthorized: // FIXME: missing in docs return opKnownHttpFailure(resp.status, resp); @@ -2325,7 +2325,7 @@ export class TalerMerchantInstanceHttpClient { this.cacheEvictor.notifySuccess( TalerMerchantInstanceCacheEviction.DELETE_DEVICE, ); - return opEmptySuccess(); + return opEmptySuccess(resp); } case HttpStatusCode.Unauthorized: // FIXME: missing in docs return opKnownHttpFailure(resp.status, resp); @@ -2363,7 +2363,7 @@ export class TalerMerchantInstanceHttpClient { this.cacheEvictor.notifySuccess( TalerMerchantInstanceCacheEviction.CREATE_TEMPLATE, ); - return opEmptySuccess(); + return opEmptySuccess(resp); } case HttpStatusCode.Unauthorized: // FIXME: missing in docs return opKnownHttpFailure(resp.status, resp); @@ -2400,7 +2400,7 @@ export class TalerMerchantInstanceHttpClient { this.cacheEvictor.notifySuccess( TalerMerchantInstanceCacheEviction.UPDATE_TEMPLATE, ); - return opEmptySuccess(); + return opEmptySuccess(resp); } case HttpStatusCode.Unauthorized: // FIXME: missing in docs return opKnownHttpFailure(resp.status, resp); @@ -2486,7 +2486,7 @@ export class TalerMerchantInstanceHttpClient { this.cacheEvictor.notifySuccess( TalerMerchantInstanceCacheEviction.DELETE_TEMPLATE, ); - return opEmptySuccess(); + return opEmptySuccess(resp); } case HttpStatusCode.Unauthorized: // FIXME: missing in docs return opKnownHttpFailure(resp.status, resp); @@ -2561,7 +2561,7 @@ export class TalerMerchantInstanceHttpClient { this.cacheEvictor.notifySuccess( TalerMerchantInstanceCacheEviction.CREATE_WEBHOOK, ); - return opEmptySuccess(); + return opEmptySuccess(resp); } case HttpStatusCode.Unauthorized: // FIXME: missing in docs return opKnownHttpFailure(resp.status, resp); @@ -2597,7 +2597,7 @@ export class TalerMerchantInstanceHttpClient { this.cacheEvictor.notifySuccess( TalerMerchantInstanceCacheEviction.UPDATE_WEBHOOK, ); - return opEmptySuccess(); + return opEmptySuccess(resp); } case HttpStatusCode.Unauthorized: // FIXME: missing in docs return opKnownHttpFailure(resp.status, resp); @@ -2682,7 +2682,7 @@ export class TalerMerchantInstanceHttpClient { this.cacheEvictor.notifySuccess( TalerMerchantInstanceCacheEviction.DELETE_WEBHOOK, ); - return opEmptySuccess(); + return opEmptySuccess(resp); } case HttpStatusCode.Unauthorized: // FIXME: missing in docs return opKnownHttpFailure(resp.status, resp); @@ -2721,7 +2721,7 @@ export class TalerMerchantInstanceHttpClient { this.cacheEvictor.notifySuccess( TalerMerchantInstanceCacheEviction.CREATE_TOKENFAMILY, ); - return opEmptySuccess(); + return opEmptySuccess(resp); } case HttpStatusCode.Unauthorized: // FIXME: missing in docs return opKnownHttpFailure(resp.status, resp); @@ -2763,7 +2763,7 @@ export class TalerMerchantInstanceHttpClient { this.cacheEvictor.notifySuccess( TalerMerchantInstanceCacheEviction.UPDATE_TOKENFAMILY, ); - return opEmptySuccess(); + return opEmptySuccess(resp); } case HttpStatusCode.Ok: { this.cacheEvictor.notifySuccess( @@ -2853,7 +2853,7 @@ export class TalerMerchantInstanceHttpClient { this.cacheEvictor.notifySuccess( TalerMerchantInstanceCacheEviction.DELETE_TOKENFAMILY, ); - return opEmptySuccess(); + return opEmptySuccess(resp); } case HttpStatusCode.Unauthorized: // FIXME: missing in docs return opKnownHttpFailure(resp.status, resp); @@ -2878,7 +2878,7 @@ export class TalerMerchantInstanceHttpClient { case HttpStatusCode.Ok: return opSuccessFromHttp(resp, codecForChallengeRequestResponse()); case HttpStatusCode.NoContent: - return opFixedSuccess<ChallengeRequestResponse>({}); + return opFixedSuccess<ChallengeRequestResponse>(resp, {}); case HttpStatusCode.Unauthorized: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.Forbidden: @@ -2887,7 +2887,7 @@ export class TalerMerchantInstanceHttpClient { const details = await readTalerErrorResponse(resp); switch (details.code) { case TalerErrorCode.MERCHANT_TAN_CHALLENGE_UNKNOWN: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); default: return opUnknownHttpFailure(resp, details); } @@ -2896,7 +2896,7 @@ export class TalerMerchantInstanceHttpClient { const details = await readTalerErrorResponse(resp); switch (details.code) { case TalerErrorCode.MERCHANT_TAN_CHALLENGE_SOLVED: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); default: return opUnknownHttpFailure(resp, details); } @@ -2905,7 +2905,7 @@ export class TalerMerchantInstanceHttpClient { const details = await readTalerErrorResponse(resp); switch (details.code) { case TalerErrorCode.MERCHANT_TAN_TOO_EARLY: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); default: return opUnknownHttpFailure(resp, details); } @@ -2914,7 +2914,7 @@ export class TalerMerchantInstanceHttpClient { const details = await readTalerErrorResponse(resp); switch (details.code) { case TalerErrorCode.MERCHANT_TAN_MFA_HELPER_EXEC_FAILED: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); default: return opUnknownHttpFailure(resp, details); } @@ -2936,14 +2936,14 @@ export class TalerMerchantInstanceHttpClient { }); switch (resp.status) { case HttpStatusCode.NoContent: - return opEmptySuccess(); + return opEmptySuccess(resp); case HttpStatusCode.Unauthorized: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.NotFound: { const details = await readTalerErrorResponse(resp); switch (details.code) { case TalerErrorCode.MERCHANT_TAN_CHALLENGE_UNKNOWN: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); default: return opUnknownHttpFailure(resp, details); } @@ -2952,7 +2952,7 @@ export class TalerMerchantInstanceHttpClient { const details = await readTalerErrorResponse(resp); switch (details.code) { case TalerErrorCode.MERCHANT_TAN_CHALLENGE_FAILED: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); default: return opUnknownHttpFailure(resp, details); } @@ -2961,7 +2961,7 @@ export class TalerMerchantInstanceHttpClient { const details = await readTalerErrorResponse(resp); switch (details.code) { case TalerErrorCode.MERCHANT_TAN_TOO_MANY_ATTEMPTS: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); default: return opUnknownHttpFailure(resp, details); } @@ -2993,7 +2993,7 @@ export class TalerMerchantInstanceHttpClient { switch (resp.status) { case HttpStatusCode.NoContent: { - return opEmptySuccess(); + return opEmptySuccess(resp); } case HttpStatusCode.Accepted: { return opKnownAlternativeHttpFailure( @@ -3010,7 +3010,7 @@ export class TalerMerchantInstanceHttpClient { const details = await readTalerErrorResponse(resp); switch (details.code) { case TalerErrorCode.MERCHANT_GENERIC_MFA_MISSING: - return opKnownTalerFailure(details.code, details); + return opKnownTalerFailure(resp, details.code, details); default: return opUnknownHttpFailure(resp, details); } @@ -3040,7 +3040,7 @@ export class TalerMerchantInstanceHttpClient { case HttpStatusCode.NoContent: case HttpStatusCode.Created: case HttpStatusCode.Ok: { - return opEmptySuccess(); + return opEmptySuccess(resp); } case HttpStatusCode.BadGateway: return opKnownHttpFailure(resp.status, resp); @@ -3071,7 +3071,7 @@ export class TalerMerchantInstanceHttpClient { switch (resp.status) { case HttpStatusCode.Ok: { - return opEmptySuccess(); + return opEmptySuccess(resp); } case HttpStatusCode.NotFound: return opKnownHttpFailure(resp.status, resp); @@ -3136,7 +3136,7 @@ export class TalerMerchantInstanceHttpClient { this.cacheEvictor.notifySuccess( TalerMerchantInstanceCacheEviction.UPDATE_REPORTS, ); - return opEmptySuccess(); + return opEmptySuccess(resp); case HttpStatusCode.Unauthorized: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.NotFound: @@ -3218,7 +3218,7 @@ export class TalerMerchantInstanceHttpClient { this.cacheEvictor.notifySuccess( TalerMerchantInstanceCacheEviction.DELETE_REPORTS, ); - return opEmptySuccess(); + return opEmptySuccess(resp); case HttpStatusCode.Unauthorized: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.NotFound: @@ -3289,7 +3289,7 @@ export class TalerMerchantInstanceHttpClient { this.cacheEvictor.notifySuccess( TalerMerchantInstanceCacheEviction.UPDATE_POTS, ); - return opEmptySuccess(); + return opEmptySuccess(resp); case HttpStatusCode.Unauthorized: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.Conflict: @@ -3370,7 +3370,7 @@ export class TalerMerchantInstanceHttpClient { this.cacheEvictor.notifySuccess( TalerMerchantInstanceCacheEviction.DELETE_POTS, ); - return opEmptySuccess(); + return opEmptySuccess(resp); case HttpStatusCode.Unauthorized: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.NotFound: @@ -3439,7 +3439,7 @@ export class TalerMerchantInstanceHttpClient { this.cacheEvictor.notifySuccess( TalerMerchantInstanceCacheEviction.UPDATE_GROUPS, ); - return opEmptySuccess(); + return opEmptySuccess(resp); case HttpStatusCode.Unauthorized: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.NotFound: @@ -3496,7 +3496,7 @@ export class TalerMerchantInstanceHttpClient { TalerMerchantInstanceCacheEviction.DELETE_GROUPS, ); - return opEmptySuccess(); + return opEmptySuccess(resp); case HttpStatusCode.Unauthorized: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.NotFound: @@ -3591,7 +3591,7 @@ export class TalerMerchantManagementHttpClient extends TalerMerchantInstanceHttp this.cacheManagementEvictor.notifySuccess( TalerMerchantManagementCacheEviction.CREATE_INSTANCE, ); - return opFixedSuccess(undefined); + return opFixedSuccess(resp, undefined); } case HttpStatusCode.Accepted: return opKnownAlternativeHttpFailure( @@ -3638,7 +3638,7 @@ export class TalerMerchantManagementHttpClient extends TalerMerchantInstanceHttp this.cacheManagementEvictor.notifySuccess( TalerMerchantManagementCacheEviction.CREATE_INSTANCE, ); - return opEmptySuccess(); + return opEmptySuccess(resp); } case HttpStatusCode.Accepted: return opKnownAlternativeHttpFailure( @@ -3692,7 +3692,7 @@ export class TalerMerchantManagementHttpClient extends TalerMerchantInstanceHttp codecForChallengeResponse(), ); case HttpStatusCode.NoContent: - return opEmptySuccess(); + return opEmptySuccess(resp); case HttpStatusCode.Unauthorized: // FIXME: missing in docs return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.NotFound: @@ -3726,7 +3726,7 @@ export class TalerMerchantManagementHttpClient extends TalerMerchantInstanceHttp this.cacheManagementEvictor.notifySuccess( TalerMerchantManagementCacheEviction.UPDATE_INSTANCE, ); - return opEmptySuccess(); + return opEmptySuccess(resp); } case HttpStatusCode.Unauthorized: // FIXME: missing in docs return opKnownHttpFailure(resp.status, resp); @@ -3820,7 +3820,7 @@ export class TalerMerchantManagementHttpClient extends TalerMerchantInstanceHttp this.cacheManagementEvictor.notifySuccess( TalerMerchantManagementCacheEviction.DELETE_INSTANCE, ); - return opEmptySuccess(); + return opEmptySuccess(resp); } case HttpStatusCode.Accepted: { return opKnownAlternativeHttpFailure( @@ -3872,9 +3872,9 @@ export class TalerMerchantManagementHttpClient extends TalerMerchantInstanceHttp case HttpStatusCode.Accepted: return opSuccessFromHttp(resp, codecForAccountKycRedirects()); case HttpStatusCode.NoContent: - return opEmptySuccess(); + return opEmptySuccess(resp); case HttpStatusCode.NotFound: - return opEmptySuccess(); + return opEmptySuccess(resp); case HttpStatusCode.Unauthorized: // FIXME: missing in docs return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.BadGateway: @@ -4049,7 +4049,7 @@ export class TalerMerchantManagementHttpClient extends TalerMerchantInstanceHttp }); switch (resp.status) { case HttpStatusCode.Ok: - return opFixedSuccess(await resp.bytes()); + return opFixedSuccess(resp, await resp.bytes()); case HttpStatusCode.NotFound: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.Unauthorized: diff --git a/packages/taler-util/src/operation.ts b/packages/taler-util/src/operation.ts @@ -54,6 +54,8 @@ export function isOperationFail<T, E>( export interface OperationOk<BodyT> { type: "ok"; + response: HttpResponse; + case: "ok"; /** @@ -68,6 +70,8 @@ export interface OperationOk<BodyT> { export interface OperationFail<T> { type: "fail"; + response: HttpResponse; + /** * Error case (either HTTP status code or TalerErrorCode) */ @@ -82,6 +86,8 @@ export interface OperationFail<T> { export interface OperationAlternative<T, B> { type: "fail"; + response: HttpResponse; + /** * Either a HTTP status code or Taler error code to distinguish * the response type. @@ -96,30 +102,34 @@ export async function opSuccessFromHttp<T>( codec: Codec<T>, ): Promise<OperationOk<T>> { const body = await readSuccessResponseJsonOrThrow(resp, codec); - return { type: "ok" as const, case: "ok", body }; + return { type: "ok" as const, case: "ok", response: resp, body }; } /** * Success case, but instead of the body we're returning a fixed response * to the client. */ -export function opFixedSuccess<T>(body: T): OperationOk<T> { - return { type: "ok" as const, case: "ok", body }; +export function opFixedSuccess<T>(resp: HttpResponse, body: T): OperationOk<T> { + return { type: "ok" as const, response: resp, case: "ok", body }; } -export function opEmptySuccess(): OperationOk<undefined> { - return { type: "ok" as const, case: "ok", body: undefined }; +export function opEmptySuccess(resp: HttpResponse): OperationOk<undefined> { + return { type: "ok" as const, response: resp, case: "ok", body: undefined }; } -export function opKnownFailure<const T>(case_: T): OperationFail<T> { - return { type: "fail", case: case_ }; +export function opKnownFailure<const T>( + resp: HttpResponse, + case_: T, +): OperationFail<T> { + return { type: "fail", response: resp, case: case_ }; } export function opKnownFailureWithBody<const T, const B>( + resp: HttpResponse, case_: T, body: B, ): OperationAlternative<T, B> { - return { type: "fail", case: case_, body }; + return { type: "fail", response: resp, case: case_, body }; } /** @@ -161,7 +171,7 @@ export async function carefullyParseConfig<T>( } // Now that we've checked the basic body, re-parse the full response. const body = await readSuccessResponseJsonOrThrow(httpResponse, codec); - return opFixedSuccess(body); + return opFixedSuccess(httpResponse, body); } /** @@ -180,7 +190,7 @@ export async function opKnownAlternativeHttpFailure< codec: Codec<B>, ): Promise<OperationAlternative<T, B>> { const body = await readResponseJsonOrThrow(resp, codec); - return { type: "fail", case: s, body }; + return { type: "fail", response: resp, case: s, body }; } /** @@ -199,7 +209,7 @@ export async function opKnownHttpFailure<T extends HttpStatusCode>( if (!detail) { detail = await readTalerErrorResponse(resp); } - return { type: "fail", case: _case, detail }; + return { type: "fail", response: resp, case: _case, detail }; } /** @@ -240,10 +250,11 @@ export async function opUnknownHttpFailure( * @returns */ export function opKnownTalerFailure<T extends TalerErrorCode>( + resp: HttpResponse, _case: T, detail: TalerErrorDetail, ): OperationFail<T> { - return { type: "fail", case: _case, detail }; + return { type: "fail", response: resp, case: _case, detail }; } export function opUnknownFailure(error: unknown): never { @@ -254,18 +265,25 @@ export function opUnknownFailure(error: unknown): never { * The operation result should be ok * Return the body of the result * - * @param resp + * @param result * @returns */ -export function succeedOrThrow<R>(resp: OperationResult<R, unknown>): R { - if (isOperationOk(resp)) { - return resp.body; +export function succeedOrThrow<R>(result: OperationResult<R, unknown>): R { + if (isOperationOk(result)) { + return result.body; } - if (isOperationFail(resp)) { - throw TalerError.fromUncheckedDetail({ ...resp, case: resp.case } as any); + if (isOperationFail(result)) { + const resp = result.response; + throw TalerError.fromUncheckedDetail({ + case: result.case, + requestUrl: resp.requestUrl, + requestMethod: resp.requestMethod, + httpStatusCode: resp.status, + errorResponse: resp, + } as any); } - throw TalerError.fromException(resp); + throw TalerError.fromException(result); } /** diff --git a/packages/taler-util/src/segwit_addr.ts b/packages/taler-util/src/segwit_addr.ts @@ -19,8 +19,7 @@ // THE SOFTWARE. import { BitcoinBech32 } from "./bech32.js"; -import { opFixedSuccess, opKnownFailure } from "./operation.js"; -import { Result } from "./result.js"; +import { Result, ResultError, ResultOk } from "./result.js"; function convertbits( data: Array<number>, @@ -100,16 +99,22 @@ export namespace BitcoinSewgit { return Result.of({ version: dec.data[0], program: res }); } - export function encode(hrp: string, version: number, program: Array<number>) { + export function encode( + hrp: string, + version: number, + program: Array<number>, + ): + | ResultOk<import("./payto.js").BtAddrString> + | ResultError<BitcoinSewgitParseError, undefined> { const enc = version > 0 ? BitcoinBech32.Encodings.BECH32M : BitcoinBech32.Encodings.BECH32; const bits = convertbits(program, 8, 5, true); if (!bits) { - return opKnownFailure(BitcoinSewgitParseError.INVALID_DATA); + return Result.error(BitcoinSewgitParseError.INVALID_DATA); } const ret = BitcoinBech32.encode(hrp, [version].concat(bits), enc); - return opFixedSuccess(ret); + return Result.of(ret); } } diff --git a/packages/taler-util/src/taleruri.ts b/packages/taler-util/src/taleruri.ts @@ -834,7 +834,7 @@ export namespace TalerUris { if ( !opts.ignoreComponentError && amountRes && - amountRes.type === "fail" + Result.isError(amountRes) ) { return Result.errorWithDetail(TalerUriParseError.INVALID_PARAMETER, { name: "a" as const, @@ -843,8 +843,8 @@ export namespace TalerUris { }); } const amount = - amountRes && amountRes.type === "ok" - ? Amounts.stringify(amountRes.body) + amountRes && Result.isOk(amountRes) + ? Amounts.stringify(amountRes.value) : undefined; return Result.of<URI>(