document_deps.rs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. use bytes::Bytes;
  2. use flowy_document::{
  3. errors::DocError,
  4. module::DocumentUser,
  5. prelude::{WsManager, WsSender},
  6. };
  7. use flowy_user::{errors::ErrorCode, services::user::UserSession};
  8. use flowy_ws::{WsMessage, WsMessageHandler, WsSource};
  9. use parking_lot::RwLock;
  10. use std::{path::Path, sync::Arc};
  11. pub struct DocumentDepsResolver {
  12. user_session: Arc<UserSession>,
  13. }
  14. impl DocumentDepsResolver {
  15. pub fn new(user_session: Arc<UserSession>) -> Self { Self { user_session } }
  16. pub fn split_into(self) -> (Arc<dyn DocumentUser>, Arc<RwLock<WsManager>>) {
  17. let user = Arc::new(DocumentUserImpl {
  18. user: self.user_session.clone(),
  19. });
  20. let sender = Arc::new(WsSenderImpl {
  21. user: self.user_session.clone(),
  22. });
  23. let ws_manager = Arc::new(RwLock::new(WsManager::new(sender)));
  24. let ws_handler = Arc::new(WsDocumentResolver { inner: ws_manager.clone() });
  25. self.user_session.add_ws_handler(ws_handler);
  26. (user, ws_manager)
  27. }
  28. }
  29. struct DocumentUserImpl {
  30. user: Arc<UserSession>,
  31. }
  32. impl DocumentUser for DocumentUserImpl {
  33. fn user_dir(&self) -> Result<String, DocError> {
  34. let dir = self.user.user_dir().map_err(|e| DocError::unauthorized().context(e))?;
  35. let doc_dir = format!("{}/doc", dir);
  36. if !Path::new(&doc_dir).exists() {
  37. let _ = std::fs::create_dir_all(&doc_dir)?;
  38. }
  39. Ok(doc_dir)
  40. }
  41. fn user_id(&self) -> Result<String, DocError> {
  42. self.user.user_id().map_err(|e| match e.code {
  43. ErrorCode::InternalError => DocError::internal().context(e.msg),
  44. _ => DocError::internal().context(e),
  45. })
  46. }
  47. fn token(&self) -> Result<String, DocError> {
  48. self.user.token().map_err(|e| match e.code {
  49. ErrorCode::InternalError => DocError::internal().context(e.msg),
  50. _ => DocError::internal().context(e),
  51. })
  52. }
  53. }
  54. struct WsSenderImpl {
  55. user: Arc<UserSession>,
  56. }
  57. impl WsSender for WsSenderImpl {
  58. fn send_data(&self, data: Bytes) -> Result<(), DocError> {
  59. let msg = WsMessage {
  60. source: WsSource::Doc,
  61. data: data.to_vec(),
  62. };
  63. let _ = self.user.send_ws_msg(msg).map_err(|e| DocError::internal().context(e))?;
  64. Ok(())
  65. }
  66. }
  67. struct WsDocumentResolver {
  68. inner: Arc<RwLock<WsManager>>,
  69. }
  70. impl WsMessageHandler for WsDocumentResolver {
  71. fn source(&self) -> WsSource { WsSource::Doc }
  72. fn receive_message(&self, msg: WsMessage) {
  73. let data = Bytes::from(msg.data);
  74. self.inner.read().receive_data(data);
  75. }
  76. }