More BrokerTask refactor
This commit is contained in:
parent
ba3104ec6f
commit
92e1739f90
@ -9,8 +9,20 @@ use tokio::sync::{broadcast, mpsc, oneshot};
|
|||||||
|
|
||||||
use crate::{message::Message, publication::Publication, subscription::Subscription};
|
use crate::{message::Message, publication::Publication, subscription::Subscription};
|
||||||
|
|
||||||
|
pub enum BrokerError {
|
||||||
|
MismatchedType,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub type BrokerResult<T> = Result<T, BrokerError>;
|
||||||
|
|
||||||
pub type ErasedSender = Box<dyn Any + Send + Sync>;
|
pub type ErasedSender = Box<dyn Any + Send + Sync>;
|
||||||
|
|
||||||
|
fn downcast_sender_ref<T: Message>(erased: &ErasedSender) -> BrokerResult<&broadcast::Sender<T>> {
|
||||||
|
(**erased)
|
||||||
|
.downcast_ref::<broadcast::Sender<T>>()
|
||||||
|
.ok_or(BrokerError::MismatchedType)
|
||||||
|
}
|
||||||
|
|
||||||
pub trait MessageType {
|
pub trait MessageType {
|
||||||
fn message_type_id(&self) -> TypeId;
|
fn message_type_id(&self) -> TypeId;
|
||||||
|
|
||||||
@ -58,7 +70,7 @@ pub trait SubscribeRequest {
|
|||||||
|
|
||||||
/// `sender` must be `tokio::sync::broadcast::Sender<T>` where
|
/// `sender` must be `tokio::sync::broadcast::Sender<T>` where
|
||||||
/// `MessageType::get_message_type` returns the `TypeId` of `T`.
|
/// `MessageType::get_message_type` returns the `TypeId` of `T`.
|
||||||
unsafe fn send_subscribe_response(self: Box<Self>, sender: &ErasedSender);
|
fn send_subscribe_response(self: Box<Self>, sender: &ErasedSender);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub type SubscribeRequestBox = Box<dyn SubscribeRequest + Send + Sync>;
|
pub type SubscribeRequestBox = Box<dyn SubscribeRequest + Send + Sync>;
|
||||||
@ -66,7 +78,7 @@ pub type SubscribeRequestSender = mpsc::Sender<SubscribeRequestBox>;
|
|||||||
|
|
||||||
pub struct BasicSubscribeRequest<T> {
|
pub struct BasicSubscribeRequest<T> {
|
||||||
msg_type: BasicMessageType<T>,
|
msg_type: BasicMessageType<T>,
|
||||||
response_tx: oneshot::Sender<Subscription<T>>,
|
response_tx: oneshot::Sender<BrokerResult<Subscription<T>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: Message> SubscribeRequest for BasicSubscribeRequest<T> {
|
impl<T: Message> SubscribeRequest for BasicSubscribeRequest<T> {
|
||||||
@ -74,17 +86,17 @@ impl<T: Message> SubscribeRequest for BasicSubscribeRequest<T> {
|
|||||||
&self.msg_type
|
&self.msg_type
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn send_subscribe_response(self: Box<Self>, sender: &ErasedSender) {
|
fn send_subscribe_response(self: Box<Self>, sender: &ErasedSender) {
|
||||||
let sender = &*(&**sender as *const dyn Any as *const broadcast::Sender<T>);
|
let subscription = downcast_sender_ref::<T>(sender).map(|sender| {
|
||||||
// let sender = (**sender).downcast_ref::<broadcast::Sender<T>>().unwrap();
|
let receiver = sender.subscribe();
|
||||||
let receiver = sender.subscribe();
|
Subscription::new(receiver)
|
||||||
let subscription = Subscription::new(receiver);
|
});
|
||||||
let _ = self.response_tx.send(subscription);
|
let _ = self.response_tx.send(subscription);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: Message> BasicSubscribeRequest<T> {
|
impl<T: Message> BasicSubscribeRequest<T> {
|
||||||
pub(crate) fn new() -> (Self, oneshot::Receiver<Subscription<T>>) {
|
pub(crate) fn new() -> (Self, oneshot::Receiver<BrokerResult<Subscription<T>>>) {
|
||||||
let (response_tx, response_rx) = oneshot::channel();
|
let (response_tx, response_rx) = oneshot::channel();
|
||||||
(
|
(
|
||||||
Self {
|
Self {
|
||||||
@ -101,7 +113,7 @@ pub trait AdvertiseRequest {
|
|||||||
|
|
||||||
/// `sender` must be `tokio::sync::broadcast::Sender<T>` where
|
/// `sender` must be `tokio::sync::broadcast::Sender<T>` where
|
||||||
/// `MessageType::get_message_type` returns the `TypeId` of `T`.
|
/// `MessageType::get_message_type` returns the `TypeId` of `T`.
|
||||||
unsafe fn send_advertise_response(self: Box<Self>, sender: &ErasedSender);
|
fn send_advertise_response(self: Box<Self>, sender: &ErasedSender);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub type AdvertiseRequestBox = Box<dyn AdvertiseRequest + Send + Sync>;
|
pub type AdvertiseRequestBox = Box<dyn AdvertiseRequest + Send + Sync>;
|
||||||
@ -109,7 +121,7 @@ pub type AdvertiseRequestSender = mpsc::Sender<AdvertiseRequestBox>;
|
|||||||
|
|
||||||
pub struct BasicAdvertiseRequest<T> {
|
pub struct BasicAdvertiseRequest<T> {
|
||||||
msg_type: BasicMessageType<T>,
|
msg_type: BasicMessageType<T>,
|
||||||
response_tx: oneshot::Sender<Publication<T>>,
|
response_tx: oneshot::Sender<BrokerResult<Publication<T>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: Message> AdvertiseRequest for BasicAdvertiseRequest<T> {
|
impl<T: Message> AdvertiseRequest for BasicAdvertiseRequest<T> {
|
||||||
@ -117,16 +129,15 @@ impl<T: Message> AdvertiseRequest for BasicAdvertiseRequest<T> {
|
|||||||
&self.msg_type
|
&self.msg_type
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn send_advertise_response(self: Box<Self>, sender: &ErasedSender) {
|
fn send_advertise_response(self: Box<Self>, sender: &ErasedSender) {
|
||||||
let sender = &*(&**sender as *const dyn Any as *const broadcast::Sender<T>);
|
let publication =
|
||||||
// let sender = (**sender).downcast_ref::<broadcast::Sender<T>>().unwrap();
|
downcast_sender_ref::<T>(sender).map(|sender| Publication::new(sender.clone()));
|
||||||
let publication = Publication::new(sender.clone());
|
|
||||||
let _ = self.response_tx.send(publication);
|
let _ = self.response_tx.send(publication);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: Message> BasicAdvertiseRequest<T> {
|
impl<T: Message> BasicAdvertiseRequest<T> {
|
||||||
pub(crate) fn new() -> (Self, oneshot::Receiver<Publication<T>>) {
|
pub(crate) fn new() -> (Self, oneshot::Receiver<BrokerResult<Publication<T>>>) {
|
||||||
let (response_tx, response_rx) = oneshot::channel();
|
let (response_tx, response_rx) = oneshot::channel();
|
||||||
(
|
(
|
||||||
Self {
|
Self {
|
||||||
@ -173,12 +184,12 @@ impl Registry {
|
|||||||
|
|
||||||
fn handle_subscribe(&mut self, subscribe_request: SubscribeRequestBox) {
|
fn handle_subscribe(&mut self, subscribe_request: SubscribeRequestBox) {
|
||||||
let sender = self.get_sender_for_type(subscribe_request.message_type());
|
let sender = self.get_sender_for_type(subscribe_request.message_type());
|
||||||
unsafe { subscribe_request.send_subscribe_response(sender) }
|
subscribe_request.send_subscribe_response(sender)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_advertise(&mut self, advertise_request: AdvertiseRequestBox) {
|
fn handle_advertise(&mut self, advertise_request: AdvertiseRequestBox) {
|
||||||
let sender = self.get_sender_for_type(advertise_request.message_type());
|
let sender = self.get_sender_for_type(advertise_request.message_type());
|
||||||
unsafe { advertise_request.send_advertise_response(sender) }
|
advertise_request.send_advertise_response(sender)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
29
src/lib.rs
29
src/lib.rs
@ -4,21 +4,40 @@ mod publication;
|
|||||||
mod subscription;
|
mod subscription;
|
||||||
|
|
||||||
use broker_task::{
|
use broker_task::{
|
||||||
AdvertiseRequestSender, BasicAdvertiseRequest, BasicSubscribeRequest, BrokerTask,
|
AdvertiseRequestSender, BasicAdvertiseRequest, BasicSubscribeRequest, BrokerError,
|
||||||
SubscribeRequestSender,
|
BrokerResult, BrokerTask, SubscribeRequestSender,
|
||||||
};
|
};
|
||||||
pub use message::Message;
|
pub use message::Message;
|
||||||
pub use publication::{Publication, PublishError};
|
pub use publication::{Publication, PublishError};
|
||||||
pub use subscription::{Subscription, SubscriptionError};
|
pub use subscription::{Subscription, SubscriptionError};
|
||||||
|
|
||||||
use futures::executor::block_on;
|
use futures::executor::block_on;
|
||||||
use tokio::sync::mpsc;
|
use tokio::sync::{mpsc, oneshot};
|
||||||
|
|
||||||
#[derive(Clone, Debug, PartialEq)]
|
#[derive(Clone, Debug, PartialEq)]
|
||||||
#[non_exhaustive]
|
#[non_exhaustive]
|
||||||
pub enum OrsbError {
|
pub enum OrsbError {
|
||||||
BrokerClosed,
|
BrokerClosed,
|
||||||
NoResponse,
|
NoResponse,
|
||||||
|
MismatchedType,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<BrokerError> for OrsbError {
|
||||||
|
fn from(err: BrokerError) -> Self {
|
||||||
|
match err {
|
||||||
|
BrokerError::MismatchedType => OrsbError::MismatchedType,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn map_broker_response<T>(
|
||||||
|
result: Result<BrokerResult<T>, oneshot::error::RecvError>,
|
||||||
|
) -> Result<T, OrsbError> {
|
||||||
|
match result {
|
||||||
|
Ok(Ok(value)) => Ok(value),
|
||||||
|
Ok(Err(err)) => Err(err.into()),
|
||||||
|
Err(_) => Err(OrsbError::NoResponse),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
@ -56,7 +75,7 @@ impl Orsb {
|
|||||||
.send(Box::new(subscribe_request))
|
.send(Box::new(subscribe_request))
|
||||||
.await
|
.await
|
||||||
.or(Err(OrsbError::BrokerClosed))?;
|
.or(Err(OrsbError::BrokerClosed))?;
|
||||||
response_rx.await.or(Err(OrsbError::NoResponse))
|
map_broker_response(response_rx.await)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn advertise<T: Message>(&mut self) -> Result<Publication<T>, OrsbError> {
|
pub async fn advertise<T: Message>(&mut self) -> Result<Publication<T>, OrsbError> {
|
||||||
@ -65,7 +84,7 @@ impl Orsb {
|
|||||||
.send(Box::new(advertise_request))
|
.send(Box::new(advertise_request))
|
||||||
.await
|
.await
|
||||||
.or(Err(OrsbError::BrokerClosed))?;
|
.or(Err(OrsbError::BrokerClosed))?;
|
||||||
response_rx.await.or(Err(OrsbError::NoResponse))
|
map_broker_response(response_rx.await)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn subscribe_blocking<T: Message>(&mut self) -> Result<Subscription<T>, OrsbError> {
|
pub fn subscribe_blocking<T: Message>(&mut self) -> Result<Subscription<T>, OrsbError> {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user