feat: de-duplicate user update events sent to clients

This commit is contained in:
Paul Makles
2023-05-21 16:22:42 +01:00
parent d81d08f1ce
commit 3ef549537e
4 changed files with 35 additions and 1 deletions

View File

@@ -183,6 +183,7 @@ pub enum EventV1 {
id: String, id: String,
data: PartialUser, data: PartialUser,
clear: Vec<FieldsUser>, clear: Vec<FieldsUser>,
event_id: Option<String>,
}, },
/// Relationship with another user changed /// Relationship with another user changed

View File

@@ -302,6 +302,7 @@ impl State {
..Default::default() ..Default::default()
}, },
clear: vec![], clear: vec![],
event_id: Some(ulid::Ulid::new().to_string()),
}; };
for server in self.cache.servers.keys() { 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, .. } => { EventV1::UserRelationship { id, user, .. } => {
self.cache.users.insert(id.clone(), user.clone()); self.cache.users.insert(id.clone(), user.clone());
@@ -508,6 +520,7 @@ impl State {
self.remove_subscription(id); self.remove_subscription(id);
} }
} }
_ => {} _ => {}
} }

View File

@@ -1,5 +1,7 @@
use std::collections::{HashMap, HashSet}; use std::collections::{HashMap, HashSet};
use lru::LruCache;
use crate::models::{Channel, Member, Server, User}; use crate::models::{Channel, Member, Server, User};
/// Enumeration representing some change in subscriptions /// Enumeration representing some change in subscriptions
@@ -26,7 +28,7 @@ pub enum SubscriptionStateChange {
/// ------------------------------------------------ /// ------------------------------------------------
/// We can strip these objects to core information!! /// We can strip these objects to core information!!
/// ------------------------------------------------ /// ------------------------------------------------
#[derive(Debug, Default)] #[derive(Debug)]
pub struct Cache { pub struct Cache {
pub user_id: String, pub user_id: String,
@@ -34,6 +36,23 @@ pub struct Cache {
pub channels: HashMap<String, Channel>, pub channels: HashMap<String, Channel>,
pub members: HashMap<String, Member>, pub members: HashMap<String, Member>,
pub servers: HashMap<String, Server>, 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 /// Client state

View File

@@ -33,6 +33,7 @@ impl User {
id: self.id.clone(), id: self.id.clone(),
data: partial, data: partial,
clear: remove, clear: remove,
event_id: Some(ulid::Ulid::new().to_string()),
} }
.p_user(self.id.clone(), db) .p_user(self.id.clone(), db)
.await; .await;