Class: Sinatra::Helpers::Stream
- Inherits:
-
Object
- Object
- Sinatra::Helpers::Stream
- Defined in:
- lib/sinatra/base.rb
Overview
Class of the response body in case you use #stream.
Three things really matter: The front and back block (back being the blog generating content, front the one sending it to the client) and the scheduler, integrating with whatever concurrency feature the Rack handler is using.
Scheduler has to respond to defer and schedule.
Class Method Summary collapse
Instance Method Summary collapse
- #<<(data) ⇒ Object
- #callback(&block) ⇒ Object (also: #errback)
- #close ⇒ Object
- #each(&front) ⇒ Object
-
#initialize(scheduler = self.class, keep_open = false, &back) ⇒ Stream
constructor
A new instance of Stream.
Constructor Details
#initialize(scheduler = self.class, keep_open = false, &back) ⇒ Stream
Returns a new instance of Stream.
300 301 302 303 |
# File 'lib/sinatra/base.rb', line 300 def initialize(scheduler = self.class, keep_open = false, &back) @back, @scheduler, @keep_open = back.to_proc, scheduler, keep_open @callbacks, @closed = [], false end |
Class Method Details
.defer ⇒ Object
298 |
# File 'lib/sinatra/base.rb', line 298 def self.defer(*) yield end |
.schedule ⇒ Object
297 |
# File 'lib/sinatra/base.rb', line 297 def self.schedule(*) yield end |
Instance Method Details
#<<(data) ⇒ Object
323 324 325 326 |
# File 'lib/sinatra/base.rb', line 323 def <<(data) @scheduler.schedule { @front.call(data.to_s) } self end |
#callback(&block) ⇒ Object Also known as: errback
328 329 330 331 |
# File 'lib/sinatra/base.rb', line 328 def callback(&block) return yield if @closed @callbacks << block end |
#close ⇒ Object
305 306 307 308 309 |
# File 'lib/sinatra/base.rb', line 305 def close return if @closed @closed = true @scheduler.schedule { @callbacks.each { |c| c.call }} end |
#each(&front) ⇒ Object
311 312 313 314 315 316 317 318 319 320 321 |
# File 'lib/sinatra/base.rb', line 311 def each(&front) @front = front @scheduler.defer do begin @back.call(self) rescue Exception => e @scheduler.schedule { raise e } end close unless @keep_open end end |