taler-typescript-core

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

commit 3db00d9d73c7fcd88f8450330c01639a6b171df9
parent 119c1c708f9922e3e92ff592dcf08a1bd4f2f2e4
Author: Florian Dold <florian.dold@gmail.com>
Date:   Fri, 31 Jul 2020 20:13:59 +0530

fix concurrency bug in bank-integrated withdrawal, better response parsing

Diffstat:
Msrc/operations/reserves.ts | 25++++++++++++++-----------
Msrc/types/talerTypes.ts | 14++++++++++++++
2 files changed, 28 insertions(+), 11 deletions(-)

diff --git a/src/operations/reserves.ts b/src/operations/reserves.ts @@ -43,7 +43,10 @@ import { getExchangeTrust, getExchangePaytoUri, } from "./exchanges"; -import { codecForWithdrawOperationStatusResponse } from "../types/talerTypes"; +import { + codecForWithdrawOperationStatusResponse, + codecForBankWithdrawalOperationPostResponse, +} from "../types/talerTypes"; import { assertUnreachable } from "../util/assertUnreachable"; import { encodeCrock, getRandomBytes } from "../crypto/talerCrypto"; import { randomBytes } from "../crypto/primitives/nacl-fast"; @@ -71,7 +74,9 @@ import { TalerErrorCode } from "../TalerErrorCode"; import { readSuccessResponseJsonOrErrorCode, throwUnexpectedRequestError, + readSuccessResponseJsonOrThrow, } from "../util/http"; +import { codecForAny } from "../util/codec"; const logger = new Logger("reserves.ts"); @@ -324,14 +329,14 @@ async function registerReserveWithBank( return; } const bankStatusUrl = bankInfo.statusUrl; - if (reserve.timestampReserveInfoPosted) { - throw Error("bank claims that reserve info selection is not done"); - } - // FIXME: parse bank response - await ws.http.postJson(bankStatusUrl, { + const httpResp = await ws.http.postJson(bankStatusUrl, { reserve_pub: reservePub, selected_exchange: bankInfo.exchangePaytoUri, }); + await readSuccessResponseJsonOrThrow( + httpResp, + codecForBankWithdrawalOperationPostResponse(), + ); await ws.db.mutate(Stores.reserves, reservePub, (r) => { switch (r.reserveStatus) { case ReserveRecordStatus.REGISTERING_BANK: @@ -382,11 +387,9 @@ async function processReserveBankStatusImpl( } const statusResp = await ws.http.get(bankStatusUrl); - if (statusResp.status !== 200) { - throw Error(`unexpected status ${statusResp.status} for bank status query`); - } - const status = codecForWithdrawOperationStatusResponse().decode( - await statusResp.json(), + const status = await readSuccessResponseJsonOrThrow( + statusResp, + codecForWithdrawOperationStatusResponse(), ); if (status.selection_done) { diff --git a/src/types/talerTypes.ts b/src/types/talerTypes.ts @@ -940,6 +940,20 @@ export interface WithdrawUriInfoResponse { possibleExchanges: ExchangeListItem[]; } +/** + * Response body for the following endpoint: + * + * POST {talerBankIntegrationApi}/withdrawal-operation/{wopid} + */ +export interface BankWithdrawalOperationPostResponse { + transfer_done: boolean; +} + +export const codecForBankWithdrawalOperationPostResponse = (): Codec<BankWithdrawalOperationPostResponse> => + makeCodecForObject<BankWithdrawalOperationPostResponse>() + .property("transfer_done", codecForBoolean) + .build("BankWithdrawalOperationPostResponse"); + export type AmountString = string; export type Base32String = string; export type EddsaSignatureString = string;