pipe_rpc 0.2.0 → 0.2.2
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/lib/pipe_rpc/error_response.rb +1 -1
- data/lib/pipe_rpc/hub/message.rb +1 -1
- data/lib/pipe_rpc/hub/responder/request/error.rb +44 -0
- data/lib/pipe_rpc/hub/responder/request/error_result.rb +22 -0
- data/lib/pipe_rpc/hub/responder/request/result.rb +19 -0
- data/lib/pipe_rpc/hub/responder/request.rb +35 -0
- data/lib/pipe_rpc/hub/responder.rb +11 -62
- data/lib/pipe_rpc/hub.rb +6 -5
- data/lib/pipe_rpc/version.rb +1 -1
- data/lib/pipe_rpc.rb +3 -11
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3a46e3217d0a8f86c3f3c550958abff130034dfd
|
4
|
+
data.tar.gz: dc2d57fff58b882edec090d2351508f02bc55705
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ccd3933db763f066f5ea5db393030a7acc5c347e3b2382a636a3901415b4619bcc88184ea40e05e9c6c5a0008e78f60fd07896214aefc812c26bc49ad70731d9
|
7
|
+
data.tar.gz: 3a83c2c879e4a7704fae148372aaf732abc31a38ee658fb1fc9ca601f6c80f2760731be6c9f7c55a2805abd578c0f7e655a96660f2eef34d637baaa43ea6b7f6
|
data/lib/pipe_rpc/hub/message.rb
CHANGED
@@ -25,7 +25,7 @@ module PipeRpc
|
|
25
25
|
def handler
|
26
26
|
@handler ||= type.new(@message)
|
27
27
|
rescue => e
|
28
|
-
@hub.
|
28
|
+
@hub.send_response ErrorResponse.new(id: nil, error: { code: -32600, data: { message: e.message } })
|
29
29
|
nil
|
30
30
|
end
|
31
31
|
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module PipeRpc
|
2
|
+
class Hub::Responder::Request
|
3
|
+
class Error
|
4
|
+
def initialize(error)
|
5
|
+
@error = error
|
6
|
+
end
|
7
|
+
|
8
|
+
attr_reader :error
|
9
|
+
|
10
|
+
def code
|
11
|
+
case @error
|
12
|
+
when NoServerError then -32604
|
13
|
+
when method_call_error? && NoMethodError then -32601
|
14
|
+
when method_call_error? && ArgumentError then -32602
|
15
|
+
when InternalError then -32605
|
16
|
+
when StandardError then -32603
|
17
|
+
else nil
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def message
|
22
|
+
@error.message
|
23
|
+
end
|
24
|
+
|
25
|
+
def backtrace
|
26
|
+
@error.backtrace.to_a.dup.tap do |backtrace|
|
27
|
+
# In ruby, backtraces of argument errors have the location of the
|
28
|
+
# method definition and not from where it is called as first location
|
29
|
+
# in the backtrace. To normalize argument and no method errors,
|
30
|
+
# remove the first location for argument errors.
|
31
|
+
backtrace.shift if @error.is_a?(ArgumentError) and not Object.const_defined?(:MRUBY_VERSION)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def method_call_error?
|
36
|
+
if Object.const_defined?(:MRUBY_VERSION)
|
37
|
+
backtrace.first.nil?
|
38
|
+
else
|
39
|
+
backtrace.first.split(':').first(2) == [CALL_FILE, CALL_LINENO.to_s]
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module PipeRpc
|
2
|
+
class Hub::Responder::Request
|
3
|
+
class ErrorResult
|
4
|
+
def initialize(request, error)
|
5
|
+
@request, @error = request, Error.new(error)
|
6
|
+
end
|
7
|
+
|
8
|
+
def value
|
9
|
+
@error.error
|
10
|
+
end
|
11
|
+
|
12
|
+
def asynchronous?
|
13
|
+
false
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_response
|
17
|
+
ErrorResponse.new(id: @request.id, error: { code: @error.code, data: { message: @error.message,
|
18
|
+
backtrace: @error.backtrace, method: @request.method, args: @request.arguments } })
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module PipeRpc
|
2
|
+
class Hub::Responder::Request::Result
|
3
|
+
def initialize(request, result)
|
4
|
+
@request, @result = request, result
|
5
|
+
end
|
6
|
+
|
7
|
+
def value
|
8
|
+
@result
|
9
|
+
end
|
10
|
+
|
11
|
+
def asynchronous?
|
12
|
+
@result == @request.evaluate_result_proc
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_response
|
16
|
+
ResultResponse.new(id: @request.id, result: @result)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module PipeRpc
|
2
|
+
class Hub::Responder
|
3
|
+
class Request
|
4
|
+
def initialize(responder, request)
|
5
|
+
@responder, @request = responder, request
|
6
|
+
end
|
7
|
+
|
8
|
+
def id
|
9
|
+
@request.id
|
10
|
+
end
|
11
|
+
|
12
|
+
CALL_FILE, CALL_LINENO = __FILE__, __LINE__+3
|
13
|
+
def handle
|
14
|
+
evaluate_result do
|
15
|
+
@responder.servers[@request.server].__send__(@request.method, *@request.arguments, &evaluate_result_proc)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def evaluate_result(result = nil, &block)
|
20
|
+
result = Result.new(self, block_given? ? yield : result)
|
21
|
+
rescue Exception => e
|
22
|
+
result = ErrorResult.new(@request, e)
|
23
|
+
ensure
|
24
|
+
@responder.send_response(result.to_response) unless result.asynchronous?
|
25
|
+
return result.value
|
26
|
+
end
|
27
|
+
|
28
|
+
def evaluate_result_proc
|
29
|
+
@evaluate_result_proc ||= proc do |result = nil, &block|
|
30
|
+
evaluate_result(result, &block)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -3,7 +3,11 @@ module PipeRpc
|
|
3
3
|
class Responder
|
4
4
|
def initialize(hub)
|
5
5
|
@hub = hub
|
6
|
-
@servers = {}
|
6
|
+
@servers = Hash.new{ |hash, key| ::Kernel.raise NoServerError.new("no server #{key}") }
|
7
|
+
end
|
8
|
+
|
9
|
+
def servers
|
10
|
+
@servers.dup
|
7
11
|
end
|
8
12
|
|
9
13
|
def add_server(servers)
|
@@ -19,71 +23,16 @@ module PipeRpc
|
|
19
23
|
end
|
20
24
|
|
21
25
|
def handle_notification(notification)
|
22
|
-
handle_request(notification)
|
23
|
-
end
|
24
|
-
|
25
|
-
def handle_request(request, &on_result)
|
26
|
-
id, server, method, args = request.id, @servers[request.server], request.method, request.arguments
|
27
|
-
|
28
|
-
unless server
|
29
|
-
@hub.send_error(id: id, code: -32604)
|
30
|
-
return
|
31
|
-
end
|
32
|
-
|
33
|
-
async = proc do |result|
|
34
|
-
on_result.call ResultResponse.new(id: id, result: result)
|
35
|
-
end
|
36
|
-
|
37
|
-
@on_request.call(server, method, args) if @on_request
|
38
|
-
|
39
|
-
# methods returning the async block as result state that they are asynchronous!
|
40
|
-
method_lineno = __LINE__+1
|
41
|
-
result = server.__send__(method, *args, &async)
|
42
|
-
|
43
|
-
# directly return result for synchronous calls
|
44
|
-
async.call(result) unless result == async
|
45
|
-
|
46
|
-
rescue NoMethodError => e
|
47
|
-
backtrace = e.backtrace.to_a
|
48
|
-
code = itself_caused_no_method_error?(backtrace, method_lineno) ? -32601 : -32603
|
49
|
-
@hub.send_error(id: id, code: code, data: { message: e.message, method: e.name,
|
50
|
-
args: e.args, backtrace: backtrace })
|
51
|
-
|
52
|
-
rescue ArgumentError => e
|
53
|
-
backtrace = e.backtrace.to_a
|
54
|
-
code = itself_caused_argument_error?(backtrace, method_lineno) ? -32602 : -32603
|
55
|
-
@hub.send_error(id: id, code: code, data: { message: e.message, backtrace: backtrace })
|
56
|
-
|
57
|
-
rescue InternalError => e # raised on the other side
|
58
|
-
backtrace = e.backtrace.to_a
|
59
|
-
@hub.send_error(id: id, code: -32605, data: { message: e.message, backtrace: backtrace })
|
60
|
-
|
61
|
-
rescue => e
|
62
|
-
backtrace = e.backtrace.to_a
|
63
|
-
@hub.send_error(id: id, code: -32603, data: { message: e.message, backtrace: backtrace })
|
64
|
-
end
|
65
|
-
|
66
|
-
private
|
67
|
-
|
68
|
-
def itself_caused_no_method_error?(backtrace, ref_lineno)
|
69
|
-
if Object.const_defined?(:MRUBY_VERSION)
|
70
|
-
!backtrace[0]
|
71
|
-
else
|
72
|
-
itself_caused_error?(backtrace[0], ref_lineno)
|
73
|
-
end
|
26
|
+
handle_request(notification)
|
74
27
|
end
|
75
28
|
|
76
|
-
def
|
77
|
-
|
78
|
-
|
79
|
-
else
|
80
|
-
itself_caused_error?(backtrace[1], ref_lineno)
|
81
|
-
end
|
29
|
+
def handle_request(request)
|
30
|
+
@on_request.call(request.server, request.method, request.arguments) if @on_request
|
31
|
+
Request.new(self, request).handle
|
82
32
|
end
|
83
33
|
|
84
|
-
def
|
85
|
-
|
86
|
-
(file == __FILE__) and (lineno.to_i == ref_lineno)
|
34
|
+
def send_response(response)
|
35
|
+
@hub.send_response response
|
87
36
|
end
|
88
37
|
end
|
89
38
|
end
|
data/lib/pipe_rpc/hub.rb
CHANGED
@@ -70,8 +70,8 @@ module PipeRpc
|
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
73
|
-
def
|
74
|
-
@socket.write
|
73
|
+
def send_response(response)
|
74
|
+
@socket.write response
|
75
75
|
end
|
76
76
|
|
77
77
|
def handle_message
|
@@ -82,13 +82,14 @@ module PipeRpc
|
|
82
82
|
if message.notification?
|
83
83
|
@responder.handle_notification(message.handler)
|
84
84
|
elsif message.request?
|
85
|
-
@responder.handle_request(message.handler)
|
85
|
+
@responder.handle_request(message.handler)
|
86
86
|
elsif message.response?
|
87
87
|
@requester.handle_response(message.handler)
|
88
88
|
elsif message.error?
|
89
89
|
raise message.handler.native_error
|
90
90
|
else
|
91
|
-
|
91
|
+
send_response ErrorResponse.new(id: nil, error: { code: -32600,
|
92
|
+
data: { message: 'no request, result or error' } })
|
92
93
|
end
|
93
94
|
end
|
94
95
|
|
@@ -97,7 +98,7 @@ module PipeRpc
|
|
97
98
|
def next_message
|
98
99
|
Message.new(self, @socket.read) # blocks
|
99
100
|
rescue => e
|
100
|
-
|
101
|
+
send_response ErrorResponse.new(id: nil, error: { code: -32700, data: { message: e.message } })
|
101
102
|
nil
|
102
103
|
end
|
103
104
|
end
|
data/lib/pipe_rpc/version.rb
CHANGED
data/lib/pipe_rpc.rb
CHANGED
@@ -3,14 +3,6 @@ end
|
|
3
3
|
|
4
4
|
require 'json'
|
5
5
|
require_relative 'hash'
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
require_relative "pipe_rpc/result_response"
|
10
|
-
require_relative "pipe_rpc/error_response"
|
11
|
-
require_relative "pipe_rpc/socket"
|
12
|
-
require_relative "pipe_rpc/client"
|
13
|
-
require_relative "pipe_rpc/hub"
|
14
|
-
require_relative "pipe_rpc/hub/message"
|
15
|
-
require_relative "pipe_rpc/hub/requester"
|
16
|
-
require_relative "pipe_rpc/hub/responder"
|
6
|
+
|
7
|
+
lib = File.dirname(__FILE__)
|
8
|
+
Dir["#{lib}/pipe_rpc/**/*.rb"].sort.each { |f| require f }
|
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: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christopher Aue
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-01-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|
@@ -105,6 +105,10 @@ files:
|
|
105
105
|
- lib/pipe_rpc/hub/message.rb
|
106
106
|
- lib/pipe_rpc/hub/requester.rb
|
107
107
|
- lib/pipe_rpc/hub/responder.rb
|
108
|
+
- lib/pipe_rpc/hub/responder/request.rb
|
109
|
+
- lib/pipe_rpc/hub/responder/request/error.rb
|
110
|
+
- lib/pipe_rpc/hub/responder/request/error_result.rb
|
111
|
+
- lib/pipe_rpc/hub/responder/request/result.rb
|
108
112
|
- lib/pipe_rpc/request.rb
|
109
113
|
- lib/pipe_rpc/result_response.rb
|
110
114
|
- lib/pipe_rpc/socket.rb
|