Sha256: e0ca08f427030a5e807a20c1dbb804d9f70c928580b017cb62df39b62af41b33

Contents?: true

Size: 1.55 KB

Versions: 1

Compression:

Stored size: 1.55 KB

Contents

require 'socket'

module Yarn
  class Server

    include Logging

    attr_accessor :host, :port, :socket, :workers

    def initialize(options={})
      # merge given options with default values
      opts = { 
        output: $stdout, 
        host: '127.0.0.1', 
        port: 3000,
        workers: 4,
        rack: "off" 
      }.merge(options)

      @app = nil
      @app = load_rack_app(opts[:rack]) unless opts[:rack] == "off"

      @host, @port, @num_workers = opts[:host], opts[:port], opts[:workers]
      @workers = []
      $output, $debug = opts[:output], opts[:debug]
    end

    def load_rack_app(app_path)
      if File.exists?(app_path)
        config_file = File.read(app_path)
        rack_application = eval("Rack::Builder.new { #{config_file} }")
      else
        log "#{app_path} does not exist. Exiting."
        Kernel::exit
      end
    end

    def start
      trap("INT") { stop }
      @socket = TCPServer.new(@host, @port)
      log "Yarn started #{@num_workers} workers and is listening on #{@host}:#{@port}"

      init_workers

      # Waits here for all processes to exit
      Process.waitall
    end

    def init_workers
      @num_workers.times do
        @workers << fork do
          trap("INT") { exit }
          loop do
            handler ||= @app ? RackHandler.new(@app) : RequestHandler.new
            session = @socket.accept
            handler.run session 
          end
        end
      end
    end

    def stop
      @socket.close if (@socket && !@socket.closed?)

      log "Server stopped. Have a nice day!"
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
yarn-0.0.2 lib/yarn/server.rb