lib/msgpack/rpc.rb in msgpack-rpc-0.1.0 vs lib/msgpack/rpc.rb in msgpack-rpc-0.1.1
- old
+ new
@@ -280,10 +280,43 @@
@sock.send_notify method, param
end
end
+class AsyncResult
+ def initialize
+ @responder = nil
+ @sent = false
+ end
+
+ def result(retval, err = nil)
+ unless @sent
+ if @responder
+ @responder.result(retval, err)
+ else
+ @result = [retval, err]
+ end
+ @sent = true
+ end
+ nil
+ end
+
+ def error(err)
+ result(nil, err)
+ nil
+ end
+
+ def responder=(res)
+ @responder = res
+ if @sent && @result
+ @responder.result(*@result)
+ @result = nil
+ end
+ end
+end
+
+
class ServerSession
def initialize(obj, accept = obj.public_methods)
@obj = obj
@accept = accept.map {|m| m.to_s }
end
@@ -300,11 +333,15 @@
ret = @obj.send(method, *param)
rescue
res.error($!.to_s)
return
end
- res.result(ret)
+ if ret.is_a?(AsyncResult)
+ ret.responder = res
+ else
+ res.result(ret)
+ end
end
def on_notify(method, param)
# FIXME notify support
raise RPCError.new("unexpected notify message")
@@ -321,10 +358,12 @@
end
Loop = ::Rev::Loop
module LoopUtil
+ attr_reader :loop
+
class Timer < Rev::TimerWatcher
def initialize(interval, repeating, &block)
@block = block
super(interval, repeating)
end
@@ -359,11 +398,11 @@
@rsock.session = @s
loop.attach(@rsock)
@timer = Timer.new(1, true) { @s.step_timeout }
loop.attach(@timer)
end
- attr_reader :loop, :host, :port
+ attr_reader :host, :port
def close
@timer.detach
@rsock.detach
@s.close
@@ -409,10 +448,9 @@
def initialize(loop = Loop.new)
@loop = loop
@socks = []
end
- attr_reader :loop
def listen(host, port, obj, accept = obj.public_methods)
lsock = ::Rev::TCPServer.new(host, port, Server::Socket, obj, accept)
@socks.push lsock
@loop.attach(lsock)