Skip to main content

tuwunel_api_client/delayed_events/
get_delayed_events.rs

1use 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/// # `GET /_matrix/client/unstable/org.matrix.msc4140/delayed_events`
19///
20/// Lists the sender's scheduled events (MSC4140).
21///
22/// The response takes the earlier shape, with `delay` and `running_since`,
23/// which existing clients read.
24#[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}