This commit is contained in:
2026-08-09 20:07:00 +02:00
parent 20beea24d5
commit e6d6968e52
6 changed files with 125 additions and 81 deletions
+11 -27
View File
@@ -10,21 +10,21 @@ use axum::extract::ws::Message;
use event_bus::EventBus;
use events::GatewayEvent;
use parking_lot::RwLock;
use std::collections::{HashMap, HashSet};
use std::collections::HashMap;
use std::sync::Arc;
use tokio::sync::mpsc;
use tokio::task::JoinHandle;
use uuid::Uuid;
use crate::services::Services;
pub mod events;
pub mod handlers;
pub mod routes;
#[derive(Debug, Default)]
#[derive(Debug)]
pub struct GatewayManager {
// Chaque connexion est inscrite dans les groupes des canaux accessibles.
pub clients: RwLock<HashMap<ConnectionKey, GatewayClient>>,
channel_subscribers: RwLock<HashMap<Uuid, HashSet<ConnectionKey>>>,
services: Arc<Services>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
@@ -43,6 +43,9 @@ pub struct GatewayClient {
}
impl GatewayManager {
pub fn new(services: Arc<Services>) -> Self {
Self { clients: RwLock::new(HashMap::new()), services }
}
/// Démarre les routeurs centraux des événements de messages.
pub fn start(self: &Arc<Self>, event_bus: Arc<EventBus>) {
let manager = Arc::clone(self);
@@ -84,29 +87,15 @@ impl GatewayManager {
});
}
pub(crate) fn add_client(
&self,
gateway_client: GatewayClient,
channel_ids: impl IntoIterator<Item = Uuid>,
) {
pub(crate) fn add_client(&self, gateway_client: GatewayClient) {
let key = gateway_client.key();
self.clients.write().insert(key, gateway_client);
let mut subscribers = self.channel_subscribers.write();
for channel_id in channel_ids {
subscribers.entry(channel_id).or_default().insert(key);
}
}
pub(crate) fn remove_client(&self, gateway_client: &GatewayClient) {
let key = gateway_client.key();
self.clients.write().remove(&key);
let mut subscribers = self.channel_subscribers.write();
for channel_subscribers in subscribers.values_mut() {
channel_subscribers.remove(&key);
}
subscribers.retain(|_, values| !values.is_empty());
}
fn broadcast_message<T: serde::Serialize>(
@@ -124,15 +113,10 @@ impl GatewayManager {
return;
};
let keys = self
.channel_subscribers
.read()
.get(&channel_id)
.cloned()
.unwrap_or_default();
let users = self.services.realtime_registry.users_for_channel(channel_id);
let clients = self.clients.read();
for key in keys {
if let Some(client) = clients.get(&key) {
for (key, client) in clients.iter() {
if users.contains(&key.user_id) {
let _ = client.sender.send(Message::Text(json.clone().into()));
}
}