1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
'use strict';
const DONE = 4;
const DB_NAME = "taler";
const DB_VERSION = 1;
// Shown in the UI.
let backendFailed = false;
/**
* Run a function with the opened taler DB.
*/
function withTalerDb(f) {
let req = indexedDB.open(DB_NAME, DB_VERSION);
req.addEventListener("error", (e) => {
// XXX: more details
backendFailed = true;
});
req.addEventListener("success", (e) => {
var db = e.target.result;
f(db);
});
req.addEventListener("upgradeneeded", (e) => {
console.log ("DB: upgrade needed: oldVersion = "+ event.oldVersion);
db = event.target.result;
switch (event.oldVersion) {
case 0: // DB does not exist yet
db.createObjectStore("mints", { keyPath: "mint_pub" });
db.createObjectStore("reserves", { keyPath: "reserve_pub"});
db.createObjectStore("denoms", { keyPath: "denom_pub" });
db.createObjectStore("coins", { keyPath: "coin_pub" });
db.createObjectStore("withdrawals", { keyPath: "id", autoIncrement: true });
db.createObjectStore("transactions", { keyPath: "id", autoIncrement: true });
break;
}
});
}
function confirmReserve(db, detail, sendResponse) {
console.log('detail: ' + JSON.stringify(detail));
let keypair = createEddsaKeyPair();
let form = new FormData();
let now = new Date();
form.append(detail.field_amount, detail.amount_str);
form.append(detail.field_reserve_pub, keypair.pub);
form.append(detail.field_mint, detail.mint);
// XXX: set bank-specified fields.
let myRequest = new XMLHttpRequest();
console.log("making request to " + detail.post_url);
myRequest.open('post', detail.post_url);
myRequest.send(form);
myRequest.addEventListener('readystatechange', (e) => {
if (myRequest.readyState == DONE) {
let resp = {};
resp.status = myRequest.status;
resp.text = myRequest.responseText;
let reserveRecord = {
reserve_pub: keypair.pub,
reserve_priv: keypair.priv,
mint_base_url: detail.mint,
created: now,
last_query: null,
current_amount: null,
// XXX: set to actual amount
initial_amount: null
};
// XXX: insert into db.
switch (myRequest.status) {
case 200:
resp.success = true;
// We can't show the page directly, so
// we show some generic page from the wallet.
resp.backlink = chrome.extension.getURL("pages/reserve-success.html");
let tx = db.transaction(['reserves'], 'readwrite');
tx.objectStore('reserves').add(reserveRecord);
tx.addEventListener('complete', (e) => {
console.log('tx complete, pk was ' + reserveRecord.reserve_pub);
sendResponse(resp);
updateReserveMints(db);
// We have to update the mints now ...
});
break;
default:
resp.success = false;
sendResponse(resp);
}
}
});
// Allow async response
return true;
}
/**
* Fetch information for mints that
* are referenced in a reserve and that were not
* updated recently.
*/
function updateReserveMints(db) {
}
function dumpDb(db, detail, sendResponse) {
let dump = {};
dump.name = db.name;
dump.version = db.version;
dump.stores = {};
console.log("stores: " + JSON.stringify(db.objectStoreNames));
let tx = db.transaction(db.objectStoreNames);
tx.addEventListener('complete', (e) => {
sendResponse(dump);
});
for (let i = 0; i < db.objectStoreNames.length; i++) {
let name = db.objectStoreNames[i];
let storeDump = {};
dump.stores[name] = storeDump;
let store = tx.objectStore(name).openCursor().addEventListener('success', (e) => {
let cursor = event.target.result;
if (cursor) {
storeDump[cursor.key] = cursor.value;
cursor.continue();
}
});
}
return true;
}
withTalerDb((db) => {
console.log("db loaded");
chrome.runtime.onMessage.addListener(
function (req, sender, onresponse) {
// XXX: use assoc. instead of switch?
switch (req.type)
{
case "confirm-reserve":
return confirmReserve(db, req.detail, onresponse)
break;
case "dump-db":
console.log('dumping db');
return dumpDb(db, req.detail, onresponse);
}
});
});
|