towards auto-refresh

This commit is contained in:
Florian Dold 2020-09-03 17:29:09 +05:30
parent 8a3ac7f08b
commit 09b5bfe0db
No known key found for this signature in database
GPG Key ID: D2E4F00F29D02A4B
7 changed files with 45 additions and 12 deletions

View File

@ -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,

View File

@ -634,3 +634,8 @@ export async function createRefreshGroup(
refreshGroupId,
};
}
export async function autoRefresh(
ws: InternalWalletState,
exchangeBaseUrl: string,
): Promise<void> {}

View File

@ -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);

View File

@ -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;
}

View File

@ -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
@ -70,6 +72,15 @@ export interface PendingExchangeUpdateOperation {
lastError: TalerErrorDetails | undefined;
}
/**
* 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

View File

@ -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 };
}

View File

@ -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);
}