class Weso::Base::Client

::nodoc

Public Instance Methods

close(error = nil) click to toggle source
# File lib/weso/client.rb, line 40
def close(error = nil)
  return if closed?

  emit :close, error
ensure
  close_socket
  close_runner
end
closed?() click to toggle source
# File lib/weso/client.rb, line 53
def closed?
  @closed
end
connect(url, options = {}) click to toggle source
# File lib/weso/client.rb, line 11
def connect(url, options = {})
  return if @socket

  @socket = socket_creator(url, options).call
  @closed = false

  @handshake = handshake_client(url, options[:headers])
  @handshaked = false

  handshake
  call_runner
  self
end
handshake() click to toggle source
# File lib/weso/client.rb, line 32
def handshake
  @socket.write(@handshake.to_s)
  process_socket(@socket, method(:handshaked?)) do |socket|
    @handshake = read_socket(socket, @handshake)
    @handshaked = @handshake.finished?
  end
end
handshaked?() click to toggle source
# File lib/weso/client.rb, line 57
def handshaked?
  @handshaked
end
open?() click to toggle source
# File lib/weso/client.rb, line 49
def open?
  !closed? && handshaked?
end
send_data(data, type: :text) click to toggle source
# File lib/weso/client.rb, line 25
def send_data(data, type: :text)
  return unless open?

  @socket.write_nonblock output_frame(data, type)
  data
end

Private Instance Methods

call_runner() click to toggle source
# File lib/weso/client.rb, line 63
def call_runner
  @runner = Thread.new(@socket) do |socket|
    emit :open
    frame = input_frame

    process_socket(socket, method(:closed?)) do |s|
      frame = read_socket(s, frame)
      frame = process_frame(frame)
    end
  end
end
close_runner() click to toggle source
# File lib/weso/client.rb, line 134
def close_runner
  Thread.kill @runner if @runner
end
close_socket() click to toggle source
# File lib/weso/client.rb, line 128
def close_socket
  @closed = true
  @socket&.close
  @socket = nil
end
handshake_client(url, headers) click to toggle source
# File lib/weso/client.rb, line 124
def handshake_client(url, headers)
  ::WebSocket::Handshake::Client.new(url: url, headers: headers)
end
input_frame() click to toggle source
# File lib/weso/client.rb, line 112
def input_frame
  ::WebSocket::Frame::Incoming::Client.new
end
output_frame(data, type) click to toggle source
# File lib/weso/client.rb, line 116
def output_frame(data, type)
  ::WebSocket::Frame::Outgoing::Client.new(data: data, type: type, version: @handshake.version).to_s
end
process_frame(frame) click to toggle source
# File lib/weso/client.rb, line 75
def process_frame(frame)
  if (msg = frame.next)
    emit :message, msg
    return input_frame
  end

  frame
end
process_socket(socket, condition_method) { |socket| ... } click to toggle source
# File lib/weso/client.rb, line 84
def process_socket(socket, condition_method) # rubocop:disable Metrics/MethodLength
  until condition_method.call
    read_sockets, = IO.select([socket], nil, nil, 10) # TODO: Configured timeout?

    next unless read_sockets && read_sockets[0]

    begin
      yield(socket)
    rescue IO::WaitReadable
      # Do nothing
    rescue IO::WaitWritable
      IO.select(nil, [socket])
      retry
    rescue EOFError => e
      emit :error, e
      close(e)
    rescue StandardError => e
      emit :error, e
    end
  end
end
read_socket(socket, frame) click to toggle source
# File lib/weso/client.rb, line 106
def read_socket(socket, frame)
  frame << socket.read_nonblock(1024)
  frame << socket.read(socket.pending) while socket.respond_to?(:pending) && socket.pending.positive?
  frame
end
socket_creator(url, options) click to toggle source
# File lib/weso/client.rb, line 120
def socket_creator(url, options)
  ::Weso::Base::SocketCreator.new(url, options)
end