33 lines
811 B
Ruby
33 lines
811 B
Ruby
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
|