use super::Measure;
use super::MeasureCounter;
use crate::dht::Did;
pub type PeerQuality = rings_measure::ReliabilityClass;
pub type PeerQualityThresholds = rings_measure::ReliabilityThresholds;
pub type PeerQualityEvidence = rings_measure::ReliabilityEvidence;
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct PeerMeasurement {
pub did: Did,
pub evidence: PeerQualityEvidence,
pub credit: Option<rings_measure::CreditRecord>,
pub credit_score: rings_measure::CreditScore,
pub quality: PeerQuality,
}
#[derive(Debug, Clone, PartialEq, Default)]
pub struct PeerMeasurementPage {
pub measurements: Vec<PeerMeasurement>,
pub next_cursor: Option<Did>,
}
impl PeerMeasurement {
pub fn from_projected(projected: rings_measure::PeerMeasurement<Did>) -> Self {
Self {
did: projected.peer,
evidence: projected.reliability,
credit: Some(projected.credit),
credit_score: projected.credit_score,
quality: projected.reliability_class,
}
}
}
pub async fn peer_evidence_from_counters<M>(measure: &M, did: Did) -> Option<PeerQualityEvidence>
where M: Measure + ?Sized {
let evidence = PeerQualityEvidence {
connected: measure.get_count(did, MeasureCounter::Connect).await,
disconnected: measure.get_count(did, MeasureCounter::Disconnected).await,
sent: measure.get_count(did, MeasureCounter::Sent).await,
failed_to_send: measure.get_count(did, MeasureCounter::FailedToSend).await,
received: measure.get_count(did, MeasureCounter::Received).await,
failed_to_receive: measure
.get_count(did, MeasureCounter::FailedToReceive)
.await,
};
(!evidence.is_unobserved()).then_some(evidence)
}
pub fn order_peers_by_quality(
candidates: impl IntoIterator<Item = (Did, PeerQuality)>,
) -> Vec<Did> {
rings_measure::order_peers_by_reliability(candidates)
}