This commit is contained in:
Mateusz Gruszczyński committed 2026-10-10 20:56:36 +02:00
1 parent f213d853e2
commit 76b8bb7ee2
78 files changed
+7750 -5204

No files matched your search

+20 -6
View File
@@ -294,7 +294,21 @@ async fn audit(State(state): State<Arc<App>>) -> Result<Json<Value>, ApiError> {
async fn metrics(State(state): State<Arc<App>>) -> Response {
crate::prometheus::response(&state)
}
async fn events(State(state): State<Arc<App>>, headers: HeaderMap) -> Result<Response, ApiError> {
#[derive(Default, Deserialize)]
#[serde(default, deny_unknown_fields)]
struct EventsQuery {
interval: Option<u64>,
}
async fn events(
State(state): State<Arc<App>>,
headers: HeaderMap,
Query(query): Query<EventsQuery>,
) -> Result<Response, ApiError> {
let interval = query.interval.unwrap_or(2);
if ![1, 2, 5, 10].contains(&interval) {
return Err(ApiError(StatusCode::UNPROCESSABLE_ENTITY, "invalid SSE interval".into()));
}
let secret = auth::cookie_secret(&headers)
.ok_or_else(|| ApiError(StatusCode::UNAUTHORIZED, "auth.required".into()))?;
let permit = state
@@ -310,10 +324,10 @@ async fn events(State(state): State<Arc<App>>, headers: HeaderMap) -> Result<Res
// One bounded snapshot, produced only when the consumer polls. No per-client queue.
// Absolute expiry/revocation is rechecked on every snapshot; no immortal SSE sessions.
let stream = futures_util::stream::unfold(
(state, secret, permit, false),
|(state, secret, permit, delayed)| async move {
(state, secret, permit, false, interval),
|(state, secret, permit, delayed, interval)| async move {
if delayed {
tokio::time::sleep(Duration::from_secs(2)).await;
tokio::time::sleep(Duration::from_secs(interval)).await;
}
let session_seconds = state
.config
@@ -331,11 +345,11 @@ async fn events(State(state): State<Arc<App>>, headers: HeaderMap) -> Result<Res
_ => return None,
}
let payload =
json!({"status":status_payload(&state), "logs":logs_payload(&state)}).to_string();
json!({"status":live_status_payload(&state), "logs":logs_payload(&state)}).to_string();
let event = Event::default().event("snapshot").data(payload);
Some((
Ok::<Event, Infallible>(event),
(state, secret, permit, true),
(state, secret, permit, true, interval),
))
},
);