use super::super::item::Presence as Published;
use super::super::say;
use super::Cycle;
use std::net::SocketAddr;
impl Cycle {
pub(super) fn publish(&mut self) -> Result<String, String> {
let observed = self.dht()?.observed();
let mut ips = self.advertise.clone();
for ip in observed.iter().map(SocketAddr::ip) {
if !ips.contains(&ip) {
ips.push(ip);
}
}
let seq = self.clock.unix().max(self.last_seq + 1);
let port = self.punch_port();
let endpoints: Vec<SocketAddr> = ips
.into_iter()
.map(|ip| SocketAddr::new(ip, port))
.collect();
let count = endpoints.len();
let sealed = Published { endpoints }.seal(&self.pairing.seal_key())?;
let item = self
.keypair
.sign(self.pairing.presence_salt(), seq, sealed)?;
let acks = self.dht()?.put(item)?;
self.last_seq = seq;
Ok(say::published(seq, count, acks))
}
}