class WebSocket::Client::Simple::Client

Attributes

handshake[R]
logger[RW]
url[R]

Public Instance Methods

close() click to toggle source
# File lib/websocket-client-simple/client.rb, line 87
def close
  return if @closed
  if !@pipe_broken
    send nil, :type => :close
  end
  @closed = true
  @socket.close if @socket
  @socket = nil
  emit :__close
  Thread.kill @thread if @thread
end
connect(url, options={}, logger) click to toggle source
# File lib/websocket-client-simple/client.rb, line 20
def connect(url, options={}, logger)
  return if @socket
  @logger = logger
  @url = url
  uri = URI.parse url
  @socket = TCPSocket.new(uri.host,
                          uri.port || (uri.scheme == 'wss' ? 443 : 80))
  if ['https', 'wss'].include? uri.scheme
    ctx = OpenSSL::SSL::SSLContext.new
    ctx.ssl_version = options[:ssl_version] || 'SSLv23'
    ctx.verify_mode = options[:verify_mode] || OpenSSL::SSL::VERIFY_NONE #use VERIFY_PEER for verification
    cert_store = OpenSSL::X509::Store.new
    cert_store.set_default_paths
    ctx.cert_store = cert_store
    @socket = ::OpenSSL::SSL::SSLSocket.new(@socket, ctx)
    @socket.connect
  end
  @handshake = ::WebSocket::Handshake::Client.new :url => url, :headers => options[:headers]
  @handshaked = false
  @pipe_broken = false
  frame = ::WebSocket::Frame::Incoming::Client.new
  @closed = false
  once :__close do |err|
    close
    emit :close, err
  end

  @thread = Thread.new do
    while !@closed do
      begin
        unless recv_data = @socket.getc
          sleep 1
          next
        end
        unless @handshaked
          @handshake << recv_data
          if @handshake.finished?
            @handshaked = true
            emit :open, @logger
          end
        else
          frame << recv_data
          while msg = frame.next
            emit :message, msg, @logger
          end
        end
      rescue => e
        emit :error, e, @logger
      end
    end
  end

  @socket.write @handshake.to_s
end
open?() click to toggle source
# File lib/websocket-client-simple/client.rb, line 99
def open?
  @handshake.finished? and !@closed
end
send(data, opt={:type => :text}) click to toggle source
# File lib/websocket-client-simple/client.rb, line 75
def send(data, opt={:type => :text})
  return if !@handshaked or @closed
  type = opt[:type]
  frame = ::WebSocket::Frame::Outgoing::Client.new(:data => data, :type => type, :version => @handshake.version)
  begin
    @socket.write frame.to_s
  rescue Errno::EPIPE => e
    @pipe_broken = true
    emit :__close, e
  end
end