remove nodejs support
This commit is contained in:
		@@ -8,6 +8,8 @@ pub struct Bucket {
 | 
			
		||||
}
 | 
			
		||||
pub(super) type EntriesIter<'a> = alloc::collections::btree_map::Iter<'a, DHTKey, Arc<BucketEntry>>;
 | 
			
		||||
 | 
			
		||||
type BucketData = (Vec<(DHTKey, Vec<u8>)>, Option<DHTKey>);
 | 
			
		||||
 | 
			
		||||
fn state_ordering(state: BucketEntryState) -> usize {
 | 
			
		||||
    match state {
 | 
			
		||||
        BucketEntryState::Dead => 0,
 | 
			
		||||
@@ -25,6 +27,32 @@ impl Bucket {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub(super) fn load_bucket(&mut self, data: &[u8]) -> EyreResult<()> {
 | 
			
		||||
        let bucket_data: BucketData =
 | 
			
		||||
            serde_cbor::from_slice::<BucketData>(data).wrap_err("failed to deserialize bucket")?;
 | 
			
		||||
 | 
			
		||||
        for (k, d) in bucket_data.0 {
 | 
			
		||||
            let entryinner = serde_cbor::from_slice::<BucketEntryInner>(&d)
 | 
			
		||||
                .wrap_err("failed to deserialize bucket entry")?;
 | 
			
		||||
            self.entries
 | 
			
		||||
                .insert(k, Arc::new(BucketEntry::new_with_inner(entryinner)));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        self.newest_entry = bucket_data.1;
 | 
			
		||||
 | 
			
		||||
        Ok(())
 | 
			
		||||
    }
 | 
			
		||||
    pub(super) fn save_bucket(&self) -> EyreResult<Vec<u8>> {
 | 
			
		||||
        let mut entry_vec = Vec::new();
 | 
			
		||||
        for (k, v) in &self.entries {
 | 
			
		||||
            let entry_bytes = v.with_mut_inner(|e| serde_cbor::to_vec(e))?;
 | 
			
		||||
            entry_vec.push((*k, entry_bytes));
 | 
			
		||||
        }
 | 
			
		||||
        let bucket_data: BucketData = (entry_vec, self.newest_entry.clone());
 | 
			
		||||
        let out = serde_cbor::to_vec(&bucket_data)?;
 | 
			
		||||
        Ok(out)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub(super) fn add_entry(&mut self, node_id: DHTKey) -> NodeRef {
 | 
			
		||||
        log_rtab!("Node added: {}", node_id.encode());
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
use super::*;
 | 
			
		||||
use core::sync::atomic::{AtomicU32, Ordering};
 | 
			
		||||
use serde::{Deserialize, Serialize};
 | 
			
		||||
 | 
			
		||||
/// Reliable pings are done with increased spacing between pings
 | 
			
		||||
 | 
			
		||||
@@ -42,7 +43,7 @@ pub enum BucketEntryState {
 | 
			
		||||
struct LastConnectionKey(ProtocolType, AddressType);
 | 
			
		||||
 | 
			
		||||
/// Bucket entry information specific to the LocalNetwork RoutingDomain
 | 
			
		||||
#[derive(Debug)]
 | 
			
		||||
#[derive(Debug, Serialize, Deserialize)]
 | 
			
		||||
pub struct BucketEntryPublicInternet {
 | 
			
		||||
    /// The PublicInternet node info
 | 
			
		||||
    signed_node_info: Option<Box<SignedNodeInfo>>,
 | 
			
		||||
@@ -53,7 +54,7 @@ pub struct BucketEntryPublicInternet {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Bucket entry information specific to the LocalNetwork RoutingDomain
 | 
			
		||||
#[derive(Debug)]
 | 
			
		||||
#[derive(Debug, Serialize, Deserialize)]
 | 
			
		||||
pub struct BucketEntryLocalNetwork {
 | 
			
		||||
    /// The LocalNetwork node info
 | 
			
		||||
    signed_node_info: Option<Box<SignedNodeInfo>>,
 | 
			
		||||
@@ -63,19 +64,24 @@ pub struct BucketEntryLocalNetwork {
 | 
			
		||||
    node_status: Option<LocalNetworkNodeStatus>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug)]
 | 
			
		||||
#[derive(Debug, Serialize, Deserialize)]
 | 
			
		||||
pub struct BucketEntryInner {
 | 
			
		||||
    min_max_version: Option<(u8, u8)>,
 | 
			
		||||
    updated_since_last_network_change: bool,
 | 
			
		||||
    #[serde(skip)]
 | 
			
		||||
    last_connections: BTreeMap<LastConnectionKey, (ConnectionDescriptor, u64)>,
 | 
			
		||||
    public_internet: BucketEntryPublicInternet,
 | 
			
		||||
    local_network: BucketEntryLocalNetwork,
 | 
			
		||||
    peer_stats: PeerStats,
 | 
			
		||||
    #[serde(skip)]
 | 
			
		||||
    latency_stats_accounting: LatencyStatsAccounting,
 | 
			
		||||
    #[serde(skip)]
 | 
			
		||||
    transfer_stats_accounting: TransferStatsAccounting,
 | 
			
		||||
    #[cfg(feature = "tracking")]
 | 
			
		||||
    #[serde(skip)]
 | 
			
		||||
    next_track_id: usize,
 | 
			
		||||
    #[cfg(feature = "tracking")]
 | 
			
		||||
    #[serde(skip)]
 | 
			
		||||
    node_ref_tracks: HashMap<usize, backtrace::Backtrace>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -657,6 +663,13 @@ impl BucketEntry {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub(super) fn new_with_inner(inner: BucketEntryInner) -> Self {
 | 
			
		||||
        Self {
 | 
			
		||||
            ref_count: AtomicU32::new(0),
 | 
			
		||||
            inner: RwLock::new(inner),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Note, that this requires -also- holding the RoutingTable read lock, as an
 | 
			
		||||
    // immutable reference to RoutingTableInner must be passed in to get this
 | 
			
		||||
    // This ensures that an operation on the routing table can not change entries
 | 
			
		||||
 
 | 
			
		||||
@@ -154,6 +154,20 @@ impl RoutingTable {
 | 
			
		||||
    pub async fn init(&self) -> EyreResult<()> {
 | 
			
		||||
        debug!("starting routing table init");
 | 
			
		||||
 | 
			
		||||
        // Set up routing buckets
 | 
			
		||||
        {
 | 
			
		||||
            let mut inner = self.inner.write();
 | 
			
		||||
            inner.init_buckets(self.clone());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Load bucket entries from table db if possible
 | 
			
		||||
        debug!("loading routing table entries");
 | 
			
		||||
        if let Err(e) = self.load_buckets().await {
 | 
			
		||||
            log_rtab!(warn "Error loading buckets from storage: {}. Resetting.", e);
 | 
			
		||||
            let mut inner = self.inner.write();
 | 
			
		||||
            inner.init_buckets(self.clone());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Set up routespecstore
 | 
			
		||||
        debug!("starting route spec store init");
 | 
			
		||||
        let route_spec_store = match RouteSpecStore::load(self.clone()).await {
 | 
			
		||||
@@ -165,10 +179,10 @@ impl RoutingTable {
 | 
			
		||||
        };
 | 
			
		||||
        debug!("finished route spec store init");
 | 
			
		||||
 | 
			
		||||
        let mut inner = self.inner.write();
 | 
			
		||||
        inner.init(self.clone())?;
 | 
			
		||||
 | 
			
		||||
        inner.route_spec_store = Some(route_spec_store);
 | 
			
		||||
        {
 | 
			
		||||
            let mut inner = self.inner.write();
 | 
			
		||||
            inner.route_spec_store = Some(route_spec_store);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        debug!("finished routing table init");
 | 
			
		||||
        Ok(())
 | 
			
		||||
@@ -188,6 +202,12 @@ impl RoutingTable {
 | 
			
		||||
            error!("kick_buckets_task not stopped: {}", e);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Load bucket entries from table db if possible
 | 
			
		||||
        debug!("saving routing table entries");
 | 
			
		||||
        if let Err(e) = self.save_buckets().await {
 | 
			
		||||
            error!("failed to save routing table entries: {}", e);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        debug!("saving route spec store");
 | 
			
		||||
        let rss = {
 | 
			
		||||
            let mut inner = self.inner.write();
 | 
			
		||||
@@ -201,12 +221,67 @@ impl RoutingTable {
 | 
			
		||||
        debug!("shutting down routing table");
 | 
			
		||||
 | 
			
		||||
        let mut inner = self.inner.write();
 | 
			
		||||
        inner.terminate();
 | 
			
		||||
        *inner = RoutingTableInner::new(self.unlocked_inner.clone());
 | 
			
		||||
 | 
			
		||||
        debug!("finished routing table terminate");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async fn save_buckets(&self) -> EyreResult<()> {
 | 
			
		||||
        // Serialize all entries
 | 
			
		||||
        let mut bucketvec: Vec<Vec<u8>> = Vec::new();
 | 
			
		||||
        {
 | 
			
		||||
            let inner = &*self.inner.read();
 | 
			
		||||
            for bucket in &inner.buckets {
 | 
			
		||||
                bucketvec.push(bucket.save_bucket()?)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        let table_store = self.network_manager().table_store();
 | 
			
		||||
        let tdb = table_store.open("routing_table", 1).await?;
 | 
			
		||||
        let bucket_count = bucketvec.len();
 | 
			
		||||
        let mut dbx = tdb.transact();
 | 
			
		||||
        if let Err(e) = dbx.store_cbor(0, b"bucket_count", &bucket_count) {
 | 
			
		||||
            dbx.rollback();
 | 
			
		||||
            return Err(e);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        for (n, b) in bucketvec.iter().enumerate() {
 | 
			
		||||
            dbx.store(0, format!("bucket_{}", n).as_bytes(), b)
 | 
			
		||||
        }
 | 
			
		||||
        dbx.commit()?;
 | 
			
		||||
        Ok(())
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async fn load_buckets(&self) -> EyreResult<()> {
 | 
			
		||||
        // Deserialize all entries
 | 
			
		||||
        let inner = &mut *self.inner.write();
 | 
			
		||||
 | 
			
		||||
        let tstore = self.network_manager().table_store();
 | 
			
		||||
        let tdb = tstore.open("routing_table", 1).await?;
 | 
			
		||||
        let Some(bucket_count): Option<usize> = tdb.load_cbor(0, b"bucket_count")? else {
 | 
			
		||||
            log_rtab!(debug "no bucket count in saved routing table");
 | 
			
		||||
            return Ok(());
 | 
			
		||||
        };
 | 
			
		||||
        if bucket_count != inner.buckets.len() {
 | 
			
		||||
            // Must have the same number of buckets
 | 
			
		||||
            warn!("bucket count is different, not loading routing table");
 | 
			
		||||
            return Ok(());
 | 
			
		||||
        }
 | 
			
		||||
        let mut bucketdata_vec: Vec<Vec<u8>> = Vec::new();
 | 
			
		||||
        for n in 0..bucket_count {
 | 
			
		||||
            let Some(bucketdata): Option<Vec<u8>> =
 | 
			
		||||
                tdb.load(0, format!("bucket_{}", n).as_bytes())? else {
 | 
			
		||||
                    warn!("bucket data not loading, skipping loading routing table");
 | 
			
		||||
                    return Ok(());
 | 
			
		||||
                };
 | 
			
		||||
            bucketdata_vec.push(bucketdata);
 | 
			
		||||
        }
 | 
			
		||||
        for n in 0..bucket_count {
 | 
			
		||||
            inner.buckets[n].load_bucket(&bucketdata_vec[n])?;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Ok(())
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Set up the local network routing domain with our local routing table configuration
 | 
			
		||||
    pub fn configure_local_network_routing_domain(&self, local_networks: Vec<(IpAddr, IpAddr)>) {
 | 
			
		||||
        log_net!(debug "configure_local_network_routing_domain: {:#?}", local_networks);
 | 
			
		||||
 
 | 
			
		||||
@@ -225,7 +225,23 @@ impl RouteSpecStore {
 | 
			
		||||
        let table_store = routing_table.network_manager().table_store();
 | 
			
		||||
        let rsstdb = table_store.open("RouteSpecStore", 1).await?;
 | 
			
		||||
        let mut content: RouteSpecStoreContent =
 | 
			
		||||
            rsstdb.load_cbor(0, b"content").await?.unwrap_or_default();
 | 
			
		||||
            rsstdb.load_cbor(0, b"content")?.unwrap_or_default();
 | 
			
		||||
 | 
			
		||||
        // Look up all route hop noderefs since we can't serialize those
 | 
			
		||||
        let mut dead_keys = Vec::new();
 | 
			
		||||
        for (k, rsd) in &mut content.details {
 | 
			
		||||
            for h in &rsd.hops {
 | 
			
		||||
                let Some(nr) = routing_table.lookup_node_ref(*h) else {
 | 
			
		||||
                    dead_keys.push(*k);
 | 
			
		||||
                    break;
 | 
			
		||||
                };
 | 
			
		||||
                rsd.hop_node_refs.push(nr);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        for k in dead_keys {
 | 
			
		||||
            log_rtab!(debug "no entry, killing off private route: {}", k.encode());
 | 
			
		||||
            content.details.remove(&k);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Load secrets from pstore
 | 
			
		||||
        let pstore = routing_table.network_manager().protected_store();
 | 
			
		||||
@@ -280,7 +296,7 @@ impl RouteSpecStore {
 | 
			
		||||
            .network_manager()
 | 
			
		||||
            .table_store();
 | 
			
		||||
        let rsstdb = table_store.open("RouteSpecStore", 1).await?;
 | 
			
		||||
        rsstdb.store_cbor(0, b"content", &content).await?;
 | 
			
		||||
        rsstdb.store_cbor(0, b"content", &content)?;
 | 
			
		||||
 | 
			
		||||
        // // Keep secrets in protected store as well
 | 
			
		||||
        let pstore = self
 | 
			
		||||
@@ -1168,10 +1184,9 @@ impl RouteSpecStore {
 | 
			
		||||
 | 
			
		||||
        let mut buffer = vec![];
 | 
			
		||||
        capnp::serialize_packed::write_message(&mut buffer, &pr_message)
 | 
			
		||||
            .map_err(RPCError::internal)
 | 
			
		||||
            .wrap_err("failed to convert builder to vec")?;
 | 
			
		||||
        Ok(buffer)
 | 
			
		||||
 | 
			
		||||
        //    builder_to_vec(pr_message).wrap_err("failed to convert builder to vec")
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Convert binary blob to private route
 | 
			
		||||
@@ -1180,11 +1195,12 @@ impl RouteSpecStore {
 | 
			
		||||
            blob.as_slice(),
 | 
			
		||||
            capnp::message::ReaderOptions::new(),
 | 
			
		||||
        )
 | 
			
		||||
        .map_err(RPCError::internal)
 | 
			
		||||
        .wrap_err("failed to make message reader")?;
 | 
			
		||||
 | 
			
		||||
        //let reader = ::capnp::message::Reader::new(RPCMessageData::new(blob), Default::default());
 | 
			
		||||
        let pr_reader = reader
 | 
			
		||||
            .get_root::<veilid_capnp::private_route::Reader>()
 | 
			
		||||
            .map_err(RPCError::internal)
 | 
			
		||||
            .wrap_err("failed to make reader for private_route")?;
 | 
			
		||||
        decode_private_route(&pr_reader).wrap_err("failed to decode private route")
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -323,19 +323,16 @@ impl RoutingTableInner {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn init(&mut self, routing_table: RoutingTable) -> EyreResult<()> {
 | 
			
		||||
    pub fn init_buckets(&mut self, routing_table: RoutingTable) {
 | 
			
		||||
        // Size the buckets (one per bit)
 | 
			
		||||
        self.buckets.clear();
 | 
			
		||||
        self.buckets.reserve(DHT_KEY_LENGTH * 8);
 | 
			
		||||
        for _ in 0..DHT_KEY_LENGTH * 8 {
 | 
			
		||||
            let bucket = Bucket::new(routing_table.clone());
 | 
			
		||||
            self.buckets.push(bucket);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Ok(())
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn terminate(&mut self) {}
 | 
			
		||||
 | 
			
		||||
    pub fn configure_local_network_routing_domain(
 | 
			
		||||
        &mut self,
 | 
			
		||||
        local_networks: Vec<(IpAddr, IpAddr)>,
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user