wicked-waifus-rs/wicked-waifus-network/src/server.rs

37 lines
1.1 KiB
Rust

use tokio::sync::mpsc;
use zeromq::{PullSocket, Socket, SocketRecv, ZmqError};
use crate::{config::ServiceEndPoint, ServiceMessage};
pub struct ServiceListener {
receiver: mpsc::Receiver<ServiceMessage>,
}
impl ServiceListener {
pub async fn bind(end_point: &ServiceEndPoint) -> Result<Self, ZmqError> {
let mut socket = PullSocket::new();
socket.bind(&end_point.addr).await?;
let (tx, rx) = mpsc::channel(32);
tokio::spawn(async move { Self::recv_task_fn(socket, tx).await });
Ok(Self { receiver: rx })
}
pub async fn receive(&mut self) -> Option<ServiceMessage> {
self.receiver.recv().await
}
async fn recv_task_fn(mut socket: PullSocket, sender: mpsc::Sender<ServiceMessage>) {
loop {
let data = socket.recv().await.unwrap();
for message in data
.into_vec()
.into_iter()
.flat_map(|b| ServiceMessage::decode(b.as_ref()))
{
let _ = sender.send(message).await;
}
}
}
}