2022-07-15 13:51:19 +00:00
|
|
|
use fxhash::FxHashMap;
|
2023-01-16 10:44:19 +00:00
|
|
|
use loro_internal::{
|
2022-08-03 14:30:20 +00:00
|
|
|
id::{ClientID, Counter},
|
|
|
|
version::VersionVector,
|
|
|
|
};
|
2022-10-24 09:22:29 +00:00
|
|
|
use rle::{HasLength, RleVecWithIndex};
|
2022-07-15 10:24:15 +00:00
|
|
|
|
|
|
|
use crate::raw_change::{ChangeData, ChangeHash};
|
|
|
|
|
|
|
|
pub type Mac = [u8; 32];
|
|
|
|
|
|
|
|
pub struct RawStore {
|
2022-10-24 03:34:29 +00:00
|
|
|
changes: FxHashMap<ClientID, RleVecWithIndex<ChangeData>>,
|
2022-07-15 13:51:19 +00:00
|
|
|
macs: Option<FxHashMap<ClientID, Mac>>,
|
2022-07-15 10:24:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
impl RawStore {
|
|
|
|
pub fn new() -> Self {
|
|
|
|
Self {
|
2022-07-15 13:51:19 +00:00
|
|
|
changes: FxHashMap::default(),
|
2022-07-15 10:24:15 +00:00
|
|
|
macs: None,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn maced(&self) -> bool {
|
|
|
|
self.macs.is_some()
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn encode_update(&self, _from: Option<&VersionVector>) -> Vec<u8> {
|
|
|
|
unimplemented!()
|
|
|
|
}
|
|
|
|
|
2022-07-20 16:40:37 +00:00
|
|
|
pub fn verify(&mut self, _pub_key: &[u8; 32]) -> bool {
|
2022-07-15 10:24:15 +00:00
|
|
|
if !self.maced() {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if self.macs.as_ref().unwrap().len() < self.changes.len() {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
self.calc_hash();
|
2022-08-12 06:41:15 +00:00
|
|
|
for (_client_id, _mac) in self.macs.as_ref().unwrap().iter() {
|
2022-07-18 06:58:33 +00:00
|
|
|
todo!("pending");
|
2022-07-15 10:24:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
true
|
|
|
|
}
|
|
|
|
|
2022-08-12 06:41:15 +00:00
|
|
|
pub fn get_final_hash(&self, client_id: ClientID) -> ChangeHash {
|
|
|
|
let changes = self.changes.get(&client_id).unwrap();
|
2022-07-15 10:24:15 +00:00
|
|
|
let last = changes.vec().last().unwrap();
|
|
|
|
last.hash.unwrap()
|
|
|
|
}
|
|
|
|
|
|
|
|
fn calc_hash(&mut self) {
|
2022-08-12 06:41:15 +00:00
|
|
|
for (_client_id, changes) in &mut self.changes.iter_mut() {
|
2022-07-15 10:24:15 +00:00
|
|
|
let changes = changes.vec_mut();
|
|
|
|
let mut start_index = 0;
|
|
|
|
for i in (0..changes.len()).rev() {
|
|
|
|
if changes[i].hash.is_some() {
|
|
|
|
start_index = i + 1;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for index in start_index..changes.len() {
|
|
|
|
let (prev, cur) = changes.split_at_mut(index);
|
|
|
|
cur[0].update_hash(if index == 0 {
|
|
|
|
None
|
|
|
|
} else {
|
|
|
|
Some(prev.last().unwrap().hash.unwrap())
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn version_vector(&self) -> VersionVector {
|
2022-08-03 14:30:20 +00:00
|
|
|
let mut version_vector = VersionVector::new();
|
2022-07-15 10:24:15 +00:00
|
|
|
for (client_id, changes) in &self.changes {
|
2022-10-24 09:22:29 +00:00
|
|
|
version_vector.insert(*client_id, changes.atom_len() as Counter);
|
2022-07-15 10:24:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
version_vector
|
|
|
|
}
|
2022-07-15 11:12:59 +00:00
|
|
|
|
2022-07-20 16:40:37 +00:00
|
|
|
pub fn sign(&self, _pub_key: ()) {
|
2022-07-15 11:12:59 +00:00
|
|
|
unimplemented!()
|
|
|
|
}
|
2022-07-15 10:24:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
impl Default for RawStore {
|
|
|
|
fn default() -> Self {
|
|
|
|
Self::new()
|
|
|
|
}
|
|
|
|
}
|