Skip to content

Commit 847d745

Browse files
fix: enhance MetaMask extension ID detection with retry logic (#70)
* fix: enhance MetaMask extension ID detection with retry logic * fix: improve MetaMask extension ID detection with request ID handling * Revert "fix: improve MetaMask extension ID detection with request ID handling" This reverts commit 229db69.
1 parent 9ccd143 commit 847d745

File tree

2 files changed

+29
-13
lines changed

2 files changed

+29
-13
lines changed

src/helpers/metamaskExtensionId.ts

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { CONTENT_SCRIPT, INPAGE } from '../transports/constants';
1+
import { CONTENT_SCRIPT, INPAGE, METAMASK_EXTENSION_CONNECT_CAN_RETRY } from '../transports/constants';
22
import { METAMASK_PROVIDER_STREAM_NAME } from '../transports/constants';
33

44
/**
@@ -7,10 +7,16 @@ import { METAMASK_PROVIDER_STREAM_NAME } from '../transports/constants';
77
export 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+
}

src/transports/constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ export const CONTENT_SCRIPT = 'metamask-contentscript';
44
export const INPAGE = 'metamask-inpage';
55
export const MULTICHAIN_SUBSTREAM_NAME = 'metamask-multichain-provider';
66
export const METAMASK_PROVIDER_STREAM_NAME = 'metamask-provider';
7+
export const METAMASK_EXTENSION_CONNECT_CAN_RETRY = 'METAMASK_EXTENSION_CONNECT_CAN_RETRY';

0 commit comments

Comments
 (0)