OSDN Git Service

update vote confirm page.
[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 import {strippedHost} from '@/utils/GenericTools'
8 import _ from 'lodash';
9
10
11 let stream = new WeakMap()
12 let INJECTION_SCRIPT_FILENAME = 'js/inject.js'
13 let isReady = false
14
15 class Content {
16   constructor() {
17     this.setupEncryptedStream()
18     this.injectInteractionScript()
19   }
20
21   injectInteractionScript() {
22     let script = document.createElement('script')
23     script.src = chrome.extension.getURL(INJECTION_SCRIPT_FILENAME)
24     ;(document.head || document.documentElement).appendChild(script)
25     script.onload = () => script.remove()
26   }
27
28   setupEncryptedStream() {
29     console.log('stream listening...', IdGenerator.text(256))
30
31     stream = new EncryptedStream(EventNames.BYTOM, IdGenerator.text(256))
32     stream.listenWith(msg => this.contentListener(msg))
33
34     stream.onSync(async () => {
35       const defaultAccount = await this.getDefaultAccount();
36       const net = await this.getDefaultNetwork();
37
38       // Pushing an instance of Bytomdapp to the web application
39       stream.send(
40         NetworkMessage.payload(MsgTypes.PUSH_BYTOM, {defaultAccount, net}),
41         EventNames.INJECT
42       )
43
44       // Dispatching the loaded event to the web application.
45       isReady = true
46
47       document.dispatchEvent(new CustomEvent('chromeBytomLoaded'))
48     })
49
50     chrome.storage.onChanged.addListener(async (evt) => {
51       if(evt.bytom.newValue.settings.network !== evt.bytom.oldValue.settings.network){
52         const net = await this.getDefaultNetwork();
53         const defaultAccount = await this.getDefaultAccount();
54         stream.send(
55           NetworkMessage.payload(MsgTypes.UPDATE_BYTOM, {type:'net', value: net}),
56           EventNames.INJECT
57         )
58         stream.send(
59           NetworkMessage.payload(MsgTypes.UPDATE_BYTOM, {type:'default_account', value: defaultAccount}),
60           EventNames.INJECT
61         )
62       }else if(!_.isEqual(evt.bytom.newValue.currentAccount,evt.bytom.oldValue.currentAccount)){
63         const defaultAccount = await this.getDefaultAccount();
64         if(defaultAccount){
65           stream.send(
66             NetworkMessage.payload(MsgTypes.UPDATE_BYTOM, {type:'default_account', value: defaultAccount}),
67             EventNames.INJECT
68           )
69         }
70       }
71     });
72   }
73
74
75   contentListener(msg) {
76     console.log('content.stream.listen:', msg, stream.key)
77
78     if (!isReady) return
79     if (!msg) return
80     if(!stream.synced && (!msg.hasOwnProperty('type') || msg.type !== 'sync')) {
81       stream.send(new Error('inject Error'), PairingTags.INJECTED);
82       return;
83     }
84
85     let networkMessage = NetworkMessage.fromJson(msg)
86     switch (msg.type) {
87       case 'sync':
88         this.sync(msg)
89         break
90       case MsgTypes.TRANSFER:
91       case MsgTypes.ADVTRANSFER:
92       case MsgTypes.SIGNMESSAGE:
93       case MsgTypes.SEND:
94         this.transfer(msg.type, networkMessage)
95         break
96       case MsgTypes.ENABLE:
97         this.enable(msg.type, networkMessage)
98         break
99       default:
100         stream.send(networkMessage.error('errtest'), EventNames.INJECT)
101         break
102     }
103   }
104
105   getVersion() {}
106
107   getDefaultAccount(){
108     return InternalMessage.payload(MsgTypes.REQUEST_CURRENT_ACCOUNT,{domain:strippedHost()})
109       .send()
110   }
111
112   getDefaultNetwork(){
113     return InternalMessage.signal(MsgTypes.REQUEST_CURRENT_NETWORK)
114       .send()
115   }
116
117   respond(message, payload) {
118     if (!isReady) return
119
120     console.log(222, message, payload)
121     const response =
122       !payload || payload.hasOwnProperty('isError')
123         ? message.error(payload)
124         : message.respond(payload)
125     stream.send(response, EventNames.INJECT)
126   }
127
128   sync(message) {
129     stream.key = message.handshake.length ? message.handshake : null
130     stream.send({ type: 'sync' }, EventNames.INJECT)
131     stream.synced = true
132   }
133
134   transfer(type, message) {
135     if (!isReady) return
136
137     InternalMessage.payload(type, message.payload)
138       .send()
139       .then(res => this.respond(message, res))
140   }
141
142   enable(type, networkMessage) {
143     networkMessage.payload ={
144       domain: strippedHost()
145     }
146
147     this.transfer(type, networkMessage)
148   }
149
150 }
151
152 const content = new Content()