Skip to content
This repository was archived by the owner on Jul 23, 2024. It is now read-only.

Commit b67bdbb

Browse files
authored
Merge pull request #232 from jimni1222/requestManager
Use setRequestManager instead of setProvider for adding data listener once only
2 parents ec4aa01 + f6ece78 commit b67bdbb

File tree

7 files changed

+126
-23
lines changed

7 files changed

+126
-23
lines changed

index.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ const helpers = require('./packages/caver-core-helpers')
4242
const { version } = require('./package.json')
4343

4444
function Caver(provider, net) {
45+
const _this = this
46+
4547
this.use = middleware.registerMiddleware.bind(middleware)
4648
// sets _requestmanager etc
4749
packageInit(this, [provider, net])
@@ -60,7 +62,7 @@ function Caver(provider, net) {
6062
const setProvider = this.setProvider
6163
this.setProvider = (p, n) => {
6264
setProvider.apply(this, [p, n])
63-
this.klay.setProvider(p, n)
65+
_this.klay.setRequestManager(_this._requestManager)
6466
return true
6567
}
6668
}

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,8 @@
121121
"rollup-plugin-progress": "^0.4.0",
122122
"rollup-plugin-replace": "^2.1.0",
123123
"rollup-plugin-uglify": "^6.0.0",
124+
"sinon": "^9.0.0",
125+
"sinon-chai": "^3.5.0",
124126
"vinyl-source-stream": "^2.0.0"
125127
}
126128
}

packages/caver-core/src/index.js

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ const extend = pkg => {
6161
}
6262

