147 lines
5.0 KiB
Rust
Raw Normal View History

2021-12-26 19:10:37 +08:00
use crate::entities::NetworkType;
2022-01-07 17:37:11 +08:00
2021-12-26 19:10:37 +08:00
pub use flowy_error::FlowyError;
2021-12-14 15:31:44 +08:00
use lib_infra::future::FutureResult;
2021-12-26 19:10:37 +08:00
pub use lib_ws::{WSConnectState, WSMessageReceiver, WebSocketRawMessage};
2022-01-07 17:37:11 +08:00
2022-01-24 16:27:40 +08:00
use futures_util::future::BoxFuture;
2022-01-13 10:53:30 +08:00
use lib_ws::WSController;
2021-12-26 19:10:37 +08:00
use parking_lot::RwLock;
2021-12-14 15:31:44 +08:00
use std::sync::Arc;
2022-01-07 17:37:11 +08:00
use tokio::sync::broadcast;
2021-12-14 15:31:44 +08:00
2022-01-07 17:37:11 +08:00
pub trait FlowyRawWebSocket: Send + Sync {
2022-01-07 23:00:23 +08:00
fn initialize(&self) -> FutureResult<(), FlowyError>;
fn start_connect(&self, addr: String, user_id: String) -> FutureResult<(), FlowyError>;
2021-12-14 20:50:07 +08:00
fn stop_connect(&self) -> FutureResult<(), FlowyError>;
2022-01-24 16:27:40 +08:00
fn subscribe_connect_state(&self) -> BoxFuture<broadcast::Receiver<WSConnectState>>;
2021-12-14 15:31:44 +08:00
fn reconnect(&self, count: usize) -> FutureResult<(), FlowyError>;
2022-01-23 22:33:47 +08:00
fn add_msg_receiver(&self, receiver: Arc<dyn WSMessageReceiver>) -> Result<(), FlowyError>;
2022-01-24 16:27:40 +08:00
fn ws_msg_sender(&self) -> FutureResult<Option<Arc<dyn FlowyWebSocket>>, FlowyError>;
2021-12-26 19:10:37 +08:00
}
2022-01-14 20:52:03 +08:00
pub trait FlowyWebSocket: Send + Sync {
2021-12-26 19:10:37 +08:00
fn send(&self, msg: WebSocketRawMessage) -> Result<(), FlowyError>;
}
2022-01-07 17:37:11 +08:00
pub struct FlowyWebSocketConnect {
inner: Arc<dyn FlowyRawWebSocket>,
2021-12-26 19:10:37 +08:00
connect_type: RwLock<NetworkType>,
status_notifier: broadcast::Sender<NetworkType>,
addr: String,
}
2022-01-07 17:37:11 +08:00
impl FlowyWebSocketConnect {
2022-01-13 10:53:30 +08:00
pub fn new(addr: String) -> Self {
let ws = Arc::new(Arc::new(WSController::new()));
let (status_notifier, _) = broadcast::channel(10);
FlowyWebSocketConnect {
inner: ws,
connect_type: RwLock::new(NetworkType::default()),
status_notifier,
addr,
}
}
pub fn from_local(addr: String, ws: Arc<dyn FlowyRawWebSocket>) -> Self {
2021-12-26 19:10:37 +08:00
let (status_notifier, _) = broadcast::channel(10);
2022-01-07 17:37:11 +08:00
FlowyWebSocketConnect {
2021-12-26 19:10:37 +08:00
inner: ws,
connect_type: RwLock::new(NetworkType::default()),
status_notifier,
addr,
}
}
2022-01-07 23:00:23 +08:00
pub async fn init(&self) {
match self.inner.initialize().await {
2022-01-24 17:35:58 +08:00
Ok(_) => {}
2022-01-07 23:00:23 +08:00
Err(e) => tracing::error!("FlowyWebSocketConnect init error: {:?}", e),
}
}
pub async fn start(&self, token: String, user_id: String) -> Result<(), FlowyError> {
let addr = format!("{}/{}", self.addr, &token);
2021-12-26 19:10:37 +08:00
self.inner.stop_connect().await?;
2022-01-07 23:00:23 +08:00
let _ = self.inner.start_connect(addr, user_id).await?;
2021-12-26 19:10:37 +08:00
Ok(())
}
2022-01-24 17:35:58 +08:00
pub async fn stop(&self) {
let _ = self.inner.stop_connect().await;
}
2021-12-26 19:10:37 +08:00
pub fn update_network_type(&self, new_type: &NetworkType) {
tracing::debug!("Network new state: {:?}", new_type);
let old_type = self.connect_type.read().clone();
let _ = self.status_notifier.send(new_type.clone());
if &old_type != new_type {
tracing::debug!("Connect type switch from {:?} to {:?}", old_type, new_type);
match (old_type.is_connect(), new_type.is_connect()) {
(false, true) => {
let ws_controller = self.inner.clone();
tokio::spawn(async move { retry_connect(ws_controller, 100).await });
2022-01-24 17:35:58 +08:00
}
2021-12-26 19:10:37 +08:00
(true, false) => {
//
2022-01-24 17:35:58 +08:00
}
_ => {}
2021-12-26 19:10:37 +08:00
}
*self.connect_type.write() = new_type.clone();
}
}
2022-01-24 16:27:40 +08:00
pub async fn subscribe_websocket_state(&self) -> broadcast::Receiver<WSConnectState> {
self.inner.subscribe_connect_state().await
2021-12-26 19:10:37 +08:00
}
2022-01-24 17:35:58 +08:00
pub fn subscribe_network_ty(&self) -> broadcast::Receiver<NetworkType> {
self.status_notifier.subscribe()
}
2021-12-26 19:10:37 +08:00
2022-01-07 17:37:11 +08:00
pub fn add_ws_message_receiver(&self, receiver: Arc<dyn WSMessageReceiver>) -> Result<(), FlowyError> {
2022-01-23 22:33:47 +08:00
let _ = self.inner.add_msg_receiver(receiver)?;
2021-12-26 19:10:37 +08:00
Ok(())
}
2022-01-24 16:27:40 +08:00
pub async fn web_socket(&self) -> Result<Option<Arc<dyn FlowyWebSocket>>, FlowyError> {
self.inner.ws_msg_sender().await
}
2021-12-26 19:10:37 +08:00
}
2022-01-07 17:37:11 +08:00
#[tracing::instrument(level = "debug", skip(ws_conn))]
pub fn listen_on_websocket(ws_conn: Arc<FlowyWebSocketConnect>) {
2022-01-14 20:52:03 +08:00
let raw_web_socket = ws_conn.inner.clone();
2022-01-11 22:23:19 +08:00
let _ = tokio::spawn(async move {
2022-01-24 16:27:40 +08:00
let mut notify = ws_conn.inner.subscribe_connect_state().await;
2022-01-11 22:23:19 +08:00
loop {
match notify.recv().await {
Ok(state) => {
tracing::info!("Websocket state changed: {}", state);
match state {
2022-01-24 17:35:58 +08:00
WSConnectState::Init => {}
WSConnectState::Connected => {}
WSConnectState::Connecting => {}
2022-01-14 20:52:03 +08:00
WSConnectState::Disconnected => retry_connect(raw_web_socket.clone(), 100).await,
2022-01-11 22:23:19 +08:00
}
2022-01-24 17:35:58 +08:00
}
2022-01-11 22:23:19 +08:00
Err(e) => {
tracing::error!("Websocket state notify error: {:?}", e);
break;
2022-01-24 17:35:58 +08:00
}
2021-12-26 19:10:37 +08:00
}
2022-01-11 22:23:19 +08:00
}
});
2021-12-26 19:10:37 +08:00
}
2022-01-07 17:37:11 +08:00
async fn retry_connect(ws: Arc<dyn FlowyRawWebSocket>, count: usize) {
2021-12-26 19:10:37 +08:00
match ws.reconnect(count).await {
2022-01-24 17:35:58 +08:00
Ok(_) => {}
2021-12-26 19:10:37 +08:00
Err(e) => {
tracing::error!("websocket connect failed: {:?}", e);
2022-01-24 17:35:58 +08:00
}
2021-12-26 19:10:37 +08:00
}
}