leptos_sync_core/transport/
websocket.rs1use super::{SyncTransport, TransportError};
4use std::sync::Arc;
5use tokio::sync::RwLock;
6use std::collections::VecDeque;
7
8pub struct WebSocketTransport {
9 url: String,
10 message_queue: Arc<RwLock<VecDeque<Vec<u8>>>>,
11 connected: bool,
12}
13
14impl WebSocketTransport {
15 pub fn new(url: String) -> Self {
16 Self {
17 url,
18 message_queue: Arc::new(RwLock::new(VecDeque::new())),
19 connected: false,
20 }
21 }
22
23 pub fn with_reconnect_config(url: String, _max_attempts: usize, _delay_ms: u32) -> Self {
24 Self {
25 url,
26 message_queue: Arc::new(RwLock::new(VecDeque::new())),
27 connected: false,
28 }
29 }
30
31 pub async fn connect(&self) -> Result<(), TransportError> {
32 tracing::debug!("Would connect to WebSocket at {}", self.url);
34 Ok(())
35 }
36
37 pub async fn disconnect(&self) -> Result<(), TransportError> {
38 tracing::debug!("Would disconnect from WebSocket at {}", self.url);
40 Ok(())
41 }
42
43 pub async fn send_binary(&self, _data: &[u8]) -> Result<(), TransportError> {
44 tracing::debug!("Would send binary data via WebSocket to {}", self.url);
46 Ok(())
47 }
48
49 pub async fn send_text(&self, _text: &str) -> Result<(), TransportError> {
50 tracing::debug!("Would send text via WebSocket to {}", self.url);
52 Ok(())
53 }
54}
55
56impl SyncTransport for WebSocketTransport {
57 type Error = TransportError;
58
59 fn send(&self, _data: &[u8]) -> impl std::future::Future<Output = Result<(), Self::Error>> + Send {
60 async move {
61 tracing::debug!("Would send data via WebSocket");
63 Ok(())
64 }
65 }
66
67 fn receive(&self) -> impl std::future::Future<Output = Result<Vec<Vec<u8>>, Self::Error>> + Send {
68 async move {
69 Ok(Vec::new())
71 }
72 }
73
74 fn is_connected(&self) -> bool {
75 self.connected
76 }
77}
78
79impl Clone for WebSocketTransport {
80 fn clone(&self) -> Self {
81 Self {
82 url: self.url.clone(),
83 message_queue: self.message_queue.clone(),
84 connected: self.connected,
85 }
86 }
87}
88
89#[derive(Debug, Clone)]
91pub struct WebSocketConfig {
92 pub url: String,
93 pub auto_reconnect: bool,
94 pub max_reconnect_attempts: usize,
95 pub reconnect_delay_ms: u32,
96 pub heartbeat_interval_ms: u32,
97 pub connection_timeout_ms: u32,
98}
99
100impl Default for WebSocketConfig {
101 fn default() -> Self {
102 Self {
103 url: "ws://localhost:8080".to_string(),
104 auto_reconnect: true,
105 max_reconnect_attempts: 5,
106 reconnect_delay_ms: 1000,
107 heartbeat_interval_ms: 30000,
108 connection_timeout_ms: 10000,
109 }
110 }
111}
112
113#[cfg(test)]
114mod tests {
115 use super::*;
116
117 #[tokio::test]
118 async fn test_websocket_transport_creation() {
119 let transport = WebSocketTransport::new("ws://localhost:8080".to_string());
120 assert_eq!(transport.url, "ws://localhost:8080");
121 assert!(!transport.is_connected());
122 }
123
124 #[tokio::test]
125 async fn test_websocket_config_default() {
126 let config = WebSocketConfig::default();
127 assert_eq!(config.url, "ws://localhost:8080");
128 assert!(config.auto_reconnect);
129 assert_eq!(config.max_reconnect_attempts, 5);
130 assert_eq!(config.reconnect_delay_ms, 1000);
131 }
132
133 #[tokio::test]
134 async fn test_websocket_with_reconnect_config() {
135 let transport = WebSocketTransport::with_reconnect_config(
136 "ws://localhost:8080".to_string(),
137 10,
138 2000
139 );
140 assert_eq!(transport.url, "ws://localhost:8080");
141 }
142
143 #[tokio::test]
144 async fn test_websocket_transport_operations() {
145 let transport = WebSocketTransport::new("ws://localhost:8080".to_string());
146
147 assert!(transport.connect().await.is_ok());
149
150 assert!(transport.disconnect().await.is_ok());
152
153 assert!(transport.send_binary(b"test data").await.is_ok());
155 assert!(transport.send_text("test message").await.is_ok());
156
157 assert!(transport.send(b"test").await.is_ok());
159 let received = transport.receive().await.unwrap();
160 assert_eq!(received.len(), 0); assert!(!transport.is_connected());
162 }
163
164 #[tokio::test]
165 async fn test_websocket_transport_clone() {
166 let transport1 = WebSocketTransport::new("ws://localhost:8080".to_string());
167 let transport2 = transport1.clone();
168
169 assert_eq!(transport1.url, transport2.url);
170 assert_eq!(transport1.is_connected(), transport2.is_connected());
171 }
172}