Class: WebSocket::Client::Simple::Client

Inherits:
Object
  • Object
show all
Includes:
EventEmitter
Defined in:
lib/websocket-client-simple/client.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(url, options = {}) ⇒ Client

Returns a new instance of Client.



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/websocket-client-simple/client.rb', line 13

def initialize(url, options={})
  @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'
    @socket = ::OpenSSL::SSL::SSLSocket.new(@socket, ctx)
    @socket.connect
  end
  @handshake = ::WebSocket::Handshake::Client.new :url => url, :headers => options[:headers]
  @handshaked = 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
          end
        else
          frame << recv_data
          while msg = frame.next
            emit :message, msg
          end
        end
      rescue => e
        emit :error, e
      end
    end
  end

  @socket.write @handshake.to_s
end

Instance Attribute Details

#handshakeObject (readonly)

Returns the value of attribute handshake.



11
12
13
# File 'lib/websocket-client-simple/client.rb', line 11

def handshake
  @handshake
end

#urlObject (readonly)

Returns the value of attribute url.



11
12
13
# File 'lib/websocket-client-simple/client.rb', line 11

def url
  @url
end

Instance Method Details

#closeObject



72
73
74
75
76
77
78
79
80
# File 'lib/websocket-client-simple/client.rb', line 72

def close
  return if @closed
  send nil, :type => :close
  @closed = true
  @socket.close if @socket
  @socket = nil
  emit :__close
  Thread.kill @thread if @thread
end

#open?Boolean

Returns:

  • (Boolean)


82
83
84
# File 'lib/websocket-client-simple/client.rb', line 82

def open?
  @handshake.finished? and !@closed
end

#send(data, opt = {:type => :text}) ⇒ Object



61
62
63
64
65
66
67
68
69
70
# File 'lib/websocket-client-simple/client.rb', line 61

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
    emit :__close, e
  end
end