Sha256: 9a77db542a07dd40f200c8df733c1c44a9f08fb82170351b80a1bed3215d2697

Contents?: true

Size: 1.92 KB

Versions: 2

Compression:

Stored size: 1.92 KB

Contents

require 'rubygems'
require 'eventmachine'

require 'proxymachine/client_connection'
require 'proxymachine/server_connection'

class ProxyMachine
  MAX_FAST_SHUTDOWN_SECONDS = 10

  def self.update_procline
    $0 = "proxymachine - #{@@name} #{@@listen} - #{self.count} connections"
  end

  def self.count
    @@counter
  end

  def self.incr
    @@counter += 1
    self.update_procline
    @@counter
  end

  def self.decr
    @@counter -= 1
    if $server.nil?
      puts "Waiting for #{@@counter} connections to finish."
    end
    self.update_procline
    EM.stop if $server.nil? and @@counter == 0
    @@counter
  end

  def self.set_router(block)
    @@router = block
  end

  def self.router
    @@router
  end

  def self.graceful_shutdown(signal)
    EM.stop_server($server) if $server
    puts "Received #{signal} signal. No longer accepting new connections."
    puts "Waiting for #{ProxyMachine.count} connections to finish."
    $server = nil
    EM.stop if ProxyMachine.count == 0
  end

  def self.fast_shutdown(signal)
    EM.stop_server($server) if $server
    puts "Received #{signal} signal. No longer accepting new connections."
    puts "Maximum time to wait for connections is #{MAX_FAST_SHUTDOWN_SECONDS} seconds."
    puts "Waiting for #{ProxyMachine.count} connections to finish."
    $server = nil
    EM.stop if ProxyMachine.count == 0
    Thread.new do
      sleep MAX_FAST_SHUTDOWN_SECONDS
      exit!
    end
  end

  def self.run(name, host, port)
    @@counter = 0
    @@name = name
    @@listen = "#{host}:#{port}"
    self.update_procline
    EM.epoll

    EM.run do
      EventMachine::Protocols::ClientConnection.start(host, port)
      trap('QUIT') do
        self.graceful_shutdown('QUIT')
      end
      trap('TERM') do
        self.fast_shutdown('TERM')
      end
      trap('INT') do
        self.fast_shutdown('INT')
      end
    end
  end
end

module Kernel
  def proxy(&block)
    ProxyMachine.set_router(block)
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
proxymachine-0.2.7 lib/proxymachine.rb
proxymachine-0.2.6 lib/proxymachine.rb