aboutsummaryrefslogtreecommitdiff
path: root/src/headless/taler-wallet-cli.ts
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2019-08-20 17:58:01 +0200
committerFlorian Dold <florian.dold@gmail.com>2019-08-20 17:58:01 +0200
commit106bc6ad9a78c199e6b0e89bef854174d9014c28 (patch)
treedbb1579c29fca6cd133f2c2bd67ff36150a5cd7b /src/headless/taler-wallet-cli.ts
parent0f2fbf20ed3a74c3a73619f59ae8fe17bd2a883f (diff)
downloadwallet-core-106bc6ad9a78c199e6b0e89bef854174d9014c28.tar.xz
implement pay-url and disable broken wallet GC
Diffstat (limited to 'src/headless/taler-wallet-cli.ts')
-rw-r--r--src/headless/taler-wallet-cli.ts104
1 files changed, 95 insertions, 9 deletions
diff --git a/src/headless/taler-wallet-cli.ts b/src/headless/taler-wallet-cli.ts
index 0a7529e4b..4a1f5d91e 100644
--- a/src/headless/taler-wallet-cli.ts
+++ b/src/headless/taler-wallet-cli.ts
@@ -21,13 +21,27 @@ import { MerchantBackendConnection } from "./merchant";
import { runIntegrationTest } from "./integrationtest";
import { Wallet } from "../wallet";
import querystring = require("querystring");
-import qrcodeGenerator = require("qrcode-generator")
+import qrcodeGenerator = require("qrcode-generator");
+import readline = require("readline");
const program = new commander.Command();
program.version("0.0.1").option("--verbose", "enable verbose output", false);
const walletDbPath = os.homedir + "/" + ".talerwalletdb.json";
+function prompt(question: string): Promise<string> {
+ const stdinReadline = readline.createInterface({
+ input: process.stdin,
+ output: process.stdout,
+ });
+ return new Promise<string>((resolve, reject) => {
+ stdinReadline.question(question, res => {
+ resolve(res);
+ stdinReadline.close();
+ });
+ });
+}
+
function applyVerbose(verbose: boolean) {
if (verbose) {
console.log("enabled verbose logging");
@@ -64,8 +78,8 @@ program
});
async function asyncSleep(milliSeconds: number): Promise<void> {
- return new Promise<void>((resolve, reject) =>{
- setTimeout(() => resolve(), milliSeconds)
+ return new Promise<void>((resolve, reject) => {
+ setTimeout(() => resolve(), milliSeconds);
});
}
@@ -76,8 +90,16 @@ program
.action(async cmdObj => {
applyVerbose(program.verbose);
console.log("creating order");
- const merchantBackend = new MerchantBackendConnection("https://backend.test.taler.net", "default", "sandbox");
- const orderResp = await merchantBackend.createOrder(cmdObj.amount, cmdObj.summary, "");
+ const merchantBackend = new MerchantBackendConnection(
+ "https://backend.test.taler.net",
+ "default",
+ "sandbox",
+ );
+ const orderResp = await merchantBackend.createOrder(
+ cmdObj.amount,
+ cmdObj.summary,
+ "",
+ );
console.log("created new order with order ID", orderResp.orderId);
const checkPayResp = await merchantBackend.checkPayment(orderResp.orderId);
const qrcode = qrcodeGenerator(0, "M");
@@ -87,21 +109,85 @@ program
process.exit(1);
return;
}
- qrcode.addData("talerpay:" + querystring.escape(contractUrl));
+ const url = "talerpay:" + querystring.escape(contractUrl);
+ console.log("contract url:", url);
+ qrcode.addData(url);
qrcode.make();
console.log(qrcode.createASCII());
- console.log("waiting for payment ...")
+ console.log("waiting for payment ...");
while (1) {
await asyncSleep(500);
- const checkPayResp2 = await merchantBackend.checkPayment(orderResp.orderId);
+ const checkPayResp2 = await merchantBackend.checkPayment(
+ orderResp.orderId,
+ );
if (checkPayResp2.paid) {
- console.log("payment successfully received!")
+ console.log("payment successfully received!");
break;
}
}
});
program
+ .command("pay-url <pay-url>")
+ .option("-y, --yes", "automatically answer yes to prompts")
+ .action(async (payUrl, cmdObj) => {
+ applyVerbose(program.verbose);
+ console.log("paying for", payUrl);
+ const wallet = await getDefaultNodeWallet({
+ persistentStoragePath: walletDbPath,
+ });
+ const result = await wallet.preparePay(payUrl);
+ if (result.status === "error") {
+ console.error("Could not pay:", result.error);
+ process.exit(1);
+ return;
+ }
+ if (result.status === "insufficient-balance") {
+ console.log("contract", result.contractTerms!);
+ console.error("insufficient balance");
+ process.exit(1);
+ return;
+ }
+ if (result.status === "paid") {
+ console.log("already paid!");
+ process.exit(0);
+ return;
+ }
+ if (result.status === "payment-possible") {
+ console.log("paying ...");
+ } else {
+ throw Error("not reached");
+ }
+ console.log("contract", result.contractTerms!);
+ let pay;
+ if (cmdObj.yes) {
+ pay = true;
+ } else {
+ while (true) {
+ const yesNoResp = (await prompt("Pay? [Y/n]")).toLowerCase();
+ if (yesNoResp === "" || yesNoResp === "y" || yesNoResp === "yes") {
+ pay = true;
+ break;
+ } else if (yesNoResp === "n" || yesNoResp === "no") {
+ pay = false;
+ break;
+ } else {
+ console.log("please answer y/n");
+ }
+ }
+ }
+
+ if (pay) {
+ const payRes = await wallet.confirmPay(result.proposalId!, undefined);
+ console.log("paid!");
+ } else {
+ console.log("not paying");
+ }
+
+ wallet.stop();
+ });
+
+program
.command("integrationtest")
.option(
"-e, --exchange <exchange-url>",