class Async::HTTP::Body::Writable

A dynamic body which you can write to and read from.

def close(error = nil)

Stop generating output; cause the next call to write to fail with the given error.
def close(error = nil)
	unless @closed
		@queue.enqueue(nil)
		
		@closed = true
		@error = error
	end
	
	super
end

def closed?

def closed?
	@closed
end

def empty?

Has the producer called #finish and has the reader consumed the nil token?
def empty?
	@finished
end

def initialize(length = nil, queue: Async::Queue.new)

Parameters:
  • queue (Async::Queue) -- Specify a different queue implementation, e.g. `Async::LimitedQueue.new(8)` to enable back-pressure streaming.
  • length (Integer) -- The length of the response body if known.
def initialize(length = nil, queue: Async::Queue.new)
	@queue = queue
	
	@length = length
	
	@count = 0
	
	@finished = false
	
	@closed = false
	@error = nil
end

def inspect

def inspect
	"\#<#{self.class} #{@count} chunks written, #{status}>"
end

def length

def length
	@length
end

def read

Read the next available chunk.
def read
	return if @finished
	
	unless chunk = @queue.dequeue
		@finished = true
	end
	
	return chunk
end

def status

def status
	if @finished
		'finished'
	elsif @closed
		'closing'
	else
		'waiting'
	end
end

def write(chunk)

Write a single chunk to the body. Signal completion by calling `#finish`.
def write(chunk)
	# If the reader breaks, the writer will break.
	# The inverse of this is less obvious (*)
	if @closed
		raise(@error || Closed)
	end
	
	@count += 1
	@queue.enqueue(chunk)
end