A registry of service endpoints, implenented as a DRB server class. An internal implementation detail of Hoodoo::Services::Middleware, in most respects.

Methods
A
F
N
P
S
U
Class Public methods
new()

Create an instance ready for use as a DRb “front object”.

# File lib/hoodoo/services/discovery/discoverers/by_drb/drb_server.rb, line 105
def initialize
  @repository = {}
end
start( port = nil )

Start the DRb server. Does not return (joins the DRb thread). If the server is already running, expect an “address in use” connection exception from DRb.

$SAFE will be set to 1 (unless it is already higher) in this thread.

port

Passed to ::uri method.

# File lib/hoodoo/services/discovery/discoverers/by_drb/drb_server.rb, line 65
def self.start( port = nil )

  uri = self.uri( port )

  # For security, "disable eval() and friends":
  #
  # http://www.ruby-doc.org/stdlib-2.2.3/libdoc/drb/rdoc/DRb.html
  # https://ruby-hacking-guide.github.io/security.html
  # http://blog.recurity-labs.com/archives/2011/05/12/druby_for_penetration_testers/

  $SAFE = 1

  # Have to allow a tained port string from "outside" just to be able
  # to start the service on a given port; so untaint that deliberately.
  #
  # http://ruby-doc.com/docs/ProgrammingRuby/html/taint.html

  uri.untaint()
  $stop_queue = ::Queue.new

  ::DRb.start_service( uri,
                       FRONT_OBJECT,
                       :tcp_acl => LOCAL_ACL )

  # DRB.thread.exit() does not reliably work; sometimes, it just hangs
  # up. I don't know why. On OS X and under Travis, sporadic failures
  # to return from the "stop()" method would result. Instead, we use a
  # relatively elaborate queue; sit here waiting for a message to be
  # pushed onto it, then just let this method exit naturally, ignoring
  # the value that appeared on the queue.
  #
  # The sleep makes it more reliable too, indicating some kind of nasty
  # race condition on start-vs-wait-to-shutdown.

  sleep( 1 )
  $stop_queue.pop()
end
uri( port = nil )

URI for DRb server used during local machine development as a registry of service endpoints. Whichever service starts first runs the server which others connect to if subsequently started.

port

Optional integer port number for DRb service. If specified, this is used; else the HOODOO_DISCOVERY_BY_DRB_PORT_OVERRIDE environment variable is used; else a default of 8787 is chosen. Passing nil explicitly also leads to the use of the environment variable or default value.

# File lib/hoodoo/services/discovery/discoverers/by_drb/drb_server.rb, line 43
def self.uri( port = nil )

  port ||= ENV[ 'HOODOO_DISCOVERY_BY_DRB_PORT_OVERRIDE' ] || 8787

  # Use IP address, rather than 'localhost' here, to ensure that "address
  # in use" errors are raised immediately if a second server startup
  # attempt is made:
  #
  #   https://bugs.ruby-lang.org/issues/3052
  #
  "druby://127.0.0.1:#{ port }"

end
Instance Public methods
add( resource, version, uri )

Add an endpoint to the list. If the endpoint was already added, it will be overwritten with the new data.

resource

Resource as a String or Symbol, e.g. “Product”

version

Endpoint's implemented API version as an Integer, e.g. 1

uri

URI at which this service may be accessed, including the endpoint path (e.g. “localhost:3002/v1/products”), as a String.

# File lib/hoodoo/services/discovery/discoverers/by_drb/drb_server.rb, line 124
def add( resource, version, uri )
  @repository[ "#{ resource }/#{ version }" ] = uri
end
find( resource, version )

Find an endpoint in the list. Returns URI at which the service may be accessed as a String, or 'nil' if not found.

resource

Resource as a String or Symbol, e.g. “Product”

version

Endpoint's implemented API version as an Integer, e.g. 1

# File lib/hoodoo/services/discovery/discoverers/by_drb/drb_server.rb, line 134
def find( resource, version )
  @repository[ "#{ resource }/#{ version }" ]
end
flush()

Flush out the repository, clearing all stored service records. This is usually for test purposes only.

# File lib/hoodoo/services/discovery/discoverers/by_drb/drb_server.rb, line 141
def flush
  @repository = {}
end
ping()

Check to see if this DRb service is awake. Returns true.

# File lib/hoodoo/services/discovery/discoverers/by_drb/drb_server.rb, line 111
def ping
  return true
end
stop()

Shut down this DRb service.

# File lib/hoodoo/services/discovery/discoverers/by_drb/drb_server.rb, line 147
def stop
  $stop_queue.push( true )
end