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.



448
449
450
451
452
453
454
# File 'lib/sinatra/base.rb', line 448

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

.deferObject



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

def self.defer(*)    yield end

.scheduleObject



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

def self.schedule(*) yield end

Instance Method Details

#<<(data) ⇒ Object



475
476
477
478
# File 'lib/sinatra/base.rb', line 475

def <<(data)
  @scheduler.schedule { @front.call(data.to_s) }
  self
end

#callback(&block) ⇒ Object Also known as: errback



480
481
482
483
484
# File 'lib/sinatra/base.rb', line 480

def callback(&block)
  return yield if closed?

  @callbacks << block
end

#closeObject



456
457
458
459
460
461
# File 'lib/sinatra/base.rb', line 456

def close
  return if closed?

  @closed = true
  @scheduler.schedule { @callbacks.each { |c| c.call } }
end

#closed?Boolean

Returns:

  • (Boolean)


488
489
490
# File 'lib/sinatra/base.rb', line 488

def closed?
  @closed
end

#each(&front) ⇒ Object



463
464
465
466
467
468
469
470
471
472
473
# File 'lib/sinatra/base.rb', line 463

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