Sha256: a042d9b3238264ebceeeda8bda82797fc98b693f56df9b582b8613853f531786

Contents?: true

Size: 1.94 KB

Versions: 1

Compression:

Stored size: 1.94 KB

Contents

module Sinatra::CometIO

  def cometio=(options)
    CometIO.options = options
  end

  def cometio
    CometIO.options
  end

  helpers do
    def cometio_js
      "#{env['rack.url_scheme']}://#{env['HTTP_HOST']}#{env['SCRIPT_NAME']}/cometio/cometio.js"
    end

    def cometio_url
      "#{env['rack.url_scheme']}://#{env['HTTP_HOST']}#{env['SCRIPT_NAME']}/cometio/io"
    end
  end

  get '/cometio/cometio.js' do
    content_type 'application/javascript'
    @js ||= (
             js = ''
             Dir.glob(File.expand_path '../js/*.js', File.dirname(__FILE__)).each do |i|
               File.open(i) do |f|
                 js += f.read
               end
             end
             ERB.new(js).result(binding)
             )
  end

  get '/cometio/io' do
    stream :keep_open do |s|
      session = params[:session].to_s.empty? ? CometIO.create_session(request.ip) : params[:session]
      CometIO.sessions[session][:stream] = s
      CometIO.sessions[session][:last] = Time.now
      CometIO.emit :connect, session if params[:session].to_s.empty?

      unless CometIO.sessions[session][:queue].empty?
        begin
          s.write CometIO.sessions[session][:queue].to_json
          s.flush
          s.close
        rescue
          s.close
        end
        CometIO.sessions[session][:queue] = []
      end

      EM::add_timer CometIO.options[:timeout] do
        begin
          s.write([{:type => :__heartbeat, :data => {:time => Time.now.to_i}}].to_json)
          s.flush
          s.close
        rescue
          s.close
        end
      end
    end
  end

  post '/cometio/io' do
    type = params[:type]
    data = params[:data]
    from = params[:session]
    EM::defer do
      CometIO.emit type, data, from unless type.to_s.empty?
    end
    stream :keep_open do |s|
      begin
        s.write({:session => from, :type => type, :data => data}.to_json)
        s.flush
        s.close
      rescue
        s.close
      end
    end
  end

end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
sinatra-cometio-0.2.0 lib/sinatra-cometio/application.rb