use openmls_traits::key_store::{FromKeyStoreValue, OpenMlsKeyStore, ToKeyStoreValue};
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 = Error;
fn store<V: ToKeyStoreValue>(&self, k: &[u8], v: &V) -> Result<(), Self::Error> {
let value = v
.to_key_store_value()
.map_err(|_| Error::SerializationError)?;
let mut values = self.values.write().unwrap();
values.insert(k.to_vec(), value);
Ok(())
}
fn read<V: FromKeyStoreValue>(&self, k: &[u8]) -> Option<V> {
let values = self.values.read().unwrap();
if let Some(value) = values.get(k) {
V::from_key_store_value(value).ok()
} else {
None
}
}
fn delete(&self, k: &[u8]) -> Result<(), Self::Error> {
let mut values = self.values.write().unwrap();
values.remove(k);
Ok(())
}
}
#[derive(Debug, Copy, Clone, PartialEq)]
pub enum Error {
UnsupportedValueTypeBytes,
UnsupportedMethod,
SerializationError,
}
impl From<Error> for String {
fn from(val: Error) -> Self {
match val {
Error::UnsupportedValueTypeBytes => {
"The key store does not allow storing serialized values.".to_string()
}
Error::UnsupportedMethod => "Updating is not supported by this key store.".to_string(),
Error::SerializationError => "Error serializing value.".to_string(),
}
}
}