Skip to main content

rns_embedded_mininode/
store.rs

1use alloc::vec::Vec;
2use rns_core::identity::{Identity, PRIVATE_KEY_LENGTH};
3
4use crate::{
5    error::MiniNodeError,
6    telemetry::{PositionFix, TelemetryPoint},
7};
8
9#[derive(Clone)]
10pub struct NeighborSnapshot {
11    pub destination_hash: [u8; 16],
12    pub identity: Identity,
13    pub last_seen_ms: u64,
14    pub app_data: Vec<u8>,
15}
16
17#[derive(Clone, Default)]
18pub struct NodeSnapshot {
19    pub last_announce_ms: Option<u64>,
20    pub neighbors: Vec<NeighborSnapshot>,
21    pub recent_message_ids: Vec<[u8; 32]>,
22    pub telemetry: Vec<TelemetryPoint>,
23    pub latest_position: Option<PositionFix>,
24}
25
26pub trait MiniNodeStore {
27    fn load_identity(&self) -> Result<Option<[u8; PRIVATE_KEY_LENGTH]>, MiniNodeError>;
28    fn save_identity(
29        &mut self,
30        identity_bytes: &[u8; PRIVATE_KEY_LENGTH],
31    ) -> Result<(), MiniNodeError>;
32    fn load_snapshot(&self) -> Result<Option<NodeSnapshot>, MiniNodeError>;
33    fn save_snapshot(&mut self, snapshot: &NodeSnapshot) -> Result<(), MiniNodeError>;
34}
35
36#[derive(Clone, Default)]
37pub struct MemoryStore {
38    identity: Option<[u8; PRIVATE_KEY_LENGTH]>,
39    snapshot: Option<NodeSnapshot>,
40}
41
42impl MemoryStore {
43    pub fn new() -> Self {
44        Self::default()
45    }
46}
47
48impl MiniNodeStore for MemoryStore {
49    fn load_identity(&self) -> Result<Option<[u8; PRIVATE_KEY_LENGTH]>, MiniNodeError> {
50        Ok(self.identity)
51    }
52
53    fn save_identity(
54        &mut self,
55        identity_bytes: &[u8; PRIVATE_KEY_LENGTH],
56    ) -> Result<(), MiniNodeError> {
57        self.identity = Some(*identity_bytes);
58        Ok(())
59    }
60
61    fn load_snapshot(&self) -> Result<Option<NodeSnapshot>, MiniNodeError> {
62        Ok(self.snapshot.clone())
63    }
64
65    fn save_snapshot(&mut self, snapshot: &NodeSnapshot) -> Result<(), MiniNodeError> {
66        self.snapshot = Some(snapshot.clone());
67        Ok(())
68    }
69}