refactor: send messagelog to avoid gossip dedup

This commit is contained in:
Matthew Esposito 2025-04-20 09:37:25 -04:00
parent c13c38d785
commit 35da29be17
3 changed files with 16 additions and 17 deletions

View file

@ -12,3 +12,4 @@ pub mod settings;
pub mod subreddit;
pub mod user;
pub mod utils;
pub mod p2p_mon;

View file

@ -18,7 +18,7 @@ use once_cell::sync::Lazy;
use serde::{Deserialize, Serialize};
use tokio::{task, time::sleep};
use crate::config;
use crate::{config, p2p_mon::{Message, MessageLog}};
pub static DASHMAP: Lazy<DashMap<String, bool>> = Lazy::new(DashMap::new);
pub static ONLINE: Lazy<AtomicBool> = Lazy::new(AtomicBool::default);
@ -92,6 +92,7 @@ async fn subscribe_loop(mut receiver: GossipReceiver) {
break;
}
};
let message= message.message;
// Update dashmap with message's hostname and alive status
DASHMAP.insert(message.hostname.clone(), message.online);
}
@ -104,6 +105,8 @@ async fn sender_loop(sender: GossipSender, endpoint: Endpoint) {
hostname: config::get_setting("REDLIB_FULL_URL").unwrap_or_default(),
online: ONLINE.load(Ordering::SeqCst),
};
DASHMAP.insert(message.hostname.clone(), message.online);
let message: MessageLog = message.into();
let encoded_message = SignedMessage::sign_and_encode(endpoint.secret_key(), &message).unwrap();
let message_delivery = sender.broadcast(encoded_message).await;
println!("> sent message: {message:?}: {message_delivery:?}");
@ -152,15 +155,15 @@ struct SignedMessage {
}
impl SignedMessage {
pub fn verify_and_decode(bytes: &[u8]) -> anyhow::Result<(PublicKey, Message)> {
pub fn verify_and_decode(bytes: &[u8]) -> anyhow::Result<(PublicKey, MessageLog)> {
let signed_message: Self = postcard::from_bytes(bytes)?;
let key: PublicKey = signed_message.from;
key.verify(&signed_message.data, &signed_message.signature)?;
let message: Message = postcard::from_bytes(&signed_message.data)?;
let message: MessageLog = postcard::from_bytes(&signed_message.data)?;
Ok((signed_message.from, message))
}
pub fn sign_and_encode(secret_key: &SecretKey, message: &Message) -> anyhow::Result<Bytes> {
pub fn sign_and_encode(secret_key: &SecretKey, message: &MessageLog) -> anyhow::Result<Bytes> {
let data: Bytes = postcard::to_stdvec(&message)?.into();
let signature = secret_key.sign(&data);
let from: PublicKey = secret_key.public();
@ -170,11 +173,6 @@ impl SignedMessage {
}
}
#[derive(Debug, Serialize, Deserialize)]
struct Message {
hostname: String,
online: bool,
}
pub async fn map_json() -> Result<Response<Body>, String> {
let map = &*DASHMAP;

View file

@ -109,25 +109,25 @@ struct SignedMessage {
}
impl SignedMessage {
pub fn verify_and_decode(bytes: &[u8]) -> anyhow::Result<(PublicKey, Message)> {
pub fn verify_and_decode(bytes: &[u8]) -> anyhow::Result<(PublicKey, MessageLog)> {
let signed_message: Self = postcard::from_bytes(bytes)?;
let key: PublicKey = signed_message.from;
key.verify(&signed_message.data, &signed_message.signature)?;
let message: Message = postcard::from_bytes(&signed_message.data)?;
let message: MessageLog = postcard::from_bytes(&signed_message.data)?;
Ok((signed_message.from, message))
}
}
#[derive(Debug, Serialize, Deserialize)]
struct Message {
hostname: String,
online: bool,
pub struct Message {
pub hostname: String,
pub online: bool,
}
#[derive(Debug, Serialize, Deserialize)]
struct MessageLog {
timestamp: u64,
message: Message,
pub struct MessageLog {
pub timestamp: u64,
pub message: Message,
}
impl From<Message> for MessageLog {
fn from(message: Message) -> Self {