2023-08-16 18:58:42 +02:00
|
|
|
use tonic::{transport::Channel, Status};
|
2023-08-11 15:33:40 +02:00
|
|
|
use uuid::Uuid;
|
|
|
|
|
|
|
|
use crate::{
|
|
|
|
ControllerWorker,
|
2023-08-16 18:58:42 +02:00
|
|
|
buffer::handle::{BufferHandle, OperationControllerWorker},
|
|
|
|
proto::{buffer_client::BufferClient, BufferPayload},
|
2023-08-11 15:33:40 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
#[derive(Clone)]
|
|
|
|
pub struct BufferController {
|
|
|
|
id: String,
|
|
|
|
client: BufferClient<Channel>,
|
2023-07-09 03:44:27 +02:00
|
|
|
}
|
|
|
|
|
2023-08-11 15:33:40 +02:00
|
|
|
impl From::<BufferClient<Channel>> for BufferController {
|
|
|
|
fn from(value: BufferClient<Channel>) -> Self {
|
|
|
|
BufferController { id: Uuid::new_v4().to_string(), client: value }
|
|
|
|
}
|
2023-07-09 03:44:27 +02:00
|
|
|
}
|
|
|
|
|
2023-08-11 15:33:40 +02:00
|
|
|
impl BufferController {
|
|
|
|
pub async fn new(dest: &str) -> Result<Self, tonic::transport::Error> {
|
|
|
|
Ok(BufferClient::connect(dest.to_string()).await?.into())
|
|
|
|
}
|
2023-07-30 22:58:24 +02:00
|
|
|
|
2023-08-11 15:33:40 +02:00
|
|
|
pub fn id(&self) -> &str { &self.id }
|
2023-07-30 22:58:24 +02:00
|
|
|
|
2023-08-16 17:09:21 +02:00
|
|
|
pub async fn create(&mut self, path: &str, content: Option<&str>) -> Result<(), Status> {
|
2023-08-11 15:33:40 +02:00
|
|
|
let req = BufferPayload {
|
|
|
|
path: path.to_string(),
|
|
|
|
content: content.map(|x| x.to_string()),
|
|
|
|
user: self.id.clone(),
|
|
|
|
};
|
2023-07-09 03:44:27 +02:00
|
|
|
|
2023-08-16 17:09:21 +02:00
|
|
|
self.client.create(req).await?;
|
2023-07-09 03:44:27 +02:00
|
|
|
|
2023-08-16 17:09:21 +02:00
|
|
|
Ok(())
|
2023-07-09 03:44:27 +02:00
|
|
|
}
|
|
|
|
|
2023-08-16 17:09:21 +02:00
|
|
|
// pub async fn listen(&mut self) -> Result<CursorTracker, Status> {
|
|
|
|
// let req = BufferPayload {
|
|
|
|
// path: "".into(),
|
|
|
|
// content: None,
|
|
|
|
// user: self.id.clone(),
|
|
|
|
// };
|
2023-08-11 15:33:40 +02:00
|
|
|
|
2023-08-16 17:09:21 +02:00
|
|
|
// let stream = self.client.listen(req).await?.into_inner();
|
2023-08-11 15:33:40 +02:00
|
|
|
|
2023-08-16 17:09:21 +02:00
|
|
|
// let controller = CursorTrackerWorker::new(self.id().to_string());
|
|
|
|
// let handle = controller.subscribe();
|
|
|
|
// let client = self.client.clone();
|
2023-08-11 15:33:40 +02:00
|
|
|
|
2023-08-16 17:09:21 +02:00
|
|
|
// tokio::spawn(async move {
|
|
|
|
// tracing::debug!("cursor worker started");
|
|
|
|
// controller.work(stream, client).await;
|
|
|
|
// tracing::debug!("cursor worker stopped");
|
|
|
|
// });
|
2023-08-11 15:33:40 +02:00
|
|
|
|
2023-08-16 17:09:21 +02:00
|
|
|
// Ok(handle)
|
|
|
|
// }
|
2023-07-30 17:48:55 +02:00
|
|
|
|
2023-08-11 15:50:17 +02:00
|
|
|
pub async fn attach(&mut self, path: &str) -> Result<BufferHandle, Status> {
|
2023-08-11 15:33:40 +02:00
|
|
|
let req = BufferPayload {
|
|
|
|
path: path.to_string(),
|
|
|
|
content: None,
|
|
|
|
user: self.id.clone(),
|
|
|
|
};
|
2023-07-09 03:44:27 +02:00
|
|
|
|
2023-08-11 15:33:40 +02:00
|
|
|
let content = self.client.sync(req.clone())
|
|
|
|
.await?
|
|
|
|
.into_inner()
|
2023-08-16 17:09:21 +02:00
|
|
|
.content;
|
2023-07-09 03:44:27 +02:00
|
|
|
|
2023-08-11 15:33:40 +02:00
|
|
|
let stream = self.client.attach(req).await?.into_inner();
|
2023-07-09 03:44:27 +02:00
|
|
|
|
2023-08-16 18:58:42 +02:00
|
|
|
let controller = OperationControllerWorker::new(self.id().to_string(), &content, path);
|
2023-08-11 15:33:40 +02:00
|
|
|
let factory = controller.subscribe();
|
2023-08-16 18:58:42 +02:00
|
|
|
let client = self.client.clone();
|
2023-08-11 15:33:40 +02:00
|
|
|
|
|
|
|
tokio::spawn(async move {
|
|
|
|
tracing::debug!("buffer worker started");
|
2023-08-16 18:58:42 +02:00
|
|
|
controller.work(client, stream).await;
|
2023-08-11 15:33:40 +02:00
|
|
|
tracing::debug!("buffer worker stopped");
|
|
|
|
});
|
|
|
|
|
|
|
|
Ok(factory)
|
2023-07-09 03:44:27 +02:00
|
|
|
}
|
2023-08-11 15:33:40 +02:00
|
|
|
}
|