use std::any::Any;
use std::collections::HashMap;
use std::sync::Arc;
use futures_util::future::BoxFuture;
use tokio::sync::mpsc;
use crate::types::BuildHasher;
pub mod ids {
pub const SERVER_STARTED: &str = "server.started";
pub const SERVER_STOPPED: &str = "server.stopped";
pub const CONNECTION_OPENED: &str = "connection.opened";
pub const CONNECTION_CLOSED: &str = "connection.closed";
pub const REQUEST_STARTED: &str = "request.started";
pub const REQUEST_COMPLETED: &str = "request.completed";
pub const ROUTER_HOT_RELOAD: &str = "router.hot_reload";
pub const RPC_ERROR: &str = "rpc.error";
pub const ROUTE_REQUEST_STARTED: &str = "route.request.started";
pub const ROUTE_REQUEST_COMPLETED: &str = "route.request.completed";
}
pub mod bus {
use async_trait::async_trait;
use super::Signal;
#[async_trait]
pub trait SignalBus: Send + Sync + 'static {
async fn publish(&self, signal: &Signal);
}
#[derive(Clone, Default)]
pub struct LocalBus;
#[async_trait]
impl SignalBus for LocalBus {
async fn publish(&self, _signal: &Signal) {}
}
}
#[derive(Clone, Debug, Default)]
pub struct Signal {
pub id: String,
pub metadata: HashMap<String, String, BuildHasher>,
}
impl Signal {
#[inline]
#[must_use]
pub fn new(id: impl Into<String>) -> Self {
Self {
id: id.into(),
metadata: HashMap::with_hasher(BuildHasher::default()),
}
}
#[inline]
#[must_use]
pub fn with_capacity(id: impl Into<String>, capacity: usize) -> Self {
Self {
id: id.into(),
metadata: HashMap::with_capacity_and_hasher(capacity, BuildHasher::default()),
}
}
#[inline]
pub fn meta(mut self, key: impl Into<String>, value: impl Into<String>) -> Self {
self.metadata.insert(key.into(), value.into());
self
}
#[inline]
#[must_use]
pub fn with_metadata(
id: impl Into<String>,
metadata: HashMap<String, String, BuildHasher>,
) -> Self {
Self {
id: id.into(),
metadata,
}
}
#[inline]
#[must_use]
pub fn from_payload<P: SignalPayload>(payload: &P) -> Self {
Self {
id: payload.id().to_string(),
metadata: payload.to_metadata(),
}
}
}
pub trait SignalPayload {
fn id(&self) -> &'static str;
fn to_metadata(&self) -> HashMap<String, String, BuildHasher>;
}
pub type SignalHandler = Arc<dyn Fn(Signal) -> BoxFuture<'static, ()> + Send + Sync>;
pub type RpcHandler = Arc<
dyn Fn(Arc<dyn Any + Send + Sync>) -> BoxFuture<'static, Arc<dyn Any + Send + Sync>>
+ Send
+ Sync,
>;
pub type SignalExporter = Arc<dyn Fn(&Signal) + Send + Sync>;
pub type SignalStream = mpsc::Receiver<Signal>;
pub const FILTERED_SUBSCRIPTION_BUFFER: usize = 1024;
pub const MAX_BROADCAST_CAPACITY: usize = 1 << 20;