Sha256: 6a0d3699c6383742a6b6230eaf25ffa5e106602c68254aa2b120cd7b9841e784

Contents?: true

Size: 1.69 KB

Versions: 17

Compression:

Stored size: 1.69 KB

Contents

module Pione
  module Relay
    class ReceiverSocket < DRb::DRbTCPSocket
      class ReceiverSocketError < StandardError; end

      @@table = {}

      def self.table
        @@table
      end

      # Parses special URI for reverse scheme.
      def self.parse_uri(uri)
        if uri =~ /^receiver:\/\/(.*?):(\d+)(\?(.*))?$/
          host = $1
          port = $2.to_i
          option = $4
          [host, port, option]
        else
          raise(DRb::DRbBadScheme, uri) unless uri =~ /^receiver:/
          raise(DRb::DRbBadURI, 'can\'t parse uri:' + uri)
        end
      end

      # Raises an error. You cannnot open receiver socket on caller side.
      def self.open(uri, config)
        raise DRb::DRbBadScheme.new(uri)
      end

      # Creates a fake connection.
      # @api private
      def self.open_server(uri, config)
        # reverse socket needs URI always
        raise ArgumentError.new("You should specify receiver URI.") unless uri

        # get config
        host, port, option = parse_uri(uri)

        # retrieve socket by rev_id
        key = "%s:%s" % [host, port]
        unless @@table.has_key?(key)
          raise ReceiverSocketError.new("No socket for %s." % uri)
        end
        socket = @@table[key]

        # create an instance with relay socket
        return self.new(uri, socket, config)
      end

      # Raises an error because the socket cannot accept.
      def accept
        raise ReceiverSocketError.new("ReceiverSocket cannnot accept connections.")
      end

      def close
      end

      def alive?
        true
      end

      def set_socket(*args)
      end
    end

    # install the protocol
    DRb::DRbProtocol.add_protocol(ReceiverSocket)
  end
end

Version data entries

17 entries across 17 versions & 1 rubygems

Version Path
pione-0.5.0 lib/pione/relay/receiver-socket.rb
pione-0.5.0.alpha.2 lib/pione/relay/receiver-socket.rb
pione-0.5.0.alpha.1 lib/pione/relay/receiver-socket.rb
pione-0.4.2 lib/pione/relay/receiver-socket.rb
pione-0.4.1 lib/pione/relay/receiver-socket.rb
pione-0.4.0 lib/pione/relay/receiver-socket.rb
pione-0.3.2 lib/pione/relay/receiver-socket.rb
pione-0.3.1 lib/pione/relay/receiver-socket.rb
pione-0.3.0 lib/pione/relay/receiver-socket.rb
pione-0.2.2 lib/pione/relay/receiver-socket.rb
pione-0.2.1 lib/pione/relay/receiver-socket.rb
pione-0.2.0 lib/pione/relay/receiver-socket.rb
pione-0.1.4 lib/pione/relay/receiver-socket.rb
pione-0.1.3 lib/pione/relay/receiver-socket.rb
pione-0.1.2 lib/pione/relay/receiver-socket.rb
pione-0.1.1 lib/pione/relay/receiver-socket.rb
pione-0.1.0 lib/pione/relay/receiver-socket.rb