summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2020-09-03 17:29:09 +0530
committerFlorian Dold <florian.dold@gmail.com>2020-09-03 17:29:09 +0530
commit09b5bfe0db8271c0c7531e22e3123d7e29e2bb1e (patch)
tree0b8283ff9e57c6fbcbf317a2ac1363108248c9b8
parent8a3ac7f08b114360118bf58a38983401107a62cf (diff)
downloadwallet-core-09b5bfe0db8271c0c7531e22e3123d7e29e2bb1e.tar.gz
wallet-core-09b5bfe0db8271c0c7531e22e3123d7e29e2bb1e.tar.bz2
wallet-core-09b5bfe0db8271c0c7531e22e3123d7e29e2bb1e.zip
towards auto-refresh
-rw-r--r--packages/taler-wallet-core/src/operations/pending.ts3
-rw-r--r--packages/taler-wallet-core/src/operations/refresh.ts5
-rw-r--r--packages/taler-wallet-core/src/operations/withdraw.ts2
-rw-r--r--packages/taler-wallet-core/src/types/dbTypes.ts8
-rw-r--r--packages/taler-wallet-core/src/types/pending.ts11
-rw-r--r--packages/taler-wallet-core/src/util/time.ts23
-rw-r--r--packages/taler-wallet-core/src/wallet.ts5
7 files changed, 45 insertions, 12 deletions
diff --git a/packages/taler-wallet-core/src/operations/pending.ts b/packages/taler-wallet-core/src/operations/pending.ts
index 8cbc5e569..e24e8fc4e 100644
--- a/packages/taler-wallet-core/src/operations/pending.ts
+++ b/packages/taler-wallet-core/src/operations/pending.ts
@@ -92,7 +92,8 @@ async function gatherExchangePending(
},
});
}
- if (e.details && e.details.nextUpdateTime.t_ms < now.t_ms) {
+ const keysUpdateRequired = e.details && e.details.nextUpdateTime.t_ms < now.t_ms;
+ if (keysUpdateRequired) {
resp.pendingOperations.push({
type: PendingOperationType.ExchangeUpdate,
givesLifeness: false,
diff --git a/packages/taler-wallet-core/src/operations/refresh.ts b/packages/taler-wallet-core/src/operations/refresh.ts
index 770c67da6..6c1e643a6 100644
--- a/packages/taler-wallet-core/src/operations/refresh.ts
+++ b/packages/taler-wallet-core/src/operations/refresh.ts
@@ -634,3 +634,8 @@ export async function createRefreshGroup(
refreshGroupId,
};
}
+
+export async function autoRefresh(
+ ws: InternalWalletState,
+ exchangeBaseUrl: string,
+): Promise<void> {}
diff --git a/packages/taler-wallet-core/src/operations/withdraw.ts b/packages/taler-wallet-core/src/operations/withdraw.ts
index c719f7ab8..4070e39f4 100644
--- a/packages/taler-wallet-core/src/operations/withdraw.ts
+++ b/packages/taler-wallet-core/src/operations/withdraw.ts
@@ -620,6 +620,8 @@ async function processWithdrawGroupImpl(
return;
}
+ await updateExchangeFromUrl(ws, withdrawalGroup.exchangeBaseUrl);
+
const numTotalCoins = withdrawalGroup.denomsSel.selectedDenoms
.map((x) => x.count)
.reduce((a, b) => a + b);
diff --git a/packages/taler-wallet-core/src/types/dbTypes.ts b/packages/taler-wallet-core/src/types/dbTypes.ts
index 801bb4492..30a562822 100644
--- a/packages/taler-wallet-core/src/types/dbTypes.ts
+++ b/packages/taler-wallet-core/src/types/dbTypes.ts
@@ -648,6 +648,14 @@ export interface ExchangeRecord {
* Retry status for fetching updated information about the exchange.
*/
retryInfo: RetryInfo;
+
+ /**
+ * Next time that we should check if coins need to be refreshed.
+ *
+ * Updated whenever the exchange's denominations are updated or when
+ * the refresh check has been done.
+ */
+ nextRefreshCheck?: Timestamp;
}
diff --git a/packages/taler-wallet-core/src/types/pending.ts b/packages/taler-wallet-core/src/types/pending.ts
index 69613becb..d07754fe9 100644
--- a/packages/taler-wallet-core/src/types/pending.ts
+++ b/packages/taler-wallet-core/src/types/pending.ts
@@ -28,6 +28,7 @@ import { Timestamp, Duration } from "../util/time";
export enum PendingOperationType {
Bug = "bug",
ExchangeUpdate = "exchange-update",
+ ExchangeCheckRefresh = "exchange-check-refresh",
Pay = "pay",
ProposalChoice = "proposal-choice",
ProposalDownload = "proposal-download",
@@ -47,6 +48,7 @@ export type PendingOperationInfo = PendingOperationInfoCommon &
(
| PendingBugOperation
| PendingExchangeUpdateOperation
+ | PendingExchangeCheckRefreshOperation
| PendingPayOperation
| PendingProposalChoiceOperation
| PendingProposalDownloadOperation
@@ -71,6 +73,15 @@ export interface PendingExchangeUpdateOperation {
}
/**
+ * The wallet should check whether coins from this exchange
+ * need to be auto-refreshed.
+ */
+export interface PendingExchangeCheckRefreshOperation {
+ type: PendingOperationType.ExchangeCheckRefresh;
+ exchangeBaseUrl: string;
+}
+
+/**
* Some interal error happened in the wallet. This pending operation
* should *only* be reported for problems in the wallet, not when
* a problem with a merchant/exchange/etc. occurs.
diff --git a/packages/taler-wallet-core/src/util/time.ts b/packages/taler-wallet-core/src/util/time.ts
index 1641924a1..512d5e908 100644
--- a/packages/taler-wallet-core/src/util/time.ts
+++ b/packages/taler-wallet-core/src/util/time.ts
@@ -89,22 +89,25 @@ export function timestampMax(t1: Timestamp, t2: Timestamp): Timestamp {
const SECONDS = 1000
const MINUTES = SECONDS * 60;
const HOURS = MINUTES * 60;
+const DAYS = HOURS * 24;
+const MONTHS = DAYS * 30;
+const YEARS = DAYS * 365;
export function durationFromSpec(spec: {
seconds?: number,
- hours?: number,
minutes?: number,
+ hours?: number,
+ days?: number,
+ months?: number,
+ years?: number,
}): Duration {
let d_ms = 0;
- if (spec.seconds) {
- d_ms += spec.seconds * SECONDS;
- }
- if (spec.minutes) {
- d_ms += spec.minutes * MINUTES;
- }
- if (spec.hours) {
- d_ms += spec.hours * HOURS;
- }
+ d_ms += (spec.seconds ?? 0) * SECONDS;
+ d_ms += (spec.minutes ?? 0) * MINUTES;
+ d_ms += (spec.hours ?? 0) * HOURS;
+ d_ms += (spec.days ?? 0) * DAYS;
+ d_ms += (spec.months ?? 0) * MONTHS;
+ d_ms += (spec.years ?? 0) * YEARS;
return { d_ms };
}
diff --git a/packages/taler-wallet-core/src/wallet.ts b/packages/taler-wallet-core/src/wallet.ts
index b448df648..5ca3581ad 100644
--- a/packages/taler-wallet-core/src/wallet.ts
+++ b/packages/taler-wallet-core/src/wallet.ts
@@ -110,7 +110,7 @@ import {
import { InternalWalletState } from "./operations/state";
import { createReserve } from "./operations/reserves";
-import { processRefreshGroup, createRefreshGroup } from "./operations/refresh";
+import { processRefreshGroup, createRefreshGroup, autoRefresh } from "./operations/refresh";
import { processWithdrawGroup } from "./operations/withdraw";
import { getPendingOperations } from "./operations/pending";
import { getBalances } from "./operations/balance";
@@ -267,6 +267,9 @@ export class Wallet {
case PendingOperationType.Recoup:
await processRecoupGroup(this.ws, pending.recoupGroupId, forceNow);
break;
+ case PendingOperationType.ExchangeCheckRefresh:
+ await autoRefresh(this.ws, pending.exchangeBaseUrl)
+ break;
default:
assertUnreachable(pending);
}