Skip to content

Commit 73d2ae5

Browse files
authored
Merge pull request #1 from calcit-lang/arc-ffi
use Arc to fix callback type issue
2 parents 2c85b65 + fbef345 commit 73d2ae5

File tree

1 file changed

+16
-8
lines changed

1 file changed

+16
-8
lines changed

src/lib.rs

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,37 @@
11
use cirru_edn::Edn;
22
use std::net::TcpListener;
3-
// use std::thread::spawn;
3+
use std::sync::Arc;
4+
use std::thread::spawn;
45
use tungstenite::accept;
56

67
#[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> {
812
println!("args: {:?}", args);
913
let server = TcpListener::bind("127.0.0.1:9001").unwrap();
14+
15+
// let h1 = Arc::new(handler);
16+
1017
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 {
1423
let msg = websocket.read_message().unwrap();
1524

1625
// We do not want to send back ping/pong messages.
1726
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()));
1928

2029
websocket
2130
.write_message(tungstenite::Message::from(format!("{}", result)))
2231
.unwrap();
2332
}
2433
}
25-
// })
26-
;
34+
});
2735
}
2836

2937
Ok(Edn::Nil)

0 commit comments

Comments
 (0)