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.
433 434 435 436 |
# File 'lib/sinatra/base.rb', line 433 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
431 |
# File 'lib/sinatra/base.rb', line 431 def self.defer(*) yield end |
.schedule ⇒ Object
430 |
# File 'lib/sinatra/base.rb', line 430 def self.schedule(*) yield end |
Instance Method Details
#<<(data) ⇒ Object
456 457 458 459 |
# File 'lib/sinatra/base.rb', line 456 def <<(data) @scheduler.schedule { @front.call(data.to_s) } self end |
#callback(&block) ⇒ Object Also known as: errback
461 462 463 464 |
# File 'lib/sinatra/base.rb', line 461 def callback(&block) return yield if closed? @callbacks << block end |
#close ⇒ Object
438 439 440 441 442 |
# File 'lib/sinatra/base.rb', line 438 def close return if closed? @closed = true @scheduler.schedule { @callbacks.each { |c| c.call } } end |
#closed? ⇒ Boolean
468 469 470 |
# File 'lib/sinatra/base.rb', line 468 def closed? @closed end |
#each(&front) ⇒ Object
444 445 446 447 448 449 450 451 452 453 454 |
# File 'lib/sinatra/base.rb', line 444 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 |