use crate::{pipe2::PipeReceiver, Context, OckamMessage, SystemBuilder};
use ockam_core::compat::sync::Arc;
use ockam_core::{
compat::boxed::Box, Address, AllowAll, Any, Encodable, Mailbox, Mailboxes, Result, Routed,
Worker,
};
use ockam_node::WorkerBuilder;
pub struct PipeListener {
system: SystemBuilder<Context, OckamMessage>,
}
impl PipeListener {
pub fn new(system: SystemBuilder<Context, OckamMessage>) -> Self {
Self { system }
}
}
#[crate::worker]
impl Worker for PipeListener {
type Context = Context;
type Message = OckamMessage;
async fn handle_message(&mut self, ctx: &mut Context, msg: Routed<OckamMessage>) -> Result<()> {
debug!(
"Receiving pipe creation handshake from {}",
msg.return_route()
);
let (init_addr, fin_addr) = (Address::random_local(), Address::random_local());
let mut sys_builder = self.system.clone();
sys_builder.readdress(&fin_addr);
let system = sys_builder.finalise(ctx).await?;
let system_addrs = system.addresses();
let worker = PipeReceiver::new(system, fin_addr.clone(), Some(init_addr.clone()));
let mut additional_mailboxes = vec![
Mailbox::new(init_addr.clone(), Arc::new(AllowAll), Arc::new(AllowAll)),
Mailbox::new(fin_addr, Arc::new(AllowAll), Arc::new(AllowAll)),
];
for addr in system_addrs {
additional_mailboxes.push(Mailbox::new(
addr.clone(),
Arc::new(AllowAll),
Arc::new(AllowAll),
));
}
let mailboxes = Mailboxes::new(
Mailbox::new(
Address::random_local(),
Arc::new(AllowAll),
Arc::new(AllowAll),
),
additional_mailboxes,
);
WorkerBuilder::new(worker)
.with_mailboxes(mailboxes)
.start(ctx)
.await?;
let ockam_msg = OckamMessage::new(Any)?.scope_data(msg.return_route().encode()?);
ctx.send(init_addr, ockam_msg).await?;
Ok(())
}
}