Sha256: 5f3af98c7cef33b8ba9e0dc3abf63d417c746b5b54cf4a4c4f9f4532c185f8ad

Contents?: true

Size: 1.66 KB

Versions: 1

Compression:

Stored size: 1.66 KB

Contents

require File.expand_path '../../sinatra-cometio/version', File.dirname(__FILE__)
require 'event_emitter'
require 'httparty'
require 'json'

class CometIO
  class Client
    class Error < StandardError
    end

    include EventEmitter
    attr_reader :url, :session

    def initialize(url)
      raise ArgumentError, "invalid URL (#{url})" unless url.kind_of? String and url =~ /^https?:\/\/.+/
      @url = url
      @session = nil
      @running = false
    end

    def push(type, data)
      begin
        res = HTTParty.post @url, :body => {:type => type, :data => data, :session => @session}
      rescue StandardError, Timeout::Error => e
        emit :error, "CometIO push error"
      ensure
        emit :error, "CometIO push error" unless res.code == 200
      end
    end

    def connect
      return self if @running
      self.on :__session_id do |session|
        @session = session
        self.emit :connect, @session
      end
      @running = true
      get
      return self
    end

    def close
      @running = false
      self.remove_listener :__session_id
    end

    private
    def get
      Thread.new do
        while @running do
          begin
            res = HTTParty.get "#{@url}?session=#{@session}", :timeout => 60000
            unless res.code == 200
              self.emit :error, "CometIO get error"
              sleep 10
              next
            else
              data = JSON.parse res.body
              self.emit data['type'], data['data']
            end
          rescue StandardError, Timeout::Error
            self.emit :error, "CometIO get error"
            sleep 10
            next
          end
        end
      end
    end

  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
sinatra-cometio-0.1.6 lib/sinatra/cometio/client.rb