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
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