aboutsummaryrefslogtreecommitdiff
path: root/src/webex/wxBackend.ts
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2019-09-05 16:10:53 +0200
committerFlorian Dold <florian.dold@gmail.com>2019-09-05 16:10:53 +0200
commit8144b0f5535c3d00c1e508cddce3cd88a153a581 (patch)
treefadefd8febe8574a7e46bf6ffd2b1b89b3a58b55 /src/webex/wxBackend.ts
parentfab4e338968b619710e1652f78534a98de2d68d3 (diff)
downloadwallet-core-8144b0f5535c3d00c1e508cddce3cd88a153a581.tar.xz
welcome page with error diagnostics / react refactoring
Diffstat (limited to 'src/webex/wxBackend.ts')
-rw-r--r--src/webex/wxBackend.ts88
1 files changed, 62 insertions, 26 deletions
diff --git a/src/webex/wxBackend.ts b/src/webex/wxBackend.ts
index ea43f65c2..0cfaf2346 100644
--- a/src/webex/wxBackend.ts
+++ b/src/webex/wxBackend.ts
@@ -25,40 +25,34 @@
*/
import { BrowserHttpLib } from "../http";
import * as logging from "../logging";
-
import { AmountJson } from "../amounts";
-
import {
ConfirmReserveRequest,
CreateReserveRequest,
Notifier,
ReturnCoinsRequest,
+ WalletDiagnostics,
} from "../walletTypes";
-
import { Wallet } from "../wallet";
-
import { isFirefox } from "./compat";
-
-import { PurchaseRecord, WALLET_DB_VERSION } from "../dbTypes";
-
+import { WALLET_DB_VERSION } from "../dbTypes";
import { openTalerDb, exportDb, importDb, deleteDb } from "../db";
-
import { ChromeBadge } from "./chromeBadge";
import { MessageType } from "./messages";
import * as wxApi from "./wxApi";
-
import URI = require("urijs");
import Port = chrome.runtime.Port;
import MessageSender = chrome.runtime.MessageSender;
import { BrowserCryptoWorkerFactory } from "../crypto/cryptoApi";
+import { OpenedPromise, openPromise } from "../promiseUtils";
const NeedsWallet = Symbol("NeedsWallet");
-function handleMessage(
+async function handleMessage(
sender: MessageSender,
type: MessageType,
detail: any,
-): any {
+): Promise<any> {
function assertNotFound(t: never): never {
console.error(`Request type ${t as string} unknown`);
console.error(`Request detail was ${detail}`);
@@ -251,7 +245,7 @@ function handleMessage(
const resp: wxApi.UpgradeResponse = {
currentDbVersion: WALLET_DB_VERSION.toString(),
dbResetRequired,
- oldDbVersion: (oldDbVersion || "unknown").toString(),
+ oldDbVersion: (outdatedDbVersion || "unknown").toString(),
};
return resp;
}
@@ -314,6 +308,39 @@ function handleMessage(
detail.selectedExchange,
);
}
+ case "get-diagnostics": {
+ const manifestData = chrome.runtime.getManifest();
+ const errors: string[] = [];
+ let firefoxIdbProblem = false;
+ let dbOutdated = false;
+ try {
+ await walletInit.promise;
+ } catch (e) {
+ errors.push("Error during wallet initialization: " + e);
+ if (currentDatabase === undefined && outdatedDbVersion === undefined && isFirefox()) {
+ firefoxIdbProblem = true;
+ }
+ }
+ if (!currentWallet) {
+ errors.push("Could not create wallet backend.");
+ }
+ if (!currentDatabase) {
+ errors.push("Could not open database");
+ }
+ if (outdatedDbVersion !== undefined) {
+ errors.push(`Outdated DB version: ${outdatedDbVersion}`);
+ dbOutdated = true;
+ }
+ const diagnostics: WalletDiagnostics = {
+ walletManifestDisplayVersion:
+ manifestData.version_name || "(undefined)",
+ walletManifestVersion: manifestData.version,
+ errors,
+ firefoxIdbProblem,
+ dbOutdated,
+ };
+ return diagnostics;
+ }
case "prepare-pay":
return needsWallet().preparePay(detail.talerPayUri);
default:
@@ -351,7 +378,7 @@ async function dispatch(
error: {
message: e.message,
stack,
- }
+ },
});
} catch (e) {
console.log(e);
@@ -441,26 +468,24 @@ function makeSyncWalletRedirect(
return { redirectUrl: outerUrl.href() };
}
-// Rate limit cache for executePayment operations, to break redirect loops
-let rateLimitCache: { [n: number]: number } = {};
-
-function clearRateLimitCache() {
- rateLimitCache = {};
-}
-
/**
* Currently active wallet instance. Might be unloaded and
* re-instantiated when the database is reset.
*/
let currentWallet: Wallet | undefined;
+let currentDatabase: IDBDatabase | undefined;
+
/**
* Last version if an outdated DB, if applicable.
*/
-let oldDbVersion: number | undefined;
+let outdatedDbVersion: number | undefined;
+
+let walletInit: OpenedPromise<void> = openPromise<void>();
function handleUpgradeUnsupported(oldDbVersion: number, newDbVersion: number) {
console.log("DB migration not supported");
+ outdatedDbVersion = oldDbVersion;
chrome.tabs.create({
url: chrome.extension.getURL("/src/webex/pages/reset-required.html"),
});
@@ -473,20 +498,25 @@ async function reinitWallet() {
currentWallet.stop();
currentWallet = undefined;
}
+ currentDatabase = undefined;
setBadgeText({ text: "" });
const badge = new ChromeBadge();
- let db: IDBDatabase;
try {
- db = await openTalerDb(indexedDB, reinitWallet, handleUpgradeUnsupported);
+ currentDatabase = await openTalerDb(
+ indexedDB,
+ reinitWallet,
+ handleUpgradeUnsupported,
+ );
} catch (e) {
console.error("could not open database", e);
+ walletInit.reject(e);
return;
}
const http = new BrowserHttpLib();
const notifier = new ChromeNotifier();
console.log("setting wallet");
const wallet = new Wallet(
- db,
+ currentDatabase,
http,
badge,
notifier,
@@ -495,6 +525,7 @@ async function reinitWallet() {
// Useful for debugging in the background page.
(window as any).talerWallet = wallet;
currentWallet = wallet;
+ walletInit.resolve();
}
/**
@@ -528,6 +559,13 @@ function injectScript(
* Sets up all event handlers and other machinery.
*/
export async function wxMain() {
+ chrome.runtime.onInstalled.addListener(details => {
+ if (details.reason === "install") {
+ const url = chrome.extension.getURL("/src/webex/pages/welcome.html");
+ chrome.tabs.create({ active: true, url: url });
+ }
+ });
+
// Explicitly unload the extension page as soon as an update is available,
// so the update gets installed as soon as possible.
chrome.runtime.onUpdateAvailable.addListener(details => {
@@ -630,8 +668,6 @@ export async function wxMain() {
tabTimers[tabId] = timers;
});
- chrome.extension.getBackgroundPage()!.setInterval(clearRateLimitCache, 5000);
-
reinitWallet();
// Handlers for messages coming directly from the content