Class: ActionController::Live::Buffer

Inherits:
ActionDispatch::Response::Buffer show all
Includes:
MonitorMixin
Defined in:
lib/action_controller/metal/live.rb

Overview

:nodoc:

Class Attribute Summary collapse

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from ActionDispatch::Response::Buffer

#body, #closed?, #each, #to_ary

Constructor Details

#initialize(response) ⇒ Buffer

Returns a new instance of Buffer.



162
163
164
165
166
167
168
# File 'lib/action_controller/metal/live.rb', line 162

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_sizeObject

Returns the value of attribute queue_size.



150
151
152
# File 'lib/action_controller/metal/live.rb', line 150

def queue_size
  @queue_size
end

Instance Attribute Details

#ignore_disconnectObject

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.



160
161
162
# File 'lib/action_controller/metal/live.rb', line 160

def ignore_disconnect
  @ignore_disconnect
end

Instance Method Details

#abortObject

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.



217
218
219
220
221
222
# File 'lib/action_controller/metal/live.rb', line 217

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

#call_on_errorObject



236
237
238
# File 'lib/action_controller/metal/live.rb', line 236

def call_on_error
  @error_callback.call
end

#closeObject

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.



204
205
206
207
208
209
210
# File 'lib/action_controller/metal/live.rb', line 204

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

#connected?Boolean

Is the client still connected and waiting for content?

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

Returns:

  • (Boolean)


228
229
230
# File 'lib/action_controller/metal/live.rb', line 228

def connected?
  !@aborted
end

#on_error(&block) ⇒ Object



232
233
234
# File 'lib/action_controller/metal/live.rb', line 232

def on_error(&block)
  @error_callback = block
end

#write(string) ⇒ Object



175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
# File 'lib/action_controller/metal/live.rb', line 175

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) ⇒ Object

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



196
197
198
# File 'lib/action_controller/metal/live.rb', line 196

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