This will be probably used by all the async libraries like EventMachine. It expects the whole frame as one string, so if library of your choice gives you input chunk-by-chunk, you'll need to have something like this:
class Client
include EventMachine::Deferrable
def receive_data(chunk)
if @payload.nil?
self.decode_from_string(chunk[0..6])
@payload = ""
elsif @payload && chunk[-1] != FINAL_OCTET
@payload += chunk
@size += chunk.bytesize
else
check_size(@size, @payload.bytesize)
Frame.decode(@payload) # we need the whole payload
@size, @payload = nil
end
end
NOTE: the client should also implement waiting for another frames, in case that some header/body frames are expected.
end