{"version":3,"file":"KeyringInternalSnapClient.mjs","sourceRoot":"","sources":["../src/KeyringInternalSnapClient.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,OAAO,EAAE,gBAAgB,EAAE,8BAA8B;AAKzD,OAAO,EAAE,6BAA6B,EAAE,uCAAuC;AAC/E,OAAO,EAAE,aAAa,EAAe,sCAAsC;AAC3E,OAAO,EAAE,UAAU,EAAuB,gCAAgC;AAqB1E;;;GAGG;AACH,MAAM,6BAA6B;IASjC;;;;;;;OAOG;IACH,YACE,SAA6C,EAC7C,MAAc,EACd,MAAc,EACd,OAAoB;QApBb,wDAAgB;QAEhB,wDAAgB;QAEhB,2DAA+C;QAE/C,yDAAsB;QAgB7B,uBAAA,IAAI,4CAAc,SAAS,MAAA,CAAC;QAC5B,uBAAA,IAAI,yCAAW,MAAM,MAAA,CAAC;QACtB,uBAAA,IAAI,yCAAW,MAAM,MAAA,CAAC;QACtB,uBAAA,IAAI,0CAAY,OAAO,MAAA,CAAC;IAC1B,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,IAAI,CAAC,OAAuB;QAChC,OAAO,uBAAA,IAAI,gDAAW,CAAC,IAAI,CAAC,8BAA8B,EAAE;YAC1D,MAAM,EAAE,uBAAA,IAAI,6CAAQ;YACpB,MAAM,EAAE,uBAAA,IAAI,6CAAQ;YACpB,OAAO,EAAE,uBAAA,IAAI,8CAAS;YACtB,OAAO;SACR,CAAkB,CAAC;IACtB,CAAC;CACF;;AAED;;;GAGG;AACH,MAAM,OAAO,yBAA0B,SAAQ,aAAa;IAG1D;;;;;;;;;;;;OAYG;IACH,YAAY,EACV,SAAS,EACT,MAAM,GAAG,WAAqB,EAC9B,MAAM,GAAG,UAAU,EACnB,OAAO,GAAG,kBAAiC,GAM5C;QACC,KAAK,CACH,IAAI,6BAA6B,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CACtE,CAAC;QA5BK,uDAA+C;QA6BtD,uBAAA,IAAI,wCAAc,SAAS,MAAA,CAAC;IAC9B,CAAC;IAED;;;;;;;OAOG;IACH,UAAU,CAAC,MAAc;QACvB,OAAO,IAAI,yBAAyB,CAAC;YACnC,SAAS,EAAE,uBAAA,IAAI,4CAAW;YAC1B,MAAM;SACP,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,eAAe,CAAC,OAAyB;QAC7C,OAAO,UAAU,CACf,MAAM,IAAI,CAAC,IAAI,CAAC;YACd,MAAM,EAAE,gBAAgB,CAAC,aAAa;YACtC,MAAM,EAAE,OAAO;SAChB,CAAC,EACF,6BAA6B,CAC9B,CAAC;IACJ,CAAC;CACF","sourcesContent":["import type { RestrictedMessenger } from '@metamask/base-controller';\nimport { KeyringRpcMethod } from '@metamask/keyring-api';\nimport type {\n  KeyringRequestV1,\n  KeyringResponseV1,\n} from '@metamask/keyring-internal-api';\nimport { SubmitRequestResponseV1Struct } from '@metamask/keyring-internal-api';\nimport { KeyringClient, type Sender } from '@metamask/keyring-snap-client';\nimport { strictMask, type JsonRpcRequest } from '@metamask/keyring-utils';\nimport type { HandleSnapRequest } from '@metamask/snaps-controllers';\nimport type { SnapId } from '@metamask/snaps-sdk';\nimport type { HandlerType } from '@metamask/snaps-utils';\nimport type { Json } from '@metamask/utils';\n\n// We only need to dispatch Snap request to the Snaps controller for now.\ntype AllowedActions = HandleSnapRequest;\n\n/**\n * A restricted-`Messenger` used by `KeyringInternalSnapClient` to dispatch\n * internal Snap requests.\n */\nexport type KeyringInternalSnapClientMessenger = RestrictedMessenger<\n  'KeyringInternalSnapClient',\n  AllowedActions,\n  never,\n  AllowedActions['type'],\n  never\n>;\n\n/**\n * Implementation of the `Sender` interface that can be used to send requests\n * to a Snap through a `Messenger`.\n */\nclass SnapControllerMessengerSender implements Sender {\n  readonly #snapId: SnapId;\n\n  readonly #origin: string;\n\n  readonly #messenger: KeyringInternalSnapClientMessenger;\n\n  readonly #handler: HandlerType;\n\n  /**\n   * Create a new instance of `SnapControllerSender`.\n   *\n   * @param messenger - The `Messenger` instance used when dispatching controllers actions.\n   * @param snapId - The ID of the Snap to use.\n   * @param origin - The sender's origin.\n   * @param handler - The handler type.\n   */\n  constructor(\n    messenger: KeyringInternalSnapClientMessenger,\n    snapId: SnapId,\n    origin: string,\n    handler: HandlerType,\n  ) {\n    this.#messenger = messenger;\n    this.#snapId = snapId;\n    this.#origin = origin;\n    this.#handler = handler;\n  }\n\n  /**\n   * Send a request to the Snap and return the response.\n   *\n   * @param request - JSON-RPC request to send to the Snap.\n   * @returns A promise that resolves to the response of the request.\n   */\n  async send(request: JsonRpcRequest): Promise<Json> {\n    return this.#messenger.call('SnapController:handleRequest', {\n      snapId: this.#snapId,\n      origin: this.#origin,\n      handler: this.#handler,\n      request,\n    }) as Promise<Json>;\n  }\n}\n\n/**\n * A `KeyringClient` that allows the communication with a Snap through a\n * `Messenger`.\n */\nexport class KeyringInternalSnapClient extends KeyringClient {\n  readonly #messenger: KeyringInternalSnapClientMessenger;\n\n  /**\n   * Create a new instance of `KeyringInternalSnapClient`.\n   *\n   * The `handlerType` argument has a hard-coded default `string` value instead\n   * of a `HandlerType` value to prevent the `@metamask/snaps-utils` module\n   * from being required at runtime.\n   *\n   * @param args - Constructor arguments.\n   * @param args.messenger - The `KeyringInternalSnapClientMessenger` instance to use.\n   * @param args.snapId - The ID of the Snap to use (default: `'undefined'`).\n   * @param args.origin - The sender's origin (default: `'metamask'`).\n   * @param args.handler - The handler type (default: `'onKeyringRequest'`).\n   */\n  constructor({\n    messenger,\n    snapId = 'undefined' as SnapId,\n    origin = 'metamask',\n    handler = 'onKeyringRequest' as HandlerType,\n  }: {\n    messenger: KeyringInternalSnapClientMessenger;\n    snapId?: SnapId;\n    origin?: string;\n    handler?: HandlerType;\n  }) {\n    super(\n      new SnapControllerMessengerSender(messenger, snapId, origin, handler),\n    );\n    this.#messenger = messenger;\n  }\n\n  /**\n   * Create a new instance of `KeyringInternalSnapClient` with the specified\n   * `snapId`.\n   *\n   * @param snapId - The ID of the Snap to use in the new instance.\n   * @returns A new instance of `KeyringInternalSnapClient` with the\n   * specified Snap ID.\n   */\n  withSnapId(snapId: SnapId): KeyringInternalSnapClient {\n    return new KeyringInternalSnapClient({\n      messenger: this.#messenger,\n      snapId,\n    });\n  }\n\n  /**\n   * Submit a keyring request v1 (with no `origin`).\n   *\n   * @param request - Keyring request.\n   * @returns Keyring request's response.\n   */\n  async submitRequestV1(request: KeyringRequestV1): Promise<KeyringResponseV1> {\n    return strictMask(\n      await this.send({\n        method: KeyringRpcMethod.SubmitRequest,\n        params: request,\n      }),\n      SubmitRequestResponseV1Struct,\n    );\n  }\n}\n"]}