⎇ 758f61f52a35514669064a1aefd44f22f07a9e9c
crates/protocol/brahman-dht/src/lib.rs
History
Who touched what
raw
feat(brahman-dht): B3 — discovery typed sobre el Kademlia compartido
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}