OSDN Git Service

add the sign transaction pop up and function.
[bytom/Byone.git] / src / dapp.js
1 import NetworkMessage from '@/messages/network'
2 import * as MsgTypes from './messages/types'
3 import * as EventNames from '@/messages/event'
4 import IdGenerator from '@/utils/IdGenerator'
5
6 /***
7  * This is just a helper to manage resolving fake-async
8  * requests using browser messaging.
9  */
10 class DanglingResolver {
11   constructor(_id, _resolve, _reject) {
12     this.id = _id
13     this.resolve = _resolve
14     this.reject = _reject
15   }
16 }
17
18 let stream = new WeakMap()
19 let resolvers = new WeakMap()
20 let currentVersion = new WeakMap()
21 let requiredVersion = new WeakMap()
22
23 /***
24  * Messages do not come back on the same thread.
25  * To accomplish a future promise structure this method
26  * catches all incoming messages and dispenses
27  * them to the open promises. */
28 const _subscribe = () => {
29   stream.listenWith(msg => {
30     if (!msg || !msg.hasOwnProperty('type')) return false
31
32     for (let i = 0; i < resolvers.length; i++) {
33       if (resolvers[i].id === msg.resolver) {
34         if (msg.type === 'error') resolvers[i].reject(msg.payload)
35         else resolvers[i].resolve(msg.payload)
36         resolvers.splice(i, 1)
37       }
38     }
39   })
40 }
41
42 /***
43  * Turns message sending between the application
44  * and the content script into async promises
45  * @param _type
46  * @param _payload
47  */
48 const _send = (_type, _payload) => {
49   return new Promise((resolve, reject) => {
50     let id = IdGenerator.numeric(24)
51     let message = new NetworkMessage(_type, _payload, id)
52     resolvers.push(new DanglingResolver(id, resolve, reject))
53     stream.send(message, EventNames.BYTOM)
54   })
55 }
56
57
58 export default class Bytomdapp {
59   constructor(_stream, _options) {
60     // currentVersion = parseFloat(_options.version)
61     stream = _stream
62     resolvers = []
63     this.default_account = _options.defaultAccount
64     this.net = _options.net
65     this.chain = _options.chain
66
67     _subscribe()
68   }
69
70   enable(){
71     return _send(MsgTypes.ENABLE)
72       .then(async default_account =>{
73         this.default_account = default_account;
74         return default_account;
75       })
76   }
77
78   send_transaction(params) {
79     return _send(MsgTypes.TRANSFER, params)
80   }
81
82   sign_transaction(params) {
83     return _send(MsgTypes.SIGNTRANSACTION, params)
84   }
85
86   send_advanced_transaction(params) {
87     return _send(MsgTypes.ADVTRANSFER, params)
88   }
89
90   sign_message(params) {
91     return _send(MsgTypes.SIGNMESSAGE, params)
92   }
93 }