Skip to main content

tuwunel_api_client/delayed_events/
get_delayed_event.rs

1use std::time::Duration;
2
3use axum::extract::State;
4use ruma::{
5	MilliSecondsSinceUnixEpoch, UInt,
6	api::client::delayed_events::get_delayed_event::v1::{DelayedEventData, Request, Response},
7	serde::Raw,
8};
9use tuwunel_core::Result;
10use tuwunel_service::delayed_events::Event;
11
12use crate::Ruma;
13
14/// # `GET /_matrix/client/unstable/org.matrix.msc4140/delayed_events/{delayId}`
15///
16/// Returns one of the sender's delayed events (MSC4140).
17///
18/// A finalised event carries its outcome and is kept for about a week; one no
19/// longer kept answers 404 like an unknown `delay_id`.
20#[tracing::instrument(level = "debug", skip_all)]
21pub(crate) async fn get_delayed_event_route(
22	State(services): State<crate::State>,
23	body: Ruma<Request>,
24) -> Result<Response> {
25	let event = services
26		.delayed_events
27		.get(&body.delay_id, Some(body.sender_user()))
28		.await?;
29
30	Ok(Response::new(event_data(body.body.delay_id, event)))
31}
32
33fn event_data(delay_id: String, event: Event) -> DelayedEventData {
34	let delayed_since = event.due_ms.saturating_sub(event.delay_ms);
35
36	DelayedEventData {
37		delay_id,
38		room_id: event.room_id,
39		event_type: event.event_type,
40		state_key: event.state_key,
41		delay_ms: Duration::from_millis(event.delay_ms),
42		delayed_since_ts: MilliSecondsSinceUnixEpoch(UInt::new_saturating(delayed_since)),
43		content: Raw::from_raw_value(event.content.json()),
44		finalized: event.finalised,
45	}
46}