Sha256: 3848c48433d62dd8de83d99acecaae273f02c55a0d0cde25fe9e57f1ac1c8e81

Contents?: true

Size: 1.9 KB

Versions: 1

Compression:

Stored size: 1.9 KB

Contents

module WebSocket
  module Client
    module Simple

      def self.connect(url)
        ::WebSocket::Client::Simple::Client.new url
      end

      class Client
        include EventEmitter
        attr_reader :url

        def initialize(url)
          @url = url
          uri = URI.parse url
          @socket = TCPSocket.new(uri.host, uri.port || 80)
          @hs = ::WebSocket::Handshake::Client.new :url => url
          @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
                recv_data = @socket.getc
              rescue => e
                emit :__close, e
              end
              if !@handshaked
                @hs << recv_data
                if @hs.finished?
                  @handshaked = true
                  emit :open
                end
              else
                frame << recv_data
                while msg = frame.next
                  emit :message, msg
                end
              end
            end
          end

          @socket.write @hs.to_s
        end

        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 => @hs.version)
          begin
            @socket.write frame.to_s
          rescue => e
            emit :__close, e
          end
        end

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

        def open?
          !@closed
        end

      end

    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
websocket-client-simple-0.0.7 lib/websocket-client-simple/client.rb