use std::net::{Ipv4Addr, SocketAddr};
use std::path::Path;
use std::time::Duration;
use crate::dht::mutable::Mutable;
use crate::dht::tests::fake::{FakeNode, Mood};
use crate::dht::tests::{id, quick, router};
use crate::dht::{Config, Keypair};
use crate::rendezvous::call::Tuning;
use crate::rendezvous::item::Presence;
use crate::rendezvous::pairing::{self, Pairing, hex};
const SEED: [u8; 32] = [5u8; 32];
const SALT: [u8; 32] = [6u8; 32];
pub(crate) fn pairing() -> Pairing {
Pairing {
key: engine().public(),
salt: SALT,
}
}
pub(crate) fn engine() -> Keypair {
Keypair::from_seed(SEED).expect("a keypair")
}
pub(crate) fn carried(dir: &Path) {
std::fs::write(dir.join(pairing::KEY), hex(&pairing().key)).expect("the key");
std::fs::write(dir.join(pairing::SALT), hex(&SALT)).expect("the salt");
}
pub(crate) fn presence(port: u16, seq: i64) -> Mutable {
let p = pairing();
let sealed = Presence {
endpoints: vec![SocketAddr::new(Ipv4Addr::LOCALHOST.into(), port)],
}
.seal(&p.seal_key())
.expect("seal");
engine()
.sign(p.presence_salt(), seq, sealed)
.expect("signed")
}
pub(crate) struct Commons {
holder: FakeNode,
_door: FakeNode,
}
impl Commons {
pub(crate) fn held(&self) -> Vec<Mutable> {
self.holder.held()
}
}
pub(crate) fn commons(items: Vec<Mutable>) -> (Commons, Tuning) {
commons_as(Mood::Answer, items)
}
pub(crate) fn commons_as(mood: Mood, items: Vec<Mutable>) -> (Commons, Tuning) {
let mut holder = FakeNode::bind(id(0x42));
holder.serve(vec![], mood, items);
let door = router(vec![holder.node()]);
let tuning = tuned(vec![door.addr.to_string()]);
(
Commons {
holder,
_door: door,
},
tuning,
)
}
pub(crate) fn tuned(bootstrap: Vec<String>) -> Tuning {
Tuning {
config: Config { k: 8, ..quick() },
window: Duration::from_millis(800),
bootstrap,
}
}