diff options
| author | DanConwayDev <DanConwayDev@protonmail.com> | 2025-12-24 08:02:12 +0000 |
|---|---|---|
| committer | DanConwayDev <DanConwayDev@protonmail.com> | 2025-12-24 11:54:18 +0000 |
| commit | 70d0197e85ae4ef85202781f6d2dc9e76bd508b3 (patch) | |
| tree | 45efb6565e81ba755acc5955e68d5b7119d1e122 /src/main.rs | |
| parent | f8c3e3920ed2a1bdaab30be912276993449a5476 (diff) | |
feat(purgatory): add broken purgatory implementation
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 61 |
1 files changed, 58 insertions, 3 deletions
diff --git a/src/main.rs b/src/main.rs index ddb198e..e39c1ab 100644 --- a/src/main.rs +++ b/src/main.rs | |||
| @@ -1,14 +1,17 @@ | |||
| 1 | use std::sync::Arc; | 1 | use std::sync::Arc; |
| 2 | use std::time::Duration; | ||
| 2 | 3 | ||
| 3 | use anyhow::Result; | 4 | use anyhow::Result; |
| 5 | use tokio::signal; | ||
| 4 | use tracing::{info, Level}; | 6 | use tracing::{info, Level}; |
| 5 | use tracing_subscriber::FmtSubscriber; | 7 | use tracing_subscriber::FmtSubscriber; |
| 6 | 8 | ||
| 7 | use ngit_grasp::{ | 9 | use ngit_grasp::{ |
| 8 | config::{Config, DatabaseBackend}, | 10 | config::{Config, DatabaseBackend}, |
| 9 | http, | 11 | git, http, |
| 10 | metrics::Metrics, | 12 | metrics::Metrics, |
| 11 | nostr, | 13 | nostr, |
| 14 | purgatory::Purgatory, | ||
| 12 | sync::SyncManager, | 15 | sync::SyncManager, |
| 13 | }; | 16 | }; |
| 14 | 17 | ||
| @@ -45,9 +48,13 @@ async fn main() -> Result<()> { | |||
| 45 | None | 48 | None |
| 46 | }; | 49 | }; |
| 47 | 50 | ||
| 51 | // Create purgatory for event/git coordination | ||
| 52 | let purgatory = Arc::new(Purgatory::new()); | ||
| 53 | info!("Purgatory initialized for event coordination"); | ||
| 54 | |||
| 48 | // Create Nostr relay with NIP-34 validation | 55 | // Create Nostr relay with NIP-34 validation |
| 49 | // Returns both the relay and database for direct queries in handlers | 56 | // Returns both the relay and database for direct queries in handlers |
| 50 | if let Ok(relay_with_db) = nostr::builder::create_relay(&config).await { | 57 | if let Ok(relay_with_db) = nostr::builder::create_relay(&config, purgatory.clone()).await { |
| 51 | info!( | 58 | info!( |
| 52 | "Relay created with NIP-34 validation for domain: {}", | 59 | "Relay created with NIP-34 validation for domain: {}", |
| 53 | config.domain | 60 | config.domain |
| @@ -79,9 +86,57 @@ async fn main() -> Result<()> { | |||
| 79 | sync_manager.run().await; | 86 | sync_manager.run().await; |
| 80 | }); | 87 | }); |
| 81 | 88 | ||
| 89 | // Spawn background cleanup task | ||
| 90 | let cleanup_purgatory = purgatory.clone(); | ||
| 91 | tokio::spawn(async move { | ||
| 92 | let mut interval = tokio::time::interval(Duration::from_secs(60)); | ||
| 93 | loop { | ||
| 94 | interval.tick().await; | ||
| 95 | let (state_removed, pr_removed) = cleanup_purgatory.cleanup(); | ||
| 96 | if state_removed > 0 || pr_removed > 0 { | ||
| 97 | info!( | ||
| 98 | "Purgatory cleanup: removed {} state events, {} PR events", | ||
| 99 | state_removed, pr_removed | ||
| 100 | ); | ||
| 101 | } | ||
| 102 | } | ||
| 103 | }); | ||
| 104 | info!("Purgatory cleanup task started (60s interval)"); | ||
| 105 | |||
| 106 | // Setup shutdown handler for purgatory cleanup | ||
| 107 | let shutdown_purgatory = purgatory.clone(); | ||
| 108 | let git_data_path = config.effective_git_data_path(); | ||
| 109 | |||
| 82 | // Start HTTP server with integrated relay and database | 110 | // Start HTTP server with integrated relay and database |
| 83 | info!("Starting HTTP server on {}", config.bind_address); | 111 | info!("Starting HTTP server on {}", config.bind_address); |
| 84 | http::run_server(config, relay_with_db.relay, relay_with_db.database, metrics).await?; | 112 | |
| 113 | // Run server until shutdown signal, then cleanup | ||
| 114 | tokio::select! { | ||
| 115 | result = http::run_server( | ||
| 116 | config, | ||
| 117 | relay_with_db.relay, | ||
| 118 | relay_with_db.database, | ||
| 119 | metrics, | ||
| 120 | purgatory, | ||
| 121 | ) => { | ||
| 122 | if let Err(e) = result { | ||
| 123 | return Err(e); | ||
| 124 | } | ||
| 125 | } | ||
| 126 | _ = signal::ctrl_c() => { | ||
| 127 | info!("Received shutdown signal, cleaning up..."); | ||
| 128 | } | ||
| 129 | } | ||
| 130 | |||
| 131 | // Cleanup placeholder refs on shutdown | ||
| 132 | let placeholder_ids = shutdown_purgatory.get_placeholder_event_ids(); | ||
| 133 | if !placeholder_ids.is_empty() { | ||
| 134 | info!( | ||
| 135 | "Cleaning up {} placeholder refs/nostr/ refs on shutdown", | ||
| 136 | placeholder_ids.len() | ||
| 137 | ); | ||
| 138 | git::cleanup_placeholder_refs(&git_data_path, &placeholder_ids); | ||
| 139 | } | ||
| 85 | } | 140 | } |
| 86 | 141 | ||
| 87 | Ok(()) | 142 | Ok(()) |