damus

nostr ios client
git clone git://jb55.com/damus
Log | Files | Refs | README | LICENSE

commit 5b3fac70ede4d940c587a575e0f4869f9322159a
parent 53e3f6d86b52a51a84d0744e4b26e7153096e9fe
Author: Daniel D’Aquino <daniel@daquino.me>
Date:   Mon, 24 Mar 2025 19:45:14 -0300

Organize RelayPool namespace

This is a non-functional refactor that organizes some classes and
structs used by RelayPool under the same namespace.

Signed-off-by: Daniel D’Aquino <daniel@daquino.me>

Diffstat:
Mdamus/ContentView.swift | 2+-
Mdamus/Models/Contacts+.swift | 10+++++-----
Mdamus/Models/DamusState.swift | 2+-
Mdamus/Models/HomeModel.swift | 4++--
Mdamus/Nostr/NostrAuth.swift | 2+-
Mdamus/Nostr/NostrEvent+.swift | 2+-
Mdamus/Nostr/Relay.swift | 98++++++++++++++++++++++++++++++++++++++++++-------------------------------------
Mdamus/Nostr/RelayPool.swift | 2+-
Mdamus/Views/AddRelayView.swift | 4++--
Mdamus/Views/RelayFilterView.swift | 2+-
Mdamus/Views/Relays/RelayConfigView.swift | 10+++++-----
Mdamus/Views/Relays/RelayDetailView.swift | 2+-
MdamusTests/AuthIntegrationTests.swift | 4++--
MdamusTests/RequestTests.swift | 5++---
Mnostrscript/NostrScript.swift | 2+-
15 files changed, 78 insertions(+), 73 deletions(-)

