Class: Faye::RackAdapter

Inherits:
Object
  • Object
show all
Includes:
Logging
Defined in:
lib/faye/adapters/rack_adapter.rb

Defined Under Namespace

Classes: DeferredBody

Constant Summary collapse

ASYNC_RESPONSE =

Only supported under Thin

[-1, {}, []].freeze
DEFAULT_ENDPOINT =
'/bayeux'
SCRIPT_PATH =
File.join(ROOT, 'faye-browser-min.js')
TYPE_JSON =
{'Content-Type' => 'application/json'}
TYPE_SCRIPT =
{'Content-Type' => 'text/javascript'}
TYPE_TEXT =
{'Content-Type' => 'text/plain'}

Constants included from Logging

Logging::DEFAULT_LOG_LEVEL, Logging::LOG_LEVELS

Instance Attribute Summary

Attributes included from Logging

#log_level

Instance Method Summary collapse

Methods included from Logging

#log

Constructor Details

#initialize(app = nil, options = nil) ⇒ RackAdapter

Returns a new instance of RackAdapter.



23
24
25
26
27
28
29
30
31
32
33
# File 'lib/faye/adapters/rack_adapter.rb', line 23

def initialize(app = nil, options = nil)
  @app      = app if app.respond_to?(:call)
  @options  = [app, options].grep(Hash).first || {}
  
  @endpoint    = @options[:mount] || DEFAULT_ENDPOINT
  @endpoint_re = Regexp.new('^' + @endpoint + '(/[^/]*)*(\\.js)?$')
  @server      = Server.new(@options)
  
  return unless extensions = @options[:extensions]
  [*extensions].each { |extension| add_extension(extension) }
end

Instance Method Details

#add_extension(extension) ⇒ Object



35
36
37
# File 'lib/faye/adapters/rack_adapter.rb', line 35

def add_extension(extension)
  @server.add_extension(extension)
end

#call(env) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/faye/adapters/rack_adapter.rb', line 52

def call(env)
  Faye.ensure_reactor_running!
  request = Rack::Request.new(env)
  
  unless request.path_info =~ @endpoint_re
    return @app ? @app.call(env) :
                  [404, TYPE_TEXT, ["Sure you're not looking for #{@endpoint} ?"]]
  end
  
  if env['HTTP_UPGRADE'] == 'WebSocket'
    return handle_upgrade(request)
  end
  
  if request.path_info =~ /\.js$/
    return [200, TYPE_SCRIPT, File.new(SCRIPT_PATH)]
  end
  
  begin
    json_msg = message_from_request(request)
    message  = JSON.parse(json_msg)
    jsonp    = request.params['jsonp'] || JSONP_CALLBACK
    head     = request.get? ? TYPE_SCRIPT.dup : TYPE_JSON.dup
    origin   = request.env['HTTP_ORIGIN']
    callback = env['async.callback']
    body     = DeferredBody.new
    
    debug 'Received ?: ?', env['REQUEST_METHOD'], json_msg
    @server.flush_connection(message) if request.get?
    
    head['Access-Control-Allow-Origin'] = origin if origin
    callback.call [200, head, body]
    
    @server.process(message, false) do |replies|
      response = JSON.unparse(replies)
      response = "#{ jsonp }(#{ response });" if request.get?
      debug 'Returning ?', response
      body.succeed(response)
    end
    
    ASYNC_RESPONSE
    
  rescue
    [400, TYPE_TEXT, ['Bad request']]
  end
end

#get_clientObject



43
44
45
# File 'lib/faye/adapters/rack_adapter.rb', line 43

def get_client
  @client ||= Client.new(@server)
end

#listen(port) ⇒ Object



47
48
49
50
# File 'lib/faye/adapters/rack_adapter.rb', line 47

def listen(port)
  handler = Rack::Handler.get('thin')
  handler.run(self, :Port => port)
end

#remove_extension(extension) ⇒ Object



39
40
41
# File 'lib/faye/adapters/rack_adapter.rb', line 39

def remove_extension(extension)
  @server.remove_extension(extension)
end