upleb.uk

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

summaryrefslogtreecommitdiff
path: root/src/nostr/builder.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/nostr/builder.rs')
-rw-r--r--src/nostr/builder.rs118
1 files changed, 0 insertions, 118 deletions
diff --git a/src/nostr/builder.rs b/src/nostr/builder.rs
index 4c66f6d..aff12a6 100644
--- a/src/nostr/builder.rs
+++ b/src/nostr/builder.rs
@@ -98,24 +98,6 @@ impl Nip34WritePolicy {
98 self.ctx.set_local_relay(relay); 98 self.ctx.set_local_relay(relay);
99 } 99 }
100 100
101 /// Set the repo sync index for relay discovery from user-submitted purgatory announcements.
102 ///
103 /// When a user submits an announcement that goes to purgatory (no git data yet),
104 /// the relay needs to discover and connect to relays listed in the announcement's
105 /// `relays` and `clone` tags. This index is updated when the announcement is accepted
106 /// into purgatory, triggering the sync system to connect and sync state events.
107 pub fn set_repo_sync_index(&self, index: crate::sync::RepoSyncIndex) {
108 self.ctx.set_repo_sync_index(index);
109 }
110
111 /// Set the sync action sender for sending AddFilters actions to SyncManager.
112 ///
113 /// This allows the write policy to notify the SyncManager when user-submitted
114 /// purgatory announcements need relay discovery (triggering new connections).
115 pub fn set_sync_action_tx(&self, tx: tokio::sync::mpsc::Sender<crate::sync::AddFilters>) {
116 self.ctx.set_sync_action_tx(tx);
117 }
118
119 /// Handle repository announcement event 101 /// Handle repository announcement event
120 async fn handle_announcement(&self, event: &Event) -> WritePolicyResult { 102 async fn handle_announcement(&self, event: &Event) -> WritePolicyResult {
121 let event_id_str = event.id.to_bech32().unwrap_or_else(|_| event.id.to_hex()); 103 let event_id_str = event.id.to_bech32().unwrap_or_else(|_| event.id.to_hex());
@@ -164,106 +146,6 @@ impl Nip34WritePolicy {
164 "Accepted announcement to purgatory: {} (waiting for git data)", 146 "Accepted announcement to purgatory: {} (waiting for git data)",
165 event_id_str 147 event_id_str
166 ); 148 );
167
168 // Register in repo_sync_index with StateOnly level so the sync
169 // system discovers and connects to relays listed in this announcement.
170 // This is needed for user-submitted announcements (not via sync path)
171 // to trigger relay discovery and state event sync.
172 if let Some(repo_sync_index) = self.ctx.get_repo_sync_index() {
173 if let Some(identifier) = event.tags.iter().find_map(|tag| {
174 let tag_vec = tag.as_slice();
175 if tag_vec.len() >= 2 && tag_vec[0] == "d" {
176 Some(tag_vec[1].to_string())
177 } else {
178 None
179 }
180 }) {
181 let repo_id =
182 format!("30617:{}:{}", event.pubkey, identifier);
183
184 // Get relay URLs stored in purgatory for this announcement
185 let relays = self
186 .ctx
187 .purgatory
188 .find_announcement(&event.pubkey, &identifier)
189 .map(|entry| entry.relays)
190 .unwrap_or_default();
191
192 if !relays.is_empty() {
193 use crate::sync::{
194 AddFilters, PendingItems, RepoSyncNeeds, SyncLevel,
195 };
196
197 // Update repo_sync_index with StateOnly for this repo
198 let new_repos = {
199 let mut index = repo_sync_index.write().await;
200 let entry =
201 index.entry(repo_id.clone()).or_insert_with(|| {
202 RepoSyncNeeds {
203 relays: std::collections::HashSet::new(),
204 root_events: std::collections::HashSet::new(),
205 sync_level: SyncLevel::StateOnly,
206 }
207 });
208 entry.relays.extend(relays.iter().cloned());
209 // Don't upgrade if already Full
210 tracing::info!(
211 repo_id = %repo_id,
212 relay_count = entry.relays.len(),
213 "Registered user-submitted purgatory announcement in \
214 RepoSyncIndex with StateOnly level for relay discovery"
215 );
216 // Return cloned relays for AddFilters
217 relays.clone()
218 };
219
220 // Send AddFilters to SyncManager so it connects to these relays
221 if let Some(tx) = self.ctx.get_sync_action_tx() {
222 // Build state-only filters for this repo
223 let state_only_repos: std::collections::HashSet<String> =
224 std::iter::once(repo_id.clone()).collect();
225 let filters =
226 crate::sync::filters::build_sync_level_aware_filters(
227 &std::collections::HashSet::new(),
228 &state_only_repos,
229 &std::collections::HashSet::new(),
230 None,
231 );
232
233 for relay_url in new_repos {
234 // Skip our own domain
235 if relay_url.contains(&self.ctx.domain) {
236 continue;
237 }
238 let action = AddFilters {
239 relay_url: relay_url.clone(),
240 items: PendingItems {
241 repos: state_only_repos.clone(),
242 root_events: std::collections::HashSet::new(),
243 },
244 filters: filters.clone(),
245 };
246 if let Err(e) = tx.send(action).await {
247 tracing::warn!(
248 relay = %relay_url,
249 error = %e,
250 "Failed to send AddFilters action for \
251 user-submitted purgatory announcement"
252 );
253 } else {
254 tracing::info!(
255 relay = %relay_url,
256 repo_id = %repo_id,
257 "Sent AddFilters to SyncManager for \
258 user-submitted purgatory announcement relay"
259 );
260 }
261 }
262 }
263 }
264 }
265 }
266
267 WritePolicyResult::Reject { 149 WritePolicyResult::Reject {
268 status: true, // Client sees OK 150 status: true, // Client sees OK
269 message: "purgatory: won't be served until git data arrives".into(), 151 message: "purgatory: won't be served until git data arrives".into(),