diff --git a/Cargo.lock b/Cargo.lock index 642e696..156371a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2335,6 +2335,7 @@ dependencies = [ "rust-embed", "serde", "serde_json", + "serde_urlencoded", "sha2", "subtle", "tempfile", diff --git a/crates/miroir-proxy/Cargo.toml b/crates/miroir-proxy/Cargo.toml index f08d0ac..47c94fe 100644 --- a/crates/miroir-proxy/Cargo.toml +++ b/crates/miroir-proxy/Cargo.toml @@ -58,4 +58,5 @@ testcontainers = "0.23" testcontainers-modules = { version = "0.11", features = ["redis", "meilisearch"] } tempfile = "3" regex = "1" +serde_urlencoded = "0.7" miroir-core = { path = "../miroir-core", features = ["test-helpers"] } diff --git a/crates/miroir-proxy/src/main.rs b/crates/miroir-proxy/src/main.rs index cb93dcc..e0d2a75 100644 --- a/crates/miroir-proxy/src/main.rs +++ b/crates/miroir-proxy/src/main.rs @@ -178,6 +178,7 @@ impl FromRef for admin_endpoints::AppState { mode_a_coordinator: state.admin.mode_a_coordinator.clone(), resharding_registry: state.admin.resharding_registry.clone(), shadow_manager: state.admin.shadow_manager.clone(), + cdc_manager: state.admin.cdc_manager.clone(), } } } @@ -224,18 +225,18 @@ impl FromRef for routes::explain::ExplainState { } } -// Implement FromRef so that miroir_core::cdc::CdcManager can be extracted from UnifiedState -impl FromRef for miroir_core::cdc::CdcManager { +// Implement FromRef so that Arc can be extracted from UnifiedState +impl FromRef for std::sync::Arc { fn from_ref(state: &UnifiedState) -> Self { // Return the CDC manager if it exists, otherwise return a disabled one if let Some(ref cdc) = state.admin.cdc_manager { - cdc.clone() + Arc::clone(cdc) } else { // Create a disabled CDC manager - miroir_core::cdc::CdcManager::new(miroir_core::cdc::CdcConfig { + Arc::new(miroir_core::cdc::CdcManager::new(miroir_core::cdc::CdcConfig { enabled: false, ..Default::default() - }) + })) } } } diff --git a/crates/miroir-proxy/src/routes/admin.rs b/crates/miroir-proxy/src/routes/admin.rs index e42a3e1..4c89e4e 100644 --- a/crates/miroir-proxy/src/routes/admin.rs +++ b/crates/miroir-proxy/src/routes/admin.rs @@ -21,7 +21,7 @@ where aliases::AliasState: FromRef, explain::ExplainState: FromRef, canary::CanaryState: FromRef, - miroir_core::cdc::CdcManager: FromRef, + std::sync::Arc: FromRef, { Router::new() // Admin session endpoints (plan §9, §13.19) diff --git a/crates/miroir-proxy/src/routes/cdc.rs b/crates/miroir-proxy/src/routes/cdc.rs index 7694055..ac826a0 100644 --- a/crates/miroir-proxy/src/routes/cdc.rs +++ b/crates/miroir-proxy/src/routes/cdc.rs @@ -52,10 +52,11 @@ pub async fn get_changes( ) -> Result, StatusCode> where S: Clone + Send + Sync + 'static, - miroir_core::cdc::CdcManager: FromRef, + std::sync::Arc: FromRef, { // Extract CDC manager from state - let cdc_manager = miroir_core::cdc::CdcManager::from_ref(&state); + let cdc_manager_arc = std::sync::Arc::::from_ref(&state); + let cdc_manager = cdc_manager_arc.as_ref(); // Cap limit at 1000 to prevent large responses let limit = params.limit.min(1000);