msgpack-rpc 0.4.0 → 0.4.1
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.
- data/ChangeLog +17 -0
- data/lib/msgpack/rpc.rb +98 -13
- data/lib/msgpack/rpc/client.rb +2 -2
- data/lib/msgpack/rpc/dispatcher.rb +9 -71
- data/lib/msgpack/rpc/exception.rb +169 -11
- data/lib/msgpack/rpc/exception.rb.old +303 -0
- data/lib/msgpack/rpc/future.rb +16 -13
- data/lib/msgpack/rpc/multi_future.rb +190 -0
- data/lib/msgpack/rpc/server.rb +106 -5
- data/lib/msgpack/rpc/session.rb +51 -11
- data/lib/msgpack/rpc/transport/tcp.rb +12 -3
- data/lib/msgpack/rpc/transport/udp.rb +9 -3
- data/lib/msgpack/rpc/transport/unix.rb +12 -3
- data/lib/msgpack/rpc/version.rb +7 -0
- data/test/msgpack_rpc_test.rb +0 -1
- data/test/test_helper.rb +4 -0
- metadata +48 -21
data/lib/msgpack/rpc/server.rb
CHANGED
@@ -30,8 +30,16 @@ class Server < SessionPool
|
|
30
30
|
@listeners = []
|
31
31
|
end
|
32
32
|
|
33
|
+
# 1. serve(dispatcher)
|
34
|
+
# 2. serve(obj, accept = obj.public_methods)
|
33
35
|
def serve(obj, accept = obj.public_methods)
|
34
|
-
|
36
|
+
if obj.is_a?(Dispatcher)
|
37
|
+
# 2.
|
38
|
+
@dispatcher = obj
|
39
|
+
else
|
40
|
+
# 1.
|
41
|
+
@dispatcher = ObjectDispatcher.new(obj, accept)
|
42
|
+
end
|
35
43
|
self
|
36
44
|
end
|
37
45
|
|
@@ -70,12 +78,81 @@ class Server < SessionPool
|
|
70
78
|
# from ServerTransport
|
71
79
|
def on_request(sendable, msgid, method, param) #:nodoc:
|
72
80
|
responder = Responder.new(sendable, msgid)
|
73
|
-
|
81
|
+
dispatch_method(method, param, responder)
|
74
82
|
end
|
75
83
|
|
76
84
|
# from ServerTransport
|
77
85
|
def on_notify(method, param) #:nodoc:
|
78
|
-
|
86
|
+
responder = NullResponder.new
|
87
|
+
dispatch_method(method, param, responder)
|
88
|
+
end
|
89
|
+
|
90
|
+
private
|
91
|
+
def dispatch_method(method, param, responder) #:nodoc:
|
92
|
+
begin
|
93
|
+
sent = false
|
94
|
+
early_result = nil
|
95
|
+
result = @dispatcher.dispatch(method, param) do |result_|
|
96
|
+
unless result_.is_a?(AsyncResult)
|
97
|
+
responder.result(result_)
|
98
|
+
sent = true
|
99
|
+
end
|
100
|
+
early_result = result_
|
101
|
+
end
|
102
|
+
|
103
|
+
#FIXME on NoMethodError
|
104
|
+
# res.error(NO_METHOD_ERROR); return
|
105
|
+
|
106
|
+
#FIXME on ArgumentError
|
107
|
+
# res.error(ArgumentError); return
|
108
|
+
|
109
|
+
rescue
|
110
|
+
responder.error($!.to_s)
|
111
|
+
return
|
112
|
+
end
|
113
|
+
|
114
|
+
if early_result.is_a?(AsyncResult)
|
115
|
+
early_result.set_responder(responder)
|
116
|
+
elsif sent
|
117
|
+
return
|
118
|
+
elsif result.is_a?(AsyncResult)
|
119
|
+
result.set_responder(responder)
|
120
|
+
else
|
121
|
+
responder.result(result)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
|
127
|
+
class AsyncResult
|
128
|
+
def initialize
|
129
|
+
@responder = nil
|
130
|
+
@sent = false
|
131
|
+
end
|
132
|
+
|
133
|
+
def result(retval, err = nil)
|
134
|
+
unless @sent
|
135
|
+
if @responder
|
136
|
+
@responder.result(retval, err)
|
137
|
+
else
|
138
|
+
@result = [retval, err]
|
139
|
+
end
|
140
|
+
@sent = true
|
141
|
+
end
|
142
|
+
nil
|
143
|
+
end
|
144
|
+
|
145
|
+
def error(err)
|
146
|
+
result(nil, err)
|
147
|
+
nil
|
148
|
+
end
|
149
|
+
|
150
|
+
def set_responder(res) #:nodoc:
|
151
|
+
@responder = res
|
152
|
+
if @sent && @result
|
153
|
+
@responder.result(*@result)
|
154
|
+
@result = nil
|
155
|
+
end
|
79
156
|
end
|
80
157
|
end
|
81
158
|
|
@@ -84,11 +161,20 @@ class Responder
|
|
84
161
|
def initialize(sendable, msgid)
|
85
162
|
@sendable = sendable # send_message method is required
|
86
163
|
@msgid = msgid
|
164
|
+
@sent = false
|
165
|
+
end
|
166
|
+
|
167
|
+
def sent?
|
168
|
+
@sent
|
87
169
|
end
|
88
170
|
|
89
171
|
def result(retval, err = nil)
|
90
|
-
|
91
|
-
|
172
|
+
unless @sent
|
173
|
+
data = [RESPONSE, @msgid, err, retval].to_msgpack
|
174
|
+
@sendable.send_data(data)
|
175
|
+
@sent = true
|
176
|
+
end
|
177
|
+
nil
|
92
178
|
end
|
93
179
|
|
94
180
|
def error(err, retval = nil)
|
@@ -97,6 +183,21 @@ class Responder
|
|
97
183
|
end
|
98
184
|
|
99
185
|
|
186
|
+
class NullResponder
|
187
|
+
def sent?
|
188
|
+
true
|
189
|
+
end
|
190
|
+
|
191
|
+
def result(retval, err = nil)
|
192
|
+
nil
|
193
|
+
end
|
194
|
+
|
195
|
+
def error(err, retval = nil)
|
196
|
+
nil
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
|
100
201
|
#:nodoc:
|
101
202
|
class Server::Base
|
102
203
|
def initialize(*args)
|
data/lib/msgpack/rpc/session.rb
CHANGED
@@ -37,12 +37,12 @@ class Session
|
|
37
37
|
|
38
38
|
# backward compatibility
|
39
39
|
def port #:nodoc:
|
40
|
-
@address.port
|
40
|
+
@address.port
|
41
41
|
end
|
42
42
|
|
43
43
|
# backward compatibility
|
44
44
|
def host #:nodoc:
|
45
|
-
@address.host
|
45
|
+
@address.host
|
46
46
|
end
|
47
47
|
|
48
48
|
# call-seq:
|
@@ -51,7 +51,17 @@ class Session
|
|
51
51
|
# Calls remote method.
|
52
52
|
# This method is same as call_async(method, *args).get
|
53
53
|
def call(method, *args)
|
54
|
-
|
54
|
+
send_request(method, args).get
|
55
|
+
end
|
56
|
+
|
57
|
+
# call-seq:
|
58
|
+
# call_apply(symbol, params) -> result of remote method
|
59
|
+
#
|
60
|
+
# Calls remote method.
|
61
|
+
# This method is same as call(method, *args) excepting that
|
62
|
+
# the arugment is a array.
|
63
|
+
def call_apply(method, params)
|
64
|
+
send_request(method, params).get
|
55
65
|
end
|
56
66
|
|
57
67
|
# call-seq:
|
@@ -63,6 +73,16 @@ class Session
|
|
63
73
|
future = send_request(method, args)
|
64
74
|
end
|
65
75
|
|
76
|
+
# call-seq:
|
77
|
+
# call_async_apply(symbol, params) -> Future
|
78
|
+
#
|
79
|
+
# Calls remote method asynchronously.
|
80
|
+
# This method is same as call_async(method, *args) excepting that
|
81
|
+
# the arugment is a array.
|
82
|
+
def call_async_apply(method, params)
|
83
|
+
future = send_request(method, params)
|
84
|
+
end
|
85
|
+
|
66
86
|
# backward compatibility
|
67
87
|
alias send call_async #:nodoc:
|
68
88
|
|
@@ -78,6 +98,19 @@ class Session
|
|
78
98
|
future
|
79
99
|
end
|
80
100
|
|
101
|
+
# call-seq:
|
102
|
+
# callback_apply(symbol, params) {|future| }
|
103
|
+
#
|
104
|
+
# Calls remote method asynchronously.
|
105
|
+
# The callback method is called with Future when the result is reached.
|
106
|
+
# This method is same as callback(method, *args).attach_callback {|future| }
|
107
|
+
# excepting that the argument is a array.
|
108
|
+
def callback_apply(method, params, &block)
|
109
|
+
future = send_request(method, params)
|
110
|
+
future.attach_callback(block)
|
111
|
+
future
|
112
|
+
end
|
113
|
+
|
81
114
|
# call-seq:
|
82
115
|
# notify(symbol, *args) -> nil
|
83
116
|
#
|
@@ -89,6 +122,19 @@ class Session
|
|
89
122
|
nil
|
90
123
|
end
|
91
124
|
|
125
|
+
# call-seq:
|
126
|
+
# notify_apply(symbol, params) -> nil
|
127
|
+
#
|
128
|
+
# Calls remote method with NOTIFY protocol.
|
129
|
+
# It doesn't require server to return results.
|
130
|
+
# This method is non-blocking and returns nil.
|
131
|
+
# This method is same as notify(method, *args) excepting that
|
132
|
+
# the argument is a array.
|
133
|
+
def notify_apply(method, params)
|
134
|
+
send_notify(method, params)
|
135
|
+
nil
|
136
|
+
end
|
137
|
+
|
92
138
|
# Closes underlaying Transport and destroy resources.
|
93
139
|
def close
|
94
140
|
@transport.close
|
@@ -107,10 +153,7 @@ class Session
|
|
107
153
|
# from ClientTransport
|
108
154
|
def on_connect_failed #:nodoc:
|
109
155
|
@reqtable.reject! {|msgid, future|
|
110
|
-
|
111
|
-
future.set_result ConnectError.new, nil
|
112
|
-
rescue
|
113
|
-
end
|
156
|
+
future.set_result ConnectionTimeoutError::CODE, ["connection timed out"]
|
114
157
|
true
|
115
158
|
}
|
116
159
|
nil
|
@@ -126,10 +169,7 @@ class Session
|
|
126
169
|
end
|
127
170
|
}
|
128
171
|
timedout.each {|future|
|
129
|
-
|
130
|
-
future.set_result TimeoutError.new, nil
|
131
|
-
rescue
|
132
|
-
end
|
172
|
+
future.set_result TimeoutError::CODE, ["request timed out"]
|
133
173
|
}
|
134
174
|
!@reqtable.empty?
|
135
175
|
end
|
@@ -37,6 +37,15 @@ class TCPTransport
|
|
37
37
|
@pac = MessagePack::Unpacker.new
|
38
38
|
end
|
39
39
|
|
40
|
+
# from Rev::TCPSocket
|
41
|
+
def on_readable
|
42
|
+
super
|
43
|
+
rescue
|
44
|
+
# FIXME send Connection Close message
|
45
|
+
# FIXME log
|
46
|
+
close
|
47
|
+
end
|
48
|
+
|
40
49
|
# from Rev::TCPSocket
|
41
50
|
def on_read(data)
|
42
51
|
@pac.feed(data)
|
@@ -142,12 +151,12 @@ class TCPClientTransport
|
|
142
151
|
|
143
152
|
# MessageReceiver interface
|
144
153
|
def on_request(msgid, method, param)
|
145
|
-
raise
|
154
|
+
raise Error.new("request message on client session")
|
146
155
|
end
|
147
156
|
|
148
157
|
# MessageReceiver interface
|
149
158
|
def on_notify(method, param)
|
150
|
-
raise
|
159
|
+
raise Error.new("notify message on client session")
|
151
160
|
end
|
152
161
|
|
153
162
|
# MessageReceiver interface
|
@@ -232,7 +241,7 @@ class TCPServerTransport
|
|
232
241
|
|
233
242
|
# MessageReceiver interface
|
234
243
|
def on_response(msgid, error, result)
|
235
|
-
raise
|
244
|
+
raise Error.new("response message on server session")
|
236
245
|
end
|
237
246
|
end
|
238
247
|
end
|
@@ -29,7 +29,10 @@ class UDPTransport
|
|
29
29
|
end
|
30
30
|
|
31
31
|
class BasicSocket < Rev::IOWatcher
|
32
|
+
HAVE_DNRL = UDPSocket.public_instance_methods.include?(:do_not_reverse_lookup)
|
33
|
+
|
32
34
|
def initialize(io)
|
35
|
+
io.do_not_reverse_lookup = true if HAVE_DNRL
|
33
36
|
super(io)
|
34
37
|
@io = io
|
35
38
|
end
|
@@ -46,6 +49,9 @@ class UDPTransport
|
|
46
49
|
# FIXME multiple objects in one message
|
47
50
|
obj = MessagePack.unpack(data)
|
48
51
|
on_message(obj, addr)
|
52
|
+
rescue
|
53
|
+
# FIXME log
|
54
|
+
return
|
49
55
|
end
|
50
56
|
|
51
57
|
include MessageReceiver
|
@@ -98,12 +104,12 @@ class UDPClientTransport
|
|
98
104
|
|
99
105
|
# MessageReceiver interface
|
100
106
|
def on_request(msgid, method, param, addr)
|
101
|
-
raise
|
107
|
+
raise Error.new("request message on client session")
|
102
108
|
end
|
103
109
|
|
104
110
|
# MessageReceiver interface
|
105
111
|
def on_notify(method, param, addr)
|
106
|
-
raise
|
112
|
+
raise Error.new("notify message on client session")
|
107
113
|
end
|
108
114
|
|
109
115
|
# MessageReceiver interface
|
@@ -169,7 +175,7 @@ class UDPServerTransport
|
|
169
175
|
|
170
176
|
# MessageReceiver interface
|
171
177
|
def on_response(msgid, error, result, addr)
|
172
|
-
raise
|
178
|
+
raise Error.new("response message on server session")
|
173
179
|
end
|
174
180
|
end
|
175
181
|
|
@@ -34,6 +34,15 @@ class UNIXTransport
|
|
34
34
|
@pac = MessagePack::Unpacker.new
|
35
35
|
end
|
36
36
|
|
37
|
+
# from Rev::TCPSocket
|
38
|
+
def on_readable
|
39
|
+
super
|
40
|
+
rescue
|
41
|
+
# FIXME send Connection Close message
|
42
|
+
# FIXME log
|
43
|
+
close
|
44
|
+
end
|
45
|
+
|
37
46
|
# from Rev::UNIXSocket
|
38
47
|
def on_read(data)
|
39
48
|
@pac.feed(data)
|
@@ -90,12 +99,12 @@ class UNIXClientTransport
|
|
90
99
|
|
91
100
|
# MessageReceiver interface
|
92
101
|
def on_request(msgid, method, param)
|
93
|
-
raise
|
102
|
+
raise Error.new("request message on client session")
|
94
103
|
end
|
95
104
|
|
96
105
|
# MessageReceiver interface
|
97
106
|
def on_notify(method, param)
|
98
|
-
raise
|
107
|
+
raise Error.new("notify message on client session")
|
99
108
|
end
|
100
109
|
|
101
110
|
# MessageReceiver interface
|
@@ -155,7 +164,7 @@ class UNIXServerTransport
|
|
155
164
|
|
156
165
|
# MessageReceiver interface
|
157
166
|
def on_response(msgid, error, result)
|
158
|
-
raise
|
167
|
+
raise Error.new("response message on server session")
|
159
168
|
end
|
160
169
|
end
|
161
170
|
end
|
data/test/msgpack_rpc_test.rb
CHANGED
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: msgpack-rpc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 13
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 4
|
9
|
+
- 1
|
10
|
+
version: 0.4.1
|
5
11
|
platform: ruby
|
6
12
|
authors:
|
7
13
|
- FURUHASHI Sadayuki
|
@@ -9,29 +15,41 @@ autorequire:
|
|
9
15
|
bindir: bin
|
10
16
|
cert_chain: []
|
11
17
|
|
12
|
-
date: 2010-
|
18
|
+
date: 2010-08-27 00:00:00 +09:00
|
13
19
|
default_executable:
|
14
20
|
dependencies:
|
15
21
|
- !ruby/object:Gem::Dependency
|
16
22
|
name: msgpack
|
17
|
-
|
18
|
-
|
19
|
-
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
20
26
|
requirements:
|
21
27
|
- - ">="
|
22
28
|
- !ruby/object:Gem::Version
|
29
|
+
hash: 13
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
- 4
|
33
|
+
- 1
|
23
34
|
version: 0.4.1
|
24
|
-
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
25
37
|
- !ruby/object:Gem::Dependency
|
26
38
|
name: rev
|
27
|
-
|
28
|
-
|
29
|
-
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
30
42
|
requirements:
|
31
43
|
- - ">="
|
32
44
|
- !ruby/object:Gem::Version
|
45
|
+
hash: 19
|
46
|
+
segments:
|
47
|
+
- 0
|
48
|
+
- 3
|
49
|
+
- 0
|
33
50
|
version: 0.3.0
|
34
|
-
|
51
|
+
type: :runtime
|
52
|
+
version_requirements: *id002
|
35
53
|
description:
|
36
54
|
email: frsyuki@users.sourceforge.jp
|
37
55
|
executables: []
|
@@ -41,13 +59,20 @@ extensions: []
|
|
41
59
|
extra_rdoc_files: []
|
42
60
|
|
43
61
|
files:
|
62
|
+
- AUTHORS
|
63
|
+
- ChangeLog
|
64
|
+
- NOTICE
|
65
|
+
- README
|
66
|
+
- lib/msgpack/rpc.rb
|
44
67
|
- lib/msgpack/rpc/address.rb
|
45
68
|
- lib/msgpack/rpc/client.rb
|
46
69
|
- lib/msgpack/rpc/dispatcher.rb
|
47
70
|
- lib/msgpack/rpc/exception.rb
|
71
|
+
- lib/msgpack/rpc/exception.rb.old
|
48
72
|
- lib/msgpack/rpc/future.rb
|
49
73
|
- lib/msgpack/rpc/loop.rb
|
50
74
|
- lib/msgpack/rpc/message.rb
|
75
|
+
- lib/msgpack/rpc/multi_future.rb
|
51
76
|
- lib/msgpack/rpc/server.rb
|
52
77
|
- lib/msgpack/rpc/session.rb
|
53
78
|
- lib/msgpack/rpc/session_pool.rb
|
@@ -55,38 +80,40 @@ files:
|
|
55
80
|
- lib/msgpack/rpc/transport/tcp.rb
|
56
81
|
- lib/msgpack/rpc/transport/udp.rb
|
57
82
|
- lib/msgpack/rpc/transport/unix.rb
|
58
|
-
- lib/msgpack/rpc.rb
|
83
|
+
- lib/msgpack/rpc/version.rb
|
59
84
|
- test/msgpack_rpc_test.rb
|
60
85
|
- test/test_helper.rb
|
61
|
-
- AUTHORS
|
62
|
-
- ChangeLog
|
63
|
-
- NOTICE
|
64
|
-
- README
|
65
86
|
has_rdoc: true
|
66
|
-
homepage: http://msgpack.
|
87
|
+
homepage: http://msgpack.org/
|
67
88
|
licenses: []
|
68
89
|
|
69
90
|
post_install_message:
|
70
|
-
rdoc_options:
|
71
|
-
|
91
|
+
rdoc_options:
|
92
|
+
- --charset=UTF-8
|
72
93
|
require_paths:
|
73
94
|
- lib
|
74
95
|
required_ruby_version: !ruby/object:Gem::Requirement
|
96
|
+
none: false
|
75
97
|
requirements:
|
76
98
|
- - ">="
|
77
99
|
- !ruby/object:Gem::Version
|
100
|
+
hash: 3
|
101
|
+
segments:
|
102
|
+
- 0
|
78
103
|
version: "0"
|
79
|
-
version:
|
80
104
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
81
106
|
requirements:
|
82
107
|
- - ">="
|
83
108
|
- !ruby/object:Gem::Version
|
109
|
+
hash: 3
|
110
|
+
segments:
|
111
|
+
- 0
|
84
112
|
version: "0"
|
85
|
-
version:
|
86
113
|
requirements: []
|
87
114
|
|
88
115
|
rubyforge_project: msgpack
|
89
|
-
rubygems_version: 1.3.
|
116
|
+
rubygems_version: 1.3.7
|
90
117
|
signing_key:
|
91
118
|
specification_version: 3
|
92
119
|
summary: MessagePack-RPC, asynchronous RPC library using MessagePack
|