[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[taler-wallet-core] 02/02: implement long-polling for auto-refunds
From: |
gnunet |
Subject: |
[taler-wallet-core] 02/02: implement long-polling for auto-refunds |
Date: |
Tue, 22 Jun 2021 15:30:59 +0200 |
This is an automated email from the git hooks/post-receive script.
dold pushed a commit to branch master
in repository wallet-core.
commit 39c4b42dafc5d8fc5f455e7ed936c45ec2340cfc
Author: Florian Dold <florian@dold.me>
AuthorDate: Tue Jun 22 15:30:19 2021 +0200
implement long-polling for auto-refunds
---
.../taler-wallet-core/src/operations/refund.ts | 35 ++++++++++++++++++++--
1 file changed, 33 insertions(+), 2 deletions(-)
diff --git a/packages/taler-wallet-core/src/operations/refund.ts
b/packages/taler-wallet-core/src/operations/refund.ts
index 4ea80689..0bff2986 100644
--- a/packages/taler-wallet-core/src/operations/refund.ts
+++ b/packages/taler-wallet-core/src/operations/refund.ts
@@ -44,6 +44,8 @@ import {
TalerErrorDetails,
URL,
timestampAddDuration,
+ codecForMerchantOrderStatusPaid,
+ isTimestampExpired,
} from "@gnu-taler/taler-util";
import {
AbortStatus,
@@ -493,7 +495,7 @@ export async function applyRefund(
ws.notify({
type: NotificationType.RefundStarted,
});
- await processPurchaseQueryRefund(ws, proposalId);
+ await processPurchaseQueryRefundImpl(ws, proposalId, true, false);
}
purchase = await ws.db
@@ -571,7 +573,7 @@ export async function processPurchaseQueryRefund(
const onOpErr = (e: TalerErrorDetails): Promise<void> =>
incrementPurchaseQueryRefundRetry(ws, proposalId, e);
await guardOperationException(
- () => processPurchaseQueryRefundImpl(ws, proposalId, forceNow),
+ () => processPurchaseQueryRefundImpl(ws, proposalId, forceNow, true),
onOpErr,
);
}
@@ -597,6 +599,7 @@ async function processPurchaseQueryRefundImpl(
ws: InternalWalletState,
proposalId: string,
forceNow: boolean,
+ waitForAutoRefund: boolean,
): Promise<void> {
if (forceNow) {
await resetPurchaseQueryRefundRetry(ws, proposalId);
@@ -617,6 +620,34 @@ async function processPurchaseQueryRefundImpl(
}
if (purchase.timestampFirstSuccessfulPay) {
+ if (
+ waitForAutoRefund &&
+ purchase.autoRefundDeadline &&
+ !isTimestampExpired(purchase.autoRefundDeadline)
+ ) {
+ const requestUrl = new URL(
+ `orders/${purchase.download.contractData.orderId}`,
+ purchase.download.contractData.merchantBaseUrl,
+ );
+ requestUrl.searchParams.set(
+ "h_contract",
+ purchase.download.contractData.contractTermsHash,
+ );
+ // Long-poll for one second
+ requestUrl.searchParams.set("timeout_ms", "1000");
+ requestUrl.searchParams.set("await_refund_obtained", "yes");
+ logger.trace("making long-polling request for auto-refund");
+ const resp = await ws.http.get(requestUrl.href);
+ const orderStatus = await readSuccessResponseJsonOrThrow(
+ resp,
+ codecForMerchantOrderStatusPaid(),
+ );
+ if (!orderStatus.refunded) {
+ incrementPurchaseQueryRefundRetry(ws, proposalId, undefined);
+ return;
+ }
+ }
+
const requestUrl = new URL(
`orders/${purchase.download.contractData.orderId}/refund`,
purchase.download.contractData.merchantBaseUrl,
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.