feat: de-duplicate user update events sent to clients
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user