Sha256: 906c09464636c0f18f395e0cf6dae48a5330e01cfcc3b3ef43f83aea7226a2f5

Contents?: true

Size: 1.74 KB

Versions: 1

Compression:

Stored size: 1.74 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, :timeout => 10, :body => {:type => type, :data => data, :session => @session}
        emit :error, "CometIO push error" unless res.code == 200
      rescue StandardError, Timeout::Error => e
        emit :error, "CometIO push error"
      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 => 120
            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']
              next
            end
          rescue Timeout::Error, JSON::ParserError
            next
          rescue StandardError
            self.emit :error, "CometIO get error 2"
            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.7 lib/sinatra/cometio/client.rb