44/* eslint-disable promise/always-return -- Event handlers */
55/* eslint-disable no-async-promise-executor -- Async promise executor needed for complex flow */
66import { analytics } from '@metamask/analytics' ;
7- import {
8- ErrorCode ,
9- ProtocolError ,
10- type SessionRequest ,
11- SessionStore ,
12- WebSocketTransport ,
13- } from '@metamask/mobile-wallet-protocol-core' ;
14- import { DappClient } from '@metamask/mobile-wallet-protocol-dapp-client' ;
7+ import type { SessionRequest } from '@metamask/mobile-wallet-protocol-core' ;
8+ import type { DappClient } from '@metamask/mobile-wallet-protocol-dapp-client' ;
159import {
1610 type SessionProperties ,
1711 getMultichainClient ,
@@ -59,8 +53,6 @@ import { RpcClient } from './rpc/handlers/rpcClient';
5953import { RequestRouter } from './rpc/requestRouter' ;
6054import { DefaultTransport } from './transports/default' ;
6155import { MultichainApiClientWrapperTransport } from './transports/multichainApiClientWrapper' ;
62- import { MWPTransport } from './transports/mwp' ;
63- import { keymanager } from './transports/mwp/KeyManager' ;
6456import {
6557 getDappId ,
6658 getGlobalObject ,
@@ -90,6 +82,8 @@ export class MetaMaskConnectMultichain extends MultichainCore {
9082
9183 #beforeUnloadListener: ( ( ) => void ) | undefined ;
9284
85+ #transportType?: TransportType ;
86+
9387 public _status : ConnectionStatus = 'pending' ;
9488
9589 #listener: ( ( ) => void | Promise < void > ) | undefined ;
@@ -126,14 +120,12 @@ export class MetaMaskConnectMultichain extends MultichainCore {
126120 return this . #dappClient;
127121 }
128122
129- get storage ( ) : StoreClient {
130- return this . options . storage ;
123+ get transportType ( ) : TransportType {
124+ return this . #transportType ?? TransportType . UNKNOWN ;
131125 }
132126
133- get transportType ( ) : TransportType {
134- return this . #transport instanceof MWPTransport
135- ? TransportType . MWP
136- : TransportType . Browser ;
127+ get storage ( ) : StoreClient {
128+ return this . options . storage ;
137129 }
138130
139131 readonly #sdkInfo = `Sdk/Javascript SdkVersion/${ getVersion ( ) } Platform/${ getPlatformType ( ) } dApp/${ this . options . dapp . url ?? this . options . dapp . name } dAppTitle/${ this . options . dapp . name } ` ;
@@ -284,16 +276,15 @@ export class MetaMaskConnectMultichain extends MultichainCore {
284276 }
285277 }
286278
287- async #getStoredTransport( ) : Promise <
288- DefaultTransport | MWPTransport | undefined
289- > {
279+ async #getStoredTransport( ) : Promise < ExtendedTransport | undefined > {
290280 const transportType = await this . storage . getTransport ( ) ;
291281 const hasExtensionInstalled = await hasExtension ( ) ;
292282 if ( transportType ) {
293283 if ( transportType === TransportType . Browser ) {
294284 if ( hasExtensionInstalled ) {
295285 const apiTransport = new DefaultTransport ( ) ;
296286 this . #transport = apiTransport ;
287+ this . #transportType = TransportType . Browser ;
297288 this . #providerTransportWrapper. setupTransportNotificationListener ( ) ;
298289 this . #listener = apiTransport . onNotification (
299290 this . #onTransportNotification. bind ( this ) ,
@@ -303,9 +294,11 @@ export class MetaMaskConnectMultichain extends MultichainCore {
303294 } else if ( transportType === TransportType . MWP ) {
304295 const { adapter : kvstore } = this . options . storage ;
305296 const dappClient = await this . #createDappClient( ) ;
297+ const { MWPTransport } = await import ( './transports/mwp' ) ;
306298 const apiTransport = new MWPTransport ( dappClient , kvstore ) ;
307299 this . #dappClient = dappClient ;
308300 this . #transport = apiTransport ;
301+ this . #transportType = TransportType . MWP ;
309302 this . #providerTransportWrapper. setupTransportNotificationListener ( ) ;
310303 this . #listener = apiTransport . onNotification (
311304 this . #onTransportNotification. bind ( this ) ,
@@ -327,7 +320,7 @@ export class MetaMaskConnectMultichain extends MultichainCore {
327320 await this . transport . connect ( ) ;
328321 }
329322 this . status = 'connected' ;
330- if ( this . transport instanceof MWPTransport ) {
323+ if ( this . #transportType === TransportType . MWP ) {
331324 await this . storage . setTransport ( TransportType . MWP ) ;
332325 } else {
333326 await this . storage . setTransport ( TransportType . Browser ) ;
@@ -374,32 +367,45 @@ export class MetaMaskConnectMultichain extends MultichainCore {
374367 }
375368
376369 async #createDappClient( ) : Promise < DappClient > {
370+ const [ mwpCore , { DappClient : DappClientClass } , { createKeyManager } ] =
371+ await Promise . all ( [
372+ import ( '@metamask/mobile-wallet-protocol-core' ) ,
373+ import ( '@metamask/mobile-wallet-protocol-dapp-client' ) ,
374+ import ( './transports/mwp/KeyManager' ) ,
375+ ] ) ;
376+ const keymanager = await createKeyManager ( ) ;
377+
377378 const { adapter : kvstore } = this . options . storage ;
378- const sessionstore = await SessionStore . create ( kvstore ) ;
379+ const sessionstore = await mwpCore . SessionStore . create ( kvstore ) ;
379380 const websocket =
380381 // eslint-disable-next-line no-negated-condition
381382 typeof window !== 'undefined'
382383 ? WebSocket
383384 : ( await import ( 'ws' ) ) . WebSocket ;
384- const transport = await WebSocketTransport . create ( {
385+ const transport = await mwpCore . WebSocketTransport . create ( {
385386 url : MWP_RELAY_URL ,
386387 kvstore,
387388 websocket,
388389 } ) ;
389- const dappClient = new DappClient ( { transport, sessionstore, keymanager } ) ;
390+ const dappClient = new DappClientClass ( {
391+ transport,
392+ sessionstore,
393+ keymanager,
394+ } ) ;
390395 return dappClient ;
391396 }
392397
393398 async #setupMWP( ) : Promise < void > {
394- if ( this . #transport instanceof MWPTransport ) {
399+ if ( this . #transportType === TransportType . MWP ) {
395400 return ;
396401 }
397- // Only setup MWP if it is not already mwp
398402 const { adapter : kvstore } = this . options . storage ;
399403 const dappClient = await this . #createDappClient( ) ;
400404 this . #dappClient = dappClient ;
405+ const { MWPTransport } = await import ( './transports/mwp' ) ;
401406 const apiTransport = new MWPTransport ( dappClient , kvstore ) ;
402407 this . #transport = apiTransport ;
408+ this . #transportType = TransportType . MWP ;
403409 this . #providerTransportWrapper. setupTransportNotificationListener ( ) ;
404410 this . #listener = this . transport . onNotification (
405411 this . #onTransportNotification. bind ( this ) ,
@@ -474,8 +480,10 @@ export class MetaMaskConnectMultichain extends MultichainCore {
474480 this . status = 'connected' ;
475481 await this . storage . setTransport ( TransportType . MWP ) ;
476482 } catch ( error ) {
483+ const { ProtocolError, ErrorCode } = await import (
484+ '@metamask/mobile-wallet-protocol-core'
485+ ) ;
477486 if ( error instanceof ProtocolError ) {
478- // Ignore Request expired errors to allow modal to regenerate expired qr codes
479487 if ( error . code !== ErrorCode . REQUEST_EXPIRED ) {
480488 this . status = 'disconnected' ;
481489 // Close the modal on error
@@ -586,6 +594,9 @@ export class MetaMaskConnectMultichain extends MultichainCore {
586594 resolve ( ) ;
587595 } )
588596 . catch ( async ( error ) => {
597+ const { ProtocolError } = await import (
598+ '@metamask/mobile-wallet-protocol-core'
599+ ) ;
589600 if ( error instanceof ProtocolError ) {
590601 // In headless mode, we don't auto-regenerate QR codes
591602 // since there's no modal to display them
@@ -604,8 +615,8 @@ export class MetaMaskConnectMultichain extends MultichainCore {
604615 async #setupDefaultTransport(
605616 options : { persist ?: boolean } = { persist : true } ,
606617 ) : Promise < DefaultTransport > {
607- if ( this . #transport instanceof DefaultTransport ) {
608- return this . #transport;
618+ if ( this . #transportType === TransportType . Browser ) {
619+ return this . #transport as DefaultTransport ;
609620 }
610621
611622 if ( options ?. persist ) {
@@ -616,6 +627,7 @@ export class MetaMaskConnectMultichain extends MultichainCore {
616627 this . #onTransportNotification. bind ( this ) ,
617628 ) ;
618629 this . #transport = transport ;
630+ this . #transportType = TransportType . Browser ;
619631 this . #providerTransportWrapper. setupTransportNotificationListener ( ) ;
620632 return transport ;
621633 }
@@ -763,7 +775,7 @@ export class MetaMaskConnectMultichain extends MultichainCore {
763775 ) : Promise < void > {
764776 if (
765777 this . status === 'connecting' &&
766- this . transportType === TransportType . MWP
778+ this . # transportType === TransportType . MWP
767779 ) {
768780 await this . #openConnectDeeplinkIfNeeded( ) ;
769781 throw new Error (
@@ -834,7 +846,7 @@ export class MetaMaskConnectMultichain extends MultichainCore {
834846 forceRequest,
835847 } )
836848 . then ( async ( ) => {
837- if ( this . #transport instanceof MWPTransport ) {
849+ if ( this . #transportType === TransportType . MWP ) {
838850 return this . storage . setTransport ( TransportType . MWP ) ;
839851 }
840852 return this . storage . setTransport ( TransportType . Browser ) ;
@@ -951,12 +963,13 @@ export class MetaMaskConnectMultichain extends MultichainCore {
951963
952964 // We want to leave the DefaultTransport instance connected so that we can
953965 // still listen for wallet_sessionChanged events.
954- if ( this . transportType !== TransportType . Browser ) {
966+ if ( this . # transportType !== TransportType . Browser ) {
955967 await this . #listener?.( ) ;
956968 this . #beforeUnloadListener?.( ) ;
957969 this . #listener = undefined ;
958970 this . #beforeUnloadListener = undefined ;
959971 this . #transport = undefined ;
972+ this . #transportType = undefined ;
960973 this . #providerTransportWrapper. clearTransportNotificationListener ( ) ;
961974 this . #dappClient = undefined ;
962975 }
@@ -973,7 +986,7 @@ export class MetaMaskConnectMultichain extends MultichainCore {
973986 transport ,
974987 rpcClient ,
975988 options ,
976- this . transportType ,
989+ this . # transportType ?? TransportType . UNKNOWN ,
977990 ) ;
978991 // TODO: need read only method support for solana
979992 return requestRouter . invokeMethod ( request ) ;
0 commit comments