memory.rs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. use std::collections::HashMap;
  2. use std::sync::Arc;
  3. use async_trait::async_trait;
  4. use cashu::nuts::nut02::mint::KeySet;
  5. use cashu::nuts::{CurrencyUnit, Id, Proof, Proofs};
  6. use cashu::secret::Secret;
  7. use cashu::types::{MeltQuote, MintQuote};
  8. use tokio::sync::Mutex;
  9. use super::{Error, LocalStore};
  10. #[derive(Default, Debug, Clone)]
  11. pub struct MemoryLocalStore {
  12. active_keysets: Arc<Mutex<HashMap<CurrencyUnit, Id>>>,
  13. keysets: Arc<Mutex<HashMap<Id, KeySet>>>,
  14. mint_quotes: Arc<Mutex<HashMap<String, MintQuote>>>,
  15. melt_quotes: Arc<Mutex<HashMap<String, MeltQuote>>>,
  16. pending_proofs: Arc<Mutex<HashMap<Secret, Proof>>>,
  17. spent_proofs: Arc<Mutex<HashMap<Secret, Proof>>>,
  18. }
  19. impl MemoryLocalStore {
  20. pub fn new(
  21. active_keysets: HashMap<CurrencyUnit, Id>,
  22. keysets: Vec<KeySet>,
  23. mint_quotes: Vec<MintQuote>,
  24. melt_quotes: Vec<MeltQuote>,
  25. pending_proofs: Proofs,
  26. spent_proofs: Proofs,
  27. ) -> Self {
  28. Self {
  29. active_keysets: Arc::new(Mutex::new(active_keysets)),
  30. keysets: Arc::new(Mutex::new(keysets.into_iter().map(|k| (k.id, k)).collect())),
  31. mint_quotes: Arc::new(Mutex::new(
  32. mint_quotes.into_iter().map(|q| (q.id.clone(), q)).collect(),
  33. )),
  34. melt_quotes: Arc::new(Mutex::new(
  35. melt_quotes.into_iter().map(|q| (q.id.clone(), q)).collect(),
  36. )),
  37. pending_proofs: Arc::new(Mutex::new(
  38. pending_proofs
  39. .into_iter()
  40. .map(|p| (p.secret.clone(), p))
  41. .collect(),
  42. )),
  43. spent_proofs: Arc::new(Mutex::new(
  44. spent_proofs
  45. .into_iter()
  46. .map(|p| (p.secret.clone(), p))
  47. .collect(),
  48. )),
  49. }
  50. }
  51. }
  52. #[async_trait(?Send)]
  53. impl LocalStore for MemoryLocalStore {
  54. async fn add_active_keyset(&self, unit: CurrencyUnit, id: Id) -> Result<(), Error> {
  55. self.active_keysets.lock().await.insert(unit, id);
  56. Ok(())
  57. }
  58. async fn get_active_keyset_id(&self, unit: &CurrencyUnit) -> Result<Option<Id>, Error> {
  59. Ok(self.active_keysets.lock().await.get(unit).cloned())
  60. }
  61. async fn get_active_keysets(&self) -> Result<HashMap<CurrencyUnit, Id>, Error> {
  62. Ok(self.active_keysets.lock().await.clone())
  63. }
  64. async fn add_keyset(&self, keyset: KeySet) -> Result<(), Error> {
  65. self.keysets.lock().await.insert(keyset.id, keyset);
  66. Ok(())
  67. }
  68. async fn get_keyset(&self, keyset_id: &Id) -> Result<Option<KeySet>, Error> {
  69. Ok(self.keysets.lock().await.get(keyset_id).cloned())
  70. }
  71. async fn get_keysets(&self) -> Result<Vec<KeySet>, Error> {
  72. Ok(self.keysets.lock().await.values().cloned().collect())
  73. }
  74. async fn add_mint_quote(&self, quote: MintQuote) -> Result<(), Error> {
  75. self.mint_quotes
  76. .lock()
  77. .await
  78. .insert(quote.id.clone(), quote);
  79. Ok(())
  80. }
  81. async fn get_mint_quote(&self, quote_id: &str) -> Result<Option<MintQuote>, Error> {
  82. Ok(self.mint_quotes.lock().await.get(quote_id).cloned())
  83. }
  84. async fn remove_mint_quote(&self, quote_id: &str) -> Result<(), Error> {
  85. self.mint_quotes.lock().await.remove(quote_id);
  86. Ok(())
  87. }
  88. async fn add_melt_quote(&self, quote: MeltQuote) -> Result<(), Error> {
  89. self.melt_quotes
  90. .lock()
  91. .await
  92. .insert(quote.id.clone(), quote);
  93. Ok(())
  94. }
  95. async fn get_melt_quote(&self, quote_id: &str) -> Result<Option<MeltQuote>, Error> {
  96. Ok(self.melt_quotes.lock().await.get(quote_id).cloned())
  97. }
  98. async fn remove_melt_quote(&self, quote_id: &str) -> Result<(), Error> {
  99. self.melt_quotes.lock().await.remove(quote_id);
  100. Ok(())
  101. }
  102. async fn add_spent_proof(&self, proof: Proof) -> Result<(), Error> {
  103. self.spent_proofs
  104. .lock()
  105. .await
  106. .insert(proof.secret.clone(), proof);
  107. Ok(())
  108. }
  109. async fn get_spent_proof(&self, secret: &Secret) -> Result<Option<Proof>, Error> {
  110. Ok(self.spent_proofs.lock().await.get(secret).cloned())
  111. }
  112. async fn add_pending_proof(&self, proof: Proof) -> Result<(), Error> {
  113. self.pending_proofs
  114. .lock()
  115. .await
  116. .insert(proof.secret.clone(), proof);
  117. Ok(())
  118. }
  119. async fn get_pending_proof(&self, secret: &Secret) -> Result<Option<Proof>, Error> {
  120. Ok(self.pending_proofs.lock().await.get(secret).cloned())
  121. }
  122. async fn remove_pending_proof(&self, secret: &Secret) -> Result<(), Error> {
  123. self.pending_proofs.lock().await.remove(secret);
  124. Ok(())
  125. }
  126. }