Optimize HomeModel subscription usage
This reduces the overall subscription usage throughout the app, thus reducing issues associated with too many subscriptions being used at once, and the resulting staleness. Signed-off-by: Daniel D’Aquino <daniel@daquino.me>
This commit is contained in:
@@ -66,9 +66,8 @@ class HomeModel: ContactsDelegate, ObservableObject {
|
|||||||
var should_debounce_dms = true
|
var should_debounce_dms = true
|
||||||
|
|
||||||
var homeHandlerTask: Task<Void, Never>?
|
var homeHandlerTask: Task<Void, Never>?
|
||||||
var contactsHandlerTask: Task<Void, Never>?
|
|
||||||
var notificationsHandlerTask: Task<Void, Never>?
|
var notificationsHandlerTask: Task<Void, Never>?
|
||||||
var dmsHandlerTask: Task<Void, Never>?
|
var generalHandlerTask: Task<Void, Never>?
|
||||||
var nwcHandlerTask: Task<Void, Never>?
|
var nwcHandlerTask: Task<Void, Never>?
|
||||||
|
|
||||||
@Published var loading: Bool = true
|
@Published var loading: Bool = true
|
||||||
@@ -454,8 +453,8 @@ class HomeModel: ContactsDelegate, ObservableObject {
|
|||||||
let id = UUID()
|
let id = UUID()
|
||||||
Log.info("Initial filter task started with ID %s", for: .homeModel, id.uuidString)
|
Log.info("Initial filter task started with ID %s", for: .homeModel, id.uuidString)
|
||||||
let filter = NostrFilter(kinds: [.contacts], limit: 1, authors: [damus_state.pubkey])
|
let filter = NostrFilter(kinds: [.contacts], limit: 1, authors: [damus_state.pubkey])
|
||||||
for await event in damus_state.nostrNetwork.reader.streamIndefinitely(filters: [filter]) {
|
for await event in damus_state.nostrNetwork.reader.streamExistingEvents(filters: [filter]) {
|
||||||
await event.justUseACopy({ await process_event(ev: $0, context: .initialContactList) })
|
await event.justUseACopy({ await process_event(ev: $0, context: .other) })
|
||||||
if !done_init {
|
if !done_init {
|
||||||
done_init = true
|
done_init = true
|
||||||
Log.info("Initial filter task %s: Done initialization; Elapsed time: %.2f seconds", for: .homeModel, id.uuidString, CFAbsoluteTimeGetCurrent() - startTime)
|
Log.info("Initial filter task %s: Done initialization; Elapsed time: %.2f seconds", for: .homeModel, id.uuidString, CFAbsoluteTimeGetCurrent() - startTime)
|
||||||
@@ -464,13 +463,6 @@ class HomeModel: ContactsDelegate, ObservableObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Task {
|
|
||||||
let relayListFilter = NostrFilter(kinds: [.relay_list], limit: 1, authors: [damus_state.pubkey])
|
|
||||||
for await event in damus_state.nostrNetwork.reader.streamIndefinitely(filters: [relayListFilter]) {
|
|
||||||
await event.justUseACopy({ await process_event(ev: $0, context: .initialRelayList) })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// After initial connection or reconnect, send subscription filters for the home timeline, DMs, and notifications
|
/// After initial connection or reconnect, send subscription filters for the home timeline, DMs, and notifications
|
||||||
@@ -517,36 +509,31 @@ class HomeModel: ContactsDelegate, ObservableObject {
|
|||||||
|
|
||||||
var notifications_filters = [notifications_filter]
|
var notifications_filters = [notifications_filter]
|
||||||
let contacts_filter_chunks = contacts_filter.chunked(on: .authors, into: MAX_CONTACTS_ON_FILTER)
|
let contacts_filter_chunks = contacts_filter.chunked(on: .authors, into: MAX_CONTACTS_ON_FILTER)
|
||||||
var contacts_filters = contacts_filter_chunks + [our_contacts_filter, our_blocklist_filter, our_old_blocklist_filter]
|
var contacts_filters = [our_contacts_filter, our_blocklist_filter, our_old_blocklist_filter] + contacts_filter_chunks
|
||||||
var dms_filters = [dms_filter, our_dms_filter]
|
var dms_filters = [dms_filter, our_dms_filter]
|
||||||
|
|
||||||
//print_filters(relay_id: relay_id, filters: [home_filters, contacts_filters, notifications_filters, dms_filters])
|
//print_filters(relay_id: relay_id, filters: [home_filters, contacts_filters, notifications_filters, dms_filters])
|
||||||
|
|
||||||
subscribe_to_home_filters()
|
subscribe_to_home_filters()
|
||||||
|
|
||||||
|
|
||||||
self.contactsHandlerTask?.cancel()
|
|
||||||
self.contactsHandlerTask = Task {
|
|
||||||
for await event in damus_state.nostrNetwork.reader.streamIndefinitely(filters: contacts_filters) {
|
|
||||||
await event.justUseACopy({ await process_event(ev: $0, context: .contacts) })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
self.notificationsHandlerTask?.cancel()
|
self.notificationsHandlerTask?.cancel()
|
||||||
self.notificationsHandlerTask = Task {
|
self.notificationsHandlerTask = Task {
|
||||||
for await event in damus_state.nostrNetwork.reader.streamIndefinitely(filters: notifications_filters) {
|
for await event in damus_state.nostrNetwork.reader.streamIndefinitely(filters: notifications_filters) {
|
||||||
await event.justUseACopy({ await process_event(ev: $0, context: .notifications) })
|
await event.justUseACopy({ await process_event(ev: $0, context: .notifications) })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
self.dmsHandlerTask?.cancel()
|
self.generalHandlerTask?.cancel()
|
||||||
self.dmsHandlerTask = Task {
|
self.generalHandlerTask = Task {
|
||||||
for await item in damus_state.nostrNetwork.reader.advancedStream(filters: dms_filters) {
|
for await item in damus_state.nostrNetwork.reader.advancedStream(filters: dms_filters + contacts_filters) {
|
||||||
switch item {
|
switch item {
|
||||||
case .event(let lender):
|
case .event(let lender):
|
||||||
await lender.justUseACopy({ await process_event(ev: $0, context: .dms) })
|
await lender.justUseACopy({ await process_event(ev: $0, context: .other) })
|
||||||
case .eose:
|
case .eose:
|
||||||
var dms = dms.dms.flatMap { $0.events }
|
var dms = dms.dms.flatMap { $0.events }
|
||||||
dms.append(contentsOf: incoming_dms)
|
dms.append(contentsOf: incoming_dms)
|
||||||
case .ndbEose: break
|
case .ndbEose:
|
||||||
|
var dms = dms.dms.flatMap { $0.events }
|
||||||
|
dms.append(contentsOf: incoming_dms)
|
||||||
case .networkEose: break
|
case .networkEose: break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -560,7 +547,7 @@ class HomeModel: ContactsDelegate, ObservableObject {
|
|||||||
filter.authors = [nwc.pubkey]
|
filter.authors = [nwc.pubkey]
|
||||||
filter.limit = 0
|
filter.limit = 0
|
||||||
for await event in damus_state.nostrNetwork.reader.streamIndefinitely(filters: [filter], to: [nwc.relay]) {
|
for await event in damus_state.nostrNetwork.reader.streamIndefinitely(filters: [filter], to: [nwc.relay]) {
|
||||||
await event.justUseACopy({ await process_event(ev: $0, context: .nwc) })
|
await event.justUseACopy({ await process_event(ev: $0, context: .other) })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -647,13 +634,9 @@ class HomeModel: ContactsDelegate, ObservableObject {
|
|||||||
|
|
||||||
/// Adapter pattern to make migration easier
|
/// Adapter pattern to make migration easier
|
||||||
enum SubscriptionContext {
|
enum SubscriptionContext {
|
||||||
case initialContactList
|
|
||||||
case initialRelayList
|
|
||||||
case home
|
case home
|
||||||
case notifications
|
case notifications
|
||||||
case dms
|
case other
|
||||||
case contacts
|
|
||||||
case nwc
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@MainActor
|
@MainActor
|
||||||
@@ -780,7 +763,7 @@ class HomeModel: ContactsDelegate, ObservableObject {
|
|||||||
Task { await insert_home_event(ev) }
|
Task { await insert_home_event(ev) }
|
||||||
case .notifications:
|
case .notifications:
|
||||||
handle_notification(ev: ev)
|
handle_notification(ev: ev)
|
||||||
case .dms, .contacts, .initialRelayList, .initialContactList, .nwc:
|
case .other:
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user