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.
461 462 463 464 465 466 467 |
# File 'lib/sinatra/base.rb', line 461 def initialize(scheduler = self.class, keep_open = false, &back) @back = back.to_proc @scheduler = scheduler @keep_open = keep_open @callbacks = [] @closed = false end |
Class Method Details
.defer ⇒ Object
459 |
# File 'lib/sinatra/base.rb', line 459 def self.defer(*) yield end |
.schedule ⇒ Object
458 |
# File 'lib/sinatra/base.rb', line 458 def self.schedule(*) yield end |
Instance Method Details
#<<(data) ⇒ Object
489 490 491 492 |
# File 'lib/sinatra/base.rb', line 489 def <<(data) @scheduler.schedule { @front.call(data.to_s) } self end |
#callback(&block) ⇒ Object Also known as: errback
494 495 496 497 498 |
# File 'lib/sinatra/base.rb', line 494 def callback(&block) return yield if closed? @callbacks << block end |
#close ⇒ Object
469 470 471 472 473 474 |
# File 'lib/sinatra/base.rb', line 469 def close return if closed? @closed = true @scheduler.schedule { @callbacks.each { |c| c.call } } end |
#closed? ⇒ Boolean
502 503 504 |
# File 'lib/sinatra/base.rb', line 502 def closed? @closed end |
#each(&front) ⇒ Object
476 477 478 479 480 481 482 483 484 485 486 487 |
# File 'lib/sinatra/base.rb', line 476 def each(&front) @front = front @scheduler.defer do begin @back.call(self) rescue Exception => e @scheduler.schedule { raise e } ensure close unless @keep_open end end end |