diff options
Diffstat (limited to 'src/state.rs')
| -rw-r--r-- | src/state.rs | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/state.rs b/src/state.rs index df053a6..0f30732 100644 --- a/src/state.rs +++ b/src/state.rs @@ -597,6 +597,8 @@ pub(crate) struct AppState { pub(crate) alias: Option<String>, /// Members alive within this window vote on remakes (`--electorate-window-days`). pub(crate) electorate_window: Duration, + /// Chunked transfers served and fetched (`swarm::blob`). + pub(crate) blobs: Arc<crate::swarm::blob::Blobs>, /// The effective configuration with sources, imported values left out /// (`config::Loaded::report`), for `GET /admin/config`. pub(crate) config: Arc<serde_json::Value>, @@ -1029,6 +1031,28 @@ impl Host for AppState { crate::swarm::members::electorate(doc, now_ms, self.electorate_window) } + fn fetch_change( + &self, + hash: ChangeHash, + ) -> impl Future<Output = Result<automerge::Change>> + Send { + let state = self.clone(); + async move { + let epoch = state.local_epoch(); + let peers: Vec<String> = state + .peer_summaries() + .await + .into_iter() + .filter(|peer| peer.active && peer.epoch == Some(epoch)) + .map(|peer| peer.id) + .collect(); + crate::swarm::blob::fetch_change(&state, hash, peers).await + } + } + + fn request_sync(&self) { + crate::swarm::source::resync_everyone(self); + } + fn is_node_ready(&self) -> impl Future<Output = bool> + Send { let state = self.clone(); async move { state.is_ready().await } |
