123456789_123456789_123456789_123456789_123456789_

Class: ActionController::Live::Buffer

Do not use. This class is for internal use only.
Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
Instance Chain:
Inherits: ActionDispatch::Response::Buffer
Defined in: actionpack/lib/action_controller/metal/live.rb

Class Attribute Summary

Class Method Summary

Instance Attribute Summary

::ActionDispatch::Response::Buffer - Inherited

Instance Method Summary

::ActionDispatch::Response::Buffer - Inherited

Constructor Details

.new(response) ⇒ Buffer

[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/live.rb', line 166

def initialize(response)
  super(response, build_queue(self.class.queue_size))
  @error_callback = lambda { true }
  @cv = new_cond
  @aborted = false
  @ignore_disconnect = false
end

Class Attribute Details

.queue_size (rw)

[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/live.rb', line 155

attr_accessor :queue_size

Instance Attribute Details

#connected?Boolean (readonly)

Is the client still connected and waiting for content?

The result of calling #write when this is false is determined by #ignore_disconnect.

[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/live.rb', line 231

def connected?
  !@aborted
end

#ignore_disconnect (rw)

Ignore that the client has disconnected.

If this value is true, calling #write after the client disconnects will result in the written content being silently discarded. If this value is false (the default), a ClientDisconnected exception will be raised.

[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/live.rb', line 164

attr_accessor :ignore_disconnect

Instance Method Details

#abort

Inform the producer/writing thread that the client has disconnected; the reading thread is no longer interested in anything that’s being written.

See also #close.

[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/live.rb', line 220

def abort
  synchronize do
    @aborted = true
    @buf.clear
  end
end

#build_queue(queue_size) (private)

[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/live.rb', line 255

def build_queue(queue_size)
  queue_size ? SizedQueue.new(queue_size) : Queue.new
end

#call_on_error

[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/live.rb', line 239

def call_on_error
  @error_callback.call
end

#close

Write a ‘close’ event to the buffer; the producer/writing thread uses this to notify us that it’s finished supplying content.

See also #abort.

[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/live.rb', line 208

def close
  synchronize do
    super
    @buf.push nil
    @cv.broadcast
  end
end

#each_chunk(&block) (private)

[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/live.rb', line 244

def each_chunk(&block)
  loop do
    str = nil
    ActiveSupport::Dependencies.interlock.permit_concurrent_loads do
      str = @buf.pop
    end
    break unless str
    yield str
  end
end

#on_error(&block)

[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/live.rb', line 235

def on_error(&block)
  @error_callback = block
end

#write(string)

[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/live.rb', line 180

def write(string)
  unless @response.committed?
    @response.headers["Cache-Control"] ||= "no-cache"
    @response.delete_header "Content-Length"
  end

  super

  unless connected?
    @buf.clear

    unless @ignore_disconnect
      # Raise ClientDisconnected, which is a RuntimeError (not an IOError), because
      # that's more appropriate for something beyond the developer's control.
      raise ClientDisconnected, "client disconnected"
    end
  end
end

#writeln(string)

Same as #write but automatically include a newline at the end of the string.

[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/live.rb', line 200

def writeln(string)
  write string.end_with?("\n") ? string : "#{string}\n"
end