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
use async_channel::Sender;
use std::collections::HashMap;
use std::net::SocketAddr;
use tdn_types::group::{Group, GroupId};
use tdn_types::message::{GroupSendMessage, SendMessage};
use tdn_types::primitive::PeerAddr;
#[derive(Default, Debug)]
pub struct PermissionlessGroup {
id: GroupId,
peers: HashMap<PeerAddr, SocketAddr>,
}
impl Group for PermissionlessGroup {
type JoinType = ();
type JoinResultType = ();
fn id(&self) -> &GroupId {
&self.id
}
}
impl PermissionlessGroup {
pub fn new() {}
pub fn add(&mut self, peer_id: PeerAddr, addr: SocketAddr) {
self.peers
.entry(peer_id)
.and_modify(|a| *a = addr)
.or_insert(addr);
}
pub fn join_bytes(&self) -> Vec<u8> {
vec![]
}
pub async fn join(
&mut self,
peer_addr: PeerAddr,
addr: SocketAddr,
_join_bytes: Vec<u8>,
return_sender: Sender<SendMessage>,
) {
let is_ok = !self.peers.contains_key(&peer_addr);
return_sender
.send(SendMessage::Group(GroupSendMessage::PeerJoinResult(
peer_addr,
is_ok,
false,
vec![],
)))
.await
.expect("Permissionless group to TDN channel closed");
if is_ok {
self.peers.insert(peer_addr, addr);
}
}
pub fn join_result(&mut self, peer_addr: PeerAddr, is_ok: bool, _join_result: Vec<u8>) {
if !is_ok {
self.peers.remove(&peer_addr);
}
}
pub fn leave(&mut self, peer_addr: &PeerAddr) {
self.peers.remove(&peer_addr);
}
}