Class: PipeRpc::Hub
- Inherits:
-
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
#channel ⇒ Object
Returns the value of attribute channel.
12
13
14
|
# File 'lib/pipe_rpc/hub.rb', line 12
def channel
@channel
end
|
#logger ⇒ Object
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_message ⇒ Object
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
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
|