{"version":3,"file":"BaseSnapExecutor.mjs","sourceRoot":"","sources":["../../src/common/BaseSnapExecutor.ts"],"names":[],"mappings":"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","sourcesContent":["// eslint-disable-next-line @typescript-eslint/triple-slash-reference, spaced-comment\n/// <reference path=\"../../../../node_modules/ses/types.d.ts\" />\nimport { createIdRemapMiddleware } from '@metamask/json-rpc-engine';\nimport ObjectMultiplex from '@metamask/object-multiplex';\nimport type { RequestArguments, StreamProvider } from '@metamask/providers';\nimport { errorCodes, rpcErrors, serializeError } from '@metamask/rpc-errors';\nimport type { SnapsEthereumProvider, SnapsProvider } from '@metamask/snaps-sdk';\nimport { getErrorData } from '@metamask/snaps-sdk';\nimport type {\n  SnapExports,\n  HandlerType,\n  SnapExportsParameters,\n} from '@metamask/snaps-utils';\nimport {\n  SNAP_EXPORT_NAMES,\n  logError,\n  SNAP_EXPORTS,\n  WrappedSnapError,\n  unwrapError,\n  logInfo,\n} from '@metamask/snaps-utils';\nimport { is } from '@metamask/superstruct';\nimport type {\n  JsonRpcNotification,\n  JsonRpcId,\n  JsonRpcRequest,\n  Json,\n} from '@metamask/utils';\nimport {\n  assert,\n  isJsonRpcRequest,\n  hasProperty,\n  getSafeJson,\n  JsonRpcIdStruct,\n  createDeferredPromise,\n} from '@metamask/utils';\nimport type { Duplex } from 'readable-stream';\nimport { pipeline } from 'readable-stream';\n\nimport { assertCommandParams, getHandlerArguments } from './commands';\nimport { createEndowments } from './endowments';\nimport { addEventListener, removeEventListener } from './globalEvents';\nimport { SnapProvider } from './SnapProvider';\nimport {\n  assertEthereumOutboundRequest,\n  assertSnapOutboundRequest,\n  sanitizeRequestArguments,\n  withTeardown,\n  isValidResponse,\n  isMultichainRequest,\n  assertMultichainOutboundRequest,\n} from './utils';\nimport type {\n  ExecuteSnapRequestArguments,\n  SnapRpcRequestArguments,\n} from './validation';\nimport {\n  ExecuteSnapRequestArgumentsStruct,\n  SnapRpcRequestArgumentsStruct,\n} from './validation';\nimport { log } from '../logging';\n\ntype EvaluationData = {\n  stop: () => void;\n};\n\ntype SnapData = {\n  exports: SnapExports;\n  runningEvaluations: Set<EvaluationData>;\n  idleTeardown: () => Promise<void>;\n};\n\nconst fallbackError = {\n  code: errorCodes.rpc.internal,\n  message: 'Execution Environment Error',\n};\n\nconst unhandledError = rpcErrors\n  .internal<Json>({\n    message: 'Unhandled Snap Error',\n  })\n  .serialize();\n\nexport type InvokeSnapArgs = Omit<SnapExportsParameters[0], 'chainId'>;\n\nexport type InvokeSnap = (\n  target: string,\n  handler: HandlerType,\n  args: InvokeSnapArgs | undefined,\n) => Promise<Json>;\n\nexport type { NotifyFunction } from './endowments/commonEndowmentFactory';\n\nexport class BaseSnapExecutor {\n  readonly #snapData: Map<string, SnapData>;\n\n  readonly #commandStream: Duplex;\n\n  readonly #rpcStream: Duplex;\n\n  #snapErrorHandler?: (event: ErrorEvent) => void;\n\n  #snapPromiseErrorHandler?: (event: PromiseRejectionEvent) => void;\n\n  readonly #teardownRef = { lastTeardown: 0 };\n\n  protected constructor(commandStream: Duplex, rpcStream: Duplex) {\n    this.#snapData = new Map();\n    this.#commandStream = commandStream;\n    this.#commandStream.on('data', (data) => {\n      /* istanbul ignore next 2 */\n      this.#onCommandRequest(data).catch((error) => {\n        logError(error);\n      });\n    });\n    this.#rpcStream = rpcStream;\n  }\n\n  #errorHandler(error: unknown, data: Record<string, Json>) {\n    const serializedError = serializeError(error, {\n      fallbackError: unhandledError,\n      shouldIncludeStack: false,\n      shouldPreserveMessage: false,\n    });\n\n    const errorData = getErrorData(serializedError);\n\n    this.#notify({\n      method: 'UnhandledError',\n      params: {\n        error: {\n          ...serializedError,\n          data: {\n            ...errorData,\n            ...data,\n          },\n        },\n      },\n    }).catch((notifyError) => {\n      logError(notifyError);\n    });\n  }\n\n  async #onCommandRequest(message: JsonRpcRequest) {\n    if (!isJsonRpcRequest(message)) {\n      if (\n        hasProperty(message, 'id') &&\n        is((message as Pick<JsonRpcRequest, 'id'>).id, JsonRpcIdStruct)\n      ) {\n        // Instead of throwing, we directly respond with an error.\n        // We can only do this if the message ID is still valid.\n        await this.#respond((message as Pick<JsonRpcRequest, 'id'>).id, {\n          error: serializeError(\n            rpcErrors.internal(\n              'JSON-RPC requests must be JSON serializable objects.',\n            ),\n          ),\n        });\n      } else {\n        logInfo(\n          'Command stream received a non-JSON-RPC request, and was unable to respond.',\n        );\n      }\n      return;\n    }\n\n    const { id, method, params } = message;\n\n    try {\n      const result = await this.#handleCommand(method, params);\n      await this.#respond(id, { result });\n    } catch (rpcError) {\n      await this.#respond(id, {\n        error: serializeError(rpcError, {\n          fallbackError,\n          shouldPreserveMessage: false,\n        }),\n      });\n    }\n  }\n\n  /**\n   * Handle an incoming JSON-RPC command request.\n   *\n   * @param method - The JSON-RPC method name.\n   * @param params - The optional JSON-RPC parameters.\n   * @returns The response based on the JSON-RPC method invoked.\n   * @throws If the passed method is not available.\n   */\n  async #handleCommand(method: string, params?: Json) {\n    switch (method) {\n      case 'ping':\n        return 'OK';\n\n      case 'terminate': {\n        this.#handleTerminate();\n        return 'OK';\n      }\n\n      case 'executeSnap': {\n        assertCommandParams(method, params, ExecuteSnapRequestArgumentsStruct);\n        await this.#startSnap(params);\n        return 'OK';\n      }\n\n      case 'snapRpc': {\n        assertCommandParams(method, params, SnapRpcRequestArgumentsStruct);\n        return await this.#invokeSnap(params);\n      }\n\n      default:\n        throw rpcErrors.methodNotFound({\n          data: {\n            method,\n          },\n        });\n    }\n  }\n\n  /**\n   * Invoke an exported handler on a running Snap.\n   *\n   * @param options - An options bag.\n   * @param options.snapId - The Snap ID.\n   * @param options.handler - The handler to invoke.\n   * @param options.origin - The origin invoking the handler.\n   * @param options.request - The JSON-RPC request to invoke the handler with.\n   * @returns The result of invoking the handler on the Snap.\n   */\n  async #invokeSnap({\n    snapId,\n    handler: handlerType,\n    origin,\n    request,\n  }: SnapRpcRequestArguments) {\n    const args = getHandlerArguments(origin, handlerType, request);\n\n    const data = this.#snapData.get(snapId);\n    // We're capturing the handler in case someone modifies the data object\n    // before the call.\n    const handler = data?.exports[handlerType];\n    const { required } = SNAP_EXPORTS[handlerType];\n\n    assert(\n      !required || handler !== undefined,\n      `No ${handlerType} handler exported for Snap \"${snapId}\".`,\n      rpcErrors.methodNotSupported,\n    );\n\n    // Certain handlers are not required. If they are not exported, we\n    // return null.\n    if (!handler) {\n      return null;\n    }\n\n    const result = await this.#executeInSnapContext(snapId, async () =>\n      // TODO: fix handler args type cast\n      handler(args as any),\n    );\n\n    // The handler might not return anything, but undefined is not valid JSON.\n    if (result === undefined || result === null) {\n      return null;\n    }\n\n    // /!\\ Always return only sanitized JSON to prevent security flaws. /!\\\n    try {\n      return getSafeJson(result);\n    } catch (error) {\n      throw rpcErrors.internal(\n        `Received non-JSON-serializable value: ${error.message.replace(\n          /^Assertion failed: /u,\n          '',\n        )}`,\n      );\n    }\n  }\n\n  // Awaitable function that writes back to the command stream\n  // To prevent snap execution from blocking writing we wrap in a promise\n  // and await it before continuing execution\n  async #write(chunk: Json) {\n    return new Promise<void>((resolve, reject) => {\n      this.#commandStream.write(chunk, (error) => {\n        if (error) {\n          reject(error);\n          return;\n        }\n        resolve();\n      });\n    });\n  }\n\n  async #notify(notification: Omit<JsonRpcNotification, 'jsonrpc'>) {\n    if (!isValidResponse(notification)) {\n      throw rpcErrors.internal(\n        'JSON-RPC notifications must be JSON serializable objects smaller than 64 MB.',\n      );\n    }\n\n    await this.#write({\n      ...notification,\n      jsonrpc: '2.0',\n    });\n  }\n\n  async #respond(id: JsonRpcId, response: Record<string, Json>) {\n    if (!isValidResponse(response)) {\n      // Instead of throwing, we directly respond with an error.\n      // This prevents an issue where we wouldn't respond when errors were non-serializable\n      await this.#write({\n        error: serializeError(\n          rpcErrors.internal(\n            'JSON-RPC responses must be JSON serializable objects smaller than 64 MB.',\n          ),\n        ),\n        id,\n        jsonrpc: '2.0',\n      });\n      return;\n    }\n\n    await this.#write({\n      ...response,\n      id,\n      jsonrpc: '2.0',\n    });\n  }\n\n  /**\n   * Attempts to evaluate a snap in SES. Generates APIs for the snap. May throw\n   * on errors.\n   *\n   * @param params - The parameters.\n   * @param params.snapId - The id of the snap.\n   * @param params.sourceCode - The source code of the snap, in IIFE format.\n   * @param params.endowments - An array of the names of the endowments.\n   */\n  async #startSnap({\n    snapId,\n    sourceCode,\n    endowments: endowmentKeys,\n  }: ExecuteSnapRequestArguments): Promise<void> {\n    log(`Starting snap '${snapId}' in worker.`);\n    if (this.#snapPromiseErrorHandler) {\n      removeEventListener('unhandledrejection', this.#snapPromiseErrorHandler);\n    }\n\n    if (this.#snapErrorHandler) {\n      removeEventListener('error', this.#snapErrorHandler);\n    }\n\n    this.#snapErrorHandler = (error: ErrorEvent) => {\n      this.#errorHandler(error.error, { snapId });\n    };\n\n    this.#snapPromiseErrorHandler = (error: PromiseRejectionEvent) => {\n      this.#errorHandler(error instanceof Error ? error : error.reason, {\n        snapId,\n      });\n    };\n\n    const multiplex = new ObjectMultiplex();\n    pipeline(this.#rpcStream, multiplex, this.#rpcStream, (error) => {\n      if (error && !error.message?.match('Premature close')) {\n        logError(`Provider stream failure.`, error);\n      }\n    });\n\n    const provider = new SnapProvider(\n      multiplex.createStream('metamask-provider'),\n      {\n        rpcMiddleware: [createIdRemapMiddleware()],\n      },\n    );\n\n    provider.initializeSync();\n\n    const multichainProvider = new SnapProvider(\n      multiplex.createStream('metamask-multichain-provider'),\n      {\n        rpcMiddleware: [createIdRemapMiddleware()],\n      },\n    );\n\n    multichainProvider.initializeSync();\n\n    const snap = this.#createSnapGlobal(provider, multichainProvider);\n    const ethereum = this.#createEIP1193Provider(provider);\n    // We specifically use any type because the Snap can modify the object any way they want\n    const snapModule: any = { exports: {} };\n\n    try {\n      const { endowments, teardown: endowmentTeardown } = createEndowments({\n        snap,\n        ethereum,\n        snapId,\n        endowments: endowmentKeys,\n        notify: this.#notify.bind(this),\n      });\n\n      // !!! Ensure that this is the only place the data is being set.\n      // Other methods access the object value and mutate its properties.\n      this.#snapData.set(snapId, {\n        idleTeardown: endowmentTeardown,\n        runningEvaluations: new Set(),\n        exports: {},\n      });\n\n      addEventListener('unhandledRejection', this.#snapPromiseErrorHandler);\n      addEventListener('error', this.#snapErrorHandler);\n\n      const compartment = new Compartment({\n        ...endowments,\n        module: snapModule,\n        exports: snapModule.exports,\n      });\n\n      // All of those are JavaScript runtime specific and self referential,\n      // but we add them for compatibility sake with external libraries.\n      //\n      // We can't do that in the injected globals object above\n      // because SES creates its own globalThis\n      compartment.globalThis.self = compartment.globalThis;\n      compartment.globalThis.global = compartment.globalThis;\n      compartment.globalThis.window = compartment.globalThis;\n\n      await this.#executeInSnapContext(snapId, async () => {\n        compartment.evaluate(sourceCode);\n        await this.#registerSnapExports(snapId, snapModule);\n      });\n    } catch (error) {\n      this.#removeSnap(snapId);\n\n      const [cause] = unwrapError(error);\n      throw rpcErrors.internal({\n        message: `Error while running snap '${snapId}': ${cause.message}`,\n        data: {\n          cause: cause.serialize(),\n        },\n      });\n    }\n  }\n\n  /**\n   * Cancels all running evaluations of all snaps and clears all snap data.\n   * NOTE:** Should only be called in response to the `terminate` RPC command.\n   */\n  #handleTerminate() {\n    // `stop()` tears down snap endowments.\n    // Teardown will also be run for each snap as soon as there are\n    // no more running evaluations for that snap.\n    this.#snapData.forEach((data) =>\n      data.runningEvaluations.forEach((evaluation) => evaluation.stop()),\n    );\n    this.#snapData.clear();\n  }\n\n  async #registerSnapExports(snapId: string, snapModule: any) {\n    const data = this.#snapData.get(snapId);\n    // Somebody deleted the snap before we could register.\n    if (!data) {\n      return;\n    }\n\n    // If the module is async, we must await the exports.\n    const snapExports = await snapModule.exports;\n    data.exports = SNAP_EXPORT_NAMES.reduce((acc, exportName) => {\n      const snapExport = snapExports[exportName];\n      const { validator } = SNAP_EXPORTS[exportName];\n      if (validator(snapExport)) {\n        return { ...acc, [exportName]: snapExport };\n      }\n      return acc;\n    }, {});\n\n    // If the Snap has no valid exports after this, fail.\n    assert(Object.keys(data.exports).length > 0, 'Snap has no valid exports.');\n  }\n\n  /**\n   * Instantiates a snap API object (i.e. `globalThis.snap`).\n   *\n   * @param provider - A StreamProvider connected to the EIP-1193 client stream.\n   * @param multichainProvider - A StreamProvider connected to the CAIP-27 client stream.\n   * @returns The snap provider object.\n   */\n  #createSnapGlobal(\n    provider: StreamProvider,\n    multichainProvider: StreamProvider,\n  ): SnapsProvider {\n    const originalRequest = provider.request.bind(provider);\n    const originalMultichainRequest =\n      multichainProvider.request.bind(multichainProvider);\n\n    const request = async (args: RequestArguments) => {\n      // As part of the sanitization, we validate that the args are valid JSON.\n      const sanitizedArgs = sanitizeRequestArguments(args);\n      assertSnapOutboundRequest(sanitizedArgs);\n\n      if (isMultichainRequest(sanitizedArgs)) {\n        assertMultichainOutboundRequest(sanitizedArgs);\n        return await withTeardown(\n          originalMultichainRequest(sanitizedArgs),\n          this.#teardownRef,\n        );\n      }\n\n      return await withTeardown(\n        originalRequest(sanitizedArgs),\n        this.#teardownRef,\n      );\n    };\n\n    const snapsProvider = { request } as SnapsProvider;\n\n    return harden(snapsProvider);\n  }\n\n  /**\n   * Instantiates an EIP-1193 Ethereum provider object (i.e. `globalThis.ethereum`).\n   *\n   * @param provider - A StreamProvider connected to MetaMask.\n   * @returns The EIP-1193 Ethereum provider object.\n   */\n  #createEIP1193Provider(provider: StreamProvider): SnapsEthereumProvider {\n    const originalRequest = provider.request.bind(provider);\n\n    const request = async (args: RequestArguments) => {\n      // As part of the sanitization, we validate that the args are valid JSON.\n      const sanitizedArgs = sanitizeRequestArguments(args);\n      assertEthereumOutboundRequest(sanitizedArgs);\n      return await withTeardown(\n        originalRequest(sanitizedArgs),\n        this.#teardownRef,\n      );\n    };\n\n    const ethereumProvider = { request };\n\n    return harden(ethereumProvider);\n  }\n\n  /**\n   * Removes the snap with the given name.\n   *\n   * @param snapId - The id of the snap to remove.\n   */\n  #removeSnap(snapId: string): void {\n    this.#snapData.delete(snapId);\n  }\n\n  /**\n   * Calls the specified executor function in the context of the specified snap.\n   * Essentially, this means that the operation performed by the executor is\n   * counted as an evaluation of the specified snap. When the count of running\n   * evaluations of a snap reaches zero, its endowments are torn down.\n   *\n   * @param snapId - The id of the snap whose context to execute in.\n   * @param executor - The function that will be executed in the snap's context.\n   * @returns The executor's return value.\n   * @template Result - The return value of the executor.\n   */\n  async #executeInSnapContext<Result>(\n    snapId: string,\n    executor: () => Promise<Result> | Result,\n  ): Promise<Result> {\n    const data = this.#snapData.get(snapId);\n    if (data === undefined) {\n      throw rpcErrors.internal(\n        `Tried to execute in context of unknown snap: \"${snapId}\".`,\n      );\n    }\n\n    const { promise: stopPromise, reject } = createDeferredPromise<Result>();\n\n    const stop = () =>\n      reject(\n        rpcErrors.internal(\n          `The Snap \"${snapId}\" has been terminated during execution.`,\n        ),\n      );\n\n    const evaluationData = { stop };\n\n    try {\n      data.runningEvaluations.add(evaluationData);\n      // Notice that we have to await this executor.\n      // If we didn't, we would decrease the amount of running evaluations\n      // before the promise actually resolves\n      return await Promise.race([executor(), stopPromise]);\n    } catch (error) {\n      throw new WrappedSnapError(error);\n    } finally {\n      data.runningEvaluations.delete(evaluationData);\n\n      if (data.runningEvaluations.size === 0) {\n        this.#teardownRef.lastTeardown += 1;\n        await data.idleTeardown();\n      }\n    }\n  }\n}\n"]}