Sha256: e2ad3c2d57d68b012666201833e870517cb36249ce3d4268dec91a39fe3e9c87

Contents?: true

Size: 1.46 KB

Versions: 2

Compression:

Stored size: 1.46 KB

Contents

require 'rubygems'
require 'rack'
require 'json'

module Faye
  class RackAdapter
    DEFAULT_ENDPOINT  = '/bayeux'
    
    TYPE_JSON   = {'Content-Type' => 'text/json'}
    TYPE_SCRIPT = {'Content-Type' => 'text/javascript'}
    TYPE_TEXT   = {'Content-Type' => 'text/plain'}
    
    def initialize(app = nil, options = nil)
      @app      = app if app.respond_to?(:call)
      @options  = [app, options].grep(Hash).first || {}
      
      @endpoint = @options[:mount] || DEFAULT_ENDPOINT
      @script   = @endpoint + '.js'
      @server   = Server.new(@options)
    end
    
    def call(env)
      request = Rack::Request.new(env)
      case request.path_info
      
      when @endpoint then
        message  = JSON.parse(request.params['message'])
        jsonp    = request.params['jsonp'] || JSONP_CALLBACK
        type     = request.get? ? TYPE_SCRIPT : TYPE_JSON
        response = nil
        
        @server.process(message, false) do |replies|
          response = JSON.unparse(replies)
          response = "#{ jsonp }(#{ response });" if request.get?
        end
        
        # TODO support Thin's async responses
        sleep(0.1) while response.nil?
        [200, type, [response]]
      
      when @script then
        [200, TYPE_SCRIPT, File.new(CLIENT_SCRIPT)]
      
      else
        env['faye.server'] = @server
        @app ? @app.call(env) :
               [404, TYPE_TEXT, ["Sure you're not looking for #{@endpoint} ?"]]
      end
    end
    
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
faye-0.1.0 lib/faye/rack_adapter.rb
faye-0.1.1 lib/faye/rack_adapter.rb