summaryrefslogtreecommitdiffstats
path: root/src/swarm/members.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/swarm/members.rs')
-rw-r--r--src/swarm/members.rs37
1 files changed, 36 insertions, 1 deletions
diff --git a/src/swarm/members.rs b/src/swarm/members.rs
index 45c8aeb..e64dd20 100644
--- a/src/swarm/members.rs
+++ b/src/swarm/members.rs
@@ -9,7 +9,7 @@
//! cancels the record and registers again.
use automerge::AutoCommit;
-use serde_json::json;
+use serde_json::{Value as JsonValue, json};
use tracing::{info, warn};
use crate::document::store::{self, StoreError};
@@ -34,6 +34,41 @@ pub(crate) fn members(doc: &AutoCommit) -> Vec<String> {
members
}
+/// A member's stability tier, judged by itself (`swarm::stability`).
+#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
+pub(crate) enum Tier {
+ Stable,
+ #[default]
+ Transient,
+}
+
+impl Tier {
+ pub(crate) fn as_str(self) -> &'static str {
+ match self {
+ Self::Stable => "stable",
+ Self::Transient => "transient",
+ }
+ }
+}
+
+fn tier_path(pk: &str) -> Vec<String> {
+ let mut path = member_path(pk);
+ path.push("tier".to_owned());
+ path
+}
+
+/// `pk`'s tier; transient unless its entry says stable.
+pub(crate) fn tier(doc: &AutoCommit, pk: &str) -> Tier {
+ match store::read_path(doc, &tier_path(pk)) {
+ Ok(Some(JsonValue::String(tier))) if tier == "stable" => Tier::Stable,
+ _ => Tier::Transient,
+ }
+}
+
+pub(crate) fn set_tier(doc: &mut AutoCommit, pk: &str, tier: Tier) -> Result<(), StoreError> {
+ store::write_path(doc, &tier_path(pk), &json!(tier.as_str()))
+}
+
/// Registers this node if it is ready and its entry is missing.
pub(crate) async fn ensure_registered(state: &AppState) {
if !state.is_ready().await {