feat: add & use LockBox helper

This commit is contained in:
2021-03-07 19:41:49 +01:00
parent a9d393282a
commit bcbc661f0a
3 changed files with 108 additions and 118 deletions

View File

@@ -1,14 +1,15 @@
use ::anyhow::{Context, Error, Result};
use ::anyhow::{Context, Result};
use ::async_trait::async_trait;
use ::crdt_enc::{
key_cryptor::Keys,
utils::VersionBytes,
utils::{decode_version_bytes_mvreg_custom, encode_version_bytes_mvreg_custom},
utils::{
decode_version_bytes_mvreg_custom, encode_version_bytes_mvreg_custom, LockBox, VersionBytes,
},
CoreSubHandle, Info,
};
use ::crdts::{ctx::ReadCtx, CvRDT, MVReg, Orswot};
use ::serde::{Deserialize, Serialize};
use ::std::{convert::Infallible, fmt::Debug, sync::Mutex as SyncMutex};
use ::std::{convert::Infallible, fmt::Debug};
use ::uuid::Uuid;
const CURRENT_VERSION: Uuid = Uuid::from_u128(0xe69cb68e_7fbb_41aa_8d22_87eace7a04c9);
@@ -31,19 +32,17 @@ struct MutData {
#[derive(Debug)]
pub struct KeyHandler {
data: SyncMutex<MutData>,
data: LockBox<MutData>,
}
impl KeyHandler {
pub fn new() -> KeyHandler {
let data = MutData {
info: None,
core: None,
remote_meta: MVReg::new(),
};
KeyHandler {
data: SyncMutex::new(data),
data: LockBox::new(MutData {
info: None,
core: None,
remote_meta: MVReg::new(),
}),
}
}
}
@@ -68,12 +67,11 @@ impl CvRDT for Meta {
#[async_trait]
impl crdt_enc::key_cryptor::KeyCryptor for KeyHandler {
async fn init(&self, core: &dyn CoreSubHandle) -> Result<()> {
let mut data = self
.data
.lock()
.map_err(|err| Error::msg(err.to_string()))?;
data.info = Some(core.info());
data.core = Some(dyn_clone::clone_box(core));
self.data.with(|data| {
data.info = Some(core.info());
data.core = Some(dyn_clone::clone_box(core));
});
Ok(())
}
@@ -81,20 +79,14 @@ impl crdt_enc::key_cryptor::KeyCryptor for KeyHandler {
&self,
new_remote_meta: Option<MVReg<VersionBytes, Uuid>>,
) -> Result<()> {
let (remote_meta, core) = {
let mut data = self
.data
.lock()
.map_err(|err| Error::msg(err.to_string()))?;
let (remote_meta, core) = self.data.try_with(|data| {
if let Some(new_remote_meta) = new_remote_meta {
data.remote_meta.merge(new_remote_meta);
}
let core = dyn_clone::clone_box(&**data.core.as_ref().context("core is none")?);
(data.remote_meta.clone(), core)
};
Ok((data.remote_meta.clone(), core))
})?;
let keys_ctx =
decode_version_bytes_mvreg_custom(&remote_meta, SUPPORTED_VERSIONS, |buf| async move {
@@ -109,15 +101,10 @@ impl crdt_enc::key_cryptor::KeyCryptor for KeyHandler {
}
async fn set_keys(&self, new_keys: ReadCtx<Keys, Uuid>) -> Result<()> {
let (mut rm, core) = {
let data = self
.data
.lock()
.map_err(|err| Error::msg(err.to_string()))?;
let (mut rm, core) = self.data.try_with(|data| {
let core = dyn_clone::clone_box(&**data.core.as_ref().context("core is none")?);
(data.remote_meta.clone(), core)
};
Ok((data.remote_meta.clone(), core))
})?;
encode_version_bytes_mvreg_custom(
&mut rm,