diff options
Diffstat (limited to 'packages/taler-wallet-core/src/operations/pay-merchant.ts')
-rw-r--r-- | packages/taler-wallet-core/src/operations/pay-merchant.ts | 75 |
1 files changed, 27 insertions, 48 deletions
diff --git a/packages/taler-wallet-core/src/operations/pay-merchant.ts b/packages/taler-wallet-core/src/operations/pay-merchant.ts index 570a50c47..c8e3230b9 100644 --- a/packages/taler-wallet-core/src/operations/pay-merchant.ts +++ b/packages/taler-wallet-core/src/operations/pay-merchant.ts @@ -1135,9 +1135,9 @@ export function selectForced( export type SelectPayCoinsResult = | { - type: "failure"; - insufficientBalanceDetails: PayMerchantInsufficientBalanceDetails; - } + type: "failure"; + insufficientBalanceDetails: PayMerchantInsufficientBalanceDetails; + } | { type: "success"; coinSel: PayCoinSelection }; /** @@ -1623,7 +1623,7 @@ export async function runPayForConfirmPay( const numRetry = opRetry?.retryInfo.retryCounter ?? 0; if ( res.errorDetail.code === - TalerErrorCode.WALLET_PAY_MERCHANT_SERVER_ERROR && + TalerErrorCode.WALLET_PAY_MERCHANT_SERVER_ERROR && numRetry < maxRetry ) { // Pretend the operation is pending instead of reporting @@ -1942,50 +1942,6 @@ export async function processPurchasePay( }; } - if (resp.status === HttpStatusCode.BadRequest) { - const errDetails = await readUnexpectedResponseDetails(resp); - logger.warn("unexpected 400 response for /pay"); - logger.warn(j2s(errDetails)); - await ws.db - .mktx((x) => [x.purchases]) - .runReadWrite(async (tx) => { - const purch = await tx.purchases.get(proposalId); - if (!purch) { - return; - } - // FIXME: Should be some "PayPermanentlyFailed" and error info should be stored - purch.purchaseStatus = PurchaseStatus.PaymentAbortFinished; - await tx.purchases.put(purch); - }); - throw makePendingOperationFailedError( - errDetails, - TransactionType.Payment, - proposalId, - ); - } - - if (resp.status === HttpStatusCode.Gone) { - const errDetails = await readUnexpectedResponseDetails(resp); - logger.warn("unexpected 410 response for /pay"); - logger.warn(j2s(errDetails)); - await ws.db - .mktx((x) => [x.purchases]) - .runReadWrite(async (tx) => { - const purch = await tx.purchases.get(proposalId); - if (!purch) { - return; - } - // FIXME: Should be some "PayPermanentlyFailed" and error info should be stored - purch.purchaseStatus = PurchaseStatus.PaymentAbortFinished; - await tx.purchases.put(purch); - }); - throw makePendingOperationFailedError( - errDetails, - TransactionType.Payment, - proposalId, - ); - } - if (resp.status === HttpStatusCode.Conflict) { const err = await readTalerErrorResponse(resp); if ( @@ -2012,6 +1968,29 @@ export async function processPurchasePay( result: undefined, }; } + + if (resp.status >= 400 && resp.status <= 499) { + const errDetails = await readUnexpectedResponseDetails(resp); + logger.warn(`server returned ${resp.status} response for /pay`); + logger.warn(j2s(errDetails)); + await ws.db + .mktx((x) => [x.purchases]) + .runReadWrite(async (tx) => { + const purch = await tx.purchases.get(proposalId); + if (!purch) { + return; + } + // FIXME: Should be some "PayPermanentlyFailed" and error info should be stored + purch.purchaseStatus = PurchaseStatus.PaymentAbortFinished; + await tx.purchases.put(purch); + }); + throw makePendingOperationFailedError( + errDetails, + TransactionType.Payment, + proposalId, + ); + } + } const merchantResp = await readSuccessResponseJsonOrThrow( |