module NostrManager class FetchLatestEvent < NostrManagerService TIMEOUT = 20 def initialize(relays:, filter:, max_events: 2) @relays = relays @filter = filter @max_events = max_events end def call events = [] begin Timeout.timeout(TIMEOUT) do @relays.each do |url| event = NostrManager::FetchEvent.call(filter: @filter, relay_url: url) if event.present? && events.none? { |e| e["id"] == event["id"] } events << event break if events.size >= @max_events end end end rescue Timeout::Error Rails.logger.debug "[nostr] Timeout after #{TIMEOUT}s, found #{events.size} events" end events.max_by { |e| e["created_at"] } end end end