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:
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
}