/
mod.rs
87 lines (69 loc) · 2.32 KB
/
mod.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
use std::fmt;
use std::fmt::{Debug, Formatter};
use std::path::{Path, PathBuf};
use std::sync::Arc;
use librevault_util::index::{Index, SignedMeta};
use librevault_util::secret::Secret;
mod collection;
pub mod manager;
use crate::settings::BucketConfig;
// use librevault_util::index::proto::Meta;
use librevault_util::enc_storage::EncryptedStorage;
use librevault_util::indexer::{make_meta, sign_meta};
use log::debug;
use tokio::sync::mpsc;
#[derive(Clone, Debug)]
pub enum BucketEvent {
MetaAdded { signed_meta: SignedMeta },
}
pub struct Bucket {
pub secret: Secret,
root: PathBuf,
pub index: Arc<Index>,
block_storage: EncryptedStorage,
event_tx: mpsc::Sender<BucketEvent>,
}
impl Bucket {
async fn new(config: BucketConfig, event_tx: mpsc::Sender<BucketEvent>) -> Self {
debug!("Creating bucket: {}", config.secret.get_id_hex());
let system_dir = config.path.join(".librevault");
tokio::fs::create_dir_all(&system_dir).await.unwrap();
let index = Arc::new(Index::new(system_dir.join("index.db").as_path()));
Bucket {
secret: config.secret,
root: config.path,
index,
block_storage: EncryptedStorage::new(&system_dir),
event_tx,
}
}
pub fn get_id(&self) -> Vec<u8> {
self.secret.get_id()
}
pub fn get_id_hex(&self) -> String {
self.secret.get_id_hex()
}
async fn initialize(&self) {
let _ = tokio::task::block_in_place(move || self.index.migrate()); // TODO: block somewhere else
// loop {
// let ev = watcher::async_watch(&self.root, RecursiveMode::Recursive).await;
// }
}
pub(crate) async fn index_path(&self, path: &Path) {
let meta = make_meta(path, &self.root, &self.secret);
if let Ok(meta) = meta {
debug!("Meta: {:?}", &meta);
let signed_meta = sign_meta(&meta, &self.secret);
self.index.put_meta(&signed_meta, true).unwrap();
self.event_tx
.send(BucketEvent::MetaAdded { signed_meta })
.await
.expect("Channel must be open");
}
}
}
impl Debug for Bucket {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
write!(f, "(Bucket: id={}, loc={:?})", self.get_id_hex(), self.root)
}
}