tuwunel_api/client/rendezvous/msc4388/
put.rs1use 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}