forked from CympleTech/TDN
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsimple.rs
78 lines (73 loc) · 2.64 KB
/
simple.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
use std::sync::Arc;
use tdn::prelude::*;
use tdn::types::rpc::{json, RpcError, RpcHandler, RpcParam};
struct State(u32);
#[tokio::main]
async fn main() {
let (peer_addr, send, mut out_recv) = start().await.unwrap();
println!("Example: peer id: {:?}", peer_addr);
let mut rpc_handler = RpcHandler::new(State(1));
rpc_handler.add_method(
"echo",
|params: Vec<RpcParam>, state: Arc<State>| async move {
let _value = params[0].as_str().ok_or(RpcError::ParseError)?;
assert_eq!(1, state.0);
Ok(HandleResult::rpc(json!(params)))
},
);
rpc_handler.add_method("say_hello", |_params, state: Arc<State>| async move {
assert_eq!(1, state.0);
Ok(HandleResult::rpc(json!("hello")))
});
while let Some(message) = out_recv.recv().await {
match message {
ReceiveMessage::Group(msg) => match msg {
RecvType::Connect(peer, _data) => {
println!("receive group peer {} join", peer.id.short_show());
}
RecvType::Result(..) => {
//
}
RecvType::Leave(peer) => {
println!("receive group peer {} leave", peer.id.short_show());
}
RecvType::Event(peer_id, _data) => {
println!("receive group event from {}", peer_id.short_show());
}
_ => {}
},
ReceiveMessage::Layer(fgid, _tgid, msg) => match msg {
RecvType::Connect(peer, _data) => {
println!("Layer Join: {}, Addr: {}.", fgid, peer.id.short_show());
}
RecvType::Result(..) => {
//
}
_ => {}
},
ReceiveMessage::Rpc(uid, params, is_ws) => {
if let Ok(HandleResult {
mut rpcs,
groups: _,
layers: _,
networks: _,
}) = rpc_handler.handle(params).await
{
loop {
if rpcs.len() != 0 {
let msg = rpcs.remove(0);
send.send(SendMessage::Rpc(uid, msg, is_ws))
.await
.expect("TDN channel closed");
} else {
break;
}
}
}
}
ReceiveMessage::NetworkLost => {
println!("No network connections");
}
}
}
}