From 71c5bfd1f82dbd6e6c6698f382789defc3a1aad4 Mon Sep 17 00:00:00 2001 From: xeovalyte Date: Sun, 7 Apr 2024 13:58:15 +0200 Subject: [PATCH] Migrated to global websocket state --- application/src/main.rs | 20 ++------------------ application/src/pages/add_participant.rs | 4 ++++ application/src/pages/index.rs | 2 -- application/src/util/websocket/server.rs | 24 +++++++++++++----------- 4 files changed, 19 insertions(+), 31 deletions(-) diff --git a/application/src/main.rs b/application/src/main.rs index 1c8e0cc..abad6ce 100644 --- a/application/src/main.rs +++ b/application/src/main.rs @@ -1,5 +1,3 @@ -use application::util::websocket::{server::AppState, server::WebSocketState}; - #[cfg(feature = "ssr")] #[tokio::main] async fn main() { @@ -8,9 +6,6 @@ async fn main() { use axum::{routing::get, Router}; use leptos::*; use leptos_axum::{generate_route_list, LeptosRoutes}; - use std::collections::HashSet; - use std::sync::Arc; - use tokio::sync::{broadcast, Mutex}; application::util::surrealdb::connect() .await @@ -26,23 +21,12 @@ async fn main() { let addr = leptos_options.site_addr; let routes = generate_route_list(App); - let client_set = Arc::new(Mutex::new(HashSet::::new())); - let (tx, _rx) = broadcast::channel(100); - - let websocket_state = WebSocketState { client_set, tx }; - - let app_state = AppState { - websocket_state: websocket_state.into(), - routes: routes.clone(), - leptos_options, - }; - // build our application with a route let app = Router::new() .route("/ws", get(server::websocket_handler)) - .leptos_routes(&app_state, routes, App) + .leptos_routes(&leptos_options, routes, App) .fallback(file_and_error_handler) - .with_state(app_state); + .with_state(leptos_options); let listener = tokio::net::TcpListener::bind(&addr).await.unwrap(); logging::log!("listening on http://{}", &addr); diff --git a/application/src/pages/add_participant.rs b/application/src/pages/add_participant.rs index 5fc28b4..8e25cb6 100644 --- a/application/src/pages/add_participant.rs +++ b/application/src/pages/add_participant.rs @@ -11,6 +11,10 @@ cfg_if::cfg_if! { #[server(AddParticipant)] async fn add_participant(name: String, group: String) -> Result<(), ServerFnError> { + let websocket_sate = &server::WEBSOCKET_STATE; + + websocket_sate.tx.send("BOE".to_string()).unwrap(); + let created: Vec = DB .create("participant") .content(schemas::NewParticipant { name, group }) diff --git a/application/src/pages/index.rs b/application/src/pages/index.rs index 029f757..e68c818 100644 --- a/application/src/pages/index.rs +++ b/application/src/pages/index.rs @@ -1,8 +1,6 @@ use leptos::*; use leptos_router::*; -use crate::util::surrealdb::schemas; - /// Renders the home page of your application. #[component] pub fn HomePage() -> impl IntoView { diff --git a/application/src/util/websocket/server.rs b/application/src/util/websocket/server.rs index 15a9a61..de359c6 100644 --- a/application/src/util/websocket/server.rs +++ b/application/src/util/websocket/server.rs @@ -1,17 +1,22 @@ use axum::{ - extract::{ - ws::{Message, WebSocket, WebSocketUpgrade}, - State, - }, + extract::ws::{Message, WebSocket, WebSocketUpgrade}, response::IntoResponse, }; use futures::{sink::SinkExt, stream::StreamExt}; use leptos::LeptosOptions; use leptos_router::RouteListing; +use once_cell::sync::Lazy; use tokio::sync::{broadcast, Mutex}; use std::{collections::HashSet, sync::Arc}; +pub static WEBSOCKET_STATE: Lazy = Lazy::new(|| { + let client_set = Arc::new(Mutex::new(HashSet::::new())); + let (tx, _rx) = broadcast::channel(100); + + WebSocketState { client_set, tx } +}); + #[derive(Clone)] pub struct WebSocketState { pub client_set: Arc>>, @@ -25,15 +30,12 @@ pub struct AppState { pub routes: Vec, } -pub async fn websocket_handler( - ws: WebSocketUpgrade, - State(state): State, -) -> impl IntoResponse { - ws.on_upgrade(|socket| websocket(socket, Arc::new(state))) +pub async fn websocket_handler(ws: WebSocketUpgrade) -> impl IntoResponse { + ws.on_upgrade(|socket| websocket(socket)) } -async fn websocket(stream: WebSocket, state: Arc) { - let state = &state.websocket_state; +async fn websocket(stream: WebSocket) { + let state = &WEBSOCKET_STATE; let (mut sender, mut receiver) = stream.split();