upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
authorDanConwayDev <DanConwayDev@protonmail.com>2025-12-24 08:02:12 +0000
committerDanConwayDev <DanConwayDev@protonmail.com>2025-12-24 11:54:18 +0000
commit70d0197e85ae4ef85202781f6d2dc9e76bd508b3 (patch)
tree45efb6565e81ba755acc5955e68d5b7119d1e122 /src/main.rs
parentf8c3e3920ed2a1bdaab30be912276993449a5476 (diff)
feat(purgatory): add broken purgatory implementation
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs61
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 @@
1use std::sync::Arc; 1use std::sync::Arc;
2use std::time::Duration;
2 3
3use anyhow::Result; 4use anyhow::Result;
5use tokio::signal;
4use tracing::{info, Level}; 6use tracing::{info, Level};
5use tracing_subscriber::FmtSubscriber; 7use tracing_subscriber::FmtSubscriber;
6 8
7use ngit_grasp::{ 9use 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(())