upleb.uk

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

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDanConwayDev <DanConwayDev@protonmail.com>2025-12-22 17:22:25 +0000
committerDanConwayDev <DanConwayDev@protonmail.com>2025-12-22 20:21:26 +0000
commit5d3d96c7f0397a079384b7291ff21df76029b126 (patch)
tree9bb558649611409b8612899776a865dd8232f783
parent777509bb03f5233b3ef470329d23cec371baf53c (diff)
accept all UserGraspList for better discovery
-rw-r--r--README.md6
-rw-r--r--src/nostr/builder.rs12
-rw-r--r--src/nostr/events.rs3
-rw-r--r--src/sync/filters.rs4
-rw-r--r--src/sync/self_subscriber.rs3
5 files changed, 25 insertions, 3 deletions
diff --git a/README.md b/README.md
index ec1584c..3cc1adf 100644
--- a/README.md
+++ b/README.md
@@ -134,7 +134,11 @@ This a useful feature of other git servers.
134 134
135### Store all user grasp lists (for better grasp discovery) 135### Store all user grasp lists (for better grasp discovery)
136 136
137do this. should we also accept (and weekly sync) 10002 and 0 for all authors of accepted events? 137✅ **Implemented**: Kind 10317 (User Grasp List) events are now accepted and synced from all relays for better GRASP repository discovery.
138
139**Future enhancement**: We aspire to also accept and weekly sync kind 10002 (user relay lists) and kind 0 (user metadata) events, but only for authors of accepted events. This would require an additional state-driven layer 2 filter (see Roadmap in GRASP-02 Proactive Sync documentation).
140
141**Future enhancement**: should we periodically scan relays in UserGraspLists to check for announcements that list our relay?
138 142
139## Technology Stack 143## Technology Stack
140 144
diff --git a/src/nostr/builder.rs b/src/nostr/builder.rs
index c9bd1e1..84d8ab4 100644
--- a/src/nostr/builder.rs
+++ b/src/nostr/builder.rs
@@ -13,7 +13,7 @@ use nostr_relay_builder::prelude::*;
13use crate::config::{Config, DatabaseBackend}; 13use crate::config::{Config, DatabaseBackend};
14use crate::nostr::events::{ 14use crate::nostr::events::{
15 RepositoryAnnouncement, RepositoryState, KIND_PR, KIND_PR_UPDATE, KIND_REPOSITORY_ANNOUNCEMENT, 15 RepositoryAnnouncement, RepositoryState, KIND_PR, KIND_PR_UPDATE, KIND_REPOSITORY_ANNOUNCEMENT,
16 KIND_REPOSITORY_STATE, 16 KIND_REPOSITORY_STATE, KIND_USER_GRASP_LIST,
17}; 17};
18use crate::nostr::policy::{ 18use crate::nostr::policy::{
19 AnnouncementPolicy, AnnouncementResult, PolicyContext, PrEventPolicy, ReferenceResult, 19 AnnouncementPolicy, AnnouncementResult, PolicyContext, PrEventPolicy, ReferenceResult,
@@ -257,6 +257,16 @@ impl WritePolicy for Nip34WritePolicy {
257 KIND_REPOSITORY_ANNOUNCEMENT => self.handle_announcement(event).await, 257 KIND_REPOSITORY_ANNOUNCEMENT => self.handle_announcement(event).await,
258 KIND_REPOSITORY_STATE => self.handle_state(event).await, 258 KIND_REPOSITORY_STATE => self.handle_state(event).await,
259 KIND_PR | KIND_PR_UPDATE => self.handle_pr_event(event).await, 259 KIND_PR | KIND_PR_UPDATE => self.handle_pr_event(event).await,
260 KIND_USER_GRASP_LIST => {
261 // Accept all kind 10317 (User Grasp List) events
262 // for better GRASP repository discovery
263 tracing::debug!(
264 event_id = %event.id.to_bech32().unwrap_or_else(|_| event.id.to_hex()),
265 author = %event.pubkey.to_hex(),
266 "Accepted kind 10317 user grasp list"
267 );
268 PolicyResult::Accept
269 }
260 _ => self.handle_related_event(event, "Event").await, 270 _ => self.handle_related_event(event, "Event").await,
261 } 271 }
262 }) 272 })
diff --git a/src/nostr/events.rs b/src/nostr/events.rs
index 050bfdd..1fcb75e 100644
--- a/src/nostr/events.rs
+++ b/src/nostr/events.rs
@@ -21,6 +21,9 @@ pub const KIND_PR: u16 = 1618;
21/// NIP-34 Pull Request Update (kind 1619) - has `c` tag for commit 21/// NIP-34 Pull Request Update (kind 1619) - has `c` tag for commit
22pub const KIND_PR_UPDATE: u16 = 1619; 22pub const KIND_PR_UPDATE: u16 = 1619;
23 23
24/// User Grasp List (kind 10317) - user's personal list of GRASP repositories
25pub const KIND_USER_GRASP_LIST: u16 = 10317;
26
24/// Repository announcement details extracted from NIP-34 event 27/// Repository announcement details extracted from NIP-34 event
25#[derive(Debug, Clone)] 28#[derive(Debug, Clone)]
26pub struct RepositoryAnnouncement { 29pub struct RepositoryAnnouncement {
diff --git a/src/sync/filters.rs b/src/sync/filters.rs
index 963fa02..dddc49c 100644
--- a/src/sync/filters.rs
+++ b/src/sync/filters.rs
@@ -13,14 +13,16 @@ use std::collections::HashSet;
13 13
14use nostr_sdk::prelude::*; 14use nostr_sdk::prelude::*;
15 15
16/// Layer 1: Announcements filter (kinds 30617 + 30618) 16/// Layer 1: Announcements filter (kinds 30617 + 30618 + 10317)
17/// 17///
18/// Subscribed ONCE on connect - NOT included in consolidation rebuilds. 18/// Subscribed ONCE on connect - NOT included in consolidation rebuilds.
19/// Note: 30618 is ONLY synced from remote relays, not self-subscribed. 19/// Note: 30618 is ONLY synced from remote relays, not self-subscribed.
20/// Note: 10317 (User Grasp List) is synced for better GRASP discovery.
20pub fn build_announcement_filter(since: Option<Timestamp>) -> Filter { 21pub fn build_announcement_filter(since: Option<Timestamp>) -> Filter {
21 let filter = Filter::new().kinds([ 22 let filter = Filter::new().kinds([
22 Kind::Custom(30617), // Repository announcements 23 Kind::Custom(30617), // Repository announcements
23 Kind::Custom(30618), // Maintainer lists 24 Kind::Custom(30618), // Maintainer lists
25 Kind::Custom(10317), // User Grasp List
24 ]); 26 ]);
25 27
26 match since { 28 match since {
diff --git a/src/sync/self_subscriber.rs b/src/sync/self_subscriber.rs
index 9643fc0..09e3b56 100644
--- a/src/sync/self_subscriber.rs
+++ b/src/sync/self_subscriber.rs
@@ -285,6 +285,7 @@ impl SelfSubscriber {
285 285
286 // Subscribe to announcement and root event kinds 286 // Subscribe to announcement and root event kinds
287 // Per v4 spec: 30617, 1617, 1618, 1621 (NOT 30618) 287 // Per v4 spec: 30617, 1617, 1618, 1621 (NOT 30618)
288 // Plus kind 10317 (User Grasp List) for GRASP discovery
288 // Check if we have a last_connected time for reconnect filtering 289 // Check if we have a last_connected time for reconnect filtering
289 let filter = if let Some(last) = self.last_connected { 290 let filter = if let Some(last) = self.last_connected {
290 // Quick reconnect - use since filter (15 min buffer) 291 // Quick reconnect - use since filter (15 min buffer)
@@ -299,6 +300,7 @@ impl SelfSubscriber {
299 Kind::Custom(1617), // Patches 300 Kind::Custom(1617), // Patches
300 Kind::Custom(1621), // Issues 301 Kind::Custom(1621), // Issues
301 Kind::Custom(1618), // Pull Requests 302 Kind::Custom(1618), // Pull Requests
303 Kind::Custom(10317), // User Grasp List
302 ]) 304 ])
303 .since(since) 305 .since(since)
304 } else { 306 } else {
@@ -308,6 +310,7 @@ impl SelfSubscriber {
308 Kind::Custom(1617), // Patches 310 Kind::Custom(1617), // Patches
309 Kind::Custom(1621), // Issues 311 Kind::Custom(1621), // Issues
310 Kind::Custom(1618), // Pull Requests 312 Kind::Custom(1618), // Pull Requests
313 Kind::Custom(10317), // User Grasp List
311 ]) 314 ])
312 }; 315 };
313 316