newpay-wallet-js
Version:
377 lines (326 loc) • 15.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _bitsharesjsWs = require("bitsharesjs-ws");
var _idbHelper = require("./idb-helper.js");
var _idbHelper2 = _interopRequireDefault(_idbHelper);
var _idbRoot = require("./idb-root.js");
var _idbRoot2 = _interopRequireDefault(_idbRoot);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var DB_VERSION = 2; // Initial value was 1
var DB_PREFIX = "graphene_v2";
var WALLET_BACKUP_STORES = ["wallet", "private_keys", "linked_accounts"];
var current_wallet_name = "default";
var upgrade = function upgrade(db, oldVersion) {
// DEBUG console.log('... upgrade oldVersion',oldVersion)
if (oldVersion === 0) {
db.createObjectStore("wallet", { keyPath: "public_name" });
_idbHelper2.default.autoIncrement_unique(db, "private_keys", "pubkey");
db.createObjectStore("linked_accounts", { keyPath: "name" });
}
if (oldVersion < 2) {
// Cache only, do not backup...
db.createObjectStore("cached_properties", { keyPath: "name" });
}
};
/**
Everything in this class is scopped by the database name. This separates
data per-wallet and per-chain.
*/
var getDatabaseName = function getDatabaseName() {
var current_wallet = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : current_wallet_name;
var chain_id = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _bitsharesjsWs.Apis.instance().chain_id;
return [DB_PREFIX, chain_id ? chain_id.substring(0, 6) : "", current_wallet].join("_");
};
var openDatabase = function openDatabase() {
var database_name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getDatabaseName();
return new Promise(function (resolve, reject) {
var openRequest = iDB.impl.open(database_name, DB_VERSION);
openRequest.onupgradeneeded = function (e) {
// DEBUG console.log('... openRequest.onupgradeneeded ' + database_name)
// Don't resolve here, indexedDb will call onsuccess or onerror next
upgrade(e.target.result, e.oldVersion);
};
openRequest.onsuccess = function (e) {
// DEBUG console.log('... openRequest.onsuccess ' + database_name, e.target.result)
var db = e.target.result; //db的version是1
iDB.database_name = database_name;
_idbHelper2.default.set_graphene_db(db);
resolve(db);
};
openRequest.onerror = function (e) {
// DEBUG console.log("... openRequest.onerror " + database_name,e.target.error, e)
reject(e.target.error);
};
});
};
var iDB = function () {
var _instance;
var idb;
/** Be carefull not to call twice especially for a new database
needing an upgrade...
*/
function openIndexedDB(chain_id) {
return iDB.root.getProperty("current_wallet", "default").then(function (current_wallet) {
current_wallet_name = current_wallet;
var database_name = getDatabaseName(current_wallet, chain_id);
return openDatabase(database_name);
});
}
function init(chain_id) {
var promise = openIndexedDB(chain_id);
promise.then(function (db) {
idb = db;
});
return {
init_promise: promise,
db: function db() {
return idb;
}
};
}
return {
WALLET_BACKUP_STORES: WALLET_BACKUP_STORES,
getDatabaseName: getDatabaseName,
getCurrentWalletName: function getCurrentWalletName() {
return current_wallet_name;
},
deleteDatabase: function deleteDatabase() {
var are_you_sure = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
if (!are_you_sure) return "Are you sure?";
var req = iDB.impl.deleteDatabase(this.database_name);
return req.result;
},
set_impl: function set_impl(impl) {
this.impl = impl;
this.root = new _idbRoot2.default(this.impl);
},
set_chain_id: function set_chain_id(chain_id) {
this.chain_id = chain_id;
var chain_substring = chain_id ? chain_id.substring(0, 6) : "";
this.root.setDbSuffix("_" + chain_substring);
},
getchainid: function getchainid() {
console.log(_bitsharesjsWs.Apis.instance().chain_id);
},
init_instance: function init_instance(indexedDBimpl) //chain_id是通过配置里面,访问地址列表第一个地址获取(访问方式:ReconnectingWebSocket),参数:{"method":"call","params":[2,"get_chain_id",[]],"id":398},但测试返回失败
{
var chain_id = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _bitsharesjsWs.Apis.instance().chain_id;
if (!_instance) {
if (indexedDBimpl) {
this.set_impl(indexedDBimpl);
if ("__useShim" in indexedDBimpl) {
this.impl.__useShim(); //always use shim
}
}
this.set_chain_id(chain_id);
_instance = init(chain_id);
}
return _instance;
},
instance: function instance() {
if (!_instance) {
throw new Error("Internal Database instance is not initialized");
}
return _instance;
},
close: function close() {
if (_instance && _instance.db()) _instance.db().close();
_idbHelper2.default.set_graphene_db(null);
_instance = undefined;
},
add_to_store: function add_to_store(store_name, value) {
var _this = this;
return new Promise(function (resolve, reject) {
var transaction = _this.instance().db().transaction([store_name], "readwrite");
var store = transaction.objectStore(store_name);
var request = store.add(value);
request.onsuccess = function () {
resolve(value);
};
request.onerror = function (e) {
console.log("ERROR!!! add_to_store - can't store value in db. ", e.target.error.message, value);
reject(e.target.error.message);
};
});
},
remove_from_store: function remove_from_store(store_name, value) {
var _this2 = this;
return new Promise(function (resolve, reject) {
var transaction = _this2.instance().db().transaction([store_name], "readwrite");
var store = transaction.objectStore(store_name);
var request = store.delete(value);
request.onsuccess = function () {
resolve();
};
request.onerror = function (e) {
console.log("ERROR!!! remove_from_store - can't remove value from db. ", e.target.error.message, value);
reject(e.target.error.message);
};
});
},
load_data: function load_data(store_name) {
var _this3 = this;
return new Promise(function (resolve, reject) {
var data = [];
var transaction = _this3.instance().db().transaction([store_name], "readonly");
var store = transaction.objectStore(store_name);
var request = store.openCursor();
//request.oncomplete = () => { resolve(data); };
request.onsuccess = function (e) {
var cursor = e.target.result;
if (cursor) {
data.push(cursor.value);
cursor.continue();
} else {
resolve(data);
}
};
request.onerror = function (e) {
console.log("ERROR!!! open_store - can't get '`${store_name}`' cursor. ", e.target.error.message);
reject(e.target.error.message);
};
});
},
/** Persisted to disk but not backed up.
@return promise
*/
getCachedProperty: function getCachedProperty(name, default_value) {
var db = this.instance().db();
var transaction = db.transaction(["cached_properties"], "readonly");
var store = transaction.objectStore("cached_properties");
return _idbHelper2.default.on_request_end(store.get(name)).then(function (event) {
var result = event.target.result;
return result ? result.value : default_value;
}).catch(function (error) {
console.error(error);throw error;
});
},
/** Persisted to disk but not backed up. */
setCachedProperty: function setCachedProperty(name, value) {
var db = this.instance().db();
var transaction = db.transaction(["cached_properties"], "readwrite");
var store = transaction.objectStore("cached_properties");
if (value && value["toJS"]) value = value.toJS(); //Immutable-js
return _idbHelper2.default.on_request_end(store.put({ name: name, value: value })).catch(function (error) {
console.error(error);throw error;
});
},
backup: function backup() {
var store_names = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : WALLET_BACKUP_STORES;
var promises = [];
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = store_names[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var store_name = _step.value;
promises.push(this.load_data(store_name));
}
//Add each store name
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
return Promise.all(promises).then(function (results) {
var obj = {};
for (var i = 0; i < store_names.length; i++) {
var store_name = store_names[i];
if (store_name === "wallet") {
var wallet_array = results[i];
// their should be only 1 wallet per database
var _iteratorNormalCompletion2 = true;
var _didIteratorError2 = false;
var _iteratorError2 = undefined;
try {
for (var _iterator2 = wallet_array[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
var wallet = _step2.value;
wallet.backup_date = new Date().toISOString();
}
} catch (err) {
_didIteratorError2 = true;
_iteratorError2 = err;
} finally {
try {
if (!_iteratorNormalCompletion2 && _iterator2.return) {
_iterator2.return();
}
} finally {
if (_didIteratorError2) {
throw _iteratorError2;
}
}
}
}
obj[store_name] = results[i];
}
return obj;
});
},
restore: function restore(wallet_name, object) {
var database_name = getDatabaseName(wallet_name);
return openDatabase(database_name).then(function (db) {
var store_names = Object.keys(object);
var trx = db.transaction(store_names, "readwrite");
var _iteratorNormalCompletion3 = true;
var _didIteratorError3 = false;
var _iteratorError3 = undefined;
try {
for (var _iterator3 = store_names[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
var store_name = _step3.value;
var store = trx.objectStore(store_name);
var records = object[store_name];
var _iteratorNormalCompletion4 = true;
var _didIteratorError4 = false;
var _iteratorError4 = undefined;
try {
for (var _iterator4 = records[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
var record = _step4.value;
store.put(record);
}
} catch (err) {
_didIteratorError4 = true;
_iteratorError4 = err;
} finally {
try {
if (!_iteratorNormalCompletion4 && _iterator4.return) {
_iterator4.return();
}
} finally {
if (_didIteratorError4) {
throw _iteratorError4;
}
}
}
}
} catch (err) {
_didIteratorError3 = true;
_iteratorError3 = err;
} finally {
try {
if (!_iteratorNormalCompletion3 && _iterator3.return) {
_iterator3.return();
}
} finally {
if (_didIteratorError3) {
throw _iteratorError3;
}
}
}
return _idbHelper2.default.on_transaction_end(trx);
});
}
};
}();
exports.default = iDB;