diff --git a/damus.xcodeproj/project.pbxproj b/damus.xcodeproj/project.pbxproj index 2c98aad3..2dc0acf9 100644 --- a/damus.xcodeproj/project.pbxproj +++ b/damus.xcodeproj/project.pbxproj @@ -254,7 +254,6 @@ 4CE6DF0427F7A08200C66700 /* damusUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE6DF0327F7A08200C66700 /* damusUITestsLaunchTests.swift */; }; 4CE6DF1627F8DEBF00C66700 /* RelayConnection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE6DF1527F8DEBF00C66700 /* RelayConnection.swift */; }; 4CE8794829941DA700F758CC /* RelayFilters.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE8794729941DA700F758CC /* RelayFilters.swift */; }; - 4CE8794C2995B59E00F758CC /* RelayMetadatas.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE8794B2995B59E00F758CC /* RelayMetadatas.swift */; }; 4CE8794E2996B16A00F758CC /* RelayToggle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE8794D2996B16A00F758CC /* RelayToggle.swift */; }; 4CE879502996B2BD00F758CC /* RelayStatusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE8794F2996B2BD00F758CC /* RelayStatusView.swift */; }; 4CE879522996B68900F758CC /* RelayType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE879512996B68900F758CC /* RelayType.swift */; }; @@ -726,7 +725,6 @@ 4CE6DF0327F7A08200C66700 /* damusUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = damusUITestsLaunchTests.swift; sourceTree = ""; }; 4CE6DF1527F8DEBF00C66700 /* RelayConnection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RelayConnection.swift; sourceTree = ""; }; 4CE8794729941DA700F758CC /* RelayFilters.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RelayFilters.swift; sourceTree = ""; }; - 4CE8794B2995B59E00F758CC /* RelayMetadatas.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RelayMetadatas.swift; sourceTree = ""; }; 4CE8794D2996B16A00F758CC /* RelayToggle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RelayToggle.swift; sourceTree = ""; }; 4CE8794F2996B2BD00F758CC /* RelayStatusView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RelayStatusView.swift; sourceTree = ""; }; 4CE879512996B68900F758CC /* RelayType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RelayType.swift; sourceTree = ""; }; @@ -1480,7 +1478,6 @@ isa = PBXGroup; children = ( 4CE8794729941DA700F758CC /* RelayFilters.swift */, - 4CE8794B2995B59E00F758CC /* RelayMetadatas.swift */, 504323A82A3495B6006AE6DC /* RelayModelCache.swift */, 4CC6193929DC777C006A86D1 /* RelayBootstrap.swift */, 504323A62A34915F006AE6DC /* RelayModel.swift */, @@ -1778,7 +1775,6 @@ 4C64987C286D03E000EAE2B3 /* DirectMessagesView.swift in Sources */, 7C902AE32981D55B002AB16E /* ZoomableScrollView.swift in Sources */, 4C190F252A547D2000027FD5 /* LoadScript.swift in Sources */, - 4CE8794C2995B59E00F758CC /* RelayMetadatas.swift in Sources */, 4C363A8C28236B92006E126D /* PubkeyView.swift in Sources */, 4CDA128A29E9D10C0006FA5A /* SignalView.swift in Sources */, 4C5C7E68284ED36500A22DF5 /* SearchHomeModel.swift in Sources */, diff --git a/damus/ContentView.swift b/damus/ContentView.swift index ff5d531c..e658ac09 100644 --- a/damus/ContentView.swift +++ b/damus/ContentView.swift @@ -609,7 +609,7 @@ struct ContentView: View { func connect() { let pool = RelayPool() - let metadatas = RelayMetadatas() + let model_cache = RelayModelCache() let relay_filters = RelayFilters(our_pubkey: pubkey) let bootstrap_relays = load_bootstrap_relays(pubkey: pubkey) @@ -617,7 +617,7 @@ struct ContentView: View { for relay in bootstrap_relays { if let url = RelayURL(relay) { let descriptor = RelayDescriptor(url: url, info: .rw) - add_new_relay(relay_filters: relay_filters, metadatas: metadatas, pool: pool, descriptor: descriptor, new_relay_filters: new_relay_filters) + add_new_relay(model_cache: model_cache, relay_filters: relay_filters, pool: pool, descriptor: descriptor, new_relay_filters: new_relay_filters) } } @@ -646,7 +646,7 @@ struct ContentView: View { lnurls: LNUrls(), settings: settings, relay_filters: relay_filters, - relay_metadata: metadatas, + relay_model_cache: model_cache, drafts: Drafts(), events: EventCache(), bookmarks: BookmarksManager(pubkey: pubkey), diff --git a/damus/Models/DamusState.swift b/damus/Models/DamusState.swift index 78e8b27e..c4a6cd02 100644 --- a/damus/Models/DamusState.swift +++ b/damus/Models/DamusState.swift @@ -21,7 +21,7 @@ struct DamusState { let lnurls: LNUrls let settings: UserSettingsStore let relay_filters: RelayFilters - let relay_metadata: RelayMetadatas + let relay_model_cache: RelayModelCache let drafts: Drafts let events: EventCache let bookmarks: BookmarksManager @@ -60,5 +60,5 @@ struct DamusState { static var empty: DamusState { let user_search_cache = UserSearchCache() - return DamusState.init(pool: RelayPool(), keypair: Keypair(pubkey: "", privkey: ""), likes: EventCounter(our_pubkey: ""), boosts: EventCounter(our_pubkey: ""), contacts: Contacts(our_pubkey: ""), profiles: Profiles(user_search_cache: user_search_cache), dms: DirectMessagesModel(our_pubkey: ""), previews: PreviewCache(), zaps: Zaps(our_pubkey: ""), lnurls: LNUrls(), settings: UserSettingsStore(), relay_filters: RelayFilters(our_pubkey: ""), relay_metadata: RelayMetadatas(), drafts: Drafts(), events: EventCache(), bookmarks: BookmarksManager(pubkey: ""), postbox: PostBox(pool: RelayPool()), bootstrap_relays: [], replies: ReplyCounter(our_pubkey: ""), muted_threads: MutedThreadsManager(keypair: Keypair(pubkey: "", privkey: nil)), wallet: WalletModel(settings: UserSettingsStore()), nav: NavigationCoordinator(), user_search_cache: user_search_cache) } + return DamusState.init(pool: RelayPool(), keypair: Keypair(pubkey: "", privkey: ""), likes: EventCounter(our_pubkey: ""), boosts: EventCounter(our_pubkey: ""), contacts: Contacts(our_pubkey: ""), profiles: Profiles(user_search_cache: user_search_cache), dms: DirectMessagesModel(our_pubkey: ""), previews: PreviewCache(), zaps: Zaps(our_pubkey: ""), lnurls: LNUrls(), settings: UserSettingsStore(), relay_filters: RelayFilters(our_pubkey: ""), relay_model_cache: RelayModelCache(), drafts: Drafts(), events: EventCache(), bookmarks: BookmarksManager(pubkey: ""), postbox: PostBox(pool: RelayPool()), bootstrap_relays: [], replies: ReplyCounter(our_pubkey: ""), muted_threads: MutedThreadsManager(keypair: Keypair(pubkey: "", privkey: nil)), wallet: WalletModel(settings: UserSettingsStore()), nav: NavigationCoordinator(), user_search_cache: user_search_cache) } } diff --git a/damus/Models/HomeModel.swift b/damus/Models/HomeModel.swift index 88c824c5..ecd44f48 100644 --- a/damus/Models/HomeModel.swift +++ b/damus/Models/HomeModel.swift @@ -857,7 +857,7 @@ func load_our_relays(state: DamusState, m_old_ev: NostrEvent?, ev: NostrEvent) { if new.contains(d) { if let url = RelayURL(d) { let descriptor = RelayDescriptor(url: url, info: decoded[d] ?? .rw) - add_new_relay(relay_filters: state.relay_filters, metadatas: state.relay_metadata, pool: state.pool, descriptor: descriptor, new_relay_filters: new_relay_filters) + add_new_relay(model_cache: state.relay_model_cache, relay_filters: state.relay_filters, pool: state.pool, descriptor: descriptor, new_relay_filters: new_relay_filters) } } else { state.pool.remove_relay(d) @@ -871,12 +871,12 @@ func load_our_relays(state: DamusState, m_old_ev: NostrEvent?, ev: NostrEvent) { } } -func add_new_relay(relay_filters: RelayFilters, metadatas: RelayMetadatas, pool: RelayPool, descriptor: RelayDescriptor, new_relay_filters: Bool) { +func add_new_relay(model_cache: RelayModelCache, relay_filters: RelayFilters, pool: RelayPool, descriptor: RelayDescriptor, new_relay_filters: Bool) { try? pool.add_relay(descriptor) let url = descriptor.url let relay_id = url.id - guard metadatas.lookup(relay_id: relay_id) == nil else { + guard model_cache.model(withURL: url) == nil else { return } @@ -885,8 +885,10 @@ func add_new_relay(relay_filters: RelayFilters, metadatas: RelayMetadatas, pool: return } - DispatchQueue.main.async { - metadatas.insert(relay_id: relay_id, metadata: meta) + await MainActor.run { + let model = RelayModel(url, metadata: meta) + model_cache.insert(model: model) + pool.setLog(model.log, for: relay_id) // if this is the first time adding filters, we should filter non-paid relays if new_relay_filters && !meta.is_paid { diff --git a/damus/Nostr/RelayPool.swift b/damus/Nostr/RelayPool.swift index 4426fc3d..a2a03a5e 100644 --- a/damus/Nostr/RelayPool.swift +++ b/damus/Nostr/RelayPool.swift @@ -114,8 +114,13 @@ class RelayPool { } let relay = Relay(descriptor: desc, connection: conn) self.relays.append(relay) + } + + func setLog(_ log: RelayLog, for relay_id: String) { + // add the current network state to the log + log.add("Network state: \(network_monitor.currentPath.status)") - relay.connection.log.add("Network state: \(network_monitor.currentPath.status)") + get_relay(relay_id)?.connection.log = log } /// This is used to retry dead connections diff --git a/damus/Util/Relays/RelayMetadatas.swift b/damus/Util/Relays/RelayMetadatas.swift deleted file mode 100644 index 2d2e15ae..00000000 --- a/damus/Util/Relays/RelayMetadatas.swift +++ /dev/null @@ -1,20 +0,0 @@ -// -// RelayMetadatas.swift -// damus -// -// Created by William Casarin on 2023-02-09. -// - -import Foundation - -class RelayMetadatas { - private var metadata: [String: RelayMetadata] = [:] - - func lookup(relay_id: String) -> RelayMetadata? { - return metadata[relay_id] - } - - func insert(relay_id: String, metadata: RelayMetadata) { - self.metadata[relay_id] = metadata - } -} diff --git a/damus/Views/Relays/RecommendedRelayView.swift b/damus/Views/Relays/RecommendedRelayView.swift index 92cf726e..6449ca75 100644 --- a/damus/Views/Relays/RecommendedRelayView.swift +++ b/damus/Views/Relays/RecommendedRelayView.swift @@ -37,11 +37,11 @@ struct RecommendedRelayView: View { } } - RelayType(is_paid: damus.relay_metadata.lookup(relay_id: relay)?.is_paid ?? false) + RelayType(is_paid: damus.relay_model_cache.model(with_relay_id: relay)?.metadata.is_paid ?? false) Text(relay).layoutPriority(1) - if let meta = damus.relay_metadata.lookup(relay_id: relay) { + if let meta = damus.relay_model_cache.model(with_relay_id: relay)?.metadata { NavigationLink(value: Route.RelayDetail(relay: relay, metadata: meta)){ EmptyView() } diff --git a/damus/Views/Relays/RelayToggle.swift b/damus/Views/Relays/RelayToggle.swift index c4d165f7..a70d50ae 100644 --- a/damus/Views/Relays/RelayToggle.swift +++ b/damus/Views/Relays/RelayToggle.swift @@ -29,7 +29,7 @@ struct RelayToggle: View { if let relay_connection { RelayStatusView(connection: relay_connection) } - RelayType(is_paid: state.relay_metadata.lookup(relay_id: relay_id)?.is_paid ?? false) + RelayType(is_paid: state.relay_model_cache.model(with_relay_id: relay_id)?.metadata.is_paid ?? false) Toggle(relay_id, isOn: toggle_binding(relay_id: relay_id)) .toggleStyle(SwitchToggleStyle(tint: .accentColor)) } diff --git a/damus/Views/Relays/RelayView.swift b/damus/Views/Relays/RelayView.swift index 85c855c2..36b49fd2 100644 --- a/damus/Views/Relays/RelayView.swift +++ b/damus/Views/Relays/RelayView.swift @@ -25,9 +25,9 @@ struct RelayView: View { } } - RelayType(is_paid: state.relay_metadata.lookup(relay_id: relay)?.is_paid ?? false) + RelayType(is_paid: state.relay_model_cache.model(with_relay_id: relay)?.metadata.is_paid ?? false) - if let meta = state.relay_metadata.lookup(relay_id: relay) { + if let meta = state.relay_model_cache.model(with_relay_id: relay)?.metadata { Text(relay) .background( NavigationLink(value: Route.RelayDetail(relay: relay, metadata: meta), label: {