OSDN Git Service

update the dispatch method
[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       const chain = await this.getDefaultChain()
38
39       // Pushing an instance of Bytomdapp to the web application
40       stream.send(
41         NetworkMessage.payload(MsgTypes.PUSH_BYTOM, {defaultAccount, net, chain}),
42         EventNames.INJECT
43       )
44
45       // Dispatching the loaded event to the web application.
46       isReady = true
47
48       document.dispatchEvent(new CustomEvent('bytomLoaded'))
49       document.dispatchEvent(new CustomEvent('chromeBytomLoaded'))
50     })
51
52     chrome.storage.onChanged.addListener(async (evt) => {
53       if(evt.bytom.newValue.settings.network !== evt.bytom.oldValue.settings.network){
54         const net = await this.getDefaultNetwork();
55         const defaultAccount = await this.getDefaultAccount();
56         stream.send(
57           NetworkMessage.payload(MsgTypes.UPDATE_BYTOM, {type:'net', value: net}),
58           EventNames.INJECT
59         )
60         stream.send(
61           NetworkMessage.payload(MsgTypes.UPDATE_BYTOM, {type:'default_account', value: defaultAccount}),
62           EventNames.INJECT
63         )
64       }else if(!_.isEqual(evt.bytom.newValue.currentAccount,evt.bytom.oldValue.currentAccount)){
65         const defaultAccount = await this.getDefaultAccount();
66         if(defaultAccount){
67           stream.send(
68             NetworkMessage.payload(MsgTypes.UPDATE_BYTOM, {type:'default_account', value: defaultAccount}),
69             EventNames.INJECT
70           )
71         }
72       }else if(evt.bytom.newValue.settings.netType!== evt.bytom.oldValue.settings.netType){
73         const chain = await this.getDefaultChain();
74         const defaultAccount = await this.getDefaultAccount();
75         stream.send(
76           NetworkMessage.payload(MsgTypes.UPDATE_BYTOM, {type:'chain', value: chain}),
77           EventNames.INJECT
78         )
79         stream.send(
80           NetworkMessage.payload(MsgTypes.UPDATE_BYTOM, {type:'default_account', value: defaultAccount}),
81           EventNames.INJECT
82         )
83       }
84     });
85   }
86
87
88   contentListener(msg) {
89     console.log('content.stream.listen:', msg, stream.key)
90
91     if (!isReady) return
92     if (!msg) return
93     if(!stream.synced && (!msg.hasOwnProperty('type') || msg.type !== 'sync')) {
94       stream.send(new Error('inject Error'), PairingTags.INJECTED);
95       return;
96     }
97
98     let networkMessage = NetworkMessage.fromJson(msg)
99     switch (msg.type) {
100       case 'sync':
101         this.sync(msg)
102         break
103       case MsgTypes.TRANSFER:
104       case MsgTypes.SIGNTRANSACTION:
105       case MsgTypes.ADVTRANSFER:
106       case MsgTypes.SIGNMESSAGE:
107       case MsgTypes.SETCHAIN:
108       case MsgTypes.SEND:
109         this.transfer(msg.type, networkMessage)
110         break
111       case MsgTypes.ENABLE:
112         this.enable(msg.type, networkMessage)
113         break
114       default:
115         stream.send(networkMessage.error('errtest'), EventNames.INJECT)
116         break
117     }
118   }
119
120   getVersion() {}
121
122   getDefaultAccount(){
123     return InternalMessage.payload(MsgTypes.REQUEST_CURRENT_ACCOUNT,{domain:strippedHost()})
124       .send()
125   }
126
127   getDefaultNetwork(){
128     return InternalMessage.signal(MsgTypes.REQUEST_CURRENT_NETWORK)
129       .send()
130   }
131
132   getDefaultChain(){
133     return InternalMessage.signal(MsgTypes.REQUEST_CURRENT_CHAIN_TYPE)
134       .send()
135   }
136
137   respond(message, payload) {
138     if (!isReady) return
139
140     console.log(222, message, payload)
141     const response =
142       !payload || payload.hasOwnProperty('isError')
143         ? message.error(payload)
144         : message.respond(payload)
145     stream.send(response, EventNames.INJECT)
146   }
147
148   sync(message) {
149     stream.key = message.handshake.length ? message.handshake : null
150     stream.send({ type: 'sync' }, EventNames.INJECT)
151     stream.synced = true
152   }
153
154   transfer(type, message) {
155     if (!isReady) return
156
157     InternalMessage.payload(type, message.payload)
158       .send()
159       .then(res => this.respond(message, res))
160   }
161
162   enable(type, networkMessage) {
163     networkMessage.payload ={
164       domain: strippedHost()
165     }
166
167     this.transfer(type, networkMessage)
168   }
169
170 }
171
172 const content = new Content()