make wallet independent of chrome/WX api

This commit is contained in:
Florian Dold 2016-01-06 15:58:18 +01:00
parent abf15268ac
commit 5bb1c95ec5
4 changed files with 99 additions and 77 deletions

View File

@ -28,50 +28,51 @@ interface HttpResponse {
}
function httpReq(method: string,
url: string|uri.URI,
options?: any): Promise<HttpResponse> {
let urlString: string;
if (url instanceof URI) {
urlString = url.href();
} else if (typeof url === "string") {
urlString = url;
class BrowserHttpLib {
req(method: string,
url: string|uri.URI,
options?: any): Promise<HttpResponse> {
let urlString: string;
if (url instanceof URI) {
urlString = url.href();
} else if (typeof url === "string") {
urlString = url;
}
return new Promise((resolve, reject) => {
let myRequest = new XMLHttpRequest();
myRequest.open(method, urlString);
if (options && options.req) {
myRequest.send(options.req);
} else {
myRequest.send();
}
myRequest.addEventListener("readystatechange", (e) => {
if (myRequest.readyState == XMLHttpRequest.DONE) {
let resp = {
status: myRequest.status,
responseText: myRequest.responseText
};
resolve(resp);
}
});
});
}
return new Promise((resolve, reject) => {
let myRequest = new XMLHttpRequest();
myRequest.open(method, urlString);
if (options && options.req) {
myRequest.send(options.req);
} else {
myRequest.send();
}
myRequest.addEventListener("readystatechange", (e) => {
if (myRequest.readyState == XMLHttpRequest.DONE) {
let resp = {
status: myRequest.status,
responseText: myRequest.responseText
};
resolve(resp);
}
});
});
}
get(url: string|uri.URI) {
return this.req("get", url);
}
function httpGet(url: string|uri.URI) {
return httpReq("get", url);
}
postJson(url: string|uri.URI, body) {
return this.req("post", url, {req: JSON.stringify(body)});
}
function httpPostJson(url: string|uri.URI, body) {
return httpReq("post", url, {req: JSON.stringify(body)});
}
function httpPostForm(url: string|uri.URI, form) {
return httpReq("post", url, {req: form});
postForm(url: string|uri.URI, form) {
return this.req("post", url, {req: form});
}
}

View File

@ -57,48 +57,61 @@ function makeHandlers(wallet) {
amount_str: detail.amount_str
};
wallet.confirmReserve(req)
.then((resp) => {
if (resp.success) {
resp.backlink = chrome.extension.getURL("pages/reserve-success.html");
}
sendResponse(resp);
});
.then((resp) => {
if (resp.success) {
resp.backlink = chrome.extension.getURL(
"pages/reserve-success.html");
}
sendResponse(resp);
});
return true;
},
["confirm-pay"]: function(db, detail, sendResponse) {
wallet.confirmPay(detail.offer, detail.merchantPageUrl)
.then(() => {
sendResponse({success: true})
})
.catch((e) => {
sendResponse({error: e.message});
});
.then(() => {
sendResponse({success: true})
})
.catch((e) => {
sendResponse({error: e.message});
});
return true;
},
["execute-payment"]: function(db, detail, sendResponse) {
wallet.doPayment(detail.H_contract)
.then((r) => {
sendResponse({
success: true,
payUrl: r.payUrl,
payReq: r.payReq
});
})
.catch((e) => {
sendResponse({success: false, error: e.message});
});
.then((r) => {
sendResponse({
success: true,
payUrl: r.payUrl,
payReq: r.payReq
});
})
.catch((e) => {
sendResponse({success: false, error: e.message});
});
// async sendResponse
return true;
}
};
}
class ChromeBadge {
setText(s: string) {
chrome.browserAction.setBadgeText({text: s});
}
setColor(c: string) {
chrome.browserAction.setBadgeBackgroundColor({color: c});
}
}
function wxMain() {
chrome.browserAction.setBadgeText({text: ""});
openTalerDb().then((db) => {
let wallet = new Wallet(db, undefined, undefined);
let http = new BrowserHttpLib();
let badge = new ChromeBadge();
let wallet = new Wallet(db, http, badge);
let handlers = makeHandlers(wallet);
wallet.updateBadge();
chrome.runtime.onMessage.addListener(

View File

@ -20,7 +20,6 @@
* @author Florian Dold
*/
/// <reference path="../decl/urijs/URIjs.d.ts" />
/// <reference path="../decl/chrome/chrome.d.ts" />
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@ -264,7 +263,7 @@ class Wallet {
form.append(req.field_mint, req.mint);
// TODO: set bank-specified fields.
let mintBaseUrl = canonicalizeBaseUrl(req.mint);
return httpPostForm(req.post_url, form)
return this.http.postForm(req.post_url, form)
.then((hresp) => {
let resp = {
status: hresp.status,
@ -351,7 +350,7 @@ class Wallet {
wd.reserve_sig = pc.withdrawSig;
wd.coin_ev = pc.coinEv;
let reqUrl = URI("reserve/withdraw").absoluteTo(r.mint_base_url);
return httpPostJson(reqUrl, wd);
return this.http.postJson(reqUrl, wd);
})
.then(resp => {
if (resp.status != 200) {
@ -381,8 +380,8 @@ class Wallet {
return n;
}
function doBadge(n) {
chrome.browserAction.setBadgeText({ text: "" + n });
chrome.browserAction.setBadgeBackgroundColor({ color: "#0F0" });
this.badge.setText(n.toString());
this.badge.setColor("#0F0");
}
Query(this.db)
.iter("coins")
@ -447,7 +446,7 @@ class Wallet {
.then((reserve) => {
let reqUrl = URI("reserve/status").absoluteTo(mint.baseUrl);
reqUrl.query({ 'reserve_pub': reservePubStr });
return httpGet(reqUrl).then(resp => {
return this.http.get(reqUrl).then(resp => {
if (resp.status != 200) {
throw Error();
}
@ -470,7 +469,7 @@ class Wallet {
*/
updateMintFromUrl(baseUrl) {
let reqUrl = URI("keys").absoluteTo(baseUrl);
return httpGet(reqUrl).then((resp) => {
return this.http.get(reqUrl).then((resp) => {
if (resp.status != 200) {
throw Error("/keys request failed");
}

View File

@ -23,7 +23,6 @@
/// <reference path="../decl/urijs/URIjs.d.ts" />
/// <reference path="../decl/chrome/chrome.d.ts" />
"use strict";
@Checkable.Class
@ -196,12 +195,22 @@ function canonicalizeBaseUrl(url) {
return x.href()
}
interface HttpRequestLibrary {
interface HttpRequestLibrary {
req(method: string,
url: string|uri.URI,
options?: any): Promise<HttpResponse>;
get(url: string|uri.URI): Promise<HttpResponse>;
postJson(url: string|uri.URI, body): Promise<HttpResponse>;
postForm(url: string|uri.URI, form): Promise<HttpResponse>;
}
interface Badge {
setText(s: string): void;
setColor(c: string): void;
}
@ -435,7 +444,7 @@ class Wallet {
// TODO: set bank-specified fields.
let mintBaseUrl = canonicalizeBaseUrl(req.mint);
return httpPostForm(req.post_url, form)
return this.http.postForm(req.post_url, form)
.then((hresp) => {
let resp: ConfirmReserveResponse = {
status: hresp.status,
@ -537,7 +546,7 @@ class Wallet {
wd.reserve_sig = pc.withdrawSig;
wd.coin_ev = pc.coinEv;
let reqUrl = URI("reserve/withdraw").absoluteTo(r.mint_base_url);
return httpPostJson(reqUrl, wd);
return this.http.postJson(reqUrl, wd);
})
.then(resp => {
if (resp.status != 200) {
@ -572,8 +581,8 @@ class Wallet {
}
function doBadge(n) {
chrome.browserAction.setBadgeText({text: "" + n});
chrome.browserAction.setBadgeBackgroundColor({color: "#0F0"});
this.badge.setText(n.toString());
this.badge.setColor("#0F0");
}
Query(this.db)
@ -647,7 +656,7 @@ class Wallet {
.then((reserve) => {
let reqUrl = URI("reserve/status").absoluteTo(mint.baseUrl);
reqUrl.query({'reserve_pub': reservePubStr});
return httpGet(reqUrl).then(resp => {
return this.http.get(reqUrl).then(resp => {
if (resp.status != 200) {
throw Error();
}
@ -671,7 +680,7 @@ class Wallet {
*/
updateMintFromUrl(baseUrl) {
let reqUrl = URI("keys").absoluteTo(baseUrl);
return httpGet(reqUrl).then((resp) => {
return this.http.get(reqUrl).then((resp) => {
if (resp.status != 200) {
throw Error("/keys request failed");
}