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