1- import { CONTENT_SCRIPT , INPAGE } from '../transports/constants' ;
1+ import { CONTENT_SCRIPT , INPAGE , METAMASK_EXTENSION_CONNECT_CAN_RETRY } from '../transports/constants' ;
22import { METAMASK_PROVIDER_STREAM_NAME } from '../transports/constants' ;
33
44/**
@@ -7,10 +7,16 @@ import { METAMASK_PROVIDER_STREAM_NAME } from '../transports/constants';
77export async function detectMetamaskExtensionId ( ) : Promise < string > {
88 return new Promise ( ( resolve , reject ) => {
99 const messageHandler = ( event : MessageEvent ) => {
10- const { target, data } = event . data ;
11- if ( target === INPAGE && data ?. name === METAMASK_PROVIDER_STREAM_NAME && event . origin === location . origin ) {
12- const extensionId = data ?. data ?. result ?. extensionId ;
13- if ( extensionId ) {
10+ if ( isProviderMessage ( event ) ) {
11+ const data = event ?. data ?. data ?. data ;
12+
13+ // When a retry message is received, it means the previous getProviderState request was not received by the extension, so we need to retry
14+ if ( data ?. method === METAMASK_EXTENSION_CONNECT_CAN_RETRY ) {
15+ getProviderState ( ) ;
16+ }
17+ // Handle the provider state response
18+ else if ( data ?. result ?. extensionId ) {
19+ const extensionId = data ?. result ?. extensionId ;
1420 resolve ( extensionId ) ;
1521 window . removeEventListener ( 'message' , messageHandler ) ;
1622 clearTimeout ( timeoutId ) ;
@@ -21,16 +27,25 @@ export async function detectMetamaskExtensionId(): Promise<string> {
2127 const timeoutId = setTimeout ( ( ) => {
2228 window . removeEventListener ( 'message' , messageHandler ) ;
2329 reject ( new Error ( 'MetaMask extension not found' ) ) ;
24- } , 3000 ) ;
30+ } , 10000 ) ;
2531
2632 window . addEventListener ( 'message' , messageHandler ) ;
2733
28- window . postMessage (
29- {
30- target : CONTENT_SCRIPT ,
31- data : { name : METAMASK_PROVIDER_STREAM_NAME , data : { method : 'metamask_getProviderState' } } ,
32- } ,
33- location . origin ,
34- ) ;
34+ getProviderState ( ) ;
3535 } ) ;
3636}
37+
38+ function getProviderState ( ) {
39+ window . postMessage (
40+ {
41+ target : CONTENT_SCRIPT ,
42+ data : { name : METAMASK_PROVIDER_STREAM_NAME , data : { method : 'metamask_getProviderState' } } ,
43+ } ,
44+ location . origin ,
45+ ) ;
46+ }
47+
48+ function isProviderMessage ( event : MessageEvent ) {
49+ const { target, data } = event . data ;
50+ return target === INPAGE && data ?. name === METAMASK_PROVIDER_STREAM_NAME && event . origin === location . origin ;
51+ }
0 commit comments