add unit tests for RelayPool

This commit is contained in:
Bryan Montz
2023-02-25 07:34:31 -06:00
parent 673358408a
commit 6c63f8f22a
3 changed files with 191 additions and 12 deletions

View File

@@ -18,7 +18,7 @@ struct QueuedRequest {
}
final class RelayPool {
private enum Constants {
enum Constants {
/// Used for an exponential backoff algorithm when retrying stale connections
/// Each retry attempt will be delayed by raising this base delay to an exponent
/// equal to the number of previous retries.
@@ -28,10 +28,10 @@ final class RelayPool {
}
private(set) var relays: [Relay] = []
private var handlers: [RelayHandler] = []
private(set) var handlers: [RelayHandler] = []
private var request_queue: [QueuedRequest] = []
private var seen: Set<String> = Set()
private var counts: [String: UInt64] = [:]
private(set) var seen: Set<String> = Set()
private(set) var counts: [String: UInt64] = [:]
private var retry_attempts_per_relay: [URL: Int] = [:]
var descriptors: [RelayDescriptor] {
@@ -42,8 +42,11 @@ final class RelayPool {
relays.reduce(0) { n, r in n + (r.connection.state == .connecting ? 1 : 0) }
}
private func remove_handler(sub_id: String) {
self.handlers = handlers.filter { $0.sub_id != sub_id }
func remove_handler(sub_id: String) {
guard let index = handlers.firstIndex(where: { $0.sub_id == sub_id }) else {
return
}
handlers.remove(at: index)
print("removing \(sub_id) handler, current: \(handlers.count)")
}
@@ -64,7 +67,8 @@ final class RelayPool {
}
}
func add_relay(_ url: URL, info: RelayInfo) throws {
@discardableResult
func add_relay(_ url: URL, info: RelayInfo) throws -> Relay {
let relay_id = get_relay_id(url)
if get_relay(relay_id) != nil {
throw RelayError.RelayAlreadyExists
@@ -74,7 +78,8 @@ final class RelayPool {
}
let descriptor = RelayDescriptor(url: url, info: info)
let relay = Relay(descriptor: descriptor, connection: conn)
self.relays.append(relay)
relays.append(relay)
return relay
}
/// This is used to retry dead connections
@@ -152,13 +157,13 @@ final class RelayPool {
send(.subscribe(.init(filters: filters, sub_id: sub_id)), to: to)
}
private func count_queued(relay: String) -> Int {
func count_queued(relay: String) -> Int {
request_queue.filter({ $0.relay == relay }).count
}
func queue_req(r: NostrRequest, relay: String) {
let count = count_queued(relay: relay)
guard count <= Constants.max_queued_requests else {
guard count < Constants.max_queued_requests else {
print("can't queue, too many queued events for \(relay)")
return
}
@@ -210,7 +215,7 @@ final class RelayPool {
}
}
private func record_seen(relay_id: String, event: NostrConnectionEvent) {
func record_seen(relay_id: String, event: NostrConnectionEvent) {
if case .nostr_event(let ev) = event {
if case .event(_, let nev) = ev {
let k = relay_id + nev.id
@@ -243,5 +248,5 @@ final class RelayPool {
func add_rw_relay(_ pool: RelayPool, _ url: String) {
let url_ = URL(string: url)!
try? pool.add_relay(url_, info: RelayInfo.rw)
let _ = try? pool.add_relay(url_, info: RelayInfo.rw)
}