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.



409
410
411
412
# File 'lib/sinatra/base.rb', line 409

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



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

def self.defer(*)    yield end

.scheduleObject



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

def self.schedule(*) yield end

Instance Method Details

#<<(data) ⇒ Object



432
433
434
435
# File 'lib/sinatra/base.rb', line 432

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

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



437
438
439
440
# File 'lib/sinatra/base.rb', line 437

def callback(&block)
  return yield if closed?
  @callbacks << block
end

#closeObject



414
415
416
417
418
# File 'lib/sinatra/base.rb', line 414

def close
  return if closed?
  @closed = true
  @scheduler.schedule { @callbacks.each { |c| c.call } }
end

#closed?Boolean

Returns:

  • (Boolean)


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

def closed?
  @closed
end

#each(&front) ⇒ Object



420
421
422
423
424
425
426
427
428
429
430
# File 'lib/sinatra/base.rb', line 420

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