Refactor broker_task::request
This commit is contained in:
parent
1611572c13
commit
6e024a07e6
@ -1,25 +1,27 @@
|
||||
use log::trace;
|
||||
use tokio::{sync::mpsc, task::JoinHandle};
|
||||
use tokio::{sync::mpsc as tmpsc, task::JoinHandle};
|
||||
|
||||
mod error;
|
||||
mod mpsc;
|
||||
mod pub_sub;
|
||||
mod registry;
|
||||
mod request;
|
||||
|
||||
pub(crate) use error::{BrokerError, BrokerResult};
|
||||
use registry::Registry;
|
||||
pub(crate) use request::{
|
||||
AdvertiseRequest, BrokerRequestBox, BrokerRequestSender, ClaimReceiverError,
|
||||
ClaimReceiverRequest, MakeBrokerRequest, SenderRequestNoWait, SenderRequestWait,
|
||||
SubscribeRequest,
|
||||
pub(crate) use mpsc::{
|
||||
ClaimReceiverError, ClaimReceiverRequest, SenderRequestNoWait, SenderRequestWait,
|
||||
};
|
||||
pub(crate) use pub_sub::{AdvertiseRequest, SubscribeRequest};
|
||||
use registry::Registry;
|
||||
pub(crate) use request::{BrokerRequestBox, BrokerRequestSender, MakeBrokerRequest};
|
||||
|
||||
pub(crate) struct BrokerTask {
|
||||
request_rx: mpsc::Receiver<BrokerRequestBox>,
|
||||
request_rx: tmpsc::Receiver<BrokerRequestBox>,
|
||||
}
|
||||
|
||||
impl BrokerTask {
|
||||
pub(crate) fn start() -> (BrokerRequestSender, JoinHandle<()>) {
|
||||
let (request_tx, request_rx) = mpsc::channel(8);
|
||||
let (request_tx, request_rx) = tmpsc::channel(8);
|
||||
|
||||
let broker = BrokerTask { request_rx };
|
||||
let join_handle = tokio::spawn(broker.run());
|
||||
|
94
src/broker_task/mpsc.rs
Normal file
94
src/broker_task/mpsc.rs
Normal file
@ -0,0 +1,94 @@
|
||||
use super::{
|
||||
error::{BrokerError, BrokerResult},
|
||||
registry::{BasicMessageType, Registry},
|
||||
request::{BrokerRequest, BrokerRequestInternal, MakeBrokerRequest, RequestHandler},
|
||||
};
|
||||
|
||||
use crate::{mpsc, Message};
|
||||
|
||||
use std::marker::PhantomData;
|
||||
use tokio::sync::oneshot;
|
||||
|
||||
pub type ClaimReceiverRequest<T> = BrokerRequest<ClaimReceiver<T>>;
|
||||
|
||||
pub enum ClaimReceiverError {
|
||||
AlreadyClaimed,
|
||||
Broker(BrokerError),
|
||||
}
|
||||
|
||||
pub struct ClaimReceiver<T: Message> {
|
||||
msg_type: BasicMessageType<T>,
|
||||
}
|
||||
|
||||
impl<T: Message> Default for ClaimReceiver<T> {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
msg_type: BasicMessageType::<T>::default(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Message> RequestHandler for ClaimReceiver<T> {
|
||||
type Response = Result<mpsc::Receiver<T>, ClaimReceiverError>;
|
||||
|
||||
fn handle(self, registry: &mut Registry) -> Self::Response {
|
||||
registry
|
||||
.get_mpsc_sender::<T>(&self.msg_type)
|
||||
.map_err(ClaimReceiverError::Broker)
|
||||
.and_then(|sender| {
|
||||
sender
|
||||
.claim_receiver()
|
||||
.ok_or(ClaimReceiverError::AlreadyClaimed)
|
||||
})
|
||||
.map(mpsc::Receiver::new)
|
||||
}
|
||||
}
|
||||
|
||||
pub struct SenderRequest<T, W> {
|
||||
msg_type: BasicMessageType<T>,
|
||||
response_tx: oneshot::Sender<BrokerResult<mpsc::Sender<T>>>,
|
||||
_wait: PhantomData<W>,
|
||||
}
|
||||
|
||||
pub trait GetSenderWait: Send {
|
||||
const WAIT: bool;
|
||||
}
|
||||
|
||||
pub struct NoWait;
|
||||
impl GetSenderWait for NoWait {
|
||||
const WAIT: bool = false;
|
||||
}
|
||||
pub type SenderRequestNoWait<T> = SenderRequest<T, NoWait>;
|
||||
|
||||
pub struct Wait;
|
||||
impl GetSenderWait for Wait {
|
||||
const WAIT: bool = true;
|
||||
}
|
||||
pub type SenderRequestWait<T> = SenderRequest<T, Wait>;
|
||||
|
||||
impl<T: Message, W: GetSenderWait> MakeBrokerRequest for SenderRequest<T, W> {
|
||||
type Response = BrokerResult<mpsc::Sender<T>>;
|
||||
|
||||
fn create(response_tx: oneshot::Sender<Self::Response>) -> Box<Self> {
|
||||
Box::new(Self {
|
||||
msg_type: BasicMessageType::default(),
|
||||
response_tx,
|
||||
_wait: PhantomData,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Message, W: GetSenderWait> BrokerRequestInternal for SenderRequest<T, W> {
|
||||
fn run_request(self: Box<Self>, registry: &mut Registry) {
|
||||
let response = match registry.get_mpsc_sender::<T>(&self.msg_type) {
|
||||
Ok(sender) => Ok(if W::WAIT {
|
||||
sender.clone_sender_or_wait(self.response_tx);
|
||||
return;
|
||||
} else {
|
||||
sender.clone_sender()
|
||||
}),
|
||||
Err(err) => Err(err),
|
||||
};
|
||||
let _ = self.response_tx.send(response);
|
||||
}
|
||||
}
|
53
src/broker_task/pub_sub.rs
Normal file
53
src/broker_task/pub_sub.rs
Normal file
@ -0,0 +1,53 @@
|
||||
use super::{
|
||||
error::BrokerResult,
|
||||
registry::{BasicMessageType, Registry},
|
||||
request::{BrokerRequest, RequestHandler},
|
||||
};
|
||||
use crate::{pub_sub, Message};
|
||||
|
||||
pub type SubscribeRequest<T> = BrokerRequest<Subscribe<T>>;
|
||||
pub struct Subscribe<T: Message> {
|
||||
msg_type: BasicMessageType<T>,
|
||||
}
|
||||
|
||||
impl<T: Message> Default for Subscribe<T> {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
msg_type: BasicMessageType::<T>::default(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Message> RequestHandler for Subscribe<T> {
|
||||
type Response = BrokerResult<pub_sub::Subscription<T>>;
|
||||
|
||||
fn handle(self, registry: &mut Registry) -> Self::Response {
|
||||
let sender = registry.get_broadcast_sender::<T>(&self.msg_type);
|
||||
sender.map(|sender| {
|
||||
let receiver = sender.subscribe();
|
||||
pub_sub::Subscription::new(receiver)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
pub type AdvertiseRequest<T> = BrokerRequest<Advertise<T>>;
|
||||
pub struct Advertise<T: Message> {
|
||||
msg_type: BasicMessageType<T>,
|
||||
}
|
||||
|
||||
impl<T: Message> Default for Advertise<T> {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
msg_type: BasicMessageType::<T>::default(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Message> RequestHandler for Advertise<T> {
|
||||
type Response = BrokerResult<pub_sub::Publication<T>>;
|
||||
|
||||
fn handle(self, registry: &mut Registry) -> Self::Response {
|
||||
let sender = registry.get_broadcast_sender::<T>(&self.msg_type);
|
||||
sender.map(|sender| pub_sub::Publication::new(sender.clone()))
|
||||
}
|
||||
}
|
@ -1,11 +1,6 @@
|
||||
use std::marker::PhantomData;
|
||||
use tokio::sync::{mpsc, oneshot};
|
||||
|
||||
use super::{
|
||||
registry::{BasicMessageType, Registry},
|
||||
BrokerError, BrokerResult,
|
||||
};
|
||||
use crate::{Message, Publication, Receiver, Sender, Subscription};
|
||||
use super::registry::Registry;
|
||||
|
||||
pub trait BrokerRequestInternal: Send {
|
||||
fn run_request(self: Box<Self>, registry: &mut Registry);
|
||||
@ -53,134 +48,3 @@ impl<H: RequestHandler + Default> MakeBrokerRequest for BrokerRequest<H> {
|
||||
|
||||
pub type BrokerRequestBox = Box<dyn BrokerRequestInternal>;
|
||||
pub type BrokerRequestSender = mpsc::Sender<BrokerRequestBox>;
|
||||
|
||||
pub type SubscribeRequest<T> = BrokerRequest<Subscribe<T>>;
|
||||
pub struct Subscribe<T: Message> {
|
||||
msg_type: BasicMessageType<T>,
|
||||
}
|
||||
|
||||
impl<T: Message> Default for Subscribe<T> {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
msg_type: BasicMessageType::<T>::default(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Message> RequestHandler for Subscribe<T> {
|
||||
type Response = BrokerResult<Subscription<T>>;
|
||||
|
||||
fn handle(self, registry: &mut Registry) -> Self::Response {
|
||||
let sender = registry.get_broadcast_sender::<T>(&self.msg_type);
|
||||
sender.map(|sender| {
|
||||
let receiver = sender.subscribe();
|
||||
Subscription::new(receiver)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
pub type AdvertiseRequest<T> = BrokerRequest<Advertise<T>>;
|
||||
pub struct Advertise<T: Message> {
|
||||
msg_type: BasicMessageType<T>,
|
||||
}
|
||||
|
||||
impl<T: Message> Default for Advertise<T> {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
msg_type: BasicMessageType::<T>::default(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Message> RequestHandler for Advertise<T> {
|
||||
type Response = BrokerResult<Publication<T>>;
|
||||
|
||||
fn handle(self, registry: &mut Registry) -> Self::Response {
|
||||
let sender = registry.get_broadcast_sender::<T>(&self.msg_type);
|
||||
sender.map(|sender| Publication::new(sender.clone()))
|
||||
}
|
||||
}
|
||||
|
||||
pub type ClaimReceiverRequest<T> = BrokerRequest<ClaimReceiver<T>>;
|
||||
|
||||
pub enum ClaimReceiverError {
|
||||
AlreadyClaimed,
|
||||
Broker(BrokerError),
|
||||
}
|
||||
|
||||
pub struct ClaimReceiver<T: Message> {
|
||||
msg_type: BasicMessageType<T>,
|
||||
}
|
||||
|
||||
impl<T: Message> Default for ClaimReceiver<T> {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
msg_type: BasicMessageType::<T>::default(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Message> RequestHandler for ClaimReceiver<T> {
|
||||
type Response = Result<Receiver<T>, ClaimReceiverError>;
|
||||
|
||||
fn handle(self, registry: &mut Registry) -> Self::Response {
|
||||
registry
|
||||
.get_mpsc_sender::<T>(&self.msg_type)
|
||||
.map_err(ClaimReceiverError::Broker)
|
||||
.and_then(|sender| {
|
||||
sender
|
||||
.claim_receiver()
|
||||
.ok_or(ClaimReceiverError::AlreadyClaimed)
|
||||
})
|
||||
.map(Receiver::new)
|
||||
}
|
||||
}
|
||||
|
||||
pub struct SenderRequest<T, W> {
|
||||
msg_type: BasicMessageType<T>,
|
||||
response_tx: oneshot::Sender<BrokerResult<Sender<T>>>,
|
||||
_wait: PhantomData<W>,
|
||||
}
|
||||
|
||||
pub trait GetSenderWait: Send {
|
||||
const WAIT: bool;
|
||||
}
|
||||
|
||||
pub struct NoWait;
|
||||
impl GetSenderWait for NoWait {
|
||||
const WAIT: bool = false;
|
||||
}
|
||||
pub type SenderRequestNoWait<T> = SenderRequest<T, NoWait>;
|
||||
|
||||
pub struct Wait;
|
||||
impl GetSenderWait for Wait {
|
||||
const WAIT: bool = true;
|
||||
}
|
||||
pub type SenderRequestWait<T> = SenderRequest<T, Wait>;
|
||||
|
||||
impl<T: Message, W: GetSenderWait> MakeBrokerRequest for SenderRequest<T, W> {
|
||||
type Response = BrokerResult<Sender<T>>;
|
||||
|
||||
fn create(response_tx: oneshot::Sender<Self::Response>) -> Box<Self> {
|
||||
Box::new(Self {
|
||||
msg_type: BasicMessageType::default(),
|
||||
response_tx,
|
||||
_wait: PhantomData,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Message, W: GetSenderWait> BrokerRequestInternal for SenderRequest<T, W> {
|
||||
fn run_request(self: Box<Self>, registry: &mut Registry) {
|
||||
let response = match registry.get_mpsc_sender::<T>(&self.msg_type) {
|
||||
Ok(sender) => Ok(if W::WAIT {
|
||||
sender.clone_sender_or_wait(self.response_tx);
|
||||
return;
|
||||
} else {
|
||||
sender.clone_sender()
|
||||
}),
|
||||
Err(err) => Err(err),
|
||||
};
|
||||
let _ = self.response_tx.send(response);
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user