class Async::HTTP::Body::Statistics

Invokes a callback once the body has finished reading.

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

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
		seconds * 1000.0
		return "#{(seconds * 1000.0).round(2)}ms"
	else
		return "#{seconds.round(1)}s"
	end
end

def initialize(start_time, body, callback)

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

def inspect
	"#{super} | \#<#{self.class} #{self.to_s}>"
end

def read

def read
	chunk = super
	
	@first_chunk_time ||= Clock.now
	
	if chunk
		@sent += chunk.length
	else
		complete_statistics
	end
	
	return chunk
end

def stop(error)

def stop(error)
	complete_statistics(error)
	
	super
end

def to_s

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

def total_duration
	if @end_time
		@end_time - @start_time
	end
end