11mod deps_resolve;
22pub mod module;
3- pub use flowy_net:: get_client_server_configuration;
4-
53use crate :: deps_resolve:: * ;
6-
74use flowy_client_ws:: { listen_on_websocket, FlowyWebSocketConnect , NetworkType } ;
85use flowy_database:: manager:: DatabaseManager ;
96use flowy_document:: entities:: DocumentVersionPB ;
107use flowy_document:: { DocumentConfig , DocumentManager } ;
8+ use flowy_error:: FlowyResult ;
119use flowy_folder:: entities:: ViewDataFormatPB ;
1210use flowy_folder:: { errors:: FlowyError , manager:: FolderManager } ;
11+ pub use flowy_net:: get_client_server_configuration;
1312use flowy_net:: local_server:: LocalServer ;
1413use flowy_net:: ClientServerConfiguration ;
1514use flowy_task:: { TaskDispatcher , TaskRunner } ;
16- use flowy_user:: services:: { notifier:: UserStatus , UserSession , UserSessionConfig } ;
15+ use flowy_user:: event_map:: UserStatusCallback ;
16+ use flowy_user:: services:: { UserSession , UserSessionConfig } ;
1717use lib_dispatch:: prelude:: * ;
1818use lib_dispatch:: runtime:: tokio_default_runtime;
19+
20+ use lib_infra:: future:: { to_fut, Fut } ;
1921use module:: make_plugins;
2022pub use module:: * ;
2123use std:: time:: Duration ;
@@ -27,6 +29,7 @@ use std::{
2729 } ,
2830} ;
2931use tokio:: sync:: { broadcast, RwLock } ;
32+ use user_model:: UserProfile ;
3033
3134static INIT_LOG : AtomicBool = AtomicBool :: new ( false ) ;
3235
@@ -83,9 +86,10 @@ fn create_log_filter(level: String, with_crates: Vec<String>) -> String {
8386 filters. push ( format ! ( "flowy_folder={}" , level) ) ;
8487 filters. push ( format ! ( "flowy_user={}" , level) ) ;
8588 filters. push ( format ! ( "flowy_document={}" , level) ) ;
86- filters. push ( format ! ( "flowy_grid={}" , level) ) ;
87- filters. push ( format ! ( "flowy_collaboration={}" , "info" ) ) ;
88- filters. push ( format ! ( "flowy_notification={}" , level) ) ;
89+ filters. push ( format ! ( "flowy_database={}" , level) ) ;
90+ filters. push ( format ! ( "flowy_sync={}" , "info" ) ) ;
91+ filters. push ( format ! ( "flowy_client_sync={}" , "info" ) ) ;
92+ filters. push ( format ! ( "flowy_notification={}" , "info" ) ) ;
8993 filters. push ( format ! ( "lib_ot={}" , level) ) ;
9094 filters. push ( format ! ( "lib_ws={}" , level) ) ;
9195 filters. push ( format ! ( "lib_infra={}" , level) ) ;
@@ -162,6 +166,21 @@ impl FlowySDK {
162166 )
163167 } ) ;
164168
169+ let user_status_listener = UserStatusListener {
170+ document_manager : document_manager. clone ( ) ,
171+ folder_manager : folder_manager. clone ( ) ,
172+ grid_manager : grid_manager. clone ( ) ,
173+ ws_conn : ws_conn. clone ( ) ,
174+ config : config. clone ( ) ,
175+ } ;
176+ let user_status_callback = UserStatusCallbackImpl {
177+ listener : Arc :: new ( user_status_listener) ,
178+ } ;
179+ let cloned_user_session = user_session. clone ( ) ;
180+ runtime. block_on ( async move {
181+ cloned_user_session. clone ( ) . init ( user_status_callback) . await ;
182+ } ) ;
183+
165184 let event_dispatcher = Arc :: new ( AFPluginDispatcher :: construct ( runtime, || {
166185 make_plugins (
167186 & ws_conn,
@@ -171,16 +190,7 @@ impl FlowySDK {
171190 & document_manager,
172191 )
173192 } ) ) ;
174-
175- _start_listening (
176- & config,
177- & event_dispatcher,
178- & ws_conn,
179- & user_session,
180- & document_manager,
181- & folder_manager,
182- & grid_manager,
183- ) ;
193+ _start_listening ( & event_dispatcher, & ws_conn, & folder_manager) ;
184194
185195 Self {
186196 config,
@@ -201,36 +211,17 @@ impl FlowySDK {
201211}
202212
203213fn _start_listening (
204- config : & FlowySDKConfig ,
205214 event_dispatcher : & AFPluginDispatcher ,
206215 ws_conn : & Arc < FlowyWebSocketConnect > ,
207- user_session : & Arc < UserSession > ,
208- document_manager : & Arc < DocumentManager > ,
209216 folder_manager : & Arc < FolderManager > ,
210- grid_manager : & Arc < DatabaseManager > ,
211217) {
212- let subscribe_user_status = user_session. notifier . subscribe_user_status ( ) ;
213218 let subscribe_network_type = ws_conn. subscribe_network_ty ( ) ;
214219 let folder_manager = folder_manager. clone ( ) ;
215- let grid_manager = grid_manager. clone ( ) ;
216- let cloned_folder_manager = folder_manager. clone ( ) ;
220+ let cloned_folder_manager = folder_manager;
217221 let ws_conn = ws_conn. clone ( ) ;
218- let user_session = user_session. clone ( ) ;
219- let document_manager = document_manager. clone ( ) ;
220- let config = config. clone ( ) ;
221222
222223 event_dispatcher. spawn ( async move {
223- user_session. init ( ) ;
224224 listen_on_websocket ( ws_conn. clone ( ) ) ;
225- _listen_user_status (
226- config,
227- ws_conn. clone ( ) ,
228- subscribe_user_status,
229- document_manager,
230- folder_manager,
231- grid_manager,
232- )
233- . await ;
234225 } ) ;
235226
236227 event_dispatcher. spawn ( async move {
@@ -253,66 +244,6 @@ fn mk_local_server(
253244 }
254245}
255246
256- async fn _listen_user_status (
257- config : FlowySDKConfig ,
258- ws_conn : Arc < FlowyWebSocketConnect > ,
259- mut subscribe : broadcast:: Receiver < UserStatus > ,
260- document_manager : Arc < DocumentManager > ,
261- folder_manager : Arc < FolderManager > ,
262- grid_manager : Arc < DatabaseManager > ,
263- ) {
264- while let Ok ( status) = subscribe. recv ( ) . await {
265- let result = || async {
266- match status {
267- UserStatus :: Login { token, user_id } => {
268- tracing:: trace!( "User did login" ) ;
269- folder_manager. initialize ( & user_id, & token) . await ?;
270- document_manager. initialize ( & user_id) . await ?;
271- grid_manager. initialize ( & user_id, & token) . await ?;
272- ws_conn. start ( token, user_id) . await ?;
273- }
274- UserStatus :: Logout { token : _, user_id } => {
275- tracing:: trace!( "User did logout" ) ;
276- folder_manager. clear ( & user_id) . await ;
277- ws_conn. stop ( ) . await ;
278- }
279- UserStatus :: Expired { token : _, user_id } => {
280- tracing:: trace!( "User session has been expired" ) ;
281- folder_manager. clear ( & user_id) . await ;
282- ws_conn. stop ( ) . await ;
283- }
284- UserStatus :: SignUp { profile, ret } => {
285- tracing:: trace!( "User did sign up" ) ;
286-
287- let view_data_type = match config. document . version {
288- DocumentVersionPB :: V0 => ViewDataFormatPB :: DeltaFormat ,
289- DocumentVersionPB :: V1 => ViewDataFormatPB :: TreeFormat ,
290- } ;
291- folder_manager
292- . initialize_with_new_user ( & profile. id , & profile. token , view_data_type)
293- . await ?;
294- document_manager
295- . initialize_with_new_user ( & profile. id , & profile. token )
296- . await ?;
297-
298- grid_manager
299- . initialize_with_new_user ( & profile. id , & profile. token )
300- . await ?;
301-
302- ws_conn. start ( profile. token . clone ( ) , profile. id . clone ( ) ) . await ?;
303- let _ = ret. send ( ( ) ) ;
304- }
305- }
306- Ok :: < ( ) , FlowyError > ( ( ) )
307- } ;
308-
309- match result ( ) . await {
310- Ok ( _) => { }
311- Err ( e) => tracing:: error!( "{}" , e) ,
312- }
313- }
314- }
315-
316247async fn _listen_network_status ( mut subscribe : broadcast:: Receiver < NetworkType > , _core : Arc < FolderManager > ) {
317248 while let Ok ( _new_type) = subscribe. recv ( ) . await {
318249 // core.network_state_changed(new_type);
@@ -345,3 +276,75 @@ fn mk_user_session(
345276 let cloud_service = UserDepsResolver :: resolve ( local_server, server_config) ;
346277 Arc :: new ( UserSession :: new ( user_config, cloud_service) )
347278}
279+
280+ struct UserStatusListener {
281+ document_manager : Arc < DocumentManager > ,
282+ folder_manager : Arc < FolderManager > ,
283+ grid_manager : Arc < DatabaseManager > ,
284+ ws_conn : Arc < FlowyWebSocketConnect > ,
285+ config : FlowySDKConfig ,
286+ }
287+
288+ impl UserStatusListener {
289+ async fn did_sign_in ( & self , token : & str , user_id : & str ) -> FlowyResult < ( ) > {
290+ self . folder_manager . initialize ( user_id, token) . await ?;
291+ self . document_manager . initialize ( user_id) . await ?;
292+ self . grid_manager . initialize ( user_id, token) . await ?;
293+ self . ws_conn . start ( token. to_owned ( ) , user_id. to_owned ( ) ) . await ?;
294+ Ok ( ( ) )
295+ }
296+
297+ async fn did_sign_up ( & self , user_profile : & UserProfile ) -> FlowyResult < ( ) > {
298+ let view_data_type = match self . config . document . version {
299+ DocumentVersionPB :: V0 => ViewDataFormatPB :: DeltaFormat ,
300+ DocumentVersionPB :: V1 => ViewDataFormatPB :: TreeFormat ,
301+ } ;
302+ self . folder_manager
303+ . initialize_with_new_user ( & user_profile. id , & user_profile. token , view_data_type)
304+ . await ?;
305+ self . document_manager
306+ . initialize_with_new_user ( & user_profile. id , & user_profile. token )
307+ . await ?;
308+
309+ self . grid_manager
310+ . initialize_with_new_user ( & user_profile. id , & user_profile. token )
311+ . await ?;
312+
313+ self . ws_conn
314+ . start ( user_profile. token . clone ( ) , user_profile. id . clone ( ) )
315+ . await ?;
316+ Ok ( ( ) )
317+ }
318+
319+ async fn did_expired ( & self , _token : & str , user_id : & str ) -> FlowyResult < ( ) > {
320+ self . folder_manager . clear ( user_id) . await ;
321+ self . ws_conn . stop ( ) . await ;
322+ Ok ( ( ) )
323+ }
324+ }
325+
326+ struct UserStatusCallbackImpl {
327+ listener : Arc < UserStatusListener > ,
328+ }
329+
330+ impl UserStatusCallback for UserStatusCallbackImpl {
331+ fn did_sign_in ( & self , token : & str , user_id : & str ) -> Fut < FlowyResult < ( ) > > {
332+ let listener = self . listener . clone ( ) ;
333+ let token = token. to_owned ( ) ;
334+ let user_id = user_id. to_owned ( ) ;
335+ to_fut ( async move { listener. did_sign_in ( & token, & user_id) . await } )
336+ }
337+
338+ fn did_sign_up ( & self , user_profile : & UserProfile ) -> Fut < FlowyResult < ( ) > > {
339+ let listener = self . listener . clone ( ) ;
340+ let user_profile = user_profile. clone ( ) ;
341+ to_fut ( async move { listener. did_sign_up ( & user_profile) . await } )
342+ }
343+
344+ fn did_expired ( & self , token : & str , user_id : & str ) -> Fut < FlowyResult < ( ) > > {
345+ let listener = self . listener . clone ( ) ;
346+ let token = token. to_owned ( ) ;
347+ let user_id = user_id. to_owned ( ) ;
348+ to_fut ( async move { listener. did_expired ( & token, & user_id) . await } )
349+ }
350+ }
0 commit comments