Sha256: e170fc982785c81e5fb0d0c42b6f90d87e4699d6e8ab6dd5b9825d42c45f17c9

Contents?: true

Size: 1.9 KB

Versions: 1

Compression:

Stored size: 1.9 KB

Contents

module EventMachine
  module RocketIO
    class Client
      class Error < StandardError
      end

      include EventEmitter
      attr_reader :settings, :type, :io

      def initialize(url, opt={:type => :websocket})
        http = EM::HttpRequest.new("#{url}/rocketio/settings").get
        http.callback do |res|
          begin
            @settings = JSON.parse res.response
            emit :__settings
          rescue => e
            emit :error, e
          end
        end
        http.errback do |err|
          emit :error, err
        end
        @settings = nil
        @type = opt[:type].to_sym
        @io = nil
        @ws_close_timer = nil
        self
      end

      def connect
        this = self
        once :__settings do
          if @type == :websocket and @settings.include? 'websocket'
            @io = EM::WebSocketIO::Client.new(@settings['websocket']).connect
            @type = :websocket
          elsif @type == :comet or @settings.include? 'comet'
            @io = EM::CometIO::Client.new(@settings['comet']).connect
            @type = :comet
          else
            raise Error, "cannnot found #{@type} IO"
          end
          @io.on :* do |event_name, *args|
            this.emit event_name, *args
          end
          if @type == :websocket
            @ws_close_timer = EM::add_timer 3 do
              close
              emit :error, "websocket port is not open"
              @type = :comet
              connect
            end
            once :connect do
              EM::cancel_timer @ws_close_timer if @ws_close_timer
              @ws_close_timer = nil
            end
          end
        end
        emit :__settings if @settings
        self
      end

      def close
        @io.close
      end

      def push(type, data={})
        @io.push type, data
      end

      def method_missing(name, *args)
        @io.__send__ name, *args
      end

    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
em-rocketio-client-0.0.2 lib/em-rocketio-client/client.rb