34 lines
1.1 KiB
Rust
34 lines
1.1 KiB
Rust
use crate::context::RequestContext;
|
|||
|
|
use axum::extract::Extension;
|
||
|
|
use axum::response::sse::{Event, KeepAlive, Sse};
|
||
|
|
use futures_util::stream;
|
||
|
|
use serde_json::json;
|
||
|
|
use std::convert::Infallible;
|
||
|
|
use std::time::Duration;
|
||
|
|
|
||
|
|
pub async fn events(
|
||
|
|
Extension(context): Extension<RequestContext>,
|
||
|
|
) -> Sse<impl futures_util::Stream<Item = Result<Event, Infallible>>> {
|
||
|
|
let payload = json!({
|
||
|
|
"kind": "sse_placeholder",
|
||
|
|
"requestId": context.trace.request_id,
|
||
|
|
"traceId": context.trace.trace_id,
|
||
|
|
"workspaceId": context.workspace.workspace_id,
|
||
|
|
"notes": [
|
||
|
|
"当前为 task-062 最小骨架,后续在此对齐统一流式输出协议。",
|
||
|
|
"此路由预留给 Hermes token/tool/client event 回流。"
|
||
|
|
]
|
||
|
|
});
|
||
|
|
|
||
|
|
let event = Event::default()
|
||
|
|
.event("ready")
|
||
|
|
.json_data(payload)
|
||
|
|
.expect("SSE 占位事件必须可序列化");
|
||
|
|
|
||
|
|
Sse::new(stream::iter(vec![Ok(event)])).keep_alive(
|
||
|
|
KeepAlive::new()
|
||
|
|
.interval(Duration::from_secs(15))
|
||
|
|
.text("keepalive"),
|
||
|
|
)
|
||
|
|
}
|