pipe_rpc 2.1.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rspec +0 -1
- data/lib/pipe_rpc/basic_interface.rb +1 -1
- data/lib/pipe_rpc/client.rb +0 -4
- data/lib/pipe_rpc/client_request.rb +1 -22
- data/lib/pipe_rpc/client_request_result.rb +1 -3
- data/lib/pipe_rpc/deep_mapper.rb +36 -0
- data/lib/pipe_rpc/error.rb +1 -0
- data/lib/pipe_rpc/hub_request.rb +5 -2
- data/lib/pipe_rpc/hub_request_result.rb +2 -2
- data/lib/pipe_rpc/hub_server.rb +4 -2
- data/lib/pipe_rpc/hub_servers.rb +10 -4
- data/lib/pipe_rpc/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 133a22837afd6032e1de590b632c2715f4e4913c
|
4
|
+
data.tar.gz: aa8338e1c9f4d3fad11f5a1ca2b3923c1704b023
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 924584159e80cf3e6dfec8ccf288ba122985e0f9a29f6e3f8734b74cca608436e0b15f34aeeb409bd53990d5957f2b7688d84687eb06bd02e17ded15a13575d9
|
7
|
+
data.tar.gz: 997155d89f123a5da38e7190a9e6d1de9d1e46e479c84834c1a810b5f5279da6d757b71b4f49d7612780716e5a84544bcade5c942287837d2482659a4fbad9be
|
data/.rspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module PipeRpc
|
2
2
|
class BasicInterface < BasicObject
|
3
|
-
wanted_methods = [:initialize, :__id__, :__send__, :respond_to?, :method_missing]
|
3
|
+
wanted_methods = [:initialize, :__id__, :object_id, :__send__, :respond_to?, :method_missing]
|
4
4
|
|
5
5
|
existing_methods = if ::Object.const_defined?(:MRUBY_VERSION)
|
6
6
|
[:initialize, :method_missing]
|
data/lib/pipe_rpc/client.rb
CHANGED
@@ -4,7 +4,7 @@ module PipeRpc
|
|
4
4
|
class Client::Request < Request
|
5
5
|
def initialize(hub, request)
|
6
6
|
@hub = hub
|
7
|
-
request[:arguments] =
|
7
|
+
request[:arguments] = DeepMapper.to_transport(request[:arguments], hub)
|
8
8
|
super request
|
9
9
|
# discard first three entries mentioning Client::Request#initialize,
|
10
10
|
# Client::Request.new and Client#method_missing in stacktrace
|
@@ -22,26 +22,5 @@ module PipeRpc
|
|
22
22
|
def id
|
23
23
|
@id or raise 'id not set'
|
24
24
|
end
|
25
|
-
|
26
|
-
def arguments_to_server_ids(arguments)
|
27
|
-
deep_map(arguments) do |value|
|
28
|
-
if value.respond_to? :__rpc_server_id__ # is a client
|
29
|
-
value.__rpc_server_id__
|
30
|
-
elsif value.respond_to? :to_rpc_server_id # is a servable
|
31
|
-
@hub.servers.add(value)
|
32
|
-
value.to_rpc_server_id
|
33
|
-
else
|
34
|
-
value
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def deep_map(object, &mapper)
|
40
|
-
case object
|
41
|
-
when Hash then object.map{ |k, v| [k, deep_map(v, &mapper)] }.to_h
|
42
|
-
when Array then object.map{ |item| deep_map(item, &mapper) }
|
43
|
-
else yield object
|
44
|
-
end
|
45
|
-
end
|
46
25
|
end
|
47
26
|
end
|
@@ -18,9 +18,7 @@ module PipeRpc
|
|
18
18
|
@value.set_backtrace(@value.backtrace.to_a + @request.stacktrace) if @value.respond_to? :set_backtrace
|
19
19
|
raise @value
|
20
20
|
else
|
21
|
-
|
22
|
-
(@request.hub.servers.registered? value) ? @request.hub.servers[value] : value
|
23
|
-
end
|
21
|
+
DeepMapper.from_transport(@value, @request.hub)
|
24
22
|
end
|
25
23
|
end
|
26
24
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module PipeRpc
|
2
|
+
class DeepMapper
|
3
|
+
def self.map(object, &mapper)
|
4
|
+
case object
|
5
|
+
when Hash then object.map{ |k, v| [k, map(v, &mapper)] }.to_h
|
6
|
+
when Array then object.map{ |item| map(item, &mapper) }
|
7
|
+
else yield object
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.to_transport(object, hub)
|
12
|
+
map(object) do |value|
|
13
|
+
if value.respond_to? :__rpc_server_id__
|
14
|
+
"__rpc_client__#{value.__rpc_server_id__}"
|
15
|
+
elsif value.respond_to? :to_rpc_server_id
|
16
|
+
hub.servers.add(value) unless hub.servers.registered? value.to_rpc_server_id
|
17
|
+
"__rpc_server__#{value.to_rpc_server_id}"
|
18
|
+
else
|
19
|
+
value
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.from_transport(object, hub)
|
25
|
+
map(object) do |value|
|
26
|
+
if value.is_a?(String) and value.start_with?('__rpc_client__')
|
27
|
+
hub.servers[value.sub('__rpc_client__', '')]
|
28
|
+
elsif value.is_a?(String) and value.start_with?('__rpc_server__')
|
29
|
+
Client.new(value.sub('__rpc_server__', ''), hub)
|
30
|
+
else
|
31
|
+
value
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/pipe_rpc/error.rb
CHANGED
data/lib/pipe_rpc/hub_request.rb
CHANGED
@@ -7,13 +7,16 @@ module PipeRpc
|
|
7
7
|
super body
|
8
8
|
end
|
9
9
|
|
10
|
-
|
10
|
+
attr_reader :hub
|
11
|
+
|
11
12
|
def handle
|
12
13
|
evaluate_result do
|
13
14
|
# the block is passed for asynchronous evaluation
|
14
|
-
|
15
|
+
mapped_arguments = DeepMapper.from_transport(arguments, @hub)
|
16
|
+
@hub.servers[server].__send__(method, *mapped_arguments, &evaluate_result_proc)
|
15
17
|
end
|
16
18
|
end
|
19
|
+
CALL_FILE, CALL_LINENO = __FILE__, __LINE__-3
|
17
20
|
|
18
21
|
def evaluate_result(result = nil, &block)
|
19
22
|
result = Result.new(self, block_given? ? yield : result)
|
@@ -5,11 +5,11 @@ module PipeRpc
|
|
5
5
|
end
|
6
6
|
|
7
7
|
def value
|
8
|
-
@result
|
8
|
+
DeepMapper.to_transport(@result, @request.hub)
|
9
9
|
end
|
10
10
|
|
11
11
|
def to_response
|
12
|
-
ResultResponse.new(id: @request.id, result:
|
12
|
+
ResultResponse.new(id: @request.id, result: value)
|
13
13
|
end
|
14
14
|
end
|
15
15
|
end
|
data/lib/pipe_rpc/hub_server.rb
CHANGED
@@ -3,17 +3,19 @@ module PipeRpc
|
|
3
3
|
kernel = ::Kernel.dup
|
4
4
|
kernel.class_eval do
|
5
5
|
alias_method :__rpc_server_class__, :class
|
6
|
-
(instance_methods - [:__rpc_server_class__]).each{ |m| remove_method m }
|
6
|
+
(instance_methods - [:__rpc_server_class__, :object_id]).each{ |m| remove_method m }
|
7
7
|
private_instance_methods.each{ |m| remove_method m } if respond_to? :private_instance_methods
|
8
8
|
end
|
9
9
|
include kernel
|
10
10
|
|
11
|
+
SERVER_ID_GETTER = :__id__
|
12
|
+
|
11
13
|
def self.const_missing(name)
|
12
14
|
::Object.const_get(name)
|
13
15
|
end
|
14
16
|
|
15
17
|
def to_rpc_server_id
|
16
|
-
"#{
|
18
|
+
"#{__rpc_server_class__.to_s}##{__send__(__rpc_server_class__::SERVER_ID_GETTER)}".to_sym
|
17
19
|
end
|
18
20
|
end
|
19
21
|
end
|
data/lib/pipe_rpc/hub_servers.rb
CHANGED
@@ -4,11 +4,17 @@ module PipeRpc
|
|
4
4
|
@servers = Hash.new{ |hash, key| raise NoServerError.new("no server #{key}") }
|
5
5
|
end
|
6
6
|
|
7
|
-
def add(
|
8
|
-
if
|
9
|
-
|
7
|
+
def add(server)
|
8
|
+
id, server = if server.respond_to? :to_rpc_server_id
|
9
|
+
[server.to_rpc_server_id, server]
|
10
10
|
else
|
11
|
-
|
11
|
+
server.first
|
12
|
+
end
|
13
|
+
|
14
|
+
if registered? id
|
15
|
+
raise ServerRegistrationError.new("server id #{id.inspect} already used for another server")
|
16
|
+
else
|
17
|
+
@servers[id] = server
|
12
18
|
end
|
13
19
|
end
|
14
20
|
|
data/lib/pipe_rpc/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pipe_rpc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christopher Aue
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-09-
|
11
|
+
date: 2016-09-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: msgpack
|
@@ -105,6 +105,7 @@ files:
|
|
105
105
|
- lib/pipe_rpc/client_request_response.rb
|
106
106
|
- lib/pipe_rpc/client_request_result.rb
|
107
107
|
- lib/pipe_rpc/client_request_result_response.rb
|
108
|
+
- lib/pipe_rpc/deep_mapper.rb
|
108
109
|
- lib/pipe_rpc/error.rb
|
109
110
|
- lib/pipe_rpc/error_response.rb
|
110
111
|
- lib/pipe_rpc/gateway.rb
|