diff options
Diffstat (limited to 'extension/background/db.js')
-rw-r--r-- | extension/background/db.js | 220 |
1 files changed, 220 insertions, 0 deletions
diff --git a/extension/background/db.js b/extension/background/db.js new file mode 100644 index 000000000..9be933d9c --- /dev/null +++ b/extension/background/db.js @@ -0,0 +1,220 @@ +"use strict"; + +var DB = function () { + let DB = {}; // returned object with exported functions + + let DB_NAME = "taler"; + let DB_VERSION = 1; + + let db = null; + let is_ready = null; + + DB.open = function (onsuccess, onerror) + { + is_ready = false; + + let req = indexedDB.open(DB_NAME, DB_VERSION); + req.onerror = onerror; + req.onsuccess = function (event) + { + db = event.target.result; + is_ready = true; + if (onsuccess) + onsuccess(); + }; + + req.onupgradeneeded = function (event) + { + console.log ("DB: upgrade needed: oldVersion = "+ event.oldVersion); + + db = event.target.result; + db.onerror = onerror; + + switch (event.oldVersion) + { + case 0: // DB does not exist yet + { + let example = {}; + + let mints = db.createObjectStore("mints", { keyPath: "mint_pub" }); + mints.createIndex("name", "name", { unique: true }); + + example.mint = { + mint_pub: "<mint's master pub key>", // length: 32 + name: "Mint One", + url: "https://mint.one/", + }; + + let denoms = db.createObjectStore("denoms", { keyPath: "denom_pub" }); + + example.denom = { + denom_pub: "<denom pub key>", // length: 32 + mint_pub: "<mint's master pub key>", // length: 32 + mint_sig: "<mint's sig>", // length: 64 + withdraw_expiry_time: 1234567890, + deposit_expiry_time: 1234567890, + start_time: 1234567890, + value: { + value: 1, + fraction: 230000, // 0..999999 + currency: "EUR", + }, + fee: { + withdraw: { + value: 0, + fraction: 100000, + currency: "EUR", + }, + deposit: { + value: 0, + fraction: 100000, + currency: "EUR", + }, + refresh: { + value: 0, + fraction: 100000, + currency: "EUR", + }, + }, + }; + + let reserves = db.createObjectStore("reserves", { keyPath: "reserve_pub"}); + example.reserve = { + reserve_pub: "<pub key>", + reserve_priv: "<priv key>", + mint_pub: "<mint's master pub key>", + initial: { + value: 1, + fraction: 230000, + currency: "EUR", + }, + current: { + value: 1, + fraction: 230000, + currency: "EUR", + blind_session_pub: "<pub key>", + status_sig: "<sig>", + }, + }; + + let withdrawals = db.createObjectStore("withdrawals", { keyPath: "id", autoIncrement: true }); + example.withdrawal = { + id: 1, // generated + reserve_pub: "<pub key>", + reserve_sig: "<sig>", + denom_pub: "<pub key", + blind_session_pub: "<pub key>", + blind_priv: "<priv key>", + coin_pub: "<pub key>", + coin_priv: "<priv key>", + coin_ev: "", + }; + + let coins = db.createObjectStore("coins", { keyPath: "coin_pub" }); + example.coin = { + // coin either has a withdraw_id or refresh_id + // or it is imported in which case both are null + withdraw_id: 1, // can be null + refresh_id: null, // can be null + is_refreshed: false, + denom_pub: "<pub key>", + coin_pub: "<pub key>", + coin_priv: "<priv key>", + denom_sig: "<sig>", + spent: { + value: 1, + fraction: 230000, + }, + transactions: [ 123, 456 ], // list of transaction IDs where this coin was used + }; + + let transactions = db.createObjectStore("transactions", { keyPath: "id", autoIncrement: true }); + example.transaction = { + id: 1, // generated + wire_hash: "<hash>", + value: { + value: 1, + fraction: 230000, + currency: "EUR", + }, + contract: "<JSON>", + is_checkout_done: true, + is_confirmed: true, + fulfillment_url: "https://some.shop/transaction/completed", + }; + + let refresh = db.createObjectStore("refresh"); + example.refresh = { + // TODO + }; + } + } + + is_ready = true; + if (onsuccess) + onsuccess(); + } + }; + + + DB.close = function () + { + db.close(); + }; + + + DB.wallet_get = function (onresult, onerror) + { + let wallet = { }; + + let tr = db.transaction([ "coins", "denoms" ], "readonly"); + let coins = tr.objectStore("coins"); + let denoms = tr.objectStore("denoms"); + + let coins_cur = coins.openCursor(); + coins_cur.onerror = onerror; + coins_cur.onsuccess = function () + { + let cur = event.target.result; + if (cur) { + let denom_get = denoms.get(cur.valcue.denom_pub); + denom_get.onerror = onerror; + denom_get.onsuccess = function (event) + { + let denom = event.target.result; + if (denom.currency in wallet) + { + let w = wallet[denom.currency]; + w.value += denom.value; + w.fraction = (w.fraction + denom.fraction) % 1000000; + if (1000000 <= w.fraction + denom.fraction) + w.value++; + } + else + { + wallet[denom.currency] = denom; + } + cur.continue(); + } + } + else // no more entries + { + onresult(wallet); + } + }; + }; + + + DB.transaction_list = function (onresult, onerror) + { + // TODO + }; + + + DB.reserve_list = function (onresult, onerror) + { + // TODO + }; + + return DB; +}(); |