use openmls_traits::key_store::{MlsEntity, OpenMlsKeyStore};
use std::{collections::HashMap, sync::RwLock};
#[derive(Debug, Default)]
pub struct MemoryKeyStore {
values: RwLock<HashMap<Vec<u8>, Vec<u8>>>,
}
impl OpenMlsKeyStore for MemoryKeyStore {
type Error = MemoryKeyStoreError;
fn store<V: MlsEntity>(&self, k: &[u8], v: &V) -> Result<(), Self::Error> {
let value = serde_json::to_vec(v).map_err(|_| MemoryKeyStoreError::SerializationError)?;
let mut values = self.values.write().unwrap();
values.insert(k.to_vec(), value);
Ok(())
}
fn read<V: MlsEntity>(&self, k: &[u8]) -> Option<V> {
let values = self.values.read().unwrap();
if let Some(value) = values.get(k) {
serde_json::from_slice(value).ok()
} else {
None
}
}
fn delete<V: MlsEntity>(&self, k: &[u8]) -> Result<(), Self::Error> {
let mut values = self.values.write().unwrap();
values.remove(k);
Ok(())
}
}
#[derive(thiserror::Error, Debug, Copy, Clone, PartialEq, Eq)]
pub enum MemoryKeyStoreError {
#[error("The key store does not allow storing serialized values.")]
UnsupportedValueTypeBytes,
#[error("Updating is not supported by this key store.")]
UnsupportedMethod,
#[error("Error serializing value.")]
SerializationError,
}