Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/modern-foxes-run.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@clerk/clerk-js": patch
---

Ensure we don't access `window.addEventListener()` and `window.dispatchEvent` in non-browser environments.
12 changes: 10 additions & 2 deletions packages/clerk-js/src/utils/injectedWeb3Providers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,15 +35,23 @@ class InjectedWeb3Providers {
coinbase: 'Coinbase Wallet',
metamask: 'MetaMask',
} as const;
static #instance: InjectedWeb3Providers | null = null;

constructor() {
private constructor() {
if (typeof window === 'undefined') {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Odd that this didn't catch it. Does this mean expo is defining window, but not addEventListener? 😵

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

React Native is defining window here 🤯

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

and looks like expo too

Screenshot 2024-09-03 at 3 10 26 PM

return;
}
window.addEventListener('eip6963:announceProvider', this.#onAnnouncement as EventListener);
window.dispatchEvent(new Event('eip6963:requestProvider'));
}

public static getInstance(): InjectedWeb3Providers {
if (!InjectedWeb3Providers.#instance) {
InjectedWeb3Providers.#instance = new InjectedWeb3Providers();
}
return InjectedWeb3Providers.#instance;
}

get = (provider: InjectedWeb3Provider) => {
return this.#providers.find(p => p.info.name === this.#providerIdMap[provider])?.provider;
};
Expand All @@ -56,4 +64,4 @@ class InjectedWeb3Providers {
};
}

export const injectedWeb3Providers = new InjectedWeb3Providers();
Copy link
Member Author

@wobsoriano wobsoriano Sep 3, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Exporting this makes it global (calling the addEventListener and dispatchEvent methods) and errors out in non-browser environments

export const getInjectedWeb3Providers = () => InjectedWeb3Providers.getInstance();
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Exporting it now as a function but making sure it's still instantiated once

4 changes: 3 additions & 1 deletion packages/clerk-js/src/utils/web3.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import type { Web3Provider } from '@clerk/types';

import { toHex } from './hex';
import { injectedWeb3Providers } from './injectedWeb3Providers';
import { getInjectedWeb3Providers } from './injectedWeb3Providers';

type GetWeb3IdentifierParams = {
provider: Web3Provider;
Expand Down Expand Up @@ -80,5 +80,7 @@ async function getEthereumProvider(provider: Web3Provider) {
const sdk = new CoinbaseWalletSDK({});
return sdk.makeWeb3Provider({ options: 'all' });
}

const injectedWeb3Providers = getInjectedWeb3Providers();
return injectedWeb3Providers.get(provider);
}
Loading