Class: Sinatra::Helpers::Stream

Inherits:
Object
  • Object
show all
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

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

.deferObject


431
# File 'lib/sinatra/base.rb', line 431

def self.defer(*)    yield end

.scheduleObject


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

#closeObject


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

Returns:

  • (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