gioser

tawasuyu/brahman

Rust 326TOML 123JSON 17Markdown 144606 Definitions

⎇ 758f61f52a35514669064a1aefd44f22f07a9e9c crates/protocol/brahman-dht/src/lib.rs Rust · 72 lines · 2.2 KB History Who touched what raw

feat(brahman-dht): B3 — discovery typed sobre el Kademlia compartido 27603c906 · sergio ·

1//! `brahman-dht` — capa de discovery typed sobre el Kademlia compartido.
2//!
3//! `brahman-net` corre un único Kademlia para todo el ecosistema. Este
4//! crate le pone arriba un esquema de claves namespaced ([`DhtKey`]):
5//! `minga` publica bloques de código, `brahman-card-discovery` publica
6//! Cards, `agorapura` publica Personas — todo sobre la misma malla sin
7//! colisión, porque cada clave lleva un byte de `kind`.
8//!
9//! El modelo es de **provider records**: un nodo `announce`-a que provee
10//! una clave; otros `find`-an quién la provee y abren un stream directo.
11
12#![forbid(unsafe_code)]
13
14pub mod key;
15
16pub use key::{DhtKey, RecordKind, DHT_KEY_LEN};
17
18use brahman_net::BrahmanNet;
19use libp2p::PeerId;
20use std::sync::Arc;
21
22/// Discovery typed sobre `brahman-net`.
23#[derive(Clone)]
24pub struct Dht {
25    net: Arc<BrahmanNet>,
26}
27
28impl Dht {
29    /// Crea la capa DHT sobre un nodo `brahman-net` ya inicializado.
30    pub fn new(net: Arc<BrahmanNet>) -> Self {
31        Self { net }
32    }
33
34    /// Anuncia que este nodo provee `key`. El registro de provider se
35    /// renueva solo mientras el nodo siga vivo en la malla.
36    pub fn announce(&self, key: &DhtKey) {
37        self.net.start_providing(&key.to_bytes());
38    }
39
40    /// Retira el anuncio de `key`.
41    pub fn withdraw(&self, key: &DhtKey) {
42        self.net.stop_providing(&key.to_bytes());
43    }
44
45    /// Busca los peers que proveen `key`.
46    pub async fn find(&self, key: &DhtKey) -> Vec<PeerId> {
47        self.net.find_providers(&key.to_bytes()).await
48    }
49
50    /// El nodo `brahman-net` subyacente (para abrir streams a un provider).
51    pub fn net(&self) -> &Arc<BrahmanNet> {
52        &self.net
53    }
54}
55
56#[cfg(test)]
57mod tests {
58    use super::*;
59
60    #[tokio::test]
61    async fn announce_find_withdraw_on_a_live_node() {
62        // Smoke: un nodo solo. `find` de una clave que nadie provee
63        // devuelve vacío; announce/withdraw no panickean.
64        let net = Arc::new(BrahmanNet::new().expect("nodo libp2p"));
65        let dht = Dht::new(net);
66        let key = DhtKey::card("modulo-inexistente");
67        dht.announce(&key);
68        dht.withdraw(&key);
69        let found = dht.find(&DhtKey::card("nadie-lo-provee")).await;
70        assert!(found.is_empty());
71    }
72}