Class: PipeRpc::Hub

Inherits:
Object
  • Object
show all
Defined in:
lib/pipe_rpc/hub.rb,
lib/pipe_rpc/hub/message.rb,
lib/pipe_rpc/hub/requester.rb,
lib/pipe_rpc/hub/responder.rb

Defined Under Namespace

Classes: Message, Requester, Responder

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(args) ⇒ Hub

Returns a new instance of Hub.



3
4
5
6
7
8
9
10
# File 'lib/pipe_rpc/hub.rb', line 3

def initialize(args)
  @channel = args[:input]
  @socket = Socket.new(self, args)
  @requester = Requester.new(self)
  @responder = Responder.new(self)
  @clients = {}
  self.loop_iteration = nil
end

Instance Attribute Details

#channelObject (readonly)

Returns the value of attribute channel.



12
13
14
# File 'lib/pipe_rpc/hub.rb', line 12

def channel
  @channel
end

#loggerObject

Returns the value of attribute logger.



13
14
15
# File 'lib/pipe_rpc/hub.rb', line 13

def logger
  @logger
end

Instance Method Details

#add_server(servers) ⇒ Object



25
26
27
# File 'lib/pipe_rpc/hub.rb', line 25

def add_server(servers)
  @responder.add_server(servers)
end

#client_for(server_name) ⇒ Object



37
38
39
# File 'lib/pipe_rpc/hub.rb', line 37

def client_for(server_name)
  @clients[server_name] ||= Client.new(self, server: server_name)
end

#handle_messageObject



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/pipe_rpc/hub.rb', line 77

def handle_message
  message = next_message # blocks

  return unless message

  if message.notification?
    @responder.handle_notification(message.handler)
  elsif message.request?
    @responder.handle_request(message.handler) { |response| @socket.write response }
  elsif message.response?
    @requester.handle_response(message.handler)
  elsif message.error?
    raise message.handler.native_error
  else
    send_error(id: nil, code: -32600, data: { message: 'no request, result or error' })
  end
end

#log(msg) ⇒ Object



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

def log(msg)
  if logger == :reflect
    notify(server: :reflect_logger, method: :log, arguments: [msg])
  elsif logger.respond_to? :debug
    logger.debug msg
  elsif logger
    logger.call msg
  end
end

#loop_iteration=(proc) ⇒ Object



41
42
43
# File 'lib/pipe_rpc/hub.rb', line 41

def loop_iteration=(proc)
  @loop_iteration = proc
end

#notify(signature) ⇒ Object



53
54
55
# File 'lib/pipe_rpc/hub.rb', line 53

def notify(signature)
  @socket.write @requester.notification(signature)
end

#on_incoming_request(&on_request) ⇒ Object



33
34
35
# File 'lib/pipe_rpc/hub.rb', line 33

def on_incoming_request(&on_request)
  @responder.on_request(&on_request)
end

#on_received(&on_received) ⇒ Object



49
50
51
# File 'lib/pipe_rpc/hub.rb', line 49

def on_received(&on_received)
  @socket.on_read(&on_received)
end

#on_sent(&on_sent) ⇒ Object



45
46
47
# File 'lib/pipe_rpc/hub.rb', line 45

def on_sent(&on_sent)
  @socket.on_write(&on_sent)
end

#request(signature, &on_result) ⇒ Object



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/pipe_rpc/hub.rb', line 57

def request(signature, &on_result)
  result = nil
  result_ready = false

  request = @requester.request(signature) do |*response|
    result = on_result.call(*response)
    result_ready = true
  end
  @socket.write request

  loop do
    return result if result_ready
    @loop_iteration ? @loop_iteration.call : handle_message
  end
end

#rmv_server(server_name) ⇒ Object



29
30
31
# File 'lib/pipe_rpc/hub.rb', line 29

def rmv_server(server_name)
  @responder.rmv_server(server_name)
end

#send_error(error = {}) ⇒ Object



73
74
75
# File 'lib/pipe_rpc/hub.rb', line 73

def send_error(error = {})
  @socket.write ErrorResponse.new(id: error.delete(:id), error: error)
end