From e922e14e3ec4b898c111b2100cd63dddbe2fcdb1 Mon Sep 17 00:00:00 2001 From: DanConwayDev Date: Fri, 13 Feb 2026 19:59:36 +0000 Subject: feat: add SyncLevel to sync system for purgatory announcement state-only sync Purgatory announcements need state events (kind 30618) synced from external relays, but not full L2/L3 events (patches, issues, PRs) which would be rejected anyway. This implements the SyncLevel concept from the design doc (decision #6): - Add SyncLevel enum (Full vs StateOnly) to RepoSyncNeeds - When announcement enters purgatory during sync, register in RepoSyncIndex with SyncLevel::StateOnly - Add build_sync_level_aware_filters() that partitions repos by level: StateOnly repos only get state event filters (kind 30618) - Update derive_relay_targets to track state_only_repos separately - Update compute_actions to handle both repo sets - SelfSubscriber always uses SyncLevel::Full (promoted repos) --- src/sync/self_subscriber.rs | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'src/sync/self_subscriber.rs') diff --git a/src/sync/self_subscriber.rs b/src/sync/self_subscriber.rs index 3cc408d..db16c62 100644 --- a/src/sync/self_subscriber.rs +++ b/src/sync/self_subscriber.rs @@ -16,7 +16,7 @@ use nostr_sdk::Timestamp; use tokio::sync::broadcast::error::RecvError; use tokio::sync::{broadcast, mpsc}; -use super::{AddFilters, RepoSyncIndex, RepoSyncNeeds}; +use super::{AddFilters, RepoSyncIndex, RepoSyncNeeds, SyncLevel}; // ============================================================================= // LoopControl - Result of notification processing @@ -58,6 +58,7 @@ impl PendingUpdates { let entry = self.repos.entry(repo_id).or_insert_with(|| RepoSyncNeeds { relays: HashSet::new(), root_events: HashSet::new(), + sync_level: SyncLevel::Full, }); entry.relays.extend(relays); entry.root_events.extend(root_events); @@ -475,6 +476,7 @@ impl SelfSubscriber { .or_insert_with(|| RepoSyncNeeds { relays: HashSet::new(), root_events: HashSet::new(), + sync_level: SyncLevel::Full, }); entry.relays.extend(needs.relays); entry.root_events.extend(needs.root_events); @@ -499,21 +501,26 @@ impl SelfSubscriber { continue; } - // Build filters for these repos - let filters = crate::sync::filters::build_layer2_and_layer3_filters( + // Build filters for these repos (sync-level-aware) + let filters = crate::sync::filters::build_sync_level_aware_filters( &needs.repos, + &needs.state_only_repos, &needs.root_events, None, ); // Log before moving values - let repo_count = needs.repos.len(); + let repo_count = needs.repos.len() + needs.state_only_repos.len(); let event_count = needs.root_events.len(); + // Combine all repos into pending items + let mut all_repos = needs.repos; + all_repos.extend(needs.state_only_repos); + let action = AddFilters { relay_url: relay_url.clone(), items: crate::sync::PendingItems { - repos: needs.repos, + repos: all_repos, root_events: needs.root_events, }, filters, -- cgit v1.2.3