Skip to content

Commit 4a2ca8d

Browse files
committed
use new topology provider and appease wasm
1 parent bd11dda commit 4a2ca8d

File tree

5 files changed

+117
-15
lines changed

5 files changed

+117
-15
lines changed

Cargo.lock

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

common/client-core/src/client/base_client/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use crate::client::replies::reply_controller::{ReplyControllerReceiver, ReplyCon
2222
use crate::client::replies::reply_storage::{
2323
CombinedReplyStorage, PersistentReplyStorage, ReplyStorageBackend, SentReplyKeys,
2424
};
25-
use crate::client::topology_control::nym_api_provider::NymApiTopologyProvider;
25+
use crate::client::topology_control::smart_api_provider::NymApiTopologyProvider;
2626
use crate::client::topology_control::{
2727
TopologyAccessor, TopologyRefresher, TopologyRefresherConfig,
2828
};
@@ -556,6 +556,7 @@ where
556556
config_topology,
557557
nym_api_urls,
558558
user_agent,
559+
None,
559560
)),
560561
config::TopologyStructure::GeoAware(group_by) => {
561562
warn!("using deprecated 'GeoAware' topology provider - this option will be removed very soon");

common/client-core/src/client/topology_control/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ pub mod smart_api_provider;
2323

2424
#[allow(deprecated)]
2525
pub use geo_aware_provider::GeoAwareTopologyProvider;
26-
pub use nym_api_provider::{Config as NymApiTopologyProviderConfig, NymApiTopologyProvider};
2726
pub use nym_topology::providers::TopologyProvider;
27+
pub use smart_api_provider::{Config as NymApiTopologyProviderConfig, NymApiTopologyProvider};
2828

2929
// TODO: move it to config later
3030
const MAX_FAILURE_COUNT: usize = 10;

common/client-core/src/client/topology_control/smart_api_provider.rs

Lines changed: 65 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,10 @@
88

99
use async_trait::async_trait;
1010
use log::{debug, error, warn};
11+
pub use nym_topology::providers::piecewise::Config;
1112
use nym_topology::{
12-
providers::piecewise::{Config, NymTopologyProvider, PiecewiseTopologyProvider},
13-
EpochRewardedSet, NymTopology, RoutingNode,
13+
providers::piecewise::{NymTopologyProvider, PiecewiseTopologyProvider},
14+
EpochRewardedSet, NymTopology, RoutingNode, TopologyProvider,
1415
};
1516
use nym_validator_client::UserAgent;
1617
use rand::{prelude::SliceRandom, thread_rng};
@@ -26,13 +27,13 @@ pub struct NymApiTopologyProvider {
2627
impl NymApiTopologyProvider {
2728
/// Construct a new thread safe Cached topology provider using the Nym API
2829
pub fn new(
29-
user_agent: UserAgent,
30+
config: impl Into<Config>,
3031
nym_api_urls: Vec<Url>,
31-
config: Config,
32+
user_agent: Option<UserAgent>,
3233
initial_topology: Option<NymTopology>,
3334
) -> Self {
34-
let manager = NymApiPiecewiseProvider::new(nym_api_urls, Some(user_agent));
35-
let inner = NymTopologyProvider::new(manager, config, initial_topology);
35+
let manager = NymApiPiecewiseProvider::new(nym_api_urls, user_agent);
36+
let inner = NymTopologyProvider::new(manager, config.into(), initial_topology);
3637

3738
Self { inner }
3839
}
@@ -44,6 +45,28 @@ impl AsRef<NymTopologyProvider<NymApiPiecewiseProvider>> for NymApiTopologyProvi
4445
}
4546
}
4647

48+
impl AsMut<NymTopologyProvider<NymApiPiecewiseProvider>> for NymApiTopologyProvider {
49+
fn as_mut(&mut self) -> &mut NymTopologyProvider<NymApiPiecewiseProvider> {
50+
&mut self.inner
51+
}
52+
}
53+
54+
#[cfg(not(target_arch = "wasm32"))]
55+
#[async_trait]
56+
impl TopologyProvider for NymApiTopologyProvider {
57+
async fn get_new_topology(&mut self) -> Option<NymTopology> {
58+
self.as_mut().get_new_topology().await
59+
}
60+
}
61+
62+
#[cfg(target_arch = "wasm32")]
63+
#[async_trait(?Send)]
64+
impl TopologyProvider for NymApiTopologyProvider {
65+
async fn get_new_topology(&mut self) -> Option<NymTopology> {
66+
self.as_mut().get_new_topology().await
67+
}
68+
}
69+
4770
#[derive(Clone)]
4871
struct NymApiPiecewiseProvider {
4972
validator_client: nym_validator_client::client::NymApiClient,
@@ -81,11 +104,8 @@ impl NymApiPiecewiseProvider {
81104
self.validator_client
82105
.change_nym_api(self.nym_api_urls[self.currently_used_api].clone())
83106
}
84-
}
85107

86-
#[async_trait]
87-
impl PiecewiseTopologyProvider for NymApiPiecewiseProvider {
88-
async fn get_full_topology(&mut self) -> Option<NymTopology> {
108+
async fn get_full_topology_inner(&mut self) -> Option<NymTopology> {
89109
let layer_assignments = self.get_layer_assignments().await?;
90110

91111
let mut topology = NymTopology::new_empty(layer_assignments);
@@ -111,7 +131,7 @@ impl PiecewiseTopologyProvider for NymApiPiecewiseProvider {
111131
Some(topology)
112132
}
113133

114-
async fn get_descriptor_batch(&mut self, ids: &[u32]) -> Option<Vec<RoutingNode>> {
134+
async fn get_descriptor_batch_inner(&mut self, ids: &[u32]) -> Option<Vec<RoutingNode>> {
115135
// Does this need to return a hashmap of RoutingNodes? that is moderately inconvenient
116136
// especially when the nodes themselves contain their node_id unless we expect to directly
117137
// use the result of this fn for lookups where we would otherwise for example, have to
@@ -129,13 +149,13 @@ impl PiecewiseTopologyProvider for NymApiPiecewiseProvider {
129149
let mut out = Vec::new();
130150
for node in descriptor_vec {
131151
if let Ok(routing_node) = RoutingNode::try_from(&node) {
132-
let _ = out.push(routing_node);
152+
out.push(routing_node);
133153
}
134154
}
135155
Some(out)
136156
}
137157

138-
async fn get_layer_assignments(&mut self) -> Option<EpochRewardedSet> {
158+
async fn get_layer_assignments_inner(&mut self) -> Option<EpochRewardedSet> {
139159
self.validator_client
140160
.get_current_rewarded_set()
141161
.await
@@ -146,3 +166,35 @@ impl PiecewiseTopologyProvider for NymApiPiecewiseProvider {
146166
.ok()
147167
}
148168
}
169+
170+
#[cfg(not(target_arch = "wasm32"))]
171+
#[async_trait]
172+
impl PiecewiseTopologyProvider for NymApiPiecewiseProvider {
173+
async fn get_full_topology(&mut self) -> Option<NymTopology> {
174+
self.get_full_topology_inner().await
175+
}
176+
177+
async fn get_descriptor_batch(&mut self, ids: &[u32]) -> Option<Vec<RoutingNode>> {
178+
self.get_descriptor_batch_inner(ids).await
179+
}
180+
181+
async fn get_layer_assignments(&mut self) -> Option<EpochRewardedSet> {
182+
self.get_layer_assignments_inner().await
183+
}
184+
}
185+
186+
#[cfg(target_arch = "wasm32")]
187+
#[async_trait(?Send)]
188+
impl PiecewiseTopologyProvider for NymApiPiecewiseProvider {
189+
async fn get_full_topology(&mut self) -> Option<NymTopology> {
190+
self.get_full_topology_inner().await
191+
}
192+
193+
async fn get_descriptor_batch(&mut self, ids: &[u32]) -> Option<Vec<RoutingNode>> {
194+
self.get_descriptor_batch_inner(ids).await
195+
}
196+
197+
async fn get_layer_assignments(&mut self) -> Option<EpochRewardedSet> {
198+
self.get_layer_assignments_inner().await
199+
}
200+
}

common/topology/src/providers/piecewise.rs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ impl<M: PiecewiseTopologyProvider> NymTopologyProvider<M> {
112112
}
113113
}
114114

115+
#[cfg(not(target_arch = "wasm32"))]
115116
#[async_trait]
116117
impl<M: PiecewiseTopologyProvider> TopologyProvider for NymTopologyProvider<M> {
117118
async fn get_new_topology(&mut self) -> Option<NymTopology> {
@@ -127,6 +128,22 @@ impl<M: PiecewiseTopologyProvider> TopologyProvider for NymTopologyProvider<M> {
127128
}
128129
}
129130

131+
#[cfg(target_arch = "wasm32")]
132+
#[async_trait(?Send)]
133+
impl<M: PiecewiseTopologyProvider> TopologyProvider for NymTopologyProvider<M> {
134+
async fn get_new_topology(&mut self) -> Option<NymTopology> {
135+
let mut guard = self.inner.lock().await;
136+
// check the cache
137+
if let Some(cached) = guard.get_current_compatible_topology().await {
138+
return Some(cached);
139+
}
140+
141+
// not cached, or cache expired. try update.
142+
guard.update_cache().await;
143+
guard.get_current_compatible_topology().await
144+
}
145+
}
146+
130147
struct NymTopologyProviderInner<M: PiecewiseTopologyProvider> {
131148
config: Config,
132149

@@ -242,13 +259,23 @@ impl<M: PiecewiseTopologyProvider> NymTopologyProviderInner<M> {
242259
}
243260
}
244261

262+
#[cfg(not(target_arch = "wasm32"))]
245263
#[async_trait]
246264
impl<P: PiecewiseTopologyProvider> TopologyProvider for NymTopologyProviderInner<P> {
247265
async fn get_new_topology(&mut self) -> Option<NymTopology> {
248266
self.get_current_compatible_topology().await
249267
}
250268
}
251269

270+
#[cfg(target_arch = "wasm32")]
271+
#[async_trait(?Send)]
272+
impl<P: PiecewiseTopologyProvider> TopologyProvider for NymTopologyProviderInner<P> {
273+
async fn get_new_topology(&mut self) -> Option<NymTopology> {
274+
self.get_current_compatible_topology().await
275+
}
276+
}
277+
278+
#[cfg(not(target_arch = "wasm32"))]
252279
/// Trait allowing construction and upkeep of a
253280
#[async_trait]
254281
pub trait PiecewiseTopologyProvider: Send {
@@ -265,7 +292,25 @@ pub trait PiecewiseTopologyProvider: Send {
265292
async fn get_layer_assignments(&mut self) -> Option<EpochRewardedSet>;
266293
}
267294

295+
#[cfg(target_arch = "wasm32")]
296+
/// Trait allowing construction and upkeep of a
297+
#[async_trait(?Send)]
298+
pub trait PiecewiseTopologyProvider: Send {
299+
/// Pull a copy of the full topology.
300+
///
301+
/// This is intended to be used sparingly as repeated usage could result in fetching duplicate
302+
/// information more often than necessary.
303+
async fn get_full_topology(&mut self) -> Option<NymTopology>;
304+
305+
/// Fetch a node descriptors for the set of provided IDs if available.
306+
async fn get_descriptor_batch(&mut self, ids: &[u32]) -> Option<Vec<RoutingNode>>;
307+
308+
/// Fetch the latest mapping of node IDs to Nym Network layer.
309+
async fn get_layer_assignments(&mut self) -> Option<EpochRewardedSet>;
310+
}
311+
268312
#[cfg(test)]
313+
#[cfg(not(target_arch = "wasm32"))]
269314
mod test {
270315
use super::*;
271316
use crate::SupportedRoles;

0 commit comments

Comments
 (0)