OSDN Git Service

59ddc78871772d1d92b71a988622cc8bef65a991
[bytom/Bytom-JS-SDK.git] / src / sdk / keys.js
1 import {createKey, resetKeyPassword} from '../wasm/func';
2 import {getDB} from '../db/db';
3
4 function keysSDK() {
5 }
6
7 /**
8  * reset key password
9  * 
10  * @param {String}} rootXPub 
11  * @param {String} oldPassword 
12  * @param {String} newPassword 
13  */
14 keysSDK.prototype.resetKeyPassword = function(rootXPub, oldPassword, newPassword) {
15     let returnPromise = new Promise((resolve, reject) => {
16         let data = {rootXPub: rootXPub, oldPassword:oldPassword, newPassword:newPassword};
17         resetKeyPassword(data).then(res => {
18             getDB().then(db => {
19                 let objectStore = db.transaction(['keys'], 'readwrite').objectStore('keys');
20                 let index = objectStore.index('xpub');
21                 let keyRange = IDBKeyRange.only(rootXPub);
22                 let getRequest = index.openCursor(keyRange);
23                 getRequest.onsuccess = function (event) {
24                     const cursor = event.target.result;
25                     if(cursor && cursor.value.xpub === rootXPub) {
26                         const updateData = cursor.value;
27                         updateData.key = res.data;
28                         const request = cursor.update(updateData);
29                         request.onsuccess = function() {
30                             resolve(true);
31                         };
32                         request.onerror = function() {
33                             reject(new Error('db update error'));
34                         };
35                     } else {
36                         reject(new Error('db update error: not found by rootXPub'));
37                     }
38                 };
39                 getRequest.onerror = function () {
40                     reject(new Error('db get error'));
41                 };
42             }).catch(error => {
43                 reject(error);
44             });
45         }).catch(error => {
46             reject(error);
47         });
48     });
49     return returnPromise;
50 };
51
52 /**
53  * get key by XPub
54  * 
55  * @param {String} xpub 
56  */
57 keysSDK.prototype.getKeyByXPub = function(xpub) {
58     let returnPromise = new Promise((resolve, reject) => {
59         getDB().then(db => {
60             let getRequest = db.transaction(['keys'], 'readonly')
61                 .objectStore('keys')
62                 .index('xpub')
63                 .get(xpub);
64             getRequest.onsuccess = function(e) {
65                 if(e.target.result) {
66                     resolve(e.target.result.key);
67                 } else {
68                     reject(new Error('not found by XPub'));    
69                 }
70             };
71             getRequest.onerror = function() {
72                 reject(new Error('db get error'));
73             };
74         }).catch(error => {
75             reject(error);
76         });
77     });
78     return returnPromise;
79 };
80
81 /**
82  * Create a new key.
83  * 
84  * @param {String} alias - User specified, unique identifier.
85  * @param {String} password - User specified, key password.
86  */
87 keysSDK.prototype.create = function(alias, password) {
88     var normalizedAlias = alias.toLowerCase().trim();
89     let returnPromise = new Promise((resolve, reject) => {
90         getDB().then(db => {
91             let getRequest = db.transaction(['keys'], 'readonly')
92                 .objectStore('keys')
93                 .index('alias')
94                 .get(normalizedAlias);
95             getRequest.onsuccess = function (e) {
96                 if (e.target.result) {
97                     reject(new Error('alias already exists'));
98                     return;
99                 }
100                 let data = {};
101                 data.alias = normalizedAlias;
102                 data.auth = password;
103                 createKey(data).then((res) => {
104                     let jsonData = JSON.parse(res.data);
105                     let dbData = {
106                         key:res.data,
107                         xpub:jsonData.xpub,
108                         alias:alias,
109                     };
110                     let request = db.transaction(['keys'], 'readwrite')
111                         .objectStore('keys')
112                         .add(dbData);
113                     request.onsuccess = function () {
114                         resolve({xpub:jsonData.xpub, alias: alias});
115                     };
116                     request.onerror = function () {
117                         reject(new Error('db insert error'));
118                     };
119                 }).catch(error => {
120                     reject(error);    
121                 });
122             };
123             getRequest.onerror = function () {
124                 reject(new Error('db get error'));
125             };
126         }).catch(error => {
127             reject(error);
128         });
129     });
130     return returnPromise;
131 };
132
133 export default keysSDK;