Sha256: 978e5c6b949cc4ccf3f4b2eaf004d06b155c5e2bef26de9aa3ef8c246e581efb

Contents?: true

Size: 1.89 KB

Versions: 1

Compression:

Stored size: 1.89 KB

Contents

require 'async'
require 'async/http/endpoint'
require 'async/websocket/client'

require 'nostrb/source'

module Nostrb
  class Client
    attr_reader :url, :endpoint, :sid

    def initialize(relay_url, sid: nil)
      @url = relay_url
      @endpoint = Async::HTTP::Endpoint.parse(@url)
      @sid = sid.nil? ? Source.random_sid : sid
    end

    def log msg
      warn msg
    end

    # open, send req, get response, return response
    def single(req)
      Sync do
        Async::WebSocket::Client.connect(@endpoint) do |conn|
          conn.write(Nostrb.json(req))
          conn.flush
          resp = conn.read
          conn.shutdown
          Nostrb.parse(resp.buffer)
        end
      end
    end

    def publish(signed_event)
      case single(Nostrb::Source.publish(signed_event))
      in ['OK', String => event_id, ok, String => msg]
        log "id mismatch: #{event_id}" unless event_id == signed_event.id
        log msg unless ok
        ok
      in ['NOTICE', String => msg]
        log msg
      end
    end

    def subscribe(*filters, &blk)
      Sync do
        Async::WebSocket::Client.connect(@endpoint) do |conn|
          conn.write(Nostrb.json(Nostrb::Source.subscribe(@sid, *filters)))
          conn.flush
          eose = false
          while !eose and resp = conn.read
            case Nostrb.parse(resp.buffer)
            in ['EVENT', String => sid, Hash => event]
              log "sid mismatch: #{sid}" unless sid == @sid
              yield event
            in ['EOSE', String => sid]
              log "sid mismatch: #{sid}" unless sid == @sid
              eose = true
            end
          end
          conn.shutdown
        end
      end
    end

    def close
      case single(Nostrb::Source.close(@sid))
      in ['CLOSED', String => sid, String => msg]
        log "sid mismatch: #{sid}" unless sid == @sid
        log msg unless msg.empty?
        true
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
nostrb-0.2.0.1 lib/nostrb/client.rb