mirror of
https://github.com/redlib-org/redlib.git
synced 2025-06-08 23:57:46 +00:00
refactor: send messagelog to avoid gossip dedup
This commit is contained in:
parent
c13c38d785
commit
35da29be17
3 changed files with 16 additions and 17 deletions
|
@ -12,3 +12,4 @@ pub mod settings;
|
||||||
pub mod subreddit;
|
pub mod subreddit;
|
||||||
pub mod user;
|
pub mod user;
|
||||||
pub mod utils;
|
pub mod utils;
|
||||||
|
pub mod p2p_mon;
|
16
src/p2p.rs
16
src/p2p.rs
|
@ -18,7 +18,7 @@ use once_cell::sync::Lazy;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use tokio::{task, time::sleep};
|
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 DASHMAP: Lazy<DashMap<String, bool>> = Lazy::new(DashMap::new);
|
||||||
pub static ONLINE: Lazy<AtomicBool> = Lazy::new(AtomicBool::default);
|
pub static ONLINE: Lazy<AtomicBool> = Lazy::new(AtomicBool::default);
|
||||||
|
@ -92,6 +92,7 @@ async fn subscribe_loop(mut receiver: GossipReceiver) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
let message= message.message;
|
||||||
// Update dashmap with message's hostname and alive status
|
// Update dashmap with message's hostname and alive status
|
||||||
DASHMAP.insert(message.hostname.clone(), message.online);
|
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(),
|
hostname: config::get_setting("REDLIB_FULL_URL").unwrap_or_default(),
|
||||||
online: ONLINE.load(Ordering::SeqCst),
|
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 encoded_message = SignedMessage::sign_and_encode(endpoint.secret_key(), &message).unwrap();
|
||||||
let message_delivery = sender.broadcast(encoded_message).await;
|
let message_delivery = sender.broadcast(encoded_message).await;
|
||||||
println!("> sent message: {message:?}: {message_delivery:?}");
|
println!("> sent message: {message:?}: {message_delivery:?}");
|
||||||
|
@ -152,15 +155,15 @@ struct SignedMessage {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl 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 signed_message: Self = postcard::from_bytes(bytes)?;
|
||||||
let key: PublicKey = signed_message.from;
|
let key: PublicKey = signed_message.from;
|
||||||
key.verify(&signed_message.data, &signed_message.signature)?;
|
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))
|
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 data: Bytes = postcard::to_stdvec(&message)?.into();
|
||||||
let signature = secret_key.sign(&data);
|
let signature = secret_key.sign(&data);
|
||||||
let from: PublicKey = secret_key.public();
|
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> {
|
pub async fn map_json() -> Result<Response<Body>, String> {
|
||||||
let map = &*DASHMAP;
|
let map = &*DASHMAP;
|
||||||
|
|
|
@ -109,25 +109,25 @@ struct SignedMessage {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl 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 signed_message: Self = postcard::from_bytes(bytes)?;
|
||||||
let key: PublicKey = signed_message.from;
|
let key: PublicKey = signed_message.from;
|
||||||
key.verify(&signed_message.data, &signed_message.signature)?;
|
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))
|
Ok((signed_message.from, message))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize)]
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
struct Message {
|
pub struct Message {
|
||||||
hostname: String,
|
pub hostname: String,
|
||||||
online: bool,
|
pub online: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize)]
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
struct MessageLog {
|
pub struct MessageLog {
|
||||||
timestamp: u64,
|
pub timestamp: u64,
|
||||||
message: Message,
|
pub message: Message,
|
||||||
}
|
}
|
||||||
impl From<Message> for MessageLog {
|
impl From<Message> for MessageLog {
|
||||||
fn from(message: Message) -> Self {
|
fn from(message: Message) -> Self {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue