forked from AlphaWallet/provider-engine
-
Notifications
You must be signed in to change notification settings - Fork 0
/
zero.js
132 lines (111 loc) · 4.1 KB
/
zero.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
const ProviderEngine = require('./index.js')
const DefaultFixture = require('./subproviders/default-fixture.js')
const NonceTrackerSubprovider = require('./subproviders/nonce-tracker.js')
const CacheSubprovider = require('./subproviders/cache.js')
const FilterSubprovider = require('./subproviders/filters.js')
const SubscriptionSubprovider = require('./subproviders/subscriptions')
const InflightCacheSubprovider = require('./subproviders/inflight-cache')
const HookedWalletSubprovider = require('./subproviders/hooked-wallet.js')
const SanitizingSubprovider = require('./subproviders/sanitizer.js')
const InfuraSubprovider = require('./subproviders/infura.js')
const FetchSubprovider = require('./subproviders/fetch.js')
const WebSocketSubprovider = require('./subproviders/websocket.js')
module.exports = ZeroClientProvider
function ZeroClientProvider(opts = {}){
const connectionType = getConnectionType(opts)
const engine = new ProviderEngine(opts.engineParams)
// static
const staticSubprovider = new DefaultFixture(opts.static)
engine.addProvider(staticSubprovider)
// nonce tracker
engine.addProvider(new NonceTrackerSubprovider())
// sanitization
const sanitizer = new SanitizingSubprovider()
engine.addProvider(sanitizer)
// cache layer
const cacheSubprovider = new CacheSubprovider()
engine.addProvider(cacheSubprovider)
// filters + subscriptions
// for websockets, only polyfill filters
if (connectionType === 'ws') {
const filterSubprovider = new FilterSubprovider()
engine.addProvider(filterSubprovider)
// otherwise, polyfill both subscriptions and filters
} else {
const filterAndSubsSubprovider = new SubscriptionSubprovider()
// forward subscription events through provider
filterAndSubsSubprovider.on('data', (err, notification) => {
engine.emit('data', err, notification)
})
engine.addProvider(filterAndSubsSubprovider)
}
// inflight cache
const inflightCache = new InflightCacheSubprovider()
engine.addProvider(inflightCache)
// id mgmt
const idmgmtSubprovider = new HookedWalletSubprovider({
// accounts
getAccounts: opts.getAccounts,
// transactions
processTransaction: opts.processTransaction,
approveTransaction: opts.approveTransaction,
signTransaction: opts.signTransaction,
publishTransaction: opts.publishTransaction,
// messages
// old eth_sign
processMessage: opts.processMessage,
approveMessage: opts.approveMessage,
signMessage: opts.signMessage,
// new personal_sign
processPersonalMessage: opts.processPersonalMessage,
processTypedMessage: opts.processTypedMessage,
approvePersonalMessage: opts.approvePersonalMessage,
approveTypedMessage: opts.approveTypedMessage,
signPersonalMessage: opts.signPersonalMessage,
signTypedMessage: opts.signTypedMessage,
personalRecoverSigner: opts.personalRecoverSigner,
})
engine.addProvider(idmgmtSubprovider)
// data source
const dataSubprovider = opts.dataSubprovider || createDataSubprovider(connectionType, opts)
// for websockets, forward subscription events through provider
if (connectionType === 'ws') {
dataSubprovider.on('data', (err, notification) => {
engine.emit('data', err, notification)
})
}
engine.addProvider(dataSubprovider)
// start polling
if (!opts.stopped) {
engine.start()
}
return engine
}
function createDataSubprovider(connectionType, opts) {
const { rpcUrl, debug } = opts
// default to infura
if (!connectionType) {
return new InfuraSubprovider()
}
if (connectionType === 'http') {
return new FetchSubprovider({ rpcUrl, debug })
}
if (connectionType === 'ws') {
return new WebSocketSubprovider({ rpcUrl, debug })
}
throw new Error(`ProviderEngine - unrecognized connectionType "${connectionType}"`)
}
function getConnectionType({ rpcUrl }) {
if (!rpcUrl) return undefined
const protocol = rpcUrl.split(':')[0]
switch (protocol) {
case 'http':
case 'https':
return 'http'
case 'ws':
case 'wss':
return 'ws'
default:
throw new Error(`ProviderEngine - unrecognized protocol in "${rpcUrl}"`)
}
}