tuwunel_api_client/delayed_events/
get_delayed_events.rs1use std::time::Duration;
2
3use axum::extract::State;
4use futures::StreamExt;
5use ruma::{
6 MilliSecondsSinceUnixEpoch, UInt,
7 api::client::delayed_events::{
8 DelayedEventData,
9 get_all_delayed_events::unstable::{Request, Response},
10 },
11 serde::Raw,
12};
13use tuwunel_core::Result;
14use tuwunel_service::delayed_events::{DelayId, Event};
15
16use crate::Ruma;
17
18#[tracing::instrument(level = "debug", skip_all)]
25pub(crate) async fn get_delayed_events_route(
26 State(services): State<crate::State>,
27 body: Ruma<Request>,
28) -> Result<Response> {
29 let delayed_events = services
30 .delayed_events
31 .scheduled(body.sender_user())
32 .map(|(delay_id, event)| event_data(delay_id, event))
33 .collect()
34 .await;
35
36 Ok(Response::new(delayed_events))
37}
38
39fn event_data(delay_id: DelayId, event: Event) -> DelayedEventData {
40 let running_since = event.due_ms.saturating_sub(event.delay_ms);
41
42 DelayedEventData::new(
43 delay_id.into_string(),
44 event.room_id,
45 event.event_type,
46 event.state_key.as_deref().map(str::to_owned),
47 Raw::from_raw_value(event.content.json()),
48 Duration::from_millis(event.delay_ms),
49 MilliSecondsSinceUnixEpoch(UInt::new_saturating(running_since)),
50 )
51}