From c3c0f3bfbb700f617c4fdfa0926c4ce5289c4449 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Mon, 11 Apr 2022 15:11:44 -0300 Subject: using alarm service intead of timeout api when the wallet is running in a service worker environment --- .../taler-wallet-webextension/src/cta/Withdraw.tsx | 14 +++- .../src/serviceWorkerTimerAPI.ts | 80 ++++++++++++++++++++++ .../taler-wallet-webextension/src/wxBackend.ts | 9 ++- 3 files changed, 100 insertions(+), 3 deletions(-) create mode 100644 packages/taler-wallet-webextension/src/serviceWorkerTimerAPI.ts (limited to 'packages/taler-wallet-webextension') diff --git a/packages/taler-wallet-webextension/src/cta/Withdraw.tsx b/packages/taler-wallet-webextension/src/cta/Withdraw.tsx index 9739e1a47..78e821576 100644 --- a/packages/taler-wallet-webextension/src/cta/Withdraw.tsx +++ b/packages/taler-wallet-webextension/src/cta/Withdraw.tsx @@ -99,6 +99,9 @@ export function useComponentState( undefined, ); + /** + * Ask the wallet about the withdraw URI + */ const uriInfoHook = useAsyncAsHook(async () => { if (!talerWithdrawUri) throw Error("ERROR_NO-URI-FOR-WITHDRAWAL"); @@ -110,6 +113,9 @@ export function useComponentState( return { uriInfo, knownExchanges }; }); + /** + * Get the amount and select one exchange + */ const exchangeAndAmount = useAsyncAsHook( async () => { if (!uriInfoHook || uriInfoHook.hasError || !uriInfoHook.response) return; @@ -136,6 +142,9 @@ export function useComponentState( [!uriInfoHook || uriInfoHook.hasError ? undefined : uriInfoHook], ); + /** + * For the exchange selected, bring the status of the terms of service + */ const terms = useAsyncAsHook( async () => { if ( @@ -159,6 +168,10 @@ export function useComponentState( ], ); + /** + * With the exchange and amount, ask the wallet the information + * about the withdrawal + */ const info = useAsyncAsHook( async () => { if ( @@ -466,7 +479,6 @@ export function WithdrawPage({ talerWithdrawUri }: Props): VNode { return ; } - console.log(state); if (state.status === "loading-uri") { if (!state.hook) return ; diff --git a/packages/taler-wallet-webextension/src/serviceWorkerTimerAPI.ts b/packages/taler-wallet-webextension/src/serviceWorkerTimerAPI.ts new file mode 100644 index 000000000..f2b6ee7a2 --- /dev/null +++ b/packages/taler-wallet-webextension/src/serviceWorkerTimerAPI.ts @@ -0,0 +1,80 @@ +/* + This file is part of GNU Taler + (C) 2020 Taler Systems S.A. + + GNU Taler is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + GNU Taler; see the file COPYING. If not, see + */ + +/** + * Imports. + */ +import { Duration, Logger } from "@gnu-taler/taler-util"; +import { TimerAPI, TimerGroup, TimerHandle } from "@gnu-taler/taler-wallet-core/src/util/timer"; + + +const nullTimerHandle = { + clear() { + // do nothing + return; + }, + unref() { + // do nothing + return; + }, +}; + +const logger = new Logger("ServiceWorkerTimerGroup.ts"); +/** + * Implementation of [[TimerAPI]] using alarm API + */ +export class ServiceWorkerTimerAPI implements TimerAPI { + + /** + * Call a function every time the delay given in milliseconds passes. + */ + every(delayMs: number, callback: () => void): TimerHandle { + const seconds = delayMs / 1000; + const periodInMinutes = Math.round(seconds < 61 ? 1 : seconds / 60); + + chrome.alarms.create("wallet-worker", { periodInMinutes }) + chrome.alarms.onAlarm.addListener(callback) + + return new AlarmHandle(); + } + + /** + * Call a function after the delay given in milliseconds passes. + */ + after(delayMs: number, callback: () => void): TimerHandle { + const seconds = delayMs / 1000; + const delayInMinutes = Math.round(seconds < 61 ? 1 : seconds / 60); + + chrome.alarms.create("wallet-worker", { delayInMinutes }) + chrome.alarms.onAlarm.addListener(callback) + return new AlarmHandle(); + } + +} + +class AlarmHandle implements TimerHandle { + + clear(): void { + chrome.alarms.clear("wallet-worker", (result) => { + logger.info(`Alarm 'wallet-worker' was cleared: ${result}`) + }) + return; + } + unref(): void { + return; + } + +} diff --git a/packages/taler-wallet-webextension/src/wxBackend.ts b/packages/taler-wallet-webextension/src/wxBackend.ts index 7401fd4fa..91c12c578 100644 --- a/packages/taler-wallet-webextension/src/wxBackend.ts +++ b/packages/taler-wallet-webextension/src/wxBackend.ts @@ -40,12 +40,14 @@ import { Wallet, WalletStoresV1 } from "@gnu-taler/taler-wallet-core"; +import { SetTimeoutTimerAPI, TimerGroup } from "@gnu-taler/taler-wallet-core/src/util/timer"; import { BrowserCryptoWorkerFactory } from "./browserCryptoWorkerFactory.js"; import { BrowserHttpLib } from "./browserHttpLib.js"; import { getReadRequestPermissions } from "./permissions.js"; import { MessageFromBackend, platform } from "./platform/api.js"; import { SynchronousCryptoWorkerFactory } from "./serviceWorkerCryptoWorkerFactory.js"; import { ServiceWorkerHttpLib } from "./serviceWorkerHttpLib.js"; +import { ServiceWorkerTimerAPI } from "./serviceWorkerTimerAPI.js"; /** * Currently active wallet instance. Might be unloaded and @@ -188,17 +190,20 @@ async function reinitWallet(): Promise { } let httpLib; let cryptoWorker; + let timer; if (platform.useServiceWorkerAsBackgroundProcess()) { httpLib = new ServiceWorkerHttpLib(); cryptoWorker = new SynchronousCryptoWorkerFactory(); + timer = new ServiceWorkerTimerAPI(); } else { httpLib = new BrowserHttpLib(); cryptoWorker = new BrowserCryptoWorkerFactory(); + timer = new SetTimeoutTimerAPI(); } console.log("setting wallet"); - const wallet = await Wallet.create(currentDatabase, httpLib, cryptoWorker); + const wallet = await Wallet.create(currentDatabase, httpLib, timer, cryptoWorker); try { await wallet.handleCoreApiRequest("initWallet", "native-init", {}); } catch (e) { @@ -218,7 +223,7 @@ async function reinitWallet(): Promise { (window as any).talerWallet = wallet; } currentWallet = wallet; - walletInit.resolve(); + return walletInit.resolve(); } function parseTalerUriAndRedirect(tabId: number, talerUri: string): void { -- cgit v1.2.3