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 block 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
- #closed? ⇒ Boolean
- #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.
409 410 411 412 |
# File 'lib/sinatra/base.rb', line 409 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
407 |
# File 'lib/sinatra/base.rb', line 407 def self.defer(*) yield end |
.schedule ⇒ Object
406 |
# File 'lib/sinatra/base.rb', line 406 def self.schedule(*) yield end |
Instance Method Details
#<<(data) ⇒ Object
432 433 434 435 |
# File 'lib/sinatra/base.rb', line 432 def <<(data) @scheduler.schedule { @front.call(data.to_s) } self end |
#callback(&block) ⇒ Object Also known as: errback
437 438 439 440 |
# File 'lib/sinatra/base.rb', line 437 def callback(&block) return yield if closed? @callbacks << block end |
#close ⇒ Object
414 415 416 417 418 |
# File 'lib/sinatra/base.rb', line 414 def close return if closed? @closed = true @scheduler.schedule { @callbacks.each { |c| c.call } } end |
#closed? ⇒ Boolean
444 445 446 |
# File 'lib/sinatra/base.rb', line 444 def closed? @closed end |
#each(&front) ⇒ Object
420 421 422 423 424 425 426 427 428 429 430 |
# File 'lib/sinatra/base.rb', line 420 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 |