mirror of
https://forgejo.ellis.link/continuwuation/continuwuity.git
synced 2025-07-06 22:06:11 +02:00
automatically retry returning data in syncv3
This commit is contained in:
parent
e5049cae4a
commit
bd52d4c5b0
1 changed files with 27 additions and 15 deletions
|
@ -124,6 +124,33 @@ pub(crate) async fn sync_events_route(
|
||||||
// Setup watchers, so if there's no response, we can wait for them
|
// Setup watchers, so if there's no response, we can wait for them
|
||||||
let watcher = services.sync.watch(sender_user, sender_device);
|
let watcher = services.sync.watch(sender_user, sender_device);
|
||||||
|
|
||||||
|
let response = build_sync_events(services, &body).await?;
|
||||||
|
if body.body.full_state
|
||||||
|
|| !(response.rooms.is_empty()
|
||||||
|
&& response.presence.is_empty()
|
||||||
|
&& response.account_data.is_empty()
|
||||||
|
&& response.device_lists.is_empty()
|
||||||
|
&& response.to_device.is_empty())
|
||||||
|
{
|
||||||
|
return Ok(response);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hang a few seconds so requests are not spammed
|
||||||
|
// Stop hanging if new info arrives
|
||||||
|
let default = Duration::from_secs(30);
|
||||||
|
let duration = cmp::min(body.body.timeout.unwrap_or(default), default);
|
||||||
|
_ = tokio::time::timeout(duration, watcher).await;
|
||||||
|
|
||||||
|
// Retry returning data
|
||||||
|
build_sync_events(services, &body).await
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) async fn build_sync_events(
|
||||||
|
services: crate::State,
|
||||||
|
body: &Ruma<sync_events::v3::Request>,
|
||||||
|
) -> Result<sync_events::v3::Response, RumaResponse<UiaaResponse>> {
|
||||||
|
let (sender_user, sender_device) = body.sender();
|
||||||
|
|
||||||
let next_batch = services.globals.current_count()?;
|
let next_batch = services.globals.current_count()?;
|
||||||
let next_batch_string = next_batch.to_string();
|
let next_batch_string = next_batch.to_string();
|
||||||
|
|
||||||
|
@ -327,21 +354,6 @@ pub(crate) async fn sync_events_route(
|
||||||
to_device: ToDevice { events: to_device_events },
|
to_device: ToDevice { events: to_device_events },
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO: Retry the endpoint instead of returning
|
|
||||||
if !full_state
|
|
||||||
&& response.rooms.is_empty()
|
|
||||||
&& response.presence.is_empty()
|
|
||||||
&& response.account_data.is_empty()
|
|
||||||
&& response.device_lists.is_empty()
|
|
||||||
&& response.to_device.is_empty()
|
|
||||||
{
|
|
||||||
// Hang a few seconds so requests are not spammed
|
|
||||||
// Stop hanging if new info arrives
|
|
||||||
let default = Duration::from_secs(30);
|
|
||||||
let duration = cmp::min(body.body.timeout.unwrap_or(default), default);
|
|
||||||
_ = tokio::time::timeout(duration, watcher).await;
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(response)
|
Ok(response)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue