Some checks failed
Build and Test / super-mario-maker (push) Failing after 3m52s
Build and Test / wii-sports-club (push) Successful in 5m22s
Build and Test / splatoon (push) Successful in 6m15s
Build and Test / sonic-transformed (push) Successful in 6m16s
Build and Test / splatoon-testfire (push) Successful in 6m36s
Build and Test / friends (push) Successful in 6m45s
Build and Test / wii-u-chat (push) Successful in 6m47s
Build and Test / fast-racing-neo (push) Successful in 11m25s
Build and Test / mario-tennis (push) Successful in 11m50s
Build and Test / puyopuyo (push) Successful in 12m41s
Build and Test / minecraft-wiiu (push) Successful in 12m55s
84 lines
2.3 KiB
Rust
84 lines
2.3 KiB
Rust
use std::{
|
|
convert::Infallible,
|
|
net::{Ipv4Addr, SocketAddrV4},
|
|
sync::{Arc, Weak},
|
|
};
|
|
|
|
use rnex_reggie_protos::reggie::{
|
|
EdgeNodeHolderConnectOption, EdgeNodeManagement, LocalEdgeNodeHolder,
|
|
};
|
|
use rnex_rmc::{response::ErrorCode, rmc_struct};
|
|
use rnex_server::{
|
|
PassthroughInitModule, RnexManager, RnexModule, WeakPassthroughInitModule,
|
|
};
|
|
use tokio::sync::RwLock;
|
|
|
|
#[derive(Debug)]
|
|
#[rmc_struct(EdgeNodeHolder)]
|
|
pub struct EdgeNode {
|
|
em: PassthroughInitModule<NodeHolderManager>,
|
|
address: SocketAddrV4,
|
|
}
|
|
|
|
impl EdgeNodeManagement for EdgeNode {
|
|
async fn get_url(&self, seed: u64) -> Result<SocketAddrV4, ErrorCode> {
|
|
let nodes = self.em.edge_nodes.read().await;
|
|
|
|
let nodes: Vec<_> = nodes.iter().filter_map(|n| n.upgrade()).collect();
|
|
|
|
// avoid a devide by zero
|
|
if nodes.len() == 0 {
|
|
return Err(ErrorCode::Core_InvalidIndex);
|
|
};
|
|
|
|
let node = &nodes[seed as usize % nodes.len()];
|
|
|
|
Ok(node.address)
|
|
}
|
|
}
|
|
|
|
#[derive(Default, Debug)]
|
|
pub struct NodeHolderManager {
|
|
edge_nodes: RwLock<Vec<Weak<EdgeNode>>>,
|
|
}
|
|
#[derive(Default, Debug)]
|
|
pub struct NodeHolderModule;
|
|
|
|
impl RnexManager for NodeHolderManager {
|
|
type User = Arc<EdgeNode>;
|
|
type InitData = EdgeNodeHolderConnectOption;
|
|
async fn init_new_user(
|
|
this: PassthroughInitModule<Self>,
|
|
_mod_holder: &rnex_server::ModuleHolder,
|
|
_remote: &rnex_rmc::RmcConnection,
|
|
init_data: &Self::InitData,
|
|
_: WeakPassthroughInitModule<Self::User>,
|
|
) -> Self::User {
|
|
match init_data {
|
|
EdgeNodeHolderConnectOption::DontRegister => Arc::new(EdgeNode {
|
|
em: this,
|
|
address: SocketAddrV4::new(Ipv4Addr::UNSPECIFIED, 0),
|
|
}),
|
|
EdgeNodeHolderConnectOption::Register(socket_addr_v4) => {
|
|
let node = Arc::new(EdgeNode {
|
|
em: this.clone(),
|
|
address: *socket_addr_v4,
|
|
});
|
|
this.edge_nodes.write().await.push(Arc::downgrade(&node));
|
|
|
|
node
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
impl RnexModule for NodeHolderModule {
|
|
type Manager = NodeHolderManager;
|
|
type InitError = Infallible;
|
|
|
|
async fn create_manager(
|
|
_: &rnex_server::ModuleHolder,
|
|
) -> Result<Self::Manager, Self::InitError> {
|
|
Ok(NodeHolderManager::default())
|
|
}
|
|
}
|