|
@@ -1,3 +1,5 @@
|
|
|
|
+#![allow(unused_doc_comments)]
|
|
|
|
+
|
|
use std::str::FromStr;
|
|
use std::str::FromStr;
|
|
use std::time::Duration;
|
|
use std::time::Duration;
|
|
use std::{
|
|
use std::{
|
|
@@ -16,12 +18,10 @@ use flowy_database2::DatabaseManager2;
|
|
use flowy_document2::manager::DocumentManager as DocumentManager2;
|
|
use flowy_document2::manager::DocumentManager as DocumentManager2;
|
|
use flowy_error::FlowyResult;
|
|
use flowy_error::FlowyResult;
|
|
use flowy_folder2::manager::Folder2Manager;
|
|
use flowy_folder2::manager::Folder2Manager;
|
|
-use flowy_net::http_server::self_host::configuration::ClientServerConfiguration;
|
|
|
|
-use flowy_net::local_server::LocalServer;
|
|
|
|
use flowy_sqlite::kv::KV;
|
|
use flowy_sqlite::kv::KV;
|
|
use flowy_task::{TaskDispatcher, TaskRunner};
|
|
use flowy_task::{TaskDispatcher, TaskRunner};
|
|
use flowy_user::entities::UserProfile;
|
|
use flowy_user::entities::UserProfile;
|
|
-use flowy_user::event_map::UserStatusCallback;
|
|
|
|
|
|
+use flowy_user::event_map::{UserCloudServiceProvider, UserStatusCallback};
|
|
use flowy_user::services::{UserSession, UserSessionConfig};
|
|
use flowy_user::services::{UserSession, UserSessionConfig};
|
|
use lib_dispatch::prelude::*;
|
|
use lib_dispatch::prelude::*;
|
|
use lib_dispatch::runtime::tokio_default_runtime;
|
|
use lib_dispatch::runtime::tokio_default_runtime;
|
|
@@ -30,8 +30,10 @@ use module::make_plugins;
|
|
pub use module::*;
|
|
pub use module::*;
|
|
|
|
|
|
use crate::deps_resolve::*;
|
|
use crate::deps_resolve::*;
|
|
|
|
+use crate::integrate::server::AppFlowyServerProvider;
|
|
|
|
|
|
mod deps_resolve;
|
|
mod deps_resolve;
|
|
|
|
+mod integrate;
|
|
pub mod module;
|
|
pub mod module;
|
|
|
|
|
|
static INIT_LOG: AtomicBool = AtomicBool::new(false);
|
|
static INIT_LOG: AtomicBool = AtomicBool::new(false);
|
|
@@ -47,25 +49,22 @@ pub struct AppFlowyCoreConfig {
|
|
/// Panics if the `root` path is not existing
|
|
/// Panics if the `root` path is not existing
|
|
storage_path: String,
|
|
storage_path: String,
|
|
log_filter: String,
|
|
log_filter: String,
|
|
- server_config: ClientServerConfiguration,
|
|
|
|
}
|
|
}
|
|
|
|
|
|
impl fmt::Debug for AppFlowyCoreConfig {
|
|
impl fmt::Debug for AppFlowyCoreConfig {
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
f.debug_struct("AppFlowyCoreConfig")
|
|
f.debug_struct("AppFlowyCoreConfig")
|
|
.field("storage_path", &self.storage_path)
|
|
.field("storage_path", &self.storage_path)
|
|
- .field("server-config", &self.server_config)
|
|
|
|
.finish()
|
|
.finish()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
impl AppFlowyCoreConfig {
|
|
impl AppFlowyCoreConfig {
|
|
- pub fn new(root: &str, name: String, server_config: ClientServerConfiguration) -> Self {
|
|
|
|
|
|
+ pub fn new(root: &str, name: String) -> Self {
|
|
AppFlowyCoreConfig {
|
|
AppFlowyCoreConfig {
|
|
name,
|
|
name,
|
|
storage_path: root.to_owned(),
|
|
storage_path: root.to_owned(),
|
|
log_filter: create_log_filter("info".to_owned(), vec![]),
|
|
log_filter: create_log_filter("info".to_owned(), vec![]),
|
|
- server_config,
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -117,22 +116,33 @@ pub struct AppFlowyCore {
|
|
pub user_session: Arc<UserSession>,
|
|
pub user_session: Arc<UserSession>,
|
|
pub document_manager2: Arc<DocumentManager2>,
|
|
pub document_manager2: Arc<DocumentManager2>,
|
|
pub folder_manager: Arc<Folder2Manager>,
|
|
pub folder_manager: Arc<Folder2Manager>,
|
|
- // pub database_manager: Arc<DatabaseManager>,
|
|
|
|
pub database_manager: Arc<DatabaseManager2>,
|
|
pub database_manager: Arc<DatabaseManager2>,
|
|
pub event_dispatcher: Arc<AFPluginDispatcher>,
|
|
pub event_dispatcher: Arc<AFPluginDispatcher>,
|
|
- pub local_server: Option<Arc<LocalServer>>,
|
|
|
|
|
|
+ pub server_provider: Arc<AppFlowyServerProvider>,
|
|
pub task_dispatcher: Arc<RwLock<TaskDispatcher>>,
|
|
pub task_dispatcher: Arc<RwLock<TaskDispatcher>>,
|
|
}
|
|
}
|
|
|
|
|
|
impl AppFlowyCore {
|
|
impl AppFlowyCore {
|
|
pub fn new(config: AppFlowyCoreConfig) -> Self {
|
|
pub fn new(config: AppFlowyCoreConfig) -> Self {
|
|
|
|
+ /// The profiling can be used to tracing the performance of the application.
|
|
|
|
+ /// Check out the [Link](https://appflowy.gitbook.io/docs/essential-documentation/contribute-to-appflowy/architecture/backend/profiling)
|
|
|
|
+ /// for more information.
|
|
#[cfg(feature = "profiling")]
|
|
#[cfg(feature = "profiling")]
|
|
console_subscriber::init();
|
|
console_subscriber::init();
|
|
|
|
|
|
|
|
+ // Init the logger before anything else
|
|
init_log(&config);
|
|
init_log(&config);
|
|
|
|
+
|
|
|
|
+ // Init the key value database
|
|
init_kv(&config.storage_path);
|
|
init_kv(&config.storage_path);
|
|
|
|
+
|
|
|
|
+ // The collab config is used to build the [Collab] instance that used in document,
|
|
|
|
+ // database, folder, etc.
|
|
let collab_config = get_collab_config();
|
|
let collab_config = get_collab_config();
|
|
inject_aws_env(collab_config.aws_config());
|
|
inject_aws_env(collab_config.aws_config());
|
|
|
|
+
|
|
|
|
+ /// The shared collab builder is used to build the [Collab] instance. The plugins will be loaded
|
|
|
|
+ /// on demand based on the [AppFlowyCollabConfig].
|
|
let collab_builder = Arc::new(AppFlowyCollabBuilder::new(collab_config));
|
|
let collab_builder = Arc::new(AppFlowyCollabBuilder::new(collab_config));
|
|
|
|
|
|
tracing::debug!("🔥 {:?}", config);
|
|
tracing::debug!("🔥 {:?}", config);
|
|
@@ -141,11 +151,10 @@ impl AppFlowyCore {
|
|
let task_dispatcher = Arc::new(RwLock::new(task_scheduler));
|
|
let task_dispatcher = Arc::new(RwLock::new(task_scheduler));
|
|
runtime.spawn(TaskRunner::run(task_dispatcher.clone()));
|
|
runtime.spawn(TaskRunner::run(task_dispatcher.clone()));
|
|
|
|
|
|
- let local_server = mk_local_server(&config.server_config);
|
|
|
|
- let (user_session, folder_manager, local_server, database_manager, document_manager2) = runtime
|
|
|
|
- .block_on(async {
|
|
|
|
- let user_session = mk_user_session(&config, &local_server, &config.server_config);
|
|
|
|
-
|
|
|
|
|
|
+ let server_provider = Arc::new(AppFlowyServerProvider::new());
|
|
|
|
+ let (user_session, folder_manager, server_provider, database_manager, document_manager2) =
|
|
|
|
+ runtime.block_on(async {
|
|
|
|
+ let user_session = mk_user_session(&config, server_provider.clone());
|
|
let database_manager2 = Database2DepsResolver::resolve(
|
|
let database_manager2 = Database2DepsResolver::resolve(
|
|
user_session.clone(),
|
|
user_session.clone(),
|
|
task_dispatcher.clone(),
|
|
task_dispatcher.clone(),
|
|
@@ -170,7 +179,7 @@ impl AppFlowyCore {
|
|
(
|
|
(
|
|
user_session,
|
|
user_session,
|
|
folder_manager,
|
|
folder_manager,
|
|
- local_server,
|
|
|
|
|
|
+ server_provider,
|
|
database_manager2,
|
|
database_manager2,
|
|
document_manager2,
|
|
document_manager2,
|
|
)
|
|
)
|
|
@@ -181,9 +190,11 @@ impl AppFlowyCore {
|
|
database_manager: database_manager.clone(),
|
|
database_manager: database_manager.clone(),
|
|
config: config.clone(),
|
|
config: config.clone(),
|
|
};
|
|
};
|
|
|
|
+
|
|
let user_status_callback = UserStatusCallbackImpl {
|
|
let user_status_callback = UserStatusCallbackImpl {
|
|
listener: Arc::new(user_status_listener),
|
|
listener: Arc::new(user_status_listener),
|
|
};
|
|
};
|
|
|
|
+
|
|
let cloned_user_session = user_session.clone();
|
|
let cloned_user_session = user_session.clone();
|
|
runtime.block_on(async move {
|
|
runtime.block_on(async move {
|
|
cloned_user_session.clone().init(user_status_callback).await;
|
|
cloned_user_session.clone().init(user_status_callback).await;
|
|
@@ -205,7 +216,7 @@ impl AppFlowyCore {
|
|
folder_manager,
|
|
folder_manager,
|
|
database_manager,
|
|
database_manager,
|
|
event_dispatcher,
|
|
event_dispatcher,
|
|
- local_server,
|
|
|
|
|
|
+ server_provider,
|
|
task_dispatcher,
|
|
task_dispatcher,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -215,18 +226,6 @@ impl AppFlowyCore {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-fn mk_local_server(server_config: &ClientServerConfiguration) -> Option<Arc<LocalServer>> {
|
|
|
|
- // let ws_addr = server_config.ws_addr();
|
|
|
|
- if cfg!(feature = "http_sync") {
|
|
|
|
- // let ws_conn = Arc::new(FlowyWebSocketConnect::new(ws_addr));
|
|
|
|
- None
|
|
|
|
- } else {
|
|
|
|
- let context = flowy_net::local_server::build_server(server_config);
|
|
|
|
- // let ws_conn = Arc::new(FlowyWebSocketConnect::from_local(ws_addr, local_ws));
|
|
|
|
- Some(Arc::new(context.local_server))
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
fn init_kv(root: &str) {
|
|
fn init_kv(root: &str) {
|
|
match KV::init(root) {
|
|
match KV::init(root) {
|
|
Ok(_) => {},
|
|
Ok(_) => {},
|
|
@@ -263,12 +262,10 @@ fn init_log(config: &AppFlowyCoreConfig) {
|
|
|
|
|
|
fn mk_user_session(
|
|
fn mk_user_session(
|
|
config: &AppFlowyCoreConfig,
|
|
config: &AppFlowyCoreConfig,
|
|
- local_server: &Option<Arc<LocalServer>>,
|
|
|
|
- server_config: &ClientServerConfiguration,
|
|
|
|
|
|
+ user_cloud_service_provider: Arc<dyn UserCloudServiceProvider>,
|
|
) -> Arc<UserSession> {
|
|
) -> Arc<UserSession> {
|
|
let user_config = UserSessionConfig::new(&config.name, &config.storage_path);
|
|
let user_config = UserSessionConfig::new(&config.name, &config.storage_path);
|
|
- let cloud_service = UserDepsResolver::resolve(local_server, server_config);
|
|
|
|
- Arc::new(UserSession::new(user_config, cloud_service))
|
|
|
|
|
|
+ Arc::new(UserSession::new(user_config, user_cloud_service_provider))
|
|
}
|
|
}
|
|
|
|
|
|
struct UserStatusListener {
|
|
struct UserStatusListener {
|
|
@@ -279,20 +276,23 @@ struct UserStatusListener {
|
|
}
|
|
}
|
|
|
|
|
|
impl UserStatusListener {
|
|
impl UserStatusListener {
|
|
- async fn did_sign_in(&self, token: &str, user_id: i64) -> FlowyResult<()> {
|
|
|
|
- self.folder_manager.initialize(user_id).await?;
|
|
|
|
- self.database_manager.initialize(user_id, token).await?;
|
|
|
|
- // self
|
|
|
|
- // .ws_conn
|
|
|
|
- // .start(token.to_owned(), user_id.to_owned())
|
|
|
|
- // .await?;
|
|
|
|
|
|
+ async fn did_sign_in(&self, user_id: i64, workspace_id: &str) -> FlowyResult<()> {
|
|
|
|
+ self
|
|
|
|
+ .folder_manager
|
|
|
|
+ .initialize(user_id, workspace_id)
|
|
|
|
+ .await?;
|
|
|
|
+ self.database_manager.initialize(user_id).await?;
|
|
Ok(())
|
|
Ok(())
|
|
}
|
|
}
|
|
|
|
|
|
async fn did_sign_up(&self, user_profile: &UserProfile) -> FlowyResult<()> {
|
|
async fn did_sign_up(&self, user_profile: &UserProfile) -> FlowyResult<()> {
|
|
self
|
|
self
|
|
.folder_manager
|
|
.folder_manager
|
|
- .initialize_with_new_user(user_profile.id, &user_profile.token)
|
|
|
|
|
|
+ .initialize_with_new_user(
|
|
|
|
+ user_profile.id,
|
|
|
|
+ &user_profile.token,
|
|
|
|
+ &user_profile.workspace_id,
|
|
|
|
+ )
|
|
.await?;
|
|
.await?;
|
|
|
|
|
|
self
|
|
self
|
|
@@ -314,11 +314,11 @@ struct UserStatusCallbackImpl {
|
|
}
|
|
}
|
|
|
|
|
|
impl UserStatusCallback for UserStatusCallbackImpl {
|
|
impl UserStatusCallback for UserStatusCallbackImpl {
|
|
- fn did_sign_in(&self, token: &str, user_id: i64) -> Fut<FlowyResult<()>> {
|
|
|
|
|
|
+ fn did_sign_in(&self, user_id: i64, workspace_id: &str) -> Fut<FlowyResult<()>> {
|
|
let listener = self.listener.clone();
|
|
let listener = self.listener.clone();
|
|
- let token = token.to_owned();
|
|
|
|
let user_id = user_id.to_owned();
|
|
let user_id = user_id.to_owned();
|
|
- to_fut(async move { listener.did_sign_in(&token, user_id).await })
|
|
|
|
|
|
+ let workspace_id = workspace_id.to_owned();
|
|
|
|
+ to_fut(async move { listener.did_sign_in(user_id, &workspace_id).await })
|
|
}
|
|
}
|
|
|
|
|
|
fn did_sign_up(&self, user_profile: &UserProfile) -> Fut<FlowyResult<()>> {
|
|
fn did_sign_up(&self, user_profile: &UserProfile) -> Fut<FlowyResult<()>> {
|
|
@@ -333,9 +333,4 @@ impl UserStatusCallback for UserStatusCallbackImpl {
|
|
let user_id = user_id.to_owned();
|
|
let user_id = user_id.to_owned();
|
|
to_fut(async move { listener.did_expired(&token, user_id).await })
|
|
to_fut(async move { listener.did_expired(&token, user_id).await })
|
|
}
|
|
}
|
|
-
|
|
|
|
- fn will_migrated(&self, _token: &str, _old_user_id: &str, _user_id: i64) -> Fut<FlowyResult<()>> {
|
|
|
|
- // Read the folder data
|
|
|
|
- todo!()
|
|
|
|
- }
|
|
|
|
}
|
|
}
|