This commit is contained in:
2026-01-05 17:59:22 +01:00
parent 5ada657ce7
commit df1cdc0303
2 changed files with 34 additions and 12 deletions

View File

@@ -20,7 +20,7 @@ pub struct Client {
} }
impl Client { impl Client {
pub fn new( fn new(
user_id: uuid::Uuid, user_id: uuid::Uuid,
connection_id: uuid::Uuid, connection_id: uuid::Uuid,
app_state: AppState, app_state: AppState,
@@ -36,6 +36,26 @@ impl Client {
} }
} }
pub async fn connect(
user_id: uuid::Uuid,
connection_id: uuid::Uuid,
app_state: AppState,
sender: mpsc::Sender<Message>
) -> Option<Self> {
// todo : vérifications ...
let client = Self::new(user_id, connection_id, app_state, sender);
Some(client)
}
pub async fn on_connect(&self) {
}
pub async fn on_disconnect(&self) {
self.clear_tasks().await;
}
pub async fn send(&self, message: Message) { pub async fn send(&self, message: Message) {
let _ = self.sender.send(message).await; let _ = self.sender.send(message).await;
} }
@@ -46,10 +66,6 @@ impl Client {
} }
} }
pub async fn on_disconnect(&self) {
self.clear_tasks().await;
}
pub async fn add_task(&self, name: &str, task: JoinHandle<()>) { pub async fn add_task(&self, name: &str, task: JoinHandle<()>) {
self.tasks.lock().insert(name.to_string(), task); self.tasks.lock().insert(name.to_string(), task);
} }

View File

@@ -21,15 +21,14 @@ async fn ws_handler(
ws: WebSocketUpgrade, ws: WebSocketUpgrade,
State(app_state): State<AppState> State(app_state): State<AppState>
) -> impl IntoResponse { ) -> impl IntoResponse {
// todo : récupérer le vrai id de l'utilisateur // todo --- 1. VÉRIFICATION AVANT UPGRADE ---
println!("Nouvelle connexion WebSocket !"); // C'est ici qu'on vérifierait le JWT par exemple.
// Si ça échoue, on peut retourner une erreur HTTP direct.
let user_id = Uuid::new_v4(); let user_id = Uuid::new_v4();
ws.on_upgrade(move |socket| handle_socket(socket, user_id, app_state)) ws.on_upgrade(move |socket| handle_socket(socket, user_id, app_state))
} }
async fn handle_socket(socket: WebSocket, user_id: Uuid, app_state: AppState) { async fn handle_socket(socket: WebSocket, user_id: Uuid, app_state: AppState) {
println!("1Nouvelle session pour le client {}", user_id);
// .split() sépare la lecture de l'écriture
let (mut ws_sender, mut ws_receiver) = socket.split(); let (mut ws_sender, mut ws_receiver) = socket.split();
let (tx, mut rx) = mpsc::channel::<Message>(100); let (tx, mut rx) = mpsc::channel::<Message>(100);
@@ -37,11 +36,20 @@ async fn handle_socket(socket: WebSocket, user_id: Uuid, app_state: AppState) {
let connection_id = Uuid::new_v4(); let connection_id = Uuid::new_v4();
// 1. Création de l'instance Client (ton objet intelligent) // 1. Création de l'instance Client (ton objet intelligent)
let client = Client::new(user_id, connection_id, app_state.clone(), tx); let client = match Client::connect(user_id, connection_id, app_state.clone(), tx).await {
Some(c) => c,
None => {
// Si refusé, on ferme la socket proprement
println!("Connexion refusée par le Hub pour {}", user_id);
return;
}
};
// 2. Enregistrement dans le Hub global pour être visible des autres // 2. Enregistrement dans le Hub global pour être visible des autres
app_state.clients.add_client(client.clone()); app_state.clients.add_client(client.clone());
client.on_connect().await;
// 3. Tâche d'ENVOI : On écoute la boîte aux lettres et on pousse vers le navigateur // 3. Tâche d'ENVOI : On écoute la boîte aux lettres et on pousse vers le navigateur
let mut send_task = tokio::spawn(async move { let mut send_task = tokio::spawn(async move {
while let Some(msg) = rx.recv().await { while let Some(msg) = rx.recv().await {
@@ -63,8 +71,6 @@ async fn handle_socket(socket: WebSocket, user_id: Uuid, app_state: AppState) {
} }
}); });
println!("2Nouvelle session pour le client {}", connection_id);
// 5. Attente de la fin de session (Bloque ici jusqu'à la déco) // 5. Attente de la fin de session (Bloque ici jusqu'à la déco)
tokio::select! { tokio::select! {
_ = (&mut send_task) => (), _ = (&mut send_task) => (),