File tree Expand file tree Collapse file tree 1 file changed +16
-8
lines changed Expand file tree Collapse file tree 1 file changed +16
-8
lines changed Original file line number Diff line number Diff line change 1
1
use cirru_edn:: Edn ;
2
2
use std:: net:: TcpListener ;
3
- // use std::thread::spawn;
3
+ use std:: sync:: Arc ;
4
+ use std:: thread:: spawn;
4
5
use tungstenite:: accept;
5
6
6
7
#[ no_mangle]
7
- pub fn serve_wss ( args : Vec < Edn > , handler : Box < dyn Fn ( Edn ) -> Edn > ) -> Result < Edn , String > {
8
+ pub fn serve_wss (
9
+ args : Vec < Edn > ,
10
+ handler : Arc < dyn Fn ( Edn ) -> Edn + Send + Sync + ' static > ,
11
+ ) -> Result < Edn , String > {
8
12
println ! ( "args: {:?}" , args) ;
9
13
let server = TcpListener :: bind ( "127.0.0.1:9001" ) . unwrap ( ) ;
14
+
15
+ // let h1 = Arc::new(handler);
16
+
10
17
for stream in server. incoming ( ) {
11
- // spawn(move || {
12
- let mut websocket = accept ( stream. unwrap ( ) ) . unwrap ( ) ;
13
- loop {
18
+ let h_clone = Arc :: clone ( & handler) ;
19
+
20
+ spawn ( move || {
21
+ let mut websocket = accept ( stream. unwrap ( ) ) . unwrap ( ) ;
22
+ loop {
14
23
let msg = websocket. read_message ( ) . unwrap ( ) ;
15
24
16
25
// We do not want to send back ping/pong messages.
17
26
if msg. is_binary ( ) || msg. is_text ( ) {
18
- let result = handler ( Edn :: Str ( msg. into_text ( ) . unwrap ( ) . to_string ( ) ) ) ;
27
+ let result = h_clone ( Edn :: Str ( msg. into_text ( ) . unwrap ( ) . to_string ( ) ) ) ;
19
28
20
29
websocket
21
30
. write_message ( tungstenite:: Message :: from ( format ! ( "{}" , result) ) )
22
31
. unwrap ( ) ;
23
32
}
24
33
}
25
- // })
26
- ;
34
+ } ) ;
27
35
}
28
36
29
37
Ok ( Edn :: Nil )
You can’t perform that action at this time.
0 commit comments