UNPKG

@metamask/snaps-simulation

Version:

A simulation framework for MetaMask Snaps, enabling headless testing of Snaps in a controlled environment

1 lines 48.8 kB
{"version":3,"file":"interface.mjs","sourceRoot":"","sources":["../src/interface.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SnapInterfaceControllerState } from '@metamask/snaps-controllers';\nimport type { DialogApprovalTypes } from '@metamask/snaps-rpc-methods';\nimport { DIALOG_APPROVAL_TYPES } from '@metamask/snaps-rpc-methods';\nimport type {\n FormState,\n InterfaceContext,\n InterfaceState,\n SnapId,\n UserInputEvent,\n File,\n AccountSelectorState,\n AssetSelectorState,\n CaipAssetType,\n} from '@metamask/snaps-sdk';\nimport { DialogType, UserInputEventType, assert } from '@metamask/snaps-sdk';\nimport type {\n FooterElement,\n FormElement,\n JSXElement,\n} from '@metamask/snaps-sdk/jsx';\nimport {\n HandlerType,\n createAccountList,\n createChainIdList,\n getJsxChildren,\n unwrapError,\n walkJsx,\n} from '@metamask/snaps-utils';\nimport {\n assertExhaustive,\n hasProperty,\n parseCaipAccountId,\n} from '@metamask/utils';\nimport type { PayloadAction } from '@reduxjs/toolkit';\nimport deepEqual from 'fast-deep-equal';\nimport { type SagaIterator } from 'redux-saga';\nimport { call, put, select, take } from 'redux-saga/effects';\n\nimport { TYPEABLE_INPUTS } from './constants';\nimport type { RootControllerMessenger } from './controllers';\nimport { getFileSize, getFileToUpload } from './files';\nimport type { SimulationOptions } from './options';\nimport type { Interface, RunSagaFunction } from './store';\nimport { getCurrentInterface, resolveInterface, setInterface } from './store';\nimport type {\n FileOptions,\n SnapHandlerInterface,\n SnapInterface,\n SnapInterfaceActions,\n} from './types';\nimport { formatTypeErrorMessage } from './utils/errors';\n/**\n * The maximum file size that can be uploaded.\n */\nconst MAX_FILE_SIZE = 10_000_000; // 10 MB\n\n/**\n * The elements based on the Selector component.\n */\nconst SELECTOR_ELEMENTS = ['Selector', 'AccountSelector', 'AssetSelector'];\n\n/**\n * Get a user interface object from a type and content object.\n *\n * @param runSaga - A function to run a saga outside the usual Redux flow.\n * @param type - The type of the interface.\n * @param id - The interface ID.\n * @param content - The content to show in the interface.\n * @param interfaceActions - The actions to interact with the interface.\n * @returns The user interface object.\n */\nexport function getInterfaceResponse(\n runSaga: RunSagaFunction,\n type: DialogApprovalTypes[DialogType | 'default'] | 'Notification',\n id: string,\n content: JSXElement,\n interfaceActions: SnapInterfaceActions,\n): SnapInterface {\n switch (type) {\n case DIALOG_APPROVAL_TYPES[DialogType.Alert]:\n return {\n ...interfaceActions,\n type: DialogType.Alert,\n content,\n id,\n\n ok: resolveWith(runSaga, null),\n };\n\n case DIALOG_APPROVAL_TYPES[DialogType.Confirmation]:\n return {\n ...interfaceActions,\n type: DialogType.Confirmation,\n content,\n id,\n\n ok: resolveWith(runSaga, true),\n cancel: resolveWith(runSaga, false),\n };\n\n case DIALOG_APPROVAL_TYPES[DialogType.Prompt]:\n return {\n ...interfaceActions,\n type: DialogType.Prompt,\n content,\n id,\n\n ok: resolveWithInput(runSaga),\n cancel: resolveWith(runSaga, null),\n };\n\n case DIALOG_APPROVAL_TYPES.default: {\n const footer = getElementByType<FooterElement>(content, 'Footer');\n\n // No Footer defined so we apply a default footer.\n if (!footer) {\n return {\n ...interfaceActions,\n content,\n id,\n\n ok: resolveWith(runSaga, null),\n cancel: resolveWith(runSaga, null),\n };\n }\n\n // Only one button in footer so we apply a default cancel button.\n if (getJsxChildren(footer).length === 1) {\n return {\n ...interfaceActions,\n content,\n id,\n\n cancel: resolveWith(runSaga, null),\n };\n }\n\n // We have two buttons in the footer so we assume the snap handles the approval of the interface.\n return {\n ...interfaceActions,\n content,\n id,\n };\n }\n\n case 'Notification': {\n return {\n ...interfaceActions,\n content,\n id,\n };\n }\n\n default:\n throw new Error(`Unknown or unsupported dialog type: \"${String(type)}\".`);\n }\n}\n\n/**\n * Resolve the current user interface with the given value.\n *\n * @param value - The value to resolve the user interface with.\n * @yields Puts the resolve user interface action.\n */\nexport function* resolveWithSaga(value: unknown): SagaIterator {\n yield put(resolveInterface(value));\n}\n\n/**\n * Resolve the current user interface with the given value. This returns a\n * function that can be used to resolve the user interface.\n *\n * @param runSaga - A function to run a saga outside the usual Redux flow.\n * @param value - The value to resolve the user interface with.\n * @returns A function that can be used to resolve the user interface.\n */\nfunction resolveWith(runSaga: RunSagaFunction, value: unknown) {\n return async () => {\n await runSaga(resolveWithSaga, value).toPromise();\n };\n}\n\n/**\n * Resolve the current user interface with the provided input. This returns a\n * function that can be used to resolve the user interface.\n *\n * @param runSaga - A function to run a saga outside the usual Redux flow.\n * @returns A function that can be used to resolve the user interface.\n */\nfunction resolveWithInput(runSaga: RunSagaFunction) {\n return async (value = '') => {\n await runSaga(resolveWithSaga, value).toPromise();\n };\n}\n\n/**\n * Get the stored user interface from the store.\n *\n * @param controllerMessenger - The controller messenger used to call actions.\n * @param snapId - The Snap ID.\n * @yields Takes the set interface action.\n * @returns The user interface object.\n */\nfunction* getStoredInterface(\n controllerMessenger: RootControllerMessenger,\n snapId: SnapId,\n): SagaIterator<Interface & { content: JSXElement }> {\n const currentInterface: Interface | null = yield select(getCurrentInterface);\n\n if (currentInterface) {\n const { content } = controllerMessenger.call(\n 'SnapInterfaceController:getInterface',\n snapId,\n currentInterface.id,\n );\n\n return { ...currentInterface, content };\n }\n\n const { payload }: PayloadAction<Interface> = yield take(setInterface.type);\n const { content } = controllerMessenger.call(\n 'SnapInterfaceController:getInterface',\n snapId,\n payload.id,\n );\n\n return { ...payload, content };\n}\n\n/**\n * A JSX element with a name.\n */\nexport type NamedJSXElement = JSXElement & { props: { name: string } };\n\n/**\n * Check if a JSX element is a JSX element with a given name.\n *\n * @param element - The JSX element.\n * @param name - The element name.\n * @returns True if the element is a JSX element with the given name, otherwise\n * false.\n */\nfunction isJSXElementWithName<Element extends JSXElement, Name extends string>(\n element: Element,\n name: Name,\n): element is Element & { props: { name: Name } } {\n return hasProperty(element.props, 'name') && element.props.name === name;\n}\n\n/**\n * Find an element inside a form element in a JSX tree.\n *\n * @param form - The form element.\n * @param name - The element name.\n * @returns An object containing the element and the form name if it's contained\n * in a form, otherwise undefined.\n */\nfunction getFormElement(form: FormElement, name: string) {\n const element = walkJsx<NamedJSXElement>(form, (childElement) => {\n if (isJSXElementWithName(childElement, name)) {\n return childElement;\n }\n\n return undefined;\n });\n\n if (element === undefined) {\n return undefined;\n }\n\n return { element, form: form.props.name };\n}\n\n/**\n * Get an object containing the element, and optional form that's associated\n * with the element if any.\n *\n * @param element - The JSX element.\n * @returns An object containing the element and optional form.\n */\nfunction getElementWithOptionalForm(element: NamedJSXElement): {\n element: NamedJSXElement;\n form?: string;\n} {\n if (element.type !== 'Button' || !element.props.form) {\n return { element };\n }\n\n return { element, form: element.props.form };\n}\n\n/**\n * Get an element from a JSX tree with the given name.\n *\n * @param content - The interface content.\n * @param name - The element name.\n * @returns An object containing the element and the form name if it's contained\n * in a form, otherwise undefined.\n */\nexport function getElement(\n content: JSXElement,\n name: string,\n):\n | {\n element: NamedJSXElement;\n form?: string;\n }\n | undefined {\n if (isJSXElementWithName(content, name)) {\n return getElementWithOptionalForm(content);\n }\n\n return walkJsx(content, (element) => {\n if (element.type === 'Form') {\n return getFormElement(element, name);\n }\n\n if (isJSXElementWithName(element, name)) {\n return getElementWithOptionalForm(element);\n }\n\n return undefined;\n });\n}\n\n/**\n * Get an element from a JSX tree with the given type.\n *\n * @param content - The interface content.\n * @param type - The element type.\n * @returns The element with the given type.\n */\nexport function getElementByType<Element extends JSXElement>(\n content: JSXElement,\n type: string,\n) {\n return walkJsx(content, (element) => {\n if (element.type === type) {\n return element as Element;\n }\n\n return undefined;\n });\n}\n\n/**\n * Handle submitting event requests to OnUserInput including unwrapping potential errors.\n *\n * @param controllerMessenger - The controller messenger used to call actions.\n * @param snapId - The Snap ID.\n * @param id - The interface ID.\n * @param event - The event to submit.\n * @param context - The interface context.\n */\nasync function handleEvent(\n controllerMessenger: RootControllerMessenger,\n snapId: SnapId,\n id: string,\n event: UserInputEvent,\n context: InterfaceContext | null,\n) {\n try {\n await controllerMessenger.call(\n 'ExecutionService:handleRpcRequest',\n snapId,\n {\n origin: 'metamask',\n handler: HandlerType.OnUserInput,\n request: {\n jsonrpc: '2.0',\n method: ' ',\n params: {\n event,\n id,\n context,\n },\n },\n },\n );\n } catch (error) {\n const [unwrapped] = unwrapError(error);\n throw unwrapped;\n }\n}\n\n/**\n * Click on an element of the Snap interface.\n *\n * @param controllerMessenger - The controller messenger used to call actions.\n * @param id - The interface ID.\n * @param content - The interface content.\n * @param snapId - The Snap ID.\n * @param name - The element name.\n */\nexport async function clickElement(\n controllerMessenger: RootControllerMessenger,\n id: string,\n content: JSXElement,\n snapId: SnapId,\n name: string,\n): Promise<void> {\n const result = getElement(content, name);\n assert(\n result !== undefined,\n `Could not find an element in the interface with the name \"${name}\".`,\n );\n\n assert(\n result.element.type === 'Button' || result.element.type === 'Checkbox',\n `Expected an element of type \"Button\" or \"Checkbox\", but found \"${result.element.type}\".`,\n );\n\n const { state, context } = controllerMessenger.call(\n 'SnapInterfaceController:getInterface',\n snapId,\n id,\n );\n\n const { type } = result.element;\n const elementName = result.element.props.name;\n\n const formState = (result.form ? state[result.form] : state) as FormState;\n const currentValue = formState[elementName];\n\n switch (type) {\n case 'Button': {\n // Button click events are always triggered.\n await handleEvent(\n controllerMessenger,\n snapId,\n id,\n {\n type: UserInputEventType.ButtonClickEvent,\n name: elementName,\n },\n context,\n );\n\n if (result.form && result.element.props.type === 'submit') {\n await handleEvent(\n controllerMessenger,\n snapId,\n id,\n {\n type: UserInputEventType.FormSubmitEvent,\n name: result.form,\n value: state[result.form] as FormState,\n },\n context,\n );\n }\n break;\n }\n\n case 'Checkbox': {\n const newValue = !currentValue;\n const newState = mergeValue(state, name, newValue, result.form);\n\n controllerMessenger.call(\n 'SnapInterfaceController:updateInterfaceState',\n id,\n newState,\n );\n\n await handleEvent(\n controllerMessenger,\n snapId,\n id,\n {\n type: UserInputEventType.InputChangeEvent,\n name: elementName,\n value: newValue,\n },\n context,\n );\n break;\n }\n\n /* istanbul ignore next */\n default:\n assertExhaustive(type);\n }\n}\n\n/**\n * Merge a value in the interface state.\n *\n * @param state - The actual interface state.\n * @param name - The component name that changed value.\n * @param value - The new value.\n * @param form - The form name if the element is in one.\n * @returns The state with the merged value.\n */\nexport function mergeValue(\n state: InterfaceState,\n name: string,\n value:\n | string\n | File\n | boolean\n | AccountSelectorState\n | AssetSelectorState\n | null,\n form?: string,\n): InterfaceState {\n if (form) {\n return {\n ...state,\n [form]: {\n ...(state[form] as FormState),\n [name]: value,\n },\n };\n }\n\n return { ...state, [name]: value };\n}\n\n/**\n * Process the input value for an input element based on the element type.\n *\n * @param value - The original input value.\n * @param element - The interface element.\n * @returns The processed value.\n */\nfunction processInputValue(value: string, element: NamedJSXElement): string {\n if (element.type === 'AddressInput') {\n const { chainId } = element.props;\n return `${chainId}:${value}`;\n }\n\n return value;\n}\n\n/**\n * Type a value in an interface element.\n *\n * @param controllerMessenger - The controller messenger used to call actions.\n * @param id - The interface ID.\n * @param content - The interface Components.\n * @param snapId - The Snap ID.\n * @param name - The element name.\n * @param value - The value to type in the element.\n */\nexport async function typeInField(\n controllerMessenger: RootControllerMessenger,\n id: string,\n content: JSXElement,\n snapId: SnapId,\n name: string,\n value: string,\n) {\n const result = getElement(content, name);\n\n assert(\n result !== undefined,\n `Could not find an element in the interface with the name \"${name}\".`,\n );\n\n assert(\n TYPEABLE_INPUTS.includes(result.element.type),\n `Expected an element of type ${formatTypeErrorMessage(TYPEABLE_INPUTS)}, but found \"${result.element.type}\".`,\n );\n\n const newValue = processInputValue(value, result.element);\n\n const { state, context } = controllerMessenger.call(\n 'SnapInterfaceController:getInterface',\n snapId,\n id,\n );\n\n const newState = mergeValue(state, name, newValue, result.form);\n\n controllerMessenger.call(\n 'SnapInterfaceController:updateInterfaceState',\n id,\n newState,\n );\n\n await controllerMessenger.call('ExecutionService:handleRpcRequest', snapId, {\n origin: 'metamask',\n handler: HandlerType.OnUserInput,\n request: {\n jsonrpc: '2.0',\n method: ' ',\n params: {\n event: {\n type: UserInputEventType.InputChangeEvent,\n name: result.element.props.name,\n value: newValue,\n },\n id,\n context,\n },\n },\n });\n}\n\n/**\n * Type a value in an interface element.\n *\n * @param controllerMessenger - The controller messenger used to call actions.\n * @param id - The interface ID.\n * @param content - The interface Components.\n * @param snapId - The Snap ID.\n * @param name - The element name.\n * @param value - The value to type in the element.\n */\nexport async function selectInDropdown(\n controllerMessenger: RootControllerMessenger,\n id: string,\n content: JSXElement,\n snapId: SnapId,\n name: string,\n value: string,\n) {\n const result = getElement(content, name);\n\n assert(\n result !== undefined,\n `Could not find an element in the interface with the name \"${name}\".`,\n );\n\n assert(\n result.element.type === 'Dropdown',\n `Expected an element of type \"Dropdown\", but found \"${result.element.type}\".`,\n );\n\n const options = getJsxChildren(result.element) as JSXElement[];\n const selectedOption = options.find(\n (option) =>\n hasProperty(option.props, 'value') && option.props.value === value,\n );\n\n assert(\n selectedOption !== undefined,\n `The dropdown with the name \"${name}\" does not contain \"${value}\".`,\n );\n\n const { state, context } = controllerMessenger.call(\n 'SnapInterfaceController:getInterface',\n snapId,\n id,\n );\n\n const newState = mergeValue(state, name, value, result.form);\n\n controllerMessenger.call(\n 'SnapInterfaceController:updateInterfaceState',\n id,\n newState,\n );\n\n await controllerMessenger.call('ExecutionService:handleRpcRequest', snapId, {\n origin: 'metamask',\n handler: HandlerType.OnUserInput,\n request: {\n jsonrpc: '2.0',\n method: ' ',\n params: {\n event: {\n type: UserInputEventType.InputChangeEvent,\n name: result.element.props.name,\n value,\n },\n id,\n context,\n },\n },\n });\n}\n\n/**\n * Choose an option with value from radio group interface element.\n *\n * @param controllerMessenger - The controller messenger used to call actions.\n * @param id - The interface ID.\n * @param content - The interface Components.\n * @param snapId - The Snap ID.\n * @param name - The element name.\n * @param value - The value to type in the element.\n */\nexport async function selectFromRadioGroup(\n controllerMessenger: RootControllerMessenger,\n id: string,\n content: JSXElement,\n snapId: SnapId,\n name: string,\n value: string,\n) {\n const result = getElement(content, name);\n\n assert(\n result !== undefined,\n `Could not find an element in the interface with the name \"${name}\".`,\n );\n\n assert(\n result.element.type === 'RadioGroup',\n `Expected an element of type \"RadioGroup\", but found \"${result.element.type}\".`,\n );\n\n const options = getJsxChildren(result.element) as JSXElement[];\n const selectedOption = options.find(\n (option) =>\n hasProperty(option.props, 'value') && option.props.value === value,\n );\n\n assert(\n selectedOption !== undefined,\n `The RadioGroup with the name \"${name}\" does not contain \"${value}\".`,\n );\n\n const { state, context } = controllerMessenger.call(\n 'SnapInterfaceController:getInterface',\n snapId,\n id,\n );\n\n const newState = mergeValue(state, name, value, result.form);\n\n controllerMessenger.call(\n 'SnapInterfaceController:updateInterfaceState',\n id,\n newState,\n );\n\n await controllerMessenger.call('ExecutionService:handleRpcRequest', snapId, {\n origin: 'metamask',\n handler: HandlerType.OnUserInput,\n request: {\n jsonrpc: '2.0',\n method: ' ',\n params: {\n event: {\n type: UserInputEventType.InputChangeEvent,\n name: result.element.props.name,\n value,\n },\n id,\n context,\n },\n },\n });\n}\n\n/**\n * Get the value from a Selector interface element.\n *\n * @param element - The Selector element to get the value from.\n * @param options - The simulation options.\n * @param value - The value to get from the Selector.\n *\n * @returns The value from the Selector element.\n */\nexport function getValueFromSelector(\n element: NamedJSXElement,\n options: SimulationOptions,\n value: string,\n) {\n switch (element.type) {\n case 'Selector': {\n const selectorOptions = getJsxChildren(element) as JSXElement[];\n const selectedOption = selectorOptions.find(\n (option) =>\n hasProperty(option.props, 'value') && option.props.value === value,\n );\n\n assert(\n selectedOption !== undefined,\n `The Selector with the name \"${element.props.name}\" does not contain \"${value}\".`,\n );\n\n return value;\n }\n\n case 'AccountSelector': {\n const { accounts } = options;\n\n const selectedAccount = accounts.find((account) => account.id === value);\n\n assert(\n selectedAccount !== undefined,\n `The AccountSelector with the name \"${element.props.name}\" does not contain an account with ID \"${value}\".`,\n );\n\n return {\n accountId: selectedAccount.id,\n addresses: createAccountList(\n selectedAccount.address,\n createChainIdList(selectedAccount.scopes, element.props.chainIds),\n ),\n };\n }\n\n case 'AssetSelector': {\n const { assets, accounts } = options;\n\n const selectedAsset = assets[value as CaipAssetType];\n\n const { address } = parseCaipAccountId(element.props.addresses[0]);\n\n const account = accounts.find(\n (simulationAccount) => simulationAccount.address === address,\n );\n\n const accountHasAsset = account?.assets?.some((asset) => asset === value);\n\n assert(\n selectedAsset !== undefined && accountHasAsset,\n `The AssetSelector with the name \"${element.props.name}\" does not contain an asset with ID \"${value}\".`,\n );\n\n return {\n asset: value as CaipAssetType,\n name: selectedAsset.name,\n symbol: selectedAsset.symbol,\n };\n }\n\n default:\n throw new Error(\n `Expected an element of type ${formatTypeErrorMessage(SELECTOR_ELEMENTS)}, but found \"${element.type}\".`,\n );\n }\n}\n\n/**\n * Choose an option with value from a Selector interface element.\n *\n * @param controllerMessenger - The controller messenger used to call actions.\n * @param options - The simulation options.\n * @param id - The interface ID.\n * @param content - The interface Components.\n * @param snapId - The Snap ID.\n * @param name - The element name.\n * @param value - The value to type in the element.\n */\nexport async function selectFromSelector(\n controllerMessenger: RootControllerMessenger,\n options: SimulationOptions,\n id: string,\n content: JSXElement,\n snapId: SnapId,\n name: string,\n value: string,\n) {\n const result = getElement(content, name);\n\n assert(\n result !== undefined,\n `Could not find an element in the interface with the name \"${name}\".`,\n );\n\n const selectedValue = getValueFromSelector(result.element, options, value);\n\n const { state, context } = controllerMessenger.call(\n 'SnapInterfaceController:getInterface',\n snapId,\n id,\n );\n\n const newState = mergeValue(state, name, selectedValue, result.form);\n\n controllerMessenger.call(\n 'SnapInterfaceController:updateInterfaceState',\n id,\n newState,\n );\n\n await controllerMessenger.call('ExecutionService:handleRpcRequest', snapId, {\n origin: 'metamask',\n handler: HandlerType.OnUserInput,\n request: {\n jsonrpc: '2.0',\n method: ' ',\n params: {\n event: {\n type: UserInputEventType.InputChangeEvent,\n name: result.element.props.name,\n value: selectedValue,\n },\n id,\n context,\n },\n },\n });\n}\n\n/**\n * Wait for an interface to be updated.\n *\n * @param controllerMessenger - The controller messenger used to call actions.\n * @param options - The simulation options.\n * @param snapId - The Snap ID.\n * @param id - The interface ID.\n * @param originalContent - The original interface content.\n * @returns A promise that resolves to the updated interface.\n */\nexport async function waitForUpdate(\n controllerMessenger: RootControllerMessenger,\n options: SimulationOptions,\n snapId: SnapId,\n id: string,\n originalContent: JSXElement,\n) {\n return new Promise<SnapHandlerInterface>((resolve) => {\n const listener = (state: SnapInterfaceControllerState) => {\n const currentInterface = state.interfaces[id];\n const newContent = currentInterface?.content;\n\n if (!deepEqual(originalContent, newContent)) {\n controllerMessenger.unsubscribe(\n 'SnapInterfaceController:stateChange',\n listener,\n );\n\n const actions = getInterfaceActions(\n snapId,\n controllerMessenger,\n options,\n {\n content: newContent,\n id,\n },\n );\n\n resolve({ ...actions, content: newContent });\n }\n };\n\n controllerMessenger.subscribe(\n 'SnapInterfaceController:stateChange',\n listener,\n );\n });\n}\n\n/**\n * Get a formatted file size.\n *\n * @param size - The file size in bytes.\n * @returns The formatted file size in MB, with two decimal places.\n * @example\n * getFormattedFileSize(1_000_000); // '1.00 MB'\n */\nfunction getFormattedFileSize(size: number) {\n return `${(size / 1_000_000).toFixed(2)} MB`;\n}\n\n/**\n * Upload a file to an interface element.\n *\n * @param controllerMessenger - The controller messenger used to call actions.\n * @param id - The interface ID.\n * @param content - The interface Components.\n * @param snapId - The Snap ID.\n * @param name - The element name.\n * @param file - The file to upload. This can be a path to a file or a\n * `Uint8Array` containing the file contents. If this is a path, the file is\n * resolved relative to the current working directory.\n * @param options - The file options.\n * @param options.fileName - The name of the file. By default, this is\n * inferred from the file path if it's a path, and defaults to an empty string\n * if it's a `Uint8Array`.\n * @param options.contentType - The content type of the file. By default, this\n * is inferred from the file name if it's a path, and defaults to\n * `application/octet-stream` if it's a `Uint8Array` or the content type\n * cannot be inferred from the file name.\n */\nexport async function uploadFile(\n controllerMessenger: RootControllerMessenger,\n id: string,\n content: JSXElement,\n snapId: SnapId,\n name: string,\n file: string | Uint8Array,\n options?: FileOptions,\n) {\n const result = getElement(content, name);\n\n assert(\n result !== undefined,\n `Could not find an element in the interface with the name \"${name}\".`,\n );\n\n assert(\n result.element.type === 'FileInput',\n `Expected an element of type \"FileInput\", but found \"${result.element.type}\".`,\n );\n\n const { state, context } = controllerMessenger.call(\n 'SnapInterfaceController:getInterface',\n snapId,\n id,\n );\n\n const fileSize = await getFileSize(file);\n if (fileSize > MAX_FILE_SIZE) {\n throw new Error(\n `The file size (${getFormattedFileSize(\n fileSize,\n )}) exceeds the maximum allowed size of ${getFormattedFileSize(\n MAX_FILE_SIZE,\n )}.`,\n );\n }\n\n const fileObject = await getFileToUpload(file, options);\n const newState = mergeValue(state, name, fileObject, result.form);\n\n controllerMessenger.call(\n 'SnapInterfaceController:updateInterfaceState',\n id,\n newState,\n );\n\n await controllerMessenger.call('ExecutionService:handleRpcRequest', snapId, {\n origin: 'metamask',\n handler: HandlerType.OnUserInput,\n request: {\n jsonrpc: '2.0',\n method: ' ',\n params: {\n event: {\n type: UserInputEventType.FileUploadEvent,\n name: result.element.props.name,\n file: fileObject,\n },\n id,\n context,\n },\n },\n });\n}\n\n/**\n * Get the user interface actions for a Snap interface. These actions can be\n * used to interact with the interface.\n *\n * @param snapId - The Snap ID.\n * @param controllerMessenger - The controller messenger used to call actions.\n * @param simulationOptions - The simulation options.\n * @param interface - The interface object.\n * @param interface.content - The interface content.\n * @param interface.id - The interface ID.\n * @returns The user interface actions.\n */\nexport function getInterfaceActions(\n snapId: SnapId,\n controllerMessenger: RootControllerMessenger,\n simulationOptions: SimulationOptions,\n { content, id }: Omit<Interface, 'type'> & { content: JSXElement },\n): SnapInterfaceActions {\n return {\n clickElement: async (name: string) => {\n await clickElement(controllerMessenger, id, content, snapId, name);\n },\n\n typeInField: async (name: string, value: string) => {\n await typeInField(controllerMessenger, id, content, snapId, name, value);\n },\n\n selectInDropdown: async (name: string, value: string) => {\n await selectInDropdown(\n controllerMessenger,\n id,\n content,\n snapId,\n name,\n value,\n );\n },\n\n selectFromRadioGroup: async (name: string, value: string) => {\n await selectFromRadioGroup(\n controllerMessenger,\n id,\n content,\n snapId,\n name,\n value,\n );\n },\n\n selectFromSelector: async (name: string, value: string) => {\n await selectFromSelector(\n controllerMessenger,\n simulationOptions,\n id,\n content,\n snapId,\n name,\n value,\n );\n },\n\n uploadFile: async (\n name: string,\n file: string | Uint8Array,\n options?: FileOptions,\n ) => {\n await uploadFile(\n controllerMessenger,\n id,\n content,\n snapId,\n name,\n file,\n options,\n );\n },\n\n waitForUpdate: async () =>\n waitForUpdate(\n controllerMessenger,\n simulationOptions,\n snapId,\n id,\n content,\n ),\n };\n}\n\n/**\n * Get a user interface object from a Snap.\n *\n * @param runSaga - A function to run a saga outside the usual Redux flow.\n * @param snapId - The Snap ID.\n * @param controllerMessenger - The controller messenger used to call actions.\n * @param options - The simulation options.\n * @yields Takes the set interface action.\n * @returns The user interface object.\n */\nexport function* getInterface(\n runSaga: RunSagaFunction,\n snapId: SnapId,\n controllerMessenger: RootControllerMessenger,\n options: SimulationOptions,\n): SagaIterator {\n const storedInterface = yield call(\n getStoredInterface,\n controllerMessenger,\n snapId,\n );\n\n const interfaceActions = getInterfaceActions(\n snapId,\n controllerMessenger,\n options,\n storedInterface,\n );\n\n return getInterfaceResponse(\n runSaga,\n storedInterface.type,\n storedInterface.id,\n storedInterface.content,\n interfaceActions,\n );\n}\n"]}