aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/crypto/cryptoApi.ts2
-rw-r--r--src/query.ts30
-rw-r--r--src/wallet.ts30
-rw-r--r--src/webex/notify.ts14
-rw-r--r--src/webex/pages/add-auditor.tsx4
-rw-r--r--src/webex/pages/auditors.tsx6
-rw-r--r--src/webex/pages/confirm-contract.tsx4
-rw-r--r--src/webex/pages/logs.tsx6
-rw-r--r--src/webex/pages/payback.tsx6
-rw-r--r--src/webex/pages/return-coins.tsx6
-rw-r--r--src/webex/pages/tree.tsx6
-rw-r--r--src/webex/wxBackend.ts3
12 files changed, 66 insertions, 51 deletions
diff --git a/src/crypto/cryptoApi.ts b/src/crypto/cryptoApi.ts
index 5300c1370..94083d622 100644
--- a/src/crypto/cryptoApi.ts
+++ b/src/crypto/cryptoApi.ts
@@ -218,7 +218,7 @@ export class CryptoApi {
...args: any[]): Promise<T> {
const start = timer.performanceNow();
- const p = new Promise((resolve, reject) => {
+ const p: Promise<T> = new Promise<T>((resolve, reject) => {
const rpcId = this.nextRpcId++;
const workItem: WorkItem = {operation, args, resolve, reject, rpcId};
diff --git a/src/query.ts b/src/query.ts
index 554f937a5..9889ed13e 100644
--- a/src/query.ts
+++ b/src/query.ts
@@ -127,9 +127,15 @@ export interface QueryStream<T> {
filter(f: (x: T) => boolean): QueryStream<T>;
/**
- * Reduce the stream, resulting in a single value.
+ * Fold the stream, resulting in a single value.
*/
- reduce<S>(f: (v: T, acc?: S) => S, start?: S): Promise<S>;
+ fold<S>(f: (v: T, acc: S) => S, start: S): Promise<S>;
+
+ /**
+ * Execute a function for every value of the stream, for the
+ * side-effects of the function.
+ */
+ forEach(f: (v: T) => void): Promise<void>;
/**
* Map each element of the stream using a function, resulting in another
@@ -324,7 +330,7 @@ abstract class QueryStreamBase<T> implements QueryStream<T> {
.then(() => promise);
}
- reduce<A>(f: (x: any, acc?: A) => A, init?: A): Promise<any> {
+ fold<A>(f: (x: T, acc: A) => A, init: A): Promise<A> {
const {resolve, promise} = openPromise();
let acc = init;
@@ -341,6 +347,22 @@ abstract class QueryStreamBase<T> implements QueryStream<T> {
.then(() => promise);
}
+ forEach(f: (x: T) => void): Promise<void> {
+ const {resolve, promise} = openPromise();
+
+ this.subscribe((isDone, value) => {
+ if (isDone) {
+ resolve();
+ return;
+ }
+ f(value);
+ });
+
+ return Promise.resolve()
+ .then(() => this.root.finish())
+ .then(() => promise);
+ }
+
run(): Promise<void> {
const {resolve, promise} = openPromise();
@@ -699,7 +721,7 @@ export class QueryRoot {
* If the mutation function throws AbortTransaction, the whole transaction will be aborted.
* If the mutation function returns undefined or null, no modification will be made.
*/
- mutate<T>(store: Store<T>, key: any, f: (v: T|undefined) => T|undefined): QueryRoot {
+ mutate<T>(store: Store<T>, key: any, f: (v: T) => T|undefined): QueryRoot {
this.checkFinished();
const doPut = (tx: IDBTransaction) => {
const req = tx.objectStore(store.name).openCursor(IDBKeyRange.only(key));
diff --git a/src/wallet.ts b/src/wallet.ts
index 13f4dc6c2..1966db768 100644
--- a/src/wallet.ts
+++ b/src/wallet.ts
@@ -730,34 +730,34 @@ export class Wallet {
this.q()
.iter(Stores.reserves)
- .reduce((reserve) => {
+ .forEach((reserve) => {
console.log("resuming reserve", reserve.reserve_pub);
this.processReserve(reserve);
});
this.q()
.iter(Stores.precoins)
- .reduce((preCoin) => {
+ .forEach((preCoin) => {
console.log("resuming precoin");
this.processPreCoin(preCoin);
});
this.q()
.iter(Stores.refresh)
- .reduce((r: RefreshSessionRecord) => {
+ .forEach((r: RefreshSessionRecord) => {
this.continueRefreshSession(r);
});
this.q()
.iter(Stores.coinsReturns)
- .reduce((r: CoinsReturnRecord) => {
+ .forEach((r: CoinsReturnRecord) => {
this.depositReturnedCoins(r);
});
// FIXME: optimize via index
this.q()
.iter(Stores.coins)
- .reduce((c: CoinRecord) => {
+ .forEach((c: CoinRecord) => {
if (c.status === CoinStatus.Dirty) {
console.log("resuming pending refresh for coin", c);
this.refresh(c.coinPub);
@@ -1536,7 +1536,6 @@ export class Wallet {
);
let allValid = false;
- let currentPossibleDenoms = possibleDenoms;
let selectedDenoms: DenominationRecord[];
@@ -1561,7 +1560,6 @@ export class Wallet {
nextPossibleDenoms.push(denom);
}
}
- currentPossibleDenoms = nextPossibleDenoms;
} while (selectedDenoms.length > 0 && !allValid);
return selectedDenoms;
@@ -1709,7 +1707,7 @@ export class Wallet {
.iterIndex(Stores.coins.exchangeBaseUrlIndex, exchangeInfo.baseUrl)
.indexJoinLeft(Stores.denominations.exchangeBaseUrlIndex,
(e) => e.exchangeBaseUrl)
- .reduce((cd: JoinLeftResult<CoinRecord, DenominationRecord>,
+ .fold((cd: JoinLeftResult<CoinRecord, DenominationRecord>,
suspendedCoins: CoinRecord[]) => {
if ((!cd.right) || (!cd.right.isOffered)) {
return Array.prototype.concat(suspendedCoins, [cd.left]);
@@ -1718,7 +1716,7 @@ export class Wallet {
}, []));
const q = this.q();
- resultSuspendedCoins.map((c) => {
+ resultSuspendedCoins.map((c: CoinRecord) => {
console.log("suspending coin", c);
c.suspended = true;
q.put(Stores.coins, c);
@@ -1851,7 +1849,7 @@ export class Wallet {
const existingDenoms: {[denomPub: string]: DenominationRecord} = await (
this.q().iterIndex(Stores.denominations.exchangeBaseUrlIndex,
exchangeInfo.baseUrl)
- .reduce((x: DenominationRecord,
+ .fold((x: DenominationRecord,
acc: typeof existingDenoms) => (acc[x.denomPub] = x, acc),
{})
);
@@ -1995,19 +1993,19 @@ export class Wallet {
.iter(Stores.exchanges)
.indexJoin(Stores.denominations.exchangeBaseUrlIndex,
(x) => x.baseUrl)
- .reduce(collectSmallestWithdraw, {}));
+ .fold(collectSmallestWithdraw, {}));
const tx = this.q();
tx.iter(Stores.coins)
- .reduce(collectBalances, balanceStore);
+ .fold(collectBalances, balanceStore);
tx.iter(Stores.refresh)
- .reduce(collectPendingRefresh, balanceStore);
+ .fold(collectPendingRefresh, balanceStore);
tx.iter(Stores.reserves)
- .reduce(collectPendingWithdraw, balanceStore);
+ .fold(collectPendingWithdraw, balanceStore);
tx.iter(Stores.reserves)
- .reduce(collectPaybacks, balanceStore);
+ .fold(collectPaybacks, balanceStore);
tx.iter(Stores.purchases)
- .reduce(collectPayments, balanceStore);
+ .fold(collectPayments, balanceStore);
await tx.finish();
return balanceStore;
}
diff --git a/src/webex/notify.ts b/src/webex/notify.ts
index 0531717b8..1da8af1cd 100644
--- a/src/webex/notify.ts
+++ b/src/webex/notify.ts
@@ -49,7 +49,7 @@ if (document.documentElement.getAttribute("data-taler-nojs")) {
interface Handler {
type: string;
- listener: (e: CustomEvent) => void|Promise<void>;
+ listener: (e: Event) => void|Promise<void>;
}
const handlers: Handler[] = [];
@@ -230,13 +230,6 @@ async function processProposal(proposal: any) {
return;
}
- let merchantName = "(unknown)";
- try {
- merchantName = proposal.data.merchant.name;
- } catch (e) {
- // bad contract / name not included
- }
-
const proposalId = await wxApi.saveProposal({
contractTerms: proposal.data,
contractTermsHash: proposal.hash,
@@ -400,7 +393,10 @@ function registerHandlers() {
* handles adding sequence numbers to responses.
*/
function addHandler(type: string, handler: HandlerFn) {
- const handlerWrap = (e: CustomEvent) => {
+ const handlerWrap = (e: Event) => {
+ if (!(e instanceof CustomEvent)) {
+ throw Error(`invariant violated`);
+ }
if (e.type !== type) {
throw Error(`invariant violated`);
}
diff --git a/src/webex/pages/add-auditor.tsx b/src/webex/pages/add-auditor.tsx
index dbe761a5f..4b898b13c 100644
--- a/src/webex/pages/add-auditor.tsx
+++ b/src/webex/pages/add-auditor.tsx
@@ -44,8 +44,8 @@ interface ConfirmAuditorProps {
class ConfirmAuditor extends ImplicitStateComponent<ConfirmAuditorProps> {
private addDone: StateHolder<boolean> = this.makeState(false);
- constructor() {
- super();
+ constructor(props: ConfirmAuditorProps) {
+ super(props);
}
async add() {
diff --git a/src/webex/pages/auditors.tsx b/src/webex/pages/auditors.tsx
index 8850cdd87..9d57218ad 100644
--- a/src/webex/pages/auditors.tsx
+++ b/src/webex/pages/auditors.tsx
@@ -39,9 +39,9 @@ interface CurrencyListState {
currencies?: CurrencyRecord[];
}
-class CurrencyList extends React.Component<any, CurrencyListState> {
- constructor() {
- super();
+class CurrencyList extends React.Component<{}, CurrencyListState> {
+ constructor(props: {}) {
+ super(props);
const port = chrome.runtime.connect();
port.onMessage.addListener((msg: any) => {
if (msg.notify) {
diff --git a/src/webex/pages/confirm-contract.tsx b/src/webex/pages/confirm-contract.tsx
index f2e22bec4..e41b0a1df 100644
--- a/src/webex/pages/confirm-contract.tsx
+++ b/src/webex/pages/confirm-contract.tsx
@@ -118,8 +118,8 @@ interface ContractPromptState {
}
class ContractPrompt extends React.Component<ContractPromptProps, ContractPromptState> {
- constructor() {
- super();
+ constructor(props: ContractPromptProps) {
+ super(props);
this.state = {
alreadyPaid: false,
error: null,
diff --git a/src/webex/pages/logs.tsx b/src/webex/pages/logs.tsx
index 2853b2a06..c4fe670a2 100644
--- a/src/webex/pages/logs.tsx
+++ b/src/webex/pages/logs.tsx
@@ -55,9 +55,9 @@ interface LogsState {
logs: LogEntry[]|undefined;
}
-class Logs extends React.Component<any, LogsState> {
- constructor() {
- super();
+class Logs extends React.Component<{}, LogsState> {
+ constructor(props: {}) {
+ super({});
this.update();
this.state = {} as any;
}
diff --git a/src/webex/pages/payback.tsx b/src/webex/pages/payback.tsx
index c2a092460..a380a33d0 100644
--- a/src/webex/pages/payback.tsx
+++ b/src/webex/pages/payback.tsx
@@ -38,10 +38,10 @@ import {
import * as React from "react";
import * as ReactDOM from "react-dom";
-class Payback extends ImplicitStateComponent<any> {
+class Payback extends ImplicitStateComponent<{}> {
private reserves: StateHolder<ReserveRecord[]|null> = this.makeState(null);
- constructor() {
- super();
+ constructor(props: {}) {
+ super(props);
const port = chrome.runtime.connect();
port.onMessage.addListener((msg: any) => {
if (msg.notify) {
diff --git a/src/webex/pages/return-coins.tsx b/src/webex/pages/return-coins.tsx
index 453ae4784..5bcb2252a 100644
--- a/src/webex/pages/return-coins.tsx
+++ b/src/webex/pages/return-coins.tsx
@@ -189,9 +189,9 @@ interface ReturnCoinsState {
lastConfirmedDetail: SelectedDetail | undefined;
}
-class ReturnCoins extends React.Component<any, ReturnCoinsState> {
- constructor() {
- super();
+class ReturnCoins extends React.Component<{}, ReturnCoinsState> {
+ constructor(props: {}) {
+ super(props);
const port = chrome.runtime.connect();
port.onMessage.addListener((msg: any) => {
if (msg.notify) {
diff --git a/src/webex/pages/tree.tsx b/src/webex/pages/tree.tsx
index c8035c597..2ac0b8631 100644
--- a/src/webex/pages/tree.tsx
+++ b/src/webex/pages/tree.tsx
@@ -360,9 +360,9 @@ interface ExchangesListState {
exchanges?: ExchangeRecord[];
}
-class ExchangesList extends React.Component<any, ExchangesListState> {
- constructor() {
- super();
+class ExchangesList extends React.Component<{}, ExchangesListState> {
+ constructor(props: {}) {
+ super(props);
const port = chrome.runtime.connect();
port.onMessage.addListener((msg: any) => {
if (msg.notify) {
diff --git a/src/webex/wxBackend.ts b/src/webex/wxBackend.ts
index a17f516a8..fd5df7e47 100644
--- a/src/webex/wxBackend.ts
+++ b/src/webex/wxBackend.ts
@@ -497,9 +497,8 @@ function handleBankRequest(wallet: Wallet, headerList: chrome.webRequest.HttpHea
console.log("202 not understood (X-Taler-Callback-Url missing)");
return;
}
- let amountParsed;
try {
- amountParsed = JSON.parse(amount);
+ JSON.parse(amount);
} catch (e) {
const errUri = new URI(chrome.extension.getURL("/src/webex/pages/error.html"));
const p = {