{"version":3,"file":"MetaMaskInpageProvider.mjs","sourceRoot":"","sources":["../src/MetaMaskInpageProvider.ts"],"names":[],"mappings":"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","sourcesContent":["import { rpcErrors } from '@metamask/rpc-errors';\nimport type { Json, JsonRpcRequest, JsonRpcResponse } from '@metamask/utils';\nimport type { Duplex } from 'readable-stream';\n\nimport type { UnvalidatedJsonRpcRequest } from './BaseProvider';\nimport messages from './messages';\nimport { sendSiteMetadata } from './siteMetadata';\nimport type { StreamProviderOptions } from './StreamProvider';\nimport { AbstractStreamProvider } from './StreamProvider';\nimport {\n  EMITTED_NOTIFICATIONS,\n  getDefaultExternalMiddleware,\n  getRpcPromiseCallback,\n  NOOP,\n} from './utils';\n\nexport type SendSyncJsonRpcRequest = {\n  method:\n    | 'eth_accounts'\n    | 'eth_coinbase'\n    | 'eth_uninstallFilter'\n    | 'net_version';\n} & JsonRpcRequest;\n\ntype WarningEventName = keyof SentWarningsState['events'];\n\nexport type MetaMaskInpageProviderOptions = {\n  /**\n   * Whether the provider should send page metadata.\n   */\n  shouldSendMetadata?: boolean;\n} & Partial<Omit<StreamProviderOptions, 'rpcMiddleware'>>;\n\ntype SentWarningsState = {\n  // methods\n  enable: boolean;\n  experimentalMethods: boolean;\n  send: boolean;\n  // events\n  events: {\n    close: boolean;\n    data: boolean;\n    networkChanged: boolean;\n    notification: boolean;\n  };\n};\n\n/**\n * The name of the stream consumed by {@link MetaMaskInpageProvider}.\n */\nexport const MetaMaskInpageProviderStreamName = 'metamask-provider';\n\nexport class MetaMaskInpageProvider extends AbstractStreamProvider {\n  protected _sentWarnings: SentWarningsState = {\n    // methods\n    enable: false,\n    experimentalMethods: false,\n    send: false,\n    // events\n    events: {\n      close: false,\n      data: false,\n      networkChanged: false,\n      notification: false,\n    },\n  };\n\n  /**\n   * Experimental methods can be found here.\n   */\n  public readonly _metamask: ReturnType<\n    MetaMaskInpageProvider['_getExperimentalApi']\n  >;\n\n  #networkVersion: string | null;\n\n  /**\n   * Indicating that this provider is a MetaMask provider.\n   */\n  public readonly isMetaMask: true;\n\n  /**\n   * Creates a new `MetaMaskInpageProvider`.\n   *\n   * @param connectionStream - A Node.js duplex stream.\n   * @param options - An options bag.\n   * @param options.logger - The logging API to use. Default: `console`.\n   * @param options.maxEventListeners - The maximum number of event\n   * listeners. Default: 100.\n   * @param options.shouldSendMetadata - Whether the provider should\n   * send page metadata. Default: `true`.\n   */\n  constructor(\n    connectionStream: Duplex,\n    {\n      logger = console,\n      maxEventListeners = 100,\n      shouldSendMetadata,\n    }: MetaMaskInpageProviderOptions = {},\n  ) {\n    super(connectionStream, {\n      logger,\n      maxEventListeners,\n      rpcMiddleware: getDefaultExternalMiddleware(logger),\n    });\n\n    // We shouldn't perform asynchronous work in the constructor, but at one\n    // point we started doing so, and changing this class isn't worth it at\n    // the time of writing.\n    // eslint-disable-next-line @typescript-eslint/no-floating-promises\n    this._initializeStateAsync();\n\n    this.#networkVersion = null;\n    this.isMetaMask = true;\n\n    this._sendSync = this._sendSync.bind(this);\n    this.enable = this.enable.bind(this);\n    this.send = this.send.bind(this);\n    this.sendAsync = this.sendAsync.bind(this);\n    this._warnOfDeprecation = this._warnOfDeprecation.bind(this);\n\n    this._metamask = this._getExperimentalApi();\n\n    // handle JSON-RPC notifications\n    this._jsonRpcConnection.events.on('notification', (payload) => {\n      const { method } = payload;\n      if (EMITTED_NOTIFICATIONS.includes(method)) {\n        // deprecated\n        // emitted here because that was the original order\n        this.emit('data', payload);\n        // deprecated\n        this.emit('notification', payload.params.result);\n      }\n    });\n\n    // send website metadata\n    if (shouldSendMetadata) {\n      if (document.readyState === 'complete') {\n        // eslint-disable-next-line @typescript-eslint/no-floating-promises\n        sendSiteMetadata(this._rpcEngine, this._log);\n      } else {\n        const domContentLoadedHandler = () => {\n          // eslint-disable-next-line @typescript-eslint/no-floating-promises\n          sendSiteMetadata(this._rpcEngine, this._log);\n          window.removeEventListener(\n            'DOMContentLoaded',\n            domContentLoadedHandler,\n          );\n        };\n        window.addEventListener('DOMContentLoaded', domContentLoadedHandler);\n      }\n    }\n  }\n\n  //====================\n  // Read-only Properties\n  //====================\n\n  get chainId(): string | null {\n    return super.chainId;\n  }\n\n  get networkVersion(): string | null {\n    return this.#networkVersion;\n  }\n\n  get selectedAddress(): string | null {\n    return super.selectedAddress;\n  }\n\n  //====================\n  // Public Methods\n  //====================\n\n  /**\n   * Submits an RPC request per the given JSON-RPC request object.\n   *\n   * @param payload - The RPC request object.\n   * @param callback - The callback function.\n   */\n  sendAsync(\n    payload: JsonRpcRequest,\n    callback: (error: Error | null, result?: JsonRpcResponse<Json>) => void,\n  ): void {\n    this._rpcRequest(payload, callback);\n  }\n\n  /**\n   * We override the following event methods so that we can warn consumers\n   * about deprecated events:\n   * `addListener`, `on`, `once`, `prependListener`, `prependOnceListener`.\n   */\n\n  addListener(eventName: string, listener: (...args: unknown[]) => void) {\n    this._warnOfDeprecation(eventName);\n    return super.addListener(eventName, listener);\n  }\n\n  on(eventName: string, listener: (...args: unknown[]) => void) {\n    this._warnOfDeprecation(eventName);\n    return super.on(eventName, listener);\n  }\n\n  once(eventName: string, listener: (...args: unknown[]) => void) {\n    this._warnOfDeprecation(eventName);\n    return super.once(eventName, listener);\n  }\n\n  prependListener(eventName: string, listener: (...args: unknown[]) => void) {\n    this._warnOfDeprecation(eventName);\n    return super.prependListener(eventName, listener);\n  }\n\n  prependOnceListener(\n    eventName: string,\n    listener: (...args: unknown[]) => void,\n  ) {\n    this._warnOfDeprecation(eventName);\n    return super.prependOnceListener(eventName, listener);\n  }\n\n  //====================\n  // Private Methods\n  //====================\n\n  /**\n   * When the provider becomes disconnected, updates internal state and emits\n   * required events. Idempotent with respect to the isRecoverable parameter.\n   *\n   * Error codes per the CloseEvent status codes as required by EIP-1193:\n   * https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Status_codes.\n   *\n   * @param isRecoverable - Whether the disconnection is recoverable.\n   * @param errorMessage - A custom error message.\n   * @fires BaseProvider#disconnect - If the disconnection is not recoverable.\n   */\n  protected _handleDisconnect(isRecoverable: boolean, errorMessage?: string) {\n    super._handleDisconnect(isRecoverable, errorMessage);\n    if (this.#networkVersion && !isRecoverable) {\n      this.#networkVersion = null;\n    }\n  }\n\n  /**\n   * Warns of deprecation for the given event, if applicable.\n   *\n   * @param eventName - The name of the event.\n   */\n  protected _warnOfDeprecation(eventName: string): void {\n    // eslint-disable-next-line @typescript-eslint/no-unnecessary-boolean-literal-compare\n    if (this._sentWarnings?.events[eventName as WarningEventName] === false) {\n      this._log.warn(messages.warnings.events[eventName as WarningEventName]);\n      this._sentWarnings.events[eventName as WarningEventName] = true;\n    }\n  }\n\n  //====================\n  // Deprecated Methods\n  //====================\n\n  /**\n   * Equivalent to: `ethereum.request('eth_requestAccounts')`.\n   *\n   * @deprecated Use request({ method: 'eth_requestAccounts' }) instead.\n   * @returns A promise that resolves to an array of addresses.\n   */\n  async enable(): Promise<string[]> {\n    if (!this._sentWarnings.enable) {\n      this._log.warn(messages.warnings.enableDeprecation);\n      this._sentWarnings.enable = true;\n    }\n\n    return new Promise<string[]>((resolve, reject) => {\n      try {\n        this._rpcRequest(\n          { method: 'eth_requestAccounts', params: [] },\n          getRpcPromiseCallback(resolve, reject),\n        );\n      } catch (error) {\n        reject(error);\n      }\n    });\n  }\n\n  /**\n   * Submits an RPC request for the given method, with the given params.\n   *\n   * @deprecated Use \"request\" instead.\n   * @param method - The method to request.\n   * @param params - Any params for the method.\n   * @returns A Promise that resolves with the JSON-RPC response object for the\n   * request.\n   */\n  send<Type extends Json>(\n    method: string,\n    params?: Type[],\n  ): Promise<JsonRpcResponse<Type>>;\n\n  /**\n   * Submits an RPC request per the given JSON-RPC request object.\n   *\n   * @deprecated Use \"request\" instead.\n   * @param payload - A JSON-RPC request object.\n   * @param callback - An error-first callback that will receive the JSON-RPC\n   * response object.\n   */\n  send<Type extends Json>(\n    payload: JsonRpcRequest,\n    callback: (error: Error | null, result?: JsonRpcResponse<Type>) => void,\n  ): void;\n\n  /**\n   * Accepts a JSON-RPC request object, and synchronously returns the cached result\n   * for the given method. Only supports 4 specific RPC methods.\n   *\n   * @deprecated Use \"request\" instead.\n   * @param payload - A JSON-RPC request object.\n   * @returns A JSON-RPC response object.\n   */\n  send<Type extends Json>(\n    payload: SendSyncJsonRpcRequest,\n  ): JsonRpcResponse<Type>;\n\n  // eslint-disable-next-line @typescript-eslint/promise-function-async\n  send(methodOrPayload: unknown, callbackOrArgs?: unknown): unknown {\n    if (!this._sentWarnings.send) {\n      this._log.warn(messages.warnings.sendDeprecation);\n      this._sentWarnings.send = true;\n    }\n\n    if (\n      typeof methodOrPayload === 'string' &&\n      (!callbackOrArgs || Array.isArray(callbackOrArgs))\n    ) {\n      return new Promise((resolve, reject) => {\n        try {\n          this._rpcRequest(\n            { method: methodOrPayload, params: callbackOrArgs },\n            getRpcPromiseCallback(resolve, reject, false),\n          );\n        } catch (error) {\n          reject(error);\n        }\n      });\n    } else if (\n      methodOrPayload &&\n      typeof methodOrPayload === 'object' &&\n      typeof callbackOrArgs === 'function'\n    ) {\n      return this._rpcRequest(\n        methodOrPayload as JsonRpcRequest,\n        callbackOrArgs as (...args: unknown[]) => void,\n      );\n    }\n    return this._sendSync(methodOrPayload as SendSyncJsonRpcRequest);\n  }\n\n  /**\n   * Internal backwards compatibility method, used in send.\n   *\n   * @param payload - A JSON-RPC request object.\n   * @returns A JSON-RPC response object.\n   * @deprecated\n   */\n  protected _sendSync(payload: SendSyncJsonRpcRequest) {\n    let result;\n    switch (payload.method) {\n      case 'eth_accounts':\n        result = this.selectedAddress ? [this.selectedAddress] : [];\n        break;\n\n      case 'eth_coinbase':\n        result = this.selectedAddress ?? null;\n        break;\n\n      case 'eth_uninstallFilter':\n        this._rpcRequest(payload, NOOP);\n        result = true;\n        break;\n\n      case 'net_version':\n        result = this.#networkVersion ?? null;\n        break;\n\n      default:\n        throw new Error(messages.errors.unsupportedSync(payload.method));\n    }\n\n    return {\n      id: payload.id,\n      jsonrpc: payload.jsonrpc,\n      result,\n    };\n  }\n\n  /**\n   * Constructor helper.\n   *\n   * Gets the experimental _metamask API as Proxy, so that we can warn consumers\n   * about its experimental nature.\n   *\n   * @returns The experimental _metamask API.\n   */\n  protected _getExperimentalApi() {\n    return new Proxy(\n      {\n        /**\n         * Determines if MetaMask is unlocked by the user.\n         *\n         * @returns Promise resolving to true if MetaMask is currently unlocked.\n         */\n        isUnlocked: async () => !this._state.isPermanentlyDisconnected,\n\n        /**\n         * Make a batch RPC request.\n         *\n         * @param requests - The RPC requests to make.\n         */\n        requestBatch: async (requests: UnvalidatedJsonRpcRequest[]) => {\n          if (!Array.isArray(requests)) {\n            throw rpcErrors.invalidRequest({\n              message:\n                'Batch requests must be made with an array of request objects.',\n              data: requests,\n            });\n          }\n\n          return new Promise((resolve, reject) => {\n            this._rpcRequest(requests, getRpcPromiseCallback(resolve, reject));\n          });\n        },\n      },\n      {\n        get: (obj, prop, ...args) => {\n          if (!this._sentWarnings.experimentalMethods) {\n            this._log.warn(messages.warnings.experimentalMethods);\n            this._sentWarnings.experimentalMethods = true;\n          }\n          return Reflect.get(obj, prop, ...args);\n        },\n      },\n    );\n  }\n\n  /**\n   * Upon receipt of a new chainId, networkVersion, and isConnected value\n   * emits corresponding events and sets relevant public state. We interpret\n   * a `networkVersion` with the value of `loading` to be null. The `isConnected`\n   * value determines if a `connect` or recoverable `disconnect` has occurred.\n   * Child classes that use the `networkVersion` for other purposes must implement\n   * additional handling therefore.\n   *\n   * @fires MetamaskInpageProvider#networkChanged\n   * @param networkInfo - An object with network info.\n   * @param networkInfo.chainId - The latest chain ID.\n   * @param networkInfo.networkVersion - The latest network ID.\n   * @param networkInfo.isConnected - Whether the network is available.\n   */\n  protected _handleChainChanged({\n    chainId,\n    networkVersion,\n    isConnected,\n  }: {\n    chainId?: string;\n    networkVersion?: string;\n    isConnected?: boolean;\n  } = {}) {\n    super._handleChainChanged({ chainId, networkVersion, isConnected });\n\n    // The wallet will send a value of `loading` for `networkVersion` when it intends\n    // to communicate that this value cannot be resolved and should be intepreted as null.\n    // The wallet cannot directly send a null value for `networkVersion` because this\n    // would be a breaking change for existing dapps that use their own embedded MetaMask provider\n    // that expect this value to always be a integer string or the value 'loading'.\n\n    const targetNetworkVersion =\n      networkVersion === 'loading' ? null : networkVersion;\n\n    if (targetNetworkVersion !== this.#networkVersion) {\n      this.#networkVersion = targetNetworkVersion as string;\n      if (this._state.initialized) {\n        this.emit('networkChanged', this.#networkVersion);\n      }\n    }\n  }\n}\n"]}