6363
module.exports = {
64-
packageInit: function(pkg, [provider, net]) {
64+
packageInit: function(pkg, args) {
6565
if (!pkg) throw new Error('You need to instantiate using the "new" keyword.')
6666

6767
// make property of pkg._provider, which can properly set providers
@@ -76,20 +76,28 @@ module.exports = {
7676
configurable: true,
7777
})
7878

79-
if (provider && provider._requestManager) {
80-
pkg._requestManager = new Manager(provider.currentProvider)
81-
// set requestmanager on package
79+
// inherit from parent package or create a new RequestManager
80+
if (args[0] && args[0]._requestManager) {
81+
pkg._requestManager = args[0]._requestManager
8282
} else {
83-
pkg._requestManager = new Manager(provider, net)
83+
pkg._requestManager = new Manager(args[0], args[1])
8484
}
8585

8686
pkg.providers = Manager.providers
87-
8887
pkg._provider = pkg._requestManager.provider
8988

9089
// add SETPROVIDER function (don't overwrite if already existing)
9190
if (!pkg.setProvider) {
92-
pkg.setProvider = (p, n) => (pkg._provider = pkg._requestManager.setProvider(p, n).provider)
91+
pkg.setProvider = function(provider, net) {
92+
pkg._requestManager.setProvider(provider, net)
93+
pkg._provider = pkg._requestManager.provider
94+
return true
95+
}
96+
}
97+
98+
pkg.setRequestManager = function(manager) {
99+
pkg._requestManager = manager
100+
pkg._provider = manager.provider
93101
}
94102

95103
// attach batch request creation

packages/caver-klay/caver-klay-contract/src/index.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -301,8 +301,8 @@ Contract.prototype._getCallback = function getCallback(args) {
301301
* @return {Object} the contract instance
302302
*/
303303
/**
304-
* this._checkListener('newListener', subOptions.event.name, subOptions.callback);
305-
* this._checkListener('removeListener', subOptions.event.name, subOptions.callback);
304+
* this._checkListener('newListener', subOptions.event.name);
305+
* this._checkListener('removeListener', subOptions.event.name);
306306
*/
307307
Contract.prototype._checkListener = function(type, event) {
308308
if (event === type) {
@@ -727,8 +727,8 @@ Contract.prototype._on = function() {
727727
const subOptions = this._generateEventOptions.apply(this, arguments)
728728

729729
// prevent the event "newListener" and "removeListener" from being overwritten
730-
this._checkListener('newListener', subOptions.event.name, subOptions.callback)
731-
this._checkListener('removeListener', subOptions.event.name, subOptions.callback)
730+
this._checkListener('newListener', subOptions.event.name)
731+
this._checkListener('removeListener', subOptions.event.name)
732732

733733
// TODO check if listener already exists? and reuse subscription if options are the same.
734734

packages/caver-klay/caver-klay-personal/src/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ const Personal = function Personal(...args) {
3838
// sets _requestmanager
3939
core.packageInit(this, args)
4040

41-
this.net = new Net(this.currentProvider)
41+
this.net = new Net(this)
4242

4343
let defaultAccount = null
4444
let defaultBlock = 'latest'

packages/caver-klay/src/index.js

Lines changed: 37 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,25 @@ const Klay = function Klay(...args) {
5050
// sets _requestmanager
5151
core.packageInit(this, args)
5252

53+
// overwrite package setRequestManager
54+
const setRequestManager = this.setRequestManager
55+
this.setRequestManager = function(manager) {
56+
setRequestManager(manager)
57+
58+
_this.net.setRequestManager(manager)
59+
_this.personal.setRequestManager(manager)
60+
_this.accounts.setRequestManager(manager)
61+
_this.Contract._requestManager = _this._requestManager
62+
_this.Contract.currentProvider = _this._provider
63+
64+
return true
65+
}
66+
5367
// overwrite setProvider
5468
const setProvider = this.setProvider
5569
this.setProvider = function(...arg) {
5670
setProvider.apply(_this, arg)
57-
_this.net.setProvider.apply(_this, arg)
58-
_this.personal.setProvider.apply(_this, arg)
59-
_this.accounts.setProvider.apply(_this, arg)
60-
_this.Contract.setProvider(_this.currentProvider, _this.accounts)
71+
_this.setRequestManager(_this._requestManager)
6172
}
6273

6374
let defaultAccount = null
@@ -113,24 +124,36 @@ const Klay = function Klay(...args) {
113124
this.decodeTransaction = decodeFromRawTransaction
114125

115126
// add net
116-
this.net = new Net(this.currentProvider)
127+
this.net = new Net(this)
117128
// add chain detection
118129
this.net.getNetworkType = getNetworkType.bind(this)
119130

120131
// add accounts
121-
this.accounts = new Accounts(this.currentProvider)
132+
this.accounts = new Accounts(this)
122133

123134
// add personal
124-
this.personal = new Personal(this.currentProvider)
135+
this.personal = new Personal(this)
125136
this.personal.defaultAccount = this.defaultAccount
126137

127138
// create a proxy Contract type for this instance, as a Contract's provider
128139
// is stored as a class member rather than an instance variable. If we do
129140
// not create this proxy type, changing the provider in one instance of
130141
// caver-klay would subsequently change the provider for _all_ contract
131142
// instances!
143+
const self = this
132144
const Contract = function Contract() {
133145
BaseContract.apply(this, arguments)
146+
147+
// when Klay.setProvider is called, call packageInit
148+
// on all contract instances instantiated via this Klay
149+
// instances. This will update the currentProvider for
150+
// the contract instances
151+
const _this = this // eslint-disable-line no-shadow
152+
const setProvider = self.setProvider // eslint-disable-line no-shadow
153+
self.setProvider = function() {
154+
setProvider.apply(self, arguments)
155+
core.packageInit(_this, [self])
156+
}
134157
}
135158

136159
Contract.setProvider = function() {
@@ -146,12 +169,16 @@ const Klay = function Klay(...args) {
146169
this.Contract = Contract
147170
this.Contract.defaultAccount = this.defaultAccount
148171
this.Contract.defaultBlock = this.defaultBlock
149-
this.Contract.setProvider(this.currentProvider, this.accounts)
172+
this.Contract._requestManager = this._requestManager
173+
this.Contract._klayAccounts = this.accounts
174+
this.Contract.currentProvider = this._requestManager.provider
150175

151176
this.KIP7 = KIP7
152177
this.KIP7.defaultAccount = this.defaultAccount
153178
this.KIP7.defaultBlock = this.defaultBlock
154-
this.KIP7.setProvider(this.currentProvider, this.accounts)
179+
this.KIP7._requestManager = this._requestManager
180+
this.KIP7._klayAccounts = this.accounts
181+
this.KIP7.currentProvider = this._requestManager.provider
155182

156183
// add IBAN
157184
this.Iban = utils.Iban
@@ -240,7 +267,7 @@ const Klay = function Klay(...args) {
240267

241268
methods.forEach(function(method) {
242269
method.attachToObject(_this)
243-
// second param means is klay.accounts (necessary for wallet signing)
270+
// second param is the klay.accounts module (necessary for signing transactions locally)
244271
method.setRequestManager(_this._requestManager, _this.accounts)
245272
method.defaultBlock = _this.defaultBlock
246273
method.defaultAccount = _this.defaultAccount

test/setRequestManager.js

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/*
2+
Copyright 2020 The caver-js Authors
3+
This file is part of the caver-js library.
4+
5+
The caver-js library is free software: you can redistribute it and/or modify
6+
it under the terms of the GNU Lesser General Public License as published by
7+
the Free Software Foundation, either version 3 of the License, or
8+
(at your option) any later version.
9+
10+
The caver-js library is distributed in the hope that it will be useful,
11+
but WITHOUT ANY WARRANTY; without even the implied warranty of
12+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13+
GNU Lesser General Public License for more details.
14+
15+
You should have received a copy of the GNU Lesser General Public License
16+
along with the caver-js. If not, see <http://www.gnu.org/licenses/>.
17+
*/
18+
19+
const chai = require('chai')
20+
const sinon = require('sinon')
21+
const sinonChai = require('sinon-chai')
22+
23+
chai.use(sinonChai)
24+
25+
const expect = chai.expect
26+
27+
const Caver = require('../index.js')
28+
const testRPCURL = require('./testrpc')
29+
const { Manager } = require('../packages/caver-core-requestmanager/src/index')
30+
const { kip7JsonInterface } = require('../packages/caver-klay/caver-klay-kct/kctHelper')
31+
32+
describe('setRequestManager', () => {
33+
it('CAVERJS-UNIT-ETC-203: should call setRequestManager with each pacakge instead of setProvider', () => {
34+
const setProviderSpy = sinon.spy(Manager.prototype, 'setProvider')
35+
36+
const originalProvider = new Caver.providers.HttpProvider(testRPCURL)
37+
const caver = new Caver(originalProvider)
38+
39+
expect(caver).not.to.be.undefined
40+
expect(setProviderSpy).to.have.been.calledOnce
41+
42+
const contract = new caver.klay.Contract(kip7JsonInterface)
43+
44+
expect(contract.currentProvider).to.deep.equals(originalProvider)
45+
expect(caver.klay.currentProvider).to.deep.equals(originalProvider)
46+
47+
const setKlayRequestManager = sinon.spy(caver.klay, 'setRequestManager')
48+
const setNetRequestManager = sinon.spy(caver.klay.net, 'setRequestManager')
49+
const setPersonalRequestManager = sinon.spy(caver.klay.personal, 'setRequestManager')
50+
const setAccountsRequestManager = sinon.spy(caver.klay.accounts, 'setRequestManager')
51+
const setKlayProvider = sinon.spy(caver.klay, 'setProvider')
52+
53+
const newProvider = new Caver.providers.HttpProvider('https://api.baobab.klaytn.net:8651/')
54+
caver.klay.setProvider(newProvider)
55+
56+
expect(setKlayRequestManager).to.have.been.calledOnce
57+
expect(setNetRequestManager).to.have.been.calledOnce
58+
expect(setPersonalRequestManager).to.have.been.calledOnce
59+
expect(setAccountsRequestManager).to.have.been.calledOnce
60+
expect(setKlayProvider).to.have.been.calledOnce
61+
expect(contract.currentProvider).to.deep.equals(newProvider)
62+
expect(caver.klay.currentProvider).to.deep.equals(newProvider)
63+
})
64+
})

0 commit comments

Comments
 (0)