Class: LongBody::ThinHandler::ResponseSender

Inherits:
Object
  • Object
show all
Defined in:
lib/long_body/thin_handler.rb

Overview

Controls the scheduling of the trickle-feed using EM.next_tick.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(eachable_body) ⇒ ResponseSender

Returns a new instance of ResponseSender.



36
37
38
39
40
41
42
# File 'lib/long_body/thin_handler.rb', line 36

def initialize(eachable_body)
  require_relative 'deferrable_body'
  require_relative 'lint_bypass'
  @eachable_body = eachable_body
  @enumerator = FiberWrapper.new(eachable_body)
  @deferrable_body = LongBody::DeferrableBody.new
end

Instance Attribute Details

#deferrable_bodyObject (readonly)

Returns the value of attribute deferrable_body.



35
36
37
# File 'lib/long_body/thin_handler.rb', line 35

def deferrable_body
  @deferrable_body
end

Instance Method Details

#abort!Object



44
45
46
47
# File 'lib/long_body/thin_handler.rb', line 44

def abort!
  @eachable_body.abort!
  @deferrable_body.fail
end

#send_next_chunkObject



49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/long_body/thin_handler.rb', line 49

def send_next_chunk
  next_chunk = begin
    @enumerator.take
  rescue StandardError => e
    abort!
  end
  
  if next_chunk
    @deferrable_body.call([next_chunk]) # Has to be given in an Array
    EM.next_tick { send_next_chunk }
  else
    @deferrable_body.succeed
  end
end