diff --git a/src/api/handlers.rs b/src/api/handlers.rs index 662c348..00c400d 100644 --- a/src/api/handlers.rs +++ b/src/api/handlers.rs @@ -304,19 +304,6 @@ pub async fn register_meter( })) } -#[derive(Deserialize)] -pub struct RotateKeyRequest { - pub meter_id: String, - pub new_public_key_hex: String, - pub old_signature_hex: String, -} - -#[derive(Serialize)] -pub struct RotateKeyResponse { - pub meter_id: String, - pub status: String, -} - pub async fn rotate_key( Json(body): Json, ) -> Result, StatusCode> { @@ -345,6 +332,19 @@ pub async fn rotate_key( })) } +#[derive(Deserialize)] +pub struct RotateKeyRequest { + pub meter_id: String, + pub new_public_key_hex: String, + pub old_signature_hex: String, +} + +#[derive(Serialize)] +pub struct RotateKeyResponse { + pub meter_id: String, + pub status: String, +} + #[derive(Serialize)] pub struct RateLimiterStatusResponse { pub top_sources: Vec<(String, u64)>, diff --git a/src/api/middleware.rs b/src/api/middleware.rs index 67027f4..60a8f0f 100644 --- a/src/api/middleware.rs +++ b/src/api/middleware.rs @@ -1,7 +1,6 @@ use axum::{ body::Body, - extract::ConnectInfo, - extract::State, + extract::{ConnectInfo, State}, http::{Request, StatusCode}, middleware::Next, response::Response, @@ -12,7 +11,7 @@ use std::collections::VecDeque; use std::net::SocketAddr; use std::sync::atomic::{AtomicU64, Ordering}; use std::sync::Arc; -use tokio::time::{Duration, Instant}; +use std::time::{Duration, Instant}; use tracing::warn; lazy_static::lazy_static! { @@ -24,10 +23,10 @@ fn now_ns() -> u64 { } pub struct TokenBucket { - tokens: AtomicU64, - max_tokens: u64, + pub(crate) tokens: AtomicU64, + pub(crate) max_tokens: u64, pub(crate) refill_rate: u64, - last_refill_ns: AtomicU64, + pub(crate) last_refill_ns: AtomicU64, } impl TokenBucket { @@ -129,12 +128,12 @@ pub struct FraudContext { } pub struct DynamicRateLimiter { - global_bucket: TokenBucket, - per_source_buckets: DashMap>, - sliding_windows: DashMap>>, - fraud_contexts: DashMap>>, - rejection_counts: DashMap, - last_accessed: DashMap, + pub(crate) global_bucket: TokenBucket, + pub(crate) per_source_buckets: DashMap>, + pub(crate) sliding_windows: DashMap>>, + pub(crate) fraud_contexts: DashMap>>, + pub(crate) rejection_counts: DashMap, + pub(crate) last_accessed: DashMap, } impl DynamicRateLimiter { diff --git a/src/api/router.rs b/src/api/router.rs index ecd6669..25bdc16 100644 --- a/src/api/router.rs +++ b/src/api/router.rs @@ -32,10 +32,6 @@ pub async fn build_router(state: AppState) -> anyhow::Result { .route("/api/v1/meters/rotate-key", post(handlers::rotate_key)) .route("/api/v1/nonce/status", get(handlers::nonce_status)) .route("/api/v1/gateway/locks", get(handlers::list_gateway_locks)) - .route( - "/api/v1/rate-limiter/status", - get(handlers::rate_limiter_status), - ) .route("/metrics", get(handlers::metrics_handler)) .route("/debug/clock_state", get(handlers::clock_state)) .route( @@ -46,6 +42,10 @@ pub async fn build_router(state: AppState) -> anyhow::Result { "/api/v1/database/compression/status", get(handlers::compression_status), ) + .route( + "/api/v1/rate-limiter/status", + get(handlers::rate_limiter_status), + ) .layer(axum_mw::from_fn_with_state( state.clone(), crate::api::middleware::rate_limit_layer, diff --git a/src/main.rs b/src/main.rs index 6c4f85a..caeeeaf 100644 --- a/src/main.rs +++ b/src/main.rs @@ -53,6 +53,7 @@ async fn main() -> anyhow::Result<()> { let advisory_lock = Arc::new(AdvisoryLock::postgres(db_pool.clone())); let rate_limiter = DynamicRateLimiter::new(); + let state = AppState { sequencer, db_pool,