diff options
Diffstat (limited to 'packages/taler-util/src/http-client/bank-core.ts')
-rw-r--r-- | packages/taler-util/src/http-client/bank-core.ts | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/packages/taler-util/src/http-client/bank-core.ts b/packages/taler-util/src/http-client/bank-core.ts index 59698a68b..be37560cd 100644 --- a/packages/taler-util/src/http-client/bank-core.ts +++ b/packages/taler-util/src/http-client/bank-core.ts @@ -19,6 +19,9 @@ import { HttpStatusCode, LibtoolVersion, LongPollParams, + OperationAlternative, + OperationFail, + OperationOk, TalerErrorCode, codecForChallenge, codecForTalerErrorDetail, @@ -64,6 +67,7 @@ import { } from "./types.js"; import { CacheEvictor, + IdempotencyRetry, addLongPollingParam, addPaginationParams, makeBearerTokenAuthHeader, @@ -493,9 +497,25 @@ export class TalerCoreBankHttpClient { async createTransaction( auth: UserAndToken, body: TalerCorebankApi.CreateTransactionRequest, + idempotencyCheck: IdempotencyRetry | undefined, cid?: string, - ) { + ): Promise< + //manually definition all return types because of recursion + | OperationOk<TalerCorebankApi.CreateTransactionResponse> + | OperationAlternative<HttpStatusCode.Accepted, TalerCorebankApi.Challenge> + | OperationFail<HttpStatusCode.NotFound> + | OperationFail<HttpStatusCode.BadRequest> + | OperationFail<HttpStatusCode.Unauthorized> + | OperationFail<TalerErrorCode.BANK_UNALLOWED_DEBIT> + | OperationFail<TalerErrorCode.BANK_ADMIN_CREDITOR> + | OperationFail<TalerErrorCode.BANK_SAME_ACCOUNT> + | OperationFail<TalerErrorCode.BANK_UNKNOWN_CREDITOR> + | OperationFail<TalerErrorCode.BANK_TRANSFER_REQUEST_UID_REUSED> + > { const url = new URL(`accounts/${auth.username}/transactions`, this.baseUrl); + if (idempotencyCheck) { + body.request_uid = idempotencyCheck.uid + } const resp = await this.httpLib.fetch(url.href, { method: "POST", headers: { @@ -530,6 +550,12 @@ export class TalerCoreBankHttpClient { return opKnownTalerFailure(details.code, details); case TalerErrorCode.BANK_UNALLOWED_DEBIT: return opKnownTalerFailure(details.code, details); + case TalerErrorCode.BANK_TRANSFER_REQUEST_UID_REUSED: + if (!idempotencyCheck) { + return opKnownTalerFailure(details.code, details); + } + const nextRetry = idempotencyCheck.next(); + return this.createTransaction(auth, body, nextRetry, cid); default: return opUnknownFailure(resp, details); } |