}
const METADATA_MAX_LEN: usize = MAX_OVERHEAD;
+const INTERNAL_QUEUE: usize = 15; // xxx: config
#[derive(Debug)]
pub struct Global {
pub struct Client {
ic: Arc<InstanceConfig>,
web: mpsc::Sender<WebRequest>,
+ route: mpsc::Sender<RoutedPacket>,
}
pub type RoutedPacket = Box<[u8]>; // not MIME data
#[allow(unused_mut)] // xxx
async fn run_client(global: Arc<Global>,
ic: Arc<InstanceConfig>,
- mut web: mpsc::Receiver<WebRequest>)
+ mut web: mpsc::Receiver<WebRequest>,
+ mut routed: mpsc::Receiver<RoutedPacket>)
-> Result<Void, AE>
{
struct Outstanding {
let ics = ics.into_iter().map(Arc::new).collect_vec();
let (client_handles_send, client_handles_recv) = ics.iter()
- .map(|_ic| mpsc::channel(
- 5 // xxx should me max_requests_outstanding but that's
- // marked client-only so needs rework
- )).unzip::<_,_,Vec<_>,Vec<_>>();
+ .map(|_ic| {
+ let (web_send, web_recv) = mpsc::channel(
+ 5 // xxx should me max_requests_outstanding but that's
+ // marked client-only so needs rework
+ );
+ let (route_send, route_recv) = mpsc::channel(
+ INTERNAL_QUEUE
+ );
+ ((web_send, route_send), (web_recv, route_recv))
+ }).unzip::<_,_,Vec<_>,Vec<_>>();
let all_clients = izip!(
&ics,
client_handles_send,
- ).map(|(ic, web_send)| {
+ ).map(|(ic, (web_send, route_send))| {
(ic.link.client,
Client {
ic: ic.clone(),
web: web_send,
+ route: route_send,
})
}).collect();
all_clients,
});
- for (ic, web_recv) in izip!(
+ for (ic, (web_recv, route_recv)) in izip!(
ics,
client_handles_recv,
) {
let global_ = global.clone();
let ic_ = ic.clone();
tasks.push((tokio::spawn(async move {
- run_client(global_, ic_, web_recv).await.void_unwrap_err()
+ run_client(global_, ic_, web_recv, route_recv)
+ .await.void_unwrap_err()
}), format!("client {}", &ic)));
}