Skip to main content

syncweb_core/node/
membership_hook.rs

1use 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}