bridge.rs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. use crate::Result;
  2. use async_trait::async_trait;
  3. use async_std::sync::{Arc, Mutex};
  4. use std::collections::HashMap;
  5. pub struct BridgeRequests {
  6. pub network: String,
  7. pub asset_id: jubjub::Fr,
  8. pub payload: BridgeRequestsPayload,
  9. }
  10. pub struct BridgeResponse {
  11. pub error: BridgeResponseError,
  12. pub payload: BridgeResponsePayload,
  13. }
  14. pub enum BridgeRequestsPayload {
  15. SendRequest(Vec<u8>, u64), // send (address, amount)
  16. WatchRequest,
  17. }
  18. pub enum BridgeResponsePayload {
  19. WatchResponse(Vec<u8>, String),
  20. SendResponse,
  21. Empty,
  22. }
  23. #[repr(u8)]
  24. pub enum BridgeResponseError {
  25. NoError,
  26. NotSupportedClient,
  27. }
  28. pub struct BridgeSubscribtion {
  29. pub sender: async_channel::Sender<BridgeRequests>,
  30. pub receiver: async_channel::Receiver<BridgeResponse>,
  31. }
  32. pub struct TokenSubscribtion {
  33. pub secret_key: Vec<u8>,
  34. pub public_key: String,
  35. }
  36. pub struct TokenNotification {
  37. pub secret_key: Vec<u8>,
  38. pub received_balance: u64,
  39. }
  40. pub struct Bridge {
  41. clients: Mutex<HashMap<String, Arc<dyn TokenClient + Send + Sync>>>,
  42. //notifiers: Mutex<HashMap<Vec<u8>, async_channel::Receiver<TokenNotification>>>,
  43. }
  44. impl Bridge {
  45. pub fn new() -> Arc<Self> {
  46. Arc::new(Self {
  47. clients: Mutex::new(HashMap::new()),
  48. //notifiers: Mutex::new(HashMap::new()),
  49. })
  50. }
  51. pub async fn add_clients(
  52. self: Arc<Self>,
  53. network: String,
  54. client: Arc<dyn TokenClient + Send + Sync>,
  55. ) -> Result<()> {
  56. //let notifier = client.get_notifier().await?;
  57. self.clients
  58. .lock()
  59. .await
  60. .insert(network.clone(), client.clone());
  61. // self.notifiers
  62. // .lock()
  63. // .await
  64. // .insert(asset_id, notifier.clone());
  65. Ok(())
  66. }
  67. pub async fn listen(self: Arc<Self>) {}
  68. pub async fn subscribe(self: Arc<Self>) -> BridgeSubscribtion {
  69. let (sender, req) = async_channel::unbounded();
  70. let (rep, receiver) = async_channel::unbounded();
  71. smol::spawn(self.listen_for_new_subscribtion(req.clone(), rep.clone())).detach();
  72. BridgeSubscribtion { sender, receiver }
  73. }
  74. async fn listen_for_new_subscribtion(
  75. self: Arc<Self>,
  76. req: async_channel::Receiver<BridgeRequests>,
  77. rep: async_channel::Sender<BridgeResponse>,
  78. ) -> Result<()> {
  79. let req = req.recv().await?;
  80. let network = req.network;
  81. if !self.clients.lock().await.contains_key(&network) {
  82. let res = BridgeResponse {
  83. error: BridgeResponseError::NotSupportedClient,
  84. payload: BridgeResponsePayload::Empty,
  85. };
  86. rep.send(res).await?;
  87. return Ok(());
  88. }
  89. let client = &self.clients.lock().await[&network];
  90. match req.payload {
  91. BridgeRequestsPayload::WatchRequest => {
  92. let sub = client.subscribe().await?;
  93. let res = BridgeResponse {
  94. error: BridgeResponseError::NoError,
  95. payload: BridgeResponsePayload::WatchResponse(sub.secret_key, sub.public_key),
  96. };
  97. rep.send(res).await?;
  98. }
  99. BridgeRequestsPayload::SendRequest(addr, amount) => {
  100. client.send(addr, amount).await?;
  101. let res = BridgeResponse {
  102. error: BridgeResponseError::NoError,
  103. payload: BridgeResponsePayload::SendResponse,
  104. };
  105. rep.send(res).await?;
  106. }
  107. }
  108. Ok(())
  109. }
  110. }
  111. #[async_trait]
  112. pub trait TokenClient {
  113. async fn subscribe(&self) -> Result<TokenSubscribtion>;
  114. async fn get_notifier(&self) -> Result<async_channel::Receiver<TokenNotification>>;
  115. async fn send(&self, address: Vec<u8>, amount: u64) -> Result<()>;
  116. }