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)