use std::sync::Arc;
use tokio::sync::broadcast;
use crate::crdt::Operation;
#[derive(Clone)]
pub struct SyncManager {
tx: broadcast::Sender<Arc<Operation>>,
}
impl SyncManager {
pub fn new() -> Self {
let (tx, _) = broadcast::channel(256);
Self { tx }
}
pub fn subscribe(&self) -> broadcast::Receiver<Arc<Operation>> {
self.tx.subscribe()
}
pub fn publish(
&self,
op: Arc<Operation>,
) -> Result<usize, broadcast::error::SendError<Arc<Operation>>> {
self.tx.send(op)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn sync_manager_roundtrip() {
let mgr = SyncManager::new();
let mut rx = mgr.subscribe();
let op = Arc::new(Operation::new(
"/tmp/x".to_string(),
crate::crdt::OperationType::FileCreate {
content: "a".into(),
},
"actor".into(),
));
mgr.publish(op.clone()).unwrap();
let got = rx.recv().await.unwrap();
assert_eq!(got.id, op.id);
}
}