aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/headless/taler-wallet-cli.ts373
-rw-r--r--src/index.ts2
-rw-r--r--src/webex/wxBackend.ts8
3 files changed, 44 insertions, 339 deletions
diff --git a/src/headless/taler-wallet-cli.ts b/src/headless/taler-wallet-cli.ts
index 49cc608d9..26f4521c5 100644
--- a/src/headless/taler-wallet-cli.ts
+++ b/src/headless/taler-wallet-cli.ts
@@ -14,347 +14,52 @@
TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
-import { MemoryBackend, BridgeIDBFactory, shimIndexedDB } from "idb-bridge";
-import { Wallet } from "../wallet";
-import { Notifier, Badge } from "../walletTypes";
-import { openTalerDb, exportDb } from "../db";
-import { HttpRequestLibrary } from "../http";
-import * as amounts from "../amounts";
-import Axios from "axios";
-
-import URI = require("urijs");
-
-import querystring = require("querystring");
-import { CheckPaymentResponse } from "../talerTypes";
-import { SynchronousCryptoWorkerFactory } from "../crypto/synchronousWorker";
-
-const enableTracing = false;
-
-class ConsoleNotifier implements Notifier {
- notify(): void {
- // nothing to do.
- }
-}
-
-class ConsoleBadge implements Badge {
- startBusy(): void {
- enableTracing && console.log("NOTIFICATION: busy");
- }
- stopBusy(): void {
- enableTracing && console.log("NOTIFICATION: busy end");
- }
- showNotification(): void {
- enableTracing && console.log("NOTIFICATION: show");
- }
- clearNotification(): void {
- enableTracing && console.log("NOTIFICATION: cleared");
- }
-}
-
-export class NodeHttpLib implements HttpRequestLibrary {
- async get(url: string): Promise<import("../http").HttpResponse> {
- enableTracing && console.log("making GET request to", url);
- const resp = await Axios({
- method: "get",
- url: url,
- responseType: "json",
- });
- enableTracing && console.log("got response", resp.data);
- enableTracing && console.log("resp type", typeof resp.data);
- return {
- responseJson: resp.data,
- status: resp.status,
- };
- }
-
- async postJson(
- url: string,
- body: any,
- ): Promise<import("../http").HttpResponse> {
- enableTracing && console.log("making POST request to", url);
- const resp = await Axios({
- method: "post",
- url: url,
- responseType: "json",
- data: body,
- });
- enableTracing && console.log("got response", resp.data);
- enableTracing && console.log("resp type", typeof resp.data);
- return {
- responseJson: resp.data,
- status: resp.status,
- };
- }
-
- async postForm(
- url: string,
- form: any,
- ): Promise<import("../http").HttpResponse> {
- enableTracing && console.log("making POST request to", url);
- const resp = await Axios({
- method: "post",
- url: url,
- data: querystring.stringify(form),
- responseType: "json",
+import commander = require("commander");
+import os = require("os");
+import { getDefaultNodeWallet, withdrawTestBalance } from "./helpers";
+
+const program = new commander.Command();
+program.version("0.0.1");
+
+const walletDbPath = os.homedir + "/" + ".talerwalletdb.json";
+
+program
+ .command("test-withdraw")
+ .description("withdraw test currency from the test bank")
+ .action(async () => {
+ console.log("test-withdraw command called");
+ const wallet = await getDefaultNodeWallet({
+ persistentStoragePath: walletDbPath,
});
- enableTracing && console.log("got response", resp.data);
- enableTracing && console.log("resp type", typeof resp.data);
- return {
- responseJson: resp.data,
- status: resp.status,
- };
- }
-}
-
-interface BankUser {
- username: string;
- password: string;
-}
-
-function makeId(length: number): string {
- let result = "";
- const characters =
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
- for (let i = 0; i < length; i++) {
- result += characters.charAt(Math.floor(Math.random() * characters.length));
- }
- return result;
-}
-
-async function registerBankUser(
- bankBaseUrl: string,
- httpLib: HttpRequestLibrary,
-): Promise<BankUser> {
- const reqUrl = new URI("register").absoluteTo(bankBaseUrl).href();
- const randId = makeId(8);
- const bankUser: BankUser = {
- username: `testuser-${randId}`,
- password: `testpw-${randId}`,
- };
- const result = await httpLib.postForm(reqUrl, bankUser);
- if (result.status != 200) {
- throw Error("could not register bank user");
- }
- return bankUser;
-}
-
-async function createBankReserve(
- bankBaseUrl: string,
- bankUser: BankUser,
- amount: string,
- reservePub: string,
- exchangePaytoUri: string,
- httpLib: HttpRequestLibrary,
-) {
- const reqUrl = new URI("taler/withdraw").absoluteTo(bankBaseUrl).href();
-
- const body = {
- auth: { type: "basic" },
- username: bankUser,
- amount,
- reserve_pub: reservePub,
- exchange_wire_detail: exchangePaytoUri,
- };
-
- const resp = await Axios({
- method: "post",
- url: reqUrl,
- data: body,
- responseType: "json",
- headers: {
- "X-Taler-Bank-Username": bankUser.username,
- "X-Taler-Bank-Password": bankUser.password,
- },
+ await withdrawTestBalance(wallet);
+ process.exit(0);
});
- if (resp.status != 200) {
- throw Error("failed to create bank reserve");
- }
-}
-
-class MerchantBackendConnection {
- constructor(
- public merchantBaseUrl: string,
- public merchantInstance: string,
- public apiKey: string,
- ) {}
-
- async createOrder(
- amount: string,
- summary: string,
- fulfillmentUrl: string,
- ): Promise<{ orderId: string }> {
- const reqUrl = new URI("order").absoluteTo(this.merchantBaseUrl).href();
- const orderReq = {
- order: {
- amount,
- summary,
- fulfillment_url: fulfillmentUrl,
- instance: this.merchantInstance,
- },
- };
- const resp = await Axios({
- method: "post",
- url: reqUrl,
- data: orderReq,
- responseType: "json",
- headers: {
- Authorization: `ApiKey ${this.apiKey}`,
- },
- });
- if (resp.status != 200) {
- throw Error("failed to create bank reserve");
- }
- const orderId = resp.data.order_id;
- if (!orderId) {
- throw Error("no order id in response");
- }
- return { orderId };
- }
-
- async checkPayment(orderId: string): Promise<CheckPaymentResponse> {
- const reqUrl = new URI("check-payment")
- .absoluteTo(this.merchantBaseUrl)
- .href();
- const resp = await Axios({
- method: "get",
- url: reqUrl,
- params: { order_id: orderId, instance: this.merchantInstance },
- responseType: "json",
- headers: {
- Authorization: `ApiKey ${this.apiKey}`,
- },
+program
+ .command("balance", undefined, { isDefault: true })
+ .description("show wallet balance")
+ .action(async () => {
+ console.log("balance command called");
+ const wallet = await getDefaultNodeWallet({
+ persistentStoragePath: walletDbPath,
});
- if (resp.status != 200) {
- throw Error("failed to check payment");
- }
- return CheckPaymentResponse.checked(resp.data);
- }
-}
-
-export async function main() {
- const myNotifier = new ConsoleNotifier();
-
- const myBadge = new ConsoleBadge();
-
- const myBackend = new MemoryBackend();
-
- myBackend.enableTracing = false;
-
- BridgeIDBFactory.enableTracing = false;
-
- const myBridgeIdbFactory = new BridgeIDBFactory(myBackend);
- const myIdbFactory: IDBFactory = (myBridgeIdbFactory as any) as IDBFactory;
-
- const myHttpLib = new NodeHttpLib();
-
- const myVersionChange = () => {
- console.error("version change requested, should not happen");
- throw Error();
- };
-
- const myUnsupportedUpgrade = () => {
- console.error("unsupported database migration");
- throw Error();
- };
-
- shimIndexedDB(myBridgeIdbFactory);
-
- const exchangeBaseUrl = "https://exchange.test.taler.net/";
- const bankBaseUrl = "https://bank.test.taler.net/";
-
- const myDb = await openTalerDb(
- myIdbFactory,
- myVersionChange,
- myUnsupportedUpgrade,
- );
-
- const myWallet = new Wallet(myDb, myHttpLib, myBadge, myNotifier, new SynchronousCryptoWorkerFactory());
- //const myWallet = new Wallet(myDb, myHttpLib, myBadge, myNotifier, new NodeCryptoWorkerFactory());
-
- const reserveResponse = await myWallet.createReserve({
- amount: amounts.parseOrThrow("TESTKUDOS:10.0"),
- exchange: exchangeBaseUrl,
+ const balance = await wallet.getBalances();
+ console.log(JSON.stringify(balance, undefined, 2));
+ process.exit(0);
});
- const bankUser = await registerBankUser(bankBaseUrl, myHttpLib);
-
- console.log("bank user", bankUser);
-
- const exchangePaytoUri = await myWallet.getExchangePaytoUri(
- "https://exchange.test.taler.net/",
- ["x-taler-bank"],
- );
-
- await createBankReserve(
- bankBaseUrl,
- bankUser,
- "TESTKUDOS:10.0",
- reserveResponse.reservePub,
- exchangePaytoUri,
- myHttpLib,
- );
-
- await myWallet.confirmReserve({ reservePub: reserveResponse.reservePub });
-
- await myWallet.processReserve(reserveResponse.reservePub);
-
- console.log("process reserve returned");
-
- const balance = await myWallet.getBalances();
-
- console.log(JSON.stringify(balance, null, 2));
-
- const myMerchant = new MerchantBackendConnection(
- "https://backend.test.taler.net/",
- "default",
- "sandbox",
+// error on unknown commands
+program.on("command:*", function() {
+ console.error(
+ "Invalid command: %s\nSee --help for a list of available commands.",
+ program.args.join(" "),
);
+ process.exit(1);
+});
- const orderResp = await myMerchant.createOrder(
- "TESTKUDOS:5",
- "hello world",
- "https://example.com/",
- );
-
- console.log("created order with orderId", orderResp.orderId);
-
- const paymentStatus = await myMerchant.checkPayment(orderResp.orderId);
-
- console.log("payment status", paymentStatus);
-
- const contractUrl = paymentStatus.contract_url;
- if (!contractUrl) {
- throw Error("no contract URL in payment response");
- }
-
- const proposalId = await myWallet.downloadProposal(contractUrl);
-
- console.log("proposal id", proposalId);
-
- const checkPayResult = await myWallet.checkPay(proposalId);
-
- console.log("check pay result", checkPayResult);
+program.parse(process.argv);
- const confirmPayResult = await myWallet.confirmPay(proposalId, undefined);
-
- console.log("confirmPayResult", confirmPayResult);
-
- const paymentStatus2 = await myMerchant.checkPayment(orderResp.orderId);
-
- console.log("payment status after wallet payment:", paymentStatus2);
-
- if (!paymentStatus2.paid) {
- throw Error("payment did not succeed");
- }
-
- myWallet.stop();
-}
-
-
-if (require.main === module) {
- main().catch(err => {
- console.error("Failed with exception:");
- console.error(err);
- });
+if (process.argv.length <= 2) {
+ console.error("Error: No command given.");
+ program.help();
}
diff --git a/src/index.ts b/src/index.ts
index bfd25c6a0..44f030d71 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -20,4 +20,4 @@
export { Wallet } from "./wallet";
-export { main as runIntegrationTest } from "./headless/taler-wallet-cli";
+export { main as runIntegrationTest } from "./headless/taler-wallet-testing";
diff --git a/src/webex/wxBackend.ts b/src/webex/wxBackend.ts
index 831495359..e7ce39ecf 100644
--- a/src/webex/wxBackend.ts
+++ b/src/webex/wxBackend.ts
@@ -471,7 +471,7 @@ function setBadgeText(options: chrome.browserAction.BadgeTextDetails) {
function waitMs(timeoutMs: number): Promise<void> {
return new Promise((resolve, reject) => {
- chrome.extension.getBackgroundPage().setTimeout(() => resolve(), timeoutMs);
+ chrome.extension.getBackgroundPage()!.setTimeout(() => resolve(), timeoutMs);
});
}
@@ -780,7 +780,7 @@ export async function wxMain() {
chrome.tabs.onRemoved.addListener((tabId, changeInfo) => {
const tt = tabTimers[tabId] || [];
for (const t of tt) {
- chrome.extension.getBackgroundPage().clearTimeout(t);
+ chrome.extension.getBackgroundPage()!.clearTimeout(t);
}
});
chrome.tabs.onUpdated.addListener((tabId, changeInfo) => {
@@ -790,7 +790,7 @@ export async function wxMain() {
const timers: number[] = [];
const addRun = (dt: number) => {
- const id = chrome.extension.getBackgroundPage().setTimeout(run, dt);
+ const id = chrome.extension.getBackgroundPage()!.setTimeout(run, dt);
timers.push(id);
};
@@ -827,7 +827,7 @@ export async function wxMain() {
tabTimers[tabId] = timers;
});
- chrome.extension.getBackgroundPage().setInterval(clearRateLimitCache, 5000);
+ chrome.extension.getBackgroundPage()!.setInterval(clearRateLimitCache, 5000);
reinitWallet();