Module: MessagePack::RPCOverHTTP::Server::Streamer

Defined in:
lib/msgpack/rpc_over_http/server/streamer.rb

Overview

Support streaming

Defined Under Namespace

Classes: Body

Instance Method Summary collapse

Instance Method Details

#chunk(obj) ⇒ Object

call-seq:

chunk(obj)

Send a object as chunked data in block of stream().



61
62
63
# File 'lib/msgpack/rpc_over_http/server/streamer.rb', line 61

def chunk(obj)
  Fiber.yield(obj)
end

#stream(&writer) ⇒ Object

call-seq:

stream(&writer) -> streamable body

Returns a Body object that responds to each. Chunks of body are created with calling chunk() in given block.

def passwd
  return stream do
    File.open('/etc/passwd') do |file|
      while line = file.gets
        chunk(file.gets)
      end
    end
  end
end


37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/msgpack/rpc_over_http/server/streamer.rb', line 37

def stream(&writer)
  fi = Fiber.new do
    writer.call
  end

  Body.new do |msgid, sender|
    begin
      while true
        chunk = fi.resume
        break unless fi.alive?
        sender.call(ResponsePacker.pack(msgid, nil, chunk))
      end
    rescue RemoteError => ex
      sender.call(ResponsePacker.pack(msgid, ex.class.name, nil))
    rescue ::RuntimeError => ex
      sender.call(ResponsePacker.pack(msgid, RuntimeError.name, nil))
    end
  end
end