diff --git a/packages/sdk-multichain/src/multichain/index.ts b/packages/sdk-multichain/src/multichain/index.ts index 7f510f1a9..8e15ee53c 100644 --- a/packages/sdk-multichain/src/multichain/index.ts +++ b/packages/sdk-multichain/src/multichain/index.ts @@ -247,6 +247,9 @@ export class MultichainSDK extends MultichainCore { this.options.ui.factory.renderInstallModal( desktopPreferred, async () => { + if (this.dappClient.state === 'CONNECTED' || this.dappClient.state === 'CONNECTING') { + await this.dappClient.disconnect(); + } return new Promise((resolveConnectionRequest) => { this.dappClient.on('session_request', (sessionRequest: SessionRequest) => { resolveConnectionRequest({ diff --git a/packages/sdk-multichain/src/multichain/transports/mwp/index.ts b/packages/sdk-multichain/src/multichain/transports/mwp/index.ts index 5b542ff41..28ccb8bc9 100644 --- a/packages/sdk-multichain/src/multichain/transports/mwp/index.ts +++ b/packages/sdk-multichain/src/multichain/transports/mwp/index.ts @@ -28,7 +28,6 @@ export class MWPTransport implements ExtendedTransport { private __pendingRequests = new Map(); private notificationCallbacks = new Set<(data: unknown) => void>(); private currentSessionRequest: SessionRequest | undefined; - private connectionPromise?: Promise; get pendingRequests() { return this.__pendingRequests; @@ -139,7 +138,7 @@ export class MWPTransport implements ExtendedTransport { } catch {} let timeout: NodeJS.Timeout; - this.connectionPromise ??= new Promise((resolve, reject) => { + const connectionPromise = new Promise((resolve, reject) => { let connection: Promise; if (session) { connection = new Promise((resumeResolve, resumeReject) => { @@ -175,14 +174,15 @@ export class MWPTransport implements ExtendedTransport { dappClient.connect({ mode: 'trusted', initialPayload: request }).catch(rejectConnection); }); } + timeout = setTimeout(() => { reject(new TransportTimeoutError()); }, this.options.connectionTimeout); + connection.then(resolve).catch(reject); }); - return this.connectionPromise.finally(() => { - this.connectionPromise = undefined; + return connectionPromise.finally(() => { if (timeout) { clearTimeout(timeout); } diff --git a/packages/sdk-multichain/src/ui/modals/base/AbstractInstallModal.ts b/packages/sdk-multichain/src/ui/modals/base/AbstractInstallModal.ts index 100b11b92..79b9466d1 100644 --- a/packages/sdk-multichain/src/ui/modals/base/AbstractInstallModal.ts +++ b/packages/sdk-multichain/src/ui/modals/base/AbstractInstallModal.ts @@ -58,6 +58,7 @@ export abstract class AbstractInstallModal extends Modal= sessionRequest.expiresAt) { + this.stopExpirationCheck(); logger('[UI: InstallModal-nodejs()] ⏰ QR code EXPIRED! Generating new one...'); try { // Generate new session request diff --git a/packages/sdk-multichain/src/ui/modals/node/install.ts b/packages/sdk-multichain/src/ui/modals/node/install.ts index f04c353ab..4e409b868 100644 --- a/packages/sdk-multichain/src/ui/modals/node/install.ts +++ b/packages/sdk-multichain/src/ui/modals/node/install.ts @@ -21,12 +21,14 @@ export class InstallModal extends AbstractInstallModal { console.log(`EXPIRES IN: ${formattedTime}`); } } + renderQRCode(link: QRLink, connectionRequest: ConnectionRequest): void { const { sessionRequest } = connectionRequest; const expiresIn = sessionRequest.expiresAt - Date.now(); const expiresInSeconds = Math.floor(expiresIn / 1000); const shouldLog = shouldLogCountdown(expiresInSeconds); const formattedTime = formatRemainingTime(expiresIn); + this.startExpirationCheck(connectionRequest); this.displayQRWithCountdown(link, expiresIn); @@ -41,7 +43,6 @@ export class InstallModal extends AbstractInstallModal { } const { link, connectionRequest } = this; this.renderQRCode(link, connectionRequest); - this.startExpirationCheck(connectionRequest); } unmount(): void {