Skip to main content

tuwunel_api/client/rendezvous/msc4388/
put.rs

1use axum::extract::State;
2use bytes::Bytes;
3use ruma::api::client::rendezvous::update_rendezvous_session::unstable::{Request, Response};
4use tuwunel_core::Err;
5use tuwunel_service::rendezvous::Put;
6
7use super::{Error, Result, ensure_available, ensure_data_size};
8use crate::{ClientIp, Ruma};
9
10#[tracing::instrument(level = "debug", skip_all)]
11pub(crate) async fn put_msc4388_route(
12	State(services): State<crate::State>,
13	ClientIp(client): ClientIp,
14	body: Ruma<Request>,
15) -> Result<Response> {
16	ensure_available(&services, client)?;
17	ensure_data_size(&services, &body.data)?;
18
19	let request = body.body;
20	let data = Bytes::from(request.data);
21
22	match services
23		.rendezvous
24		.put_token(&request.id, &request.sequence_token, data)
25	{
26		| Put::NotFound =>
27			Err!(Request(NotFound("Rendezvous session not found"))).map_err(Into::into),
28		| Put::PreconditionFailed(_) => Err(Error::ConcurrentWrite),
29		| Put::Accepted(meta) => Ok(Response {
30			sequence_token: meta.sequence_token().to_owned(),
31		}),
32	}
33}