Class: Nobject::Local

Inherits:
Object
  • Object
show all
Defined in:
lib/nobject/local.rb

Overview

this class is used by the client application, wraps a local object, pushes it to a Nobject::Serve4r, which will then send method calls to a matching Nobject::Remote object

Defined Under Namespace

Classes: InvalidMethod, MethodRequestFailure, MethodResponseFailure, UnknownReturnDataType

Instance Method Summary collapse

Constructor Details

#initialize(host, port, obj) ⇒ Local

host: the hostname of the server to push obj to port: the port number of the server to push obj to obj: the obj to store over the network

ex:

# this will create a new Nobject::Local, then push it to the specified
server Nobject::Local.new('localhost', 1234, <object>)


15
16
17
18
19
20
21
22
23
# File 'lib/nobject/local.rb', line 15

def initialize(host, port, obj)
  @msg_counter = 0
  @socket = TCPSocket.new(host, port)
  obj_bytes = Marshal.dump(obj)

  File.open('/tmp/nobject.log', 'a') {|f| f.puts "L:#{@msg_counter += 1} #{obj_bytes.length}"; f.flush }
  @socket.send([obj_bytes.length].pack('Q>'), 0)
  @socket.send(obj_bytes, 0)
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args, **kwargs, &block) ⇒ Object



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/nobject/local.rb', line 25

def method_missing(method, *args, **kwargs, &block)
  msg = { method: method, args: args }
  msg_bytes = Marshal.dump(msg)

  begin
    @socket.send([msg_bytes.length].pack('Q>'), 0)
    File.open('/tmp/nobject.log', 'a') {|f| f.puts "  LMS:#{@msg_counter += 1} #{msg_bytes.length}"; f.flush }
    @socket.send(msg_bytes, 0)
  rescue Exception
    raise Local::MethodRequestFailure.new("did not receive response from call to `#{method}' over the network")
  end

  return_data = begin
                  Marshal.load(
                    @socket.recv(
                      @socket.recv(8).unpack('Q>').first
                    )
                  )
                rescue Exception
                  raise Local::MethodResponseFailure.new("did not receive response from call to `#{method}' over the network")
                end

  case return_data.first
  when :ok then return_data.last
  when :raise then raise return_data.last
  else
    raise Local::UnknownReturnDataType.new("unknown data type '#{return_data.first}' within Nobject::Local (Nobject::Local::UnknownReturnDataType)")
  end
end

Instance Method Details

#!~(other) ⇒ Object

method overridden from Object class



58
# File 'lib/nobject/local.rb', line 58

def !~(other);      method_missing(:is_a?, other);  end

#<=>(other) ⇒ Object



59
# File 'lib/nobject/local.rb', line 59

def <=>(other);     method_missing(:<=>, other);    end

#===(other) ⇒ Object



60
# File 'lib/nobject/local.rb', line 60

def ===(other);     method_missing(:<=>, other);    end

#inspectObject



62
# File 'lib/nobject/local.rb', line 62

def inspect;        method_missing(:inspect);       end

#is_a?(klass) ⇒ Boolean

Returns:

  • (Boolean)


61
# File 'lib/nobject/local.rb', line 61

def is_a?(klass);   method_missing(:is_a?, klass);  end

#to_sObject



63
# File 'lib/nobject/local.rb', line 63

def to_s;           method_missing(:to_s);          end