Class: ActionController::Live::Buffer

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

Overview

:nodoc:

Constant Summary

Constants inherited from ActionDispatch::Response::Buffer

ActionDispatch::Response::Buffer::BODY_METHODS

Class Attribute Summary collapse

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from ActionDispatch::Response::Buffer

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

Constructor Details

#initialize(response) ⇒ Buffer

Returns a new instance of Buffer.



167
168
169
170
171
172
173
# File 'lib/action_controller/metal/live.rb', line 167

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.



156
157
158
# File 'lib/action_controller/metal/live.rb', line 156

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.



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

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.



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

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

#call_on_errorObject



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

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.



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

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)


226
227
228
# File 'lib/action_controller/metal/live.rb', line 226

def connected?
  !@aborted
end

#on_error(&block) ⇒ Object



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

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
# 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.



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

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