class Async::HTTP::Body::Statistics

Invokes a callback once the body has finished reading.

def close(error = nil)

Close the body and record the end time.
def close(error = nil)
	complete_statistics(error)
	
	super
end

def complete_statistics(error = nil)

def complete_statistics(error = nil)
	@end_time = Clock.now
	
	@callback.call(self, error) if @callback
end

def first_chunk_duration

@returns [Float | Nil] The duration from start until the first chunk was read, in seconds.
def first_chunk_duration
	if @first_chunk_time
		@first_chunk_time - @start_time
	end
end

def format_duration(seconds)

def format_duration(seconds)
	if seconds < 1.0
		return "#{(seconds * 1000.0).round(2)}ms"
	else
		return "#{seconds.round(1)}s"
	end
end

def initialize(start_time, body, callback)

@parameter callback [Proc] A callback to invoke when the body is closed.
@parameter body [Protocol::HTTP::Body::Readable] The body to wrap.
@parameter start_time [Float] The start time for measuring durations.
Initialize the statistics body wrapper.
def initialize(start_time, body, callback)
	super(body)
	
	@sent = 0
	
	@start_time = start_time
	@first_chunk_time = nil
	@end_time = nil
	
	@callback = callback
end

def inspect

@returns [String] A detailed representation including the wrapped body.
def inspect
	"#{super} | \#<#{self.class} #{self.to_s}>"
end

def read

@returns [String | Nil] The next chunk of data.
Read the next chunk from the body, tracking timing and bytes sent.
def read
	chunk = super
	
	@first_chunk_time ||= Clock.now
	
	if chunk
		@sent += chunk.bytesize
	end
	
	return chunk
end

def to_s

@returns [String] A human-readable summary of the statistics.
def to_s
	parts = ["sent #{@sent} bytes"]
	
	if duration = self.total_duration
		parts << "took #{format_duration(duration)} in total"
	end
	
	if duration = self.first_chunk_duration
		parts << "took #{format_duration(duration)} until first chunk"
	end
	
	return parts.join("; ")
end

def total_duration

@returns [Float | Nil] The total duration from start to close, in seconds.
def total_duration
	if @end_time
		@end_time - @start_time
	end
end