2025-06-13 15:21:15 -06:00
|
|
|
use std::{
|
|
|
|
|
collections::HashMap,
|
|
|
|
|
sync::{Arc, Mutex},
|
|
|
|
|
thread,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
use crossbeam_channel::{Receiver, Sender};
|
|
|
|
|
|
|
|
|
|
use crate::{
|
2025-06-16 13:20:36 -06:00
|
|
|
Error,
|
|
|
|
|
nodes::{ConnectionConfig, Node, Stream, stream::StreamHandle},
|
2025-06-13 15:21:15 -06:00
|
|
|
packets::TransportLayerPacket,
|
|
|
|
|
};
|
|
|
|
|
|
2025-06-16 13:20:36 -06:00
|
|
|
type Streams = Arc<Mutex<HashMap<(usize, String), StreamHandle>>>;
|
2025-06-13 15:21:15 -06:00
|
|
|
|
|
|
|
|
pub struct NodeContainer {
|
|
|
|
|
streams: Streams,
|
2025-06-16 13:20:36 -06:00
|
|
|
node: Node<TransportLayerPacket>,
|
|
|
|
|
on_stream_rx: Receiver<Stream>,
|
|
|
|
|
// state: Arc<Mutex<NodeState<TransportLayerPacket>>>,
|
|
|
|
|
// spontanious_rx: Receiver<(String, C2Packet)>,
|
2025-06-13 15:21:15 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl NodeContainer {
|
|
|
|
|
pub fn connect(
|
|
|
|
|
id: String,
|
|
|
|
|
clients: Vec<ConnectionConfig>,
|
|
|
|
|
listeners: Vec<ConnectionConfig>,
|
|
|
|
|
) -> Result<Self, Error> {
|
2025-06-16 13:20:36 -06:00
|
|
|
let node = Node::<TransportLayerPacket>::run_node(id, clients, listeners)?;
|
2025-06-13 15:21:15 -06:00
|
|
|
let streams = Arc::new(Mutex::new(HashMap::new()));
|
2025-06-16 13:20:36 -06:00
|
|
|
// let (spontanious_tx, spontanious_rx) = crossbeam_channel::unbounded();
|
|
|
|
|
let (on_stream_tx, on_stream_rx) = crossbeam_channel::unbounded();
|
2025-06-13 15:21:15 -06:00
|
|
|
|
|
|
|
|
let s = Self {
|
|
|
|
|
streams: Arc::clone(&streams),
|
2025-06-16 13:20:36 -06:00
|
|
|
node: node.try_clone()?,
|
|
|
|
|
on_stream_rx,
|
2025-06-13 15:21:15 -06:00
|
|
|
};
|
|
|
|
|
|
2025-06-16 13:20:36 -06:00
|
|
|
let close_rx = node.get_disconnect_rx();
|
|
|
|
|
let stream_clone = Arc::clone(&streams);
|
|
|
|
|
thread::spawn(move || {
|
|
|
|
|
loop {
|
|
|
|
|
let close_uuid = close_rx.recv().unwrap();
|
|
|
|
|
let stream = stream_clone.lock().unwrap();
|
|
|
|
|
let keys = stream.keys();
|
|
|
|
|
for key in keys {
|
|
|
|
|
if key.1 == close_uuid {
|
|
|
|
|
warn!("Stream ({}, {}) disconnected!", key.0, key.1);
|
|
|
|
|
let handle = (&mut stream_clone.lock().unwrap()).remove(key).unwrap();
|
|
|
|
|
handle.close();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
2025-06-13 15:21:15 -06:00
|
|
|
// Start node listening thread
|
|
|
|
|
thread::spawn(move || {
|
|
|
|
|
loop {
|
2025-06-16 13:20:36 -06:00
|
|
|
if let Err(e) = Self::node_listening_thread(&node, &streams, &on_stream_tx) {
|
2025-06-13 15:21:15 -06:00
|
|
|
error!("Got error: {}", e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
Ok(s)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn node_listening_thread(
|
|
|
|
|
node: &Node<TransportLayerPacket>,
|
|
|
|
|
streams: &Streams,
|
2025-06-16 13:20:36 -06:00
|
|
|
on_stream_tx: &Sender<Stream>, // spontanious_tx: &Sender<(String, C2Packet)>,
|
2025-06-13 15:21:15 -06:00
|
|
|
) -> Result<(), Error> {
|
2025-06-16 13:20:36 -06:00
|
|
|
// info!("Loop");
|
|
|
|
|
let (src, packet) = node.recv()?;
|
|
|
|
|
info!("Packet: {:?}", packet);
|
2025-06-13 15:21:15 -06:00
|
|
|
|
|
|
|
|
match packet {
|
2025-06-16 13:20:36 -06:00
|
|
|
TransportLayerPacket::RequestStreamUnrouted {
|
|
|
|
|
stream_id: remote_stream_id,
|
|
|
|
|
} => {
|
|
|
|
|
// Create stream ID
|
2025-06-13 15:21:15 -06:00
|
|
|
let local_stream_id = streams.lock().unwrap().keys().len();
|
2025-06-16 13:20:36 -06:00
|
|
|
// Send response to server including local id and remoe ID
|
|
|
|
|
Stream::respond_create(src.clone(), local_stream_id, remote_stream_id, node)?;
|
|
|
|
|
|
|
|
|
|
Self::create_handle_thread(
|
|
|
|
|
on_stream_tx,
|
|
|
|
|
streams,
|
|
|
|
|
node,
|
2025-06-13 15:21:15 -06:00
|
|
|
src,
|
2025-06-16 13:20:36 -06:00
|
|
|
local_stream_id,
|
|
|
|
|
remote_stream_id,
|
2025-06-13 15:21:15 -06:00
|
|
|
)?;
|
|
|
|
|
Ok(())
|
|
|
|
|
}
|
|
|
|
|
TransportLayerPacket::AckStreamUnrouted {
|
2025-06-16 13:20:36 -06:00
|
|
|
ack_stream_id,
|
|
|
|
|
stream_id,
|
2025-06-13 15:21:15 -06:00
|
|
|
} => {
|
2025-06-16 13:20:36 -06:00
|
|
|
Self::create_handle_thread(
|
|
|
|
|
on_stream_tx,
|
|
|
|
|
streams,
|
|
|
|
|
node,
|
|
|
|
|
src,
|
|
|
|
|
ack_stream_id,
|
|
|
|
|
stream_id,
|
|
|
|
|
)?;
|
2025-06-13 15:21:15 -06:00
|
|
|
Ok(())
|
|
|
|
|
}
|
2025-06-16 13:20:36 -06:00
|
|
|
TransportLayerPacket::StreamDataUnrouted { stream_id, data } => {
|
|
|
|
|
match streams.lock().unwrap().get(&(stream_id, src.clone())) {
|
|
|
|
|
Some(handle) => Ok(handle.send(data).unwrap()),
|
|
|
|
|
// Some(_) => Err(format!(
|
|
|
|
|
// "Stream {}, {} has not been initilized!",
|
|
|
|
|
// stream_id, src
|
|
|
|
|
// )
|
|
|
|
|
// .into()),
|
|
|
|
|
None => Err(format!("Stream {}, {} does not exist!", stream_id, src).into()),
|
|
|
|
|
}
|
|
|
|
|
} // _ => Err(format!("Unsupported packet: {:?}", packet).into()),
|
2025-06-13 15:21:15 -06:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-06-16 13:20:36 -06:00
|
|
|
fn create_handle_thread(
|
|
|
|
|
on_stream_tx: &Sender<Stream>,
|
|
|
|
|
streams: &Streams,
|
2025-06-13 15:21:15 -06:00
|
|
|
node: &Node<TransportLayerPacket>,
|
2025-06-16 13:20:36 -06:00
|
|
|
src: String,
|
|
|
|
|
local_stream_id: usize,
|
|
|
|
|
remote_stream_id: usize,
|
2025-06-13 15:21:15 -06:00
|
|
|
) -> Result<(), Error> {
|
2025-06-16 13:20:36 -06:00
|
|
|
info!("Local: {}, Remote: {}", local_stream_id, remote_stream_id);
|
|
|
|
|
|
|
|
|
|
// Create stream from local and remote stream handles
|
|
|
|
|
let (stream, handle) =
|
|
|
|
|
Stream::create_handle(src.clone(), local_stream_id, remote_stream_id)?;
|
2025-06-13 15:21:15 -06:00
|
|
|
|
2025-06-16 13:20:36 -06:00
|
|
|
on_stream_tx.send(stream)?;
|
2025-06-13 15:21:15 -06:00
|
|
|
|
2025-06-16 13:20:36 -06:00
|
|
|
// Add the local stream to map
|
|
|
|
|
streams
|
|
|
|
|
.lock()
|
|
|
|
|
.unwrap()
|
|
|
|
|
.insert((local_stream_id, src.clone()), handle.clone()?);
|
2025-06-13 15:21:15 -06:00
|
|
|
|
2025-06-16 13:20:36 -06:00
|
|
|
let node_clone = node.try_clone()?;
|
2025-06-13 15:21:15 -06:00
|
|
|
thread::spawn(move || {
|
|
|
|
|
loop {
|
2025-06-16 13:20:36 -06:00
|
|
|
let data = handle.recv().unwrap();
|
|
|
|
|
if let Err(e) = node_clone.state().send_unrouted(
|
|
|
|
|
src.clone(),
|
|
|
|
|
&TransportLayerPacket::StreamDataUnrouted {
|
|
|
|
|
stream_id: remote_stream_id,
|
|
|
|
|
data,
|
|
|
|
|
},
|
|
|
|
|
) {
|
|
|
|
|
error!("Got error: {}", e);
|
|
|
|
|
break;
|
|
|
|
|
}
|
2025-06-13 15:21:15 -06:00
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
|
}
|
|
|
|
|
|
2025-06-16 13:20:36 -06:00
|
|
|
pub fn create_stream_block(&self, dest: String) -> Result<Stream, Error> {
|
|
|
|
|
let local_stream_id = self.streams.lock().unwrap().keys().len();
|
|
|
|
|
Stream::ask_create(dest.clone(), local_stream_id, &self.node)?;
|
|
|
|
|
Ok(self.on_stream_rx.recv()?)
|
2025-06-13 15:21:15 -06:00
|
|
|
}
|
|
|
|
|
|
2025-06-16 13:20:36 -06:00
|
|
|
pub fn recv_stream(&self) -> Result<Stream, Error> {
|
|
|
|
|
Ok(self.on_stream_rx.recv()?)
|
2025-06-13 15:21:15 -06:00
|
|
|
}
|
|
|
|
|
|
2025-06-16 13:20:36 -06:00
|
|
|
pub fn get_nodes(&self) -> Vec<String> {
|
|
|
|
|
self.node.state().get_all_nodes()
|
|
|
|
|
// self.state.lock().unwrap().get_all_nodes()
|
2025-06-13 15:21:15 -06:00
|
|
|
}
|
|
|
|
|
}
|