Skip to content

Commit 7a0fcf1

Browse files
1.34.2-0.0.5: [fix] Dangling event listeners (#687)
* 1.34.2-0.0.5: [fix] Dangling event listeners * Fix prefer const lint issue
1 parent 861e347 commit 7a0fcf1

File tree

2 files changed

+46
-8
lines changed

2 files changed

+46
-8
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "bnc-onboard",
3-
"version": "1.34.2-0.0.4",
3+
"version": "1.34.2-0.0.5",
44
"description": "Onboard users to web3 by allowing them to select a wallet, get that wallet ready to transact and have access to synced wallet state.",
55
"keywords": [
66
"ethereum",

src/utilities.ts

Lines changed: 45 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -141,14 +141,33 @@ export function createModernProviderInterface(provider: any): WalletInterface {
141141

142142
const onFuncExists = typeof provider.on === 'function'
143143

144+
interface ProviderEventHandlers {
145+
accountsChanged: ((arg: string[]) => void) | null
146+
networkChanged: ((arg: string | number) => void) | null
147+
chainChanged: ((arg: string | number) => void) | null
148+
}
149+
150+
// A map of provider event handlers -- refferences needed
151+
// in order to remove the event listners when their no longer needed
152+
const providerEventHandler: ProviderEventHandlers = {
153+
accountsChanged: null,
154+
networkChanged: null,
155+
chainChanged: null
156+
}
157+
144158
return {
145159
address: onFuncExists
146160
? {
147161
onChange: func => {
162+
providerEventHandler['accountsChanged'] = (accounts: string[]) => {
163+
func(accounts && accounts[0])
164+
}
165+
148166
// get the initial value
149167
getAddress(provider).then(func)
150-
provider.on('accountsChanged', (accounts: string[]) =>
151-
func(accounts && accounts[0])
168+
provider.on(
169+
'accountsChanged',
170+
providerEventHandler['accountsChanged']
152171
)
153172
}
154173
}
@@ -158,18 +177,26 @@ export function createModernProviderInterface(provider: any): WalletInterface {
158177
network: onFuncExists
159178
? {
160179
onChange: (func: (val: string | number) => void) => {
180+
providerEventHandler['networkChanged'] = (netId: string | number) =>
181+
func(netId && Number(netId))
182+
183+
// We clone the previous handler in order to get a distinct refference
184+
// to the 'chainChanged' event handler
185+
providerEventHandler['chainChanged'] = providerEventHandler[
186+
'networkChanged'
187+
].bind({})
188+
161189
// get initial value
162190
getNetwork(provider).then(func)
163191

164192
// networkChanged event is deprecated in MM, keep for wallets that may not have updated
165-
provider.on('networkChanged', (netId: string | number) =>
166-
func(netId && Number(netId))
193+
provider.on(
194+
'networkChanged',
195+
providerEventHandler['networkChanged']
167196
)
168197

169198
// use new chainChanged event for network change
170-
provider.on('chainChanged', (netId: string | number) =>
171-
func(netId && Number(netId))
172-
)
199+
provider.on('chainChanged', providerEventHandler['chainChanged'])
173200
}
174201
}
175202
: { get: () => getNetwork(provider) },
@@ -193,6 +220,17 @@ export function createModernProviderInterface(provider: any): WalletInterface {
193220
}
194221
}
195222
},
223+
disconnect: () => {
224+
if (provider?.removeListener) {
225+
// Iterate over the event handlers and remove them from the event listener.
226+
for (const [key, handler] of Object.entries(providerEventHandler)) {
227+
// If the handler is null, this indicates that no event listener was created
228+
if (handler) {
229+
provider.removeListener(key, handler)
230+
}
231+
}
232+
}
233+
},
196234
name: getProviderName(provider)
197235
}
198236
}

0 commit comments

Comments
 (0)