Sha256: a592a26eced420cc0c800250e0c34bce72597e318b9e2d76066ec3707baa4fda

Contents?: true

Size: 1.93 KB

Versions: 1

Compression:

Stored size: 1.93 KB

Contents

module EventMachine
  module ProxyServer
    class Connection < EventMachine::Connection

      ##### Proxy Methods
      def on_data(&blk); @on_data = blk; end
      def on_response(&blk); @on_response = blk; end
      def on_finish(&blk); @on_finish = blk; end

      ##### EventMachine
      def initialize
        @servers = {}
      end

      def receive_data(data)
        p [:connection, data]
        processed = @on_data.call(data)

        if processed.is_a? Array
          data, servers = *processed

          # guard for "unbound" servers
          servers = servers.collect {|s| @servers[s]}.compact
        else
          data = processed
          servers ||= @servers.values.compact
        end

        servers.each do |s|
          s.send_data data unless data.nil?
        end
      end

      #
      # initialize connections to backend servers
      #
      def server(name, opts)
        srv = EventMachine::connect(opts[:host], opts[:port], EventMachine::ProxyServer::Backend) do |c|
          c.name = name
          c.plexer = self
        end

        @servers[name] = srv
      end

      #
      # relay data from backend server to client
      #
      def relay_from_backend(name, data)
        p [:relay_from_backend, name, data]

        data = @on_response.call(name, data)
        send_data data unless data.nil?
      end

      def unbind
        # terminate any unfinished connections
        @servers.values.compact.each do |s|
          s.close_connection_after_writing
        end

        close_connection_after_writing
        @on_finish.call(:done) if @servers.values.compact.size.zero? if @on_finish
      end

      def unbind_backend(name)
        p [:unbind_backend, name]
        @servers[name] = nil
        @on_finish.call(name) if @on_finish
        close_connection_after_writing if @servers.values.compact.size.zero?
      end

    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
fizx-em-proxy-0.1.1 lib/em-proxy/connection.rb