index.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. "use strict";
  2. /**
  3. * Returns a Promise that resolves to the value of window.ethereum if it is
  4. * set within the given timeout, or null.
  5. * The Promise will not reject, but an error will be thrown if invalid options
  6. * are provided.
  7. *
  8. * @param options - Options bag.
  9. * @param options.mustBeMetaMask - Whether to only look for MetaMask providers.
  10. * Default: false
  11. * @param options.silent - Whether to silence console errors. Does not affect
  12. * thrown errors. Default: false
  13. * @param options.timeout - Milliseconds to wait for 'ethereum#initialized' to
  14. * be dispatched. Default: 3000
  15. * @returns A Promise that resolves with the Provider if it is detected within
  16. * given timeout, otherwise null.
  17. */
  18. function detectEthereumProvider({ mustBeMetaMask = false, silent = false, timeout = 3000, } = {}) {
  19. _validateInputs();
  20. let handled = false;
  21. return new Promise((resolve) => {
  22. if (window.ethereum) {
  23. handleEthereum();
  24. }
  25. else {
  26. window.addEventListener('ethereum#initialized', handleEthereum, { once: true });
  27. setTimeout(() => {
  28. handleEthereum();
  29. }, timeout);
  30. }
  31. function handleEthereum() {
  32. if (handled) {
  33. return;
  34. }
  35. handled = true;
  36. window.removeEventListener('ethereum#initialized', handleEthereum);
  37. const { ethereum } = window;
  38. if (ethereum && (!mustBeMetaMask || ethereum.isMetaMask)) {
  39. resolve(ethereum);
  40. }
  41. else {
  42. const message = mustBeMetaMask && ethereum
  43. ? 'Non-MetaMask window.ethereum detected.'
  44. : 'Unable to detect window.ethereum.';
  45. !silent && console.error('@metamask/detect-provider:', message);
  46. resolve(null);
  47. }
  48. }
  49. });
  50. function _validateInputs() {
  51. if (typeof mustBeMetaMask !== 'boolean') {
  52. throw new Error(`@metamask/detect-provider: Expected option 'mustBeMetaMask' to be a boolean.`);
  53. }
  54. if (typeof silent !== 'boolean') {
  55. throw new Error(`@metamask/detect-provider: Expected option 'silent' to be a boolean.`);
  56. }
  57. if (typeof timeout !== 'number') {
  58. throw new Error(`@metamask/detect-provider: Expected option 'timeout' to be a number.`);
  59. }
  60. }
  61. }
  62. module.exports = detectEthereumProvider;
  63. //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQVlBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILFNBQVMsc0JBQXNCLENBQUMsRUFDOUIsY0FBYyxHQUFHLEtBQUssRUFDdEIsTUFBTSxHQUFHLEtBQUssRUFDZCxPQUFPLEdBQUcsSUFBSSxHQUNmLEdBQUcsRUFBRTtJQUVKLGVBQWUsRUFBRSxDQUFDO0lBRWxCLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztJQUVwQixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDN0IsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFO1lBRW5CLGNBQWMsRUFBRSxDQUFDO1NBRWxCO2FBQU07WUFFTCxNQUFNLENBQUMsZ0JBQWdCLENBQ3JCLHNCQUFzQixFQUN0QixjQUFjLEVBQ2QsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQ2YsQ0FBQztZQUVGLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsY0FBYyxFQUFFLENBQUM7WUFDbkIsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQ2I7UUFFRCxTQUFTLGNBQWM7WUFFckIsSUFBSSxPQUFPLEVBQUU7Z0JBQ1gsT0FBTzthQUNSO1lBQ0QsT0FBTyxHQUFHLElBQUksQ0FBQztZQUVmLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxzQkFBc0IsRUFBRSxjQUFjLENBQUMsQ0FBQztZQUVuRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsTUFBTSxDQUFDO1lBRTVCLElBQUksUUFBUSxJQUFJLENBQUMsQ0FBQyxjQUFjLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFO2dCQUN4RCxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDbkI7aUJBQU07Z0JBRUwsTUFBTSxPQUFPLEdBQUcsY0FBYyxJQUFJLFFBQVE7b0JBQ3hDLENBQUMsQ0FBQyx3Q0FBd0M7b0JBQzFDLENBQUMsQ0FBQyxtQ0FBbUMsQ0FBQztnQkFFeEMsQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDaEUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ2Y7UUFDSCxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCxTQUFTLGVBQWU7UUFDdEIsSUFBSSxPQUFPLGNBQWMsS0FBSyxTQUFTLEVBQUU7WUFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQyw4RUFBOEUsQ0FBQyxDQUFDO1NBQ2pHO1FBQ0QsSUFBSSxPQUFPLE1BQU0sS0FBSyxTQUFTLEVBQUU7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxzRUFBc0UsQ0FBQyxDQUFDO1NBQ3pGO1FBQ0QsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUU7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxzRUFBc0UsQ0FBQyxDQUFDO1NBQ3pGO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFsRkQsaUJBQVMsc0JBQXNCLENBQUMifQ==