1
1
pub mod server;
2
2
3
3
use iced:: futures;
4
- use iced:: stream ;
4
+ use iced:: task :: { sipper , Never , Sipper } ;
5
5
use iced:: widget:: text;
6
6
7
7
use futures:: channel:: mpsc;
8
8
use futures:: sink:: SinkExt ;
9
- use futures:: stream:: { Stream , StreamExt } ;
9
+ use futures:: stream:: StreamExt ;
10
10
11
11
use async_tungstenite:: tungstenite;
12
12
use std:: fmt;
13
13
14
- pub fn connect ( ) -> impl Stream < Item = Event > {
15
- stream:: channel ( 100 , |mut output| async move {
16
- let mut state = State :: Disconnected ;
17
-
14
+ pub fn connect ( ) -> impl Sipper < Never , Event > {
15
+ sipper ( |mut output| async move {
18
16
loop {
19
- match & mut state {
20
- State :: Disconnected => {
21
- const ECHO_SERVER : & str = "ws://127.0.0.1:3030" ;
17
+ const ECHO_SERVER : & str = "ws://127.0.0.1:3030" ;
22
18
23
- match async_tungstenite :: tokio :: connect_async ( ECHO_SERVER )
24
- . await
25
- {
26
- Ok ( ( websocket, _) ) => {
27
- let ( sender, receiver) = mpsc:: channel ( 100 ) ;
19
+ let ( mut websocket , mut input ) =
20
+ match async_tungstenite :: tokio :: connect_async ( ECHO_SERVER ) . await
21
+ {
22
+ Ok ( ( websocket, _) ) => {
23
+ let ( sender, receiver) = mpsc:: channel ( 100 ) ;
28
24
29
- let _ = output
30
- . send ( Event :: Connected ( Connection ( sender) ) )
31
- . await ;
25
+ let _ = output
26
+ . send ( Event :: Connected ( Connection ( sender) ) )
27
+ . await ;
32
28
33
- state = State :: Connected ( websocket, receiver) ;
34
- }
35
- Err ( _) => {
36
- tokio:: time:: sleep (
37
- tokio:: time:: Duration :: from_secs ( 1 ) ,
38
- )
29
+ ( websocket. fuse ( ) , receiver)
30
+ }
31
+ Err ( _) => {
32
+ tokio:: time:: sleep ( tokio:: time:: Duration :: from_secs ( 1 ) )
39
33
. await ;
40
34
41
- let _ = output. send ( Event :: Disconnected ) . await ;
42
- }
35
+ let _ = output. send ( Event :: Disconnected ) . await ;
36
+
37
+ continue ;
43
38
}
44
- }
45
- State :: Connected ( websocket, input) => {
46
- let mut fused_websocket = websocket. by_ref ( ) . fuse ( ) ;
47
-
48
- futures:: select! {
49
- received = fused_websocket. select_next_some( ) => {
50
- match received {
51
- Ok ( tungstenite:: Message :: Text ( message) ) => {
52
- let _ = output. send( Event :: MessageReceived ( Message :: User ( message) ) ) . await ;
53
- }
54
- Err ( _) => {
55
- let _ = output. send( Event :: Disconnected ) . await ;
56
-
57
- state = State :: Disconnected ;
58
- }
59
- Ok ( _) => continue ,
39
+ } ;
40
+
41
+ loop {
42
+ futures:: select! {
43
+ received = websocket. select_next_some( ) => {
44
+ match received {
45
+ Ok ( tungstenite:: Message :: Text ( message) ) => {
46
+ let _ = output. send( Event :: MessageReceived ( Message :: User ( message) ) ) . await ;
47
+ }
48
+ Err ( _) => {
49
+ let _ = output. send( Event :: Disconnected ) . await ;
50
+ break ;
60
51
}
52
+ Ok ( _) => continue ,
61
53
}
54
+ }
62
55
63
- message = input. select_next_some( ) => {
64
- let result = websocket. send( tungstenite:: Message :: Text ( message. to_string( ) ) ) . await ;
56
+ message = input. select_next_some( ) => {
57
+ let result = websocket. send( tungstenite:: Message :: Text ( message. to_string( ) ) ) . await ;
65
58
66
- if result. is_err( ) {
67
- let _ = output. send( Event :: Disconnected ) . await ;
68
-
69
- state = State :: Disconnected ;
70
- }
59
+ if result. is_err( ) {
60
+ let _ = output. send( Event :: Disconnected ) . await ;
71
61
}
72
62
}
73
63
}
@@ -76,18 +66,6 @@ pub fn connect() -> impl Stream<Item = Event> {
76
66
} )
77
67
}
78
68
79
- #[ derive( Debug ) ]
80
- #[ allow( clippy:: large_enum_variant) ]
81
- enum State {
82
- Disconnected ,
83
- Connected (
84
- async_tungstenite:: WebSocketStream <
85
- async_tungstenite:: tokio:: ConnectStream ,
86
- > ,
87
- mpsc:: Receiver < Message > ,
88
- ) ,
89
- }
90
-
91
69
#[ derive( Debug , Clone ) ]
92
70
pub enum Event {
93
71
Connected ( Connection ) ,
0 commit comments