{"version":3,"file":"KeyringInternalSnapClient.mjs","sourceRoot":"","sources":["../src/KeyringInternalSnapClient.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,gBAAgB,EAAE,8BAA8B;AAKzD,OAAO,EAAE,6BAA6B,EAAE,uCAAuC;AAE/E,OAAO,EAAE,aAAa,EAAE,sCAAsC;AAC9D,OAAO,EAAE,UAAU,EAAE,gCAAgC;AAmBrD;;;GAGG;AACH,MAAM,OAAO,6BAA6B;IASxC;;;;;;;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,0BAA0B,CAC9B,OAAoC;QAEpC,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 { KeyringRpcMethod } from '@metamask/keyring-api';\nimport type {\n  KeyringRequestWithoutOrigin,\n  KeyringResponseWithoutOrigin,\n} from '@metamask/keyring-internal-api';\nimport { SubmitRequestResponseV1Struct } from '@metamask/keyring-internal-api';\nimport type { Sender } from '@metamask/keyring-snap-client';\nimport { KeyringClient } from '@metamask/keyring-snap-client';\nimport { strictMask } from '@metamask/keyring-utils';\nimport type { Messenger } from '@metamask/messenger';\nimport type { SnapControllerHandleRequestAction } from '@metamask/snaps-controllers';\nimport type { JsonRpcRequest, 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 = SnapControllerHandleRequestAction;\n\n/**\n * A restricted-`Messenger` used by `KeyringInternalSnapClient` to dispatch\n * internal Snap requests.\n */\nexport type KeyringInternalSnapClientMessenger = Messenger<\n  'KeyringInternalSnapClient',\n  AllowedActions\n>;\n\n/**\n * Implementation of the `Sender` interface that can be used to send requests\n * to a Snap through a `Messenger`.\n */\nexport class 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 submitRequestWithoutOrigin(\n    request: KeyringRequestWithoutOrigin,\n  ): Promise<KeyringResponseWithoutOrigin> {\n    return strictMask(\n      await this.send({\n        method: KeyringRpcMethod.SubmitRequest,\n        params: request,\n      }),\n      SubmitRequestResponseV1Struct,\n    );\n  }\n}\n"]}