summaryrefslogtreecommitdiff
path: root/packages/taler-wallet-core/src/operations/tip.ts
diff options
context:
space:
mode:
authorFlorian Dold <florian@dold.me>2020-11-26 12:27:31 +0100
committerFlorian Dold <florian@dold.me>2020-11-26 12:27:31 +0100
commit2b19594e7adfc4ae75970db5c0881243efcac4df (patch)
tree84ace2e363fb9dd8c6880edcdd9c0f4c1792b482 /packages/taler-wallet-core/src/operations/tip.ts
parentc0006300cf68cc912ecdb3135b74ebb4c5b77243 (diff)
downloadwallet-core-2b19594e7adfc4ae75970db5c0881243efcac4df.tar.gz
wallet-core-2b19594e7adfc4ae75970db5c0881243efcac4df.tar.bz2
wallet-core-2b19594e7adfc4ae75970db5c0881243efcac4df.zip
hide transient errors when accepting a tip
Diffstat (limited to 'packages/taler-wallet-core/src/operations/tip.ts')
-rw-r--r--packages/taler-wallet-core/src/operations/tip.ts23
1 files changed, 20 insertions, 3 deletions
diff --git a/packages/taler-wallet-core/src/operations/tip.ts b/packages/taler-wallet-core/src/operations/tip.ts
index 119695de6..cbf61a86c 100644
--- a/packages/taler-wallet-core/src/operations/tip.ts
+++ b/packages/taler-wallet-core/src/operations/tip.ts
@@ -40,7 +40,7 @@ import { getRandomBytes, encodeCrock } from "../crypto/talerCrypto";
import { guardOperationException, makeErrorDetails } from "./errors";
import { NotificationType } from "../types/notifications";
import { getTimestampNow } from "../util/time";
-import { readSuccessResponseJsonOrThrow } from "../util/http";
+import { getHttpResponseErrorDetails, readSuccessResponseJsonOrThrow } from "../util/http";
import { URL } from "../util/url";
import { Logger } from "../util/logging";
import { checkDbInvariant } from "../util/invariants";
@@ -132,11 +132,11 @@ export async function prepareTip(
async function incrementTipRetry(
ws: InternalWalletState,
- refreshSessionId: string,
+ walletTipId: string,
err: TalerErrorDetails | undefined,
): Promise<void> {
await ws.db.runWithWriteTransaction([Stores.tips], async (tx) => {
- const t = await tx.get(Stores.tips, refreshSessionId);
+ const t = await tx.get(Stores.tips, walletTipId);
if (!t) {
return;
}
@@ -239,6 +239,23 @@ async function processTipImpl(
const req = { planchets: planchetsDetail };
const merchantResp = await ws.http.postJson(tipStatusUrl.href, req);
+
+ // Hide transient errors.
+ if (
+ tipRecord.retryInfo.retryCounter < 5 &&
+ merchantResp.status >= 500 &&
+ merchantResp.status <= 599
+ ) {
+ const err = makeErrorDetails(
+ TalerErrorCode.WALLET_UNEXPECTED_REQUEST_ERROR,
+ "tip pickup failed (transient)",
+ getHttpResponseErrorDetails(merchantResp),
+ );
+ await incrementTipRetry(ws, tipRecord.walletTipId, err);
+ // FIXME: Maybe we want to signal to the caller that the transient error happened?
+ return;
+ }
+
const response = await readSuccessResponseJsonOrThrow(
merchantResp,
codecForTipResponse(),