manager.rs 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. use crate::{
  2. services::doc::ws_actor::{DocWsActor, DocWsMsg},
  3. web_socket::{WsBizHandler, WsClientData},
  4. };
  5. use actix_web::web::Data;
  6. use flowy_collaboration::core::sync::DocManager;
  7. use sqlx::PgPool;
  8. use std::sync::Arc;
  9. use tokio::sync::{mpsc, oneshot};
  10. pub struct DocumentCore {
  11. pub manager: Arc<DocManager>,
  12. ws_sender: mpsc::Sender<DocWsMsg>,
  13. pg_pool: Data<PgPool>,
  14. }
  15. impl DocumentCore {
  16. pub fn new(pg_pool: Data<PgPool>) -> Self {
  17. let manager = Arc::new(DocManager::new());
  18. let (ws_sender, rx) = mpsc::channel(100);
  19. let actor = DocWsActor::new(rx, manager.clone());
  20. tokio::task::spawn(actor.run());
  21. Self {
  22. manager,
  23. ws_sender,
  24. pg_pool,
  25. }
  26. }
  27. }
  28. impl WsBizHandler for DocumentCore {
  29. fn receive(&self, data: WsClientData) {
  30. let (ret, rx) = oneshot::channel();
  31. let sender = self.ws_sender.clone();
  32. let pool = self.pg_pool.clone();
  33. actix_rt::spawn(async move {
  34. let msg = DocWsMsg::ClientData {
  35. client_data: data,
  36. ret,
  37. pool,
  38. };
  39. match sender.send(msg).await {
  40. Ok(_) => {},
  41. Err(e) => log::error!("{}", e),
  42. }
  43. match rx.await {
  44. Ok(_) => {},
  45. Err(e) => log::error!("{:?}", e),
  46. };
  47. });
  48. }
  49. }