lib.rs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. mod deps_resolve;
  2. // mod flowy_server;
  3. pub mod module;
  4. use flowy_dispatch::prelude::*;
  5. use flowy_document::prelude::FlowyDocument;
  6. use flowy_net::config::ServerConfig;
  7. use flowy_user::services::user::{UserSession, UserSessionBuilder};
  8. use module::build_modules;
  9. pub use module::*;
  10. use std::sync::{
  11. atomic::{AtomicBool, Ordering},
  12. Arc,
  13. };
  14. static INIT_LOG: AtomicBool = AtomicBool::new(false);
  15. #[derive(Debug, Clone)]
  16. pub struct FlowySDKConfig {
  17. root: String,
  18. log_filter: String,
  19. server_config: ServerConfig,
  20. }
  21. impl FlowySDKConfig {
  22. pub fn new(root: &str, server_config: ServerConfig) -> Self {
  23. FlowySDKConfig {
  24. root: root.to_owned(),
  25. log_filter: crate_log_filter(None),
  26. server_config,
  27. }
  28. }
  29. pub fn log_filter(mut self, filter: &str) -> Self {
  30. self.log_filter = crate_log_filter(Some(filter.to_owned()));
  31. self
  32. }
  33. }
  34. fn crate_log_filter(level: Option<String>) -> String {
  35. let level = level.unwrap_or(std::env::var("RUST_LOG").unwrap_or("info".to_owned()));
  36. let mut filters = vec![];
  37. filters.push(format!("flowy_sdk={}", level));
  38. filters.push(format!("flowy_workspace={}", level));
  39. filters.push(format!("flowy_user={}", level));
  40. filters.push(format!("flowy_document={}", level));
  41. filters.push(format!("flowy_dart_notify={}", level));
  42. filters.push(format!("flowy_ot={}", level));
  43. filters.push(format!("flowy_ws={}", level));
  44. filters.push(format!("info"));
  45. filters.join(",")
  46. }
  47. #[derive(Clone)]
  48. pub struct FlowySDK {
  49. config: FlowySDKConfig,
  50. pub user_session: Arc<UserSession>,
  51. pub flowy_document: Arc<FlowyDocument>,
  52. pub dispatch: Arc<EventDispatch>,
  53. }
  54. impl FlowySDK {
  55. pub fn new(config: FlowySDKConfig) -> Self {
  56. init_log(&config);
  57. init_kv(&config.root);
  58. tracing::debug!("🔥 {:?}", config);
  59. let user_session = Arc::new(
  60. UserSessionBuilder::new()
  61. .root_dir(&config.root, &config.server_config)
  62. .build(),
  63. );
  64. let flowy_document = build_document_module(user_session.clone(), &config.server_config);
  65. let modules = build_modules(&config.server_config, user_session.clone(), flowy_document.clone());
  66. let dispatch = Arc::new(EventDispatch::construct(|| modules));
  67. Self {
  68. config,
  69. user_session,
  70. flowy_document,
  71. dispatch,
  72. }
  73. }
  74. pub fn dispatch(&self) -> Arc<EventDispatch> { self.dispatch.clone() }
  75. }
  76. fn init_kv(root: &str) {
  77. match flowy_infra::kv::KV::init(root) {
  78. Ok(_) => {},
  79. Err(e) => tracing::error!("Init kv store failedL: {}", e),
  80. }
  81. }
  82. fn init_log(config: &FlowySDKConfig) {
  83. if !INIT_LOG.load(Ordering::SeqCst) {
  84. INIT_LOG.store(true, Ordering::SeqCst);
  85. let _ = flowy_log::Builder::new("flowy-client")
  86. .local(&config.root)
  87. .env_filter(&config.log_filter)
  88. .build();
  89. }
  90. }