use std::sync::{Arc, OnceLock};
use std::time::Duration;
use net_sdk::deck::{AggregatorSnapshot, GatewayStats, SubnetRollup, SummaryAnnouncement};
use net_sdk::subnets::{SubnetId, Visibility};
#[derive(Clone, Debug)]
pub struct GatewayExportRow {
pub channel_hash: u16,
pub channel_name: Option<String>,
pub visibility: Option<Visibility>,
pub targets: Vec<SubnetId>,
pub reach: u64,
}
fn local_subnet() -> SubnetId {
SubnetId::new(&[1, 2])
}
pub fn subnets(local_id: u64, peer_ids: &[u64]) -> (Option<SubnetId>, Vec<SubnetRollup>) {
let local = local_subnet();
let n = peer_ids.len();
let q = n / 4;
let b1: Vec<u64> = peer_ids.iter().copied().take(q).collect();
let b2: Vec<u64> = peer_ids.iter().copied().skip(q).take(q).collect();
let b3: Vec<u64> = peer_ids.iter().copied().skip(2 * q).take(q).collect();
let b4: Vec<u64> = peer_ids.iter().copied().skip(3 * q).collect();
let mut local_members = vec![local_id];
local_members.extend(b2.iter().copied());
let rollups = vec![
SubnetRollup {
subnet: SubnetId::new(&[1]),
members: b1.clone(),
is_local: false,
},
SubnetRollup {
subnet: local,
members: local_members,
is_local: true,
},
SubnetRollup {
subnet: SubnetId::new(&[1, 3]),
members: b3.clone(),
is_local: false,
},
SubnetRollup {
subnet: SubnetId::new(&[2]),
members: b1.iter().copied().take(b1.len() / 2).collect(),
is_local: false,
},
SubnetRollup {
subnet: SubnetId::new(&[2, 1]),
members: b4.clone(),
is_local: false,
},
SubnetRollup {
subnet: SubnetId::new(&[3, 1]),
members: b3,
is_local: false,
},
];
(Some(local), rollups)
}
pub fn gateways() -> (GatewayStats, Vec<GatewayExportRow>) {
static CACHED: OnceLock<(GatewayStats, Vec<GatewayExportRow>)> = OnceLock::new();
CACHED
.get_or_init(|| {
let stats = GatewayStats {
local_subnet: local_subnet(),
forwarded: 124_587,
dropped: 392,
peer_subnets: vec![
SubnetId::new(&[1, 3]),
SubnetId::new(&[2, 1]),
SubnetId::new(&[3, 1]),
],
export_rules: 3,
};
let exports = vec![
GatewayExportRow {
channel_hash: 0x4a17,
channel_name: Some("swarm.telemetry.pose".into()),
visibility: Some(Visibility::Exported),
targets: vec![SubnetId::new(&[2, 1]), SubnetId::new(&[3, 1])],
reach: 11,
},
GatewayExportRow {
channel_hash: 0x9b22,
channel_name: Some("swarm.mission.broadcast".into()),
visibility: Some(Visibility::Exported),
targets: vec![SubnetId::new(&[1, 3])],
reach: 4,
},
GatewayExportRow {
channel_hash: 0xe041,
channel_name: Some("capability.tether.relay".into()),
visibility: Some(Visibility::Exported),
targets: vec![SubnetId::new(&[2, 1])],
reach: 6,
},
];
(stats, exports)
})
.clone()
}
pub fn aggregator() -> AggregatorSnapshot {
static CACHED: OnceLock<AggregatorSnapshot> = OnceLock::new();
CACHED
.get_or_init(|| {
let source = local_subnet();
let capability = SummaryAnnouncement {
source_subnet: source,
fold_kind: 0x0001,
generation: 142,
buckets: vec![
("class:quadcopter.payload:optical".into(), 28),
("class:quadcopter.payload:lidar".into(), 14),
("class:fixed-wing.payload:thermal".into(), 9),
("class:vtol.payload:multispectral".into(), 6),
("class:tether.payload:relay".into(), 3),
],
};
let reservation = SummaryAnnouncement {
source_subnet: source,
fold_kind: 0x0002,
generation: 142,
buckets: vec![
("loiter".into(), 22),
("transit".into(), 14),
("survey".into(), 11),
("recharge".into(), 8),
("return-to-base".into(), 3),
("lost-link".into(), 2),
],
};
AggregatorSnapshot {
source_subnet: source,
fold_kinds: vec![0x0001, 0x0002],
generation: 142,
summary_interval: Duration::from_secs(30),
summaries: Arc::new(vec![capability, reservation]),
}
})
.clone()
}