Sha256: 85c0c4276fdeb1bfb48b0ad7a28bec3941d49dd06cee963b0bc9e521840de2e1

Contents?: true

Size: 1.39 KB

Versions: 1

Compression:

Stored size: 1.39 KB

Contents

$: << File.join(File.dirname(__FILE__), '..')

require 'dist'
require 'encoding'
require 'messages'
require 'rubygems'
require 'rack'

module Dist
  class Client
    include Encoding

    def initialize(address, rack_port)
      leave_a_will

      host, port = address.split(':')
      @socket = TCPSocket.new(host, port.to_i)

      @socket << Messages::REQUEST_ROLE

      receive_message Messages::SEND_ROLE_CONFIRM
      role = receive_string

      puts "Your role: #{role.dump}"

      @socket << Messages::CONFIRM_ROLE
      send_string @socket, role
      send_string @socket, rack_port

      # spin up rack app
      require "roles/#{role}/app"
      Thread.new { Rack::Handler::Mongrel.run App.new, :Port => rack_port.to_i }

      while true
        receive_message Messages::REQUEST_HEARTBEAT
        @socket << Messages::HEARTBEAT
      end
    rescue UnexpectedMessage
      puts 'Disconnected.'
    end

    private

    def leave_a_will
      graceful_death = lambda { @socket.close }
      %w[INT TERM].each { |code| Signal.trap(code, &graceful_death) }
    end

    def receive_message(expected_message=nil)
      message = @socket.recv(1)
      raise UnexpectedMessage if expected_message && expected_message != message
    end

    def receive_string
      length = @socket.recv(2).unpack('n')[0]
      return '' if !length || length < 1
      return @socket.recv(length)      
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
distributed_demo-1.0 lib/client.rb