Class: Nobject::Local
- Inherits:
-
Object
- Object
- Nobject::Local
- 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
-
#!~(other) ⇒ Object
method overridden from Object class.
- #<=>(other) ⇒ Object
- #===(other) ⇒ Object
-
#initialize(host, port, obj) ⇒ Local
constructor
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.
- #inspect ⇒ Object
- #is_a?(klass) ⇒ Boolean
- #method_missing(method, *args, **kwargs, &block) ⇒ Object
- #to_s ⇒ Object
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 24 |
# 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} sz#{obj_bytes.length}"; f.flush } @socket.send([obj_bytes.length].pack('Q>'), 0) @socket.send(obj_bytes, 0) @socket.flush end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(method, *args, **kwargs, &block) ⇒ Object
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 54 55 56 57 58 59 60 61 |
# File 'lib/nobject/local.rb', line 26 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} sz#{msg_bytes.length} m:#{method}"; f.flush } @socket.send(msg_bytes, 0) @socket.flush rescue Exception raise Local::MethodRequestFailure.new("did not receive response from call to `#{method}' over the network") end return_data = begin msg_size = @socket.recv(8).unpack('Q>').first raw_bytes = @socket.recv(msg_size) File.open('/tmp/nobject.log', 'a') {|f| f.puts " LMGotit :##{@msg_counter += 1} sz#{msg_size} bytes:#{raw_bytes.length} m:#{method}"; f.flush } Marshal.load(raw_bytes) rescue Exception => e error_msg = <<~MSG did not receive response from call to `#{method}' over the network would have been msg_id #{@msg_counter} OR #{@msg_counter + 1} when trying to receive #{msg_size} bytes caused by #{e.class.name} exception backtrace: #{e.backtrace.join("\n ")} MSG raise Local::MethodResponseFailure.new(error_msg) 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
66 |
# File 'lib/nobject/local.rb', line 66 def !~(other); method_missing(:is_a?, other); end |
#<=>(other) ⇒ Object
67 |
# File 'lib/nobject/local.rb', line 67 def <=>(other); method_missing(:<=>, other); end |
#===(other) ⇒ Object
68 |
# File 'lib/nobject/local.rb', line 68 def ===(other); method_missing(:<=>, other); end |
#inspect ⇒ Object
70 |
# File 'lib/nobject/local.rb', line 70 def inspect; method_missing(:inspect); end |
#is_a?(klass) ⇒ Boolean
69 |
# File 'lib/nobject/local.rb', line 69 def is_a?(klass); method_missing(:is_a?, klass); end |
#to_s ⇒ Object
71 |
# File 'lib/nobject/local.rb', line 71 def to_s; method_missing(:to_s); end |