Nats + Redis PubSub cluster updates replacing Gossip protocol

This commit is contained in:
mdecimus
2025-05-14 19:43:47 +02:00
parent 7ec5701af8
commit 839b7189fa
65 changed files with 1807 additions and 1350 deletions

View File

@@ -116,11 +116,11 @@ impl EventSourceHandler for Server {
loop {
match tokio::time::timeout(timeout, change_rx.recv()).await {
Ok(Some(state_change)) => {
for (type_state, change_id) in state_change.types {
for type_state in state_change.types {
response
.changed
.get_mut_or_insert(state_change.account_id.into())
.set(type_state, change_id.into());
.set(type_state, state_change.change_id.into());
}
}
Ok(None) => {

View File

@@ -1040,10 +1040,10 @@ impl EmailSet for Server {
if response.updated.is_empty() && response.destroyed.is_empty() {
// Message ingest does not broadcast state changes
self.broadcast_state_change(
StateChange::new(account_id)
.with_change(DataType::Email, change_id)
.with_change(DataType::Mailbox, change_id)
.with_change(DataType::Thread, change_id),
StateChange::new(account_id, change_id)
.with_change(DataType::Email)
.with_change(DataType::Mailbox)
.with_change(DataType::Thread),
)
.await;
}

View File

@@ -178,18 +178,15 @@ impl WebSocketHandler for Server {
}
state_change = change_rx.recv() => {
if let Some(state_change) = state_change {
if !change_types.is_empty() && state_change
.types
.iter()
.any(|(t, _)| change_types.contains(*t))
{
for (type_state, change_id) in state_change.types {
changes
.changed
.get_mut_or_insert(state_change.account_id.into())
.set(type_state, change_id.into());
}
}
let mut types = state_change.types;
types.intersection(&change_types);
for type_state in types {
changes
.changed
.get_mut_or_insert(state_change.account_id.into())
.set(type_state, state_change.change_id.into());
}
} else {
trc::event!(
Jmap(JmapEvent::WebsocketStop),