From a6a4b846b34b9829b6ed6ead15f13ea00f73c03d Mon Sep 17 00:00:00 2001 From: tv Date: Mon, 2 Nov 2026 21:37:48 +0100 Subject: api: /stream & dashboard send X-Accel-Buffering --- src/api/dashboard/mod.rs | 6 +++++- src/api/mod.rs | 7 +++++++ src/api/store.rs | 5 +++++ 3 files changed, 17 insertions(+), 1 deletion(-) (limited to 'src/api') diff --git a/src/api/dashboard/mod.rs b/src/api/dashboard/mod.rs index 2557906..db7efa3 100644 --- a/src/api/dashboard/mod.rs +++ b/src/api/dashboard/mod.rs @@ -619,7 +619,11 @@ async fn events(Extension(hub): Extension>) -> impl IntoResponse { } } }; - Sse::new(stream).keep_alive(KeepAlive::default()) + ( + // Through nginx too as it comes, not buffered (`operations.md`). + [(super::UNBUFFERED.0, super::UNBUFFERED.1)], + Sse::new(stream).keep_alive(KeepAlive::default()), + ) } /// The node stops: the client may reconnect once it is back. diff --git a/src/api/mod.rs b/src/api/mod.rs index 9bb2bed..9bda84a 100644 --- a/src/api/mod.rs +++ b/src/api/mod.rs @@ -110,6 +110,13 @@ pub(crate) fn relay_only_router( .with_state(relay) } +/// On a response that streams: a reverse proxy passes it on as it comes, not once it +/// has buffered enough (nginx's `X-Accel-Buffering`). +pub(crate) const UNBUFFERED: (axum::http::HeaderName, &str) = ( + axum::http::HeaderName::from_static("x-accel-buffering"), + "no", +); + /// An error answer: `{"error": message}` with `details`' fields added (`docs/openapi.yaml`, /// `Error`). pub(crate) fn error_response( diff --git a/src/api/store.rs b/src/api/store.rs index 2b21c83..eac3262 100644 --- a/src/api/store.rs +++ b/src/api/store.rs @@ -923,6 +923,11 @@ async fn stream(state: AppState, key: String, path: Vec) -> Result