diff --git a/packages/connect-evm/CHANGELOG.md b/packages/connect-evm/CHANGELOG.md index 8a1b435..9fda0d0 100644 --- a/packages/connect-evm/CHANGELOG.md +++ b/packages/connect-evm/CHANGELOG.md @@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +- Fix duplicate `onNotification` listener ([#81](https://github.com/MetaMask/connect-monorepo/pull/81)) - Fixed `addEthereumChain` not being prompted on mobile native browsers after a switch chain failure ([#79](https://github.com/MetaMask/connect-monorepo/pull/79)) ## [0.1.1] diff --git a/packages/connect-evm/src/connect.ts b/packages/connect-evm/src/connect.ts index bdd0dc4..856fc99 100644 --- a/packages/connect-evm/src/connect.ts +++ b/packages/connect-evm/src/connect.ts @@ -446,6 +446,11 @@ export class MetamaskConnectEVM { this.#core.off('wallet_sessionChanged', this.#sessionChangedHandler); + if (this.#removeNotificationHandler) { + this.#removeNotificationHandler(); + this.#removeNotificationHandler = undefined; + } + logger('fulfilled-request: disconnect'); } diff --git a/packages/connect-multichain/CHANGELOG.md b/packages/connect-multichain/CHANGELOG.md index c083eb3..275e0b3 100644 --- a/packages/connect-multichain/CHANGELOG.md +++ b/packages/connect-multichain/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +- Fix potential listener leak on `MultichainCore.deeplinkConnect` and duplicate `dappClient.on('message')` on `MWPTransport` ([#81](https://github.com/MetaMask/connect-monorepo/pull/81)) - Reverted: Fix mobile deeplink bug that occurred when `MultichainSDK.connect()` was called and the transport was already connected ([#74](https://github.com/MetaMask/connect-monorepo/pull/74)) - Fix rejections of the initial permission approval for deeplink connections not correctly updating the connection status to disconnected ([#75](https://github.com/MetaMask/connect-monorepo/pull/75)) - Fix `connect()` not working for mobile deeplink and QR connections when a previous connection attempt gets stuck ([#85](https://github.com/MetaMask/connect-monorepo/pull/85)) diff --git a/packages/connect-multichain/src/multichain/index.ts b/packages/connect-multichain/src/multichain/index.ts index 9fbc7f7..99a2354 100644 --- a/packages/connect-multichain/src/multichain/index.ts +++ b/packages/connect-multichain/src/multichain/index.ts @@ -519,6 +519,7 @@ export class MultichainSDK extends MultichainCore { .then(resolve) .catch(async (error) => { await this.storage.removeTransport(); + this.dappClient.off('message', dappClientMessageHandler); reject(error instanceof Error ? error : new Error(String(error))); }) .finally(() => { diff --git a/packages/connect-multichain/src/multichain/transports/mwp/index.ts b/packages/connect-multichain/src/multichain/transports/mwp/index.ts index e6a1ae0..1d8ccd1 100644 --- a/packages/connect-multichain/src/multichain/transports/mwp/index.ts +++ b/packages/connect-multichain/src/multichain/transports/mwp/index.ts @@ -327,6 +327,9 @@ export class MWPTransport implements ExtendedTransport { } let timeout: NodeJS.Timeout; + let initialConnectionMessageHandler: + | ((message: unknown) => Promise) + | undefined; const connectionPromise = new Promise((resolve, reject) => { let connection: Promise; if (session) { @@ -358,7 +361,9 @@ export class MWPTransport implements ExtendedTransport { }; // just used for initial connection - this.dappClient.on('message', async (message: unknown) => { + initialConnectionMessageHandler = async ( + message: unknown, + ): Promise => { if (typeof message === 'object' && message !== null) { if ('data' in message) { const messagePayload = message.data as Record< @@ -370,6 +375,12 @@ export class MWPTransport implements ExtendedTransport { messagePayload.method === 'wallet_sessionChanged' ) { if (messagePayload.error) { + if (initialConnectionMessageHandler) { + this.dappClient.off( + 'message', + initialConnectionMessageHandler, + ); + } return rejectConnection(messagePayload.error); } await this.storeWalletSession( @@ -381,7 +392,9 @@ export class MWPTransport implements ExtendedTransport { } } } - }); + }; + + this.dappClient.on('message', initialConnectionMessageHandler); dappClient .connect({ @@ -391,7 +404,15 @@ export class MWPTransport implements ExtendedTransport { data: request, }, }) - .catch(rejectConnection); + .catch((error) => { + if (initialConnectionMessageHandler) { + this.dappClient.off( + 'message', + initialConnectionMessageHandler, + ); + } + rejectConnection(error); + }); }, ); } @@ -403,11 +424,19 @@ export class MWPTransport implements ExtendedTransport { connection.then(resolve).catch(reject); }); - return connectionPromise.finally(() => { - if (timeout) { - clearTimeout(timeout); - } - }); + return connectionPromise + .catch((error) => { + throw error; + }) + .finally(() => { + if (timeout) { + clearTimeout(timeout); + } + if (initialConnectionMessageHandler) { + this.dappClient.off('message', initialConnectionMessageHandler); + initialConnectionMessageHandler = undefined; + } + }); } /** @@ -515,7 +544,7 @@ export class MWPTransport implements ExtendedTransport { request: TransportRequest, response: TransportResponse, ): Promise { - if(response.error) { + if (response.error) { return; } if (CACHED_METHOD_LIST.includes(request.method)) {