client.rs 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. use cdk_common::error::Error;
  2. use cdk_common::mint::MintKeySetInfo;
  3. use cdk_common::{BlindSignature, BlindedMessage, Proof};
  4. use crate::proto::signatory_client::SignatoryClient;
  5. use crate::signatory::{RotateKeyArguments, Signatory, SignatoryKeySet};
  6. /// A client for the Signatory service.
  7. pub struct SignatoryRpcClient {
  8. client: SignatoryClient<tonic::transport::Channel>,
  9. }
  10. impl SignatoryRpcClient {
  11. /// Create a new RemoteSigner from a tonic transport channel.
  12. pub async fn new(url: String) -> Result<Self, tonic::transport::Error> {
  13. Ok(Self {
  14. client: SignatoryClient::connect(url).await?,
  15. })
  16. }
  17. }
  18. #[async_trait::async_trait]
  19. impl Signatory for SignatoryRpcClient {
  20. async fn blind_sign(&self, request: BlindedMessage) -> Result<BlindSignature, Error> {
  21. let req: super::BlindedMessage = request.into();
  22. self.client
  23. .clone()
  24. .blind_sign(req)
  25. .await
  26. .map(|response| response.into_inner().try_into())
  27. .map_err(|e| Error::Custom(e.to_string()))?
  28. }
  29. async fn verify_proof(&self, proof: Proof) -> Result<(), Error> {
  30. let req: super::Proof = proof.into();
  31. self.client
  32. .clone()
  33. .verify_proof(req)
  34. .await
  35. .map(|response| response.into_inner().try_into())
  36. .map_err(|e| Error::Custom(e.to_string()))?
  37. }
  38. async fn auth_keysets(&self) -> Result<Option<Vec<SignatoryKeySet>>, Error> {
  39. self.client
  40. .clone()
  41. .auth_keysets(super::Empty {})
  42. .await
  43. .map(|response| {
  44. let response = response.into_inner();
  45. if response.is_none == Some(true) {
  46. Ok(None)
  47. } else {
  48. response
  49. .keysets
  50. .into_iter()
  51. .map(|x| x.try_into())
  52. .collect::<Result<Vec<SignatoryKeySet>, _>>()
  53. .map(Some)
  54. }
  55. })
  56. .map_err(|e| Error::Custom(e.to_string()))?
  57. }
  58. async fn keysets(&self) -> Result<Vec<SignatoryKeySet>, Error> {
  59. self.client
  60. .clone()
  61. .keysets(super::Empty {})
  62. .await
  63. .map(|response| {
  64. response
  65. .into_inner()
  66. .keysets
  67. .into_iter()
  68. .map(|x| x.try_into())
  69. .collect::<Result<Vec<SignatoryKeySet>, _>>()
  70. })
  71. .map_err(|e| Error::Custom(e.to_string()))?
  72. }
  73. async fn rotate_keyset(&self, args: RotateKeyArguments) -> Result<MintKeySetInfo, Error> {
  74. let req: super::RotateKeyArguments = args.into();
  75. self.client
  76. .clone()
  77. .rotate_keyset(req)
  78. .await
  79. .map(|response| response.into_inner().try_into())
  80. .map_err(|e| Error::Custom(e.to_string()))?
  81. }
  82. }