Class: Falcon::Command::Serve

Inherits:
Samovar::Command
  • Object
show all
Defined in:
lib/falcon/command/serve.rb

Instance Method Summary collapse

Instance Method Details

#container_classObject



46
47
48
49
50
51
52
53
54
55
# File 'lib/falcon/command/serve.rb', line 46

def container_class
  case @options[:container]
  when :threaded
    require 'async/container/threaded'
    return Async::Container::Threaded
  when :forked
    require 'async/container/forked'
    return Async::Container::Forked
  end
end

#invoke(parent) ⇒ Object



94
95
96
97
98
# File 'lib/falcon/command/serve.rb', line 94

def invoke(parent)
  container = run(parent.verbose?)
  
  container.wait
end

#load_app(verbose) ⇒ Object



57
58
59
60
61
62
63
64
65
# File 'lib/falcon/command/serve.rb', line 57

def load_app(verbose)
  app, options = Rack::Builder.parse_file(@options[:config])
  
  if verbose
    app = Verbose.new(app)
  end
  
  return app, options
end

#run(verbose) ⇒ Object



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
# File 'lib/falcon/command/serve.rb', line 67

def run(verbose)
  app, options = load_app(verbose)
  
  endpoint = Async::IO::Endpoint.parse(@options[:bind], reuse_port: true)
  
  Async.logger.info "Falcon taking flight! Binding to #{endpoint} [#{container_class} with concurrency: #{@options[:concurrency]}]"
  
  debug_trap = Async::IO::Trap.new(:USR1)
  
  container_class.new(concurrency: @options[:concurrency]) do |task|
    task.async do
      debug_trap.install!
      Async.logger.info "Send `kill -USR1 #{Process.pid}` for detailed status :)"
      
      debug_trap.trap do
        task.reactor.print_hierarchy($stderr)
      end
    end
    
    server = Falcon::Server.new(app, endpoint)
    
    server.run
    
    task.children.each(&:wait)
  end
end