OSDN Git Service

update the account and netwrok change detection.
[bytom/Byone.git] / src / content.js
1 import { EncryptedStream, LocalStream } from 'extension-streams'
2 import IdGenerator from '@/utils/IdGenerator'
3 import NetworkMessage from '@/messages/network'
4 import InternalMessage from '@/messages/internal'
5 import * as MsgTypes from './messages/types'
6 import * as EventNames from '@/messages/event'
7
8 let stream = new WeakMap()
9 let INJECTION_SCRIPT_FILENAME = 'js/inject.js'
10 let isReady = false
11
12 class Content {
13   constructor() {
14     this.setupEncryptedStream()
15     this.injectInteractionScript()
16   }
17
18   injectInteractionScript() {
19     let script = document.createElement('script')
20     script.src = chrome.extension.getURL(INJECTION_SCRIPT_FILENAME)
21     ;(document.head || document.documentElement).appendChild(script)
22     script.onload = () => script.remove()
23   }
24
25   setupEncryptedStream() {
26     console.log('stream listening...', IdGenerator.text(256))
27
28     stream = new EncryptedStream(EventNames.BYTOM, IdGenerator.text(256))
29     stream.listenWith(msg => this.contentListener(msg))
30
31     stream.onSync(async () => {
32       const defaultAccount = await this.getDefaultAccount();
33       const net = await this.getDefaultNetwork();
34       const accountList = await this.getAccountList();
35
36       // Pushing an instance of Bytomdapp to the web application
37       stream.send(
38         NetworkMessage.payload(MsgTypes.PUSH_BYTOM, {defaultAccount, net, accountList}),
39         EventNames.INJECT
40       )
41
42       // Dispatching the loaded event to the web application.
43       isReady = true
44
45       document.dispatchEvent(new CustomEvent('chromeBytomLoaded'))
46     })
47
48     chrome.runtime.onMessage.addListener(async (obj) => {
49       switch (obj.action) {
50         case 'updateAccount':
51           const defaultAccount = await this.getDefaultAccount();
52           if(defaultAccount){
53             stream.send(
54               NetworkMessage.payload(MsgTypes.UPDATE_BYTOM, {type:'default_account', value: defaultAccount}),
55               EventNames.INJECT
56             )
57           }
58           break
59         case 'updateNetAndAccounts':
60           const net = await this.getDefaultNetwork();
61           const accountList = await this.getAccountList();
62           stream.send(
63             NetworkMessage.payload(MsgTypes.UPDATE_BYTOM, {type:'net', value: net}),
64             EventNames.INJECT
65           )
66           stream.send(
67             NetworkMessage.payload(MsgTypes.UPDATE_BYTOM, {type:'accounts', value: accountList}),
68             EventNames.INJECT
69           )
70           break
71       }
72       return true;
73     })
74   }
75
76
77   contentListener(msg) {
78     console.log('content.stream.listen:', msg, stream.key)
79
80     if (!isReady) return
81     if (!msg) return
82
83     let networkMessage = NetworkMessage.fromJson(msg)
84     switch (msg.type) {
85       case 'sync':
86         this.sync(msg)
87         break
88       case MsgTypes.TRANSFER:
89       case MsgTypes.ADVTRANSFER:
90       case MsgTypes.SEND:
91         this.transfer(msg.type, networkMessage)
92         break
93       default:
94         stream.send(networkMessage.error('errtest'), EventNames.INJECT)
95         break
96     }
97   }
98
99   getVersion() {}
100
101   getDefaultAccount(){
102     return InternalMessage.signal(MsgTypes.REQUEST_CURRENT_ACCOUNT)
103       .send()
104   }
105
106   getDefaultNetwork(){
107     return InternalMessage.signal(MsgTypes.REQUEST_CURRENT_NETWORK)
108       .send()
109   }
110
111   getAccountList(){
112     return InternalMessage.signal(MsgTypes.REQUEST_ACCOUNT_LIST)
113       .send()
114   }
115
116   respond(message, payload) {
117     if (!isReady) return
118
119     console.log(222, message, payload)
120     const response =
121       !payload || payload.hasOwnProperty('isError')
122         ? message.error(payload)
123         : message.respond(payload)
124     stream.send(response, EventNames.INJECT)
125   }
126
127   sync(message) {
128     stream.key = message.handshake.length ? message.handshake : null
129     stream.send({ type: 'sync' }, EventNames.INJECT)
130     stream.synced = true
131   }
132
133   transfer(type, message) {
134     if (!isReady) return
135
136     InternalMessage.payload(type, message.payload)
137       .send()
138       .then(res => this.respond(message, res))
139   }
140 }
141
142 const content = new Content()