syncweb_core/node/
membership_hook.rs1use iroh::endpoint::{AfterHandshakeOutcome, Connection, EndpointHooks, VarInt};
2use std::collections::HashSet;
3use std::sync::Arc;
4use std::sync::RwLock;
5
6#[derive(Debug)]
7#[non_exhaustive]
8pub struct MembershipHook {
9 pub member_keys: Arc<RwLock<HashSet<iroh::PublicKey>>>,
10}
11
12impl EndpointHooks for MembershipHook {
13 async fn after_handshake<'a>(&'a self, conn: &'a Connection) -> AfterHandshakeOutcome {
14 let Ok(guard) = self.member_keys.read() else {
15 return AfterHandshakeOutcome::Accept;
16 };
17 if guard.is_empty() {
18 return AfterHandshakeOutcome::Accept;
19 }
20 let is_member = guard.contains(&conn.remote_id());
21 drop(guard);
22 if is_member {
23 AfterHandshakeOutcome::Accept
24 } else {
25 AfterHandshakeOutcome::Reject {
26 error_code: VarInt::from_u32(0),
27 reason: b"not a network member".to_vec(),
28 }
29 }
30 }
31}