document_deps.rs 2.8 KB

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