OSDN Git Service

Merge branch 'keystore' into dev
[bytom/Bytom-JS-SDK.git] / src / sdk / keys.js
index 59ddc78..19210a7 100644 (file)
@@ -1,6 +1,7 @@
-import {createKey, resetKeyPassword} from '../wasm/func';
+import {createKey, resetKeyPassword, createPubkey, signMessage, signTransaction} from '../wasm/func';
 import {getDB} from '../db/db';
 
+
 function keysSDK() {
 }
 
@@ -12,7 +13,7 @@ function keysSDK() {
  * @param {String} newPassword 
  */
 keysSDK.prototype.resetKeyPassword = function(rootXPub, oldPassword, newPassword) {
-    let returnPromise = new Promise((resolve, reject) => {
+    let retPromise = new Promise((resolve, reject) => {
         let data = {rootXPub: rootXPub, oldPassword:oldPassword, newPassword:newPassword};
         resetKeyPassword(data).then(res => {
             getDB().then(db => {
@@ -46,7 +47,7 @@ keysSDK.prototype.resetKeyPassword = function(rootXPub, oldPassword, newPassword
             reject(error);
         });
     });
-    return returnPromise;
+    return retPromise;
 };
 
 /**
@@ -55,7 +56,7 @@ keysSDK.prototype.resetKeyPassword = function(rootXPub, oldPassword, newPassword
  * @param {String} xpub 
  */
 keysSDK.prototype.getKeyByXPub = function(xpub) {
-    let returnPromise = new Promise((resolve, reject) => {
+    let retPromise = new Promise((resolve, reject) => {
         getDB().then(db => {
             let getRequest = db.transaction(['keys'], 'readonly')
                 .objectStore('keys')
@@ -75,7 +76,63 @@ keysSDK.prototype.getKeyByXPub = function(xpub) {
             reject(error);
         });
     });
-    return returnPromise;
+    return retPromise;
+};
+
+/**
+ * List key
+ *
+ * @returns {Promise}
+ */
+keysSDK.prototype.list = function() {
+    let retPromise = new Promise((resolve, reject) => {
+        getDB().then(db => {
+            let transaction = db.transaction(['keys'], 'readonly');
+            let objectStore = transaction.objectStore('keys');
+            let oc = objectStore.openCursor();
+            let ret = [];
+            oc.onsuccess = function (event) {
+                var cursor = event.target.result;
+                if (cursor) {
+                    ret.push({alias: cursor.value.alias, xpub: cursor.value.xpub});
+                    cursor.continue();
+                } else {
+                    resolve(ret);
+                }
+            };
+            oc.onerror = function(e){
+                reject(e);
+            };
+        }).catch(err => {
+            reject(err);
+        });
+    });
+    return retPromise;
+};
+
+/**
+ * Create a new key.
+ *
+ * @param {String} alias - User specified, unique identifier.
+ * @param {String} password - User specified, key password.
+ */
+keysSDK.prototype.createKey = function(alias, password) {
+    var normalizedAlias = alias.toLowerCase().trim();
+
+    let data = {};
+    data.alias = normalizedAlias;
+    data.auth = password;
+    return createKey(data).then((res) => {
+        let jsonData = JSON.parse(res.data);
+        let dbData = {
+            key:res.data,
+            xpub:jsonData.xpub,
+            alias:alias,
+        };
+        return dbData;
+    }).catch(error => {
+        throw(error);
+    });
 };
 
 /**
@@ -86,7 +143,7 @@ keysSDK.prototype.getKeyByXPub = function(xpub) {
  */
 keysSDK.prototype.create = function(alias, password) {
     var normalizedAlias = alias.toLowerCase().trim();
-    let returnPromise = new Promise((resolve, reject) => {
+    let retPromise = new Promise((resolve, reject) => {
         getDB().then(db => {
             let getRequest = db.transaction(['keys'], 'readonly')
                 .objectStore('keys')
@@ -94,7 +151,7 @@ keysSDK.prototype.create = function(alias, password) {
                 .get(normalizedAlias);
             getRequest.onsuccess = function (e) {
                 if (e.target.result) {
-                    reject(new Error('alias already exists'));
+                    reject(new Error('key alias already exists'));
                     return;
                 }
                 let data = {};
@@ -127,7 +184,86 @@ keysSDK.prototype.create = function(alias, password) {
             reject(error);
         });
     });
-    return returnPromise;
+    return retPromise;
+};
+
+
+/**
+ * Create a new key.
+ *
+ * @param {String} xpub - xpub.
+ */
+keysSDK.prototype.createPubkey = function(xpub) {
+    let retPromise = new Promise((resolve, reject) => {
+        let data = {};
+        data.xpub = xpub;
+        data.seed = 1;
+        createPubkey(data).then((res) => {
+            let jsonData = JSON.parse(res.data);
+            resolve(jsonData);
+        }).catch(error => {
+            reject(error);
+        });
+    });
+    return retPromise;
+};
+
+/**
+ * Sign Message.
+ *
+ * @param {String} message - message.
+ * @param {String} password - password.
+ * @param {Object} address - address.
+ */
+keysSDK.prototype.signMessage = function(message, password, address) {
+    let retPromise = new Promise((resolve, reject) => {
+        getDB().then(db => {
+            let getRequest = db.transaction(['accounts-server'], 'readonly')
+                .objectStore('accounts-server')
+                .getAll();
+
+            getRequest.onsuccess = function (e) {
+                const result = getRequest.result.filter(obj => (obj.address === address || obj.vpAddress === address));
+                if (result.length === 0) {
+                    reject(new Error('not found address'));
+                    return;
+                }
+
+                const rootXpub = result[0].rootXPub;
+                let keyObject = db.transaction(['keys'], 'readonly')
+                    .objectStore('keys')
+                    .index('xpub')
+                    .get(rootXpub);
+
+                keyObject.onsuccess = function (e) {
+                    if (!e.target.result) {
+                        reject(new Error('not found xpub'));
+                        return;
+                    }
+
+                    let data = {};
+                    data.message = message;
+                    data.password = password;
+                    data.key = e.target.result.key;
+                    signMessage(data).then((res) => {
+                        let jsonData = JSON.parse(res.data);
+                        resolve(jsonData);
+                    }).catch(error => {
+                        reject(error);
+                    });
+                };
+                keyObject.onerror = function () {
+                    reject(getRequest.error);
+                };
+            };
+            getRequest.onerror = function () {
+                reject(getRequest.error);
+            };
+        }).catch(error => {
+            reject(error);
+        });
+    });
+    return retPromise;
 };
 
 export default keysSDK;
\ No newline at end of file