diff --git a/Cargo.lock b/Cargo.lock index 811af9d3..c55c8a0c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -631,6 +631,8 @@ name = "appflowy-collaborate" version = "0.1.0" dependencies = [ "access-control", + "actix", + "actix-web-actors", "anyhow", "app-error", "async-stream", @@ -649,6 +651,7 @@ dependencies = [ "database-entity", "futures", "futures-util", + "governor", "indexmap 2.2.5", "itertools 0.12.0", "lazy_static", @@ -660,6 +663,7 @@ dependencies = [ "semver", "serde", "serde_json", + "serde_repr", "sqlx", "thiserror", "tokio", diff --git a/Cargo.toml b/Cargo.toml index 2d78ad09..eade3d46 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -actix = "0.13.3" +actix.workspace = true actix-web = { version = "4.5.1", default-features = false, features = ["openssl", "compress-brotli", "compress-gzip"] } actix-http = { workspace = true, default-features = false, features = ["openssl", "compress-brotli", "compress-gzip"] } actix-rt = "2.9.0" @@ -19,6 +19,7 @@ openssl = { version = "0.10.62", features = ["vendored"] } # serde serde_json.workspace = true +serde_repr.workspace = true serde.workspace = true tokio = { workspace = true, features = [ @@ -95,7 +96,7 @@ shared-entity = { path = "libs/shared-entity", features = ["cloud"] } workspace-template = { workspace = true } collab-rt-entity.workspace = true collab-stream.workspace = true -serde_repr = "0.1.18" + tonic-build = "0.11.0" log = "0.4.20" lettre = { version = "0.11.7", features = ["tokio1", "tokio1-native-tls"] } @@ -171,11 +172,13 @@ async-trait = "0.1.77" prometheus-client = "0.22.0" collab-stream = { path = "libs/collab-stream" } serde_json = "1.0.111" +serde_repr = "0.1.18" serde = { version = "1.0.195", features = ["derive"] } bytes = "1.5.0" workspace-template = { path = "libs/workspace-template" } uuid = { version = "1.6.1", features = ["v4"] } anyhow = "1.0.79" +actix = "0.13.3" actix-http = { version = "3.6.0", default-features = false } tokio = { version = "1.36.0", features = ["sync"] } tokio-stream = "0.1.14" diff --git a/services/appflowy-collaborate/Cargo.toml b/services/appflowy-collaborate/Cargo.toml index 13c95130..83bd998e 100644 --- a/services/appflowy-collaborate/Cargo.toml +++ b/services/appflowy-collaborate/Cargo.toml @@ -13,6 +13,8 @@ path = "src/lib.rs" [dependencies] access-control.workspace = true +actix.workspace = true +actix-web-actors = { version = "4.3" } app-error = { workspace = true, features = ["sqlx_error", "tokio_error"] } dashmap.workspace = true async-stream.workspace = true @@ -25,6 +27,7 @@ tokio = { workspace = true, features = ["net", "sync", "macros", "rt-multi-threa async-trait = "0.1.77" serde.workspace = true serde_json.workspace = true +serde_repr.workspace = true sqlx = { workspace = true, default-features = false, features = ["runtime-tokio-rustls", "macros", "postgres", "uuid", "chrono"] } thiserror = "1.0.56" anyhow = "1" @@ -37,6 +40,7 @@ collab-folder = { workspace = true } collab-document = { workspace = true } database.workspace = true database-entity.workspace = true +governor = { version = "0.6.3" } yrs.workspace = true chrono = "0.4.31" collab-rt-entity = { workspace = true, features = ["actix_message"] } diff --git a/src/biz/actix_ws/client/mod.rs b/services/appflowy-collaborate/src/actix_ws/client/mod.rs similarity index 100% rename from src/biz/actix_ws/client/mod.rs rename to services/appflowy-collaborate/src/actix_ws/client/mod.rs diff --git a/src/biz/actix_ws/client/rt_client.rs b/services/appflowy-collaborate/src/actix_ws/client/rt_client.rs similarity index 98% rename from src/biz/actix_ws/client/rt_client.rs rename to services/appflowy-collaborate/src/actix_ws/client/rt_client.rs index 01b5b307..20433663 100644 --- a/src/biz/actix_ws/client/rt_client.rs +++ b/services/appflowy-collaborate/src/actix_ws/client/rt_client.rs @@ -1,4 +1,6 @@ -use crate::biz::actix_ws::entities::{ClientMessage, Connect, Disconnect, RealtimeMessage}; +use crate::actix_ws::entities::{ClientMessage, Connect, Disconnect, RealtimeMessage}; +use crate::error::RealtimeError; +use crate::RealtimeClientWebsocketSink; use actix::{ fut, Actor, ActorContext, ActorFutureExt, Addr, AsyncContext, Context, ContextFutureSpawner, Handler, MailboxError, Recipient, ResponseFuture, Running, StreamHandler, WrapFuture, @@ -6,8 +8,6 @@ use actix::{ use actix_web_actors::ws; use actix_web_actors::ws::{CloseCode, CloseReason, ProtocolError, WebsocketContext}; use anyhow::anyhow; -use appflowy_collaborate::error::RealtimeError; -use appflowy_collaborate::RealtimeClientWebsocketSink; use async_trait::async_trait; use bytes::Bytes; use collab_rt_entity::user::RealtimeUser; diff --git a/src/biz/actix_ws/entities.rs b/services/appflowy-collaborate/src/actix_ws/entities.rs similarity index 95% rename from src/biz/actix_ws/entities.rs rename to services/appflowy-collaborate/src/actix_ws/entities.rs index 52d7f650..77a836b9 100644 --- a/src/biz/actix_ws/entities.rs +++ b/services/appflowy-collaborate/src/actix_ws/entities.rs @@ -1,5 +1,5 @@ +use crate::error::RealtimeError; use actix::{Message, Recipient}; -use appflowy_collaborate::error::RealtimeError; use serde_repr::{Deserialize_repr, Serialize_repr}; use std::fmt::Debug; diff --git a/src/biz/actix_ws/mod.rs b/services/appflowy-collaborate/src/actix_ws/mod.rs similarity index 100% rename from src/biz/actix_ws/mod.rs rename to services/appflowy-collaborate/src/actix_ws/mod.rs diff --git a/src/biz/actix_ws/server/mod.rs b/services/appflowy-collaborate/src/actix_ws/server/mod.rs similarity index 100% rename from src/biz/actix_ws/server/mod.rs rename to services/appflowy-collaborate/src/actix_ws/server/mod.rs diff --git a/src/biz/actix_ws/server/rt_actor.rs b/services/appflowy-collaborate/src/actix_ws/server/rt_actor.rs similarity index 93% rename from src/biz/actix_ws/server/rt_actor.rs rename to services/appflowy-collaborate/src/actix_ws/server/rt_actor.rs index 73e8494d..30d1f074 100644 --- a/src/biz/actix_ws/server/rt_actor.rs +++ b/services/appflowy-collaborate/src/actix_ws/server/rt_actor.rs @@ -3,14 +3,14 @@ use std::ops::Deref; use actix::{Actor, Context, Handler, ResponseFuture}; use tracing::{error, info, warn}; +use crate::error::RealtimeError; +use crate::CollaborationServer; use access_control::collab::RealtimeAccessControl; -use appflowy_collaborate::error::RealtimeError; -use appflowy_collaborate::CollaborationServer; use collab_rt_entity::user::UserDevice; use database::collab::CollabStorage; -use crate::biz::actix_ws::client::rt_client::{RealtimeClientWebsocketSinkImpl, RealtimeServer}; -use crate::biz::actix_ws::entities::{ClientMessage, ClientStreamMessage, Connect, Disconnect}; +use crate::actix_ws::client::rt_client::{RealtimeClientWebsocketSinkImpl, RealtimeServer}; +use crate::actix_ws::entities::{ClientMessage, ClientStreamMessage, Connect, Disconnect}; #[derive(Clone)] pub struct RealtimeServerActor(pub CollaborationServer); diff --git a/services/appflowy-collaborate/src/lib.rs b/services/appflowy-collaborate/src/lib.rs index 5b77b46a..c00b7cb0 100644 --- a/services/appflowy-collaborate/src/lib.rs +++ b/services/appflowy-collaborate/src/lib.rs @@ -1,3 +1,4 @@ +pub mod actix_ws; mod client; pub mod collab; pub mod command; diff --git a/src/api/workspace.rs b/src/api/workspace.rs index dd9c46fe..ab47d865 100644 --- a/src/api/workspace.rs +++ b/src/api/workspace.rs @@ -16,6 +16,7 @@ use validator::Validate; use access_control::collab::CollabAccessControl; use app_error::AppError; +use appflowy_collaborate::actix_ws::entities::ClientStreamMessage; use collab_rt_entity::realtime_proto::HttpRealtimeMessage; use collab_rt_entity::RealtimeMessage; use collab_rt_protocol::validate_encode_collab; @@ -29,7 +30,6 @@ use shared_entity::response::{AppResponse, JsonAppResponse}; use crate::api::util::{compress_type_from_header_value, device_id_from_headers, CollabValidator}; use crate::api::ws::RealtimeServerAddr; use crate::biz; -use crate::biz::actix_ws::entities::ClientStreamMessage; use crate::biz::user::auth::jwt::UserUuid; use crate::biz::workspace; use crate::domain::compression::{decompress, CompressionType, X_COMPRESSION_TYPE}; diff --git a/src/api/ws.rs b/src/api/ws.rs index 68ef0993..a6713bfa 100644 --- a/src/api/ws.rs +++ b/src/api/ws.rs @@ -12,13 +12,13 @@ use tokio::sync::mpsc::Sender; use tracing::{debug, error, instrument, trace}; use app_error::AppError; +use appflowy_collaborate::actix_ws::client::rt_client::RealtimeClient; +use appflowy_collaborate::actix_ws::server::RealtimeServerActor; use appflowy_collaborate::collab::access_control::RealtimeCollabAccessControlImpl; use collab_rt_entity::user::{AFUserChange, RealtimeUser, UserMessage}; use collab_rt_entity::RealtimeMessage; use shared_entity::response::AppResponseError; -use crate::biz::actix_ws::client::rt_client::RealtimeClient; -use crate::biz::actix_ws::server::RealtimeServerActor; use crate::biz::collab::storage::CollabAccessControlStorage; use crate::biz::user::auth::jwt::{authorization_from_token, UserUuid}; use crate::state::AppState; diff --git a/src/application.rs b/src/application.rs index 1c7382ae..c536bc3a 100644 --- a/src/application.rs +++ b/src/application.rs @@ -9,7 +9,6 @@ use access_control::access::{enable_access_control, AccessControl}; use crate::api::ai_tool::ai_tool_scope; use crate::api::chat::chat_scope; -use crate::biz::actix_ws::server::RealtimeServerActor; use crate::biz::collab::access_control::{ CollabMiddlewareAccessControl, CollabStorageAccessControlImpl, }; @@ -31,6 +30,7 @@ use actix_web::cookie::Key; use actix_web::{dev::Server, web, web::Data, App, HttpServer}; use anyhow::{Context, Error}; use appflowy_ai_client::client::AppFlowyAIClient; +use appflowy_collaborate::actix_ws::server::RealtimeServerActor; use appflowy_collaborate::collab::access_control::{ CollabAccessControlImpl, RealtimeCollabAccessControlImpl, }; diff --git a/src/biz/mod.rs b/src/biz/mod.rs index e94c5a28..aca62d60 100644 --- a/src/biz/mod.rs +++ b/src/biz/mod.rs @@ -1,4 +1,3 @@ -pub mod actix_ws; pub mod chat; pub mod collab; pub mod pg_listener; diff --git a/tests/websocket/actor_test.rs b/tests/websocket/actor_test.rs index a3cdaf9a..3ba3e8ac 100644 --- a/tests/websocket/actor_test.rs +++ b/tests/websocket/actor_test.rs @@ -1,8 +1,8 @@ use actix::{Actor, Context, Handler}; -use appflowy_cloud::biz::actix_ws::client::rt_client::{ +use appflowy_collaborate::actix_ws::client::rt_client::{ HandlerResult, RealtimeClient, RealtimeServer, }; -use appflowy_cloud::biz::actix_ws::entities::{ClientMessage, Connect, Disconnect}; +use appflowy_collaborate::actix_ws::entities::{ClientMessage, Connect, Disconnect}; use collab_rt_entity::user::RealtimeUser; use collab_rt_entity::RealtimeMessage; use semver::Version;