@metamask/providers
Version:
A JavaScript Ethereum provider that connects to the wallet over a stream
1 lines • 22.7 kB
Source Map (JSON)
{"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"]}