class Grumlin::Client

Public Class Methods

new(url, parent: Async::Task.current, **client_options) click to toggle source

Client is not reusable. Once closed should be recreated.

# File lib/grumlin/client.rb, line 45
def initialize(url, parent: Async::Task.current, **client_options)
  @url = url
  @client_options = client_options
  @parent = parent
  @request_dispatcher = nil
  @transport = nil
end

Public Instance Methods

close(check_requests: true) click to toggle source

Before calling close the user must ensure that: 1) There are no ongoing requests 2) There will be no new writes after

# File lib/grumlin/client.rb, line 72
def close(check_requests: true) # rubocop:disable Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
  return if @closed

  @closed = true

  @transport&.close
  @transport&.wait

  @response_task&.stop
  @response_task&.wait

  return if @request_dispatcher&.requests&.empty?

  @request_dispatcher.clear unless check_requests

  raise ResourceLeakError, "Request list is not empty: #{@request_dispatcher.requests}" if check_requests
ensure
  logger.debug(self, "Closed")
end
connect() click to toggle source
# File lib/grumlin/client.rb, line 53
def connect
  raise "ClientClosed" if @closed

  @transport = build_transport
  response_channel = @transport.connect
  @request_dispatcher = RequestDispatcher.new
  @response_task = @parent.async do
    response_channel.each do |response|
      @request_dispatcher.add_response(response)
    end
  rescue Async::Stop, Async::TimeoutError, StandardError
    close(check_requests: false)
  end
  logger.debug(self, "Connected")
end
connected?() click to toggle source
# File lib/grumlin/client.rb, line 92
def connected?
  @transport&.connected? || false
end
inspect() click to toggle source
# File lib/grumlin/client.rb, line 112
def inspect
  "<#{self.class} url=#{@url} connected=#{connected?}>"
end
Also aliased as: to_s
to_s()
Alias for: inspect
write(bytecode) click to toggle source

TODO: support yielding

# File lib/grumlin/client.rb, line 97
def write(bytecode)
  raise NotConnectedError unless connected?

  request = bytecode.to_query
  channel = @request_dispatcher.add_request(request)
  @transport.write(request)

  begin
    channel.dequeue.flat_map { |item| Typing.cast(item) }
  rescue Async::Stop, Async::TimeoutError
    close(check_requests: false)
    raise
  end
end

Private Instance Methods

build_transport() click to toggle source
# File lib/grumlin/client.rb, line 120
def build_transport
  Transport.new(@url, parent: @parent, **@client_options)
end