gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-wallet-core] branch master updated (9f6e3988 -> cea0ac02)


From: gnunet
Subject: [taler-wallet-core] branch master updated (9f6e3988 -> cea0ac02)
Date: Thu, 13 Jan 2022 05:34:26 +0100

This is an automated email from the git hooks/post-receive script.

sebasjm pushed a change to branch master
in repository wallet-core.

    from 9f6e3988 do withdrawal with fewer DB accesses
     new 5eeb00e1 importDb feature in wallet core
     new f6ec105b fixing high cpu usage after some time
     new 4b289cde adding a max timeout since retry counter can be very high
     new cea0ac02 import db from the wallet web extension

The 4 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 packages/taler-util/src/walletTypes.ts             |  8 ++++
 packages/taler-wallet-core/src/db.ts               | 51 +++++++++++++++++-----
 .../taler-wallet-core/src/operations/exchanges.ts  | 13 +++---
 .../taler-wallet-core/src/operations/pending.ts    | 11 +----
 packages/taler-wallet-core/src/util/retries.ts     |  9 +++-
 packages/taler-wallet-core/src/wallet.ts           |  7 +++
 .../src/popup/DeveloperPage.tsx                    | 27 +++++++++++-
 .../src/wallet/DepositPage.tsx                     | 18 ++++----
 packages/taler-wallet-webextension/src/wxApi.ts    |  4 ++
 9 files changed, 109 insertions(+), 39 deletions(-)

diff --git a/packages/taler-util/src/walletTypes.ts 
b/packages/taler-util/src/walletTypes.ts
index 4158dde9..4a871e74 100644
--- a/packages/taler-util/src/walletTypes.ts
+++ b/packages/taler-util/src/walletTypes.ts
@@ -1088,3 +1088,11 @@ export const codecForWithdrawFakebankRequest = (): 
Codec<WithdrawFakebankRequest
     .property("bank", codecForString())
     .property("exchange", codecForString())
     .build("WithdrawFakebankRequest");
+
+export interface ImportDb {
+  dump: any;
+}
+export const codecForImportDbRequest = (): Codec<ImportDb> =>
+  buildCodecForObject<ImportDb>()
+    .property("dump", codecForAny())
+    .build("ImportDbRequest")
diff --git a/packages/taler-wallet-core/src/db.ts 
b/packages/taler-wallet-core/src/db.ts
index 0b2d16ae..c3d67d7c 100644
--- a/packages/taler-wallet-core/src/db.ts
+++ b/packages/taler-wallet-core/src/db.ts
@@ -1294,9 +1294,9 @@ export const WALLET_BACKUP_STATE_KEY = 
"walletBackupState";
  */
 export type ConfigRecord =
   | {
-      key: typeof WALLET_BACKUP_STATE_KEY;
-      value: WalletBackupConfState;
-    }
+    key: typeof WALLET_BACKUP_STATE_KEY;
+    value: WalletBackupConfState;
+  }
   | { key: "currencyDefaultsApplied"; value: boolean };
 
 export interface WalletBackupConfState {
@@ -1480,17 +1480,17 @@ export enum BackupProviderStateTag {
 
 export type BackupProviderState =
   | {
-      tag: BackupProviderStateTag.Provisional;
-    }
+    tag: BackupProviderStateTag.Provisional;
+  }
   | {
-      tag: BackupProviderStateTag.Ready;
-      nextBackupTimestamp: Timestamp;
-    }
+    tag: BackupProviderStateTag.Ready;
+    nextBackupTimestamp: Timestamp;
+  }
   | {
-      tag: BackupProviderStateTag.Retrying;
-      retryInfo: RetryInfo;
-      lastError?: TalerErrorDetails;
-    };
+    tag: BackupProviderStateTag.Retrying;
+    retryInfo: RetryInfo;
+    lastError?: TalerErrorDetails;
+  };
 
 export interface BackupProviderTerms {
   supportedProtocolVersion: string;
@@ -1873,3 +1873,30 @@ export function exportDb(db: IDBDatabase): Promise<any> {
     }
   });
 }
