feat: add & use LockBox helper
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user