Improve NostrNetworkManager interfaces
This commit improves NostrNetworkManager interfaces to be easier to use, and with more options on how to read data from the Nostr network This reduces the amount of duplicate logic in handling streams, and also prevents possible common mistakes when using the standard subscribe method. This fixes an issue with the mute list manager (which prompted for this interface improvement, as the root cause is similar to other similar issues). Closes: https://github.com/damus-io/damus/issues/3221 Signed-off-by: Daniel D’Aquino <daniel@daquino.me>
This commit is contained in:
@@ -53,13 +53,8 @@ class SearchHomeModel: ObservableObject {
|
||||
|
||||
outerLoop: for await item in damus_state.nostrNetwork.reader.subscribe(filters: [get_base_filter(), follow_list_filter], to: to_relays) {
|
||||
switch item {
|
||||
case .event(let borrow):
|
||||
var event: NostrEvent? = nil
|
||||
try? borrow { ev in
|
||||
event = ev.toOwned()
|
||||
}
|
||||
guard let event else { return }
|
||||
await self.handleEvent(event)
|
||||
case .event(let lender):
|
||||
await lender.justUseACopy({ await self.handleEvent($0) })
|
||||
case .eose:
|
||||
break outerLoop
|
||||
}
|
||||
@@ -136,15 +131,12 @@ func load_profiles<Y>(context: String, load: PubkeysToLoad, damus_state: DamusSt
|
||||
for await item in damus_state.nostrNetwork.reader.subscribe(filters: [filter]) {
|
||||
let now = UInt64(Date.now.timeIntervalSince1970)
|
||||
switch item {
|
||||
case .event(let borrow):
|
||||
var event: NostrEvent? = nil
|
||||
try? borrow { ev in
|
||||
event = ev.toOwned()
|
||||
}
|
||||
guard let event else { return }
|
||||
if event.known_kind == .metadata {
|
||||
damus_state.ndb.write_profile_last_fetched(pubkey: event.pubkey, fetched_at: now)
|
||||
}
|
||||
case .event(let lender):
|
||||
lender.justUseACopy({ event in
|
||||
if event.known_kind == .metadata {
|
||||
damus_state.ndb.write_profile_last_fetched(pubkey: event.pubkey, fetched_at: now)
|
||||
}
|
||||
})
|
||||
case .eose:
|
||||
break
|
||||
}
|
||||
|
||||
@@ -47,20 +47,13 @@ class SearchModel: ObservableObject {
|
||||
}
|
||||
print("subscribing to search")
|
||||
try Task.checkCancellation()
|
||||
outerLoop: for await item in await state.nostrNetwork.reader.subscribe(filters: [search]) {
|
||||
try Task.checkCancellation()
|
||||
switch item {
|
||||
case .event(let borrow):
|
||||
try? borrow { ev in
|
||||
let event = ev.toOwned()
|
||||
if event.is_textlike && event.should_show_event {
|
||||
Task { await self.add_event(event) }
|
||||
}
|
||||
}
|
||||
case .eose:
|
||||
break outerLoop
|
||||
let events = await state.nostrNetwork.reader.query(filters: [search])
|
||||
for event in events {
|
||||
if event.is_textlike && event.should_show_event {
|
||||
await self.add_event(event)
|
||||
}
|
||||
}
|
||||
|
||||
guard let txn = NdbTxn(ndb: state.ndb) else { return }
|
||||
try Task.checkCancellation()
|
||||
load_profiles(context: "search", load: .from_events(self.events.all_events), damus_state: state, txn: txn)
|
||||
|
||||
@@ -78,7 +78,7 @@ struct SearchingEventView: View {
|
||||
|
||||
case .event(let note_id):
|
||||
Task {
|
||||
let res = await state.nostrNetwork.findEvent(query: .event(evid: note_id))
|
||||
let res = await state.nostrNetwork.reader.findEvent(query: .event(evid: note_id))
|
||||
guard case .event(let ev) = res else {
|
||||
self.search_state = .not_found
|
||||
return
|
||||
@@ -87,7 +87,7 @@ struct SearchingEventView: View {
|
||||
}
|
||||
case .profile(let pubkey):
|
||||
Task {
|
||||
let res = await state.nostrNetwork.findEvent(query: .profile(pubkey: pubkey))
|
||||
let res = await state.nostrNetwork.reader.findEvent(query: .profile(pubkey: pubkey))
|
||||
guard case .profile(let pubkey) = res else {
|
||||
self.search_state = .not_found
|
||||
return
|
||||
@@ -96,7 +96,7 @@ struct SearchingEventView: View {
|
||||
}
|
||||
case .naddr(let naddr):
|
||||
Task {
|
||||
let res = await state.nostrNetwork.lookup(naddr: naddr)
|
||||
let res = await state.nostrNetwork.reader.lookup(naddr: naddr)
|
||||
guard let res = res else {
|
||||
self.search_state = .not_found
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user