+
+export interface DatabaseDump {
+  name: string,
+  stores: { [s: string]: any },
+  version: string,
+}
+
+export function importDb(db: IDBDatabase, dump: DatabaseDump): Promise<any> {
+  return new Promise((resolve, reject) => {
+    const tx = db.transaction(Array.from(db.objectStoreNames), "readwrite");
+    tx.addEventListener("complete", () => {
+      tx.commit();
+      resolve(db);
+    });
+    for (let i = 0; i < db.objectStoreNames.length; i++) {
+      const name = db.objectStoreNames[i];
+      const storeDump = dump.stores[name];
+      if (!storeDump) continue;
+      Object.keys(storeDump).forEach(async key => {
+        const value = storeDump[key]
+        if (!value) return;
+        tx.objectStore(name).put(value)
+      })
+
+    }
+  });
+}
diff --git a/packages/taler-wallet-core/src/operations/exchanges.ts 
b/packages/taler-wallet-core/src/operations/exchanges.ts
index 2975c860..c14f2765 100644
--- a/packages/taler-wallet-core/src/operations/exchanges.ts
+++ b/packages/taler-wallet-core/src/operations/exchanges.ts
@@ -123,7 +123,7 @@ async function handleExchangeUpdateError(
 ): Promise<void> {
   await ws.db
     .mktx((x) => ({ exchanges: x.exchanges }))
-    .runReadOnly(async (tx) => {
+    .runReadWrite(async (tx) => {
       const exchange = await tx.exchanges.get(baseUrl);
       if (!exchange) {
         return;
@@ -131,6 +131,7 @@ async function handleExchangeUpdateError(
       exchange.retryInfo.retryCounter++;
       updateRetryInfoTimeout(exchange.retryInfo);
       exchange.lastError = err;
+      await tx.exchanges.put(exchange)
     });
   if (err) {
     ws.notify({ type: NotificationType.ExchangeOperationError, error: err });
@@ -526,11 +527,11 @@ async function updateExchangeFromUrlImpl(
     tosFound !== undefined
       ? tosFound
       : await downloadExchangeWithTermsOfService(
-          baseUrl,
-          ws.http,
-          timeout,
-          "text/plain",
-        );
+        baseUrl,
+        ws.http,
+        timeout,
+        "text/plain",
+      );
 
   let recoupGroupId: string | undefined = undefined;
 
diff --git a/packages/taler-wallet-core/src/operations/pending.ts 
b/packages/taler-wallet-core/src/operations/pending.ts
index 99d27583..b2f13625 100644
--- a/packages/taler-wallet-core/src/operations/pending.ts
+++ b/packages/taler-wallet-core/src/operations/pending.ts
@@ -51,25 +51,18 @@ async function gatherExchangePending(
   resp: PendingOperationsResponse,
 ): Promise<void> {
   await tx.exchanges.iter().forEachAsync(async (e) => {
-    let exchangeUpdateTimestampDue: Timestamp;
-
-    if (e.lastError) {
-      exchangeUpdateTimestampDue = e.retryInfo.nextRetry;
-    } else {
-      exchangeUpdateTimestampDue = e.nextUpdate;
-    }
 
     resp.pendingOperations.push({
       type: PendingTaskType.ExchangeUpdate,
       givesLifeness: false,
-      timestampDue: exchangeUpdateTimestampDue,
+      timestampDue: e.lastError ? e.retryInfo.nextRetry : e.nextUpdate,
       exchangeBaseUrl: e.baseUrl,
       lastError: e.lastError,
     });
 
     resp.pendingOperations.push({
       type: PendingTaskType.ExchangeCheckRefresh,
-      timestampDue: e.nextRefreshCheck,
+      timestampDue: e.lastError ? e.retryInfo.nextRetry : e.nextRefreshCheck,
       givesLifeness: false,
       exchangeBaseUrl: e.baseUrl,
     });
diff --git a/packages/taler-wallet-core/src/util/retries.ts 
b/packages/taler-wallet-core/src/util/retries.ts
index cac7b1b5..8dec22be 100644
--- a/packages/taler-wallet-core/src/util/retries.ts
+++ b/packages/taler-wallet-core/src/util/retries.ts
@@ -32,11 +32,13 @@ export interface RetryInfo {
 export interface RetryPolicy {
   readonly backoffDelta: Duration;
   readonly backoffBase: number;
+  readonly maxTimeout: Duration;
 }
 
 const defaultRetryPolicy: RetryPolicy = {
   backoffBase: 1.5,
   backoffDelta: { d_ms: 200 },
+  maxTimeout: { d_ms: 6000 },
 };
 
 export function updateRetryInfoTimeout(
@@ -51,8 +53,11 @@ export function updateRetryInfoTimeout(
     r.nextRetry = { t_ms: "never" };
     return;
   }
+
+  const nextIncrement = p.backoffDelta.d_ms * Math.pow(p.backoffBase, 
r.retryCounter)
+
   const t =
-    now.t_ms + p.backoffDelta.d_ms * Math.pow(p.backoffBase, r.retryCounter);
+    now.t_ms + (p.maxTimeout.d_ms === "forever" ? nextIncrement : 
Math.min(p.maxTimeout.d_ms, nextIncrement));
   r.nextRetry = { t_ms: t };
 }
 
@@ -68,7 +73,7 @@ export function getRetryDuration(
     return { d_ms: "forever" };
   }
   const t = p.backoffDelta.d_ms * Math.pow(p.backoffBase, r.retryCounter);
-  return { d_ms: t };
+  return { d_ms: p.maxTimeout.d_ms === "forever" ? t : 
Math.min(p.maxTimeout.d_ms, t) };
 }
 
 export function initRetryInfo(
diff --git a/packages/taler-wallet-core/src/wallet.ts 
b/packages/taler-wallet-core/src/wallet.ts
index 2f94d5e8..3d83ec21 100644
--- a/packages/taler-wallet-core/src/wallet.ts
+++ b/packages/taler-wallet-core/src/wallet.ts
@@ -45,6 +45,7 @@ import {
   PaytoUri,
   codecForGetFeeForDeposit,
   codecForListKnownBankAccounts,
+  codecForImportDbRequest,
 } from "@gnu-taler/taler-util";
 import {
   addBackupProvider,
@@ -130,6 +131,7 @@ import {
   AuditorTrustRecord,
   CoinSourceType,
   exportDb,
+  importDb,
   ReserveRecordStatus,
   WalletStoresV1,
 } from "./db.js";
@@ -997,6 +999,11 @@ async function dispatchRequestInternal(
       const dbDump = await exportDb(ws.db.idbHandle());
       return dbDump;
     }
+    case "importDb": {
+      const req = codecForImportDbRequest().decode(payload);
+      await importDb(ws.db.idbHandle(), req.dump);
+      return [];
+    }
   }
   throw OperationFailedError.fromCode(
     TalerErrorCode.WALLET_CORE_API_OPERATION_UNKNOWN,
diff --git a/packages/taler-wallet-webextension/src/popup/DeveloperPage.tsx 
b/packages/taler-wallet-webextension/src/popup/DeveloperPage.tsx
index 840398a4..ea87ba01 100644
--- a/packages/taler-wallet-webextension/src/popup/DeveloperPage.tsx
+++ b/packages/taler-wallet-webextension/src/popup/DeveloperPage.tsx
@@ -18,7 +18,7 @@ import { NotificationType } from "@gnu-taler/taler-util";
 import { PendingTaskInfo } from "@gnu-taler/taler-wallet-core";
 import { format } from "date-fns";
 import { Fragment, h, VNode } from "preact";
-import { useState } from "preact/hooks";
+import { useRef, useState } from "preact/hooks";
 import { Diagnostics } from "../components/Diagnostics";
 import { NotifyUpdateFadeOut } from "../components/styled";
 import { Time } from "../components/Time";
@@ -83,11 +83,34 @@ export function View({
       content,
     });
   }
+  const fileRef = useRef<HTMLInputElement>(null);
+  async function onImportDatabase(str: string): Promise<void> {
+    return wxApi.importDB(JSON.parse(str));
+  }
   return (
     <div>
       <p>Debug tools:</p>
       <button onClick={confirmReset}>reset</button>
       <br />
+      <button onClick={() => fileRef?.current?.click()}>import 
database</button>
+      <input
+        ref={fileRef}
+        style={{ display: "none" }}
+        type="file"
+        onChange={async (e) => {
+          const f: FileList | null = e.currentTarget.files;
+          if (!f || f.length != 1) {
+            return Promise.reject();
+          }
+          const buf = await f[0].arrayBuffer();
+          const str = new Uint8Array(buf).reduce(
+            (data, byte) => data + String.fromCharCode(byte),
+            "",
+          );
+          return onImportDatabase(str);
+        }}
+      />
+      <br />
       <button onClick={onExportDatabase}>export database</button>
       {downloadedDatabase && (
         <div>
@@ -152,6 +175,8 @@ export function reload(): void {
   }
 }
 
+function runIntegrationTest() {}
+
 export async function confirmReset(): Promise<void> {
   if (
     confirm(
diff --git a/packages/taler-wallet-webextension/src/wallet/DepositPage.tsx 
b/packages/taler-wallet-webextension/src/wallet/DepositPage.tsx
index 9e15daa9..abe830e8 100644
--- a/packages/taler-wallet-webextension/src/wallet/DepositPage.tsx
+++ b/packages/taler-wallet-webextension/src/wallet/DepositPage.tsx
@@ -110,7 +110,6 @@ export function View({
     setAmount(num);
     setFee(undefined);
   }
-  const feeHasBeenCalculated = fee !== undefined;
   const currency = balance.currency;
   const amountStr: AmountString = `${currency}:${amount}`;
   const feeSum =
@@ -151,7 +150,7 @@ export function View({
     : !parsedAmount
     ? "Invalid amount"
     : Amounts.cmp(balance, parsedAmount) === -1
-    ? `To much, your current balance is ${Amounts.stringifyValue(balance)}`
+    ? `Too much, your current balance is ${Amounts.stringifyValue(balance)}`
     : undefined;
 
   const totalToDeposit = parsedAmount
@@ -159,7 +158,7 @@ export function View({
     : Amounts.getZero(currency);
 
   const unableToDeposit =
-    Amounts.isZero(totalToDeposit) && feeHasBeenCalculated;
+    Amounts.isZero(totalToDeposit) || fee === undefined || error !== undefined;
 
   return (
     <Fragment>
@@ -224,12 +223,13 @@ export function View({
       </section>
       <footer>
         <div />
-        <ButtonPrimary
-          disabled={unableToDeposit}
-          onClick={() => onSend(accountURI, amountStr)}
-        >
-          Deposit {Amounts.stringifyValue(totalToDeposit)} {currency}
-        </ButtonPrimary>
+        {unableToDeposit ? (
+          <ButtonPrimary disabled>Deposit</ButtonPrimary>
+        ) : (
+          <ButtonPrimary onClick={() => onSend(accountURI, amountStr)}>
+            Deposit {Amounts.stringifyValue(totalToDeposit)} {currency}
+          </ButtonPrimary>
+        )}
       </footer>
     </Fragment>
   );
diff --git a/packages/taler-wallet-webextension/src/wxApi.ts 
b/packages/taler-wallet-webextension/src/wxApi.ts
index dc96efc7..d02a017a 100644
--- a/packages/taler-wallet-webextension/src/wxApi.ts
+++ b/packages/taler-wallet-webextension/src/wxApi.ts
@@ -376,6 +376,10 @@ export function exportDB(): Promise<any> {
   return callBackend("exportDb", {});
 }
 
+export function importDB(dump: any): Promise<void> {
+  return callBackend("importDb", { dump })
+}
+
 export function onUpdateNotification(messageTypes: Array<NotificationType>, 
doCallback: () => void): () => void {
   // eslint-disable-next-line no-undef
   const port = chrome.runtime.connect({ name: "notifications" });

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]