diff --git a/damus/ContentView.swift b/damus/ContentView.swift @@ -669,7 +669,7 @@ struct ContentView: View { let new_relay_filters = load_relay_filters(pubkey) == nil for relay in bootstrap_relays { - let descriptor = RelayDescriptor(url: relay, info: .rw) + let descriptor = RelayPool.RelayDescriptor(url: relay, info: .rw) add_new_relay(model_cache: model_cache, relay_filters: relay_filters, pool: pool, descriptor: descriptor, new_relay_filters: new_relay_filters, logging_enabled: settings.developer_mode) } diff --git a/damus/Models/Contacts+.swift b/damus/Models/Contacts+.swift @@ -67,7 +67,7 @@ func decode_json_relays(_ content: String) -> [RelayURL: LegacyKind3RelayRWConfi return decode_json(content) } -func remove_relay(ev: NostrEvent, current_relays: [RelayDescriptor], keypair: FullKeypair, relay: RelayURL) -> NostrEvent?{ +func remove_relay(ev: NostrEvent, current_relays: [RelayPool.RelayDescriptor], keypair: FullKeypair, relay: RelayURL) -> NostrEvent?{ var relays = ensure_relay_info(relays: current_relays, content: ev.content) relays.removeValue(forKey: relay) @@ -80,7 +80,7 @@ func remove_relay(ev: NostrEvent, current_relays: [RelayDescriptor], keypair: Fu } /// Handles the creation of a new `kind:3` contact list based on a previous contact list, with the specified relays -func add_relay(ev: NostrEvent, keypair: FullKeypair, current_relays: [RelayDescriptor], relay: RelayURL, info: LegacyKind3RelayRWConfiguration) -> NostrEvent? { +func add_relay(ev: NostrEvent, keypair: FullKeypair, current_relays: [RelayPool.RelayDescriptor], relay: RelayURL, info: LegacyKind3RelayRWConfiguration) -> NostrEvent? { var relays = ensure_relay_info(relays: current_relays, content: ev.content) // If kind:3 content is empty, or if the relay doesn't exist in the list, @@ -98,7 +98,7 @@ func add_relay(ev: NostrEvent, keypair: FullKeypair, current_relays: [RelayDescr return NostrEvent(content: content, keypair: keypair.to_keypair(), kind: 3, tags: ev.tags.strings()) } -func ensure_relay_info(relays: [RelayDescriptor], content: String) -> [RelayURL: LegacyKind3RelayRWConfiguration] { +func ensure_relay_info(relays: [RelayPool.RelayDescriptor], content: String) -> [RelayURL: LegacyKind3RelayRWConfiguration] { return decode_json_relays(content) ?? make_contact_relays(relays) } @@ -129,13 +129,13 @@ func follow_with_existing_contacts(keypair: FullKeypair, our_contacts: NostrEven return NostrEvent(content: our_contacts.content, keypair: keypair.to_keypair(), kind: kind, tags: tags) } -func make_contact_relays(_ relays: [RelayDescriptor]) -> [RelayURL: LegacyKind3RelayRWConfiguration] { +func make_contact_relays(_ relays: [RelayPool.RelayDescriptor]) -> [RelayURL: LegacyKind3RelayRWConfiguration] { return relays.reduce(into: [:]) { acc, relay in acc[relay.url] = relay.info } } -func make_relay_metadata(relays: [RelayDescriptor], keypair: FullKeypair) -> NostrEvent? { +func make_relay_metadata(relays: [RelayPool.RelayDescriptor], keypair: FullKeypair) -> NostrEvent? { let tags = relays.compactMap { r -> [String]? in var tag = ["r", r.url.absoluteString] if (r.info.read ?? true) != (r.info.write ?? true) { diff --git a/damus/Models/DamusState.swift b/damus/Models/DamusState.swift @@ -107,7 +107,7 @@ class DamusState: HeadlessDamusState { let new_relay_filters = load_relay_filters(pubkey) == nil for relay in bootstrap_relays { - let descriptor = RelayDescriptor(url: relay, info: .rw) + let descriptor = RelayPool.RelayDescriptor(url: relay, info: .rw) add_new_relay(model_cache: model_cache, relay_filters: relay_filters, pool: pool, descriptor: descriptor, new_relay_filters: new_relay_filters, logging_enabled: settings.developer_mode) } diff --git a/damus/Models/HomeModel.swift b/damus/Models/HomeModel.swift @@ -984,7 +984,7 @@ func load_our_relays(state: DamusState, m_old_ev: NostrEvent?, ev: NostrEvent) { for d in diff { changed = true if new.contains(d) { - let descriptor = RelayDescriptor(url: d, info: decoded[d] ?? .rw) + let descriptor = RelayPool.RelayDescriptor(url: d, info: decoded[d] ?? .rw) 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, logging_enabled: state.settings.developer_mode) } else { state.pool.remove_relay(d) @@ -998,7 +998,7 @@ func load_our_relays(state: DamusState, m_old_ev: NostrEvent?, ev: NostrEvent) { } } -func add_new_relay(model_cache: RelayModelCache, relay_filters: RelayFilters, pool: RelayPool, descriptor: RelayDescriptor, new_relay_filters: Bool, logging_enabled: Bool) { +func add_new_relay(model_cache: RelayModelCache, relay_filters: RelayFilters, pool: RelayPool, descriptor: RelayPool.RelayDescriptor, new_relay_filters: Bool, logging_enabled: Bool) { try? pool.add_relay(descriptor) let url = descriptor.url diff --git a/damus/Nostr/NostrAuth.swift b/damus/Nostr/NostrAuth.swift @@ -7,7 +7,7 @@ import Foundation -func make_auth_request(keypair: FullKeypair, challenge_string: String, relay: Relay) -> NostrEvent? { +func make_auth_request(keypair: FullKeypair, challenge_string: String, relay: RelayPool.Relay) -> NostrEvent? { let tags: [[String]] = [["relay", relay.descriptor.url.absoluteString],["challenge", challenge_string]] let event = NostrEvent(content: "", keypair: keypair.to_keypair(), kind: 22242, tags: tags) return event diff --git a/damus/Nostr/NostrEvent+.swift b/damus/Nostr/NostrEvent+.swift @@ -7,7 +7,7 @@ import Foundation -func make_zap_request_event(keypair: FullKeypair, content: String, relays: [RelayDescriptor], target: ZapTarget, zap_type: ZapType) -> MakeZapRequest? { +func make_zap_request_event(keypair: FullKeypair, content: String, relays: [RelayPool.RelayDescriptor], target: ZapTarget, zap_type: ZapType) -> MakeZapRequest? { var tags = zap_target_to_tags(target) var relay_tag = ["relays"] relay_tag.append(contentsOf: relays.map { $0.url.absoluteString }) diff --git a/damus/Nostr/Relay.swift b/damus/Nostr/Relay.swift @@ -25,30 +25,33 @@ enum RelayVariant { case nwc } -public struct RelayDescriptor { - let url: RelayURL - let info: LegacyKind3RelayRWConfiguration - let variant: RelayVariant - - init(url: RelayURL, info: LegacyKind3RelayRWConfiguration, variant: RelayVariant = .regular) { - self.url = url - self.info = info - self.variant = variant - } - - var ephemeral: Bool { - switch variant { - case .regular: - return false - case .ephemeral: - return true - case .nwc: - return true +extension RelayPool { + /// Describes a relay for use in `RelayPool` + public struct RelayDescriptor { + let url: RelayURL + var info: LegacyKind3RelayRWConfiguration + let variant: RelayVariant + + init(url: RelayURL, info: LegacyKind3RelayRWConfiguration, variant: RelayVariant = .regular) { + self.url = url + self.info = info + self.variant = variant + } + + var ephemeral: Bool { + switch variant { + case .regular: + return false + case .ephemeral: + return true + case .nwc: + return true + } + } + + static func nwc(url: RelayURL) -> RelayDescriptor { + return RelayDescriptor(url: url, info: .rw, variant: .nwc) } - } - - static func nwc(url: RelayURL) -> RelayDescriptor { - return RelayDescriptor(url: url, info: .rw, variant: .nwc) } } @@ -129,30 +132,33 @@ struct RelayMetadata: Codable { } } -class Relay: Identifiable { - let descriptor: RelayDescriptor - let connection: RelayConnection - var authentication_state: RelayAuthenticationState - - var flags: Int - - init(descriptor: RelayDescriptor, connection: RelayConnection) { - self.flags = 0 - self.descriptor = descriptor - self.connection = connection - self.authentication_state = RelayAuthenticationState.none - } - - var is_broken: Bool { - return (flags & RelayFlags.broken.rawValue) == RelayFlags.broken.rawValue - } - - var id: RelayURL { - return descriptor.url +extension RelayPool { + class Relay: Identifiable { + var descriptor: RelayDescriptor + let connection: RelayConnection + var authentication_state: RelayAuthenticationState + + var flags: Int + + init(descriptor: RelayDescriptor, connection: RelayConnection) { + self.flags = 0 + self.descriptor = descriptor + self.connection = connection + self.authentication_state = RelayAuthenticationState.none + } + + var is_broken: Bool { + return (flags & RelayFlags.broken.rawValue) == RelayFlags.broken.rawValue + } + + var id: RelayURL { + return descriptor.url + } } - } -enum RelayError: Error { - case RelayAlreadyExists +extension RelayPool { + enum RelayError: Error { + case RelayAlreadyExists + } } diff --git a/damus/Nostr/RelayPool.swift b/damus/Nostr/RelayPool.swift @@ -356,7 +356,7 @@ class RelayPool { } func add_rw_relay(_ pool: RelayPool, _ url: RelayURL) { - try? pool.add_relay(RelayDescriptor(url: url, info: .rw)) + try? pool.add_relay(RelayPool.RelayDescriptor(url: url, info: .rw)) } diff --git a/damus/Views/AddRelayView.swift b/damus/Views/AddRelayView.swift @@ -89,13 +89,13 @@ struct AddRelayView: View { } let info = LegacyKind3RelayRWConfiguration.rw - let descriptor = RelayDescriptor(url: url, info: info) + let descriptor = RelayPool.RelayDescriptor(url: url, info: info) do { try state.pool.add_relay(descriptor) relayAddErrorTitle = nil // Clear error title relayAddErrorMessage = nil // Clear error message - } catch RelayError.RelayAlreadyExists { + } catch RelayPool.RelayError.RelayAlreadyExists { relayAddErrorTitle = NSLocalizedString("Duplicate relay", comment: "Title of the duplicate relay error message.") relayAddErrorMessage = NSLocalizedString("The relay you are trying to add is already added.\nYou're all set!", comment: "An error message that appears when the user attempts to add a relay that has already been added.") return diff --git a/damus/Views/RelayFilterView.swift b/damus/Views/RelayFilterView.swift @@ -18,7 +18,7 @@ struct RelayFilterView: View { //_relays = State(initialValue: state.pool.descriptors) } - var relays: [RelayDescriptor] { + var relays: [RelayPool.RelayDescriptor] { return state.pool.our_descriptors } diff --git a/damus/Views/Relays/RelayConfigView.swift b/damus/Views/Relays/RelayConfigView.swift @@ -23,7 +23,7 @@ enum RelayTab: Int, CaseIterable{ struct RelayConfigView: View { let state: DamusState - @State var relays: [RelayDescriptor] + @State var relays: [RelayPool.RelayDescriptor] @State private var showActionButtons = false @State var show_add_relay: Bool = false @State var selectedTab = 0 @@ -36,11 +36,11 @@ struct RelayConfigView: View { UITabBar.appearance().isHidden = true } - var recommended: [RelayDescriptor] { - let rs: [RelayDescriptor] = [] + var recommended: [RelayPool.RelayDescriptor] { + let rs: [RelayPool.RelayDescriptor] = [] let recommended_relay_addresses = get_default_bootstrap_relays() return recommended_relay_addresses.reduce(into: rs) { xs, x in - xs.append(RelayDescriptor(url: x, info: .rw)) + xs.append(RelayPool.RelayDescriptor(url: x, info: .rw)) } } @@ -109,7 +109,7 @@ struct RelayConfigView: View { .ignoresSafeArea(.all) } - func RelayList(title: String, relayList: [RelayDescriptor], recommended: Bool) -> some View { + func RelayList(title: String, relayList: [RelayPool.RelayDescriptor], recommended: Bool) -> some View { ScrollView(showsIndicators: false) { HStack { Text(title) diff --git a/damus/Views/Relays/RelayDetailView.swift b/damus/Views/Relays/RelayDetailView.swift @@ -208,7 +208,7 @@ struct RelayDetailView: View { } } - private var relay_object: Relay? { + private var relay_object: RelayPool.Relay? { state.pool.get_relay(relay) } diff --git a/damusTests/AuthIntegrationTests.swift b/damusTests/AuthIntegrationTests.swift @@ -98,7 +98,7 @@ final class AuthIntegrationTests: XCTestCase { sent_messages.append(str) } XCTAssertEqual(pool.relays.count, 0) - let relay_descriptor = RelayDescriptor.init(url: relay_url, info: .rw) + let relay_descriptor = RelayPool.RelayDescriptor.init(url: relay_url, info: .rw) try! pool.add_relay(relay_descriptor) XCTAssertEqual(pool.relays.count, 1) let connection_expectation = XCTestExpectation(description: "Waiting for connection") @@ -142,7 +142,7 @@ final class AuthIntegrationTests: XCTestCase { sent_messages.append(str) } XCTAssertEqual(pool.relays.count, 0) - let relay_descriptor = RelayDescriptor.init(url: relay_url, info: .rw) + let relay_descriptor = RelayPool.RelayDescriptor.init(url: relay_url, info: .rw) try! pool.add_relay(relay_descriptor) XCTAssertEqual(pool.relays.count, 1) let connection_expectation = XCTestExpectation(description: "Waiting for connection") diff --git a/damusTests/RequestTests.swift b/damusTests/RequestTests.swift @@ -20,13 +20,12 @@ final class RequestTests: XCTestCase { func testMakeAuthRequest() { let challenge_string = "8bc847dd-f2f6-4b3a-9c8a-71776ad9b071" let url = RelayURL("wss://example.com")! - let relayInfo = RelayInfo(read: true, write: true) - let relayDescriptor = RelayDescriptor(url: url, info: relayInfo) + let relayDescriptor = RelayPool.RelayDescriptor(url: url, info: .rw) let relayConnection = RelayConnection(url: url) { _ in } processEvent: { _ in } - let relay = Relay(descriptor: relayDescriptor, connection: relayConnection) + let relay = RelayPool.Relay(descriptor: relayDescriptor, connection: relayConnection) let event = make_auth_request(keypair: FullKeypair.init(pubkey: Pubkey.empty, privkey: Privkey.empty), challenge_string: challenge_string, relay: relay)! let result = make_nostr_auth_event(ev: event) diff --git a/nostrscript/NostrScript.swift b/nostrscript/NostrScript.swift @@ -309,7 +309,7 @@ public func nscript_nostr_cmd(interp: UnsafeMutablePointer<wasm_interp>?, cmd: I func nscript_add_relay(script: NostrScript, relay: String) -> Bool { guard let url = RelayURL(relay) else { return false } - let desc = RelayDescriptor(url: url, info: .rw, variant: .ephemeral) + let desc = RelayPool.RelayDescriptor(url: url, info: .rw, variant: .ephemeral) return (try? script.pool.add_relay(desc)) != nil }