use crate::Body;
pub use axum::middleware::{self, from_fn, from_fn_with_state};
pub type Next = middleware::Next<Body>;
pub use tower_http as tower;
pub mod limit {
use std::time::Duration;
pub use ::tower::limit::{ConcurrencyLimit, RateLimit};
use ::tower::limit::{
ConcurrencyLimitLayer as OriginalConcurrencyLimitLayer,
GlobalConcurrencyLimitLayer as OriginalGlobalConcurrencyLimitLayer,
RateLimitLayer as OriginalRateLimitLayer,
};
use tower_http::add_extension::{AddExtension, AddExtensionLayer};
#[derive(Debug, Clone)]
pub struct RateLimitLayer(AddExtensionLayer<OriginalRateLimitLayer>);
#[derive(Debug, Clone)]
pub struct ConcurrencyLimitLayer(AddExtensionLayer<OriginalConcurrencyLimitLayer>);
#[derive(Debug, Clone)]
pub struct GlobalConcurrencyLimitLayer(AddExtensionLayer<OriginalGlobalConcurrencyLimitLayer>);
impl RateLimitLayer {
pub fn new(limit: u64, per: Duration) -> Self {
Self(AddExtensionLayer::new(OriginalRateLimitLayer::new(
limit, per,
)))
}
}
impl<S> tower_layer::Layer<S> for RateLimitLayer {
type Service = AddExtension<S, OriginalRateLimitLayer>;
fn layer(&self, service: S) -> Self::Service {
self.0.layer(service)
}
}
impl ConcurrencyLimitLayer {
pub fn new(max: usize) -> Self {
Self(AddExtensionLayer::new(OriginalConcurrencyLimitLayer::new(
max,
)))
}
}
impl<S> tower_layer::Layer<S> for ConcurrencyLimitLayer {
type Service = AddExtension<S, OriginalConcurrencyLimitLayer>;
fn layer(&self, service: S) -> Self::Service {
self.0.layer(service)
}
}
impl GlobalConcurrencyLimitLayer {
pub fn new(max: usize) -> Self {
Self(AddExtensionLayer::new(
OriginalGlobalConcurrencyLimitLayer::new(max),
))
}
}
impl<S> tower_layer::Layer<S> for GlobalConcurrencyLimitLayer {
type Service = AddExtension<S, OriginalGlobalConcurrencyLimitLayer>;
fn layer(&self, service: S) -> Self::Service {
self.0.layer(service)
}
}
}