首次连接回调
This commit is contained in:
@@ -30,4 +30,4 @@
|
|||||||
|
|
||||||
pub mod websocket;
|
pub mod websocket;
|
||||||
|
|
||||||
pub use websocket::{WebSocketClient, WebSocketConfig, WebSocketMessage};
|
pub use websocket::{WebSocketClient, WebSocketConfig, WebSocketMessage, OutgoingMessage, ConnectionStatus};
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
use crate::websocket::{WebSocketConfig, WebSocketMessage, WebSocketError};
|
use crate::websocket::{WebSocketConfig, WebSocketMessage, WebSocketError};
|
||||||
use futures_util::{SinkExt, StreamExt};
|
use futures_util::{SinkExt, StreamExt};
|
||||||
|
use std::pin::Pin;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use tokio::sync::{mpsc, Mutex};
|
use tokio::sync::{mpsc, Mutex};
|
||||||
use tokio::time::Duration;
|
use tokio::time::Duration;
|
||||||
@@ -60,7 +61,8 @@ pub type SentCallback = Arc<dyn Fn(String, Value) + Send + Sync>;
|
|||||||
pub type ReconnectingCallback = Arc<dyn Fn(u32, Arc<tokio::sync::Mutex<String>>) + Send + Sync>;
|
pub type ReconnectingCallback = Arc<dyn Fn(u32, Arc<tokio::sync::Mutex<String>>) + Send + Sync>;
|
||||||
/// Callback triggered on first successful connection (before any reconnect)
|
/// Callback triggered on first successful connection (before any reconnect)
|
||||||
/// Arguments: (url, send_fn) - send_fn can be called to send messages
|
/// Arguments: (url, send_fn) - send_fn can be called to send messages
|
||||||
pub type FirstConnectCallback = Arc<dyn Fn(String, Arc<Mutex<Option<mpsc::Sender<OutgoingMessage>>>>) + Send + Sync>;
|
/// Note: This is an async callback - return a boxed Future
|
||||||
|
pub type FirstConnectCallback = Arc<dyn Fn(String, Arc<Mutex<Option<mpsc::Sender<OutgoingMessage>>>>) -> Pin<Box<dyn std::future::Future<Output = ()> + Send + Sync + 'static>> + Send + Sync>;
|
||||||
|
|
||||||
/// WebSocket client with event-driven architecture
|
/// WebSocket client with event-driven architecture
|
||||||
pub struct WebSocketClient {
|
pub struct WebSocketClient {
|
||||||
@@ -198,10 +200,10 @@ impl WebSocketClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Set callback for first successful connection (before any reconnect)
|
/// Set callback for first successful connection (before any reconnect)
|
||||||
/// This is called only on the first connection, allowing the app to send initial messages
|
/// This is an async callback - the returned Future will be awaited
|
||||||
pub fn on_first_connect<F>(&mut self, callback: F) -> &mut Self
|
pub fn on_first_connect<F>(&mut self, callback: F) -> &mut Self
|
||||||
where
|
where
|
||||||
F: Fn(String, Arc<Mutex<Option<mpsc::Sender<OutgoingMessage>>>>) + Send + Sync + 'static,
|
F: Fn(String, Arc<Mutex<Option<mpsc::Sender<OutgoingMessage>>>>) -> Pin<Box<dyn std::future::Future<Output = ()> + Send + Sync + 'static>> + Send + Sync + 'static,
|
||||||
{
|
{
|
||||||
self.on_first_connect = Some(Arc::new(callback));
|
self.on_first_connect = Some(Arc::new(callback));
|
||||||
self
|
self
|
||||||
@@ -468,7 +470,7 @@ impl WebSocketClient {
|
|||||||
// Call on_first_connect callback (only on first connection, not on reconnect)
|
// Call on_first_connect callback (only on first connection, not on reconnect)
|
||||||
if is_first {
|
if is_first {
|
||||||
if let Some(ref callback) = on_first_connect {
|
if let Some(ref callback) = on_first_connect {
|
||||||
callback(url.to_string(), sender);
|
callback(url.to_string(), sender).await;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user