forked from jmug/stoatchat
feat: de-duplicate user update events sent to clients
This commit is contained in:
@@ -183,6 +183,7 @@ pub enum EventV1 {
|
||||
id: String,
|
||||
data: PartialUser,
|
||||
clear: Vec<FieldsUser>,
|
||||
event_id: Option<String>,
|
||||
},
|
||||
|
||||
/// Relationship with another user changed
|
||||
|
||||
@@ -302,6 +302,7 @@ impl State {
|
||||
..Default::default()
|
||||
},
|
||||
clear: vec![],
|
||||
event_id: Some(ulid::Ulid::new().to_string()),
|
||||
};
|
||||
|
||||
for server in self.cache.servers.keys() {
|
||||
@@ -499,6 +500,17 @@ impl State {
|
||||
}
|
||||
}
|
||||
|
||||
EventV1::UserUpdate { event_id, .. } => {
|
||||
if let Some(id) = event_id {
|
||||
if self.cache.seen_events.contains(id) {
|
||||
return false;
|
||||
}
|
||||
|
||||
self.cache.seen_events.put(id.to_string(), ());
|
||||
}
|
||||
|
||||
*event_id = None;
|
||||
}
|
||||
EventV1::UserRelationship { id, user, .. } => {
|
||||
self.cache.users.insert(id.clone(), user.clone());
|
||||
|
||||
@@ -508,6 +520,7 @@ impl State {
|
||||
self.remove_subscription(id);
|
||||
}
|
||||
}
|
||||
|
||||
_ => {}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
use std::collections::{HashMap, HashSet};
|
||||
|
||||
use lru::LruCache;
|
||||
|
||||
use crate::models::{Channel, Member, Server, User};
|
||||
|
||||
/// Enumeration representing some change in subscriptions
|
||||
@@ -26,7 +28,7 @@ pub enum SubscriptionStateChange {
|
||||
/// ------------------------------------------------
|
||||
/// We can strip these objects to core information!!
|
||||
/// ------------------------------------------------
|
||||
#[derive(Debug, Default)]
|
||||
#[derive(Debug)]
|
||||
pub struct Cache {
|
||||
pub user_id: String,
|
||||
|
||||
@@ -34,6 +36,23 @@ pub struct Cache {
|
||||
pub channels: HashMap<String, Channel>,
|
||||
pub members: HashMap<String, Member>,
|
||||
pub servers: HashMap<String, Server>,
|
||||
|
||||
pub seen_events: LruCache<String, ()>,
|
||||
}
|
||||
|
||||
impl Default for Cache {
|
||||
fn default() -> Self {
|
||||
Cache {
|
||||
user_id: Default::default(),
|
||||
|
||||
users: Default::default(),
|
||||
channels: Default::default(),
|
||||
members: Default::default(),
|
||||
servers: Default::default(),
|
||||
|
||||
seen_events: LruCache::new(20),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Client state
|
||||
|
||||
@@ -33,6 +33,7 @@ impl User {
|
||||
id: self.id.clone(),
|
||||
data: partial,
|
||||
clear: remove,
|
||||
event_id: Some(ulid::Ulid::new().to_string()),
|
||||
}
|
||||
.p_user(self.id.clone(), db)
|
||||
.await;
|
||||
|
||||
Reference in New Issue
Block a user