diff --git a/Cargo.lock b/Cargo.lock index 402777f..56fb407 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1151,9 +1151,9 @@ dependencies = [ [[package]] name = "moka" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dc65d4615c08c8a13d91fd404b5a2a4485ba35b4091e3315cf8798d280c2f29" +checksum = "d8017ec3548ffe7d4cef7ac0e12b044c01164a74c0f3119420faeaf13490ad8b" dependencies = [ "async-lock", "async-trait", @@ -1606,9 +1606,9 @@ checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" [[package]] name = "reqwest" -version = "0.11.20" +version = "0.11.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e9ad3fe7488d7e34558a2033d45a0c90b72d97b4f80705666fea71472e2e6a1" +checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b" dependencies = [ "base64", "bytes", @@ -1631,6 +1631,7 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", + "system-configuration", "tokio", "tokio-native-tls", "tower-service", @@ -2254,6 +2255,27 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "tagptr" version = "0.2.0" diff --git a/Cargo.toml b/Cargo.toml index 0d10b62..c001714 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,6 +9,9 @@ homepage = "https://github.com/edg-l/teeobserver" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[profile.release] +lto = "fat" + [profile.dev.package.sqlx-macros] opt-level = 3 diff --git a/README.md b/README.md index 097eade..34064bf 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,7 @@ Useful typescript interfaces: // Event structure send to the websocket export interface MasterEvent { + observers: number event: Event time: string } diff --git a/src/routes.rs b/src/routes.rs index 3513924..3f7b356 100644 --- a/src/routes.rs +++ b/src/routes.rs @@ -9,8 +9,8 @@ use axum::{ TypedHeader, }; use serde_json::json; -use time::{OffsetDateTime, format_description}; -use tokio::sync::broadcast; +use time::{format_description, OffsetDateTime}; +use tokio::sync::broadcast::{self, Sender}; use tracing::{error, info}; use crate::{structures::MasterEvent, AppState}; @@ -34,7 +34,7 @@ pub async fn ws_handler( ws.on_failed_upgrade(|error| { error!("error upgrading connection: {error}"); }) - .on_upgrade(move |socket| handle_socket(socket, addr, rx)) + .on_upgrade(move |socket| handle_socket(socket, addr, rx, state.events_sender)) } /// Actual websocket statemachine (one will be spawned per connection) @@ -42,6 +42,7 @@ async fn handle_socket( mut socket: WebSocket, who: SocketAddr, mut events_rx: broadcast::Receiver>, + events_tx: Arc>>, ) { loop { tokio::select! { @@ -57,7 +58,7 @@ async fn handle_socket( } }, Ok(event) = events_rx.recv() => { - if let Err(e) = handle_event(&mut socket, event).await { + if let Err(e) = handle_event(&mut socket, &events_tx, event).await { error!("error sending event: {e}"); } } @@ -67,9 +68,11 @@ async fn handle_socket( async fn handle_event( sock: &mut WebSocket, + sender: &Sender>, event: Arc<(MasterEvent, OffsetDateTime)>, ) -> Result<(), axum::Error> { let payload = json!({ + "observers": sender.receiver_count(), "time": event.1.format(&format_description::well_known::Iso8601::DEFAULT).unwrap(), "event": event.0 });