feat: integrate nostrdb relay indexing

- Upgrade `nostrdb` to v0.6.1 with relay metadata support
- Switch to `nostr::RelayUrl` for typed relay URLs
- Use `process_event_with()` to pass relay info during ingestion
- Update `Relay`, `RelayPool`, and unknown ID logic accordingly

This enables richer indexing with relay provenance in events.

Signed-off-by: William Casarin <jb55@jb55.com>
This commit is contained in:
William Casarin
2025-03-21 16:17:32 -07:00
parent a7f34a9dc7
commit 26b58683b8
12 changed files with 52 additions and 25 deletions

View File

@@ -299,13 +299,23 @@ fn process_message(damus: &mut Damus, ctx: &mut AppContext<'_>, relay: &str, msg
match relay {
PoolRelay::Websocket(_) => {
//info!("processing event {}", event);
if let Err(err) = ctx.ndb.process_event(ev) {
if let Err(err) = ctx.ndb.process_event_with(
ev,
nostrdb::IngestMetadata::new()
.client(false)
.relay(relay.url()),
) {
error!("error processing event {ev}: {err}");
}
}
PoolRelay::Multicast(_) => {
// multicast events are client events
if let Err(err) = ctx.ndb.process_client_event(ev) {
if let Err(err) = ctx.ndb.process_event_with(
ev,
nostrdb::IngestMetadata::new()
.client(true)
.relay(relay.url()),
) {
error!("error processing multicast event {ev}: {err}");
}
}

View File

@@ -119,7 +119,10 @@ impl ProfileAction {
ProfileAction::SaveChanges(changes) => {
let raw_msg = format!("[\"EVENT\",{}]", changes.to_note().json().unwrap());
let _ = ndb.process_client_event(raw_msg.as_str());
let _ = ndb.process_event_with(
raw_msg.as_str(),
nostrdb::IngestMetadata::new().client(true),
);
let _ = state_map.remove_entry(&changes.kp.pubkey);
info!("sending {}", raw_msg);

View File

@@ -456,11 +456,14 @@ impl TimelineKind {
.limit(default_limit())
.build()]),
TimelineKind::Hashtag(hashtag) => FilterState::ready(vec![Filter::new()
.kinds([1])
.limit(filter::default_limit())
.tags([hashtag.to_lowercase()], 't')
.build()]),
TimelineKind::Hashtag(hashtag) => {
let url: &str = &hashtag.to_lowercase();
FilterState::ready(vec![Filter::new()
.kinds([1])
.limit(filter::default_limit())
.tags([url], 't')
.build()])
}
TimelineKind::Algo(algo_timeline) => match algo_timeline {
AlgoTimeline::LastPerPubkey(list_k) => match list_k {

View File

@@ -244,10 +244,12 @@ impl Timeline {
}
pub fn hashtag(hashtag: String) -> Self {
let hashtag = hashtag.to_lowercase();
let htag: &str = &hashtag;
let filter = Filter::new()
.kinds([1])
.limit(filter::default_limit())
.tags([hashtag.to_lowercase()], 't')
.tags([htag], 't')
.build();
Timeline::new(