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