From 92cb5a07cf0c4b3e46e312c68660bf44b2eb7aa3 Mon Sep 17 00:00:00 2001 From: Christien Rioux Date: Sun, 17 Dec 2023 14:03:56 -0500 Subject: [PATCH] add watch capability --- veilid-core/src/network_manager/native/mod.rs | 21 +++++++++---------- veilid-core/src/network_manager/wasm/mod.rs | 2 ++ .../src/routing_table/types/node_info.rs | 1 + .../src/rpc_processor/rpc_get_value.rs | 2 +- .../src/rpc_processor/rpc_watch_value.rs | 11 +++++++++- veilid-core/src/storage_manager/get_value.rs | 2 +- veilid-core/src/storage_manager/set_value.rs | 2 +- .../src/storage_manager/watch_value.rs | 2 +- veilid-python/veilid/types.py | 1 + 9 files changed, 28 insertions(+), 16 deletions(-) diff --git a/veilid-core/src/network_manager/native/mod.rs b/veilid-core/src/network_manager/native/mod.rs index 92551955..a6f171e6 100644 --- a/veilid-core/src/network_manager/native/mod.rs +++ b/veilid-core/src/network_manager/native/mod.rs @@ -31,11 +31,11 @@ pub const PEEK_DETECT_LEN: usize = 64; cfg_if! { if #[cfg(all(feature = "unstable-blockstore", feature="unstable-tunnels"))] { - const PUBLIC_INTERNET_CAPABILITIES_LEN: usize = 8; + const PUBLIC_INTERNET_CAPABILITIES_LEN: usize = 9; } else if #[cfg(any(feature = "unstable-blockstore", feature="unstable-tunnels"))] { - const PUBLIC_INTERNET_CAPABILITIES_LEN: usize = 7; + const PUBLIC_INTERNET_CAPABILITIES_LEN: usize = 8; } else { - const PUBLIC_INTERNET_CAPABILITIES_LEN: usize = 6; + const PUBLIC_INTERNET_CAPABILITIES_LEN: usize = 7; } } pub const PUBLIC_INTERNET_CAPABILITIES: [Capability; PUBLIC_INTERNET_CAPABILITIES_LEN] = [ @@ -46,19 +46,21 @@ pub const PUBLIC_INTERNET_CAPABILITIES: [Capability; PUBLIC_INTERNET_CAPABILITIE CAP_RELAY, CAP_VALIDATE_DIAL_INFO, CAP_DHT, + CAP_DHT_WATCH, CAP_APPMESSAGE, #[cfg(feature = "unstable-blockstore")] CAP_BLOCKSTORE, ]; #[cfg(feature = "unstable-blockstore")] -const LOCAL_NETWORK_CAPABILITIES_LEN: usize = 4; +const LOCAL_NETWORK_CAPABILITIES_LEN: usize = 5; #[cfg(not(feature = "unstable-blockstore"))] -const LOCAL_NETWORK_CAPABILITIES_LEN: usize = 3; +const LOCAL_NETWORK_CAPABILITIES_LEN: usize = 4; pub const LOCAL_NETWORK_CAPABILITIES: [Capability; LOCAL_NETWORK_CAPABILITIES_LEN] = [ CAP_RELAY, CAP_DHT, + CAP_DHT_WATCH, CAP_APPMESSAGE, #[cfg(feature = "unstable-blockstore")] CAP_BLOCKSTORE, @@ -551,12 +553,9 @@ impl Network { .wrap_err("connect failure")? } ProtocolType::WS | ProtocolType::WSS => { - WebsocketProtocolHandler::connect( - None, - &dial_info, - connect_timeout_ms) - .await - .wrap_err("connect failure")? + WebsocketProtocolHandler::connect(None, &dial_info, connect_timeout_ms) + .await + .wrap_err("connect failure")? } }); diff --git a/veilid-core/src/network_manager/wasm/mod.rs b/veilid-core/src/network_manager/wasm/mod.rs index 92b64ff6..88cc1fcb 100644 --- a/veilid-core/src/network_manager/wasm/mod.rs +++ b/veilid-core/src/network_manager/wasm/mod.rs @@ -27,6 +27,7 @@ pub const PUBLIC_INTERNET_CAPABILITIES: [Capability; PUBLIC_INTERNET_CAPABILITIE //CAP_RELAY, //CAP_VALIDATE_DIAL_INFO, CAP_DHT, + CAP_DHT_WATCH, CAP_APPMESSAGE, #[cfg(feature = "unstable-blockstore")] CAP_BLOCKSTORE, @@ -40,6 +41,7 @@ pub const PUBLIC_INTERNET_CAPABILITIES: [Capability; PUBLIC_INTERNET_CAPABILITIE // pub const LOCAL_NETWORK_CAPABILITIES: [Capability; LOCAL_NETWORK_CAPABILITIES_LEN] = [ // //CAP_RELAY, // CAP_DHT, +// CAP_DHT_WATCH, // CAP_APPMESSAGE, // #[cfg(feature = "unstable-blockstore")] // CAP_BLOCKSTORE, diff --git a/veilid-core/src/routing_table/types/node_info.rs b/veilid-core/src/routing_table/types/node_info.rs index 838022e3..93e178ea 100644 --- a/veilid-core/src/routing_table/types/node_info.rs +++ b/veilid-core/src/routing_table/types/node_info.rs @@ -8,6 +8,7 @@ pub const CAP_SIGNAL: Capability = FourCC(*b"SGNL"); pub const CAP_RELAY: Capability = FourCC(*b"RLAY"); pub const CAP_VALIDATE_DIAL_INFO: Capability = FourCC(*b"DIAL"); pub const CAP_DHT: Capability = FourCC(*b"DHTV"); +pub const CAP_DHT_WATCH: Capability = FourCC(*b"DHTW"); pub const CAP_APPMESSAGE: Capability = FourCC(*b"APPM"); #[cfg(feature = "unstable-blockstore")] pub const CAP_BLOCKSTORE: Capability = FourCC(*b"BLOC"); diff --git a/veilid-core/src/rpc_processor/rpc_get_value.rs b/veilid-core/src/rpc_processor/rpc_get_value.rs index 679f0423..0859c9b2 100644 --- a/veilid-core/src/rpc_processor/rpc_get_value.rs +++ b/veilid-core/src/rpc_processor/rpc_get_value.rs @@ -211,7 +211,7 @@ impl RPCProcessor { // Get the nodes that we know about that are closer to the the key than our own node let routing_table = self.routing_table(); - let closer_to_key_peers = network_result_try!(routing_table.find_preferred_peers_closer_to_key(key, vec![CAP_DHT])); + let closer_to_key_peers = network_result_try!(routing_table.find_preferred_peers_closer_to_key(key, vec![CAP_DHT, CAP_DHT_WATCH])); #[cfg(feature="debug-dht")] { diff --git a/veilid-core/src/rpc_processor/rpc_watch_value.rs b/veilid-core/src/rpc_processor/rpc_watch_value.rs index 77351cc8..8b08a642 100644 --- a/veilid-core/src/rpc_processor/rpc_watch_value.rs +++ b/veilid-core/src/rpc_processor/rpc_watch_value.rs @@ -164,6 +164,15 @@ impl RPCProcessor { if !opi.signed_node_info().node_info().has_capability(CAP_DHT) { return Ok(NetworkResult::service_unavailable("dht is not available")); } + if !opi + .signed_node_info() + .node_info() + .has_capability(CAP_DHT_WATCH) + { + return Ok(NetworkResult::service_unavailable( + "dht watch is not available", + )); + } // Get the question let kind = msg.operation.kind().clone(); @@ -199,7 +208,7 @@ impl RPCProcessor { // Get the nodes that we know about that are closer to the the key than our own node let closer_to_key_peers = network_result_try!( - routing_table.find_preferred_peers_closer_to_key(key, vec![CAP_DHT]) + routing_table.find_preferred_peers_closer_to_key(key, vec![CAP_DHT, CAP_DHT_WATCH]) ); // See if we would have accepted this as a set diff --git a/veilid-core/src/storage_manager/get_value.rs b/veilid-core/src/storage_manager/get_value.rs index 239fe20f..6e7b0ab1 100644 --- a/veilid-core/src/storage_manager/get_value.rs +++ b/veilid-core/src/storage_manager/get_value.rs @@ -169,7 +169,7 @@ impl StorageManager { key_count, fanout, timeout_us, - capability_fanout_node_info_filter(vec![CAP_DHT]), + capability_fanout_node_info_filter(vec![CAP_DHT, CAP_DHT_WATCH]), call_routine, check_done, ); diff --git a/veilid-core/src/storage_manager/set_value.rs b/veilid-core/src/storage_manager/set_value.rs index 50aa8dc7..e5279157 100644 --- a/veilid-core/src/storage_manager/set_value.rs +++ b/veilid-core/src/storage_manager/set_value.rs @@ -160,7 +160,7 @@ impl StorageManager { key_count, fanout, timeout_us, - capability_fanout_node_info_filter(vec![CAP_DHT]), + capability_fanout_node_info_filter(vec![CAP_DHT, CAP_DHT_WATCH]), call_routine, check_done, ); diff --git a/veilid-core/src/storage_manager/watch_value.rs b/veilid-core/src/storage_manager/watch_value.rs index f945c781..097bbd1d 100644 --- a/veilid-core/src/storage_manager/watch_value.rs +++ b/veilid-core/src/storage_manager/watch_value.rs @@ -127,7 +127,7 @@ impl StorageManager { key_count, 1, timeout_us, - capability_fanout_node_info_filter(vec![CAP_DHT]), + capability_fanout_node_info_filter(vec![CAP_DHT, CAP_DHT_WATCH]), call_routine, check_done, ); diff --git a/veilid-python/veilid/types.py b/veilid-python/veilid/types.py index a9a80587..c47d7590 100644 --- a/veilid-python/veilid/types.py +++ b/veilid-python/veilid/types.py @@ -59,6 +59,7 @@ class Capability(StrEnum): CAP_RELAY = "RLAY" CAP_VALIDATE_DIAL_INFO = "DIAL" CAP_DHT = "DHTV" + CAP_DHT_WATCH = "DHTW" CAP_APPMESSAGE = "APPM" CAP_BLOCKSTORE = "BLOC"